| // Copyright 2014 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "net/base/ip_pattern.h" | 
 |  | 
 | #include "net/base/ip_address_number.h" | 
 | #include "testing/gtest/include/gtest/gtest.h" | 
 |  | 
 | namespace net { | 
 |  | 
 | namespace { | 
 |  | 
 | bool IsValidPattern(const std::string& pattern_text) { | 
 |   IPPattern pattern; | 
 |   return pattern.ParsePattern(pattern_text); | 
 | } | 
 |  | 
 | bool CheckForMatch(const IPPattern& pattern, const std::string& address_text) { | 
 |   IPAddressNumber address; | 
 |   EXPECT_TRUE(ParseIPLiteralToNumber(address_text, &address)); | 
 |   return pattern.Match(address); | 
 | } | 
 |  | 
 | TEST(IPPatternTest, EmptyPattern) { | 
 |   IPPattern pattern; | 
 |   IPAddressNumber ipv4_address1; | 
 |   EXPECT_TRUE(ParseIPLiteralToNumber("1.2.3.4", &ipv4_address1)); | 
 |   IPAddressNumber ipv6_address1; | 
 |   EXPECT_TRUE(ParseIPLiteralToNumber("1:2:3:4:5:6:7:8", &ipv6_address1)); | 
 |  | 
 |   EXPECT_FALSE(pattern.Match(ipv4_address1)); | 
 |   EXPECT_FALSE(pattern.Match(ipv6_address1)); | 
 | } | 
 |  | 
 | TEST(IPPatternTest, PerfectMatchPattern) { | 
 |   IPPattern pattern_v4; | 
 |   std::string ipv4_text1("1.2.3.4"); | 
 |   EXPECT_TRUE(pattern_v4.ParsePattern(ipv4_text1)); | 
 |   EXPECT_TRUE(pattern_v4.is_ipv4()); | 
 |   EXPECT_TRUE(CheckForMatch(pattern_v4, ipv4_text1)); | 
 |  | 
 |   IPPattern pattern_v6; | 
 |   std::string ipv6_text1("1:2:3:4:5:6:7:8"); | 
 |   EXPECT_TRUE(pattern_v6.ParsePattern(ipv6_text1)); | 
 |   EXPECT_FALSE(pattern_v6.is_ipv4()); | 
 |   EXPECT_TRUE(CheckForMatch(pattern_v6, ipv6_text1)); | 
 |  | 
 |   // Also check that there is no confusion betwene v6 and v4, despite having | 
 |   // similar values in some sense. | 
 |   EXPECT_FALSE(CheckForMatch(pattern_v4, ipv6_text1)); | 
 |   EXPECT_FALSE(CheckForMatch(pattern_v6, ipv4_text1)); | 
 | } | 
 |  | 
 | TEST(IPPatternTest, AlternativeMatchPattern) { | 
 |   IPPattern pattern_v4; | 
 |   EXPECT_TRUE(pattern_v4.ParsePattern("1.2.[3,5].4")); | 
 |   EXPECT_TRUE(pattern_v4.is_ipv4()); | 
 |   EXPECT_FALSE(CheckForMatch(pattern_v4, "1.2.2.4")); | 
 |   EXPECT_TRUE(CheckForMatch(pattern_v4, "1.2.3.4")); | 
 |   EXPECT_FALSE(CheckForMatch(pattern_v4, "1.2.4.4")); | 
 |   EXPECT_TRUE(CheckForMatch(pattern_v4, "1.2.5.4")); | 
 |   EXPECT_FALSE(CheckForMatch(pattern_v4, "1.2.6.4")); | 
 |  | 
 |   IPPattern pattern_v6; | 
 |   EXPECT_TRUE(pattern_v6.ParsePattern("1:2fab:3:4:5:[6,8]:7:8")); | 
 |   EXPECT_FALSE(pattern_v6.is_ipv4()); | 
 |   EXPECT_FALSE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:5:7:8")); | 
 |   EXPECT_TRUE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:6:7:8")); | 
 |   EXPECT_FALSE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:7:7:8")); | 
 |   EXPECT_TRUE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:8:7:8")); | 
 |   EXPECT_FALSE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:9:7:8")); | 
 | } | 
 |  | 
 | TEST(IPPatternTest, RangeMatchPattern) { | 
 |   IPPattern pattern_v4; | 
 |   EXPECT_TRUE(pattern_v4.ParsePattern("1.2.[3-5].4")); | 
 |   EXPECT_TRUE(pattern_v4.is_ipv4()); | 
 |   EXPECT_FALSE(CheckForMatch(pattern_v4, "1.2.2.4")); | 
 |   EXPECT_TRUE(CheckForMatch(pattern_v4, "1.2.3.4")); | 
 |   EXPECT_TRUE(CheckForMatch(pattern_v4, "1.2.4.4")); | 
 |   EXPECT_TRUE(CheckForMatch(pattern_v4, "1.2.5.4")); | 
 |   EXPECT_FALSE(CheckForMatch(pattern_v4, "1.2.6.4")); | 
 |  | 
 |   IPPattern pattern_v6; | 
 |   EXPECT_TRUE(pattern_v6.ParsePattern("1:2fab:3:4:5:[6-8]:7:8")); | 
 |   EXPECT_FALSE(pattern_v6.is_ipv4()); | 
 |   EXPECT_FALSE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:5:7:8")); | 
 |   EXPECT_TRUE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:6:7:8")); | 
 |   EXPECT_TRUE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:7:7:8")); | 
 |   EXPECT_TRUE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:8:7:8")); | 
 |   EXPECT_FALSE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:9:7:8")); | 
 | } | 
 |  | 
 | TEST(IPPatternTest, WildCardMatchPattern) { | 
 |   // Use two ranges, and check that only getting both right is a match. | 
 |   IPPattern pattern_v4; | 
 |   EXPECT_TRUE(pattern_v4.ParsePattern("1.2.*.4")); | 
 |   EXPECT_TRUE(pattern_v4.is_ipv4()); | 
 |   EXPECT_FALSE(CheckForMatch(pattern_v4, "1.2.2.255")); | 
 |   EXPECT_TRUE(CheckForMatch(pattern_v4, "1.2.255.4")); | 
 |   EXPECT_TRUE(CheckForMatch(pattern_v4, "1.2.0.4")); | 
 |  | 
 |   IPPattern pattern_v6; | 
 |   EXPECT_TRUE(pattern_v6.ParsePattern("1:2fab:3:4:5:*:7:8")); | 
 |   EXPECT_FALSE(pattern_v6.is_ipv4()); | 
 |   EXPECT_FALSE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:5:7:8888")); | 
 |   EXPECT_TRUE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:FFFF:7:8")); | 
 |   EXPECT_TRUE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:9999:7:8")); | 
 | } | 
 |  | 
 | TEST(IPPatternTest, MultiRangeMatchPattern) { | 
 |   // Use two ranges, and check that only getting both right is a match. | 
 |   // This ensures that the right component range is matched against the desired | 
 |   // component. | 
 |   IPPattern pattern_v4; | 
 |   EXPECT_TRUE(pattern_v4.ParsePattern("1.[2-3].3.[4-5]")); | 
 |   EXPECT_TRUE(pattern_v4.is_ipv4()); | 
 |   EXPECT_FALSE(CheckForMatch(pattern_v4, "1.4.3.6")); | 
 |   EXPECT_FALSE(CheckForMatch(pattern_v4, "1.2.3.6")); | 
 |   EXPECT_FALSE(CheckForMatch(pattern_v4, "1.4.3.4")); | 
 |   EXPECT_TRUE(CheckForMatch(pattern_v4, "1.2.3.4")); | 
 |  | 
 |   IPPattern pattern_v6; | 
 |   EXPECT_TRUE(pattern_v6.ParsePattern("1:2fab:3:4:[5-7]:6:7:[8-A]")); | 
 |   EXPECT_FALSE(pattern_v6.is_ipv4()); | 
 |   EXPECT_FALSE(CheckForMatch(pattern_v6, "1:2fab:3:4:4:5:7:F")); | 
 |   EXPECT_FALSE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:5:7:F")); | 
 |   EXPECT_FALSE(CheckForMatch(pattern_v6, "1:2fab:3:4:4:6:7:A")); | 
 |   EXPECT_TRUE(CheckForMatch(pattern_v6,  "1:2fab:3:4:5:6:7:A")); | 
 | } | 
 |  | 
 | TEST(IPPatternTest, BytoOrderInIPv6Ranges) { | 
 |   IPPattern pattern_v6_low_byte; | 
 |   EXPECT_TRUE(pattern_v6_low_byte.ParsePattern("1:2:3:4:5:6:7:[0-FF]")); | 
 |   EXPECT_TRUE(CheckForMatch(pattern_v6_low_byte, "1:2:3:4:5:6:7:0088")); | 
 |   EXPECT_FALSE(CheckForMatch(pattern_v6_low_byte, "1:2:3:4:5:6:7:8800")); | 
 |  | 
 |   IPPattern pattern_v6_high_byte; | 
 |   EXPECT_TRUE(pattern_v6_high_byte.ParsePattern("1:2:3:4:5:6:7:[0-FF00]")); | 
 |   EXPECT_TRUE(CheckForMatch(pattern_v6_high_byte, "1:2:3:4:5:6:7:0088")); | 
 |   EXPECT_TRUE(CheckForMatch(pattern_v6_high_byte, "1:2:3:4:5:6:7:FF00")); | 
 |   EXPECT_FALSE(CheckForMatch(pattern_v6_high_byte, "1:2:3:4:5:6:7:FF01")); | 
 | } | 
 |  | 
 | TEST(IPPatternTest, InvalidPatterns) { | 
 |   EXPECT_FALSE(IsValidPattern("1:2:3:4:5:6:7:8:9"));  // Too long. | 
 |   EXPECT_FALSE(IsValidPattern("1:2:3:4:5:6:7"));      // Too Short | 
 |   EXPECT_FALSE(IsValidPattern("1:2:3:4:5:6:7:H"));    // Non-hex. | 
 |   EXPECT_FALSE(IsValidPattern("1:G:3:4:5:6:7:8"));    // Non-hex. | 
 |  | 
 |   EXPECT_FALSE(IsValidPattern("1.2.3.4.5"));  // Too long | 
 |   EXPECT_FALSE(IsValidPattern("1.2.3"));  // Too short | 
 |   EXPECT_FALSE(IsValidPattern("1.2.3.A"));  // Non-decimal. | 
 |   EXPECT_FALSE(IsValidPattern("1.A.3.4"));  // Non-decimal | 
 |   EXPECT_FALSE(IsValidPattern("1.256.3.4"));  // Out of range | 
 | } | 
 |  | 
 | }  // namespace | 
 |  | 
 | }  // namespace net |