15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/test_net_address_private.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/private/net_address_private.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_net_address_private.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/test_utils.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/testing_instance.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using pp::NetAddressPrivate; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_NetAddress_Private MakeIPv4NetAddress(const uint8_t host[4], int port) { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private addr; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetAddressPrivate::CreateFromIPv4Address(host, port, &addr); 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return addr; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_NetAddress_Private MakeIPv6NetAddress(const uint16_t host[8], uint16_t port, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t scope_id) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private addr = PP_NetAddress_Private(); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t ip[16]; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(int i = 0; i < 8; ++i) { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ip[i * 2] = host[i] >> 8; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ip[i * 2 + 1] = host[i] & 0xff; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetAddressPrivate::CreateFromIPv6Address(ip, scope_id, port, &addr); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return addr; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)REGISTER_TEST_CASE(NetAddressPrivate); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestNetAddressPrivate::TestNetAddressPrivate(TestingInstance* instance) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : TestCase(instance) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestNetAddressPrivate::Init() { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NetAddressPrivate::IsAvailable(); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestNetAddressPrivate::RunTests(const std::string& filter) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(AreEqual, filter); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(AreHostsEqual, filter); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(Describe, filter); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(ReplacePort, filter); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(GetAnyAddress, filter); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(DescribeIPv6, filter); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(GetFamily, filter); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(GetPort, filter); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(GetAddress, filter); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(GetScopeID, filter); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestNetAddressPrivate::TestAreEqual() { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No comparisons should ever be done with invalid addresses. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private invalid = PP_NetAddress_Private(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(NetAddressPrivate::AreEqual(invalid, invalid)); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t localhost_ip[4] = { 127, 0, 0, 1 }; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private localhost_80 = MakeIPv4NetAddress(localhost_ip, 80); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NetAddressPrivate::AreEqual(localhost_80, localhost_80)); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(NetAddressPrivate::AreEqual(localhost_80, invalid)); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private localhost_1234 = MakeIPv4NetAddress(localhost_ip, 1234); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(NetAddressPrivate::AreEqual(localhost_80, localhost_1234)); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t other_ip[4] = { 192, 168, 0, 1 }; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private other_80 = MakeIPv4NetAddress(other_ip, 80); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(NetAddressPrivate::AreEqual(localhost_80, other_80)); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestNetAddressPrivate::TestAreHostsEqual() { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No comparisons should ever be done with invalid addresses. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private invalid = PP_NetAddress_Private(); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(NetAddressPrivate::AreHostsEqual(invalid, invalid)); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t localhost_ip[4] = { 127, 0, 0, 1 }; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private localhost_80 = MakeIPv4NetAddress(localhost_ip, 80); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NetAddressPrivate::AreHostsEqual(localhost_80, localhost_80)); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(NetAddressPrivate::AreHostsEqual(localhost_80, invalid)); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private localhost_1234 = MakeIPv4NetAddress(localhost_ip, 1234); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NetAddressPrivate::AreHostsEqual(localhost_80, localhost_1234)); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t other_ip[4] = { 192, 168, 0, 1 }; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private other_80 = MakeIPv4NetAddress(other_ip, 80); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(NetAddressPrivate::AreHostsEqual(localhost_80, other_80)); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestNetAddressPrivate::TestDescribe() { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private invalid = PP_NetAddress_Private(); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("", NetAddressPrivate::Describe(invalid, false)); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("", NetAddressPrivate::Describe(invalid, true)); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t localhost_ip[4] = { 127, 0, 0, 1 }; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private localhost_80 = MakeIPv4NetAddress(localhost_ip, 80); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("127.0.0.1", NetAddressPrivate::Describe(localhost_80, false)); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("127.0.0.1:80", NetAddressPrivate::Describe(localhost_80, true)); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private localhost_1234 = MakeIPv4NetAddress(localhost_ip, 1234); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("127.0.0.1", NetAddressPrivate::Describe(localhost_1234, false)); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("127.0.0.1:1234", NetAddressPrivate::Describe(localhost_1234, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true)); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t other_ip[4] = { 192, 168, 0, 1 }; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private other_80 = MakeIPv4NetAddress(other_ip, 80); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("192.168.0.1", NetAddressPrivate::Describe(other_80, false)); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("192.168.0.1:80", NetAddressPrivate::Describe(other_80, true)); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestNetAddressPrivate::TestReplacePort() { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Assume that |AreEqual()| works correctly. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private result = PP_NetAddress_Private(); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private invalid = PP_NetAddress_Private(); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(NetAddressPrivate::ReplacePort(invalid, 1234, &result)); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t localhost_ip[4] = { 127, 0, 0, 1 }; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private localhost_80 = MakeIPv4NetAddress(localhost_ip, 80); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NetAddressPrivate::ReplacePort(localhost_80, 1234, &result)); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private localhost_1234 = MakeIPv4NetAddress(localhost_ip, 1234); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NetAddressPrivate::AreEqual(result, localhost_1234)); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that having the out param being the same as the in param works 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // properly. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NetAddressPrivate::ReplacePort(result, 80, &result)); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NetAddressPrivate::AreEqual(result, localhost_80)); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestNetAddressPrivate::TestGetAnyAddress() { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Just make sure it doesn't crash and such. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private result = PP_NetAddress_Private(); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetAddressPrivate::GetAnyAddress(false, &result); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NetAddressPrivate::AreEqual(result, result)); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetAddressPrivate::GetAnyAddress(true, &result); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NetAddressPrivate::AreEqual(result, result)); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(viettrungluu): More IPv6 tests needed. 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestNetAddressPrivate::TestDescribeIPv6() { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const struct { 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t address[8]; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t port; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t scope; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* expected_without_port; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* expected_with_port; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } test_cases[] = { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Generic test case (unique longest run of zeros to collapse). 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0x12, 0xabcd, 0, 0x0001, 0, 0, 0, 0xcdef }, 12, 0, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "12:abcd:0:1::cdef", "[12:abcd:0:1::cdef]:12" 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Non-zero scope. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0x1234, 0xabcd, 0, 0x0001, 0, 0, 0, 0xcdef }, 1234, 789, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "1234:abcd:0:1::cdef%789", "[1234:abcd:0:1::cdef%789]:1234" 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Ignore the first (non-longest) run of zeros. 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 0, 0x0123, 0, 0, 0, 0 }, 123, 0, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "0:0:0:123::", "[0:0:0:123::]:123" 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Collapse the first (equally-longest) run of zeros. 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0x1234, 0xabcd, 0, 0, 0xff, 0, 0, 0xcdef }, 123, 0, 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "1234:abcd::ff:0:0:cdef", "[1234:abcd::ff:0:0:cdef]:123" 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Don't collapse "runs" of zeros of length 1. 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0xa, 1, 2, 3, 0, 5, 0 }, 123, 0, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "0:a:1:2:3:0:5:0", "[0:a:1:2:3:0:5:0]:123" 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Collapse a run of zeros at the beginning. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 0, 2, 3, 0, 0, 0 }, 123, 0, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "::2:3:0:0:0", "[::2:3:0:0:0]:123" 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Collapse a run of zeros at the end. 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0xa, 1, 2, 3, 0, 0, 0 }, 123, 0, 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "0:a:1:2:3::", "[0:a:1:2:3::]:123" 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // IPv4 192.168.1.2 embedded in IPv6 in the deprecated way. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 0, 0, 0, 0, 0xc0a8, 0x102 }, 123, 0, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "::192.168.1.2", "[::192.168.1.2]:123" 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // ... with non-zero scope. 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 0, 0, 0, 0, 0xc0a8, 0x102 }, 123, 789, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "::192.168.1.2%789", "[::192.168.1.2%789]:123" 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // IPv4 192.168.1.2 embedded in IPv6. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 0, 0, 0, 0xffff, 0xc0a8, 0x102 }, 123, 0, 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "::ffff:192.168.1.2", "[::ffff:192.168.1.2]:123" 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // ... with non-zero scope. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 0, 0, 0, 0xffff, 0xc0a8, 0x102 }, 123, 789, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "::ffff:192.168.1.2%789", "[::ffff:192.168.1.2%789]:123" 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // *Not* IPv4 embedded in IPv6. 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 0, 0, 0, 0x1234, 0xc0a8, 0x102 }, 123, 0, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "::1234:c0a8:102", "[::1234:c0a8:102]:123" 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < sizeof(test_cases)/sizeof(test_cases[0]); i++) { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private addr = MakeIPv6NetAddress(test_cases[i].address, 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_cases[i].port, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_cases[i].scope); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(test_cases[i].expected_without_port, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetAddressPrivate::Describe(addr, false)); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(test_cases[i].expected_with_port, 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetAddressPrivate::Describe(addr, true)); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestNetAddressPrivate::TestGetFamily() { 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t localhost_ip[4] = { 127, 0, 0, 1 }; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private ipv4 = MakeIPv4NetAddress(localhost_ip, 80); 234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_EQ(NetAddressPrivate::GetFamily(ipv4), 235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PP_NETADDRESSFAMILY_PRIVATE_IPV4); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t ipv6_address[8] = { 0x1234, 0xabcd, 0, 0, 0xff, 0, 0, 0xcdef }; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private ipv6 = MakeIPv6NetAddress(ipv6_address, 123, 0); 239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_EQ(NetAddressPrivate::GetFamily(ipv6), 240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PP_NETADDRESSFAMILY_PRIVATE_IPV6); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestNetAddressPrivate::TestGetPort() { 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t localhost_ip[4] = { 127, 0, 0, 1 }; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private localhost_80 = MakeIPv4NetAddress(localhost_ip, 80); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(NetAddressPrivate::GetPort(localhost_80), 80); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t ipv6_address[8] = { 0x1234, 0xabcd, 0, 0, 0xff, 0, 0, 0xcdef }; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private port_123 = MakeIPv6NetAddress(ipv6_address, 123, 0); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(NetAddressPrivate::GetPort(port_123), 123); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private port_FFFF = MakeIPv6NetAddress(ipv6_address, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0xFFFF, 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(NetAddressPrivate::GetPort(port_FFFF), 0xFFFF); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestNetAddressPrivate::TestGetAddress() { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int addr_storage_len = 16; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char addr_storage[addr_storage_len]; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8_t ipv4_addr[4] = { 127, 0, 0, 1 }; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private localhost_80 = MakeIPv4NetAddress(ipv4_addr, 80); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(addr_storage, 0, addr_storage_len); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NetAddressPrivate::GetAddress(localhost_80, 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr_storage, 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr_storage_len)); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(memcmp(addr_storage, &ipv4_addr, 4), 0); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Insufficient storage for address. 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(NetAddressPrivate::GetAddress(localhost_80, 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr_storage, 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1)); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t ipv6_address[8] = { 0x1234, 0xabcd, 0, 0, 0xff, 0, 0, 0xcdef }; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private ipv6_addr = MakeIPv6NetAddress(ipv6_address, 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 123, 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure the ipv6 address is transformed properly into network order. 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t ipv6_bytes[16]; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(int i = 0; i < 8; ++i) { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ipv6_bytes[i * 2] = ipv6_address[i] >> 8; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ipv6_bytes[i * 2 + 1] = ipv6_address[i] & 0xFF; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(addr_storage, 0, addr_storage_len); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(NetAddressPrivate::GetAddress(ipv6_addr, 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr_storage, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr_storage_len)); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(memcmp(addr_storage, ipv6_bytes, 16), 0); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Insufficient storage for address. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(NetAddressPrivate::GetAddress(ipv6_addr, 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr_storage, 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1)); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestNetAddressPrivate::TestGetScopeID() { 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t localhost_ip[4] = { 127, 0, 0, 1 }; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private ipv4 = MakeIPv4NetAddress(localhost_ip, 80); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(NetAddressPrivate::GetScopeID(ipv4), 0); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t ipv6_address[8] = { 0x1234, 0xabcd, 0, 0, 0xff, 0, 0, 0xcdef }; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private ipv6_123 = MakeIPv6NetAddress(ipv6_address, 0, 123); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(NetAddressPrivate::GetScopeID(ipv6_123), 123); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private ipv6_max = 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MakeIPv6NetAddress(ipv6_address, 0, 0xFFFFFFFF); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(NetAddressPrivate::GetScopeID(ipv6_max), 0xFFFFFFFF); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 322