Add test for SO_EE_OFFENDER

Modelled after the cmsg tests, this wraps the C macro into a function, and then
compares the results to the Rust implementation in libc.
This commit is contained in:
Matthew McPherrin 2019-12-02 12:37:25 -08:00
parent a9a6ef13a1
commit 06938add2d
4 changed files with 40 additions and 0 deletions

View File

@ -52,3 +52,8 @@ harness = false
name = "cmsg"
path = "test/cmsg.rs"
harness = true
[[test]]
name = "errqueue"
path = "test/errqueue.rs"
harness = true

View File

@ -10,6 +10,9 @@ fn do_cc() {
if cfg!(unix) && !target.contains("wasi") {
cc::Build::new().file("src/cmsg.c").compile("cmsg");
}
if target.contains("android") || target.contains("linux") {
cc::Build::new().file("src/errqueue.c").compile("errqueue");
}
}
fn do_ctest() {

10
libc-test/src/errqueue.c Normal file
View File

@ -0,0 +1,10 @@
#include <time.h>
#include <linux/errqueue.h>
// SO_EE_OFFENDER is defined as a macro in linux/errqueue.h. This file wraps
// that macro in a function so we can test the reimplementation in this package
// is equivalent.
struct sockaddr *so_ee_offender(struct sock_extended_err *ee) {
return SO_EE_OFFENDER(ee);
}

View File

@ -0,0 +1,22 @@
//! Compare libc's SO_EE_OFFENDER function against the actual C macro
extern crate libc;
#[cfg(any(target_os = "linux", target_os = "android"))]
mod t {
use libc::{self, sock_extended_err, sockaddr};
extern "C" {
pub fn so_ee_offender(ee: *const sock_extended_err) -> *mut sockaddr;
}
#[test]
fn test_cmsg_data() {
for l in 0..128 {
let ee = l as *const sock_extended_err;
unsafe {
assert_eq!(libc::SO_EE_OFFENDER(ee), so_ee_offender(ee));
}
}
}
}