Unit testing framework and devicetree framework refactoring (#50)
[lunaix-os.git] / lunaix-os / tests / units / device-tree / test-fdt-mem.c
diff --git a/lunaix-os/tests/units/device-tree/test-fdt-mem.c b/lunaix-os/tests/units/device-tree/test-fdt-mem.c
new file mode 100644 (file)
index 0000000..1537ab0
--- /dev/null
@@ -0,0 +1,95 @@
+#include "common.h"
+#include <testing/basic.h>
+
+static void
+test_fdt_memory_node(ptr_t dtb)
+{
+    struct fdt_blob fdt;
+    struct fdt_memscan mscan;
+    struct dt_memory_node mnode;
+
+    fdt_load(&fdt, dtb);
+    fdt_memscan_begin(&mscan, &fdt);
+
+    testcase("initial-state", {
+        expect_int(mscan.root_addr_c, 2);
+        expect_int(mscan.root_size_c, 1);
+    });
+
+    testcase("memory-node-1", {
+        expect_true(fdt_memscan_nextnode(&mscan, &fdt));
+
+        expect_str(mscan.found.node->name, "memory@1000000");
+        expect_true(mscan.node_type == FDT_MEM_FREE);
+
+        expect_true(fdt_memscan_nextrange(&mscan, &mnode));
+        expect_ulong(mnode.base, 0x1000000UL);
+        expect_ulong(mnode.size, 0x10000UL);
+
+        expect_true(fdt_memscan_nextrange(&mscan, &mnode));
+        expect_ulong(mnode.base, 0x8000000UL);
+        expect_ulong(mnode.size, 0x10000UL);
+
+        expect_true(fdt_memscan_nextrange(&mscan, &mnode));
+        expect_ulong(mnode.base, 0x1002000000UL);
+        expect_ulong(mnode.size, 0x200000UL);
+
+        expect_false(fdt_memscan_nextrange(&mscan, &mnode));
+    });
+
+    testcase("memory-node-2", {
+        expect_true(fdt_memscan_nextnode(&mscan, &fdt));
+
+        expect_str(mscan.found.node->name, "memory@f000000");
+        expect_true(mscan.node_type == FDT_MEM_FREE);
+
+        expect_true(fdt_memscan_nextrange(&mscan, &mnode));
+        expect_ulong(mnode.base, 0xf000000UL);
+        expect_ulong(mnode.size, 0xff000UL);
+
+        expect_false(fdt_memscan_nextrange(&mscan, &mnode));
+    });
+
+    testcase("reserved-node-1", {
+        expect_true(fdt_memscan_nextnode(&mscan, &fdt));
+
+        expect_str(mscan.found.node->name, "hwrom@0");
+        expect_true(mscan.node_type == FDT_MEM_RSVD);
+        expect_true(mscan.node_attr.nomap);
+
+        expect_true(fdt_memscan_nextrange(&mscan, &mnode));
+        expect_ulong(mnode.base, 0x0);
+        expect_ulong(mnode.size, 0x1000000);
+
+        expect_false(fdt_memscan_nextrange(&mscan, &mnode));
+    });
+
+    testcase("reserved-node-2", {
+        expect_true(fdt_memscan_nextnode(&mscan, &fdt));
+
+        expect_str(mscan.found.node->name, "cma");
+        expect_true(mscan.node_type == FDT_MEM_RSVD_DYNAMIC);
+        expect_true(mscan.node_attr.reusable);
+        expect_false(mscan.node_attr.nomap);
+        expect_ulong(mscan.node_attr.alignment, 0x400000);
+        expect_ulong(mscan.node_attr.total_size, 0x10000000);
+
+        expect_true(fdt_memscan_nextrange(&mscan, &mnode));
+        expect_ulong(mnode.base, 0x10000000);
+        expect_ulong(mnode.size, 0x10000000);
+
+        expect_false(fdt_memscan_nextrange(&mscan, &mnode));
+    });
+
+    testcase("reserved-node-out-of-bound", {
+        expect_false(fdt_memscan_nextnode(&mscan, &fdt));
+    });
+}
+
+void
+run_test(int argc, const char* argv[])
+{
+    ptr_t dtb = load_fdt();
+
+    test_fdt_memory_node(dtb);
+}
\ No newline at end of file