1/*	$NetBSD: netof.c,v 1.3 2022/10/09 21:41:04 christos Exp $	*/
2
3#include "config.h"
4
5#include "ntp_stdlib.h"
6#include "ntp_calendar.h"
7
8#include "unity.h"
9
10#include "sockaddrtest.h"
11
12
13void setUp(void);
14void test_ClassBAddress(void);
15void test_ClassCAddress(void);
16void test_ClassAAddress(void);
17void test_IPv6Address(void);
18
19
20void
21setUp(void)
22{
23	init_lib();
24
25	return;
26}
27
28
29void
30test_ClassBAddress(void)
31{
32	sockaddr_u input = CreateSockaddr4("172.16.2.1", NTP_PORT);
33	sockaddr_u expected = CreateSockaddr4("172.16.0.0", NTP_PORT);
34
35	sockaddr_u* actual = netof(&input);
36
37	TEST_ASSERT_TRUE(actual != NULL);
38	TEST_ASSERT_TRUE(IsEqual(expected, *actual));
39
40	return;
41}
42
43void
44test_ClassCAddress(void)
45{
46	sockaddr_u input = CreateSockaddr4("192.0.2.255", NTP_PORT);
47	sockaddr_u expected = CreateSockaddr4("192.0.2.0", NTP_PORT);
48
49	sockaddr_u* actual = netof(&input);
50
51	TEST_ASSERT_TRUE(actual != NULL);
52	TEST_ASSERT_TRUE(IsEqual(expected, *actual));
53
54	return;
55}
56
57
58void
59test_ClassAAddress(void)
60{
61	/* Class A addresses are assumed to be classless,
62	 * thus the same address should be returned.
63	 */
64	sockaddr_u input = CreateSockaddr4("10.20.30.40", NTP_PORT);
65	sockaddr_u expected = CreateSockaddr4("10.20.30.40", NTP_PORT);
66
67	sockaddr_u* actual = netof(&input);
68
69	TEST_ASSERT_TRUE(actual != NULL);
70	TEST_ASSERT_TRUE(IsEqual(expected, *actual));
71
72	return;
73}
74
75void
76test_IPv6Address(void)
77{
78	/* IPv6 addresses are assumed to have 64-bit host- and 64-bit network parts. */
79	const struct in6_addr input_address = { { {
80		0x20, 0x01, 0x0d, 0xb8,
81		0x85, 0xa3, 0x08, 0xd3,
82		0x13, 0x19, 0x8a, 0x2e,
83		0x03, 0x70, 0x73, 0x34
84	} } }; // 2001:0db8:85a3:08d3:1319:8a2e:0370:7334
85
86	const struct in6_addr expected_address = { { {
87		0x20, 0x01, 0x0d, 0xb8,
88		0x85, 0xa3, 0x08, 0xd3,
89		0x00, 0x00, 0x00, 0x00,
90		0x00, 0x00, 0x00, 0x00
91	} } }; // 2001:0db8:85a3:08d3:0000:0000:0000:0000
92
93	sockaddr_u input;
94	memset(&input, 0, sizeof(input));
95	input.sa6.sin6_family = AF_INET6;
96	input.sa6.sin6_addr = input_address;
97	SET_PORT(&input, 3000);
98
99	sockaddr_u expected;
100	memset(&expected, 0, sizeof(expected));
101	expected.sa6.sin6_family = AF_INET6;
102	expected.sa6.sin6_addr = expected_address;
103	SET_PORT(&expected, 3000);
104
105	sockaddr_u* actual = netof(&input);
106
107	TEST_ASSERT_TRUE(actual != NULL);
108	TEST_ASSERT_TRUE(IsEqual(expected, *actual));
109
110	return;
111}
112