OLD | NEW |
| (Empty) |
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 | |
OLD | NEW |