use remdb::memory::allocator::*;
use remdb::memory::pool::*;
use remdb::memory::MemoryBlock;
use remdb::types::Result;
#[test]
fn test_static_allocator() {
let mut buffer = [0u8; 4096];
let mut allocator = StaticAllocator::new(buffer.as_mut_ptr(), buffer.len())
.expect("Failed to create allocator");
let ptr1 = allocator.allocate(64).unwrap();
let ptr2 = allocator.allocate(128).unwrap();
assert!(
ptr1.as_ptr() as usize + 64 + core::mem::size_of::<MemoryBlock>() <= ptr2.as_ptr() as usize
);
allocator.free(ptr1);
let _ptr3 = allocator.allocate(64).unwrap();
let stats = allocator.stats();
let expected_used = 128 + 64 + 2 * core::mem::size_of::<MemoryBlock>();
assert_eq!(stats.used, expected_used);
assert_eq!(stats.total, buffer.len());
assert_eq!(stats.alloc_count, 3);
assert_eq!(stats.free_count, 1);
}
#[test]
fn test_memory_pool() {
let mut buffer = [0u8; 4096];
unsafe {
let block_size = 64;
let mut pool = MemoryPool::new(
buffer.as_mut_ptr(),
block_size, 64, );
let ptr1 = pool.allocate().unwrap();
let ptr2 = pool.allocate().unwrap();
let block_size = (ptr2.as_ptr() as isize - ptr1.as_ptr() as isize).abs() as usize;
assert!(block_size >= 64);
assert_eq!(block_size % 8, 0);
pool.free(ptr1);
assert_eq!(pool.used_blocks(), 1);
let ptr3 = pool.allocate().unwrap();
assert_eq!(ptr3.as_ptr(), ptr1.as_ptr());
assert_eq!(pool.usage(), 2.0 / 64.0);
}
}
#[test]
fn test_multi_pool_manager() {
let mut buffer = [0u8; 8192];
let _pool_sizes = [16, 32, 64, 128];
let _pool_counts = [16, 8, 4, 2];
unsafe {
let mut pools = [
MemoryPool::new(buffer.as_mut_ptr(), 16, 16),
MemoryPool::new((buffer.as_mut_ptr() as usize + 16 * 16) as *mut u8, 32, 8),
MemoryPool::new(
(buffer.as_mut_ptr() as usize + 16 * 16 + 32 * 8) as *mut u8,
64,
4,
),
MemoryPool::new(
(buffer.as_mut_ptr() as usize + 16 * 16 + 32 * 8 + 64 * 4) as *mut u8,
128,
2,
),
];
let mut manager = MultiPoolManager::new(&mut pools);
let ptr1 = manager.allocate(10).unwrap();
let ptr2 = manager.allocate(20).unwrap();
let ptr3 = manager.allocate(50).unwrap();
let ptr4 = manager.allocate(100).unwrap();
manager.free(ptr1);
manager.free(ptr2);
manager.free(ptr3);
manager.free(ptr4);
assert_eq!(manager.total_usage(), 0.0);
}
}
#[test]
fn test_allocator_edge_cases() {
let mut buffer = [0u8; 128];
let mut allocator = StaticAllocator::new(buffer.as_mut_ptr(), buffer.len())
.expect("Failed to create allocator");
let ptr1 = allocator.allocate(100).unwrap();
let result = allocator.allocate(100);
assert!(result.is_err());
allocator.free(ptr1);
let _ptr2 = allocator.allocate(100).unwrap();
}