1 /*
2 * libjingle
3 * Copyright 2004--2011, Google Inc.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28 #ifdef POSIX
29 #include <netinet/in.h> // for sockaddr_in
30 #endif
31
32 #include "talk/base/gunit.h"
33 #include "talk/base/socketaddress.h"
34 #include "talk/base/ipaddress.h"
35
36 namespace talk_base {
37
38 const in6_addr kTestV6Addr = { { {0x20, 0x01, 0x0d, 0xb8,
39 0x10, 0x20, 0x30, 0x40,
40 0x50, 0x60, 0x70, 0x80,
41 0x90, 0xA0, 0xB0, 0xC0} } };
42 const in6_addr kMappedV4Addr = { { {0x00, 0x00, 0x00, 0x00,
43 0x00, 0x00, 0x00, 0x00,
44 0x00, 0x00, 0xFF, 0xFF,
45 0x01, 0x02, 0x03, 0x04} } };
46 const std::string kTestV6AddrString = "2001:db8:1020:3040:5060:7080:90a0:b0c0";
47 const std::string kTestV6AddrFullString =
48 "[2001:db8:1020:3040:5060:7080:90a0:b0c0]:5678";
49
TEST(SocketAddressTest,TestDefaultCtor)50 TEST(SocketAddressTest, TestDefaultCtor) {
51 SocketAddress addr;
52 EXPECT_FALSE(addr.IsUnresolvedIP());
53 EXPECT_EQ(IPAddress(INADDR_ANY), addr.ipaddr());
54 EXPECT_EQ(0, addr.port());
55 EXPECT_EQ("", addr.hostname());
56 EXPECT_EQ("0.0.0.0:0", addr.ToString());
57 }
58
TEST(SocketAddressTest,TestIPPortCtor)59 TEST(SocketAddressTest, TestIPPortCtor) {
60 SocketAddress addr(IPAddress(0x01020304), 5678);
61 EXPECT_FALSE(addr.IsUnresolvedIP());
62 EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
63 EXPECT_EQ(5678, addr.port());
64 EXPECT_EQ("", addr.hostname());
65 EXPECT_EQ("1.2.3.4:5678", addr.ToString());
66 }
67
TEST(SocketAddressTest,TestIPv4StringPortCtor)68 TEST(SocketAddressTest, TestIPv4StringPortCtor) {
69 SocketAddress addr("1.2.3.4", 5678);
70 EXPECT_FALSE(addr.IsUnresolvedIP());
71 EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
72 EXPECT_EQ(5678, addr.port());
73 EXPECT_EQ("1.2.3.4", addr.hostname());
74 EXPECT_EQ("1.2.3.4:5678", addr.ToString());
75 }
76
TEST(SocketAddressTest,TestIPv6StringPortCtor)77 TEST(SocketAddressTest, TestIPv6StringPortCtor) {
78 SocketAddress addr2(kTestV6AddrString, 1234);
79 IPAddress tocheck(kTestV6Addr);
80
81 EXPECT_FALSE(addr2.IsUnresolvedIP());
82 EXPECT_EQ(tocheck, addr2.ipaddr());
83 EXPECT_EQ(1234, addr2.port());
84 EXPECT_EQ(kTestV6AddrString, addr2.hostname());
85 EXPECT_EQ("[" + kTestV6AddrString + "]:1234", addr2.ToString());
86 }
87
TEST(SocketAddressTest,TestSpecialStringPortCtor)88 TEST(SocketAddressTest, TestSpecialStringPortCtor) {
89 // inet_addr doesn't handle this address properly.
90 SocketAddress addr("255.255.255.255", 5678);
91 EXPECT_FALSE(addr.IsUnresolvedIP());
92 EXPECT_EQ(IPAddress(0xFFFFFFFFU), addr.ipaddr());
93 EXPECT_EQ(5678, addr.port());
94 EXPECT_EQ("255.255.255.255", addr.hostname());
95 EXPECT_EQ("255.255.255.255:5678", addr.ToString());
96 }
97
TEST(SocketAddressTest,TestHostnamePortCtor)98 TEST(SocketAddressTest, TestHostnamePortCtor) {
99 SocketAddress addr("a.b.com", 5678);
100 EXPECT_TRUE(addr.IsUnresolvedIP());
101 EXPECT_EQ(IPAddress(INADDR_ANY), addr.ipaddr());
102 EXPECT_EQ(5678, addr.port());
103 EXPECT_EQ("a.b.com", addr.hostname());
104 EXPECT_EQ("a.b.com:5678", addr.ToString());
105 }
106
TEST(SocketAddressTest,TestCopyCtor)107 TEST(SocketAddressTest, TestCopyCtor) {
108 SocketAddress from("1.2.3.4", 5678);
109 SocketAddress addr(from);
110 EXPECT_FALSE(addr.IsUnresolvedIP());
111 EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
112 EXPECT_EQ(5678, addr.port());
113 EXPECT_EQ("1.2.3.4", addr.hostname());
114 EXPECT_EQ("1.2.3.4:5678", addr.ToString());
115 }
116
TEST(SocketAddressTest,TestAssign)117 TEST(SocketAddressTest, TestAssign) {
118 SocketAddress from("1.2.3.4", 5678);
119 SocketAddress addr(IPAddress(0x88888888), 9999);
120 addr = from;
121 EXPECT_FALSE(addr.IsUnresolvedIP());
122 EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
123 EXPECT_EQ(5678, addr.port());
124 EXPECT_EQ("1.2.3.4", addr.hostname());
125 EXPECT_EQ("1.2.3.4:5678", addr.ToString());
126 }
127
TEST(SocketAddressTest,TestSetIPPort)128 TEST(SocketAddressTest, TestSetIPPort) {
129 SocketAddress addr(IPAddress(0x88888888), 9999);
130 addr.SetIP(IPAddress(0x01020304));
131 addr.SetPort(5678);
132 EXPECT_FALSE(addr.IsUnresolvedIP());
133 EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
134 EXPECT_EQ(5678, addr.port());
135 EXPECT_EQ("", addr.hostname());
136 EXPECT_EQ("1.2.3.4:5678", addr.ToString());
137 }
138
TEST(SocketAddressTest,TestSetIPFromString)139 TEST(SocketAddressTest, TestSetIPFromString) {
140 SocketAddress addr(IPAddress(0x88888888), 9999);
141 addr.SetIP("1.2.3.4");
142 addr.SetPort(5678);
143 EXPECT_FALSE(addr.IsUnresolvedIP());
144 EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
145 EXPECT_EQ(5678, addr.port());
146 EXPECT_EQ("1.2.3.4", addr.hostname());
147 EXPECT_EQ("1.2.3.4:5678", addr.ToString());
148 }
149
TEST(SocketAddressTest,TestSetIPFromHostname)150 TEST(SocketAddressTest, TestSetIPFromHostname) {
151 SocketAddress addr(IPAddress(0x88888888), 9999);
152 addr.SetIP("a.b.com");
153 addr.SetPort(5678);
154 EXPECT_TRUE(addr.IsUnresolvedIP());
155 EXPECT_EQ(IPAddress(INADDR_ANY), addr.ipaddr());
156 EXPECT_EQ(5678, addr.port());
157 EXPECT_EQ("a.b.com", addr.hostname());
158 EXPECT_EQ("a.b.com:5678", addr.ToString());
159 addr.SetResolvedIP(IPAddress(0x01020304));
160 EXPECT_FALSE(addr.IsUnresolvedIP());
161 EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
162 EXPECT_EQ("a.b.com", addr.hostname());
163 EXPECT_EQ("a.b.com:5678", addr.ToString());
164 }
165
TEST(SocketAddressTest,TestFromIPv4String)166 TEST(SocketAddressTest, TestFromIPv4String) {
167 SocketAddress addr;
168 EXPECT_TRUE(addr.FromString("1.2.3.4:5678"));
169 EXPECT_FALSE(addr.IsUnresolvedIP());
170 EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
171 EXPECT_EQ(5678, addr.port());
172 EXPECT_EQ("1.2.3.4", addr.hostname());
173 EXPECT_EQ("1.2.3.4:5678", addr.ToString());
174 }
175
TEST(SocketAddressTest,TestFromIPv6String)176 TEST(SocketAddressTest, TestFromIPv6String) {
177 SocketAddress addr;
178 EXPECT_TRUE(addr.FromString(kTestV6AddrFullString));
179 EXPECT_FALSE(addr.IsUnresolvedIP());
180 EXPECT_EQ(5678, addr.port());
181 EXPECT_EQ(kTestV6AddrString, addr.hostname());
182 EXPECT_EQ(kTestV6AddrFullString, addr.ToString());
183 }
184
TEST(SocketAddressTest,TestFromHostname)185 TEST(SocketAddressTest, TestFromHostname) {
186 SocketAddress addr;
187 EXPECT_TRUE(addr.FromString("a.b.com:5678"));
188 EXPECT_TRUE(addr.IsUnresolvedIP());
189 EXPECT_EQ(IPAddress(INADDR_ANY), addr.ipaddr());
190 EXPECT_EQ(5678, addr.port());
191 EXPECT_EQ("a.b.com", addr.hostname());
192 EXPECT_EQ("a.b.com:5678", addr.ToString());
193 }
194
TEST(SocketAddressTest,TestToFromSockAddr)195 TEST(SocketAddressTest, TestToFromSockAddr) {
196 SocketAddress from("1.2.3.4", 5678), addr;
197 sockaddr_in addr_in;
198 from.ToSockAddr(&addr_in);
199 EXPECT_TRUE(addr.FromSockAddr(addr_in));
200 EXPECT_FALSE(addr.IsUnresolvedIP());
201 EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
202 EXPECT_EQ(5678, addr.port());
203 EXPECT_EQ("", addr.hostname());
204 EXPECT_EQ("1.2.3.4:5678", addr.ToString());
205 }
206
TEST(SocketAddressTest,TestToFromSockAddrStorage)207 TEST(SocketAddressTest, TestToFromSockAddrStorage) {
208 SocketAddress from("1.2.3.4", 5678), addr;
209 sockaddr_storage addr_storage;
210 from.ToSockAddrStorage(&addr_storage);
211 EXPECT_TRUE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
212 EXPECT_FALSE(addr.IsUnresolvedIP());
213 EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
214 EXPECT_EQ(5678, addr.port());
215 EXPECT_EQ("", addr.hostname());
216 EXPECT_EQ("1.2.3.4:5678", addr.ToString());
217
218 addr.Clear();
219 from.ToDualStackSockAddrStorage(&addr_storage);
220 EXPECT_TRUE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
221 EXPECT_FALSE(addr.IsUnresolvedIP());
222 EXPECT_EQ(IPAddress(kMappedV4Addr), addr.ipaddr());
223 EXPECT_EQ(5678, addr.port());
224 EXPECT_EQ("", addr.hostname());
225 EXPECT_EQ("[::ffff:1.2.3.4]:5678", addr.ToString());
226
227 addr.Clear();
228 memset(&addr_storage, 0, sizeof(sockaddr_storage));
229 from = SocketAddress(kTestV6AddrString, 5678);
230 from.SetScopeID(6);
231 from.ToSockAddrStorage(&addr_storage);
232 EXPECT_TRUE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
233 EXPECT_FALSE(addr.IsUnresolvedIP());
234 EXPECT_EQ(IPAddress(kTestV6Addr), addr.ipaddr());
235 EXPECT_EQ(5678, addr.port());
236 EXPECT_EQ("", addr.hostname());
237 EXPECT_EQ(kTestV6AddrFullString, addr.ToString());
238 EXPECT_EQ(6, addr.scope_id());
239
240 addr.Clear();
241 from.ToDualStackSockAddrStorage(&addr_storage);
242 EXPECT_TRUE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
243 EXPECT_FALSE(addr.IsUnresolvedIP());
244 EXPECT_EQ(IPAddress(kTestV6Addr), addr.ipaddr());
245 EXPECT_EQ(5678, addr.port());
246 EXPECT_EQ("", addr.hostname());
247 EXPECT_EQ(kTestV6AddrFullString, addr.ToString());
248 EXPECT_EQ(6, addr.scope_id());
249
250 addr = from;
251 addr_storage.ss_family = AF_UNSPEC;
252 EXPECT_FALSE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
253 EXPECT_EQ(from, addr);
254
255 EXPECT_FALSE(SocketAddressFromSockAddrStorage(addr_storage, NULL));
256 }
257
TEST(SocketAddressTest,TestGoodResolve)258 TEST(SocketAddressTest, TestGoodResolve) {
259 SocketAddress addr("localhost", 5678);
260 int error;
261 EXPECT_TRUE(addr.IsUnresolvedIP());
262 EXPECT_TRUE(addr.ResolveIP(false, &error));
263 EXPECT_EQ(0, error);
264 EXPECT_FALSE(addr.IsUnresolvedIP());
265 EXPECT_TRUE(addr.IsLoopbackIP());
266 EXPECT_EQ(IPAddress(INADDR_LOOPBACK), addr.ipaddr());
267 EXPECT_EQ(5678, addr.port());
268 EXPECT_EQ("localhost", addr.hostname());
269 EXPECT_EQ("localhost:5678", addr.ToString());
270 }
271
TEST(SocketAddressTest,TestBadResolve)272 TEST(SocketAddressTest, TestBadResolve) {
273 SocketAddress addr("address.bad", 5678);
274 int error;
275 EXPECT_TRUE(addr.IsUnresolvedIP());
276 EXPECT_FALSE(addr.ResolveIP(false, &error));
277 EXPECT_NE(0, error);
278 EXPECT_TRUE(addr.IsUnresolvedIP());
279 }
280
AreEqual(const SocketAddress & addr1,const SocketAddress & addr2)281 bool AreEqual(const SocketAddress& addr1,
282 const SocketAddress& addr2) {
283 return addr1 == addr2 && addr2 == addr1 &&
284 !(addr1 != addr2) && !(addr2 != addr1);
285 }
286
AreUnequal(const SocketAddress & addr1,const SocketAddress & addr2)287 bool AreUnequal(const SocketAddress& addr1,
288 const SocketAddress& addr2) {
289 return !(addr1 == addr2) && !(addr2 == addr1) &&
290 addr1 != addr2 && addr2 != addr1;
291 }
292
TEST(SocketAddressTest,TestEqualityOperators)293 TEST(SocketAddressTest, TestEqualityOperators) {
294 SocketAddress addr1("1.2.3.4", 5678);
295 SocketAddress addr2("1.2.3.4", 5678);
296 EXPECT_PRED2(AreEqual, addr1, addr2);
297
298 addr2 = SocketAddress("0.0.0.1", 5678);
299 EXPECT_PRED2(AreUnequal, addr1, addr2);
300
301 addr2 = SocketAddress("1.2.3.4", 1234);
302 EXPECT_PRED2(AreUnequal, addr1, addr2);
303
304 addr2 = SocketAddress(kTestV6AddrString, 5678);
305 EXPECT_PRED2(AreUnequal, addr1, addr2);
306
307 addr1 = SocketAddress(kTestV6AddrString, 5678);
308 EXPECT_PRED2(AreEqual, addr1, addr2);
309
310 addr2 = SocketAddress(kTestV6AddrString, 1234);
311 EXPECT_PRED2(AreUnequal, addr1, addr2);
312
313 addr2 = SocketAddress("fe80::1", 5678);
314 EXPECT_PRED2(AreUnequal, addr1, addr2);
315 }
316
IsLessThan(const SocketAddress & addr1,const SocketAddress & addr2)317 bool IsLessThan(const SocketAddress& addr1,
318 const SocketAddress& addr2) {
319 return addr1 < addr2 &&
320 !(addr2 < addr1) &&
321 !(addr1 == addr2);
322 }
323
TEST(SocketAddressTest,TestComparisonOperator)324 TEST(SocketAddressTest, TestComparisonOperator) {
325 SocketAddress addr1("1.2.3.4", 5678);
326 SocketAddress addr2("1.2.3.4", 5678);
327
328 EXPECT_FALSE(addr1 < addr2);
329 EXPECT_FALSE(addr2 < addr1);
330
331 addr2 = SocketAddress("1.2.3.4", 5679);
332 EXPECT_PRED2(IsLessThan, addr1, addr2);
333
334 addr2 = SocketAddress("2.2.3.4", 49152);
335 EXPECT_PRED2(IsLessThan, addr1, addr2);
336
337 addr2 = SocketAddress(kTestV6AddrString, 5678);
338 EXPECT_PRED2(IsLessThan, addr1, addr2);
339
340 addr1 = SocketAddress("fe80::1", 5678);
341 EXPECT_PRED2(IsLessThan, addr2, addr1);
342
343 addr2 = SocketAddress("fe80::1", 5679);
344 EXPECT_PRED2(IsLessThan, addr1, addr2);
345
346 addr2 = SocketAddress("fe80::1", 5678);
347 EXPECT_FALSE(addr1 < addr2);
348 EXPECT_FALSE(addr2 < addr1);
349 }
350
351 } // namespace talk_base
352