1f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/*
2f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *
4f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
5f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
6f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
7f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
8f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org */
10f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
11f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if defined(WEBRTC_POSIX)
12f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <netinet/in.h>  // for sockaddr_in
13f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif
14f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
15f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/gunit.h"
16f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/socketaddress.h"
17f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/ipaddress.h"
18f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
19f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgnamespace rtc {
20f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
21f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgconst in6_addr kTestV6Addr =  { { {0x20, 0x01, 0x0d, 0xb8,
22f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                                   0x10, 0x20, 0x30, 0x40,
23f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                                   0x50, 0x60, 0x70, 0x80,
24f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                                   0x90, 0xA0, 0xB0, 0xC0} } };
25f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgconst in6_addr kMappedV4Addr = { { {0x00, 0x00, 0x00, 0x00,
26f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                                    0x00, 0x00, 0x00, 0x00,
27f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                                    0x00, 0x00, 0xFF, 0xFF,
28f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                                    0x01, 0x02, 0x03, 0x04} } };
29f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgconst std::string kTestV6AddrString = "2001:db8:1020:3040:5060:7080:90a0:b0c0";
30ac921d7365e83b1e271e05a2654ef705de5c60b7henrikgconst std::string kTestV6AddrAnonymizedString = "2001:db8:1020:x:x:x:x:x";
31f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgconst std::string kTestV6AddrFullString =
32f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    "[2001:db8:1020:3040:5060:7080:90a0:b0c0]:5678";
33ac921d7365e83b1e271e05a2654ef705de5c60b7henrikgconst std::string kTestV6AddrFullAnonymizedString =
34ac921d7365e83b1e271e05a2654ef705de5c60b7henrikg    "[2001:db8:1020:x:x:x:x:x]:5678";
35f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
36f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST(SocketAddressTest, TestDefaultCtor) {
37f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress addr;
38f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
39f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(IPAddress(), addr.ipaddr());
40f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(0, addr.port());
41f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("", addr.hostname());
42f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
43f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
44f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST(SocketAddressTest, TestIPPortCtor) {
45f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress addr(IPAddress(0x01020304), 5678);
46f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
47f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
48f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
49f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("", addr.hostname());
50f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
51f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
52f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
53f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST(SocketAddressTest, TestIPv4StringPortCtor) {
54f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress addr("1.2.3.4", 5678);
55f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
56f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
57f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
58f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("1.2.3.4", addr.hostname());
59f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
60f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
61f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
62f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST(SocketAddressTest, TestIPv6StringPortCtor) {
63f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress addr2(kTestV6AddrString, 1234);
64f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  IPAddress tocheck(kTestV6Addr);
65f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
66f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_FALSE(addr2.IsUnresolvedIP());
67f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(tocheck, addr2.ipaddr());
68f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(1234, addr2.port());
69f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(kTestV6AddrString, addr2.hostname());
70f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("[" + kTestV6AddrString + "]:1234", addr2.ToString());
71f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
72f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
73f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST(SocketAddressTest, TestSpecialStringPortCtor) {
74f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // inet_addr doesn't handle this address properly.
75f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress addr("255.255.255.255", 5678);
76f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
77f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(IPAddress(0xFFFFFFFFU), addr.ipaddr());
78f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
79f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("255.255.255.255", addr.hostname());
80f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("255.255.255.255:5678", addr.ToString());
81f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
82f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
83f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST(SocketAddressTest, TestHostnamePortCtor) {
84f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress addr("a.b.com", 5678);
85f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE(addr.IsUnresolvedIP());
86f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(IPAddress(), addr.ipaddr());
87f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
88f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("a.b.com", addr.hostname());
89f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("a.b.com:5678", addr.ToString());
90f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
91f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
92f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST(SocketAddressTest, TestCopyCtor) {
93f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress from("1.2.3.4", 5678);
94f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress addr(from);
95f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
96f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
97f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
98f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("1.2.3.4", addr.hostname());
99f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
100f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
101f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
102f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST(SocketAddressTest, TestAssign) {
103f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress from("1.2.3.4", 5678);
104f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress addr(IPAddress(0x88888888), 9999);
105f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr = from;
106f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
107f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
108f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
109f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("1.2.3.4", addr.hostname());
110f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
111f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
112f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
113f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST(SocketAddressTest, TestSetIPPort) {
114f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress addr(IPAddress(0x88888888), 9999);
115f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr.SetIP(IPAddress(0x01020304));
116f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr.SetPort(5678);
117f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
118f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
119f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
120f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("", addr.hostname());
121f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
122f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
123f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
124f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST(SocketAddressTest, TestSetIPFromString) {
125f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress addr(IPAddress(0x88888888), 9999);
126f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr.SetIP("1.2.3.4");
127f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr.SetPort(5678);
128f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
129f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
130f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
131f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("1.2.3.4", addr.hostname());
132f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
133f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
134f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
135f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST(SocketAddressTest, TestSetIPFromHostname) {
136f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress addr(IPAddress(0x88888888), 9999);
137f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr.SetIP("a.b.com");
138f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr.SetPort(5678);
139f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE(addr.IsUnresolvedIP());
140f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(IPAddress(), addr.ipaddr());
141f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
142f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("a.b.com", addr.hostname());
143f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("a.b.com:5678", addr.ToString());
144f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr.SetResolvedIP(IPAddress(0x01020304));
145f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
146f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
147f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("a.b.com", addr.hostname());
148f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("a.b.com:5678", addr.ToString());
149f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
150f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
151f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST(SocketAddressTest, TestFromIPv4String) {
152f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress addr;
153f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE(addr.FromString("1.2.3.4:5678"));
154f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
155f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
156f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
157f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("1.2.3.4", addr.hostname());
158f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
159f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
160f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
161f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST(SocketAddressTest, TestFromIPv6String) {
162f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress addr;
163f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE(addr.FromString(kTestV6AddrFullString));
164f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
165f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
166f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(kTestV6AddrString, addr.hostname());
167f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(kTestV6AddrFullString, addr.ToString());
168f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
169f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
170f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST(SocketAddressTest, TestFromHostname) {
171f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress addr;
172f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE(addr.FromString("a.b.com:5678"));
173f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE(addr.IsUnresolvedIP());
174f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(IPAddress(), addr.ipaddr());
175f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
176f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("a.b.com", addr.hostname());
177f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("a.b.com:5678", addr.ToString());
178f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
179f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
180f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST(SocketAddressTest, TestToFromSockAddr) {
181f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress from("1.2.3.4", 5678), addr;
182f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  sockaddr_in addr_in;
183f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  from.ToSockAddr(&addr_in);
184f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE(addr.FromSockAddr(addr_in));
185f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
186f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
187f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
188f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("", addr.hostname());
189f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
190f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
191f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
192f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST(SocketAddressTest, TestToFromSockAddrStorage) {
193f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress from("1.2.3.4", 5678), addr;
194f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  sockaddr_storage addr_storage;
195f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  from.ToSockAddrStorage(&addr_storage);
196f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
197f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
198f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
199f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
200f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("", addr.hostname());
201f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
202f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
203f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr.Clear();
204f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  from.ToDualStackSockAddrStorage(&addr_storage);
205f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
206f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
207f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(IPAddress(kMappedV4Addr), addr.ipaddr());
208f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
209f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("", addr.hostname());
210f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("[::ffff:1.2.3.4]:5678", addr.ToString());
211f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
212f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr.Clear();
213f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  memset(&addr_storage, 0, sizeof(sockaddr_storage));
214f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  from = SocketAddress(kTestV6AddrString, 5678);
215f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  from.SetScopeID(6);
216f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  from.ToSockAddrStorage(&addr_storage);
217f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
218f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
219f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(IPAddress(kTestV6Addr), addr.ipaddr());
220f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
221f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("", addr.hostname());
222f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(kTestV6AddrFullString, addr.ToString());
223f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(6, addr.scope_id());
224f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
225f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr.Clear();
226f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  from.ToDualStackSockAddrStorage(&addr_storage);
227f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
228f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
229f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(IPAddress(kTestV6Addr), addr.ipaddr());
230f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
231f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("", addr.hostname());
232f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(kTestV6AddrFullString, addr.ToString());
233f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(6, addr.scope_id());
234f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
235f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr = from;
236f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr_storage.ss_family = AF_UNSPEC;
237f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_FALSE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
238f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(from, addr);
239f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
240f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_FALSE(SocketAddressFromSockAddrStorage(addr_storage, NULL));
241f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
242f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
243f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool AreEqual(const SocketAddress& addr1,
244f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org              const SocketAddress& addr2) {
245f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return addr1 == addr2 && addr2 == addr1 &&
246f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      !(addr1 != addr2) && !(addr2 != addr1);
247f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
248f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
249f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool AreUnequal(const SocketAddress& addr1,
250f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                const SocketAddress& addr2) {
251f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return !(addr1 == addr2) && !(addr2 == addr1) &&
252f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      addr1 != addr2 && addr2 != addr1;
253f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
254f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
255f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST(SocketAddressTest, TestEqualityOperators) {
256f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress addr1("1.2.3.4", 5678);
257f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress addr2("1.2.3.4", 5678);
258f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_PRED2(AreEqual, addr1, addr2);
259f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
260f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr2 = SocketAddress("0.0.0.1", 5678);
261f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_PRED2(AreUnequal, addr1, addr2);
262f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
263f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr2 = SocketAddress("1.2.3.4", 1234);
264f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_PRED2(AreUnequal, addr1, addr2);
265f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
266f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr2 = SocketAddress(kTestV6AddrString, 5678);
267f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_PRED2(AreUnequal, addr1, addr2);
268f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
269f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr1 = SocketAddress(kTestV6AddrString, 5678);
270f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_PRED2(AreEqual, addr1, addr2);
271f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
272f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr2 = SocketAddress(kTestV6AddrString, 1234);
273f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_PRED2(AreUnequal, addr1, addr2);
274f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
275f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr2 = SocketAddress("fe80::1", 5678);
276f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_PRED2(AreUnequal, addr1, addr2);
277b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org
278b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org  SocketAddress addr3("a.b.c.d", 1);
279b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org  SocketAddress addr4("b.b.c.d", 1);
280b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org  EXPECT_PRED2(AreUnequal, addr3, addr4);
281b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org  EXPECT_PRED2(AreEqual, addr3, addr3);
282b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org
283b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org  addr3.SetIP(addr1.ip());
284b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org  addr4.SetIP(addr1.ip());
285b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org  EXPECT_PRED2(AreEqual,addr3, addr4);
286f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
287f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
288b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.orgbool IsLessThan(const SocketAddress& addr1, const SocketAddress& addr2) {
289f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return addr1 < addr2 &&
290f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      !(addr2 < addr1) &&
291f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      !(addr1 == addr2);
292f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
293f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
294f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST(SocketAddressTest, TestComparisonOperator) {
295f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress addr1("1.2.3.4", 5678);
296f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress addr2("1.2.3.4", 5678);
297f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
298f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_FALSE(addr1 < addr2);
299f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_FALSE(addr2 < addr1);
300f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
301f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr2 = SocketAddress("1.2.3.4", 5679);
302f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_PRED2(IsLessThan, addr1, addr2);
303f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
304f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr2 = SocketAddress("2.2.3.4", 49152);
305f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_PRED2(IsLessThan, addr1, addr2);
306f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
307f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr2 = SocketAddress(kTestV6AddrString, 5678);
308f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_PRED2(IsLessThan, addr1, addr2);
309f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
310f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr1 = SocketAddress("fe80::1", 5678);
311f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_PRED2(IsLessThan, addr2, addr1);
312f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
313f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr2 = SocketAddress("fe80::1", 5679);
314f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_PRED2(IsLessThan, addr1, addr2);
315f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
316f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  addr2 = SocketAddress("fe80::1", 5678);
317f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_FALSE(addr1 < addr2);
318f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_FALSE(addr2 < addr1);
319b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org
320b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org  SocketAddress addr3("a.b.c.d", 1);
321b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org  SocketAddress addr4("b.b.c.d", 1);
322b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org  EXPECT_PRED2(IsLessThan, addr3, addr4);
323f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
324f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
325f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST(SocketAddressTest, TestToSensitiveString) {
326f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress addr_v4("1.2.3.4", 5678);
327f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("1.2.3.4", addr_v4.HostAsURIString());
328f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("1.2.3.4:5678", addr_v4.ToString());
329cdb38e53978c27d0ccb9a7ccc987508122b2bc69Peter Boström
330cdb38e53978c27d0ccb9a7ccc987508122b2bc69Peter Boström#if defined(NDEBUG)
331f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("1.2.3.x", addr_v4.HostAsSensitiveURIString());
332f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("1.2.3.x:5678", addr_v4.ToSensitiveString());
333cdb38e53978c27d0ccb9a7ccc987508122b2bc69Peter Boström#else
334cdb38e53978c27d0ccb9a7ccc987508122b2bc69Peter Boström  EXPECT_EQ("1.2.3.4", addr_v4.HostAsSensitiveURIString());
335cdb38e53978c27d0ccb9a7ccc987508122b2bc69Peter Boström  EXPECT_EQ("1.2.3.4:5678", addr_v4.ToSensitiveString());
336cdb38e53978c27d0ccb9a7ccc987508122b2bc69Peter Boström#endif  // defined(NDEBUG)
337f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
338f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress addr_v6(kTestV6AddrString, 5678);
339f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("[" + kTestV6AddrString + "]", addr_v6.HostAsURIString());
340f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(kTestV6AddrFullString, addr_v6.ToString());
341cdb38e53978c27d0ccb9a7ccc987508122b2bc69Peter Boström#if defined(NDEBUG)
342f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ("[" + kTestV6AddrAnonymizedString + "]",
343f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org            addr_v6.HostAsSensitiveURIString());
344f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(kTestV6AddrFullAnonymizedString, addr_v6.ToSensitiveString());
345cdb38e53978c27d0ccb9a7ccc987508122b2bc69Peter Boström#else
346cdb38e53978c27d0ccb9a7ccc987508122b2bc69Peter Boström  EXPECT_EQ("[" + kTestV6AddrString + "]", addr_v6.HostAsSensitiveURIString());
347cdb38e53978c27d0ccb9a7ccc987508122b2bc69Peter Boström  EXPECT_EQ(kTestV6AddrFullString, addr_v6.ToSensitiveString());
348cdb38e53978c27d0ccb9a7ccc987508122b2bc69Peter Boström#endif  // defined(NDEBUG)
349f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
350f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
351f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}  // namespace rtc
352