2 #include <testing/basic.h>
5 static inline struct dtn*
6 validate_node(struct dt_context* ctx,
7 const char* name, const char* compat)
10 struct dtn* node = ctx->root;
13 dt_begin_find_byname(&it, node, name);
15 node = (struct dtn*)it.matched;
18 expect_str(node->base.compat.str_val, compat);
19 expect_int(node->base.addr_c, 1);
20 expect_int(node->base.sz_c, 2);
26 testcase_rootfield(struct dt_context* ctx)
28 struct dtn* node = ctx->root;
30 begin_testcase("root");
32 expect_str(node->base.compat.str_val, "root");
33 expect_int(node->base.addr_c, 1);
34 expect_int(node->base.sz_c, 2);
40 testcase_child1(struct dt_context* ctx)
45 begin_testcase("trivial-props");
47 node = validate_node(ctx, "child@1", "child,simple-fields");
49 val = dt_getprop(&node->base, "field-str");
51 expect_str(val->str_val, "field");
53 val = dt_getprop(&node->base, "field-u32");
55 expect_int(dtp_u32(val), 32);
57 val = dt_getprop(&node->base, "field-u64");
59 expect_ulong(dtp_u64(val), (0xfUL << 32 | 0x1));
61 val = dt_getprop(&node->base, "field-strlst");
66 const char *expected[] = {"str1", "str2", "str3"};
67 dtprop_strlst_foreach(str, val) {
68 expect_str(str, expected[i]);
76 testcase_child2(struct dt_context* ctx)
80 struct dtprop_xval val;
83 begin_testcase("dtpx-reg");
85 node = validate_node(ctx, "child@2", "child,encoded-array");
87 dt_proplet reg = { dtprop_u32, dtprop_u64, dtprop_end };
89 dtpx_compile_proplet(reg);
90 dtpx_prepare_with(&propx, &node->reg, reg);
92 expect_true(dtpx_extract_at(&propx, &val, 0));
93 expect_int(val.u32, 0x12345);
95 expect_true(dtpx_extract_at(&propx, &val, 1));
96 expect_ulong(val.u64, (0x1UL << 32) | 0x2UL);
98 expect_false(dtpx_extract_at(&propx, &val, 2));
99 expect_false(dtpx_goto_row(&propx, 1));
104 begin_testcase("dtpx-mixed");
106 struct dtprop_xval xvals[5];
107 dt_proplet mixed_array = {
108 dtprop_handle, dtprop_u32, dtprop_u32, dtprop_u32, dtprop_u32,
112 prop = dt_getprop(&node->base, "mixed_array");
113 expect_notnull(prop);
115 dtpx_compile_proplet(mixed_array);
116 dtpx_prepare_with(&propx, prop, mixed_array);
118 expect_true(dtpx_extract_row(&propx, xvals, 5));
120 expect_notnull(xvals[0].phandle);
121 expect_str(morpher_name(dt_mobj(xvals[0].phandle)), "child@1");
122 expect_int(xvals[1].u32, 1);
123 expect_int(xvals[2].u32, 3);
124 expect_int(xvals[3].u32, 5);
125 expect_int(xvals[4].u32, 7);
127 expect_true(dtpx_next_row(&propx));
128 expect_true(dtpx_extract_row(&propx, xvals, 5));
130 expect_notnull(xvals[0].phandle);
131 expect_str(morpher_name(dt_mobj(xvals[0].phandle)), "child@3");
132 expect_int(xvals[1].u32, 2);
133 expect_int(xvals[2].u32, 4);
134 expect_int(xvals[3].u32, 6);
135 expect_int(xvals[4].u32, 8);
141 testcase_child3(struct dt_context* ctx)
144 struct dtpropx propx;
145 struct dtprop_xval val;
146 struct dtp_val* prop;
148 begin_testcase("simple-flags");
150 node = validate_node(ctx, "child@3", "child,flags");
152 expect_true(node->base.dma_coherent);
153 expect_true(node->base.intr_controll);
154 expect_int(node->base.status, STATUS_DISABLE);
160 run_test(int argc, const char* argv[])
164 printf("failed to load dtb\n");
168 struct dt_context* ctx;
169 ctx = dt_main_context();
171 testcase_rootfield(ctx);
172 testcase_child1(ctx);
173 testcase_child3(ctx);
174 testcase_child2(ctx);