#[test] fn os_user_runtime_alloc_positive() { let (mut runtime, _, child) = setup(); activate(&mut runtime, child); let baseline = runtime.fixture_backend().primary_inventory(); let acquisitions = runtime.fixture_backend().runtime_hooks.borrow().acquisitions; assert!(matches!(runtime.allocate(1, 3), Err(Error::Invalid))); assert_eq!(runtime.fixture_backend().runtime_hooks.borrow().acquisitions, acquisitions); let mut buffers = Vec::new(); for (index, capacity) in [16, 32, 64].into_iter().enumerate() { let buffer = runtime.allocate(capacity, 16).unwrap(); for position in 0..capacity { runtime.push(&buffer, (index as u8) ^ (position as u8)).unwrap(); } buffers.push(buffer); } assert_eq!(runtime.fixture_backend().heap_inventory(), Inventory { pages: 3, pins: 3 }); for (index, buffer) in buffers.iter().enumerate() { for position in 0..[16, 32, 64][index] { assert_eq!(runtime.read(buffer, position), Ok((index as u8) ^ (position as u8))); } } for buffer in buffers { runtime.free(buffer).ok().unwrap(); } assert_eq!(runtime.fixture_backend().heap_inventory(), Inventory { pages: 0, pins: 0 }); assert_eq!(runtime.fixture_backend().primary_inventory(), baseline); } #[test] fn os_user_runtime_alloc_negative() { let (mut runtime, shell, child) = setup(); activate(&mut runtime, child); let baseline = runtime.fixture_backend().primary_inventory(); let buffers: Vec<_> = (0..3).map(|_| runtime.allocate(1, 1).unwrap()).collect(); let acquisitions = runtime.fixture_backend().runtime_hooks.borrow().acquisitions; let full = runtime.fixture_backend().primary_inventory(); assert!(matches!(runtime.allocate(1, 1), Err(Error::NoMem))); assert_eq!(runtime.fixture_backend().runtime_hooks.borrow().acquisitions, acquisitions); assert_eq!(runtime.fixture_backend().primary_inventory(), full); activate(&mut runtime, shell); let healthy = runtime.allocate(8, 8).unwrap(); runtime.push(&healthy, 0x5a).unwrap(); assert_eq!(runtime.read(&healthy, 0), Ok(0x5a)); assert_eq!(runtime.fixture_backend().record(shell).resources.state, threads::State::Running); runtime.free(healthy).ok().unwrap(); activate(&mut runtime, child); for buffer in buffers { runtime.free(buffer).ok().unwrap(); } assert_eq!(runtime.fixture_backend().heap_inventory(), Inventory { pages: 0, pins: 0 }); assert_eq!(runtime.fixture_backend().primary_inventory(), baseline); }