blob: fc95e0025fbb24e50ae195d8b6f9531f0f0d5aee [file] [log] [blame]
Frank Wange33e4ed2017-06-28 10:01:07 +08001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Frank Wange33e4ed2017-06-28 10:01:07 +08003 *
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
17package org.onosproject.net.flow.criteria;
18
Frank Wange33e4ed2017-06-28 10:01:07 +080019import com.google.common.testing.EqualsTester;
Frank Wange33e4ed2017-06-28 10:01:07 +080020import org.junit.Test;
Carmelo Cascone87892e22017-11-13 16:01:29 -080021import org.onosproject.net.pi.model.PiMatchFieldId;
Frank Wange33e4ed2017-06-28 10:01:07 +080022import org.onosproject.net.pi.runtime.PiExactFieldMatch;
23import org.onosproject.net.pi.runtime.PiFieldMatch;
Frank Wange33e4ed2017-06-28 10:01:07 +080024import org.onosproject.net.pi.runtime.PiLpmFieldMatch;
Daniele Moroc6f2f7f2020-12-18 10:55:57 +010025import org.onosproject.net.pi.runtime.PiOptionalFieldMatch;
Frank Wange33e4ed2017-06-28 10:01:07 +080026import org.onosproject.net.pi.runtime.PiRangeFieldMatch;
27import org.onosproject.net.pi.runtime.PiTernaryFieldMatch;
Frank Wange33e4ed2017-06-28 10:01:07 +080028
Frank Wange33e4ed2017-06-28 10:01:07 +080029import static org.hamcrest.MatcherAssert.assertThat;
30import static org.hamcrest.Matchers.equalTo;
31import static org.hamcrest.Matchers.instanceOf;
32import static org.hamcrest.Matchers.is;
33import static org.hamcrest.Matchers.notNullValue;
34import static org.onlab.util.ImmutableByteSequence.copyFrom;
35
36/**
37 * Unit tests for the PiCriteria class.
38 */
39public class PiCriteriaTest {
40
Carmelo Cascone87892e22017-11-13 16:01:29 -080041 private PiMatchFieldId ethMatchFieldId = PiMatchFieldId.of("ethernet_t.etherType");
42 private byte[] matchExactBytes1 = {0x08, 0x00};
43 private byte[] matchExactBytes2 = {0x08, 0x06};
44 private Criterion matchPiExactByte1 = PiCriterion.builder()
45 .matchExact(ethMatchFieldId, matchExactBytes1).build();
46 private Criterion sameAsMatchPiExactByte1 = PiCriterion.builder()
47 .matchExact(ethMatchFieldId, matchExactBytes1).build();
48 private Criterion matchPiExactByte2 = PiCriterion.builder()
49 .matchExact(ethMatchFieldId, matchExactBytes2).build();
Frank Wange33e4ed2017-06-28 10:01:07 +080050
Carmelo Cascone87892e22017-11-13 16:01:29 -080051 private short matchExactShort1 = 0x800;
52 private short matchExactShort2 = 0x806;
53 private Criterion matchPiExactShort1 = PiCriterion.builder()
54 .matchExact(ethMatchFieldId, matchExactShort1).build();
55 private Criterion sameAsMatchPiExactShort1 = PiCriterion.builder()
56 .matchExact(ethMatchFieldId, matchExactShort1).build();
57 private Criterion matchPiExactShort2 = PiCriterion.builder()
58 .matchExact(ethMatchFieldId, matchExactShort2).build();
Frank Wange33e4ed2017-06-28 10:01:07 +080059
Carmelo Cascone87892e22017-11-13 16:01:29 -080060 private int matchExactInt1 = 0x800;
61 private int matchExactInt2 = 0x806;
62 private Criterion matchPiExactInt1 = PiCriterion.builder()
63 .matchExact(ethMatchFieldId, matchExactInt1).build();
64 private Criterion sameAsMatchPiExactInt1 = PiCriterion.builder()
65 .matchExact(ethMatchFieldId, matchExactInt1).build();
66 private Criterion matchPiExactInt2 = PiCriterion.builder()
67 .matchExact(ethMatchFieldId, matchExactInt2).build();
Frank Wange33e4ed2017-06-28 10:01:07 +080068
Carmelo Cascone87892e22017-11-13 16:01:29 -080069 private long matchExactLong1 = 0x800;
70 private long matchExactLong2 = 0x806;
71 private Criterion matchPiExactLong1 = PiCriterion.builder()
72 .matchExact(ethMatchFieldId, matchExactLong1).build();
73 private Criterion sameAsMatchPiExactLong1 = PiCriterion.builder()
74 .matchExact(ethMatchFieldId, matchExactLong1).build();
75 private Criterion matchPiExactLong2 = PiCriterion.builder()
76 .matchExact(ethMatchFieldId, matchExactLong2).build();
Frank Wange33e4ed2017-06-28 10:01:07 +080077
Daniele Moroc6f2f7f2020-12-18 10:55:57 +010078 private Criterion matchPiOptionalByte1 = PiCriterion.builder()
79 .matchOptional(ethMatchFieldId, matchExactBytes1).build();
80 private Criterion sameAsMatchPiOptionalByte1 = PiCriterion.builder()
81 .matchOptional(ethMatchFieldId, matchExactBytes1).build();
82 private Criterion matchPiOptionalByte2 = PiCriterion.builder()
83 .matchOptional(ethMatchFieldId, matchExactBytes2).build();
84
85 private short matchOptionalShort1 = 0x800;
86 private short matchOptionalShort2 = 0x806;
87 private Criterion matchPiOptionalShort1 = PiCriterion.builder()
88 .matchOptional(ethMatchFieldId, matchOptionalShort1).build();
89 private Criterion sameAsMatchPiOptionalShort1 = PiCriterion.builder()
90 .matchOptional(ethMatchFieldId, matchOptionalShort1).build();
91 private Criterion matchPiOptionalShort2 = PiCriterion.builder()
92 .matchOptional(ethMatchFieldId, matchOptionalShort2).build();
93
94 private int matchOptionalInt1 = 0x800;
95 private int matchOptionalInt2 = 0x806;
96 private Criterion matchPiOptionalInt1 = PiCriterion.builder()
97 .matchOptional(ethMatchFieldId, matchOptionalInt1).build();
98 private Criterion sameAsMatchPiOptionalInt1 = PiCriterion.builder()
99 .matchOptional(ethMatchFieldId, matchOptionalInt1).build();
100 private Criterion matchPiOptionalInt2 = PiCriterion.builder()
101 .matchOptional(ethMatchFieldId, matchOptionalInt2).build();
102
103 private long matchOptionalLong1 = 0x800;
104 private long matchOptionalLong2 = 0x806;
105 private Criterion matchPiOptionalLong1 = PiCriterion.builder()
106 .matchOptional(ethMatchFieldId, matchOptionalLong1).build();
107 private Criterion sameAsMatchPiOptionalLong1 = PiCriterion.builder()
108 .matchOptional(ethMatchFieldId, matchOptionalLong1).build();
109 private Criterion matchPiOptionalLong2 = PiCriterion.builder()
110 .matchOptional(ethMatchFieldId, matchOptionalLong2).build();
111
Carmelo Cascone87892e22017-11-13 16:01:29 -0800112 private PiMatchFieldId ipv4MatchFieldId = PiMatchFieldId.of("ipv4_t.dstAddr");
113 private int mask = 0x00ffffff;
114 private byte[] matchLpmBytes1 = {0x0a, 0x01, 0x01, 0x01};
115 private byte[] matchLpmBytes2 = {0x0a, 0x01, 0x01, 0x02};
116 private Criterion matchPiLpmByte1 = PiCriterion.builder()
117 .matchLpm(ipv4MatchFieldId, matchLpmBytes1, mask).build();
118 private Criterion sameAsMatchPiLpmByte1 = PiCriterion.builder()
119 .matchLpm(ipv4MatchFieldId, matchLpmBytes1, mask).build();
120 private Criterion matchPiLpmByte2 = PiCriterion.builder()
121 .matchLpm(ipv4MatchFieldId, matchLpmBytes2, mask).build();
Frank Wange33e4ed2017-06-28 10:01:07 +0800122
Carmelo Cascone87892e22017-11-13 16:01:29 -0800123 private short matchLpmShort1 = 0x0a0a;
124 private short matchLpmShort2 = 0x0a0b;
125 private Criterion matchPiLpmShort1 = PiCriterion.builder()
126 .matchLpm(ipv4MatchFieldId, matchLpmShort1, mask).build();
127 private Criterion sameAsMatchPiLpmShort1 = PiCriterion.builder()
128 .matchLpm(ipv4MatchFieldId, matchLpmShort1, mask).build();
129 private Criterion matchPiLpmShort2 = PiCriterion.builder()
130 .matchLpm(ipv4MatchFieldId, matchLpmShort2, mask).build();
Frank Wange33e4ed2017-06-28 10:01:07 +0800131
Carmelo Cascone87892e22017-11-13 16:01:29 -0800132 private int matchLpmInt1 = 0x0a010101;
133 private int matchLpmInt2 = 0x0a010102;
134 private Criterion matchPiLpmInt1 = PiCriterion.builder()
135 .matchLpm(ipv4MatchFieldId, matchLpmInt1, mask).build();
136 private Criterion sameAsMatchPiLpmInt1 = PiCriterion.builder()
137 .matchLpm(ipv4MatchFieldId, matchLpmInt1, mask).build();
138 private Criterion matchPiLpmInt2 = PiCriterion.builder()
139 .matchLpm(ipv4MatchFieldId, matchLpmInt2, mask).build();
Frank Wange33e4ed2017-06-28 10:01:07 +0800140
Carmelo Cascone87892e22017-11-13 16:01:29 -0800141 private long matchLpmLong1 = 0x0a010101;
142 private long matchLpmLong2 = 0x0a010102;
143 private Criterion matchPiLpmLong1 = PiCriterion.builder()
144 .matchLpm(ipv4MatchFieldId, matchLpmLong1, mask).build();
145 private Criterion sameAsMatchPiLpmLong1 = PiCriterion.builder()
146 .matchLpm(ipv4MatchFieldId, matchLpmLong1, mask).build();
147 private Criterion matchPiLpmLong2 = PiCriterion.builder()
148 .matchLpm(ipv4MatchFieldId, matchLpmLong2, mask).build();
Frank Wange33e4ed2017-06-28 10:01:07 +0800149
150
Carmelo Cascone87892e22017-11-13 16:01:29 -0800151 private byte[] matchTernaryBytes1 = {0x0a, 0x01, 0x01, 0x01};
152 private byte[] matchTernaryBytes2 = {0x0a, 0x01, 0x01, 0x02};
153 private byte[] matchTernaryMaskBytes = {0x7f, 0x7f, 0x7f, 0x00};
154 private Criterion matchPiTernaryByte1 = PiCriterion.builder()
155 .matchTernary(ipv4MatchFieldId, matchTernaryBytes1, matchTernaryMaskBytes).build();
156 private Criterion sameAsMatchPiTernaryByte1 = PiCriterion.builder()
157 .matchTernary(ipv4MatchFieldId, matchTernaryBytes1, matchTernaryMaskBytes).build();
158 private Criterion matchPiTernaryByte2 = PiCriterion.builder()
159 .matchTernary(ipv4MatchFieldId, matchTernaryBytes2, matchTernaryMaskBytes).build();
Frank Wange33e4ed2017-06-28 10:01:07 +0800160
Carmelo Cascone87892e22017-11-13 16:01:29 -0800161 private short matchTernaryShort1 = 0x0a0a;
162 private short matchTernaryShort2 = 0x0a0b;
163 private short matchTernaryMaskShort = 0xff0;
164 private Criterion matchPiTernaryShort1 = PiCriterion.builder()
165 .matchTernary(ipv4MatchFieldId, matchTernaryShort1, matchTernaryMaskShort).build();
166 private Criterion sameAsMatchPiTernaryShort1 = PiCriterion.builder()
167 .matchTernary(ipv4MatchFieldId, matchTernaryShort1, matchTernaryMaskShort).build();
168 private Criterion matchPiTernaryShort2 = PiCriterion.builder()
169 .matchTernary(ipv4MatchFieldId, matchTernaryShort2, matchTernaryMaskShort).build();
Frank Wange33e4ed2017-06-28 10:01:07 +0800170
Carmelo Cascone87892e22017-11-13 16:01:29 -0800171 private int matchTernaryInt1 = 0x0a010101;
172 private int matchTernaryInt2 = 0x0a010102;
173 private int matchTernaryMaskInt = 0xffff;
174 private Criterion matchPiTernaryInt1 = PiCriterion.builder()
175 .matchTernary(ipv4MatchFieldId, matchTernaryInt1, matchTernaryMaskInt).build();
176 private Criterion sameAsMatchPiTernaryInt1 = PiCriterion.builder()
177 .matchTernary(ipv4MatchFieldId, matchTernaryInt1, matchTernaryMaskInt).build();
178 private Criterion matchPiTernaryInt2 = PiCriterion.builder()
179 .matchTernary(ipv4MatchFieldId, matchTernaryInt2, matchTernaryMaskInt).build();
Frank Wange33e4ed2017-06-28 10:01:07 +0800180
Carmelo Cascone87892e22017-11-13 16:01:29 -0800181 private long matchTernaryLong1 = 0x0a010101;
182 private long matchTernaryLong2 = 0x0a010102;
183 private long matchTernaryMaskLong = 0xffff;
184 private Criterion matchPiTernaryLong1 = PiCriterion.builder()
185 .matchTernary(ipv4MatchFieldId, matchTernaryLong1, matchTernaryMaskLong).build();
186 private Criterion sameAsMatchPiTernaryLong1 = PiCriterion.builder()
187 .matchTernary(ipv4MatchFieldId, matchTernaryLong1, matchTernaryMaskLong).build();
188 private Criterion matchPiTernaryLong2 = PiCriterion.builder()
189 .matchTernary(ipv4MatchFieldId, matchTernaryLong2, matchTernaryMaskLong).build();
Frank Wange33e4ed2017-06-28 10:01:07 +0800190
Carmelo Cascone87892e22017-11-13 16:01:29 -0800191 private byte[] matchRangeBytes1 = {0x10};
192 private byte[] matchRangeBytes2 = {0x20};
193 private byte[] matchRangeHighBytes = {0x30};
194 private Criterion matchPiRangeByte1 = PiCriterion.builder()
195 .matchRange(ipv4MatchFieldId, matchRangeBytes1, matchRangeHighBytes).build();
196 private Criterion sameAsMatchPiRangeByte1 = PiCriterion.builder()
197 .matchRange(ipv4MatchFieldId, matchRangeBytes1, matchRangeHighBytes).build();
198 private Criterion matchPiRangeByte2 = PiCriterion.builder()
199 .matchRange(ipv4MatchFieldId, matchRangeBytes2, matchRangeHighBytes).build();
Frank Wange33e4ed2017-06-28 10:01:07 +0800200
Carmelo Cascone87892e22017-11-13 16:01:29 -0800201 private short matchRangeShort1 = 0x100;
202 private short matchRangeShort2 = 0x200;
203 private short matchRangeHighShort = 0x300;
204 private Criterion matchPiRangeShort1 = PiCriterion.builder()
205 .matchRange(ipv4MatchFieldId, matchRangeShort1, matchRangeHighShort).build();
206 private Criterion sameAsMatchPiRangeShort1 = PiCriterion.builder()
207 .matchRange(ipv4MatchFieldId, matchRangeShort1, matchRangeHighShort).build();
208 private Criterion matchPiRangeShort2 = PiCriterion.builder()
209 .matchRange(ipv4MatchFieldId, matchRangeShort2, matchRangeHighShort).build();
Frank Wange33e4ed2017-06-28 10:01:07 +0800210
Carmelo Cascone87892e22017-11-13 16:01:29 -0800211 private int matchRangeInt1 = 0x100;
212 private int matchRangeInt2 = 0x200;
213 private int matchRangeHighInt = 0x300;
214 private Criterion matchPiRangeInt1 = PiCriterion.builder()
215 .matchRange(ipv4MatchFieldId, matchRangeInt1, matchRangeHighInt).build();
216 private Criterion sameAsMatchPiRangeInt1 = PiCriterion.builder()
217 .matchRange(ipv4MatchFieldId, matchRangeInt1, matchRangeHighInt).build();
218 private Criterion matchPiRangeInt2 = PiCriterion.builder()
219 .matchRange(ipv4MatchFieldId, matchRangeInt2, matchRangeHighInt).build();
Frank Wange33e4ed2017-06-28 10:01:07 +0800220
Carmelo Cascone87892e22017-11-13 16:01:29 -0800221 private long matchRangeLong1 = 0x100;
222 private long matchRangeLong2 = 0x200;
223 private long matchRangeHighLong = 0x300;
224 private Criterion matchPiRangeLong1 = PiCriterion.builder()
225 .matchRange(ipv4MatchFieldId, matchRangeLong1, matchRangeHighLong).build();
226 private Criterion sameAsMatchPiRangeLong1 = PiCriterion.builder()
227 .matchRange(ipv4MatchFieldId, matchRangeLong1, matchRangeHighLong).build();
228 private Criterion matchPiRangeLong2 = PiCriterion.builder()
229 .matchRange(ipv4MatchFieldId, matchRangeLong2, matchRangeHighLong).build();
Frank Wange33e4ed2017-06-28 10:01:07 +0800230
231 /**
Carmelo Cascone87892e22017-11-13 16:01:29 -0800232 * Checks that a Criterion object has the proper type, and then converts it to the proper type.
Frank Wange33e4ed2017-06-28 10:01:07 +0800233 *
234 * @param criterion Criterion object to convert
235 * @param type Enumerated type value for the Criterion class
236 * @param clazz Desired Criterion class
237 * @param <T> The type the caller wants returned
238 * @return converted object
239 */
240 @SuppressWarnings("unchecked")
241 private <T> T checkAndConvert(Criterion criterion, Criterion.Type type, Class clazz) {
242 assertThat(criterion, is(notNullValue()));
243 assertThat(criterion.type(), is(equalTo(type)));
244 assertThat(criterion, instanceOf(clazz));
245 return (T) criterion;
246 }
247
248 /**
249 * Test the ExactMatchPi method.
250 */
251 @Test
252 public void testExactMatchPiMethod() {
253
Carmelo Cascone87892e22017-11-13 16:01:29 -0800254 Criterion matchPiBytes = PiCriterion.builder().matchExact(ethMatchFieldId, matchExactBytes1).build();
Frank Wang76057cd2017-07-15 10:22:03 +0800255 PiCriterion piCriterionBytes = checkAndConvert(matchPiBytes, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800256 PiCriterion.class);
257 PiFieldMatch expectedMatchBytes = new PiExactFieldMatch(ethMatchFieldId, copyFrom(matchExactBytes1));
Frank Wang76057cd2017-07-15 10:22:03 +0800258 assertThat(piCriterionBytes.fieldMatches().iterator().next(), is(expectedMatchBytes));
Frank Wange33e4ed2017-06-28 10:01:07 +0800259
Carmelo Cascone87892e22017-11-13 16:01:29 -0800260 Criterion matchPiShort = PiCriterion.builder().matchExact(ethMatchFieldId, matchExactShort1).build();
Frank Wang76057cd2017-07-15 10:22:03 +0800261 PiCriterion piCriterionShort = checkAndConvert(matchPiShort, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800262 PiCriterion.class);
263 PiFieldMatch expectedMatchShort = new PiExactFieldMatch(ethMatchFieldId, copyFrom(matchExactShort1));
Frank Wang76057cd2017-07-15 10:22:03 +0800264 assertThat(piCriterionShort.fieldMatches().iterator().next(), is(expectedMatchShort));
Frank Wange33e4ed2017-06-28 10:01:07 +0800265
Carmelo Cascone87892e22017-11-13 16:01:29 -0800266 Criterion matchPiInt = PiCriterion.builder().matchExact(ethMatchFieldId, matchExactInt1).build();
Frank Wang76057cd2017-07-15 10:22:03 +0800267 PiCriterion piCriterionInt = checkAndConvert(matchPiInt, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800268 PiCriterion.class);
269 PiFieldMatch expectedMatchInt = new PiExactFieldMatch(ethMatchFieldId, copyFrom(matchExactInt1));
Frank Wang76057cd2017-07-15 10:22:03 +0800270 assertThat(piCriterionInt.fieldMatches().iterator().next(), is(expectedMatchInt));
Frank Wange33e4ed2017-06-28 10:01:07 +0800271
Carmelo Cascone87892e22017-11-13 16:01:29 -0800272 Criterion matchPiLong = PiCriterion.builder().matchExact(ethMatchFieldId, matchExactLong1).build();
Frank Wang76057cd2017-07-15 10:22:03 +0800273 PiCriterion piCriterionLong = checkAndConvert(matchPiLong, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800274 PiCriterion.class);
275 PiFieldMatch expectedMatchLong = new PiExactFieldMatch(ethMatchFieldId, copyFrom(matchExactLong1));
Frank Wang76057cd2017-07-15 10:22:03 +0800276 assertThat(piCriterionLong.fieldMatches().iterator().next(), is(expectedMatchLong));
Frank Wange33e4ed2017-06-28 10:01:07 +0800277 }
278
279 /**
Daniele Moroc6f2f7f2020-12-18 10:55:57 +0100280 * Test the OptionalMatchPi method.
281 */
282 @Test
283 public void testOptionalMatchPiMethod() {
284
285 Criterion matchPiBytes = PiCriterion.builder().matchOptional(ethMatchFieldId, matchExactBytes1).build();
286 PiCriterion piCriterionBytes = checkAndConvert(matchPiBytes, Criterion.Type.PROTOCOL_INDEPENDENT,
287 PiCriterion.class);
288 PiFieldMatch expectedMatchBytes = new PiOptionalFieldMatch(ethMatchFieldId, copyFrom(matchExactBytes1));
289 assertThat(piCriterionBytes.fieldMatches().iterator().next(), is(expectedMatchBytes));
290
291 Criterion matchPiShort = PiCriterion.builder().matchOptional(ethMatchFieldId, matchExactShort1).build();
292 PiCriterion piCriterionShort = checkAndConvert(matchPiShort, Criterion.Type.PROTOCOL_INDEPENDENT,
293 PiCriterion.class);
294 PiFieldMatch expectedMatchShort = new PiOptionalFieldMatch(ethMatchFieldId, copyFrom(matchExactShort1));
295 assertThat(piCriterionShort.fieldMatches().iterator().next(), is(expectedMatchShort));
296
297 Criterion matchPiInt = PiCriterion.builder().matchOptional(ethMatchFieldId, matchExactInt1).build();
298 PiCriterion piCriterionInt = checkAndConvert(matchPiInt, Criterion.Type.PROTOCOL_INDEPENDENT,
299 PiCriterion.class);
300 PiFieldMatch expectedMatchInt = new PiOptionalFieldMatch(ethMatchFieldId, copyFrom(matchExactInt1));
301 assertThat(piCriterionInt.fieldMatches().iterator().next(), is(expectedMatchInt));
302
303 Criterion matchPiLong = PiCriterion.builder().matchOptional(ethMatchFieldId, matchExactLong1).build();
304 PiCriterion piCriterionLong = checkAndConvert(matchPiLong, Criterion.Type.PROTOCOL_INDEPENDENT,
305 PiCriterion.class);
306 PiFieldMatch expectedMatchLong = new PiOptionalFieldMatch(ethMatchFieldId, copyFrom(matchExactLong1));
307 assertThat(piCriterionLong.fieldMatches().iterator().next(), is(expectedMatchLong));
308 }
309
310 /**
Frank Wange33e4ed2017-06-28 10:01:07 +0800311 * Test the LpmMatchPi method.
312 */
313 @Test
314 public void testLpmMatchPiMethod() {
315
Carmelo Cascone87892e22017-11-13 16:01:29 -0800316 Criterion matchPiBytes = PiCriterion.builder().matchLpm(ipv4MatchFieldId, matchLpmBytes1, mask).build();
Frank Wang76057cd2017-07-15 10:22:03 +0800317 PiCriterion piCriterionBytes = checkAndConvert(matchPiBytes, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800318 PiCriterion.class);
319 PiFieldMatch expectedMatchBytes = new PiLpmFieldMatch(ipv4MatchFieldId, copyFrom(matchLpmBytes1), mask);
Frank Wang76057cd2017-07-15 10:22:03 +0800320 assertThat(piCriterionBytes.fieldMatches().iterator().next(), is(expectedMatchBytes));
Frank Wange33e4ed2017-06-28 10:01:07 +0800321
Carmelo Cascone87892e22017-11-13 16:01:29 -0800322 Criterion matchPiShort = PiCriterion.builder().matchLpm(ipv4MatchFieldId, matchLpmShort1, mask).build();
Frank Wang76057cd2017-07-15 10:22:03 +0800323 PiCriterion piCriterionShort = checkAndConvert(matchPiShort, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800324 PiCriterion.class);
325 PiFieldMatch expectedMatchShort = new PiLpmFieldMatch(ipv4MatchFieldId, copyFrom(matchLpmShort1), mask);
Frank Wang76057cd2017-07-15 10:22:03 +0800326 assertThat(piCriterionShort.fieldMatches().iterator().next(), is(expectedMatchShort));
Frank Wange33e4ed2017-06-28 10:01:07 +0800327
Carmelo Cascone87892e22017-11-13 16:01:29 -0800328 Criterion matchPiInt = PiCriterion.builder().matchLpm(ipv4MatchFieldId, matchLpmInt1, mask).build();
Frank Wang76057cd2017-07-15 10:22:03 +0800329 PiCriterion piCriterionInt = checkAndConvert(matchPiInt, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800330 PiCriterion.class);
331 PiFieldMatch expectedMatchInt = new PiLpmFieldMatch(ipv4MatchFieldId, copyFrom(matchLpmInt1), mask);
Frank Wang76057cd2017-07-15 10:22:03 +0800332 assertThat(piCriterionInt.fieldMatches().iterator().next(), is(expectedMatchInt));
Frank Wange33e4ed2017-06-28 10:01:07 +0800333
Carmelo Cascone87892e22017-11-13 16:01:29 -0800334 Criterion matchPiLong = PiCriterion.builder().matchLpm(ipv4MatchFieldId, matchLpmLong1, mask).build();
Frank Wang76057cd2017-07-15 10:22:03 +0800335 PiCriterion piCriterionLong = checkAndConvert(matchPiLong, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800336 PiCriterion.class);
337 PiFieldMatch expectedMatchLong = new PiLpmFieldMatch(ipv4MatchFieldId, copyFrom(matchLpmLong1), mask);
Frank Wang76057cd2017-07-15 10:22:03 +0800338 assertThat(piCriterionLong.fieldMatches().iterator().next(), is(expectedMatchLong));
Frank Wange33e4ed2017-06-28 10:01:07 +0800339 }
340
341 /**
342 * Test the TernaryMatchPi method.
343 */
344 @Test
345 public void testTernaryMatchPiMethod() {
Frank Wange33e4ed2017-06-28 10:01:07 +0800346
Carmelo Cascone87892e22017-11-13 16:01:29 -0800347 Criterion matchPiBytes = PiCriterion.builder().matchTernary(ipv4MatchFieldId, matchTernaryBytes1,
348 matchTernaryMaskBytes)
Frank Wange33e4ed2017-06-28 10:01:07 +0800349 .build();
Frank Wang76057cd2017-07-15 10:22:03 +0800350 PiCriterion piCriterionBytes = checkAndConvert(matchPiBytes, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800351 PiCriterion.class);
352 PiFieldMatch expectedMatchBytes = new PiTernaryFieldMatch(ipv4MatchFieldId, copyFrom(matchTernaryBytes1),
353 copyFrom(matchTernaryMaskBytes));
Frank Wang76057cd2017-07-15 10:22:03 +0800354 assertThat(piCriterionBytes.fieldMatches().iterator().next(), is(expectedMatchBytes));
Frank Wange33e4ed2017-06-28 10:01:07 +0800355
Carmelo Cascone87892e22017-11-13 16:01:29 -0800356 Criterion matchPiShort = PiCriterion.builder().matchTernary(ipv4MatchFieldId, matchTernaryShort1,
357 matchTernaryMaskShort)
Frank Wange33e4ed2017-06-28 10:01:07 +0800358 .build();
Frank Wang76057cd2017-07-15 10:22:03 +0800359 PiCriterion piCriterionShort = checkAndConvert(matchPiShort, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800360 PiCriterion.class);
361 PiFieldMatch expectedMatchShort = new PiTernaryFieldMatch(ipv4MatchFieldId, copyFrom(matchTernaryShort1),
362 copyFrom(matchTernaryMaskShort));
Frank Wang76057cd2017-07-15 10:22:03 +0800363 assertThat(piCriterionShort.fieldMatches().iterator().next(), is(expectedMatchShort));
Frank Wange33e4ed2017-06-28 10:01:07 +0800364
Carmelo Cascone87892e22017-11-13 16:01:29 -0800365 Criterion matchPiInt = PiCriterion.builder().matchTernary(ipv4MatchFieldId, matchTernaryInt1,
366 matchTernaryMaskInt)
Frank Wange33e4ed2017-06-28 10:01:07 +0800367 .build();
Frank Wang76057cd2017-07-15 10:22:03 +0800368 PiCriterion piCriterionInt = checkAndConvert(matchPiInt, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800369 PiCriterion.class);
370 PiFieldMatch expectedMatchInt = new PiTernaryFieldMatch(ipv4MatchFieldId, copyFrom(matchTernaryInt1),
371 copyFrom(matchTernaryMaskInt));
Frank Wang76057cd2017-07-15 10:22:03 +0800372 assertThat(piCriterionInt.fieldMatches().iterator().next(), is(expectedMatchInt));
Frank Wange33e4ed2017-06-28 10:01:07 +0800373
Carmelo Cascone87892e22017-11-13 16:01:29 -0800374 Criterion matchPiLong = PiCriterion.builder().matchTernary(ipv4MatchFieldId, matchTernaryLong1,
375 matchTernaryMaskLong)
Frank Wange33e4ed2017-06-28 10:01:07 +0800376 .build();
Frank Wang76057cd2017-07-15 10:22:03 +0800377 PiCriterion piCriterionLong = checkAndConvert(matchPiLong, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800378 PiCriterion.class);
379 PiFieldMatch expectedMatchLong = new PiTernaryFieldMatch(ipv4MatchFieldId, copyFrom(matchTernaryLong1),
380 copyFrom(matchTernaryMaskLong));
Frank Wang76057cd2017-07-15 10:22:03 +0800381 assertThat(piCriterionLong.fieldMatches().iterator().next(), is(expectedMatchLong));
Frank Wange33e4ed2017-06-28 10:01:07 +0800382 }
383
384 /**
Frank Wange33e4ed2017-06-28 10:01:07 +0800385 * Test the RangeMatchPi method.
386 */
387 @Test
388 public void testRangeMatchPiMethod() {
Frank Wange33e4ed2017-06-28 10:01:07 +0800389
Carmelo Cascone87892e22017-11-13 16:01:29 -0800390 Criterion matchPiBytes = PiCriterion.builder().matchRange(ipv4MatchFieldId, matchRangeBytes1,
391 matchRangeHighBytes)
Frank Wange33e4ed2017-06-28 10:01:07 +0800392 .build();
Frank Wang76057cd2017-07-15 10:22:03 +0800393 PiCriterion piCriterionBytes = checkAndConvert(matchPiBytes, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800394 PiCriterion.class);
395 PiFieldMatch expectedMatchBytes = new PiRangeFieldMatch(ipv4MatchFieldId, copyFrom(matchRangeBytes1),
396 copyFrom(matchRangeHighBytes));
Frank Wang76057cd2017-07-15 10:22:03 +0800397 assertThat(piCriterionBytes.fieldMatches().iterator().next(), is(expectedMatchBytes));
Frank Wange33e4ed2017-06-28 10:01:07 +0800398
Carmelo Cascone87892e22017-11-13 16:01:29 -0800399 Criterion matchPiShort = PiCriterion.builder().matchRange(ipv4MatchFieldId, matchRangeShort1,
400 matchRangeHighShort)
Frank Wange33e4ed2017-06-28 10:01:07 +0800401 .build();
Frank Wang76057cd2017-07-15 10:22:03 +0800402 PiCriterion piCriterionShort = checkAndConvert(matchPiShort, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800403 PiCriterion.class);
404 PiFieldMatch expectedMatchShort = new PiRangeFieldMatch(ipv4MatchFieldId, copyFrom(matchRangeShort1),
405 copyFrom(matchRangeHighShort));
Frank Wang76057cd2017-07-15 10:22:03 +0800406 assertThat(piCriterionShort.fieldMatches().iterator().next(), is(expectedMatchShort));
Frank Wange33e4ed2017-06-28 10:01:07 +0800407
Carmelo Cascone87892e22017-11-13 16:01:29 -0800408 Criterion matchPiInt = PiCriterion.builder().matchRange(ipv4MatchFieldId, matchRangeInt1,
409 matchRangeHighInt)
Frank Wange33e4ed2017-06-28 10:01:07 +0800410 .build();
Frank Wang76057cd2017-07-15 10:22:03 +0800411 PiCriterion piCriterionInt = checkAndConvert(matchPiInt, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800412 PiCriterion.class);
413 PiFieldMatch expectedMatchInt = new PiRangeFieldMatch(ipv4MatchFieldId, copyFrom(matchRangeInt1),
414 copyFrom(matchRangeHighInt));
Frank Wang76057cd2017-07-15 10:22:03 +0800415 assertThat(piCriterionInt.fieldMatches().iterator().next(), is(expectedMatchInt));
Frank Wange33e4ed2017-06-28 10:01:07 +0800416
Carmelo Cascone87892e22017-11-13 16:01:29 -0800417 Criterion matchPiLong = PiCriterion.builder().matchRange(ipv4MatchFieldId, matchRangeLong1,
418 matchRangeHighLong)
Frank Wange33e4ed2017-06-28 10:01:07 +0800419 .build();
Frank Wang76057cd2017-07-15 10:22:03 +0800420 PiCriterion piCriterionLong = checkAndConvert(matchPiLong, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800421 PiCriterion.class);
422 PiFieldMatch expectedMatchLong = new PiRangeFieldMatch(ipv4MatchFieldId, copyFrom(matchRangeLong1),
423 copyFrom(matchRangeHighLong));
Frank Wang76057cd2017-07-15 10:22:03 +0800424 assertThat(piCriterionLong.fieldMatches().iterator().next(), is(expectedMatchLong));
Frank Wange33e4ed2017-06-28 10:01:07 +0800425 }
426
427 /**
428 * Test the equals() method of the PiCriterion class.
429 */
430 @Test
431 public void testPiExactCriterionEquals() {
432 new EqualsTester()
Carmelo Cascone22619172017-07-13 16:08:17 -0400433 .addEqualityGroup(matchPiExactByte1, sameAsMatchPiExactByte1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800434 .addEqualityGroup(matchPiExactByte2)
435 .testEquals();
436
437 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800438 .addEqualityGroup(matchPiExactShort1, sameAsMatchPiExactShort1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800439 .addEqualityGroup(matchPiExactShort2)
440 .testEquals();
441
442 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800443 .addEqualityGroup(matchPiExactInt1, sameAsMatchPiExactInt1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800444 .addEqualityGroup(matchPiExactInt2)
445 .testEquals();
446
447 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800448 .addEqualityGroup(matchPiExactLong1, sameAsMatchPiExactLong1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800449 .addEqualityGroup(matchPiExactLong2)
450 .testEquals();
451 }
452
453 /**
454 * Test the equals() method of the PiCriterion class.
455 */
456 @Test
Daniele Moroc6f2f7f2020-12-18 10:55:57 +0100457 public void testPiOptionalCriterionEquals() {
458 new EqualsTester()
459 .addEqualityGroup(matchPiOptionalByte1, sameAsMatchPiOptionalByte1)
460 .addEqualityGroup(matchPiOptionalByte2)
461 .testEquals();
462
463 new EqualsTester()
464 .addEqualityGroup(matchPiOptionalShort1, sameAsMatchPiOptionalShort1)
465 .addEqualityGroup(matchPiOptionalShort2)
466 .testEquals();
467
468 new EqualsTester()
469 .addEqualityGroup(matchPiOptionalInt1, sameAsMatchPiOptionalInt1)
470 .addEqualityGroup(matchPiOptionalInt2)
471 .testEquals();
472
473 new EqualsTester()
474 .addEqualityGroup(matchPiOptionalLong1, sameAsMatchPiOptionalLong1)
475 .addEqualityGroup(matchPiOptionalLong2)
476 .testEquals();
477 }
478
479 /**
480 * Test the equals() method of the PiCriterion class.
481 */
482 @Test
Frank Wange33e4ed2017-06-28 10:01:07 +0800483 public void testPiLpmCriterionEquals() {
484 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800485 .addEqualityGroup(matchPiLpmByte1, sameAsMatchPiLpmByte1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800486 .addEqualityGroup(matchPiLpmByte2)
487 .testEquals();
488
489 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800490 .addEqualityGroup(matchPiLpmShort1, sameAsMatchPiLpmShort1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800491 .addEqualityGroup(matchPiLpmShort2)
492 .testEquals();
493
494 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800495 .addEqualityGroup(matchPiLpmInt1, sameAsMatchPiLpmInt1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800496 .addEqualityGroup(matchPiLpmInt2)
497 .testEquals();
498
499 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800500 .addEqualityGroup(matchPiLpmLong1, sameAsMatchPiLpmLong1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800501 .addEqualityGroup(matchPiLpmLong2)
502 .testEquals();
503 }
504
505 /**
506 * Test the equals() method of the PiCriterion class.
507 */
508 @Test
509 public void testPiTernaryCriterionEquals() {
510 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800511 .addEqualityGroup(matchPiTernaryByte1, sameAsMatchPiTernaryByte1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800512 .addEqualityGroup(matchPiTernaryByte2)
513 .testEquals();
514
515 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800516 .addEqualityGroup(matchPiTernaryShort1, sameAsMatchPiTernaryShort1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800517 .addEqualityGroup(matchPiTernaryShort2)
518 .testEquals();
519
520 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800521 .addEqualityGroup(matchPiTernaryInt1, sameAsMatchPiTernaryInt1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800522 .addEqualityGroup(matchPiTernaryInt2)
523 .testEquals();
524
525 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800526 .addEqualityGroup(matchPiTernaryLong1, sameAsMatchPiTernaryLong1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800527 .addEqualityGroup(matchPiTernaryLong2)
528 .testEquals();
529 }
530
531 /**
532 * Test the equals() method of the PiCriterion class.
533 */
534 @Test
Frank Wange33e4ed2017-06-28 10:01:07 +0800535 public void testPiRangeCriterionEquals() {
536 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800537 .addEqualityGroup(matchPiRangeByte1, sameAsMatchPiRangeByte1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800538 .addEqualityGroup(matchPiRangeByte2)
539 .testEquals();
540
541 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800542 .addEqualityGroup(matchPiRangeShort1, sameAsMatchPiRangeShort1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800543 .addEqualityGroup(matchPiRangeShort2)
544 .testEquals();
545
546 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800547 .addEqualityGroup(matchPiRangeInt1, sameAsMatchPiRangeInt1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800548 .addEqualityGroup(matchPiRangeInt2)
549 .testEquals();
550
551 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800552 .addEqualityGroup(matchPiRangeLong1, sameAsMatchPiRangeLong1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800553 .addEqualityGroup(matchPiRangeLong2)
554 .testEquals();
555 }
556}