xref: /netbsd-src/external/bsd/ntp/dist/tests/libntp/decodenetnum.c (revision ccd9df534e375a4366c5b55f23782053c7a98d82)
1 /*	$NetBSD: decodenetnum.c,v 1.3 2022/10/09 21:41:04 christos Exp $	*/
2 
3 #include "config.h"
4 #include "ntp_stdlib.h"
5 #include "sockaddrtest.h"
6 
7 #include "unity.h"
8 
9 void setUp(void);
10 extern void test_IPv4AddressOnly(void);
11 extern void test_IPv4AddressWithPort(void);
12 extern void test_IPv6AddressOnly(void);
13 extern void test_IPv6AddressWithPort(void);
14 extern void test_IPv6AddressWithScope(void);
15 extern void test_IPv6AddressWithPortAndScope(void);
16 extern void test_IllegalAddress(void);
17 extern void test_IllegalCharInPort(void);
18 extern void test_NameBufOverflow(void);
19 
20 /*
21  * NOTE: The IPv6 specific tests are reduced to stubs when IPv6 is
22  * disabled.
23  *
24  * ISC_PLATFORM_HAVEIPV6 checks if system has IPV6 capabilies. WANTIPV6
25  * ISC_PLATFORM_WANTIPV6 can be changed with build --disable-ipv6.
26  *
27  * If we want IPv6 but don't have it, the tests should fail, I think.
28  */
29 void
30 setUp(void)
31 {
32 	init_lib();
33 }
34 
35 
36 void
37 test_IPv4AddressOnly(void)
38 {
39 	const char *str = "192.0.2.1";
40 	sockaddr_u actual;
41 
42 	sockaddr_u expected;
43 	memset(&expected, 0, sizeof(expected));
44 	expected.sa4.sin_family = AF_INET;
45 	expected.sa4.sin_addr.s_addr = inet_addr("192.0.2.1");
46 	SET_PORT(&expected, NTP_PORT);
47 
48 	TEST_ASSERT_TRUE(decodenetnum(str, &actual));
49 	TEST_ASSERT_TRUE(IsEqual(expected, actual));
50 }
51 
52 void
53 test_IPv4AddressWithPort(void)
54 {
55 	const char *str = "192.0.2.2:2000";
56 	sockaddr_u actual;
57 
58 	sockaddr_u expected;
59 	memset(&expected, 0, sizeof(expected));
60 	expected.sa4.sin_family = AF_INET;
61 	expected.sa4.sin_addr.s_addr = inet_addr("192.0.2.2");
62 	SET_PORT(&expected, 2000);
63 
64 	TEST_ASSERT_TRUE(decodenetnum(str, &actual));
65 	TEST_ASSERT_TRUE(IsEqual(expected, actual));
66 }
67 
68 
69 void
70 test_IPv6AddressOnly(void)
71 {
72 #if defined(ISC_PLATFORM_HAVEIPV6) && defined(WANT_IPV6)
73 
74 	const struct in6_addr address = {
75 		0x20, 0x01, 0x0d, 0xb8,
76 		0x85, 0xa3, 0x08, 0xd3,
77 		0x13, 0x19, 0x8a, 0x2e,
78 		0x03, 0x70, 0x73, 0x34
79 	};
80 
81 	const char *str1 = "2001:0db8:85a3:08d3:1319:8a2e:0370:7334";
82 	const char *str2 = "[2001:0db8:85a3:08d3:1319:8a2e:0370:7334]";
83 	sockaddr_u actual;
84 
85 	sockaddr_u expected;
86 	memset(&expected, 0, sizeof(expected));
87 	expected.sa6.sin6_family = AF_INET6;
88 	expected.sa6.sin6_addr = address;
89 	SET_PORT(&expected, NTP_PORT);
90 
91 	TEST_ASSERT_TRUE(decodenetnum(str1, &actual));
92 	TEST_ASSERT_TRUE(IsEqual(expected, actual));
93 
94 	TEST_ASSERT_TRUE(decodenetnum(str2, &actual));
95 	TEST_ASSERT_TRUE(IsEqual(expected, actual));
96 
97 #else
98 
99 	TEST_IGNORE_MESSAGE("IPV6 disabled in build");
100 
101 #endif
102 }
103 
104 
105 void
106 test_IPv6AddressWithPort(void)
107 {
108 #if defined(ISC_PLATFORM_HAVEIPV6) && defined(WANT_IPV6)
109 
110 	const struct in6_addr address = {
111 		0x20, 0x01, 0x0d, 0xb8,
112 		0x85, 0xa3, 0x08, 0xd3,
113 		0x13, 0x19, 0x8a, 0x2e,
114 		0x03, 0x70, 0x73, 0x34
115 	};
116 
117 	const char *str = "[2001:0db8:85a3:08d3:1319:8a2e:0370:7334]:3000";
118 	sockaddr_u actual;
119 
120 	sockaddr_u expected;
121 	memset(&expected, 0, sizeof(expected));
122 	expected.sa6.sin6_family = AF_INET6;
123 	expected.sa6.sin6_addr = address;
124 	SET_PORT(&expected, 3000);
125 
126 	TEST_ASSERT_TRUE(decodenetnum(str, &actual));
127 	TEST_ASSERT_TRUE(IsEqual(expected, actual));
128 
129 #else
130 
131 	TEST_IGNORE_MESSAGE("IPV6 disabled in build");
132 
133 #endif
134 }
135 
136 void test_IPv6AddressWithScope(void)
137 {
138 #if defined(ISC_PLATFORM_HAVEIPV6) && defined(WANT_IPV6)
139 
140 	const struct in6_addr address = {
141 		0x20, 0x01, 0x0d, 0xb8,
142 		0x85, 0xa3, 0x08, 0xd3,
143 		0x13, 0x19, 0x8a, 0x2e,
144 		0x03, 0x70, 0x73, 0x34
145 	};
146 
147 	const char *str1 = "2001:0db8:85a3:08d3:1319:8a2e:0370:7334%42";
148 	const char *str2 = "[2001:0db8:85a3:08d3:1319:8a2e:0370:7334%42]";
149 	sockaddr_u actual;
150 
151 	sockaddr_u expected;
152 	memset(&expected, 0, sizeof(expected));
153 	expected.sa6.sin6_family = AF_INET6;
154 	expected.sa6.sin6_addr = address;
155 	expected.sa6.sin6_scope_id = 42;
156 	SET_PORT(&expected, NTP_PORT);
157 
158 	TEST_ASSERT_TRUE(decodenetnum(str1, &actual));
159 	TEST_ASSERT_TRUE(IsEqual(expected, actual));
160 
161 	TEST_ASSERT_TRUE(decodenetnum(str2, &actual));
162 	TEST_ASSERT_TRUE(IsEqual(expected, actual));
163 
164 #else
165 
166 	TEST_IGNORE_MESSAGE("IPV6 disabled in build");
167 
168 #endif
169 }
170 
171 void test_IPv6AddressWithPortAndScope(void)
172 {
173 #if defined(ISC_PLATFORM_HAVEIPV6) && defined(WANT_IPV6)
174 
175 	const struct in6_addr address = {
176 		0x20, 0x01, 0x0d, 0xb8,
177 		0x85, 0xa3, 0x08, 0xd3,
178 		0x13, 0x19, 0x8a, 0x2e,
179 		0x03, 0x70, 0x73, 0x34
180 	};
181 
182 	const char *str = "[2001:0db8:85a3:08d3:1319:8a2e:0370:7334%42]:3000";
183 	sockaddr_u actual;
184 
185 	sockaddr_u expected;
186 	memset(&expected, 0, sizeof(expected));
187 	expected.sa6.sin6_family = AF_INET6;
188 	expected.sa6.sin6_addr = address;
189 	expected.sa6.sin6_scope_id = 42;
190 	SET_PORT(&expected, 3000);
191 
192 	TEST_ASSERT_TRUE(decodenetnum(str, &actual));
193 	TEST_ASSERT_TRUE(IsEqual(expected, actual));
194 
195 #else
196 
197 	TEST_IGNORE_MESSAGE("IPV6 disabled in build");
198 
199 #endif
200 }
201 
202 void
203 test_IllegalAddress(void)
204 {
205 	const char *str = "192.0.2.270:2000";
206 	sockaddr_u actual;
207 
208 	TEST_ASSERT_FALSE(decodenetnum(str, &actual));
209 }
210 
211 
212 void
213 test_IllegalCharInPort(void)
214 {
215 	/* An illegal port does not make the decodenetnum fail, but instead
216 	 * makes it use the standard port.
217 	 */
218 	const char *str = "192.0.2.1:a700";
219 	sockaddr_u actual;
220 
221 	sockaddr_u expected;
222 	memset(&expected, 0, sizeof(expected));
223 	expected.sa4.sin_family = AF_INET;
224 	expected.sa4.sin_addr.s_addr = inet_addr("192.0.2.1");
225 	SET_PORT(&expected, NTP_PORT);
226 
227 	TEST_ASSERT_TRUE(decodenetnum(str, &actual));
228 	TEST_ASSERT_TRUE(IsEqual(expected, actual));
229 }
230 
231 void
232 test_NameBufOverflow(void)
233 {
234 	const char *str =
235 	    "loremipsumloremipsumloremipsumloremipsumloremipsum"
236 	    "loremipsumloremipsumloremipsumloremipsum";
237 
238 	sockaddr_u actual;
239 	TEST_ASSERT_FALSE(decodenetnum(str, &actual));
240 }
241