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