blob: bca13705315e1d046bb1ece9d938f0312518fb31 [file] [log] [blame]
Ray Milkeyf19b7152014-11-21 10:56:52 -08001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2014-present Open Networking Laboratory
Ray Milkeyf19b7152014-11-21 10:56:52 -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 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.net.flow;
Ray Milkeyf19b7152014-11-21 10:56:52 -080017
Hyunsun Moon7bfbc1c2016-04-05 16:40:43 -070018import java.util.List;
Ray Milkeyf19b7152014-11-21 10:56:52 -080019import java.util.Set;
20
Hyunsun Moon7bfbc1c2016-04-05 16:40:43 -070021import com.google.common.collect.Lists;
Ray Milkeyf19b7152014-11-21 10:56:52 -080022import org.hamcrest.Description;
23import org.hamcrest.Factory;
24import org.hamcrest.Matcher;
25import org.hamcrest.TypeSafeMatcher;
26import org.junit.Test;
Hyunsun Moon7bfbc1c2016-04-05 16:40:43 -070027import org.onlab.packet.Ethernet;
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -080028import org.onlab.packet.Ip6Address;
Ray Milkeyf19b7152014-11-21 10:56:52 -080029import org.onlab.packet.IpPrefix;
30import org.onlab.packet.MacAddress;
Michele Santuari4b6019e2014-12-19 11:31:45 +010031import org.onlab.packet.MplsLabel;
Hyunsun Mooncf732fb2015-08-22 21:04:23 -070032import org.onlab.packet.TpPort;
Ray Milkeyf19b7152014-11-21 10:56:52 -080033import org.onlab.packet.VlanId;
Sho SHIMIZU06810162016-02-24 12:52:32 -080034import org.onosproject.net.ChannelSpacing;
Carmelo Cascone17972822016-05-11 17:48:56 -070035import org.onosproject.net.DeviceId;
Sho SHIMIZU06810162016-02-24 12:52:32 -080036import org.onosproject.net.GridType;
37import org.onosproject.net.OchSignal;
Hyunsun Mooncf732fb2015-08-22 21:04:23 -070038import org.onosproject.net.PortNumber;
39import org.onosproject.net.flow.criteria.Criteria;
40import org.onosproject.net.flow.criteria.Criterion;
Ray Milkeyf19b7152014-11-21 10:56:52 -080041
42import com.google.common.testing.EqualsTester;
Carmelo Cascone17972822016-05-11 17:48:56 -070043import org.onosproject.net.flow.criteria.ExtensionSelector;
44import org.onosproject.net.flow.criteria.ExtensionSelectorType;
Ray Milkeyf19b7152014-11-21 10:56:52 -080045
46import static org.hamcrest.MatcherAssert.assertThat;
47import static org.hamcrest.Matchers.hasSize;
48import static org.hamcrest.Matchers.notNullValue;
Carmelo Cascone17972822016-05-11 17:48:56 -070049import static org.hamcrest.Matchers.is;
50import static org.hamcrest.Matchers.equalTo;
Ray Milkeyf19b7152014-11-21 10:56:52 -080051import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
Brian O'Connorabafb502014-12-02 22:26:20 -080052import static org.onosproject.net.flow.criteria.Criterion.Type;
Ray Milkeyf19b7152014-11-21 10:56:52 -080053
54/**
55 * Unit tests for default traffic selector class.
56 */
57public class DefaultTrafficSelectorTest {
58
59 /**
60 * Checks that the DefaultFlowRule class is immutable.
61 */
62 @Test
63 public void testImmutability() {
64 assertThatClassIsImmutable(DefaultTrafficSelector.class);
65 }
66
67 /**
68 * Tests equals(), hashCode() and toString() methods.
69 */
70 @Test
71 public void testEquals() {
Sho SHIMIZU260439d2015-06-30 16:35:34 -070072 final TrafficSelector selector1 = DefaultTrafficSelector.builder()
Sho SHIMIZU06810162016-02-24 12:52:32 -080073 .add(Criteria.matchLambda(new OchSignal(GridType.FLEX, ChannelSpacing.CHL_100GHZ, 1, 1)))
Sho SHIMIZU260439d2015-06-30 16:35:34 -070074 .build();
75 final TrafficSelector sameAsSelector1 = DefaultTrafficSelector.builder()
Sho SHIMIZU06810162016-02-24 12:52:32 -080076 .add(Criteria.matchLambda(new OchSignal(GridType.FLEX, ChannelSpacing.CHL_100GHZ, 1, 1)))
Sho SHIMIZU260439d2015-06-30 16:35:34 -070077 .build();
78 final TrafficSelector selector2 = DefaultTrafficSelector.builder()
Sho SHIMIZU06810162016-02-24 12:52:32 -080079 .add(Criteria.matchLambda(new OchSignal(GridType.FLEX, ChannelSpacing.CHL_50GHZ, 1, 1)))
Sho SHIMIZU260439d2015-06-30 16:35:34 -070080 .build();
Ray Milkeyf19b7152014-11-21 10:56:52 -080081
82 new EqualsTester()
83 .addEqualityGroup(selector1, sameAsSelector1)
84 .addEqualityGroup(selector2)
85 .testEquals();
86 }
87
88 /**
Hyunsun Moon7bfbc1c2016-04-05 16:40:43 -070089 * Tests criteria order is consistent.
90 */
91 @Test
92 public void testCriteriaOrder() {
93 final TrafficSelector selector1 = DefaultTrafficSelector.builder()
94 .matchInPort(PortNumber.portNumber(11))
95 .matchEthType(Ethernet.TYPE_ARP)
96 .build();
97 final TrafficSelector selector2 = DefaultTrafficSelector.builder()
98 .matchEthType(Ethernet.TYPE_ARP)
99 .matchInPort(PortNumber.portNumber(11))
100 .build();
101
102 List<Criterion> criteria1 = Lists.newArrayList(selector1.criteria());
103 List<Criterion> criteria2 = Lists.newArrayList(selector2.criteria());
104
105 new EqualsTester().addEqualityGroup(criteria1, criteria2).testEquals();
106 }
107
108 /**
Ray Milkeyff517732014-12-01 10:40:14 -0800109 * Hamcrest matcher to check that a selector contains a
110 * Criterion with the specified type.
Ray Milkeyf19b7152014-11-21 10:56:52 -0800111 */
112 public static final class CriterionExistsMatcher
113 extends TypeSafeMatcher<TrafficSelector> {
114 private final Criterion.Type type;
115
Ray Milkeyff517732014-12-01 10:40:14 -0800116 /**
117 * Constructs a matcher for the given criterion type.
118 *
119 * @param typeValue criterion type to match
120 */
Ray Milkeyf19b7152014-11-21 10:56:52 -0800121 public CriterionExistsMatcher(Criterion.Type typeValue) {
122 type = typeValue;
123 }
124
125 @Override
126 public boolean matchesSafely(TrafficSelector selector) {
127 final Set<Criterion> criteria = selector.criteria();
128
129 return notNullValue().matches(criteria) &&
130 hasSize(1).matches(criteria) &&
131 notNullValue().matches(selector.getCriterion(type));
132 }
133
134 @Override
135 public void describeTo(Description description) {
136 description.appendText("a criterion with type \" ").
137 appendText(type.toString()).
138 appendText("\"");
139 }
140 }
141
142
143 /**
Ray Milkeyff517732014-12-01 10:40:14 -0800144 * Creates a criterion type matcher. Returns a matcher
Ray Milkeyf19b7152014-11-21 10:56:52 -0800145 * for a criterion with the given type.
146 *
147 * @param type type of Criterion to match
148 * @return Matcher object
149 */
150 @Factory
151 public static Matcher<TrafficSelector> hasCriterionWithType(Criterion.Type type) {
152 return new CriterionExistsMatcher(type);
153 }
154
155
156 /**
157 * Tests the builder functions that add specific criteria.
158 */
159 @Test
160 public void testCriteriaCreation() {
161 TrafficSelector selector;
162
Pavlin Radoslavovd0fd8412015-02-04 13:57:00 -0800163 final long longValue = 0x12345678;
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800164 final int intValue = 22;
Ray Milkeyf19b7152014-11-21 10:56:52 -0800165 final short shortValue = 33;
166 final byte byteValue = 44;
Pavlin Radoslavovd0fd8412015-02-04 13:57:00 -0800167 final byte dscpValue = 0xf;
168 final byte ecnValue = 3;
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800169 final MacAddress macValue = MacAddress.valueOf("11:22:33:44:55:66");
Ray Milkeyf19b7152014-11-21 10:56:52 -0800170 final IpPrefix ipPrefixValue = IpPrefix.valueOf("192.168.1.0/24");
Charles M.C. Chan52fae7d2015-01-17 00:35:53 +0800171 final IpPrefix ipv6PrefixValue = IpPrefix.valueOf("fe80::1/64");
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800172 final Ip6Address ipv6AddressValue = Ip6Address.valueOf("fe80::1");
Ray Milkeyf19b7152014-11-21 10:56:52 -0800173
174 selector = DefaultTrafficSelector.builder()
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800175 .matchInPort(PortNumber.portNumber(11)).build();
Ray Milkeyf19b7152014-11-21 10:56:52 -0800176 assertThat(selector, hasCriterionWithType(Type.IN_PORT));
177
178 selector = DefaultTrafficSelector.builder()
Pavlin Radoslavovd0fd8412015-02-04 13:57:00 -0800179 .matchInPhyPort(PortNumber.portNumber(11)).build();
180 assertThat(selector, hasCriterionWithType(Type.IN_PHY_PORT));
181
182 selector = DefaultTrafficSelector.builder()
183 .matchMetadata(longValue).build();
184 assertThat(selector, hasCriterionWithType(Type.METADATA));
185
186 selector = DefaultTrafficSelector.builder()
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800187 .matchEthDst(macValue).build();
188 assertThat(selector, hasCriterionWithType(Type.ETH_DST));
Ray Milkeyf19b7152014-11-21 10:56:52 -0800189
190 selector = DefaultTrafficSelector.builder()
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800191 .matchEthSrc(macValue).build();
192 assertThat(selector, hasCriterionWithType(Type.ETH_SRC));
Ray Milkeyf19b7152014-11-21 10:56:52 -0800193
194 selector = DefaultTrafficSelector.builder()
195 .matchEthType(shortValue).build();
196 assertThat(selector, hasCriterionWithType(Type.ETH_TYPE));
197
198 selector = DefaultTrafficSelector.builder()
199 .matchVlanId(VlanId.vlanId(shortValue)).build();
200 assertThat(selector, hasCriterionWithType(Type.VLAN_VID));
201
202 selector = DefaultTrafficSelector.builder()
203 .matchVlanPcp(byteValue).build();
204 assertThat(selector, hasCriterionWithType(Type.VLAN_PCP));
205
206 selector = DefaultTrafficSelector.builder()
Pavlin Radoslavovd0fd8412015-02-04 13:57:00 -0800207 .matchIPDscp(dscpValue).build();
208 assertThat(selector, hasCriterionWithType(Type.IP_DSCP));
209
210 selector = DefaultTrafficSelector.builder()
211 .matchIPEcn(ecnValue).build();
212 assertThat(selector, hasCriterionWithType(Type.IP_ECN));
213
214 selector = DefaultTrafficSelector.builder()
Ray Milkeyf19b7152014-11-21 10:56:52 -0800215 .matchIPProtocol(byteValue).build();
216 assertThat(selector, hasCriterionWithType(Type.IP_PROTO));
217
218 selector = DefaultTrafficSelector.builder()
219 .matchIPSrc(ipPrefixValue).build();
220 assertThat(selector, hasCriterionWithType(Type.IPV4_SRC));
221
222 selector = DefaultTrafficSelector.builder()
223 .matchIPDst(ipPrefixValue).build();
224 assertThat(selector, hasCriterionWithType(Type.IPV4_DST));
225
226 selector = DefaultTrafficSelector.builder()
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700227 .matchTcpSrc(TpPort.tpPort(intValue)).build();
Ray Milkeyf19b7152014-11-21 10:56:52 -0800228 assertThat(selector, hasCriterionWithType(Type.TCP_SRC));
229
230 selector = DefaultTrafficSelector.builder()
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700231 .matchTcpDst(TpPort.tpPort(intValue)).build();
Ray Milkeyf19b7152014-11-21 10:56:52 -0800232 assertThat(selector, hasCriterionWithType(Type.TCP_DST));
233
234 selector = DefaultTrafficSelector.builder()
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700235 .matchUdpSrc(TpPort.tpPort(intValue)).build();
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800236 assertThat(selector, hasCriterionWithType(Type.UDP_SRC));
237
238 selector = DefaultTrafficSelector.builder()
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700239 .matchUdpDst(TpPort.tpPort(intValue)).build();
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800240 assertThat(selector, hasCriterionWithType(Type.UDP_DST));
241
242 selector = DefaultTrafficSelector.builder()
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700243 .matchSctpSrc(TpPort.tpPort(intValue)).build();
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800244 assertThat(selector, hasCriterionWithType(Type.SCTP_SRC));
245
246 selector = DefaultTrafficSelector.builder()
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700247 .matchSctpDst(TpPort.tpPort(intValue)).build();
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800248 assertThat(selector, hasCriterionWithType(Type.SCTP_DST));
249
250 selector = DefaultTrafficSelector.builder()
251 .matchIcmpType(byteValue).build();
252 assertThat(selector, hasCriterionWithType(Type.ICMPV4_TYPE));
253
254 selector = DefaultTrafficSelector.builder()
255 .matchIcmpCode(byteValue).build();
256 assertThat(selector, hasCriterionWithType(Type.ICMPV4_CODE));
257
258 selector = DefaultTrafficSelector.builder()
Charles M.C. Chan52fae7d2015-01-17 00:35:53 +0800259 .matchIPv6Src(ipv6PrefixValue).build();
260 assertThat(selector, hasCriterionWithType(Type.IPV6_SRC));
261
262 selector = DefaultTrafficSelector.builder()
263 .matchIPv6Dst(ipv6PrefixValue).build();
264 assertThat(selector, hasCriterionWithType(Type.IPV6_DST));
265
266 selector = DefaultTrafficSelector.builder()
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800267 .matchIPv6FlowLabel(intValue).build();
268 assertThat(selector, hasCriterionWithType(Type.IPV6_FLABEL));
269
270 selector = DefaultTrafficSelector.builder()
271 .matchIcmpv6Type(byteValue).build();
272 assertThat(selector, hasCriterionWithType(Type.ICMPV6_TYPE));
273
274 selector = DefaultTrafficSelector.builder()
275 .matchIPv6NDTargetAddress(ipv6AddressValue).build();
276 assertThat(selector, hasCriterionWithType(Type.IPV6_ND_TARGET));
277
278 selector = DefaultTrafficSelector.builder()
279 .matchIPv6NDSourceLinkLayerAddress(macValue).build();
280 assertThat(selector, hasCriterionWithType(Type.IPV6_ND_SLL));
281
282 selector = DefaultTrafficSelector.builder()
283 .matchIPv6NDTargetLinkLayerAddress(macValue).build();
284 assertThat(selector, hasCriterionWithType(Type.IPV6_ND_TLL));
285
286 selector = DefaultTrafficSelector.builder()
Michele Santuari4b6019e2014-12-19 11:31:45 +0100287 .matchMplsLabel(MplsLabel.mplsLabel(3)).build();
Ray Milkeyf19b7152014-11-21 10:56:52 -0800288 assertThat(selector, hasCriterionWithType(Type.MPLS_LABEL));
289
290 selector = DefaultTrafficSelector.builder()
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800291 .matchIPv6ExthdrFlags(Criterion.IPv6ExthdrFlags.NONEXT.getValue()).build();
292 assertThat(selector, hasCriterionWithType(Type.IPV6_EXTHDR));
293
294 selector = DefaultTrafficSelector.builder()
Sho SHIMIZU06810162016-02-24 12:52:32 -0800295 .add(Criteria.matchLambda(new OchSignal(GridType.DWDM, ChannelSpacing.CHL_100GHZ, 1, 1))).build();
Ray Milkeyf19b7152014-11-21 10:56:52 -0800296 assertThat(selector, hasCriterionWithType(Type.OCH_SIGID));
Carmelo Cascone17972822016-05-11 17:48:56 -0700297
298 selector = DefaultTrafficSelector.builder()
299 .matchEthDst(macValue)
300 .extension(new MockExtensionSelector(1), DeviceId.NONE)
301 .extension(new MockExtensionSelector(2), DeviceId.NONE)
302 .build();
303 assertThat(selector.criteria().size(), is(equalTo(3)));
304 }
305
306 private class MockExtensionSelector extends AbstractExtension implements ExtensionSelector {
307
308 ExtensionSelectorType type;
309
310 MockExtensionSelector(int typeInt) {
311 this.type = new ExtensionSelectorType(typeInt);
312 }
313
314 @Override
315 public ExtensionSelectorType type() {
316 return type;
317 }
318
319 @Override
320 public byte[] serialize() {
321 return new byte[0];
322 }
323
324 @Override
325 public void deserialize(byte[] data) {
326
327 }
Ray Milkeyf19b7152014-11-21 10:56:52 -0800328 }
329}