1 #include <check.h>
2 #include <errno.h>
3 #include <stdlib.h>
4
5 #include "common.c"
6 #include "log.c"
7 #include "impersonator.c"
8 #include "types/address.c"
9
10 static void
test_range4(uint32_t min,uint32_t max,bool valid)11 test_range4(uint32_t min, uint32_t max, bool valid)
12 {
13 struct ipv4_range range = {
14 .min.s_addr = htonl(min),
15 .max.s_addr = htonl(max),
16 };
17 ck_assert_int_eq(valid ? 0 : -EINVAL, check_encoding4(&range));
18 }
19
START_TEST(check_encoding4_test)20 START_TEST(check_encoding4_test)
21 {
22 test_range4(0x00000000, 0x00000000, false);
23 test_range4(0x12345678, 0x12345678, false);
24 test_range4(0xFFFFFFFF, 0xFFFFFFFF, false);
25 test_range4(0x00000000, 0xFFFFFFFF, false);
26 test_range4(0x00000000, 0x00000001, false);
27 test_range4(0x11000000, 0x11001000, true);
28 test_range4(0x11000000, 0x1100FFFF, false);
29 test_range4(0x11000000, 0x1100F1FF, true);
30
31 }
32 END_TEST
33
34 static void
test_range6(uint32_t a1a,uint32_t a1b,uint32_t a1c,uint32_t a1d,uint32_t a2a,uint32_t a2b,uint32_t a2c,uint32_t a2d,bool valid)35 test_range6(uint32_t a1a, uint32_t a1b, uint32_t a1c, uint32_t a1d,
36 uint32_t a2a, uint32_t a2b, uint32_t a2c, uint32_t a2d,
37 bool valid)
38 {
39 struct ipv6_range range;
40
41 addr6_set_quadrant(&range.min, 0, a1a);
42 addr6_set_quadrant(&range.min, 1, a1b);
43 addr6_set_quadrant(&range.min, 2, a1c);
44 addr6_set_quadrant(&range.min, 3, a1d);
45 addr6_set_quadrant(&range.max, 0, a2a);
46 addr6_set_quadrant(&range.max, 1, a2b);
47 addr6_set_quadrant(&range.max, 2, a2c);
48 addr6_set_quadrant(&range.max, 3, a2d);
49
50 ck_assert_int_eq(valid ? 0 : -EINVAL, check_encoding6(&range));
51 }
52
START_TEST(check_encoding6_test)53 START_TEST(check_encoding6_test)
54 {
55 test_range6(0x00000000, 0x00000000, 0x00000000, 0x00000000,
56 0x00000000, 0x00000000, 0x00000000, 0x00000000,
57 false);
58 test_range6(0x12345678, 0x12345678, 0x12345678, 0x12345678,
59 0x12345678, 0x12345678, 0x12345678, 0x12345678,
60 false);
61 test_range6(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
62 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
63 false);
64
65 test_range6(0x00000000, 0x00000000, 0x00000000, 0x00000000,
66 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
67 false);
68 test_range6(0x00000000, 0x00000000, 0x00000000, 0x00000000,
69 0x00000000, 0x00000000, 0x00000000, 0x00000001,
70 false);
71
72 /* Matching most significant bits stop on the first quadrant */
73 test_range6(0x00001000, 0x00000000, 0x00000000, 0x00000000,
74 0x00001FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
75 false);
76
77 test_range6(0x00001010, 0x00000000, 0x00000000, 0x00000000,
78 0x00001FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
79 true);
80 test_range6(0x00001000, 0x00001000, 0x00000000, 0x00000000,
81 0x00001FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
82 true);
83 test_range6(0x00001000, 0x00000000, 0x00001000, 0x00000000,
84 0x00001FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
85 true);
86 test_range6(0x00001000, 0x00000000, 0x00000000, 0x00001000,
87 0x00001FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
88 true);
89
90 test_range6(0x00001000, 0x00000000, 0x00000000, 0x00000000,
91 0x00001F0F, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
92 true);
93 test_range6(0x00001000, 0x00000000, 0x00000000, 0x00000000,
94 0x00001FFF, 0xFF0FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
95 true);
96 test_range6(0x00001000, 0x00000000, 0x00000000, 0x00000000,
97 0x00001FFF, 0xFFFFFFFF, 0xFFFFF0FF, 0xFFFFFFFF,
98 true);
99 test_range6(0x00001000, 0x00000000, 0x00000000, 0x00000000,
100 0x00001FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFF0FF,
101 true);
102
103 /* Matching most significant bits stop on the second quadrant */
104 test_range6(0x00001000, 0x00001000, 0x00000000, 0x00000000,
105 0x00001000, 0x00001FFF, 0xFFFFFFFF, 0xFFFFFFFF,
106 false);
107
108 test_range6(0x00001000, 0x00001010, 0x00000000, 0x00000000,
109 0x00001000, 0x00001FFF, 0xFFFFFFFF, 0xFFFFFFFF,
110 true);
111 test_range6(0x00001000, 0x00001000, 0x00001000, 0x00000000,
112 0x00001000, 0x00001FFF, 0xFFFFFFFF, 0xFFFFFFFF,
113 true);
114 test_range6(0x00001000, 0x00001000, 0x00000000, 0x00001000,
115 0x00001000, 0x00001FFF, 0xFFFFFFFF, 0xFFFFFFFF,
116 true);
117
118 test_range6(0x00001000, 0x00001000, 0x00000000, 0x00000000,
119 0x00001000, 0x00001F0F, 0xFFFFFFFF, 0xFFFFFFFF,
120 true);
121 test_range6(0x00001000, 0x00001000, 0x00000000, 0x00000000,
122 0x00001000, 0x00001FFF, 0xFFFFF0FF, 0xFFFFFFFF,
123 true);
124 test_range6(0x00001000, 0x00001000, 0x00000000, 0x00000000,
125 0x00001000, 0x00001FFF, 0xFFFFFFFF, 0xFFFFF0FF,
126 true);
127
128 /* Matching most significant bits stop on the third quadrant */
129 test_range6(0x00001000, 0x00001000, 0x00001000, 0x00000000,
130 0x00001000, 0x00001000, 0x00001FFF, 0xFFFFFFFF,
131 false);
132
133 test_range6(0x00001000, 0x00001000, 0x00001010, 0x00000000,
134 0x00001000, 0x00001000, 0x00001FFF, 0xFFFFFFFF,
135 true);
136 test_range6(0x00001000, 0x00001000, 0x00001000, 0x00001000,
137 0x00001000, 0x00001000, 0x00001FFF, 0xFFFFFFFF,
138 true);
139
140 test_range6(0x00001000, 0x00001000, 0x00001000, 0x00000000,
141 0x00001000, 0x00001000, 0x00001F0F, 0xFFFFFFFF,
142 true);
143 test_range6(0x00001000, 0x00001000, 0x00001000, 0x00000000,
144 0x00001000, 0x00001000, 0x00001FFF, 0xFFFFF0FF,
145 true);
146
147 /* Matching most significant bits stop on the fourth quadrant */
148 test_range6(0x00001000, 0x00001000, 0x00001000, 0x00001000,
149 0x00001000, 0x00001000, 0x00001000, 0x00001FFF,
150 false);
151
152 test_range6(0x00001000, 0x00001000, 0x00001000, 0x00001010,
153 0x00001000, 0x00001000, 0x00001000, 0x00001FFF,
154 true);
155
156 test_range6(0x00001000, 0x00001000, 0x00001000, 0x00001000,
157 0x00001000, 0x00001000, 0x00001000, 0x00001F0F,
158 true);
159 }
160 END_TEST
161
address_load_suite(void)162 Suite *address_load_suite(void)
163 {
164 Suite *suite;
165 TCase *core;
166
167 core = tcase_create("Core");
168 tcase_add_test(core, check_encoding4_test);
169 tcase_add_test(core, check_encoding6_test);
170
171 suite = suite_create("Encoding checking");
172 suite_add_tcase(suite, core);
173 return suite;
174 }
175
main(void)176 int main(void)
177 {
178 Suite *suite;
179 SRunner *runner;
180 int tests_failed;
181
182 suite = address_load_suite();
183
184 runner = srunner_create(suite);
185 srunner_run_all(runner, CK_NORMAL);
186 tests_failed = srunner_ntests_failed(runner);
187 srunner_free(runner);
188
189 return (tests_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
190 }
191