Skip to content

Commit e2fbd55

Browse files
committed
Moved most tests into the main crate
Signed-off-by: SlyMarbo <[email protected]>
1 parent b82341a commit e2fbd55

File tree

5 files changed

+202
-255
lines changed

5 files changed

+202
-255
lines changed

kernel/src/lib.rs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,3 +337,68 @@ fn test_kernel_main(boot_info: &'static BootInfo) -> ! {
337337
fn panic(info: &PanicInfo) -> ! {
338338
test_panic_handler(info)
339339
}
340+
341+
#[test_case]
342+
fn bitmap() {
343+
let mut bitmap = Bitmap::new_unset(7);
344+
for i in 0..7 {
345+
// Check it's false by default.
346+
assert_eq!(bitmap.get(i), false);
347+
assert_eq!(bitmap.next_set(), None);
348+
349+
// Check set.
350+
bitmap.set(i);
351+
assert_eq!(bitmap.get(i), true);
352+
assert_eq!(bitmap.next_set(), Some(i));
353+
354+
// Check unset.
355+
bitmap.unset(i);
356+
assert_eq!(bitmap.get(i), false);
357+
}
358+
359+
bitmap = Bitmap::new_unset(67);
360+
for i in 0..67 {
361+
// Check it's false by default.
362+
assert_eq!(bitmap.get(i), false);
363+
assert_eq!(bitmap.next_set(), None);
364+
365+
// Check set.
366+
bitmap.set(i);
367+
assert_eq!(bitmap.get(i), true);
368+
assert_eq!(bitmap.next_set(), Some(i));
369+
370+
// Check unset.
371+
bitmap.unset(i);
372+
assert_eq!(bitmap.get(i), false);
373+
}
374+
375+
bitmap = Bitmap::new_set(7);
376+
for i in 0..7 {
377+
// Check it's true by default.
378+
assert_eq!(bitmap.get(i), true);
379+
380+
// Check unset.
381+
bitmap.unset(i);
382+
assert_eq!(bitmap.get(i), false);
383+
assert_eq!(bitmap.next_unset(), Some(i));
384+
385+
// Check set.
386+
bitmap.set(i);
387+
assert_eq!(bitmap.get(i), true);
388+
}
389+
390+
bitmap = Bitmap::new_set(67);
391+
for i in 0..67 {
392+
// Check it's true by default.
393+
assert_eq!(bitmap.get(i), true);
394+
395+
// Check unset.
396+
bitmap.unset(i);
397+
assert_eq!(bitmap.get(i), false);
398+
assert_eq!(bitmap.next_unset(), Some(i));
399+
400+
// Check set.
401+
bitmap.set(i);
402+
assert_eq!(bitmap.get(i), true);
403+
}
404+
}

kernel/src/memory/mod.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,3 +243,33 @@ pub unsafe fn kernel_pml4() -> OffsetPageTable<'static> {
243243
let page_table = &mut *page_table_ptr; // unsafe
244244
OffsetPageTable::new(page_table, PHYSICAL_MEMORY_OFFSET)
245245
}
246+
247+
#[test_case]
248+
fn simple_allocation() {
249+
use alloc::boxed::Box;
250+
let heap_value_1 = Box::new(41);
251+
let heap_value_2 = Box::new(13);
252+
assert_eq!(*heap_value_1, 41);
253+
assert_eq!(*heap_value_2, 13);
254+
}
255+
256+
#[test_case]
257+
fn large_vec() {
258+
use alloc::vec::Vec;
259+
let n = 1000;
260+
let mut vec = Vec::new();
261+
for i in 0..n {
262+
vec.push(i);
263+
}
264+
265+
assert_eq!(vec.iter().sum::<u64>(), (n - 1) * n / 2);
266+
}
267+
268+
#[test_case]
269+
fn many_boxes() {
270+
use alloc::boxed::Box;
271+
for i in 0..KERNEL_HEAP.size() {
272+
let x = Box::new(i);
273+
assert_eq!(*x, i);
274+
}
275+
}

