147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/*
247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *
447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */
1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_POSIX)
1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <netinet/in.h>  // for sockaddr_in
1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/gunit.h"
1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/socketaddress.h"
1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/ipaddress.h"
1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc {
2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgconst in6_addr kTestV6Addr =  { { {0x20, 0x01, 0x0d, 0xb8,
2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                   0x10, 0x20, 0x30, 0x40,
2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                   0x50, 0x60, 0x70, 0x80,
2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                   0x90, 0xA0, 0xB0, 0xC0} } };
2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgconst in6_addr kMappedV4Addr = { { {0x00, 0x00, 0x00, 0x00,
2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                    0x00, 0x00, 0x00, 0x00,
2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                    0x00, 0x00, 0xFF, 0xFF,
2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                    0x01, 0x02, 0x03, 0x04} } };
2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgconst std::string kTestV6AddrString = "2001:db8:1020:3040:5060:7080:90a0:b0c0";
3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgconst std::string kTestV6AddrAnonymizedString = "2001:db8:1020::";
3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgconst std::string kTestV6AddrFullString =
3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    "[2001:db8:1020:3040:5060:7080:90a0:b0c0]:5678";
3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgconst std::string kTestV6AddrFullAnonymizedString = "[2001:db8:1020::]:5678";
3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SocketAddressTest, TestDefaultCtor) {
3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SocketAddress addr;
3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(IPAddress(), addr.ipaddr());
3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(0, addr.port());
4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("", addr.hostname());
4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SocketAddressTest, TestIPPortCtor) {
4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SocketAddress addr(IPAddress(0x01020304), 5678);
4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("", addr.hostname());
4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SocketAddressTest, TestIPv4StringPortCtor) {
5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SocketAddress addr("1.2.3.4", 5678);
5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("1.2.3.4", addr.hostname());
5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SocketAddressTest, TestIPv6StringPortCtor) {
6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SocketAddress addr2(kTestV6AddrString, 1234);
6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  IPAddress tocheck(kTestV6Addr);
6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(addr2.IsUnresolvedIP());
6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(tocheck, addr2.ipaddr());
6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(1234, addr2.port());
6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(kTestV6AddrString, addr2.hostname());
6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("[" + kTestV6AddrString + "]:1234", addr2.ToString());
7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SocketAddressTest, TestSpecialStringPortCtor) {
7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // inet_addr doesn't handle this address properly.
7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SocketAddress addr("255.255.255.255", 5678);
7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(IPAddress(0xFFFFFFFFU), addr.ipaddr());
7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("255.255.255.255", addr.hostname());
7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("255.255.255.255:5678", addr.ToString());
8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SocketAddressTest, TestHostnamePortCtor) {
8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SocketAddress addr("a.b.com", 5678);
8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(addr.IsUnresolvedIP());
8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(IPAddress(), addr.ipaddr());
8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("a.b.com", addr.hostname());
8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("a.b.com:5678", addr.ToString());
8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SocketAddressTest, TestCopyCtor) {
9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SocketAddress from("1.2.3.4", 5678);
9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SocketAddress addr(from);
9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("1.2.3.4", addr.hostname());
9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SocketAddressTest, TestAssign) {
10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SocketAddress from("1.2.3.4", 5678);
10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SocketAddress addr(IPAddress(0x88888888), 9999);
10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr = from;
10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("1.2.3.4", addr.hostname());
10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SocketAddressTest, TestSetIPPort) {
11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SocketAddress addr(IPAddress(0x88888888), 9999);
11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr.SetIP(IPAddress(0x01020304));
11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr.SetPort(5678);
11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("", addr.hostname());
12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SocketAddressTest, TestSetIPFromString) {
12447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SocketAddress addr(IPAddress(0x88888888), 9999);
12547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr.SetIP("1.2.3.4");
12647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr.SetPort(5678);
12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("1.2.3.4", addr.hostname());
13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
13247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
13347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
13447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SocketAddressTest, TestSetIPFromHostname) {
13547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SocketAddress addr(IPAddress(0x88888888), 9999);
13647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr.SetIP("a.b.com");
13747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr.SetPort(5678);
13847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(addr.IsUnresolvedIP());
13947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(IPAddress(), addr.ipaddr());
14047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
14147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("a.b.com", addr.hostname());
14247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("a.b.com:5678", addr.ToString());
14347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr.SetResolvedIP(IPAddress(0x01020304));
14447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
14547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
14647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("a.b.com", addr.hostname());
14747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("a.b.com:5678", addr.ToString());
14847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
14947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
15047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SocketAddressTest, TestFromIPv4String) {
15147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SocketAddress addr;
15247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(addr.FromString("1.2.3.4:5678"));
15347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
15447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
15547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
15647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("1.2.3.4", addr.hostname());
15747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
15847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
15947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
16047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SocketAddressTest, TestFromIPv6String) {
16147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SocketAddress addr;
16247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(addr.FromString(kTestV6AddrFullString));
16347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
16447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
16547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(kTestV6AddrString, addr.hostname());
16647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(kTestV6AddrFullString, addr.ToString());
16747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
16847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
16947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SocketAddressTest, TestFromHostname) {
17047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SocketAddress addr;
17147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(addr.FromString("a.b.com:5678"));
17247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(addr.IsUnresolvedIP());
17347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(IPAddress(), addr.ipaddr());
17447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
17547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("a.b.com", addr.hostname());
17647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("a.b.com:5678", addr.ToString());
17747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
17847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
17947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SocketAddressTest, TestToFromSockAddr) {
18047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SocketAddress from("1.2.3.4", 5678), addr;
18147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  sockaddr_in addr_in;
18247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  from.ToSockAddr(&addr_in);
18347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(addr.FromSockAddr(addr_in));
18447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
18547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
18647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
18747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("", addr.hostname());
18847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
18947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
19047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
19147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SocketAddressTest, TestToFromSockAddrStorage) {
19247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SocketAddress from("1.2.3.4", 5678), addr;
19347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  sockaddr_storage addr_storage;
19447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  from.ToSockAddrStorage(&addr_storage);
19547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
19647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
19747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
19847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
19947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("", addr.hostname());
20047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
20147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
20247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr.Clear();
20347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  from.ToDualStackSockAddrStorage(&addr_storage);
20447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
20547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
20647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(IPAddress(kMappedV4Addr), addr.ipaddr());
20747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
20847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("", addr.hostname());
20947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("[::ffff:1.2.3.4]:5678", addr.ToString());
21047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
21147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr.Clear();
21247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  memset(&addr_storage, 0, sizeof(sockaddr_storage));
21347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  from = SocketAddress(kTestV6AddrString, 5678);
21447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  from.SetScopeID(6);
21547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  from.ToSockAddrStorage(&addr_storage);
21647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
21747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
21847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(IPAddress(kTestV6Addr), addr.ipaddr());
21947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
22047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("", addr.hostname());
22147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(kTestV6AddrFullString, addr.ToString());
22247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(6, addr.scope_id());
22347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
22447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr.Clear();
22547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  from.ToDualStackSockAddrStorage(&addr_storage);
22647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
22747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(addr.IsUnresolvedIP());
22847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(IPAddress(kTestV6Addr), addr.ipaddr());
22947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(5678, addr.port());
23047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("", addr.hostname());
23147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(kTestV6AddrFullString, addr.ToString());
23247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(6, addr.scope_id());
23347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
23447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr = from;
23547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr_storage.ss_family = AF_UNSPEC;
23647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
23747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(from, addr);
23847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
23947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(SocketAddressFromSockAddrStorage(addr_storage, NULL));
24047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
24147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
24247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool AreEqual(const SocketAddress& addr1,
24347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org              const SocketAddress& addr2) {
24447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return addr1 == addr2 && addr2 == addr1 &&
24547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      !(addr1 != addr2) && !(addr2 != addr1);
24647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
24747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
24847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool AreUnequal(const SocketAddress& addr1,
24947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                const SocketAddress& addr2) {
25047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return !(addr1 == addr2) && !(addr2 == addr1) &&
25147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      addr1 != addr2 && addr2 != addr1;
25247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
25347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
25447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SocketAddressTest, TestEqualityOperators) {
25547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SocketAddress addr1("1.2.3.4", 5678);
25647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SocketAddress addr2("1.2.3.4", 5678);
25747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_PRED2(AreEqual, addr1, addr2);
25847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
25947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr2 = SocketAddress("0.0.0.1", 5678);
26047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_PRED2(AreUnequal, addr1, addr2);
26147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
26247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr2 = SocketAddress("1.2.3.4", 1234);
26347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_PRED2(AreUnequal, addr1, addr2);
26447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
26547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr2 = SocketAddress(kTestV6AddrString, 5678);
26647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_PRED2(AreUnequal, addr1, addr2);
26747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
26847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr1 = SocketAddress(kTestV6AddrString, 5678);
26947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_PRED2(AreEqual, addr1, addr2);
27047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
27147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr2 = SocketAddress(kTestV6AddrString, 1234);
27247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_PRED2(AreUnequal, addr1, addr2);
27347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
27447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr2 = SocketAddress("fe80::1", 5678);
27547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_PRED2(AreUnequal, addr1, addr2);
276c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org
277c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org  SocketAddress addr3("a.b.c.d", 1);
278c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org  SocketAddress addr4("b.b.c.d", 1);
279c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org  EXPECT_PRED2(AreUnequal, addr3, addr4);
280c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org  EXPECT_PRED2(AreEqual, addr3, addr3);
281c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org
282c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org  addr3.SetIP(addr1.ip());
283c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org  addr4.SetIP(addr1.ip());
284c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org  EXPECT_PRED2(AreEqual,addr3, addr4);
28547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
28647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
287c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.orgbool IsLessThan(const SocketAddress& addr1, const SocketAddress& addr2) {
28847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return addr1 < addr2 &&
28947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      !(addr2 < addr1) &&
29047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      !(addr1 == addr2);
29147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
29247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
29347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SocketAddressTest, TestComparisonOperator) {
29447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SocketAddress addr1("1.2.3.4", 5678);
29547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SocketAddress addr2("1.2.3.4", 5678);
29647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
29747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(addr1 < addr2);
29847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(addr2 < addr1);
29947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
30047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr2 = SocketAddress("1.2.3.4", 5679);
30147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_PRED2(IsLessThan, addr1, addr2);
30247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
30347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr2 = SocketAddress("2.2.3.4", 49152);
30447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_PRED2(IsLessThan, addr1, addr2);
30547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
30647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr2 = SocketAddress(kTestV6AddrString, 5678);
30747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_PRED2(IsLessThan, addr1, addr2);
30847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
30947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr1 = SocketAddress("fe80::1", 5678);
31047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_PRED2(IsLessThan, addr2, addr1);
31147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
31247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr2 = SocketAddress("fe80::1", 5679);
31347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_PRED2(IsLessThan, addr1, addr2);
31447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
31547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  addr2 = SocketAddress("fe80::1", 5678);
31647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(addr1 < addr2);
31747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(addr2 < addr1);
318c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org
319c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org  SocketAddress addr3("a.b.c.d", 1);
320c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org  SocketAddress addr4("b.b.c.d", 1);
321c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org  EXPECT_PRED2(IsLessThan, addr3, addr4);
32247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
32347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
32447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST(SocketAddressTest, TestToSensitiveString) {
32547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SocketAddress addr_v4("1.2.3.4", 5678);
32647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("1.2.3.4", addr_v4.HostAsURIString());
32747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("1.2.3.4:5678", addr_v4.ToString());
32847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("1.2.3.4", addr_v4.HostAsSensitiveURIString());
32947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("1.2.3.4:5678", addr_v4.ToSensitiveString());
33047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  IPAddress::set_strip_sensitive(true);
33147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("1.2.3.x", addr_v4.HostAsSensitiveURIString());
33247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("1.2.3.x:5678", addr_v4.ToSensitiveString());
33347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  IPAddress::set_strip_sensitive(false);
33447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
33547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SocketAddress addr_v6(kTestV6AddrString, 5678);
33647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("[" + kTestV6AddrString + "]", addr_v6.HostAsURIString());
33747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(kTestV6AddrFullString, addr_v6.ToString());
33847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("[" + kTestV6AddrString + "]", addr_v6.HostAsSensitiveURIString());
33947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(kTestV6AddrFullString, addr_v6.ToSensitiveString());
34047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  IPAddress::set_strip_sensitive(true);
34147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("[" + kTestV6AddrAnonymizedString + "]",
34247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            addr_v6.HostAsSensitiveURIString());
34347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(kTestV6AddrFullAnonymizedString, addr_v6.ToSensitiveString());
34447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  IPAddress::set_strip_sensitive(false);
34547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
34647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
34747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}  // namespace rtc
348