blob: b7a2d92d31a92dfae9efefa6a8c74cb5ca8246e8 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#if defined(WEBRTC_POSIX)
12#include <netinet/in.h> // for sockaddr_in
13#endif
14
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "rtc_base/gunit.h"
16#include "rtc_base/ipaddress.h"
17#include "rtc_base/socketaddress.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000018
19namespace rtc {
20
Yves Gerey665174f2018-06-19 15:03:05 +020021const in6_addr kTestV6Addr = {
22 {{0x20, 0x01, 0x0d, 0xb8, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80,
23 0x90, 0xA0, 0xB0, 0xC0}}};
24const in6_addr kMappedV4Addr = {
25 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
26 0x01, 0x02, 0x03, 0x04}}};
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000027const std::string kTestV6AddrString = "2001:db8:1020:3040:5060:7080:90a0:b0c0";
henrikgac921d72015-12-14 02:07:03 -080028const std::string kTestV6AddrAnonymizedString = "2001:db8:1020:x:x:x:x:x";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000029const std::string kTestV6AddrFullString =
30 "[2001:db8:1020:3040:5060:7080:90a0:b0c0]:5678";
henrikgac921d72015-12-14 02:07:03 -080031const std::string kTestV6AddrFullAnonymizedString =
32 "[2001:db8:1020:x:x:x:x:x]:5678";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000033
34TEST(SocketAddressTest, TestDefaultCtor) {
35 SocketAddress addr;
36 EXPECT_FALSE(addr.IsUnresolvedIP());
37 EXPECT_EQ(IPAddress(), addr.ipaddr());
38 EXPECT_EQ(0, addr.port());
39 EXPECT_EQ("", addr.hostname());
40}
41
42TEST(SocketAddressTest, TestIPPortCtor) {
43 SocketAddress addr(IPAddress(0x01020304), 5678);
44 EXPECT_FALSE(addr.IsUnresolvedIP());
45 EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
46 EXPECT_EQ(5678, addr.port());
47 EXPECT_EQ("", addr.hostname());
48 EXPECT_EQ("1.2.3.4:5678", addr.ToString());
49}
50
51TEST(SocketAddressTest, TestIPv4StringPortCtor) {
52 SocketAddress addr("1.2.3.4", 5678);
53 EXPECT_FALSE(addr.IsUnresolvedIP());
54 EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
55 EXPECT_EQ(5678, addr.port());
56 EXPECT_EQ("1.2.3.4", addr.hostname());
57 EXPECT_EQ("1.2.3.4:5678", addr.ToString());
58}
59
60TEST(SocketAddressTest, TestIPv6StringPortCtor) {
61 SocketAddress addr2(kTestV6AddrString, 1234);
62 IPAddress tocheck(kTestV6Addr);
63
64 EXPECT_FALSE(addr2.IsUnresolvedIP());
65 EXPECT_EQ(tocheck, addr2.ipaddr());
66 EXPECT_EQ(1234, addr2.port());
67 EXPECT_EQ(kTestV6AddrString, addr2.hostname());
68 EXPECT_EQ("[" + kTestV6AddrString + "]:1234", addr2.ToString());
69}
70
71TEST(SocketAddressTest, TestSpecialStringPortCtor) {
72 // inet_addr doesn't handle this address properly.
73 SocketAddress addr("255.255.255.255", 5678);
74 EXPECT_FALSE(addr.IsUnresolvedIP());
75 EXPECT_EQ(IPAddress(0xFFFFFFFFU), addr.ipaddr());
76 EXPECT_EQ(5678, addr.port());
77 EXPECT_EQ("255.255.255.255", addr.hostname());
78 EXPECT_EQ("255.255.255.255:5678", addr.ToString());
79}
80
81TEST(SocketAddressTest, TestHostnamePortCtor) {
82 SocketAddress addr("a.b.com", 5678);
83 EXPECT_TRUE(addr.IsUnresolvedIP());
84 EXPECT_EQ(IPAddress(), addr.ipaddr());
85 EXPECT_EQ(5678, addr.port());
86 EXPECT_EQ("a.b.com", addr.hostname());
87 EXPECT_EQ("a.b.com:5678", addr.ToString());
88}
89
90TEST(SocketAddressTest, TestCopyCtor) {
91 SocketAddress from("1.2.3.4", 5678);
92 SocketAddress addr(from);
93 EXPECT_FALSE(addr.IsUnresolvedIP());
94 EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
95 EXPECT_EQ(5678, addr.port());
96 EXPECT_EQ("1.2.3.4", addr.hostname());
97 EXPECT_EQ("1.2.3.4:5678", addr.ToString());
98}
99
100TEST(SocketAddressTest, TestAssign) {
101 SocketAddress from("1.2.3.4", 5678);
102 SocketAddress addr(IPAddress(0x88888888), 9999);
103 addr = from;
104 EXPECT_FALSE(addr.IsUnresolvedIP());
105 EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
106 EXPECT_EQ(5678, addr.port());
107 EXPECT_EQ("1.2.3.4", addr.hostname());
108 EXPECT_EQ("1.2.3.4:5678", addr.ToString());
109}
110
111TEST(SocketAddressTest, TestSetIPPort) {
112 SocketAddress addr(IPAddress(0x88888888), 9999);
113 addr.SetIP(IPAddress(0x01020304));
114 addr.SetPort(5678);
115 EXPECT_FALSE(addr.IsUnresolvedIP());
116 EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
117 EXPECT_EQ(5678, addr.port());
118 EXPECT_EQ("", addr.hostname());
119 EXPECT_EQ("1.2.3.4:5678", addr.ToString());
120}
121
122TEST(SocketAddressTest, TestSetIPFromString) {
123 SocketAddress addr(IPAddress(0x88888888), 9999);
124 addr.SetIP("1.2.3.4");
125 addr.SetPort(5678);
126 EXPECT_FALSE(addr.IsUnresolvedIP());
127 EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
128 EXPECT_EQ(5678, addr.port());
129 EXPECT_EQ("1.2.3.4", addr.hostname());
130 EXPECT_EQ("1.2.3.4:5678", addr.ToString());
131}
132
133TEST(SocketAddressTest, TestSetIPFromHostname) {
134 SocketAddress addr(IPAddress(0x88888888), 9999);
135 addr.SetIP("a.b.com");
136 addr.SetPort(5678);
137 EXPECT_TRUE(addr.IsUnresolvedIP());
138 EXPECT_EQ(IPAddress(), addr.ipaddr());
139 EXPECT_EQ(5678, addr.port());
140 EXPECT_EQ("a.b.com", addr.hostname());
141 EXPECT_EQ("a.b.com:5678", addr.ToString());
142 addr.SetResolvedIP(IPAddress(0x01020304));
143 EXPECT_FALSE(addr.IsUnresolvedIP());
144 EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
145 EXPECT_EQ("a.b.com", addr.hostname());
146 EXPECT_EQ("a.b.com:5678", addr.ToString());
147}
148
149TEST(SocketAddressTest, TestFromIPv4String) {
150 SocketAddress addr;
151 EXPECT_TRUE(addr.FromString("1.2.3.4:5678"));
152 EXPECT_FALSE(addr.IsUnresolvedIP());
153 EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
154 EXPECT_EQ(5678, addr.port());
155 EXPECT_EQ("1.2.3.4", addr.hostname());
156 EXPECT_EQ("1.2.3.4:5678", addr.ToString());
157}
158
159TEST(SocketAddressTest, TestFromIPv6String) {
160 SocketAddress addr;
161 EXPECT_TRUE(addr.FromString(kTestV6AddrFullString));
162 EXPECT_FALSE(addr.IsUnresolvedIP());
163 EXPECT_EQ(5678, addr.port());
164 EXPECT_EQ(kTestV6AddrString, addr.hostname());
165 EXPECT_EQ(kTestV6AddrFullString, addr.ToString());
166}
167
168TEST(SocketAddressTest, TestFromHostname) {
169 SocketAddress addr;
170 EXPECT_TRUE(addr.FromString("a.b.com:5678"));
171 EXPECT_TRUE(addr.IsUnresolvedIP());
172 EXPECT_EQ(IPAddress(), addr.ipaddr());
173 EXPECT_EQ(5678, addr.port());
174 EXPECT_EQ("a.b.com", addr.hostname());
175 EXPECT_EQ("a.b.com:5678", addr.ToString());
176}
177
178TEST(SocketAddressTest, TestToFromSockAddr) {
179 SocketAddress from("1.2.3.4", 5678), addr;
180 sockaddr_in addr_in;
181 from.ToSockAddr(&addr_in);
182 EXPECT_TRUE(addr.FromSockAddr(addr_in));
183 EXPECT_FALSE(addr.IsUnresolvedIP());
184 EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
185 EXPECT_EQ(5678, addr.port());
186 EXPECT_EQ("", addr.hostname());
187 EXPECT_EQ("1.2.3.4:5678", addr.ToString());
188}
189
190TEST(SocketAddressTest, TestToFromSockAddrStorage) {
191 SocketAddress from("1.2.3.4", 5678), addr;
192 sockaddr_storage addr_storage;
193 from.ToSockAddrStorage(&addr_storage);
194 EXPECT_TRUE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
195 EXPECT_FALSE(addr.IsUnresolvedIP());
196 EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
197 EXPECT_EQ(5678, addr.port());
198 EXPECT_EQ("", addr.hostname());
199 EXPECT_EQ("1.2.3.4:5678", addr.ToString());
200
201 addr.Clear();
202 from.ToDualStackSockAddrStorage(&addr_storage);
203 EXPECT_TRUE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
204 EXPECT_FALSE(addr.IsUnresolvedIP());
205 EXPECT_EQ(IPAddress(kMappedV4Addr), addr.ipaddr());
206 EXPECT_EQ(5678, addr.port());
207 EXPECT_EQ("", addr.hostname());
208 EXPECT_EQ("[::ffff:1.2.3.4]:5678", addr.ToString());
209
210 addr.Clear();
211 memset(&addr_storage, 0, sizeof(sockaddr_storage));
212 from = SocketAddress(kTestV6AddrString, 5678);
213 from.SetScopeID(6);
214 from.ToSockAddrStorage(&addr_storage);
215 EXPECT_TRUE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
216 EXPECT_FALSE(addr.IsUnresolvedIP());
217 EXPECT_EQ(IPAddress(kTestV6Addr), addr.ipaddr());
218 EXPECT_EQ(5678, addr.port());
219 EXPECT_EQ("", addr.hostname());
220 EXPECT_EQ(kTestV6AddrFullString, addr.ToString());
221 EXPECT_EQ(6, addr.scope_id());
222
223 addr.Clear();
224 from.ToDualStackSockAddrStorage(&addr_storage);
225 EXPECT_TRUE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
226 EXPECT_FALSE(addr.IsUnresolvedIP());
227 EXPECT_EQ(IPAddress(kTestV6Addr), addr.ipaddr());
228 EXPECT_EQ(5678, addr.port());
229 EXPECT_EQ("", addr.hostname());
230 EXPECT_EQ(kTestV6AddrFullString, addr.ToString());
231 EXPECT_EQ(6, addr.scope_id());
232
233 addr = from;
234 addr_storage.ss_family = AF_UNSPEC;
235 EXPECT_FALSE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
236 EXPECT_EQ(from, addr);
237
deadbeef37f5ecf2017-02-27 14:06:41 -0800238 EXPECT_FALSE(SocketAddressFromSockAddrStorage(addr_storage, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000239}
240
Yves Gerey665174f2018-06-19 15:03:05 +0200241bool AreEqual(const SocketAddress& addr1, const SocketAddress& addr2) {
242 return addr1 == addr2 && addr2 == addr1 && !(addr1 != addr2) &&
243 !(addr2 != addr1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000244}
245
Yves Gerey665174f2018-06-19 15:03:05 +0200246bool AreUnequal(const SocketAddress& addr1, const SocketAddress& addr2) {
247 return !(addr1 == addr2) && !(addr2 == addr1) && addr1 != addr2 &&
248 addr2 != addr1;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000249}
250
251TEST(SocketAddressTest, TestEqualityOperators) {
252 SocketAddress addr1("1.2.3.4", 5678);
253 SocketAddress addr2("1.2.3.4", 5678);
Jonas Olssonabbe8412018-04-03 13:40:05 +0200254 EXPECT_TRUE(AreEqual(addr1, addr2));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000255
256 addr2 = SocketAddress("0.0.0.1", 5678);
Jonas Olssonabbe8412018-04-03 13:40:05 +0200257 EXPECT_TRUE(AreUnequal(addr1, addr2));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000258
259 addr2 = SocketAddress("1.2.3.4", 1234);
Jonas Olssonabbe8412018-04-03 13:40:05 +0200260 EXPECT_TRUE(AreUnequal(addr1, addr2));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000261
262 addr2 = SocketAddress(kTestV6AddrString, 5678);
Jonas Olssonabbe8412018-04-03 13:40:05 +0200263 EXPECT_TRUE(AreUnequal(addr1, addr2));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000264
265 addr1 = SocketAddress(kTestV6AddrString, 5678);
Jonas Olssonabbe8412018-04-03 13:40:05 +0200266 EXPECT_TRUE(AreEqual(addr1, addr2));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000267
268 addr2 = SocketAddress(kTestV6AddrString, 1234);
Jonas Olssonabbe8412018-04-03 13:40:05 +0200269 EXPECT_TRUE(AreUnequal(addr1, addr2));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000270
271 addr2 = SocketAddress("fe80::1", 5678);
Jonas Olssonabbe8412018-04-03 13:40:05 +0200272 EXPECT_TRUE(AreUnequal(addr1, addr2));
henrike@webrtc.orgb614d062014-07-10 22:47:02 +0000273
274 SocketAddress addr3("a.b.c.d", 1);
275 SocketAddress addr4("b.b.c.d", 1);
Jonas Olssonabbe8412018-04-03 13:40:05 +0200276 EXPECT_TRUE(AreUnequal(addr3, addr4));
277 EXPECT_TRUE(AreEqual(addr3, addr3));
henrike@webrtc.orgb614d062014-07-10 22:47:02 +0000278
279 addr3.SetIP(addr1.ip());
280 addr4.SetIP(addr1.ip());
Jonas Olssonabbe8412018-04-03 13:40:05 +0200281 EXPECT_TRUE(AreEqual(addr3, addr4));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000282}
283
henrike@webrtc.orgb614d062014-07-10 22:47:02 +0000284bool IsLessThan(const SocketAddress& addr1, const SocketAddress& addr2) {
Yves Gerey665174f2018-06-19 15:03:05 +0200285 return addr1 < addr2 && !(addr2 < addr1) && !(addr1 == addr2);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000286}
287
288TEST(SocketAddressTest, TestComparisonOperator) {
289 SocketAddress addr1("1.2.3.4", 5678);
290 SocketAddress addr2("1.2.3.4", 5678);
291
292 EXPECT_FALSE(addr1 < addr2);
293 EXPECT_FALSE(addr2 < addr1);
294
295 addr2 = SocketAddress("1.2.3.4", 5679);
Jonas Olssonabbe8412018-04-03 13:40:05 +0200296 EXPECT_TRUE(IsLessThan(addr1, addr2));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000297
298 addr2 = SocketAddress("2.2.3.4", 49152);
Jonas Olssonabbe8412018-04-03 13:40:05 +0200299 EXPECT_TRUE(IsLessThan(addr1, addr2));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000300
301 addr2 = SocketAddress(kTestV6AddrString, 5678);
Jonas Olssonabbe8412018-04-03 13:40:05 +0200302 EXPECT_TRUE(IsLessThan(addr1, addr2));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000303
304 addr1 = SocketAddress("fe80::1", 5678);
Jonas Olssonabbe8412018-04-03 13:40:05 +0200305 EXPECT_TRUE(IsLessThan(addr2, addr1));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000306
307 addr2 = SocketAddress("fe80::1", 5679);
Jonas Olssonabbe8412018-04-03 13:40:05 +0200308 EXPECT_TRUE(IsLessThan(addr1, addr2));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000309
310 addr2 = SocketAddress("fe80::1", 5678);
311 EXPECT_FALSE(addr1 < addr2);
312 EXPECT_FALSE(addr2 < addr1);
henrike@webrtc.orgb614d062014-07-10 22:47:02 +0000313
314 SocketAddress addr3("a.b.c.d", 1);
315 SocketAddress addr4("b.b.c.d", 1);
Jonas Olssonabbe8412018-04-03 13:40:05 +0200316 EXPECT_TRUE(IsLessThan(addr3, addr4));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000317}
318
319TEST(SocketAddressTest, TestToSensitiveString) {
320 SocketAddress addr_v4("1.2.3.4", 5678);
321 EXPECT_EQ("1.2.3.4", addr_v4.HostAsURIString());
322 EXPECT_EQ("1.2.3.4:5678", addr_v4.ToString());
Peter Boströmcdb38e52015-11-26 00:35:49 +0100323
324#if defined(NDEBUG)
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000325 EXPECT_EQ("1.2.3.x", addr_v4.HostAsSensitiveURIString());
326 EXPECT_EQ("1.2.3.x:5678", addr_v4.ToSensitiveString());
Peter Boströmcdb38e52015-11-26 00:35:49 +0100327#else
328 EXPECT_EQ("1.2.3.4", addr_v4.HostAsSensitiveURIString());
329 EXPECT_EQ("1.2.3.4:5678", addr_v4.ToSensitiveString());
330#endif // defined(NDEBUG)
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000331
332 SocketAddress addr_v6(kTestV6AddrString, 5678);
333 EXPECT_EQ("[" + kTestV6AddrString + "]", addr_v6.HostAsURIString());
334 EXPECT_EQ(kTestV6AddrFullString, addr_v6.ToString());
Peter Boströmcdb38e52015-11-26 00:35:49 +0100335#if defined(NDEBUG)
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000336 EXPECT_EQ("[" + kTestV6AddrAnonymizedString + "]",
337 addr_v6.HostAsSensitiveURIString());
338 EXPECT_EQ(kTestV6AddrFullAnonymizedString, addr_v6.ToSensitiveString());
Peter Boströmcdb38e52015-11-26 00:35:49 +0100339#else
340 EXPECT_EQ("[" + kTestV6AddrString + "]", addr_v6.HostAsSensitiveURIString());
341 EXPECT_EQ(kTestV6AddrFullString, addr_v6.ToSensitiveString());
342#endif // defined(NDEBUG)
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000343}
344
345} // namespace rtc