kernel/src/memory/pmm/bitmap.rs

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,3 +350,110 @@ impl FrameDeallocator<Size4KiB> for BitmapFrameAllocator {
350350
);
351351
}
352352
}
353+
354+
#[test_case]
355+
fn bitmap_frame_allocator() {
356+
use bootloader::bootinfo::FrameRange;
357+
let regions = [
358+
MemoryRegion {
359+
range: FrameRange {
360+
start_frame_number: 0u64,
361+
end_frame_number: 1u64,
362+
},
363+
region_type: MemoryRegionType::FrameZero,
364+
},
365+
MemoryRegion {
366+
range: FrameRange {
367+
start_frame_number: 1u64,
368+
end_frame_number: 4u64,
369+
},
370+
region_type: MemoryRegionType::Reserved,
371+
},
372+
MemoryRegion {
373+
range: FrameRange {
374+
start_frame_number: 4u64,
375+
end_frame_number: 8u64,
376+
},
377+
region_type: MemoryRegionType::Usable,
378+
},
379+
MemoryRegion {
380+
range: FrameRange {
381+
start_frame_number: 8u64,
382+
end_frame_number: 12u64,
383+
},
384+
region_type: MemoryRegionType::Reserved,
385+
},
386+
MemoryRegion {
387+
range: FrameRange {
388+
start_frame_number: 12u64,
389+
end_frame_number: 14u64,
390+
},
391+
region_type: MemoryRegionType::Usable,
392+
},
393+
];
394+
395+
let mut alloc = unsafe { BitmapFrameAllocator::new(regions.iter()) };
396+
assert_eq!(alloc.num_frames, 6u64);
397+
assert_eq!(alloc.free_frames, 6u64);
398+
399+
// Helper function to speed up making frames.
400+
fn frame_for(addr: u64) -> PhysFrame {
401+
let start_addr = PhysAddr::new(addr);
402+
let frame = PhysFrame::from_start_address(start_addr).unwrap();
403+
frame
404+
}
405+
406+
// Do some allocations.
407+
assert_eq!(alloc.allocate_frame(), Some(frame_for(0x4000)));
408+
assert_eq!(alloc.num_frames, 6u64);
409+
assert_eq!(alloc.free_frames, 5u64);
410+
assert_eq!(alloc.allocate_frame(), Some(frame_for(0x5000)));
411+
assert_eq!(alloc.num_frames, 6u64);
412+
assert_eq!(alloc.free_frames, 4u64);
413+
414+
// Do a free.
415+
unsafe { alloc.deallocate_frame(frame_for(0x4000)) };
416+
assert_eq!(alloc.num_frames, 6u64);
417+
assert_eq!(alloc.free_frames, 5u64);
418+
419+
// Next allocation should return the address we just freed.
420+
assert_eq!(alloc.allocate_frame(), Some(frame_for(0x4000)));
421+
assert_eq!(alloc.num_frames, 6u64);
422+
assert_eq!(alloc.free_frames, 4u64);
423+
424+
// Check that all remaining allocations are as we expect.
425+
assert_eq!(alloc.allocate_frame(), Some(frame_for(0x6000)));
426+
assert_eq!(alloc.allocate_frame(), Some(frame_for(0x7000)));
427+
assert_eq!(alloc.allocate_frame(), Some(frame_for(0xc000)));
428+
assert_eq!(alloc.allocate_frame(), Some(frame_for(0xd000)));
429+
assert_eq!(alloc.num_frames, 6u64);
430+
assert_eq!(alloc.free_frames, 0u64);
431+
432+
// Check that we get nothing once we run out of frames.
433+
assert_eq!(alloc.allocate_frame(), None);
434+
assert_eq!(alloc.num_frames, 6u64);
435+
assert_eq!(alloc.free_frames, 0u64);
436+
437+
// Check that sequential allocations work correctly.
438+
439+
// Deallocate 2 non-sequential frames, expect None.
440+
unsafe { alloc.deallocate_frame(frame_for(0x5000)) };
441+
unsafe { alloc.deallocate_frame(frame_for(0x7000)) };
442+
assert_eq!(alloc.allocate_n_frames(2), None);
443+
444+
// Leave 2 sequential frames, check we get the right pair.
445+
// Note: we use PhysFrameRange, not PhysFrameRangeInclusive.
446+
assert_eq!(alloc.allocate_frame(), Some(frame_for(0x5000)));
447+
unsafe { alloc.deallocate_frame(frame_for(0x6000)) };
448+
assert_eq!(
449+
alloc.allocate_n_frames(2),
450+
Some(PhysFrameRange {
451+
start: frame_for(0x6000),
452+
end: frame_for(0x8000) // exclusive
453+
})
454+
);
455+
456+
// Check that we get nothing once we run out of frames.
457+
assert_eq!(alloc.num_frames, 6u64);
458+
assert_eq!(alloc.free_frames, 0u64);
459+
}

kernel/tests/basic_boot.rs

Lines changed: 0 additions & 26 deletions
This file was deleted.

0 commit comments

Comments
 (0)