Nothing to see here, move along
at main 93 lines 3.1 kB view raw
1use crate::cap::object::{EndpointData, ObjectData}; 2use crate::cap::pool::POOL; 3use crate::error::KernelError; 4use crate::types::Generation; 5 6crate::kernel_test!( 7 fn allocate_and_get() { 8 let mut pool = POOL.lock(); 9 let data = ObjectData::Endpoint(EndpointData::new()); 10 let (id, generation) = pool.allocate(data).expect("pool allocate failed"); 11 let obj = pool.get(id, generation).expect("pool get failed"); 12 assert!( 13 matches!(obj, ObjectData::Endpoint(_)), 14 "expected Endpoint variant" 15 ); 16 let _ = pool.dec_ref(id, generation); 17 } 18); 19 20crate::kernel_test!( 21 fn dec_ref_frees_slot() { 22 let mut pool = POOL.lock(); 23 let data = ObjectData::Endpoint(EndpointData::new()); 24 let (id, generation) = pool.allocate(data).expect("pool allocate"); 25 let _ = pool.dec_ref(id, generation); 26 let result = pool.get(id, generation); 27 assert!( 28 matches!(result, Err(KernelError::StaleGeneration)), 29 "expected StaleGeneration after free, got {:?}", 30 result.err() 31 ); 32 } 33); 34 35crate::kernel_test!( 36 fn inc_then_dec_keeps_alive() { 37 let mut pool = POOL.lock(); 38 let data = ObjectData::Endpoint(EndpointData::new()); 39 let (id, generation) = pool.allocate(data).expect("pool allocate"); 40 pool.inc_ref(id, generation).expect("inc_ref failed"); 41 let freed = pool.dec_ref(id, generation); 42 assert!( 43 freed.is_none(), 44 "object freed too early (refcount should be 1)" 45 ); 46 let obj = pool.get(id, generation); 47 assert!(obj.is_ok(), "object should still be alive at refcount 1"); 48 let _ = pool.dec_ref(id, generation); 49 } 50); 51 52crate::kernel_test!( 53 fn exhaust_pool_returns_error() { 54 let mut pool = POOL.lock(); 55 let _gen0 = Generation::new(0); 56 let mut allocated = 57 crate::static_vec::StaticVec::<(crate::types::ObjectId, Generation), 1024>::new(); 58 59 let mut count: usize = 0; 60 loop { 61 match pool.allocate(ObjectData::Endpoint(EndpointData::new())) { 62 Ok((id, generation)) => { 63 let _ = allocated.push((id, generation)); 64 count += 1; 65 } 66 Err(KernelError::PoolExhausted) => break, 67 Err(e) => panic!("unexpected error: {:?}", e), 68 } 69 } 70 assert!(count > 0, "could not allocate any objects"); 71 72 allocated.as_slice().iter().for_each(|&(id, generation)| { 73 let _ = pool.dec_ref(id, generation); 74 }); 75 } 76); 77 78crate::kernel_test!( 79 fn arena_free_already_free_is_noop() { 80 let mut pool = POOL.lock(); 81 let (id, generation) = pool 82 .allocate(ObjectData::Endpoint(EndpointData::new())) 83 .expect("alloc"); 84 85 let freed = pool.free(id, generation); 86 assert!(freed.is_ok(), "first free should succeed"); 87 88 assert!( 89 pool.get(id, generation).is_err(), 90 "slot should not be accessible after free" 91 ); 92 } 93);