Skip to content

Commit 50f7090

Browse files
committed
uefi: mem: unit test for MemoryMapOwned + streamline test usage
Simplify MemoryMapOwned::from_initialized_mem to simplify and streamline the construction in unit tests.
1 parent a57435e commit 50f7090

File tree

2 files changed

+46
-30
lines changed

2 files changed

+46
-30
lines changed

uefi/src/mem/memory_map/impl_.rs

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -304,10 +304,12 @@ impl MemoryMapBackingMemory {
304304
Self(slice)
305305
}
306306

307+
/// INTERNAL, for unit tests.
308+
///
307309
/// Creates an instance from the provided memory, which is not necessarily
308310
/// on the UEFI heap.
309311
#[cfg(test)]
310-
fn from_slice(buffer: &mut [u8]) -> Self {
312+
pub(crate) fn from_slice(buffer: &mut [u8]) -> Self {
311313
let len = buffer.len();
312314
unsafe { Self::from_raw(buffer.as_mut_ptr(), len) }
313315
}
@@ -350,6 +352,10 @@ impl Drop for MemoryMapBackingMemory {
350352
log::error!("Failed to deallocate memory map: {e:?}");
351353
}
352354
} else {
355+
#[cfg(test)]
356+
log::debug!("Boot services are not available in unit tests.");
357+
358+
#[cfg(not(test))]
353359
log::debug!("Boot services are excited. Memory map won't be freed using the UEFI boot services allocator.");
354360
}
355361
}
@@ -365,30 +371,13 @@ pub struct MemoryMapOwned {
365371
}
366372

367373
impl MemoryMapOwned {
368-
/// Creates a [`MemoryMapOwned`] from the give initialized memory map behind
369-
/// the buffer and the reported `desc_size` from UEFI.
374+
/// Creates a [`MemoryMapOwned`] from the given **initialized** memory map
375+
/// (stored inside the provided buffer) and the corresponding
376+
/// [`MemoryMapMeta`].
370377
pub(crate) fn from_initialized_mem(buf: MemoryMapBackingMemory, meta: MemoryMapMeta) -> Self {
371378
assert!(meta.desc_size >= mem::size_of::<MemoryDescriptor>());
372379
let len = meta.entry_count();
373-
MemoryMapOwned {
374-
buf,
375-
meta,
376-
len,
377-
}
378-
}
379-
380-
#[cfg(test)]
381-
pub(super) fn from_raw(buf: &mut [u8], desc_size: usize) -> Self {
382-
let mem = MemoryMapBackingMemory::from_slice(buf);
383-
Self::from_initialized_mem(
384-
mem,
385-
MemoryMapMeta {
386-
map_size: buf.len(),
387-
desc_size,
388-
map_key: MemoryMapKey(0),
389-
desc_version: MemoryDescriptor::VERSION,
390-
},
391-
)
380+
MemoryMapOwned { buf, meta, len }
392381
}
393382
}
394383

@@ -500,7 +489,7 @@ mod tests {
500489
fn memory_map_ref() {
501490
let mut memory = new_mmap_memory();
502491
let (mmap, meta) = mmap_raw(&mut memory);
503-
let mmap = MemoryMapRef::new(mmap, meta, None).unwrap();
492+
let mmap = MemoryMapRef::new(mmap, meta).unwrap();
504493

505494
assert_eq!(mmap.entries().count(), 3);
506495
assert_eq!(
@@ -515,7 +504,25 @@ mod tests {
515504
fn memory_map_ref_mut() {
516505
let mut memory = new_mmap_memory();
517506
let (mmap, meta) = mmap_raw(&mut memory);
518-
let mut mmap = MemoryMapRefMut::new(mmap, meta, None).unwrap();
507+
let mut mmap = MemoryMapRefMut::new(mmap, meta).unwrap();
508+
509+
assert_eq!(mmap.entries().count(), 3);
510+
assert_eq!(
511+
mmap.entries().copied().collect::<Vec<_>>().as_slice(),
512+
&BASE_MMAP_UNSORTED
513+
);
514+
assert!(!mmap.is_sorted());
515+
mmap.sort();
516+
assert!(mmap.is_sorted());
517+
}
518+
519+
/// Basic sanity checks for the type [`MemoryMapOwned`].
520+
#[test]
521+
fn memory_map_owned() {
522+
let mut memory = new_mmap_memory();
523+
let (mmap, meta) = mmap_raw(&mut memory);
524+
let mmap = MemoryMapBackingMemory::from_slice(mmap);
525+
let mut mmap = MemoryMapOwned::from_initialized_mem(mmap, meta);
519526

520527
assert_eq!(mmap.entries().count(), 3);
521528
assert_eq!(

uefi/src/mem/memory_map/mod.rs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,13 +105,21 @@ mod tests_mmap_artificial {
105105
use core::mem::{size_of, size_of_val};
106106

107107
fn buffer_to_map(buffer: &mut [MemoryDescriptor]) -> MemoryMapOwned {
108-
let byte_buffer = {
109-
unsafe {
110-
core::slice::from_raw_parts_mut(buffer.as_mut_ptr() as *mut u8, size_of_val(buffer))
111-
}
108+
let mmap_len = size_of_val(buffer);
109+
let mmap = {
110+
unsafe { core::slice::from_raw_parts_mut(buffer.as_mut_ptr() as *mut u8, mmap_len) }
112111
};
113112

114-
MemoryMapOwned::from_raw(byte_buffer, size_of::<MemoryDescriptor>())
113+
let mmap = MemoryMapBackingMemory::from_slice(mmap);
114+
MemoryMapOwned::from_initialized_mem(
115+
mmap,
116+
MemoryMapMeta {
117+
map_size: mmap_len,
118+
desc_size: size_of::<MemoryDescriptor>(),
119+
map_key: Default::default(),
120+
desc_version: MemoryDescriptor::VERSION,
121+
},
122+
)
115123
}
116124

117125
#[test]
@@ -258,7 +266,8 @@ mod tests_mmap_real {
258266
let mut buf = MMAP_RAW;
259267
let buf =
260268
unsafe { slice::from_raw_parts_mut(buf.as_mut_ptr().cast::<u8>(), MMAP_META.map_size) };
261-
let mut mmap = MemoryMapOwned::from_raw(buf, MMAP_META.desc_size);
269+
let buf = MemoryMapBackingMemory::from_slice(buf);
270+
let mut mmap = MemoryMapOwned::from_initialized_mem(buf, MMAP_META);
262271
mmap.sort();
263272

264273
let entries = mmap.entries().copied().collect::<Vec<_>>();

0 commit comments

Comments
 (0)