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