• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2021 The gRPC Authors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package io.grpc.xds.internal;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import com.google.re2j.Pattern;
22 import io.grpc.xds.internal.Matchers.CidrMatcher;
23 import io.grpc.xds.internal.Matchers.HeaderMatcher;
24 import io.grpc.xds.internal.Matchers.HeaderMatcher.Range;
25 import io.grpc.xds.internal.Matchers.StringMatcher;
26 import java.net.InetAddress;
27 import org.junit.Test;
28 import org.junit.runner.RunWith;
29 import org.junit.runners.JUnit4;
30 
31 @RunWith(JUnit4.class)
32 public class MatcherTest {
33 
34   @Test
ipMatcher_ipv4()35   public void ipMatcher_ipv4() throws Exception {
36     CidrMatcher matcher = CidrMatcher.create(InetAddress.getByName("10.10.24.10"), 20);
37     assertThat(matcher.matches(InetAddress.getByName("::0"))).isFalse();
38     assertThat(matcher.matches(InetAddress.getByName("10.10.20.0"))).isTrue();
39     assertThat(matcher.matches(InetAddress.getByName("10.10.16.0"))).isTrue();
40     assertThat(matcher.matches(InetAddress.getByName("10.10.24.10"))).isTrue();
41     assertThat(matcher.matches(InetAddress.getByName("10.10.31.0"))).isTrue();
42     assertThat(matcher.matches(InetAddress.getByName("10.10.17.0"))).isTrue();
43     assertThat(matcher.matches(InetAddress.getByName("10.32.20.0"))).isFalse();
44     assertThat(matcher.matches(InetAddress.getByName("10.10.40.0"))).isFalse();
45     matcher = CidrMatcher.create(InetAddress.getByName("0.0.0.0"), 20);
46     assertThat(matcher.matches(InetAddress.getByName("10.32.20.0"))).isFalse();
47     assertThat(matcher.matches(InetAddress.getByName("0.0.31.0"))).isFalse();
48     assertThat(matcher.matches(InetAddress.getByName("0.0.15.0"))).isTrue();
49     assertThat(matcher.matches(null)).isFalse();
50   }
51 
52   @Test
ipMatcher_ipv6()53   public void ipMatcher_ipv6() throws Exception {
54     CidrMatcher matcher = CidrMatcher.create(InetAddress.getByName("2012:00fe:d808::"), 36);
55     assertThat(matcher.matches(InetAddress.getByName("0.0.0.0"))).isFalse();
56     assertThat(matcher.matches(InetAddress.getByName("2012:00fe:d000::0"))).isTrue();
57     assertThat(matcher.matches(InetAddress.getByName("2012:00fe:d808::"))).isTrue();
58     assertThat(matcher.matches(InetAddress.getByName("2012:00fe:da81:0909:0008:4018:e930:b019")))
59         .isTrue();
60     assertThat(matcher.matches(InetAddress.getByName("2013:00fe:d000::0"))).isFalse();
61   }
62 
63   @Test
stringMatcher()64   public void stringMatcher() {
65     StringMatcher matcher = StringMatcher.forExact("essence", false);
66     assertThat(matcher.matches("elite")).isFalse();
67     assertThat(matcher.matches("ess")).isFalse();
68     assertThat(matcher.matches("")).isFalse();
69     assertThat(matcher.matches("essential")).isFalse();
70     assertThat(matcher.matches("Essence")).isFalse();
71     assertThat(matcher.matches("essence")).isTrue();
72     assertThat(matcher.matches((String)null)).isFalse();
73     matcher = StringMatcher.forExact("essence", true);
74     assertThat(matcher.matches("Essence")).isTrue();
75     assertThat(matcher.matches("essence")).isTrue();
76     matcher = StringMatcher.forExact("", true);
77     assertThat(matcher.matches("essence")).isFalse();
78     assertThat(matcher.matches("")).isTrue();
79 
80     matcher = StringMatcher.forPrefix("Ess", false);
81     assertThat(matcher.matches("elite")).isFalse();
82     assertThat(matcher.matches("ess")).isFalse();
83     assertThat(matcher.matches("")).isFalse();
84     assertThat(matcher.matches("e")).isFalse();
85     assertThat(matcher.matches("essential")).isFalse();
86     assertThat(matcher.matches("Essence")).isTrue();
87     assertThat(matcher.matches("essence")).isFalse();
88     assertThat(matcher.matches((String)null)).isFalse();
89     matcher = StringMatcher.forPrefix("Ess", true);
90     assertThat(matcher.matches("esSEncE")).isTrue();
91     assertThat(matcher.matches("ess")).isTrue();
92     assertThat(matcher.matches("ES")).isFalse();
93     matcher = StringMatcher.forPrefix("", false);
94     assertThat(matcher.matches("elite")).isTrue();
95 
96     matcher = StringMatcher.forSuffix("ess", false);
97     assertThat(matcher.matches("elite")).isFalse();
98     assertThat(matcher.matches("es")).isFalse();
99     assertThat(matcher.matches("")).isFalse();
100     assertThat(matcher.matches("ess")).isTrue();
101     assertThat(matcher.matches("Excess")).isTrue();
102     assertThat(matcher.matches("ExcesS")).isFalse();
103     assertThat(matcher.matches((String)null)).isFalse();
104     matcher = StringMatcher.forSuffix("ess", true);
105     assertThat(matcher.matches("esSEncESs")).isTrue();
106     assertThat(matcher.matches("ess")).isTrue();
107     matcher = StringMatcher.forSuffix("", true);
108     assertThat(matcher.matches("")).isTrue();
109     assertThat(matcher.matches("any")).isTrue();
110 
111     matcher = StringMatcher.forContains("ess");
112     assertThat(matcher.matches("elite")).isFalse();
113     assertThat(matcher.matches("es")).isFalse();
114     assertThat(matcher.matches("")).isFalse();
115     assertThat(matcher.matches("essence")).isTrue();
116     assertThat(matcher.matches("eSs")).isFalse();
117     assertThat(matcher.matches("ExcesS")).isFalse();
118     assertThat(matcher.matches((String)null)).isFalse();
119 
120     matcher = StringMatcher.forSafeRegEx(Pattern.compile("^es*.*"));
121     assertThat(matcher.matches("essence")).isTrue();
122     assertThat(matcher.matches("")).isFalse();
123   }
124 
125   @Test
headerMatcher()126   public void headerMatcher() {
127     HeaderMatcher matcher = HeaderMatcher.forExactValue("version", "v1", false);
128     assertThat(matcher.matches("v1")).isTrue();
129     assertThat(matcher.matches("v2")).isFalse();
130     assertThat(matcher.matches(null)).isFalse();
131 
132     matcher = HeaderMatcher.forExactValue("version", "v1", true);
133     assertThat(matcher.matches("v1")).isFalse();
134     assertThat(matcher.matches( "v2")).isTrue();
135     assertThat(matcher.matches(null)).isFalse();
136 
137     matcher = HeaderMatcher.forPresent("version", true, false);
138     assertThat(matcher.matches("any")).isTrue();
139     assertThat(matcher.matches(null)).isFalse();
140     matcher = HeaderMatcher.forPresent("version", true, true);
141     assertThat(matcher.matches("version")).isFalse();
142     assertThat(matcher.matches(null)).isTrue();
143     matcher = HeaderMatcher.forPresent("version", false, true);
144     assertThat(matcher.matches("tag")).isTrue();
145     assertThat(matcher.matches(null)).isFalse();
146     matcher = HeaderMatcher.forPresent("version", false, false);
147     assertThat(matcher.matches("tag")).isFalse();
148     assertThat(matcher.matches(null)).isTrue();
149 
150     matcher = HeaderMatcher.forPrefix("version", "v2", false);
151     assertThat(matcher.matches("v22")).isTrue();
152     assertThat(matcher.matches(null)).isFalse();
153     matcher = HeaderMatcher.forPrefix("version", "v2", true);
154     assertThat(matcher.matches("v22")).isFalse();
155     assertThat(matcher.matches(null)).isFalse();
156 
157     matcher = HeaderMatcher.forSuffix("version", "v1", false);
158     assertThat(matcher.matches("xv1")).isTrue();
159     assertThat(matcher.matches("v1x")).isFalse();
160     assertThat(matcher.matches(null)).isFalse();
161     matcher = HeaderMatcher.forSuffix("version", "v2", true);
162     assertThat(matcher.matches("xv1")).isTrue();
163     assertThat(matcher.matches("1v2")).isFalse();
164     assertThat(matcher.matches(null)).isFalse();
165 
166     matcher = HeaderMatcher.forContains("version", "v1", false);
167     assertThat(matcher.matches("xv1")).isTrue();
168     assertThat(matcher.matches("1vx")).isFalse();
169     assertThat(matcher.matches(null)).isFalse();
170     matcher = HeaderMatcher.forContains("version", "v1", true);
171     assertThat(matcher.matches("xv1")).isFalse();
172     assertThat(matcher.matches("1vx")).isTrue();
173     assertThat(matcher.matches(null)).isFalse();
174 
175     matcher = HeaderMatcher.forSafeRegEx("version", Pattern.compile("v2.*"), false);
176     assertThat(matcher.matches("v2..")).isTrue();
177     assertThat(matcher.matches("v1")).isFalse();
178     assertThat(matcher.matches(null)).isFalse();
179     matcher = HeaderMatcher.forSafeRegEx("version", Pattern.compile("v1\\..*"), true);
180     assertThat(matcher.matches("v1.43")).isFalse();
181     assertThat(matcher.matches("v2")).isTrue();
182     assertThat(matcher.matches(null)).isFalse();
183 
184     matcher = HeaderMatcher.forRange("version", Range.create(8080L, 8090L), false);
185     assertThat(matcher.matches("8080")).isTrue();
186     assertThat(matcher.matches("1")).isFalse();
187     assertThat(matcher.matches(null)).isFalse();
188     matcher = HeaderMatcher.forRange("version", Range.create(8080L, 8090L), true);
189     assertThat(matcher.matches("1")).isTrue();
190     assertThat(matcher.matches("8080")).isFalse();
191     assertThat(matcher.matches(null)).isFalse();
192 
193     matcher = HeaderMatcher.forString("version", StringMatcher.forExact("v1", true), false);
194     assertThat(matcher.matches("v1")).isTrue();
195     assertThat(matcher.matches("v1x")).isFalse();
196     assertThat(matcher.matches(null)).isFalse();
197     matcher = HeaderMatcher.forString("version", StringMatcher.forExact("v1", true), true);
198     assertThat(matcher.matches("v1x")).isTrue();
199     assertThat(matcher.matches("v1")).isFalse();
200     assertThat(matcher.matches(null)).isFalse();
201   }
202 }
203