1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "net/base/ip_pattern.h" 6 7 #include "testing/gtest/include/gtest/gtest.h" 8 9 namespace net { 10 11 namespace { 12 13 bool IsValidPattern(const std::string& pattern_text) { 14 IPPattern pattern; 15 return pattern.ParsePattern(pattern_text); 16 } 17 18 bool CheckForMatch(const IPPattern& pattern, std::string address_text) { 19 IPAddressNumber address; 20 EXPECT_TRUE(ParseIPLiteralToNumber(address_text, &address)); 21 return pattern.Match(address); 22 } 23 24 TEST(IPPatternTest, EmptyPattern) { 25 IPPattern pattern; 26 IPAddressNumber ipv4_address1; 27 EXPECT_TRUE(ParseIPLiteralToNumber("1.2.3.4", &ipv4_address1)); 28 IPAddressNumber ipv6_address1; 29 EXPECT_TRUE(ParseIPLiteralToNumber("1:2:3:4:5:6:7:8", &ipv6_address1)); 30 31 EXPECT_FALSE(pattern.Match(ipv4_address1)); 32 EXPECT_FALSE(pattern.Match(ipv6_address1)); 33 } 34 35 TEST(IPPatternTest, PerfectMatchPattern) { 36 IPPattern pattern_v4; 37 std::string ipv4_text1("1.2.3.4"); 38 EXPECT_TRUE(pattern_v4.ParsePattern(ipv4_text1)); 39 EXPECT_TRUE(pattern_v4.is_ipv4()); 40 EXPECT_TRUE(CheckForMatch(pattern_v4, ipv4_text1)); 41 42 IPPattern pattern_v6; 43 std::string ipv6_text1("1:2:3:4:5:6:7:8"); 44 EXPECT_TRUE(pattern_v6.ParsePattern(ipv6_text1)); 45 EXPECT_FALSE(pattern_v6.is_ipv4()); 46 EXPECT_TRUE(CheckForMatch(pattern_v6, ipv6_text1)); 47 48 // Also check that there is no confusion betwene v6 and v4, despite having 49 // similar values in some sense. 50 EXPECT_FALSE(CheckForMatch(pattern_v4, ipv6_text1)); 51 EXPECT_FALSE(CheckForMatch(pattern_v6, ipv4_text1)); 52 } 53 54 TEST(IPPatternTest, AlternativeMatchPattern) { 55 IPPattern pattern_v4; 56 EXPECT_TRUE(pattern_v4.ParsePattern("1.2.[3,5].4")); 57 EXPECT_TRUE(pattern_v4.is_ipv4()); 58 EXPECT_FALSE(CheckForMatch(pattern_v4, "1.2.2.4")); 59 EXPECT_TRUE(CheckForMatch(pattern_v4, "1.2.3.4")); 60 EXPECT_FALSE(CheckForMatch(pattern_v4, "1.2.4.4")); 61 EXPECT_TRUE(CheckForMatch(pattern_v4, "1.2.5.4")); 62 EXPECT_FALSE(CheckForMatch(pattern_v4, "1.2.6.4")); 63 64 IPPattern pattern_v6; 65 EXPECT_TRUE(pattern_v6.ParsePattern("1:2fab:3:4:5:[6,8]:7:8")); 66 EXPECT_FALSE(pattern_v6.is_ipv4()); 67 EXPECT_FALSE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:5:7:8")); 68 EXPECT_TRUE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:6:7:8")); 69 EXPECT_FALSE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:7:7:8")); 70 EXPECT_TRUE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:8:7:8")); 71 EXPECT_FALSE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:9:7:8")); 72 } 73 74 TEST(IPPatternTest, RangeMatchPattern) { 75 IPPattern pattern_v4; 76 EXPECT_TRUE(pattern_v4.ParsePattern("1.2.[3-5].4")); 77 EXPECT_TRUE(pattern_v4.is_ipv4()); 78 EXPECT_FALSE(CheckForMatch(pattern_v4, "1.2.2.4")); 79 EXPECT_TRUE(CheckForMatch(pattern_v4, "1.2.3.4")); 80 EXPECT_TRUE(CheckForMatch(pattern_v4, "1.2.4.4")); 81 EXPECT_TRUE(CheckForMatch(pattern_v4, "1.2.5.4")); 82 EXPECT_FALSE(CheckForMatch(pattern_v4, "1.2.6.4")); 83 84 IPPattern pattern_v6; 85 EXPECT_TRUE(pattern_v6.ParsePattern("1:2fab:3:4:5:[6-8]:7:8")); 86 EXPECT_FALSE(pattern_v6.is_ipv4()); 87 EXPECT_FALSE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:5:7:8")); 88 EXPECT_TRUE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:6:7:8")); 89 EXPECT_TRUE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:7:7:8")); 90 EXPECT_TRUE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:8:7:8")); 91 EXPECT_FALSE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:9:7:8")); 92 } 93 94 TEST(IPPatternTest, WildCardMatchPattern) { 95 // Use two ranges, and check that only getting both right is a match. 96 IPPattern pattern_v4; 97 EXPECT_TRUE(pattern_v4.ParsePattern("1.2.*.4")); 98 EXPECT_TRUE(pattern_v4.is_ipv4()); 99 EXPECT_FALSE(CheckForMatch(pattern_v4, "1.2.2.255")); 100 EXPECT_TRUE(CheckForMatch(pattern_v4, "1.2.255.4")); 101 EXPECT_TRUE(CheckForMatch(pattern_v4, "1.2.0.4")); 102 103 IPPattern pattern_v6; 104 EXPECT_TRUE(pattern_v6.ParsePattern("1:2fab:3:4:5:*:7:8")); 105 EXPECT_FALSE(pattern_v6.is_ipv4()); 106 EXPECT_FALSE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:5:7:8888")); 107 EXPECT_TRUE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:FFFF:7:8")); 108 EXPECT_TRUE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:9999:7:8")); 109 } 110 111 TEST(IPPatternTest, MultiRangeMatchPattern) { 112 // Use two ranges, and check that only getting both right is a match. 113 // This ensures that the right component range is matched against the desired 114 // component. 115 IPPattern pattern_v4; 116 EXPECT_TRUE(pattern_v4.ParsePattern("1.[2-3].3.[4-5]")); 117 EXPECT_TRUE(pattern_v4.is_ipv4()); 118 EXPECT_FALSE(CheckForMatch(pattern_v4, "1.4.3.6")); 119 EXPECT_FALSE(CheckForMatch(pattern_v4, "1.2.3.6")); 120 EXPECT_FALSE(CheckForMatch(pattern_v4, "1.4.3.4")); 121 EXPECT_TRUE(CheckForMatch(pattern_v4, "1.2.3.4")); 122 123 IPPattern pattern_v6; 124 EXPECT_TRUE(pattern_v6.ParsePattern("1:2fab:3:4:[5-7]:6:7:[8-A]")); 125 EXPECT_FALSE(pattern_v6.is_ipv4()); 126 EXPECT_FALSE(CheckForMatch(pattern_v6, "1:2fab:3:4:4:5:7:F")); 127 EXPECT_FALSE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:5:7:F")); 128 EXPECT_FALSE(CheckForMatch(pattern_v6, "1:2fab:3:4:4:6:7:A")); 129 EXPECT_TRUE(CheckForMatch(pattern_v6, "1:2fab:3:4:5:6:7:A")); 130 } 131 132 TEST(IPPatternTest, BytoOrderInIPv6Ranges) { 133 IPPattern pattern_v6_low_byte; 134 EXPECT_TRUE(pattern_v6_low_byte.ParsePattern("1:2:3:4:5:6:7:[0-FF]")); 135 EXPECT_TRUE(CheckForMatch(pattern_v6_low_byte, "1:2:3:4:5:6:7:0088")); 136 EXPECT_FALSE(CheckForMatch(pattern_v6_low_byte, "1:2:3:4:5:6:7:8800")); 137 138 IPPattern pattern_v6_high_byte; 139 EXPECT_TRUE(pattern_v6_high_byte.ParsePattern("1:2:3:4:5:6:7:[0-FF00]")); 140 EXPECT_TRUE(CheckForMatch(pattern_v6_high_byte, "1:2:3:4:5:6:7:0088")); 141 EXPECT_TRUE(CheckForMatch(pattern_v6_high_byte, "1:2:3:4:5:6:7:FF00")); 142 EXPECT_FALSE(CheckForMatch(pattern_v6_high_byte, "1:2:3:4:5:6:7:FF01")); 143 } 144 145 TEST(IPPatternTest, InvalidPatterns) { 146 EXPECT_FALSE(IsValidPattern("1:2:3:4:5:6:7:8:9")); // Too long. 147 EXPECT_FALSE(IsValidPattern("1:2:3:4:5:6:7")); // Too Short 148 EXPECT_FALSE(IsValidPattern("1:2:3:4:5:6:7:H")); // Non-hex. 149 EXPECT_FALSE(IsValidPattern("1:G:3:4:5:6:7:8")); // Non-hex. 150 151 EXPECT_FALSE(IsValidPattern("1.2.3.4.5")); // Too long 152 EXPECT_FALSE(IsValidPattern("1.2.3")); // Too short 153 EXPECT_FALSE(IsValidPattern("1.2.3.A")); // Non-decimal. 154 EXPECT_FALSE(IsValidPattern("1.A.3.4")); // Non-decimal 155 EXPECT_FALSE(IsValidPattern("1.256.3.4")); // Out of range 156 } 157 158 } // namespace 159 160 } // namespace net 161