1290001Sglebius#include "config.h"
2290001Sglebius
3290001Sglebius#include "ntp_stdlib.h"
4290001Sglebius#include "ntp_calendar.h"
5290001Sglebius
6290001Sglebius#include "unity.h"
7290001Sglebius
8290001Sglebius#include "sockaddrtest.h"
9290001Sglebius
10290001Sglebius
11293896Sglebiusvoid setUp(void);
12290001Sglebiusvoid test_ClassBAddress(void);
13290001Sglebiusvoid test_ClassCAddress(void);
14290001Sglebiusvoid test_ClassAAddress(void);
15290001Sglebiusvoid test_IPv6Address(void);
16290001Sglebius
17290001Sglebius
18293896Sglebiusvoid
19293896SglebiussetUp(void)
20293896Sglebius{
21293896Sglebius	init_lib();
22290001Sglebius
23293896Sglebius	return;
24293896Sglebius}
25293896Sglebius
26293896Sglebius
27293896Sglebiusvoid
28293896Sglebiustest_ClassBAddress(void)
29293896Sglebius{
30290001Sglebius	sockaddr_u input = CreateSockaddr4("172.16.2.1", NTP_PORT);
31290001Sglebius	sockaddr_u expected = CreateSockaddr4("172.16.0.0", NTP_PORT);
32290001Sglebius
33290001Sglebius	sockaddr_u* actual = netof(&input);
34290001Sglebius
35290001Sglebius	TEST_ASSERT_TRUE(actual != NULL);
36290001Sglebius	TEST_ASSERT_TRUE(IsEqual(expected, *actual));
37293896Sglebius
38293896Sglebius	return;
39290001Sglebius}
40290001Sglebius
41293896Sglebiusvoid
42293896Sglebiustest_ClassCAddress(void)
43293896Sglebius{
44290001Sglebius	sockaddr_u input = CreateSockaddr4("192.0.2.255", NTP_PORT);
45290001Sglebius	sockaddr_u expected = CreateSockaddr4("192.0.2.0", NTP_PORT);
46290001Sglebius
47290001Sglebius	sockaddr_u* actual = netof(&input);
48290001Sglebius
49290001Sglebius	TEST_ASSERT_TRUE(actual != NULL);
50290001Sglebius	TEST_ASSERT_TRUE(IsEqual(expected, *actual));
51293896Sglebius
52293896Sglebius	return;
53290001Sglebius}
54290001Sglebius
55293896Sglebius
56293896Sglebiusvoid
57293896Sglebiustest_ClassAAddress(void)
58293896Sglebius{
59290001Sglebius	/* Class A addresses are assumed to be classless,
60290001Sglebius	 * thus the same address should be returned.
61290001Sglebius	 */
62290001Sglebius	sockaddr_u input = CreateSockaddr4("10.20.30.40", NTP_PORT);
63290001Sglebius	sockaddr_u expected = CreateSockaddr4("10.20.30.40", NTP_PORT);
64290001Sglebius
65290001Sglebius	sockaddr_u* actual = netof(&input);
66290001Sglebius
67290001Sglebius	TEST_ASSERT_TRUE(actual != NULL);
68290001Sglebius	TEST_ASSERT_TRUE(IsEqual(expected, *actual));
69293896Sglebius
70293896Sglebius	return;
71290001Sglebius}
72290001Sglebius
73293896Sglebiusvoid
74293896Sglebiustest_IPv6Address(void)
75293896Sglebius{
76290001Sglebius	/* IPv6 addresses are assumed to have 64-bit host- and 64-bit network parts. */
77293896Sglebius	const struct in6_addr input_address = { { {
78290001Sglebius		0x20, 0x01, 0x0d, 0xb8,
79293896Sglebius		0x85, 0xa3, 0x08, 0xd3,
80293896Sglebius		0x13, 0x19, 0x8a, 0x2e,
81293896Sglebius		0x03, 0x70, 0x73, 0x34
82293896Sglebius	} } }; // 2001:0db8:85a3:08d3:1319:8a2e:0370:7334
83290001Sglebius
84293896Sglebius	const struct in6_addr expected_address = { { {
85290001Sglebius		0x20, 0x01, 0x0d, 0xb8,
86293896Sglebius		0x85, 0xa3, 0x08, 0xd3,
87293896Sglebius		0x00, 0x00, 0x00, 0x00,
88293896Sglebius		0x00, 0x00, 0x00, 0x00
89293896Sglebius	} } }; // 2001:0db8:85a3:08d3:0000:0000:0000:0000
90293896Sglebius
91290001Sglebius	sockaddr_u input;
92290001Sglebius	input.sa6.sin6_family = AF_INET6;
93290001Sglebius	input.sa6.sin6_addr = input_address;
94290001Sglebius	SET_PORT(&input, 3000);
95290001Sglebius
96290001Sglebius	sockaddr_u expected;
97290001Sglebius	expected.sa6.sin6_family = AF_INET6;
98290001Sglebius	expected.sa6.sin6_addr = expected_address;
99290001Sglebius	SET_PORT(&expected, 3000);
100290001Sglebius
101290001Sglebius	sockaddr_u* actual = netof(&input);
102290001Sglebius
103290001Sglebius	TEST_ASSERT_TRUE(actual != NULL);
104290001Sglebius	TEST_ASSERT_TRUE(IsEqual(expected, *actual));
105293896Sglebius
106293896Sglebius	return;
107290001Sglebius}
108