1290001Sglebius#include "config.h"
2290001Sglebius#include "ntp_stdlib.h"
3290001Sglebius#include "sockaddrtest.h"
4290001Sglebius
5290001Sglebius#include "unity.h"
6290001Sglebius
7293896Sglebiusvoid setUp(void);
8290001Sglebiusextern void test_IPv4AddressOnly(void);
9290001Sglebiusextern void test_IPv4AddressWithPort(void);
10290001Sglebiusextern void test_IPv6AddressOnly(void);
11290001Sglebiusextern void test_IPv6AddressWithPort(void);
12290001Sglebiusextern void test_IllegalAddress(void);
13290001Sglebiusextern void test_IllegalCharInPort(void);
14290001Sglebius
15294905Sdelphij/*
16294905Sdelphij * NOTE: The IPv6 specific tests are reduced to stubs when IPv6 is
17294905Sdelphij * disabled.
18294905Sdelphij *
19294905Sdelphij * ISC_PLATFORM_HAVEIPV6 checks if system has IPV6 capabilies. WANTIPV6
20294905Sdelphij * ISC_PLATFORM_WANTIPV6 can be changed with build --disable-ipv6.
21294905Sdelphij *
22294905Sdelphij * If we want IPv6 but don't have it, the tests should fail, I think.
23294905Sdelphij */
24290001Sglebiusvoid
25293896SglebiussetUp(void)
26293896Sglebius{
27293896Sglebius	init_lib();
28293896Sglebius}
29293896Sglebius
30293896Sglebius
31293896Sglebiusvoid
32294905Sdelphijtest_IPv4AddressOnly(void)
33294905Sdelphij{
34290001Sglebius	const char *str = "192.0.2.1";
35290001Sglebius	sockaddr_u actual;
36290001Sglebius
37290001Sglebius	sockaddr_u expected;
38290001Sglebius	expected.sa4.sin_family = AF_INET;
39290001Sglebius	expected.sa4.sin_addr.s_addr = inet_addr("192.0.2.1");
40290001Sglebius	SET_PORT(&expected, NTP_PORT);
41290001Sglebius
42290001Sglebius	TEST_ASSERT_TRUE(decodenetnum(str, &actual));
43290001Sglebius	TEST_ASSERT_TRUE(IsEqual(expected, actual));
44290001Sglebius}
45290001Sglebius
46290001Sglebiusvoid
47294905Sdelphijtest_IPv4AddressWithPort(void)
48294905Sdelphij{
49290001Sglebius	const char *str = "192.0.2.2:2000";
50290001Sglebius	sockaddr_u actual;
51290001Sglebius
52290001Sglebius	sockaddr_u expected;
53290001Sglebius	expected.sa4.sin_family = AF_INET;
54290001Sglebius	expected.sa4.sin_addr.s_addr = inet_addr("192.0.2.2");
55290001Sglebius	SET_PORT(&expected, 2000);
56290001Sglebius
57290001Sglebius	TEST_ASSERT_TRUE(decodenetnum(str, &actual));
58290001Sglebius	TEST_ASSERT_TRUE(IsEqual(expected, actual));
59290001Sglebius}
60290001Sglebius
61290001Sglebius
62290001Sglebiusvoid
63294905Sdelphijtest_IPv6AddressOnly(void)
64294905Sdelphij{
65294905Sdelphij#ifdef ISC_PLATFORM_WANTIPV6
66290001Sglebius
67290001Sglebius	const struct in6_addr address = {
68290001Sglebius		0x20, 0x01, 0x0d, 0xb8,
69294905Sdelphij		0x85, 0xa3, 0x08, 0xd3,
70294905Sdelphij		0x13, 0x19, 0x8a, 0x2e,
71294905Sdelphij		0x03, 0x70, 0x73, 0x34
72290001Sglebius	};
73290001Sglebius
74290001Sglebius	const char *str = "2001:0db8:85a3:08d3:1319:8a2e:0370:7334";
75290001Sglebius	sockaddr_u actual;
76290001Sglebius
77290001Sglebius	sockaddr_u expected;
78290001Sglebius	expected.sa6.sin6_family = AF_INET6;
79290001Sglebius	expected.sa6.sin6_addr = address;
80290001Sglebius	SET_PORT(&expected, NTP_PORT);
81290001Sglebius
82290001Sglebius	TEST_ASSERT_TRUE(decodenetnum(str, &actual));
83290001Sglebius	TEST_ASSERT_TRUE(IsEqual(expected, actual));
84290001Sglebius
85290001Sglebius#else
86294905Sdelphij
87290001Sglebius	TEST_IGNORE_MESSAGE("IPV6 disabled in build, skipping.");
88294905Sdelphij
89290001Sglebius#endif /* ISC_PLATFORM_HAVEIPV6 */
90290001Sglebius}
91290001Sglebius
92290001Sglebius
93290001Sglebiusvoid
94294905Sdelphijtest_IPv6AddressWithPort(void)
95294905Sdelphij{
96290001Sglebius#ifdef ISC_PLATFORM_WANTIPV6
97290001Sglebius
98290001Sglebius	const struct in6_addr address = {
99290001Sglebius		0x20, 0x01, 0x0d, 0xb8,
100294905Sdelphij		0x85, 0xa3, 0x08, 0xd3,
101294905Sdelphij		0x13, 0x19, 0x8a, 0x2e,
102294905Sdelphij		0x03, 0x70, 0x73, 0x34
103290001Sglebius	};
104290001Sglebius
105290001Sglebius	const char *str = "[2001:0db8:85a3:08d3:1319:8a2e:0370:7334]:3000";
106290001Sglebius	sockaddr_u actual;
107290001Sglebius
108290001Sglebius	sockaddr_u expected;
109290001Sglebius	expected.sa6.sin6_family = AF_INET6;
110290001Sglebius	expected.sa6.sin6_addr = address;
111290001Sglebius	SET_PORT(&expected, 3000);
112290001Sglebius
113290001Sglebius	TEST_ASSERT_TRUE(decodenetnum(str, &actual));
114290001Sglebius	TEST_ASSERT_TRUE(IsEqual(expected, actual));
115290001Sglebius
116290001Sglebius#else
117294905Sdelphij
118290001Sglebius	TEST_IGNORE_MESSAGE("IPV6 disabled in build, skipping.");
119294905Sdelphij
120290001Sglebius#endif /* ISC_PLATFORM_HAVEIPV6 */
121290001Sglebius}
122290001Sglebius
123290001Sglebius
124290001Sglebiusvoid
125294905Sdelphijtest_IllegalAddress(void)
126294905Sdelphij{
127290001Sglebius	const char *str = "192.0.2.270:2000";
128290001Sglebius	sockaddr_u actual;
129290001Sglebius
130290001Sglebius	TEST_ASSERT_FALSE(decodenetnum(str, &actual));
131290001Sglebius}
132290001Sglebius
133294905Sdelphij
134290001Sglebiusvoid
135294905Sdelphijtest_IllegalCharInPort(void)
136294905Sdelphij{
137290001Sglebius	/* An illegal port does not make the decodenetnum fail, but instead
138290001Sglebius	 * makes it use the standard port.
139290001Sglebius	 */
140290001Sglebius	const char *str = "192.0.2.1:a700";
141290001Sglebius	sockaddr_u actual;
142290001Sglebius
143290001Sglebius	sockaddr_u expected;
144290001Sglebius	expected.sa4.sin_family = AF_INET;
145290001Sglebius	expected.sa4.sin_addr.s_addr = inet_addr("192.0.2.1");
146290001Sglebius	SET_PORT(&expected, NTP_PORT);
147290001Sglebius
148290001Sglebius	TEST_ASSERT_TRUE(decodenetnum(str, &actual));
149290001Sglebius	TEST_ASSERT_TRUE(IsEqual(expected, actual));
150290001Sglebius}
151