scheme_host_port_matcher_rule_unittest.cc 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. // Copyright 2020 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. #include "net/base/scheme_host_port_matcher_rule.h"
  5. #include "testing/gtest/include/gtest/gtest.h"
  6. namespace net {
  7. namespace {
  8. TEST(SchemeHostPortMatcherRuleTest,
  9. SchemeHostPortMatcherHostnamePatternRule_HostOnlyRule) {
  10. std::unique_ptr<SchemeHostPortMatcherRule> rule =
  11. SchemeHostPortMatcherRule::FromUntrimmedRawString("wWw.gOogle.com");
  12. EXPECT_EQ("www.google.com", rule->ToString());
  13. // non-hostname components don't matter.
  14. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  15. rule->Evaluate(GURL("http://www.google.com")));
  16. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  17. rule->Evaluate(GURL("https://www.google.com:81")));
  18. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  19. rule->Evaluate(GURL("ftp://www.google.com:99")));
  20. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  21. rule->Evaluate(GURL("http://www.google.com/x/y?q#h")));
  22. // Hostname must match.
  23. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  24. rule->Evaluate(GURL("http://foo.www.google.com")));
  25. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  26. rule->Evaluate(GURL("http://xxx.google.com")));
  27. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  28. rule->Evaluate(GURL("http://google.com")));
  29. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  30. rule->Evaluate(GURL("http://www.google.com.baz.org")));
  31. }
  32. TEST(SchemeHostPortMatcherRuleTest,
  33. SchemeHostPortMatcherHostnamePatternRule_BasicDomain) {
  34. std::unique_ptr<SchemeHostPortMatcherRule> rule =
  35. SchemeHostPortMatcherRule::FromUntrimmedRawString(".gOOgle.com");
  36. EXPECT_EQ("*.google.com", rule->ToString());
  37. // non-hostname components don't matter.
  38. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  39. rule->Evaluate(GURL("http://www.google.com")));
  40. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  41. rule->Evaluate(GURL("https://a.google.com:81")));
  42. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  43. rule->Evaluate(GURL("ftp://www.google.com:99")));
  44. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  45. rule->Evaluate(GURL("http://foo.google.com/x/y?q")));
  46. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  47. rule->Evaluate(GURL("http://foo:bar@baz.google.com#x")));
  48. // Hostname must be a strict "ends with" match.
  49. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  50. rule->Evaluate(GURL("http://google.com")));
  51. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  52. rule->Evaluate(GURL("http://www.google.com.baz.org")));
  53. }
  54. TEST(SchemeHostPortMatcherRuleTest,
  55. SchemeHostPortMatcherHostnamePatternRule_BasicDomainWithPort) {
  56. std::unique_ptr<SchemeHostPortMatcherRule> rule =
  57. SchemeHostPortMatcherRule::FromUntrimmedRawString("*.GOOGLE.com:80");
  58. EXPECT_EQ("*.google.com:80", rule->ToString());
  59. // non-hostname components don't matter.
  60. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  61. rule->Evaluate(GURL("http://www.google.com")));
  62. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  63. rule->Evaluate(GURL("https://a.google.com:80?x")));
  64. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  65. rule->Evaluate(GURL("https://a.google.com:80/x/y?q#f")));
  66. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  67. rule->Evaluate(GURL("ftp://www.google.com:80")));
  68. // Hostname must be a strict "ends with" match.
  69. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  70. rule->Evaluate(GURL("http://google.com")));
  71. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  72. rule->Evaluate(GURL("http://www.google.com.baz.org")));
  73. // Port must match.
  74. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  75. rule->Evaluate(GURL("http://www.google.com:90")));
  76. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  77. rule->Evaluate(GURL("https://www.google.com")));
  78. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  79. rule->Evaluate(GURL("https://ftp.google.com")));
  80. }
  81. TEST(SchemeHostPortMatcherRuleTest,
  82. SchemeHostPortMatcherHostnamePatternRule_MatchAll) {
  83. std::unique_ptr<SchemeHostPortMatcherRule> rule =
  84. SchemeHostPortMatcherRule::FromUntrimmedRawString("*");
  85. EXPECT_EQ("*", rule->ToString());
  86. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  87. rule->Evaluate(GURL("http://www.google.com")));
  88. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  89. rule->Evaluate(GURL("ftp://www.foobar.com:99")));
  90. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  91. rule->Evaluate(GURL("https://a.google.com:80/?x")));
  92. }
  93. TEST(SchemeHostPortMatcherRuleTest,
  94. SchemeHostPortMatcherHostnamePatternRule_HttpScheme) {
  95. std::unique_ptr<SchemeHostPortMatcherRule> rule =
  96. SchemeHostPortMatcherRule::FromUntrimmedRawString(
  97. "http://www.google.com");
  98. EXPECT_EQ("http://www.google.com", rule->ToString());
  99. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  100. rule->Evaluate(GURL("http://www.google.com")));
  101. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  102. rule->Evaluate(GURL("http://www.google.com/foo")));
  103. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  104. rule->Evaluate(GURL("http://www.google.com:99")));
  105. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  106. rule->Evaluate(GURL("http://foo.www.google.com")));
  107. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  108. rule->Evaluate(GURL("https://www.google.com")));
  109. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  110. rule->Evaluate(GURL("ftp://www.google.com")));
  111. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  112. rule->Evaluate(GURL("http://www.google.com.org")));
  113. }
  114. TEST(SchemeHostPortMatcherRuleTest,
  115. SchemeHostPortMatcherHostnamePatternRule_HttpOnlyWithWildcard) {
  116. std::unique_ptr<SchemeHostPortMatcherRule> rule =
  117. SchemeHostPortMatcherRule::FromUntrimmedRawString(
  118. "http://*www.GOOGLE.com");
  119. EXPECT_EQ("http://*www.google.com", rule->ToString());
  120. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  121. rule->Evaluate(GURL("http://www.google.com/foo")));
  122. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  123. rule->Evaluate(GURL("http://www.google.com:99")));
  124. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  125. rule->Evaluate(GURL("http://foo.www.google.com")));
  126. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  127. rule->Evaluate(GURL("https://www.google.com")));
  128. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  129. rule->Evaluate(GURL("ftp://www.google.com")));
  130. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  131. rule->Evaluate(GURL("http://www.google.com.org")));
  132. }
  133. TEST(SchemeHostPortMatcherRuleTest,
  134. SchemeHostPortMatcherHostnamePatternRule_PunnyCodeHostname) {
  135. std::unique_ptr<SchemeHostPortMatcherRule> rule =
  136. SchemeHostPortMatcherRule::FromUntrimmedRawString("*.xn--flw351e.cn");
  137. EXPECT_EQ("*.xn--flw351e.cn", rule->ToString());
  138. // Google Chinese site.
  139. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  140. rule->Evaluate(GURL("http://www.谷歌.cn")));
  141. }
  142. TEST(SchemeHostPortMatcherRuleTest, SuffixMatchingTest) {
  143. // foo1.com, suffix matching rule will match www.foo1.com but the original one
  144. // doesn't.
  145. SchemeHostPortMatcherHostnamePatternRule rule1("", "foo1.com", -1);
  146. std::unique_ptr<SchemeHostPortMatcherHostnamePatternRule>
  147. suffix_matching_rule = rule1.GenerateSuffixMatchingRule();
  148. EXPECT_EQ("foo1.com", rule1.ToString());
  149. EXPECT_EQ("*foo1.com", suffix_matching_rule->ToString());
  150. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  151. rule1.Evaluate(GURL("http://www.foo1.com")));
  152. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  153. suffix_matching_rule->Evaluate(GURL("http://www.foo1.com")));
  154. // .foo2.com, suffix matching rule will match www.foo2.com but the original
  155. // one doesn't.
  156. SchemeHostPortMatcherHostnamePatternRule rule2("", ".foo2.com", -1);
  157. suffix_matching_rule = rule2.GenerateSuffixMatchingRule();
  158. EXPECT_EQ(".foo2.com", rule2.ToString());
  159. EXPECT_EQ("*.foo2.com", suffix_matching_rule->ToString());
  160. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  161. rule2.Evaluate(GURL("http://www.foo2.com")));
  162. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  163. suffix_matching_rule->Evaluate(GURL("http://www.foo2.com")));
  164. // *foobar.com:80, this is already a suffix matching rule.
  165. SchemeHostPortMatcherHostnamePatternRule rule3("", "*foobar.com", 80);
  166. suffix_matching_rule = rule3.GenerateSuffixMatchingRule();
  167. EXPECT_EQ("*foobar.com:80", rule3.ToString());
  168. EXPECT_EQ("*foobar.com:80", suffix_matching_rule->ToString());
  169. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  170. rule3.Evaluate(GURL("http://www.foobar.com:80")));
  171. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  172. suffix_matching_rule->Evaluate(GURL("http://www.foobar.com:80")));
  173. // *.foo, this is already a suffix matching rule.
  174. SchemeHostPortMatcherHostnamePatternRule rule4("", "*.foo", -1);
  175. suffix_matching_rule = rule4.GenerateSuffixMatchingRule();
  176. EXPECT_EQ("*.foo", rule4.ToString());
  177. EXPECT_EQ("*.foo", suffix_matching_rule->ToString());
  178. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  179. rule4.Evaluate(GURL("http://www.foo")));
  180. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  181. suffix_matching_rule->Evaluate(GURL("http://www.foo")));
  182. // http://baz, suffix matching works for host part only.
  183. SchemeHostPortMatcherHostnamePatternRule rule5("http", "baz", -1);
  184. suffix_matching_rule = rule5.GenerateSuffixMatchingRule();
  185. EXPECT_EQ("http://baz", rule5.ToString());
  186. EXPECT_EQ("http://*baz", suffix_matching_rule->ToString());
  187. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  188. rule5.Evaluate(GURL("http://foobaz")));
  189. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  190. suffix_matching_rule->Evaluate(GURL("http://foobaz")));
  191. }
  192. TEST(SchemeHostPortMatcherRuleTest, SchemeHostPortMatcherIPHostRule_IPv4) {
  193. std::unique_ptr<SchemeHostPortMatcherRule> rule =
  194. SchemeHostPortMatcherRule::FromUntrimmedRawString("192.168.1.1");
  195. EXPECT_EQ("192.168.1.1", rule->ToString());
  196. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  197. rule->Evaluate(GURL("http://192.168.1.1")));
  198. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  199. rule->Evaluate(GURL("http://192.168.1.1:90")));
  200. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  201. rule->Evaluate(GURL("http://192.168.1.1:90/x/y?q")));
  202. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  203. rule->Evaluate(GURL("http://192.168.1.1:90/x/y?q#h")));
  204. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  205. rule->Evaluate(GURL("http://www.google.com")));
  206. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  207. rule->Evaluate(GURL("http://sup.192.168.1.1")));
  208. }
  209. TEST(SchemeHostPortMatcherRuleTest,
  210. SchemeHostPortMatcherIPHostRule_IPv4WithPort) {
  211. std::unique_ptr<SchemeHostPortMatcherRule> rule =
  212. SchemeHostPortMatcherRule::FromUntrimmedRawString("192.168.1.1:33");
  213. EXPECT_EQ("192.168.1.1:33", rule->ToString());
  214. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  215. rule->Evaluate(GURL("http://192.168.1.1:33")));
  216. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  217. rule->Evaluate(GURL("http://192.168.1.1:33/x/y?q#h")));
  218. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  219. rule->Evaluate(GURL("http://192.168.1.1")));
  220. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  221. rule->Evaluate(GURL("http://192.168.1.1:90")));
  222. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  223. rule->Evaluate(GURL("http://www.google.com")));
  224. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  225. rule->Evaluate(GURL("http://sup.192.168.1.1")));
  226. }
  227. TEST(SchemeHostPortMatcherRuleTest,
  228. SchemeHostPortMatcherIPHostRule_IPv4WithScheme) {
  229. std::unique_ptr<SchemeHostPortMatcherRule> rule =
  230. SchemeHostPortMatcherRule::FromUntrimmedRawString("http://192.168.1.1");
  231. EXPECT_EQ("http://192.168.1.1", rule->ToString());
  232. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  233. rule->Evaluate(GURL("http://192.168.1.1")));
  234. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  235. rule->Evaluate(GURL("http://192.168.1.1:90")));
  236. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  237. rule->Evaluate(GURL("http://192.168.1.1:90/x/y?q#h")));
  238. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  239. rule->Evaluate(GURL("ftp://192.168.1.1")));
  240. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  241. rule->Evaluate(GURL("https://192.168.1.1")));
  242. }
  243. TEST(SchemeHostPortMatcherRuleTest, SchemeHostPortMatcherIPHostRule_IPv6) {
  244. std::unique_ptr<SchemeHostPortMatcherRule> rule =
  245. SchemeHostPortMatcherRule::FromUntrimmedRawString(
  246. "[3ffe:2a00:100:7031:0:0::1]");
  247. // Note that the IPv6 address is canonicalized.
  248. EXPECT_EQ("[3ffe:2a00:100:7031::1]", rule->ToString());
  249. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  250. rule->Evaluate(GURL("http://[3ffe:2a00:100:7031::1]")));
  251. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  252. rule->Evaluate(GURL("http://[3ffe:2a00:100:7031::1]:33")));
  253. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  254. rule->Evaluate(GURL("http://[3ffe:2a00:100:7031::1]:33/x/y?q#h")));
  255. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  256. rule->Evaluate(GURL("http://192.168.1.1")));
  257. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  258. rule->Evaluate(GURL("http://192.168.1.1:90")));
  259. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  260. rule->Evaluate(GURL("http://www.google.com")));
  261. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  262. rule->Evaluate(GURL("http://sup.192.168.1.1")));
  263. }
  264. TEST(SchemeHostPortMatcherRuleTest,
  265. SchemeHostPortMatcherIPHostRule_IPv6WithPort) {
  266. std::unique_ptr<SchemeHostPortMatcherRule> rule =
  267. SchemeHostPortMatcherRule::FromUntrimmedRawString(
  268. "[3ffe:2a00:100:7031:0:0::1]:33");
  269. // Note that the IPv6 address is canonicalized.
  270. EXPECT_EQ("[3ffe:2a00:100:7031::1]:33", rule->ToString());
  271. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  272. rule->Evaluate(GURL("http://[3ffe:2a00:100:7031::1]:33")));
  273. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  274. rule->Evaluate(GURL("http://[3ffe:2a00:100:7031::1]:33/x/y?q#h")));
  275. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  276. rule->Evaluate(GURL("http://[3ffe:2a00:100:7031::1]")));
  277. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  278. rule->Evaluate(GURL("http://192.168.1.1")));
  279. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  280. rule->Evaluate(GURL("http://192.168.1.1:90")));
  281. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  282. rule->Evaluate(GURL("http://www.google.com")));
  283. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  284. rule->Evaluate(GURL("http://sup.192.168.1.1")));
  285. }
  286. TEST(SchemeHostPortMatcherRuleTest,
  287. SchemeHostPortMatcherIPHostRule_IPv6WithScheme) {
  288. std::unique_ptr<SchemeHostPortMatcherRule> rule =
  289. SchemeHostPortMatcherRule::FromUntrimmedRawString(
  290. "https://[3ffe:2a00:100:7031:0:0::1]");
  291. // Note that the IPv6 address is canonicalized.
  292. EXPECT_EQ("https://[3ffe:2a00:100:7031::1]", rule->ToString());
  293. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  294. rule->Evaluate(GURL("https://[3ffe:2a00:100:7031::1]")));
  295. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  296. rule->Evaluate(GURL("https://[3ffe:2a00:100:7031::1]:33")));
  297. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  298. rule->Evaluate(GURL("https://[3ffe:2a00:100:7031::1]:33/x/y?q#h")));
  299. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  300. rule->Evaluate(GURL("http://[3ffe:2a00:100:7031::1]")));
  301. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  302. rule->Evaluate(GURL("ftp://[3ffe:2a00:100:7031::1]")));
  303. }
  304. TEST(SchemeHostPortMatcherRuleTest, SchemeHostPortMatcherIPBlockRule_IPv4) {
  305. std::unique_ptr<SchemeHostPortMatcherRule> rule =
  306. SchemeHostPortMatcherRule::FromUntrimmedRawString("192.168.1.1/16");
  307. EXPECT_EQ("192.168.1.1/16", rule->ToString());
  308. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  309. rule->Evaluate(GURL("http://192.168.1.1")));
  310. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  311. rule->Evaluate(GURL("http://192.168.4.4")));
  312. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  313. rule->Evaluate(GURL("http://192.168.0.0:81")));
  314. // Test that an IPv4 mapped IPv6 literal matches an IPv4 CIDR rule.
  315. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  316. rule->Evaluate(GURL("http://[::ffff:192.168.11.11]")));
  317. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  318. rule->Evaluate(GURL("http://foobar.com")));
  319. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  320. rule->Evaluate(GURL("http://192.169.1.1")));
  321. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  322. rule->Evaluate(GURL("http://xxx.192.168.1.1")));
  323. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  324. rule->Evaluate(GURL("http://192.168.1.1.xx")));
  325. }
  326. TEST(SchemeHostPortMatcherRuleTest, SchemeHostPortMatcherIPBlockRule_IPv6) {
  327. std::unique_ptr<SchemeHostPortMatcherRule> rule =
  328. SchemeHostPortMatcherRule::FromUntrimmedRawString("a:b:c:d::/48");
  329. EXPECT_EQ("a:b:c:d::/48", rule->ToString());
  330. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  331. rule->Evaluate(GURL("http://[A:b:C:9::]")));
  332. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  333. rule->Evaluate(GURL("http://foobar.com")));
  334. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  335. rule->Evaluate(GURL("http://192.168.1.1")));
  336. // Test that an IPv4 literal matches an IPv4 mapped IPv6 CIDR rule.
  337. // This is the IPv4 mapped equivalent to 192.168.1.1/16.
  338. rule = std::make_unique<SchemeHostPortMatcherIPBlockRule>(
  339. "::ffff:192.168.1.1/112", "",
  340. IPAddress(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff,
  341. 192, 168, 1, 1),
  342. 112);
  343. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  344. rule->Evaluate(GURL("http://[::ffff:192.168.1.3]")));
  345. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  346. rule->Evaluate(GURL("http://192.168.11.11")));
  347. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  348. rule->Evaluate(GURL("http://10.10.1.1")));
  349. // Test using an IP range that is close to IPv4 mapped, but not
  350. // quite. Should not result in matches.
  351. rule = std::make_unique<SchemeHostPortMatcherIPBlockRule>(
  352. "::fffe:192.168.1.1/112", "",
  353. IPAddress(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe,
  354. 192, 168, 1, 1),
  355. 112);
  356. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  357. rule->Evaluate(GURL("http://[::fffe:192.168.1.3]")));
  358. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  359. rule->Evaluate(GURL("http://[::ffff:192.168.1.3]")));
  360. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  361. rule->Evaluate(GURL("http://192.168.11.11")));
  362. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  363. rule->Evaluate(GURL("http://10.10.1.1")));
  364. }
  365. TEST(SchemeHostPortMatcherRuleTest, ParseWildcardAtStart) {
  366. std::unique_ptr<SchemeHostPortMatcherRule> rule =
  367. SchemeHostPortMatcherRule::FromUntrimmedRawString("*.org:443");
  368. EXPECT_EQ("*.org:443", rule->ToString());
  369. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  370. rule->Evaluate(GURL("https://example.org:443")));
  371. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  372. rule->Evaluate(GURL("https://example.org")));
  373. EXPECT_EQ(SchemeHostPortMatcherResult::kInclude,
  374. rule->Evaluate(GURL("http://foo.org:443")));
  375. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  376. rule->Evaluate(GURL("https://example.org:80")));
  377. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  378. rule->Evaluate(GURL("https://example.com:80")));
  379. EXPECT_EQ(SchemeHostPortMatcherResult::kNoMatch,
  380. rule->Evaluate(GURL("https://example.orgg:80")));
  381. }
  382. TEST(SchemeHostPortMatcherRuleTest, ParseInvalidPort) {
  383. std::unique_ptr<SchemeHostPortMatcherRule> rule =
  384. SchemeHostPortMatcherRule::FromUntrimmedRawString("*.com:+443");
  385. EXPECT_EQ(nullptr, rule);
  386. rule = SchemeHostPortMatcherRule::FromUntrimmedRawString("*.com:-443");
  387. EXPECT_EQ(nullptr, rule);
  388. rule = SchemeHostPortMatcherRule::FromUntrimmedRawString("*.com:0x443");
  389. EXPECT_EQ(nullptr, rule);
  390. }
  391. // Test that parsing an IPv6 range given a bracketed literal is not supported.
  392. // Whether IPv6 literals need to be bracketed or not is pretty much a coin toss
  393. // depending on the context, and here it is expected to be unbracketed to match
  394. // macOS. It would be fine to support bracketed too, however none of the
  395. // grammars we parse need that.
  396. TEST(SchemeHostPortMatcherRuleTest, ParseBracketedCIDR_IPv6) {
  397. std::unique_ptr<SchemeHostPortMatcherRule> rule =
  398. SchemeHostPortMatcherRule::FromUntrimmedRawString("[a:b:c:d::]/48");
  399. EXPECT_EQ(nullptr, rule);
  400. }
  401. TEST(SchemeHostPortMatcherRuleTest, BadInputs) {
  402. std::unique_ptr<SchemeHostPortMatcherRule> rule =
  403. SchemeHostPortMatcherRule::FromUntrimmedRawString("://");
  404. EXPECT_EQ(nullptr, rule);
  405. rule = SchemeHostPortMatcherRule::FromUntrimmedRawString(" ");
  406. EXPECT_EQ(nullptr, rule);
  407. rule = SchemeHostPortMatcherRule::FromUntrimmedRawString("http://");
  408. EXPECT_EQ(nullptr, rule);
  409. rule = SchemeHostPortMatcherRule::FromUntrimmedRawString("*.foo.com:-34");
  410. EXPECT_EQ(nullptr, rule);
  411. }
  412. } // anonymous namespace
  413. } // namespace net