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