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 "net/dns/dns_hosts.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)struct ExpectedHostsEntry { 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const char* host; 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AddressFamily family; 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const char* ip; 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void PopulateExpectedHosts(const ExpectedHostsEntry* entries, 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) size_t num_entries, 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DnsHosts* expected_hosts_out) { 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (size_t i = 0; i < num_entries; ++i) { 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DnsHostsKey key(entries[i].host, entries[i].family); 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) IPAddressNumber& ip_ref = (*expected_hosts_out)[key]; 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(ip_ref.empty()); 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(ParseIPLiteralToNumber(entries[i].ip, &ip_ref)); 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(ip_ref.size(), 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) (entries[i].family == ADDRESS_FAMILY_IPV4) ? 4u : 16u); 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(DnsHostsTest, ParseHosts) { 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string kContents = 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "127.0.0.1 localhost\tlocalhost.localdomain # standard\n" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\n" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "1.0.0.1 localhost # ignored, first hit above\n" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "fe00::x example company # ignored, malformed IPv6\n" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "1.0.0.300 company # ignored, malformed IPv4\n" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "1.0.0.1 # ignored, missing hostname\n" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "1.0.0.1\t CoMpANy # normalized to 'company' \n" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "::1\tlocalhost ip6-localhost ip6-loopback # comment # within a comment\n" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\t fe00::0 ip6-localnet\r\n" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "2048::2 example\n" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "2048::1 company example # ignored for 'example' \n" 457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "127.0.0.1 cache1\n" 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "127.0.0.1 cache2 # should reuse parsed IP\n" 477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "256.0.0.0 cache3 # bogus IP should not clear parsed IP cache\n" 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "127.0.0.1 cache4 # should still be reused\n" 497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "127.0.0.2 cache5\n" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "gibberish"; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const ExpectedHostsEntry kEntries[] = { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "localhost", ADDRESS_FAMILY_IPV4, "127.0.0.1" }, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "localhost.localdomain", ADDRESS_FAMILY_IPV4, "127.0.0.1" }, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "company", ADDRESS_FAMILY_IPV4, "1.0.0.1" }, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "localhost", ADDRESS_FAMILY_IPV6, "::1" }, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "ip6-localhost", ADDRESS_FAMILY_IPV6, "::1" }, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "ip6-loopback", ADDRESS_FAMILY_IPV6, "::1" }, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "ip6-localnet", ADDRESS_FAMILY_IPV6, "fe00::0" }, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "company", ADDRESS_FAMILY_IPV6, "2048::1" }, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "example", ADDRESS_FAMILY_IPV6, "2048::2" }, 627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch { "cache1", ADDRESS_FAMILY_IPV4, "127.0.0.1" }, 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch { "cache2", ADDRESS_FAMILY_IPV4, "127.0.0.1" }, 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch { "cache4", ADDRESS_FAMILY_IPV4, "127.0.0.1" }, 657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch { "cache5", ADDRESS_FAMILY_IPV4, "127.0.0.2" }, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DnsHosts expected_hosts, actual_hosts; 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PopulateExpectedHosts(kEntries, ARRAYSIZE_UNSAFE(kEntries), &expected_hosts); 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ParseHosts(kContents, &actual_hosts); 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(expected_hosts, actual_hosts); 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(DnsHostsTest, ParseHosts_CommaIsToken) { 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string kContents = "127.0.0.1 comma1,comma2"; 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const ExpectedHostsEntry kEntries[] = { 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { "comma1,comma2", ADDRESS_FAMILY_IPV4, "127.0.0.1" }, 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) }; 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DnsHosts expected_hosts, actual_hosts; 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PopulateExpectedHosts(kEntries, ARRAYSIZE_UNSAFE(kEntries), &expected_hosts); 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ParseHostsWithCommaModeForTesting( 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kContents, &actual_hosts, PARSE_HOSTS_COMMA_IS_TOKEN); 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(expected_hosts, actual_hosts); 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(DnsHostsTest, ParseHosts_CommaIsWhitespace) { 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string kContents = "127.0.0.1 comma1,comma2"; 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const ExpectedHostsEntry kEntries[] = { 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { "comma1", ADDRESS_FAMILY_IPV4, "127.0.0.1" }, 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { "comma2", ADDRESS_FAMILY_IPV4, "127.0.0.1" }, 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) }; 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DnsHosts expected_hosts, actual_hosts; 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PopulateExpectedHosts(kEntries, ARRAYSIZE_UNSAFE(kEntries), &expected_hosts); 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ParseHostsWithCommaModeForTesting( 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kContents, &actual_hosts, PARSE_HOSTS_COMMA_IS_WHITESPACE); 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(expected_hosts, actual_hosts); 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Test that the right comma mode is used on each platform. 1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(DnsHostsTest, ParseHosts_CommaModeByPlatform) { 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string kContents = "127.0.0.1 comma1,comma2"; 1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(OS_MACOSX) 1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const ExpectedHostsEntry kEntries[] = { 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { "comma1", ADDRESS_FAMILY_IPV4, "127.0.0.1" }, 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { "comma2", ADDRESS_FAMILY_IPV4, "127.0.0.1" }, 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) }; 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const ExpectedHostsEntry kEntries[] = { 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { "comma1,comma2", ADDRESS_FAMILY_IPV4, "127.0.0.1" }, 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) }; 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DnsHosts expected_hosts, actual_hosts; 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PopulateExpectedHosts(kEntries, ARRAYSIZE_UNSAFE(kEntries), &expected_hosts); 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ParseHosts(kContents, &actual_hosts); 1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(expected_hosts, actual_hosts); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST(DnsHostsTest, HostsParser_Empty) { 1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DnsHosts hosts; 1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ParseHosts("", &hosts); 1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0u, hosts.size()); 1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST(DnsHostsTest, HostsParser_OnlyWhitespace) { 1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DnsHosts hosts; 1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ParseHosts(" ", &hosts); 1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0u, hosts.size()); 1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST(DnsHostsTest, HostsParser_EndsWithNothing) { 1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DnsHosts hosts; 1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ParseHosts("127.0.0.1 localhost", &hosts); 1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(1u, hosts.size()); 1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1427dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST(DnsHostsTest, HostsParser_EndsWithWhitespace) { 1437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DnsHosts hosts; 1447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ParseHosts("127.0.0.1 localhost ", &hosts); 1457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(1u, hosts.size()); 1467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST(DnsHostsTest, HostsParser_EndsWithComment) { 1497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DnsHosts hosts; 1507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ParseHosts("127.0.0.1 localhost # comment", &hosts); 1517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(1u, hosts.size()); 1527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1547dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST(DnsHostsTest, HostsParser_EndsWithNewline) { 1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DnsHosts hosts; 1567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ParseHosts("127.0.0.1 localhost\n", &hosts); 1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(1u, hosts.size()); 1587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1607dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST(DnsHostsTest, HostsParser_EndsWithTwoNewlines) { 1617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DnsHosts hosts; 1627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ParseHosts("127.0.0.1 localhost\n\n", &hosts); 1637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(1u, hosts.size()); 1647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1667dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST(DnsHostsTest, HostsParser_EndsWithNewlineAndWhitespace) { 1677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DnsHosts hosts; 1687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ParseHosts("127.0.0.1 localhost\n ", &hosts); 1697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(1u, hosts.size()); 1707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1727dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST(DnsHostsTest, HostsParser_EndsWithNewlineAndToken) { 1737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DnsHosts hosts; 1747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ParseHosts("127.0.0.1 localhost\ntoken", &hosts); 1757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(1u, hosts.size()); 1767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 182