Unit testing framework and devicetree framework refactoring (#50)
[lunaix-os.git] / lunaix-os / tests / units / device-tree / test-interrupts.c
1 #include "common.h"
2 #include <testing/basic.h>
3
4 extern void *calloc(size_t, size_t);
5 extern void  free(void *);
6
7 void
8 run_test(int argc, const char* argv[])
9 {
10     struct dt_context* ctx;
11     struct dtn* node, *domain;
12     struct dtn_iter it;
13     struct dtp_val val;
14     
15     my_load_dtb();
16
17     ctx = dt_main_context();
18
19     node = ctx->root;
20     testcase("root", {
21         expect_notnull(node);
22         expect_int(node->base.addr_c, 0);
23         expect_int(node->base.sz_c, 0);
24         expect_int(node->base.intr_c, 0);
25     });
26
27     dt_begin_find_byname(&it, ctx->root, "dev@1");
28     node = (struct dtn*)it.matched;
29     
30     testcase("intr-basic", {
31         expect_notnull(node);
32         expect_notnull(node->intr.parent);
33
34         expect_str(dt_name(node), "dev@1");
35         expect_str(dt_name(node->intr.parent), "pic@11");
36     });
37
38     testcase("intr-single", {
39         expect_int(node->intr.nr_intrs, 1);
40         expect_false(node->intr.extended);
41
42         domain = dt_interrupt_at(node, 0, &val);
43         expect_int(val.ref->raw[0], 1);
44         expect_int(val.ref->raw[1], 2);
45         expect_str(dt_name(domain), "pic@11");
46
47         expect_null(dt_interrupt_at(node, 1, &val));
48     });
49
50     dt_begin_find_byname(&it, ctx->root, "dev@2");
51     node = (struct dtn*)it.matched;
52
53     testcase("intr-multi", {
54         expect_notnull(node);
55         expect_int(node->intr.nr_intrs, 3);
56         expect_false(node->intr.extended);
57
58         domain = dt_interrupt_at(node, 0, &val);
59         expect_int(val.ref->raw[0], 1);
60         expect_int(val.ref->raw[1], 1);
61         expect_str(dt_name(domain), "pic@11");
62
63         domain = dt_interrupt_at(node, 1, &val);
64         expect_int(val.ref->raw[0], 1);
65         expect_int(val.ref->raw[1], 2);
66         expect_str(dt_name(domain), "pic@11");
67
68         domain = dt_interrupt_at(node, 2, &val);
69         expect_int(val.ref->raw[0], 2);
70         expect_int(val.ref->raw[1], 2);
71         expect_str(dt_name(domain), "pic@11");
72
73         expect_null(dt_interrupt_at(node, 3, &val));
74     });
75
76     dt_begin_find_byname(&it, ctx->root, "dev@3");
77     node = (struct dtn*)it.matched;
78
79     testcase("intr-ext-multi", {
80         expect_notnull(node);
81
82         expect_int(node->intr.nr_intrs, 3);
83         expect_true(node->intr.extended);
84
85         domain = dt_interrupt_at(node, 0, &val);
86         expect_int(val.size / sizeof(int), 2);
87         expect_int(val.ref->raw[0], 3);
88         expect_int(val.ref->raw[1], 3);
89         expect_str(dt_name(domain), "pic@11");
90
91         domain = dt_interrupt_at(node, 1, &val);
92         expect_int(val.size / sizeof(int), 1);
93         expect_int(val.ref->raw[0], 1);
94         expect_str(dt_name(domain), "pic@22");
95
96         domain = dt_interrupt_at(node, 2, &val);
97         expect_int(val.size / sizeof(int), 4);
98         expect_int(val.ref->raw[0], 1);
99         expect_int(val.ref->raw[1], 2);
100         expect_int(val.ref->raw[2], 3);
101         expect_int(val.ref->raw[3], 4);
102         expect_str(dt_name(domain), "pic@33");
103
104         expect_null(dt_interrupt_at(node, 3, &val));
105     });
106 }