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