use super::{raw, *};
#[test]
fn test_validate_buffer_size() {
let small_len = 4;
assert!(raw::get_valid_buffer_capacity(small_len, 0).is_err());
let misaligned_len = NUM_ENTRIES_SIZE + 39;
assert!(raw::get_valid_buffer_capacity(misaligned_len, 0).is_err());
let valid_empty_len = NUM_ENTRIES_SIZE;
assert_eq!(
raw::get_valid_buffer_capacity(valid_empty_len, 0).unwrap(),
0
);
let valid_one_len = NUM_ENTRIES_SIZE + ENTRY_SIZE;
assert_eq!(raw::get_valid_buffer_capacity(valid_one_len, 0).unwrap(), 1);
let valid_max_len = NUM_ENTRIES_SIZE + MAX_ENTRIES * ENTRY_SIZE;
assert_eq!(
raw::get_valid_buffer_capacity(valid_max_len, 0).unwrap(),
MAX_ENTRIES
);
assert_eq!(
raw::get_valid_buffer_capacity(MAX_SIZE, 0).unwrap(),
MAX_ENTRIES
);
assert_eq!(raw::get_valid_buffer_capacity(ENTRY_SIZE, 8).unwrap(), 1);
assert_eq!(
raw::get_valid_buffer_capacity(2 * ENTRY_SIZE, 8).unwrap(),
2
);
assert_eq!(
raw::get_valid_buffer_capacity(MAX_ENTRIES * ENTRY_SIZE, 8).unwrap(),
MAX_ENTRIES
);
assert_eq!(
raw::get_valid_buffer_capacity(10 * ENTRY_SIZE, 48).unwrap(),
10
);
assert!(raw::get_valid_buffer_capacity(ENTRY_SIZE + 1, 8).is_err());
assert!(raw::get_valid_buffer_capacity(ENTRY_SIZE - 1, 8).is_err());
assert!(raw::get_valid_buffer_capacity(39, 8).is_err());
assert_eq!(
raw::get_valid_buffer_capacity((MAX_ENTRIES + 1) * ENTRY_SIZE, 8).unwrap(),
MAX_ENTRIES + 1
);
assert_eq!(
raw::get_valid_buffer_capacity((MAX_ENTRIES + 10) * ENTRY_SIZE, 48).unwrap(),
MAX_ENTRIES + 10
);
assert_eq!(raw::get_valid_buffer_capacity(0, 8).unwrap(), 0);
assert_eq!(
raw::get_valid_buffer_capacity(5 * ENTRY_SIZE, 1000).unwrap(),
5
);
assert!(raw::get_valid_buffer_capacity(5 * ENTRY_SIZE + 1, 2000).is_err());
}
#[test]
fn test_fetch_into_offset_validation() {
let buffer_len = 200;
assert!(validate_fetch_offset(0, buffer_len).is_ok());
assert!(validate_fetch_offset(8, buffer_len).is_ok());
assert!(validate_fetch_offset(48, buffer_len).is_ok());
assert!(validate_fetch_offset(88, buffer_len).is_ok());
assert!(validate_fetch_offset(MAX_SIZE, buffer_len).is_err());
assert!(validate_fetch_offset(12, buffer_len).is_err()); assert!(validate_fetch_offset(20, buffer_len).is_err()); assert!(validate_fetch_offset(35, buffer_len).is_err());
assert!(validate_fetch_offset(4, buffer_len).is_err()); assert!(validate_fetch_offset(7, buffer_len).is_err());
assert!(validate_fetch_offset(1, MAX_SIZE).is_err());
assert!(validate_fetch_offset(MAX_SIZE - 100, 200).is_err());
assert!(validate_fetch_offset(8 + 511 * ENTRY_SIZE, 40).is_ok());
assert!(validate_fetch_offset(8 + 512 * ENTRY_SIZE, 40).is_err());
}
#[test]
fn test_fetch_into_host_stub() {
let mut full = alloc::vec![0u8; MAX_SIZE];
let n = raw::fetch_into(&mut full, 0).expect("fetch_into(full, 0)");
assert_eq!(n, 0);
let mut header_only = alloc::vec![0u8; NUM_ENTRIES_SIZE];
let n2 = raw::fetch_into(&mut header_only, 0).expect("fetch_into(header_only, 0)");
assert_eq!(n2, 0);
let mut one_entry = alloc::vec![0u8; NUM_ENTRIES_SIZE + ENTRY_SIZE];
let n3 = raw::fetch_into(&mut one_entry, 0).expect("fetch_into(one_entry, 0)");
assert_eq!(n3, 0);
let mut skip_header = alloc::vec![0u8; ENTRY_SIZE];
let entries_count = raw::fetch_into(&mut skip_header, 8).expect("fetch_into(skip_header, 8)");
assert_eq!(entries_count, 1);
let mut misaligned = alloc::vec![0u8; NUM_ENTRIES_SIZE + 39];
assert!(raw::fetch_into(&mut misaligned, 0).is_err());
let mut buf = alloc::vec![0u8; 64];
assert!(raw::fetch_into(&mut buf, 12).is_err());
let mut small = alloc::vec![0u8; 200];
assert!(raw::fetch_into(&mut small, MAX_SIZE - 199).is_err());
}
#[test]
fn test_fetch_into_offset_avoids_incorrect_entry_count() {
let mut buffer = alloc::vec![0u8; 3 * ENTRY_SIZE];
let result = raw::fetch_into(&mut buffer, 8);
assert!(
result.is_ok(),
"fetch_into should succeed with offset that skips header"
);
let entries_that_fit = result.unwrap();
assert_eq!(
entries_that_fit, 3,
"Should return number of entries that fit in buffer, not some slot number"
);
let mut second_entry_buffer = alloc::vec![0u8; ENTRY_SIZE];
let second_result = raw::fetch_into(&mut second_entry_buffer, 48).unwrap();
assert_eq!(second_result, 1);
}