blob: ab0446d2cca3ec761640e693b13b2e1844881581 [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;
25import org.onosproject.net.pi.runtime.PiRangeFieldMatch;
26import org.onosproject.net.pi.runtime.PiTernaryFieldMatch;
27import org.onosproject.net.pi.runtime.PiValidFieldMatch;
28
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
Carmelo Cascone87892e22017-11-13 16:01:29 -080078 private PiMatchFieldId ipv4MatchFieldId = PiMatchFieldId.of("ipv4_t.dstAddr");
79 private int mask = 0x00ffffff;
80 private byte[] matchLpmBytes1 = {0x0a, 0x01, 0x01, 0x01};
81 private byte[] matchLpmBytes2 = {0x0a, 0x01, 0x01, 0x02};
82 private Criterion matchPiLpmByte1 = PiCriterion.builder()
83 .matchLpm(ipv4MatchFieldId, matchLpmBytes1, mask).build();
84 private Criterion sameAsMatchPiLpmByte1 = PiCriterion.builder()
85 .matchLpm(ipv4MatchFieldId, matchLpmBytes1, mask).build();
86 private Criterion matchPiLpmByte2 = PiCriterion.builder()
87 .matchLpm(ipv4MatchFieldId, matchLpmBytes2, mask).build();
Frank Wange33e4ed2017-06-28 10:01:07 +080088
Carmelo Cascone87892e22017-11-13 16:01:29 -080089 private short matchLpmShort1 = 0x0a0a;
90 private short matchLpmShort2 = 0x0a0b;
91 private Criterion matchPiLpmShort1 = PiCriterion.builder()
92 .matchLpm(ipv4MatchFieldId, matchLpmShort1, mask).build();
93 private Criterion sameAsMatchPiLpmShort1 = PiCriterion.builder()
94 .matchLpm(ipv4MatchFieldId, matchLpmShort1, mask).build();
95 private Criterion matchPiLpmShort2 = PiCriterion.builder()
96 .matchLpm(ipv4MatchFieldId, matchLpmShort2, mask).build();
Frank Wange33e4ed2017-06-28 10:01:07 +080097
Carmelo Cascone87892e22017-11-13 16:01:29 -080098 private int matchLpmInt1 = 0x0a010101;
99 private int matchLpmInt2 = 0x0a010102;
100 private Criterion matchPiLpmInt1 = PiCriterion.builder()
101 .matchLpm(ipv4MatchFieldId, matchLpmInt1, mask).build();
102 private Criterion sameAsMatchPiLpmInt1 = PiCriterion.builder()
103 .matchLpm(ipv4MatchFieldId, matchLpmInt1, mask).build();
104 private Criterion matchPiLpmInt2 = PiCriterion.builder()
105 .matchLpm(ipv4MatchFieldId, matchLpmInt2, mask).build();
Frank Wange33e4ed2017-06-28 10:01:07 +0800106
Carmelo Cascone87892e22017-11-13 16:01:29 -0800107 private long matchLpmLong1 = 0x0a010101;
108 private long matchLpmLong2 = 0x0a010102;
109 private Criterion matchPiLpmLong1 = PiCriterion.builder()
110 .matchLpm(ipv4MatchFieldId, matchLpmLong1, mask).build();
111 private Criterion sameAsMatchPiLpmLong1 = PiCriterion.builder()
112 .matchLpm(ipv4MatchFieldId, matchLpmLong1, mask).build();
113 private Criterion matchPiLpmLong2 = PiCriterion.builder()
114 .matchLpm(ipv4MatchFieldId, matchLpmLong2, mask).build();
Frank Wange33e4ed2017-06-28 10:01:07 +0800115
116
Carmelo Cascone87892e22017-11-13 16:01:29 -0800117 private byte[] matchTernaryBytes1 = {0x0a, 0x01, 0x01, 0x01};
118 private byte[] matchTernaryBytes2 = {0x0a, 0x01, 0x01, 0x02};
119 private byte[] matchTernaryMaskBytes = {0x7f, 0x7f, 0x7f, 0x00};
120 private Criterion matchPiTernaryByte1 = PiCriterion.builder()
121 .matchTernary(ipv4MatchFieldId, matchTernaryBytes1, matchTernaryMaskBytes).build();
122 private Criterion sameAsMatchPiTernaryByte1 = PiCriterion.builder()
123 .matchTernary(ipv4MatchFieldId, matchTernaryBytes1, matchTernaryMaskBytes).build();
124 private Criterion matchPiTernaryByte2 = PiCriterion.builder()
125 .matchTernary(ipv4MatchFieldId, matchTernaryBytes2, matchTernaryMaskBytes).build();
Frank Wange33e4ed2017-06-28 10:01:07 +0800126
Carmelo Cascone87892e22017-11-13 16:01:29 -0800127 private short matchTernaryShort1 = 0x0a0a;
128 private short matchTernaryShort2 = 0x0a0b;
129 private short matchTernaryMaskShort = 0xff0;
130 private Criterion matchPiTernaryShort1 = PiCriterion.builder()
131 .matchTernary(ipv4MatchFieldId, matchTernaryShort1, matchTernaryMaskShort).build();
132 private Criterion sameAsMatchPiTernaryShort1 = PiCriterion.builder()
133 .matchTernary(ipv4MatchFieldId, matchTernaryShort1, matchTernaryMaskShort).build();
134 private Criterion matchPiTernaryShort2 = PiCriterion.builder()
135 .matchTernary(ipv4MatchFieldId, matchTernaryShort2, matchTernaryMaskShort).build();
Frank Wange33e4ed2017-06-28 10:01:07 +0800136
Carmelo Cascone87892e22017-11-13 16:01:29 -0800137 private int matchTernaryInt1 = 0x0a010101;
138 private int matchTernaryInt2 = 0x0a010102;
139 private int matchTernaryMaskInt = 0xffff;
140 private Criterion matchPiTernaryInt1 = PiCriterion.builder()
141 .matchTernary(ipv4MatchFieldId, matchTernaryInt1, matchTernaryMaskInt).build();
142 private Criterion sameAsMatchPiTernaryInt1 = PiCriterion.builder()
143 .matchTernary(ipv4MatchFieldId, matchTernaryInt1, matchTernaryMaskInt).build();
144 private Criterion matchPiTernaryInt2 = PiCriterion.builder()
145 .matchTernary(ipv4MatchFieldId, matchTernaryInt2, matchTernaryMaskInt).build();
Frank Wange33e4ed2017-06-28 10:01:07 +0800146
Carmelo Cascone87892e22017-11-13 16:01:29 -0800147 private long matchTernaryLong1 = 0x0a010101;
148 private long matchTernaryLong2 = 0x0a010102;
149 private long matchTernaryMaskLong = 0xffff;
150 private Criterion matchPiTernaryLong1 = PiCriterion.builder()
151 .matchTernary(ipv4MatchFieldId, matchTernaryLong1, matchTernaryMaskLong).build();
152 private Criterion sameAsMatchPiTernaryLong1 = PiCriterion.builder()
153 .matchTernary(ipv4MatchFieldId, matchTernaryLong1, matchTernaryMaskLong).build();
154 private Criterion matchPiTernaryLong2 = PiCriterion.builder()
155 .matchTernary(ipv4MatchFieldId, matchTernaryLong2, matchTernaryMaskLong).build();
Frank Wange33e4ed2017-06-28 10:01:07 +0800156
Carmelo Cascone87892e22017-11-13 16:01:29 -0800157 private Criterion matchPiValid1 = PiCriterion.builder().matchValid(ipv4MatchFieldId, false).build();
158 private Criterion sameAsMatchPiValid1 = PiCriterion.builder().matchValid(ipv4MatchFieldId, false).build();
159 private Criterion matchPiValid2 = PiCriterion.builder().matchValid(ipv4MatchFieldId, true).build();
Frank Wange33e4ed2017-06-28 10:01:07 +0800160
Carmelo Cascone87892e22017-11-13 16:01:29 -0800161 private byte[] matchRangeBytes1 = {0x10};
162 private byte[] matchRangeBytes2 = {0x20};
163 private byte[] matchRangeHighBytes = {0x30};
164 private Criterion matchPiRangeByte1 = PiCriterion.builder()
165 .matchRange(ipv4MatchFieldId, matchRangeBytes1, matchRangeHighBytes).build();
166 private Criterion sameAsMatchPiRangeByte1 = PiCriterion.builder()
167 .matchRange(ipv4MatchFieldId, matchRangeBytes1, matchRangeHighBytes).build();
168 private Criterion matchPiRangeByte2 = PiCriterion.builder()
169 .matchRange(ipv4MatchFieldId, matchRangeBytes2, matchRangeHighBytes).build();
Frank Wange33e4ed2017-06-28 10:01:07 +0800170
Carmelo Cascone87892e22017-11-13 16:01:29 -0800171 private short matchRangeShort1 = 0x100;
172 private short matchRangeShort2 = 0x200;
173 private short matchRangeHighShort = 0x300;
174 private Criterion matchPiRangeShort1 = PiCriterion.builder()
175 .matchRange(ipv4MatchFieldId, matchRangeShort1, matchRangeHighShort).build();
176 private Criterion sameAsMatchPiRangeShort1 = PiCriterion.builder()
177 .matchRange(ipv4MatchFieldId, matchRangeShort1, matchRangeHighShort).build();
178 private Criterion matchPiRangeShort2 = PiCriterion.builder()
179 .matchRange(ipv4MatchFieldId, matchRangeShort2, matchRangeHighShort).build();
Frank Wange33e4ed2017-06-28 10:01:07 +0800180
Carmelo Cascone87892e22017-11-13 16:01:29 -0800181 private int matchRangeInt1 = 0x100;
182 private int matchRangeInt2 = 0x200;
183 private int matchRangeHighInt = 0x300;
184 private Criterion matchPiRangeInt1 = PiCriterion.builder()
185 .matchRange(ipv4MatchFieldId, matchRangeInt1, matchRangeHighInt).build();
186 private Criterion sameAsMatchPiRangeInt1 = PiCriterion.builder()
187 .matchRange(ipv4MatchFieldId, matchRangeInt1, matchRangeHighInt).build();
188 private Criterion matchPiRangeInt2 = PiCriterion.builder()
189 .matchRange(ipv4MatchFieldId, matchRangeInt2, matchRangeHighInt).build();
Frank Wange33e4ed2017-06-28 10:01:07 +0800190
Carmelo Cascone87892e22017-11-13 16:01:29 -0800191 private long matchRangeLong1 = 0x100;
192 private long matchRangeLong2 = 0x200;
193 private long matchRangeHighLong = 0x300;
194 private Criterion matchPiRangeLong1 = PiCriterion.builder()
195 .matchRange(ipv4MatchFieldId, matchRangeLong1, matchRangeHighLong).build();
196 private Criterion sameAsMatchPiRangeLong1 = PiCriterion.builder()
197 .matchRange(ipv4MatchFieldId, matchRangeLong1, matchRangeHighLong).build();
198 private Criterion matchPiRangeLong2 = PiCriterion.builder()
199 .matchRange(ipv4MatchFieldId, matchRangeLong2, matchRangeHighLong).build();
Frank Wange33e4ed2017-06-28 10:01:07 +0800200
201 /**
Carmelo Cascone87892e22017-11-13 16:01:29 -0800202 * Checks that a Criterion object has the proper type, and then converts it to the proper type.
Frank Wange33e4ed2017-06-28 10:01:07 +0800203 *
204 * @param criterion Criterion object to convert
205 * @param type Enumerated type value for the Criterion class
206 * @param clazz Desired Criterion class
207 * @param <T> The type the caller wants returned
208 * @return converted object
209 */
210 @SuppressWarnings("unchecked")
211 private <T> T checkAndConvert(Criterion criterion, Criterion.Type type, Class clazz) {
212 assertThat(criterion, is(notNullValue()));
213 assertThat(criterion.type(), is(equalTo(type)));
214 assertThat(criterion, instanceOf(clazz));
215 return (T) criterion;
216 }
217
218 /**
219 * Test the ExactMatchPi method.
220 */
221 @Test
222 public void testExactMatchPiMethod() {
223
Carmelo Cascone87892e22017-11-13 16:01:29 -0800224 Criterion matchPiBytes = PiCriterion.builder().matchExact(ethMatchFieldId, matchExactBytes1).build();
Frank Wang76057cd2017-07-15 10:22:03 +0800225 PiCriterion piCriterionBytes = checkAndConvert(matchPiBytes, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800226 PiCriterion.class);
227 PiFieldMatch expectedMatchBytes = new PiExactFieldMatch(ethMatchFieldId, copyFrom(matchExactBytes1));
Frank Wang76057cd2017-07-15 10:22:03 +0800228 assertThat(piCriterionBytes.fieldMatches().iterator().next(), is(expectedMatchBytes));
Frank Wange33e4ed2017-06-28 10:01:07 +0800229
Carmelo Cascone87892e22017-11-13 16:01:29 -0800230 Criterion matchPiShort = PiCriterion.builder().matchExact(ethMatchFieldId, matchExactShort1).build();
Frank Wang76057cd2017-07-15 10:22:03 +0800231 PiCriterion piCriterionShort = checkAndConvert(matchPiShort, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800232 PiCriterion.class);
233 PiFieldMatch expectedMatchShort = new PiExactFieldMatch(ethMatchFieldId, copyFrom(matchExactShort1));
Frank Wang76057cd2017-07-15 10:22:03 +0800234 assertThat(piCriterionShort.fieldMatches().iterator().next(), is(expectedMatchShort));
Frank Wange33e4ed2017-06-28 10:01:07 +0800235
Carmelo Cascone87892e22017-11-13 16:01:29 -0800236 Criterion matchPiInt = PiCriterion.builder().matchExact(ethMatchFieldId, matchExactInt1).build();
Frank Wang76057cd2017-07-15 10:22:03 +0800237 PiCriterion piCriterionInt = checkAndConvert(matchPiInt, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800238 PiCriterion.class);
239 PiFieldMatch expectedMatchInt = new PiExactFieldMatch(ethMatchFieldId, copyFrom(matchExactInt1));
Frank Wang76057cd2017-07-15 10:22:03 +0800240 assertThat(piCriterionInt.fieldMatches().iterator().next(), is(expectedMatchInt));
Frank Wange33e4ed2017-06-28 10:01:07 +0800241
Carmelo Cascone87892e22017-11-13 16:01:29 -0800242 Criterion matchPiLong = PiCriterion.builder().matchExact(ethMatchFieldId, matchExactLong1).build();
Frank Wang76057cd2017-07-15 10:22:03 +0800243 PiCriterion piCriterionLong = checkAndConvert(matchPiLong, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800244 PiCriterion.class);
245 PiFieldMatch expectedMatchLong = new PiExactFieldMatch(ethMatchFieldId, copyFrom(matchExactLong1));
Frank Wang76057cd2017-07-15 10:22:03 +0800246 assertThat(piCriterionLong.fieldMatches().iterator().next(), is(expectedMatchLong));
Frank Wange33e4ed2017-06-28 10:01:07 +0800247 }
248
249 /**
250 * Test the LpmMatchPi method.
251 */
252 @Test
253 public void testLpmMatchPiMethod() {
254
Carmelo Cascone87892e22017-11-13 16:01:29 -0800255 Criterion matchPiBytes = PiCriterion.builder().matchLpm(ipv4MatchFieldId, matchLpmBytes1, mask).build();
Frank Wang76057cd2017-07-15 10:22:03 +0800256 PiCriterion piCriterionBytes = checkAndConvert(matchPiBytes, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800257 PiCriterion.class);
258 PiFieldMatch expectedMatchBytes = new PiLpmFieldMatch(ipv4MatchFieldId, copyFrom(matchLpmBytes1), mask);
Frank Wang76057cd2017-07-15 10:22:03 +0800259 assertThat(piCriterionBytes.fieldMatches().iterator().next(), is(expectedMatchBytes));
Frank Wange33e4ed2017-06-28 10:01:07 +0800260
Carmelo Cascone87892e22017-11-13 16:01:29 -0800261 Criterion matchPiShort = PiCriterion.builder().matchLpm(ipv4MatchFieldId, matchLpmShort1, mask).build();
Frank Wang76057cd2017-07-15 10:22:03 +0800262 PiCriterion piCriterionShort = checkAndConvert(matchPiShort, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800263 PiCriterion.class);
264 PiFieldMatch expectedMatchShort = new PiLpmFieldMatch(ipv4MatchFieldId, copyFrom(matchLpmShort1), mask);
Frank Wang76057cd2017-07-15 10:22:03 +0800265 assertThat(piCriterionShort.fieldMatches().iterator().next(), is(expectedMatchShort));
Frank Wange33e4ed2017-06-28 10:01:07 +0800266
Carmelo Cascone87892e22017-11-13 16:01:29 -0800267 Criterion matchPiInt = PiCriterion.builder().matchLpm(ipv4MatchFieldId, matchLpmInt1, mask).build();
Frank Wang76057cd2017-07-15 10:22:03 +0800268 PiCriterion piCriterionInt = checkAndConvert(matchPiInt, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800269 PiCriterion.class);
270 PiFieldMatch expectedMatchInt = new PiLpmFieldMatch(ipv4MatchFieldId, copyFrom(matchLpmInt1), mask);
Frank Wang76057cd2017-07-15 10:22:03 +0800271 assertThat(piCriterionInt.fieldMatches().iterator().next(), is(expectedMatchInt));
Frank Wange33e4ed2017-06-28 10:01:07 +0800272
Carmelo Cascone87892e22017-11-13 16:01:29 -0800273 Criterion matchPiLong = PiCriterion.builder().matchLpm(ipv4MatchFieldId, matchLpmLong1, mask).build();
Frank Wang76057cd2017-07-15 10:22:03 +0800274 PiCriterion piCriterionLong = checkAndConvert(matchPiLong, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800275 PiCriterion.class);
276 PiFieldMatch expectedMatchLong = new PiLpmFieldMatch(ipv4MatchFieldId, copyFrom(matchLpmLong1), mask);
Frank Wang76057cd2017-07-15 10:22:03 +0800277 assertThat(piCriterionLong.fieldMatches().iterator().next(), is(expectedMatchLong));
Frank Wange33e4ed2017-06-28 10:01:07 +0800278 }
279
280 /**
281 * Test the TernaryMatchPi method.
282 */
283 @Test
284 public void testTernaryMatchPiMethod() {
Frank Wange33e4ed2017-06-28 10:01:07 +0800285
Carmelo Cascone87892e22017-11-13 16:01:29 -0800286 Criterion matchPiBytes = PiCriterion.builder().matchTernary(ipv4MatchFieldId, matchTernaryBytes1,
287 matchTernaryMaskBytes)
Frank Wange33e4ed2017-06-28 10:01:07 +0800288 .build();
Frank Wang76057cd2017-07-15 10:22:03 +0800289 PiCriterion piCriterionBytes = checkAndConvert(matchPiBytes, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800290 PiCriterion.class);
291 PiFieldMatch expectedMatchBytes = new PiTernaryFieldMatch(ipv4MatchFieldId, copyFrom(matchTernaryBytes1),
292 copyFrom(matchTernaryMaskBytes));
Frank Wang76057cd2017-07-15 10:22:03 +0800293 assertThat(piCriterionBytes.fieldMatches().iterator().next(), is(expectedMatchBytes));
Frank Wange33e4ed2017-06-28 10:01:07 +0800294
Carmelo Cascone87892e22017-11-13 16:01:29 -0800295 Criterion matchPiShort = PiCriterion.builder().matchTernary(ipv4MatchFieldId, matchTernaryShort1,
296 matchTernaryMaskShort)
Frank Wange33e4ed2017-06-28 10:01:07 +0800297 .build();
Frank Wang76057cd2017-07-15 10:22:03 +0800298 PiCriterion piCriterionShort = checkAndConvert(matchPiShort, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800299 PiCriterion.class);
300 PiFieldMatch expectedMatchShort = new PiTernaryFieldMatch(ipv4MatchFieldId, copyFrom(matchTernaryShort1),
301 copyFrom(matchTernaryMaskShort));
Frank Wang76057cd2017-07-15 10:22:03 +0800302 assertThat(piCriterionShort.fieldMatches().iterator().next(), is(expectedMatchShort));
Frank Wange33e4ed2017-06-28 10:01:07 +0800303
Carmelo Cascone87892e22017-11-13 16:01:29 -0800304 Criterion matchPiInt = PiCriterion.builder().matchTernary(ipv4MatchFieldId, matchTernaryInt1,
305 matchTernaryMaskInt)
Frank Wange33e4ed2017-06-28 10:01:07 +0800306 .build();
Frank Wang76057cd2017-07-15 10:22:03 +0800307 PiCriterion piCriterionInt = checkAndConvert(matchPiInt, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800308 PiCriterion.class);
309 PiFieldMatch expectedMatchInt = new PiTernaryFieldMatch(ipv4MatchFieldId, copyFrom(matchTernaryInt1),
310 copyFrom(matchTernaryMaskInt));
Frank Wang76057cd2017-07-15 10:22:03 +0800311 assertThat(piCriterionInt.fieldMatches().iterator().next(), is(expectedMatchInt));
Frank Wange33e4ed2017-06-28 10:01:07 +0800312
Carmelo Cascone87892e22017-11-13 16:01:29 -0800313 Criterion matchPiLong = PiCriterion.builder().matchTernary(ipv4MatchFieldId, matchTernaryLong1,
314 matchTernaryMaskLong)
Frank Wange33e4ed2017-06-28 10:01:07 +0800315 .build();
Frank Wang76057cd2017-07-15 10:22:03 +0800316 PiCriterion piCriterionLong = checkAndConvert(matchPiLong, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800317 PiCriterion.class);
318 PiFieldMatch expectedMatchLong = new PiTernaryFieldMatch(ipv4MatchFieldId, copyFrom(matchTernaryLong1),
319 copyFrom(matchTernaryMaskLong));
Frank Wang76057cd2017-07-15 10:22:03 +0800320 assertThat(piCriterionLong.fieldMatches().iterator().next(), is(expectedMatchLong));
Frank Wange33e4ed2017-06-28 10:01:07 +0800321 }
322
323 /**
324 * Test the ValidMatchPi method.
325 */
326 @Test
327 public void testValidMatchPiMethod() {
Frank Wang76057cd2017-07-15 10:22:03 +0800328
Carmelo Cascone87892e22017-11-13 16:01:29 -0800329 Criterion matchPiBytes = PiCriterion.builder().matchValid(ipv4MatchFieldId, true).build();
Frank Wange33e4ed2017-06-28 10:01:07 +0800330 PiCriterion piCriterionBytes = checkAndConvert(matchPiBytes, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800331 PiCriterion.class);
332 PiFieldMatch expectedMatch = new PiValidFieldMatch(ipv4MatchFieldId, true);
Frank Wang76057cd2017-07-15 10:22:03 +0800333 assertThat(piCriterionBytes.fieldMatches().iterator().next(), is(expectedMatch));
Frank Wange33e4ed2017-06-28 10:01:07 +0800334 }
335
336 /**
337 * Test the RangeMatchPi method.
338 */
339 @Test
340 public void testRangeMatchPiMethod() {
Frank Wange33e4ed2017-06-28 10:01:07 +0800341
Carmelo Cascone87892e22017-11-13 16:01:29 -0800342 Criterion matchPiBytes = PiCriterion.builder().matchRange(ipv4MatchFieldId, matchRangeBytes1,
343 matchRangeHighBytes)
Frank Wange33e4ed2017-06-28 10:01:07 +0800344 .build();
Frank Wang76057cd2017-07-15 10:22:03 +0800345 PiCriterion piCriterionBytes = checkAndConvert(matchPiBytes, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800346 PiCriterion.class);
347 PiFieldMatch expectedMatchBytes = new PiRangeFieldMatch(ipv4MatchFieldId, copyFrom(matchRangeBytes1),
348 copyFrom(matchRangeHighBytes));
Frank Wang76057cd2017-07-15 10:22:03 +0800349 assertThat(piCriterionBytes.fieldMatches().iterator().next(), is(expectedMatchBytes));
Frank Wange33e4ed2017-06-28 10:01:07 +0800350
Carmelo Cascone87892e22017-11-13 16:01:29 -0800351 Criterion matchPiShort = PiCriterion.builder().matchRange(ipv4MatchFieldId, matchRangeShort1,
352 matchRangeHighShort)
Frank Wange33e4ed2017-06-28 10:01:07 +0800353 .build();
Frank Wang76057cd2017-07-15 10:22:03 +0800354 PiCriterion piCriterionShort = checkAndConvert(matchPiShort, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800355 PiCriterion.class);
356 PiFieldMatch expectedMatchShort = new PiRangeFieldMatch(ipv4MatchFieldId, copyFrom(matchRangeShort1),
357 copyFrom(matchRangeHighShort));
Frank Wang76057cd2017-07-15 10:22:03 +0800358 assertThat(piCriterionShort.fieldMatches().iterator().next(), is(expectedMatchShort));
Frank Wange33e4ed2017-06-28 10:01:07 +0800359
Carmelo Cascone87892e22017-11-13 16:01:29 -0800360 Criterion matchPiInt = PiCriterion.builder().matchRange(ipv4MatchFieldId, matchRangeInt1,
361 matchRangeHighInt)
Frank Wange33e4ed2017-06-28 10:01:07 +0800362 .build();
Frank Wang76057cd2017-07-15 10:22:03 +0800363 PiCriterion piCriterionInt = checkAndConvert(matchPiInt, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800364 PiCriterion.class);
365 PiFieldMatch expectedMatchInt = new PiRangeFieldMatch(ipv4MatchFieldId, copyFrom(matchRangeInt1),
366 copyFrom(matchRangeHighInt));
Frank Wang76057cd2017-07-15 10:22:03 +0800367 assertThat(piCriterionInt.fieldMatches().iterator().next(), is(expectedMatchInt));
Frank Wange33e4ed2017-06-28 10:01:07 +0800368
Carmelo Cascone87892e22017-11-13 16:01:29 -0800369 Criterion matchPiLong = PiCriterion.builder().matchRange(ipv4MatchFieldId, matchRangeLong1,
370 matchRangeHighLong)
Frank Wange33e4ed2017-06-28 10:01:07 +0800371 .build();
Frank Wang76057cd2017-07-15 10:22:03 +0800372 PiCriterion piCriterionLong = checkAndConvert(matchPiLong, Criterion.Type.PROTOCOL_INDEPENDENT,
Carmelo Cascone87892e22017-11-13 16:01:29 -0800373 PiCriterion.class);
374 PiFieldMatch expectedMatchLong = new PiRangeFieldMatch(ipv4MatchFieldId, copyFrom(matchRangeLong1),
375 copyFrom(matchRangeHighLong));
Frank Wang76057cd2017-07-15 10:22:03 +0800376 assertThat(piCriterionLong.fieldMatches().iterator().next(), is(expectedMatchLong));
Frank Wange33e4ed2017-06-28 10:01:07 +0800377 }
378
379 /**
380 * Test the equals() method of the PiCriterion class.
381 */
382 @Test
383 public void testPiExactCriterionEquals() {
384 new EqualsTester()
Carmelo Cascone22619172017-07-13 16:08:17 -0400385 .addEqualityGroup(matchPiExactByte1, sameAsMatchPiExactByte1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800386 .addEqualityGroup(matchPiExactByte2)
387 .testEquals();
388
389 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800390 .addEqualityGroup(matchPiExactShort1, sameAsMatchPiExactShort1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800391 .addEqualityGroup(matchPiExactShort2)
392 .testEquals();
393
394 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800395 .addEqualityGroup(matchPiExactInt1, sameAsMatchPiExactInt1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800396 .addEqualityGroup(matchPiExactInt2)
397 .testEquals();
398
399 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800400 .addEqualityGroup(matchPiExactLong1, sameAsMatchPiExactLong1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800401 .addEqualityGroup(matchPiExactLong2)
402 .testEquals();
403 }
404
405 /**
406 * Test the equals() method of the PiCriterion class.
407 */
408 @Test
409 public void testPiLpmCriterionEquals() {
410 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800411 .addEqualityGroup(matchPiLpmByte1, sameAsMatchPiLpmByte1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800412 .addEqualityGroup(matchPiLpmByte2)
413 .testEquals();
414
415 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800416 .addEqualityGroup(matchPiLpmShort1, sameAsMatchPiLpmShort1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800417 .addEqualityGroup(matchPiLpmShort2)
418 .testEquals();
419
420 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800421 .addEqualityGroup(matchPiLpmInt1, sameAsMatchPiLpmInt1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800422 .addEqualityGroup(matchPiLpmInt2)
423 .testEquals();
424
425 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800426 .addEqualityGroup(matchPiLpmLong1, sameAsMatchPiLpmLong1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800427 .addEqualityGroup(matchPiLpmLong2)
428 .testEquals();
429 }
430
431 /**
432 * Test the equals() method of the PiCriterion class.
433 */
434 @Test
435 public void testPiTernaryCriterionEquals() {
436 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800437 .addEqualityGroup(matchPiTernaryByte1, sameAsMatchPiTernaryByte1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800438 .addEqualityGroup(matchPiTernaryByte2)
439 .testEquals();
440
441 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800442 .addEqualityGroup(matchPiTernaryShort1, sameAsMatchPiTernaryShort1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800443 .addEqualityGroup(matchPiTernaryShort2)
444 .testEquals();
445
446 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800447 .addEqualityGroup(matchPiTernaryInt1, sameAsMatchPiTernaryInt1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800448 .addEqualityGroup(matchPiTernaryInt2)
449 .testEquals();
450
451 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800452 .addEqualityGroup(matchPiTernaryLong1, sameAsMatchPiTernaryLong1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800453 .addEqualityGroup(matchPiTernaryLong2)
454 .testEquals();
455 }
456
457 /**
458 * Test the equals() method of the PiCriterion class.
459 */
460 @Test
461 public void testPiValidCriterionEquals() {
462 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800463 .addEqualityGroup(matchPiValid1, sameAsMatchPiValid1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800464 .addEqualityGroup(matchPiValid2)
465 .testEquals();
466 }
467
468 /**
469 * Test the equals() method of the PiCriterion class.
470 */
471 @Test
472 public void testPiRangeCriterionEquals() {
473 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800474 .addEqualityGroup(matchPiRangeByte1, sameAsMatchPiRangeByte1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800475 .addEqualityGroup(matchPiRangeByte2)
476 .testEquals();
477
478 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800479 .addEqualityGroup(matchPiRangeShort1, sameAsMatchPiRangeShort1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800480 .addEqualityGroup(matchPiRangeShort2)
481 .testEquals();
482
483 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800484 .addEqualityGroup(matchPiRangeInt1, sameAsMatchPiRangeInt1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800485 .addEqualityGroup(matchPiRangeInt2)
486 .testEquals();
487
488 new EqualsTester()
Frank Wang76057cd2017-07-15 10:22:03 +0800489 .addEqualityGroup(matchPiRangeLong1, sameAsMatchPiRangeLong1)
Frank Wange33e4ed2017-06-28 10:01:07 +0800490 .addEqualityGroup(matchPiRangeLong2)
491 .testEquals();
492 }
493}