Home | History | Annotate | Download | only in base
      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