1#include <base/system.h>
2
3#include <gtest/gtest.h>
4
5TEST(NetAddr, FromUrlStringInvalid)
6{
7 NETADDR Addr;
8
9 EXPECT_EQ(net_addr_from_url(&Addr, "tw-0.6+udp://127.0", nullptr, 0), -1); // invalid ip
10 EXPECT_EQ(net_addr_from_url(&Addr, "tw-0.6+udp://ddnet.org", nullptr, 0), -1); // invalid ip
11 EXPECT_EQ(net_addr_from_url(&Addr, "127.0.0.1", nullptr, 0), 1); // not a URL
12 EXPECT_EQ(net_addr_from_url(&Addr, "tw-0.9+udp://127.0.0.1", nullptr, 0), 1); // invalid tw protocol
13 EXPECT_EQ(net_addr_from_url(&Addr, "tw-0.6+tcp://127.0.0.1", nullptr, 0), 1); // invalid internet protocol
14}
15
16TEST(NetAddr, FromUrlStringValid)
17{
18 NETADDR Addr;
19 char aBuf1[NETADDR_MAXSTRSIZE];
20 char aBuf2[NETADDR_MAXSTRSIZE];
21
22 EXPECT_EQ(net_addr_from_url(&Addr, "tw-0.7+udp://127.0.0.1", nullptr, 0), 0);
23 net_addr_str(addr: &Addr, string: aBuf1, max_length: sizeof(aBuf1), add_port: true);
24 net_addr_str(addr: &Addr, string: aBuf2, max_length: sizeof(aBuf2), add_port: false);
25 EXPECT_STREQ(aBuf1, "127.0.0.1:0");
26 EXPECT_STREQ(aBuf2, "127.0.0.1");
27
28 EXPECT_EQ(net_addr_from_url(&Addr, "tw-0.6+udp://127.0.0.1", nullptr, 0), 0);
29 net_addr_str(addr: &Addr, string: aBuf1, max_length: sizeof(aBuf1), add_port: true);
30 net_addr_str(addr: &Addr, string: aBuf2, max_length: sizeof(aBuf2), add_port: false);
31 EXPECT_STREQ(aBuf1, "127.0.0.1:0");
32 EXPECT_STREQ(aBuf2, "127.0.0.1");
33
34 EXPECT_EQ(net_addr_from_url(&Addr, "tw-0.6+udp://127.0.0.1", nullptr, 0), 0);
35 net_addr_str(addr: &Addr, string: aBuf1, max_length: sizeof(aBuf1), add_port: true);
36 net_addr_str(addr: &Addr, string: aBuf2, max_length: sizeof(aBuf2), add_port: false);
37 EXPECT_STREQ(aBuf1, "127.0.0.1:0");
38 EXPECT_STREQ(aBuf2, "127.0.0.1");
39
40 EXPECT_EQ(net_addr_from_url(&Addr, "tw-0.6+udp://[0123:4567:89ab:cdef:1:2:3:4]:5678", nullptr, 0), 0);
41 net_addr_str(addr: &Addr, string: aBuf1, max_length: sizeof(aBuf1), add_port: true);
42 net_addr_str(addr: &Addr, string: aBuf2, max_length: sizeof(aBuf2), add_port: false);
43 EXPECT_STREQ(aBuf1, "[123:4567:89ab:cdef:1:2:3:4]:5678");
44 EXPECT_STREQ(aBuf2, "[123:4567:89ab:cdef:1:2:3:4]");
45
46 char aHost[128];
47 EXPECT_EQ(net_addr_from_url(&Addr, "tw-0.6+udp://ger10.ddnet.org:5678", aHost, sizeof(aHost)), -1);
48 EXPECT_STREQ(aHost, "ger10.ddnet.org:5678");
49}
50
51TEST(NetAddr, FromStr)
52{
53 NETADDR Addr;
54 char aBuf1[NETADDR_MAXSTRSIZE];
55 char aBuf2[NETADDR_MAXSTRSIZE];
56
57 EXPECT_FALSE(net_addr_from_str(&Addr, "127.0.0.1"));
58 net_addr_str(addr: &Addr, string: aBuf1, max_length: sizeof(aBuf1), add_port: true);
59 net_addr_str(addr: &Addr, string: aBuf2, max_length: sizeof(aBuf2), add_port: false);
60 EXPECT_STREQ(aBuf1, "127.0.0.1:0");
61 EXPECT_STREQ(aBuf2, "127.0.0.1");
62
63 EXPECT_FALSE(net_addr_from_str(&Addr, "1.2.3.4:5678"));
64 net_addr_str(addr: &Addr, string: aBuf1, max_length: sizeof(aBuf1), add_port: true);
65 net_addr_str(addr: &Addr, string: aBuf2, max_length: sizeof(aBuf2), add_port: false);
66 EXPECT_STREQ(aBuf1, "1.2.3.4:5678");
67 EXPECT_STREQ(aBuf2, "1.2.3.4");
68
69 EXPECT_FALSE(net_addr_from_str(&Addr, "[::1]"));
70 net_addr_str(addr: &Addr, string: aBuf1, max_length: sizeof(aBuf1), add_port: true);
71 net_addr_str(addr: &Addr, string: aBuf2, max_length: sizeof(aBuf2), add_port: false);
72 EXPECT_STREQ(aBuf1, "[::1]:0");
73 EXPECT_STREQ(aBuf2, "[::1]");
74
75 EXPECT_FALSE(net_addr_from_str(&Addr, "[0123:4567:89ab:cdef:1:2:3:4]:5678"));
76 net_addr_str(addr: &Addr, string: aBuf1, max_length: sizeof(aBuf1), add_port: true);
77 net_addr_str(addr: &Addr, string: aBuf2, max_length: sizeof(aBuf2), add_port: false);
78 EXPECT_STREQ(aBuf1, "[123:4567:89ab:cdef:1:2:3:4]:5678");
79 EXPECT_STREQ(aBuf2, "[123:4567:89ab:cdef:1:2:3:4]");
80}
81
82TEST(NetAddr, StrV6)
83{
84 NETADDR Addr;
85 char aBuf1[NETADDR_MAXSTRSIZE];
86 char aBuf2[NETADDR_MAXSTRSIZE];
87
88 // Test vectors from RFC 5952 section 4:
89 // https://tools.ietf.org/html/rfc5952#section-4
90 // 4.1 Handling Leading Zeros in a 16-Bit Field
91 EXPECT_FALSE(net_addr_from_str(&Addr, "[2001:0db8::0001]:1"));
92 net_addr_str(addr: &Addr, string: aBuf1, max_length: sizeof(aBuf1), add_port: true);
93 net_addr_str(addr: &Addr, string: aBuf2, max_length: sizeof(aBuf2), add_port: false);
94 EXPECT_STREQ(aBuf1, "[2001:db8::1]:1");
95 EXPECT_STREQ(aBuf2, "[2001:db8::1]");
96
97 // 4.2.1 Shorten as Much as Possible
98 EXPECT_FALSE(net_addr_from_str(&Addr, "[2001:db8:0:0:0:0:2:1]"));
99 net_addr_str(addr: &Addr, string: aBuf1, max_length: sizeof(aBuf1), add_port: true);
100 net_addr_str(addr: &Addr, string: aBuf2, max_length: sizeof(aBuf2), add_port: false);
101 EXPECT_STREQ(aBuf1, "[2001:db8::2:1]:0");
102 EXPECT_STREQ(aBuf2, "[2001:db8::2:1]");
103
104 EXPECT_FALSE(net_addr_from_str(&Addr, "[2001:db8::0:1]"));
105 net_addr_str(addr: &Addr, string: aBuf2, max_length: sizeof(aBuf2), add_port: false);
106 EXPECT_STREQ(aBuf2, "[2001:db8::1]");
107
108 // 4.2.2 Handling One 16-Bit 0 Field
109 EXPECT_FALSE(net_addr_from_str(&Addr, "[2001:db8::1:1:1:1:1]"));
110 net_addr_str(addr: &Addr, string: aBuf2, max_length: sizeof(aBuf2), add_port: false);
111 EXPECT_STREQ(aBuf2, "[2001:db8:0:1:1:1:1:1]");
112
113 // 4.2.3 Choice in Placement of "::"
114 EXPECT_FALSE(net_addr_from_str(&Addr, "[2001:0:0:1:0:0:0:1]"));
115 net_addr_str(addr: &Addr, string: aBuf2, max_length: sizeof(aBuf2), add_port: false);
116 EXPECT_STREQ(aBuf2, "[2001:0:0:1::1]");
117
118 EXPECT_FALSE(net_addr_from_str(&Addr, "[2001:db8:0:0:1:0:0:1]"));
119 net_addr_str(addr: &Addr, string: aBuf2, max_length: sizeof(aBuf2), add_port: false);
120 EXPECT_STREQ(aBuf2, "[2001:db8::1:0:0:1]");
121}
122
123TEST(NetAddr, FromStrInvalid)
124{
125 NETADDR Addr;
126 EXPECT_TRUE(net_addr_from_str(&Addr, "127.0.0."));
127 EXPECT_TRUE(net_addr_from_str(&Addr, "127.0.0.1a"));
128 EXPECT_TRUE(net_addr_from_str(&Addr, "1.1"));
129 EXPECT_TRUE(net_addr_from_str(&Addr, "[::1"));
130 EXPECT_TRUE(net_addr_from_str(&Addr, "[::"));
131 EXPECT_TRUE(net_addr_from_str(&Addr, "127.0.0.1:"));
132 EXPECT_TRUE(net_addr_from_str(&Addr, "[::]:"));
133 EXPECT_TRUE(net_addr_from_str(&Addr, "127.0.0.1:1a"));
134 EXPECT_TRUE(net_addr_from_str(&Addr, "[::]:c"));
135}
136
137TEST(NetAddrDeathTest, StrInvalid1)
138{
139 ASSERT_DEATH({
140 NETADDR Addr = {0};
141 char aBuf[NETADDR_MAXSTRSIZE];
142 net_addr_str(&Addr, aBuf, sizeof(aBuf), true); }, "");
143}
144
145TEST(NetAddrDeathTest, StrInvalid2)
146{
147 ASSERT_DEATH({
148 NETADDR Addr = {0};
149 char aBuf[NETADDR_MAXSTRSIZE];
150 net_addr_str(&Addr, aBuf, sizeof(aBuf), false); }, "");
151}
152
153TEST(NetAddr, IsLocal)
154{
155 NETADDR Addr;
156 net_addr_from_str(addr: &Addr, string: "127.0.0.1");
157 EXPECT_TRUE(net_addr_is_local(&Addr));
158
159 net_addr_from_str(addr: &Addr, string: "[::1]");
160 EXPECT_TRUE(net_addr_is_local(&Addr));
161
162 net_addr_from_str(addr: &Addr, string: "192.168.1.1");
163 EXPECT_TRUE(net_addr_is_local(&Addr));
164
165 net_addr_from_str(addr: &Addr, string: "10.0.0.1");
166 EXPECT_TRUE(net_addr_is_local(&Addr));
167
168 net_addr_from_str(addr: &Addr, string: "8.8.8.8");
169 EXPECT_FALSE(net_addr_is_local(&Addr));
170
171 net_addr_from_str(addr: &Addr, string: "[2001:db8::1]");
172 EXPECT_FALSE(net_addr_is_local(&Addr));
173}
174