#[cfg(target_os = "macos")]
mod ffi_validation {
use std::mem::size_of;
#[test]
fn test_attrlist_size() {
#[repr(C)]
struct AttrlistCheck {
bitmapcount: u16,
reserved: u16,
commonattr: u32,
volattr: u32,
dirattr: u32,
fileattr: u32,
forkattr: u32,
}
assert_eq!(size_of::<AttrlistCheck>(), 24);
}
#[test]
fn test_attrreference_size() {
#[repr(C)]
struct AttrreferenceCheck {
attr_dataoffset: i32,
attr_length: u32,
}
assert_eq!(size_of::<AttrreferenceCheck>(), 8);
}
#[test]
fn test_attribute_set_size() {
#[repr(C)]
struct AttributeSetCheck {
commonattr: u32,
volattr: u32,
dirattr: u32,
fileattr: u32,
forkattr: u32,
}
assert_eq!(size_of::<AttributeSetCheck>(), 20);
}
#[test]
fn test_timespec_size() {
#[repr(C)]
struct TimespecCheck {
tv_sec: i64,
tv_nsec: i64,
}
assert_eq!(size_of::<TimespecCheck>(), 16);
}
#[test]
fn test_attr_bit_map_count() {
const ATTR_BIT_MAP_COUNT: u16 = 5;
assert_eq!(ATTR_BIT_MAP_COUNT, 5);
}
#[test]
fn test_common_attr_flags() {
const ATTR_CMN_RETURNED_ATTRS: u32 = 0x80000000;
const ATTR_CMN_NAME: u32 = 0x00000001;
const ATTR_CMN_OBJTYPE: u32 = 0x00000008;
const ATTR_CMN_MODTIME: u32 = 0x00000400;
const ATTR_CMN_ACCESSMASK: u32 = 0x00020000;
const ATTR_CMN_FILEID: u32 = 0x02000000;
assert_eq!(ATTR_CMN_RETURNED_ATTRS, 0x80000000);
assert_eq!(ATTR_CMN_NAME, 0x00000001);
assert_eq!(ATTR_CMN_OBJTYPE, 0x00000008);
assert_eq!(ATTR_CMN_MODTIME, 0x00000400);
assert_eq!(ATTR_CMN_ACCESSMASK, 0x00020000);
assert_eq!(ATTR_CMN_FILEID, 0x02000000);
let all_common = ATTR_CMN_RETURNED_ATTRS | ATTR_CMN_NAME | ATTR_CMN_OBJTYPE
| ATTR_CMN_MODTIME | ATTR_CMN_ACCESSMASK | ATTR_CMN_FILEID;
assert_eq!(all_common.count_ones(), 6, "flags should not overlap");
}
#[test]
fn test_file_attr_flags() {
const ATTR_FILE_TOTALSIZE: u32 = 0x00000002;
const ATTR_FILE_ALLOCSIZE: u32 = 0x00000004;
const ATTR_FILE_DATALENGTH: u32 = 0x00000200;
assert_eq!(ATTR_FILE_TOTALSIZE, 0x00000002);
assert_eq!(ATTR_FILE_ALLOCSIZE, 0x00000004);
assert_eq!(ATTR_FILE_DATALENGTH, 0x00000200);
let all_file = ATTR_FILE_TOTALSIZE | ATTR_FILE_ALLOCSIZE | ATTR_FILE_DATALENGTH;
assert_eq!(all_file.count_ones(), 3, "flags should not overlap");
}
#[test]
fn test_dir_attr_flags() {
const ATTR_DIR_ENTRYCOUNT: u32 = 0x00000002;
assert_eq!(ATTR_DIR_ENTRYCOUNT, 0x00000002);
}
#[test]
fn test_fs_options() {
const FSOPT_NOFOLLOW: u64 = 0x00000001;
const FSOPT_PACK_INVAL_ATTRS: u64 = 0x00000008;
assert_eq!(FSOPT_NOFOLLOW, 0x00000001);
assert_eq!(FSOPT_PACK_INVAL_ATTRS, 0x00000008);
}
#[test]
fn test_vnode_types() {
const VREG: u32 = 1; const VDIR: u32 = 2; const VBLK: u32 = 3; const VCHR: u32 = 4; const VLNK: u32 = 5; const VSOCK: u32 = 6; const VFIFO: u32 = 7;
assert_eq!(VREG, 1);
assert_eq!(VDIR, 2);
assert_eq!(VBLK, 3);
assert_eq!(VCHR, 4);
assert_eq!(VLNK, 5);
assert_eq!(VSOCK, 6);
assert_eq!(VFIFO, 7);
}
}