Unit testing framework and devicetree framework refactoring (#50)
[lunaix-os.git] / lunaix-os / tests / units / device-tree / test-interrupts.c
diff --git a/lunaix-os/tests/units/device-tree/test-interrupts.c b/lunaix-os/tests/units/device-tree/test-interrupts.c
new file mode 100644 (file)
index 0000000..934c4c7
--- /dev/null
@@ -0,0 +1,106 @@
+#include "common.h"
+#include <testing/basic.h>
+
+extern void *calloc(size_t, size_t);
+extern void  free(void *);
+
+void
+run_test(int argc, const char* argv[])
+{
+    struct dt_context* ctx;
+    struct dtn* node, *domain;
+    struct dtn_iter it;
+    struct dtp_val val;
+    
+    my_load_dtb();
+
+    ctx = dt_main_context();
+
+    node = ctx->root;
+    testcase("root", {
+        expect_notnull(node);
+        expect_int(node->base.addr_c, 0);
+        expect_int(node->base.sz_c, 0);
+        expect_int(node->base.intr_c, 0);
+    });
+
+    dt_begin_find_byname(&it, ctx->root, "dev@1");
+    node = (struct dtn*)it.matched;
+    
+    testcase("intr-basic", {
+        expect_notnull(node);
+        expect_notnull(node->intr.parent);
+
+        expect_str(dt_name(node), "dev@1");
+        expect_str(dt_name(node->intr.parent), "pic@11");
+    });
+
+    testcase("intr-single", {
+        expect_int(node->intr.nr_intrs, 1);
+        expect_false(node->intr.extended);
+
+        domain = dt_interrupt_at(node, 0, &val);
+        expect_int(val.ref->raw[0], 1);
+        expect_int(val.ref->raw[1], 2);
+        expect_str(dt_name(domain), "pic@11");
+
+        expect_null(dt_interrupt_at(node, 1, &val));
+    });
+
+    dt_begin_find_byname(&it, ctx->root, "dev@2");
+    node = (struct dtn*)it.matched;
+
+    testcase("intr-multi", {
+        expect_notnull(node);
+        expect_int(node->intr.nr_intrs, 3);
+        expect_false(node->intr.extended);
+
+        domain = dt_interrupt_at(node, 0, &val);
+        expect_int(val.ref->raw[0], 1);
+        expect_int(val.ref->raw[1], 1);
+        expect_str(dt_name(domain), "pic@11");
+
+        domain = dt_interrupt_at(node, 1, &val);
+        expect_int(val.ref->raw[0], 1);
+        expect_int(val.ref->raw[1], 2);
+        expect_str(dt_name(domain), "pic@11");
+
+        domain = dt_interrupt_at(node, 2, &val);
+        expect_int(val.ref->raw[0], 2);
+        expect_int(val.ref->raw[1], 2);
+        expect_str(dt_name(domain), "pic@11");
+
+        expect_null(dt_interrupt_at(node, 3, &val));
+    });
+
+    dt_begin_find_byname(&it, ctx->root, "dev@3");
+    node = (struct dtn*)it.matched;
+
+    testcase("intr-ext-multi", {
+        expect_notnull(node);
+
+        expect_int(node->intr.nr_intrs, 3);
+        expect_true(node->intr.extended);
+
+        domain = dt_interrupt_at(node, 0, &val);
+        expect_int(val.size / sizeof(int), 2);
+        expect_int(val.ref->raw[0], 3);
+        expect_int(val.ref->raw[1], 3);
+        expect_str(dt_name(domain), "pic@11");
+
+        domain = dt_interrupt_at(node, 1, &val);
+        expect_int(val.size / sizeof(int), 1);
+        expect_int(val.ref->raw[0], 1);
+        expect_str(dt_name(domain), "pic@22");
+
+        domain = dt_interrupt_at(node, 2, &val);
+        expect_int(val.size / sizeof(int), 4);
+        expect_int(val.ref->raw[0], 1);
+        expect_int(val.ref->raw[1], 2);
+        expect_int(val.ref->raw[2], 3);
+        expect_int(val.ref->raw[3], 4);
+        expect_str(dt_name(domain), "pic@33");
+
+        expect_null(dt_interrupt_at(node, 3, &val));
+    });
+}
\ No newline at end of file