libfdt: tests: Improve assert!() error messages
Make assert!() log as much context as possible on error by reworking
uses of unwrap() or is_{some,none}() in the macro.
To illustrate, using
let x = Some(42);
assert_eq!(x, None);
instead of assert!(x.is_none()) prints out
assertion `left == right` failed
left: Some(42)
right: None
instead of "assertion failed: x.is_none()".
Test: atest liblibfdt.integration_test
Change-Id: Ia1c4a3af02d1e2df747ef82c8b963166c39de450
diff --git a/libs/libfdt/src/lib.rs b/libs/libfdt/src/lib.rs
index 0a97141..96ac3f4 100644
--- a/libs/libfdt/src/lib.rs
+++ b/libs/libfdt/src/lib.rs
@@ -499,6 +499,12 @@
}
}
+impl<'a> PartialEq for FdtNode<'a> {
+ fn eq(&self, other: &Self) -> bool {
+ self.fdt.as_ptr() == other.fdt.as_ptr() && self.offset == other.offset
+ }
+}
+
/// Phandle of a FDT node
#[repr(transparent)]
#[derive(Debug, Copy, Clone, PartialEq)]
@@ -535,6 +541,7 @@
}
/// Mutable FDT node.
+#[derive(Debug)]
pub struct FdtNodeMut<'a> {
fdt: &'a mut Fdt,
offset: c_int,
diff --git a/libs/libfdt/tests/api_test.rs b/libs/libfdt/tests/api_test.rs
index bd2b306..78bb618 100644
--- a/libs/libfdt/tests/api_test.rs
+++ b/libs/libfdt/tests/api_test.rs
@@ -42,7 +42,7 @@
const EXPECTED_FIRST_MEMORY_RANGE: Range<usize> = 0..256;
let mut memory = fdt.memory().unwrap();
assert_eq!(memory.next(), Some(EXPECTED_FIRST_MEMORY_RANGE));
- assert!(memory.next().is_none());
+ assert_eq!(memory.next(), None);
assert_eq!(fdt.first_memory_range(), Ok(EXPECTED_FIRST_MEMORY_RANGE));
}
@@ -56,7 +56,7 @@
let mut memory = fdt.memory().unwrap();
assert_eq!(memory.next(), Some(EXPECTED_FIRST_MEMORY_RANGE));
assert_eq!(memory.next(), Some(EXPECTED_SECOND_MEMORY_RANGE));
- assert!(memory.next().is_none());
+ assert_eq!(memory.next(), None);
assert_eq!(fdt.first_memory_range(), Ok(EXPECTED_FIRST_MEMORY_RANGE));
}
@@ -66,7 +66,7 @@
let fdt = Fdt::from_slice(&data).unwrap();
let mut memory = fdt.memory().unwrap();
- assert!(memory.next().is_none());
+ assert_eq!(memory.next(), None);
assert_eq!(fdt.first_memory_range(), Err(FdtError::NotFound));
}
@@ -85,14 +85,14 @@
let fdt = Fdt::from_slice(&data).unwrap();
let root = fdt.root().unwrap();
- assert_eq!(root.name().unwrap().to_str().unwrap(), "");
+ assert_eq!(root.name(), Ok(cstr!("")));
let chosen = fdt.chosen().unwrap().unwrap();
- assert_eq!(chosen.name().unwrap().to_str().unwrap(), "chosen");
+ assert_eq!(chosen.name(), Ok(cstr!("chosen")));
let nested_node_path = cstr!("/cpus/PowerPC,970@0");
let nested_node = fdt.node(nested_node_path).unwrap().unwrap();
- assert_eq!(nested_node.name().unwrap().to_str().unwrap(), "PowerPC,970@0");
+ assert_eq!(nested_node.name(), Ok(cstr!("PowerPC,970@0")));
}
#[test]
@@ -100,10 +100,10 @@
let data = fs::read(TEST_TREE_WITH_NO_MEMORY_NODE_PATH).unwrap();
let fdt = Fdt::from_slice(&data).unwrap();
let root = fdt.root().unwrap();
- let expected: Vec<&str> = vec!["cpus", "randomnode", "chosen"];
+ let expected = [cstr!("cpus"), cstr!("randomnode"), cstr!("chosen")];
for (node, name) in root.subnodes().unwrap().zip(expected) {
- assert_eq!(node.name().unwrap().to_str().unwrap(), name);
+ assert_eq!(node.name(), Ok(name));
}
}
@@ -113,17 +113,17 @@
let fdt = Fdt::from_slice(&data).unwrap();
let root = fdt.root().unwrap();
let one_be = 0x1_u32.to_be_bytes();
- let expected: Vec<(&str, &[u8])> = vec![
- ("model", b"MyBoardName\0"),
- ("compatible", b"MyBoardName\0MyBoardFamilyName\0"),
- ("#address-cells", &one_be),
- ("#size-cells", &one_be),
- ("empty_prop", b""),
+ let expected = [
+ (cstr!("model"), b"MyBoardName\0".as_ref()),
+ (cstr!("compatible"), b"MyBoardName\0MyBoardFamilyName\0".as_ref()),
+ (cstr!("#address-cells"), &one_be),
+ (cstr!("#size-cells"), &one_be),
+ (cstr!("empty_prop"), &[]),
];
- for (prop, (name, value)) in root.properties().unwrap().zip(expected) {
- assert_eq!(prop.name().unwrap().to_str().unwrap(), name);
- assert_eq!(prop.value().unwrap(), value);
+ let properties = root.properties().unwrap();
+ for (prop, (name, value)) in properties.zip(expected.into_iter()) {
+ assert_eq!((prop.name(), prop.value()), (Ok(name), Ok(value)));
}
}
@@ -132,11 +132,11 @@
let data = fs::read(TEST_TREE_WITH_NO_MEMORY_NODE_PATH).unwrap();
let fdt = Fdt::from_slice(&data).unwrap();
let node = fdt.node(cstr!("/cpus/PowerPC,970@1")).unwrap().unwrap();
- let expected = &["", "cpus", "PowerPC,970@1"];
+ let expected = [cstr!(""), cstr!("cpus"), cstr!("PowerPC,970@1")];
- for (depth, expect) in expected.iter().enumerate() {
+ for (depth, name) in expected.into_iter().enumerate() {
let supernode = node.supernode_at_depth(depth).unwrap();
- assert_eq!(supernode.name().unwrap().to_str().unwrap(), *expect);
+ assert_eq!(supernode.name(), Ok(name));
}
}
@@ -172,8 +172,9 @@
fn max_phandle() {
let data = fs::read(TEST_TREE_PHANDLE_PATH).unwrap();
let fdt = Fdt::from_slice(&data).unwrap();
+ let phandle = Phandle::new(0xFF).unwrap();
- assert_eq!(fdt.max_phandle().unwrap(), Phandle::new(0xFF).unwrap());
+ assert_eq!(fdt.max_phandle(), Ok(phandle));
}
#[test]
@@ -182,32 +183,36 @@
let fdt = Fdt::from_slice(&data).unwrap();
// Test linux,phandle
- let node = fdt.node_with_phandle(Phandle::new(0xFF).unwrap()).unwrap().unwrap();
- assert_eq!(node.name().unwrap().to_str().unwrap(), "node_zz");
+ let phandle = Phandle::new(0xFF).unwrap();
+ let node = fdt.node_with_phandle(phandle).unwrap().unwrap();
+ assert_eq!(node.name(), Ok(cstr!("node_zz")));
// Test phandle
- let node = fdt.node_with_phandle(Phandle::new(0x22).unwrap()).unwrap().unwrap();
- assert_eq!(node.name().unwrap().to_str().unwrap(), "node_abc");
+ let phandle = Phandle::new(0x22).unwrap();
+ let node = fdt.node_with_phandle(phandle).unwrap().unwrap();
+ assert_eq!(node.name(), Ok(cstr!("node_abc")));
}
#[test]
fn node_nop() {
let mut data = fs::read(TEST_TREE_PHANDLE_PATH).unwrap();
let fdt = Fdt::from_mut_slice(&mut data).unwrap();
+ let phandle = Phandle::new(0xFF).unwrap();
+ let path = cstr!("/node_z/node_zz");
- fdt.node_with_phandle(Phandle::new(0xFF).unwrap()).unwrap().unwrap();
- let node = fdt.node_mut(cstr!("/node_z/node_zz")).unwrap().unwrap();
+ fdt.node_with_phandle(phandle).unwrap().unwrap();
+ let node = fdt.node_mut(path).unwrap().unwrap();
node.nop().unwrap();
- assert!(fdt.node_with_phandle(Phandle::new(0xFF).unwrap()).unwrap().is_none());
- assert!(fdt.node(cstr!("/node_z/node_zz")).unwrap().is_none());
+ assert_eq!(fdt.node_with_phandle(phandle), Ok(None));
+ assert_eq!(fdt.node(path), Ok(None));
fdt.unpack().unwrap();
fdt.pack().unwrap();
- assert!(fdt.node_with_phandle(Phandle::new(0xFF).unwrap()).unwrap().is_none());
- assert!(fdt.node(cstr!("/node_z/node_zz")).unwrap().is_none());
+ assert_eq!(fdt.node_with_phandle(phandle), Ok(None));
+ assert_eq!(fdt.node(path), Ok(None));
}
#[test]
@@ -236,7 +241,8 @@
for len in 1..subnode_name.to_bytes().len() {
let name = String::from_utf8(subnode_name.to_bytes()[..len].to_vec()).unwrap();
let path = CString::new(format!("{node_path}/{name}")).unwrap();
+ let name = CString::new(name).unwrap();
let subnode = fdt.node(&path).unwrap().unwrap();
- assert_eq!(subnode.name().unwrap().to_str().unwrap(), name);
+ assert_eq!(subnode.name(), Ok(name.as_c_str()));
}
}