Nothing to see here, move along
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);