blob: d616e71c36aa0534517906977dae4e84821244ab [file] [log] [blame]
Yuta HIGUCHI9312a802017-06-12 20:01:27 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Yuta HIGUCHI9312a802017-06-12 20:01:27 -07003 *
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
Sbhat3599d66962017-06-08 11:25:35 -070017package org.onosproject.utils;
18
Yuta HIGUCHI9312a802017-06-12 20:01:27 -070019import static org.junit.Assert.assertEquals;
20import static org.junit.Assert.assertFalse;
21import static org.junit.Assert.assertNotEquals;
22import static org.junit.Assert.assertTrue;
23import static org.onosproject.app.DefaultApplicationDescriptionTest.APPS;
24import static org.onosproject.app.DefaultApplicationDescriptionTest.CATEGORY;
25import static org.onosproject.app.DefaultApplicationDescriptionTest.DESC;
26import static org.onosproject.app.DefaultApplicationDescriptionTest.FEATURES;
27import static org.onosproject.app.DefaultApplicationDescriptionTest.FURL;
28import static org.onosproject.app.DefaultApplicationDescriptionTest.ICON;
29import static org.onosproject.app.DefaultApplicationDescriptionTest.ORIGIN;
30import static org.onosproject.app.DefaultApplicationDescriptionTest.PERMS;
31import static org.onosproject.app.DefaultApplicationDescriptionTest.README;
32import static org.onosproject.app.DefaultApplicationDescriptionTest.ROLE;
33import static org.onosproject.app.DefaultApplicationDescriptionTest.TITLE;
34import static org.onosproject.app.DefaultApplicationDescriptionTest.URL;
35import static org.onosproject.app.DefaultApplicationDescriptionTest.VER;
Sbhat3599d66962017-06-08 11:25:35 -070036import static org.onosproject.net.DeviceId.deviceId;
37import static org.onosproject.net.NetTestTools.APP_ID;
38import static org.onosproject.net.NetTestTools.did;
39import static org.onosproject.net.topology.ClusterId.clusterId;
40import static org.onosproject.utils.Comparators.APP_COMPARATOR;
41import static org.onosproject.utils.Comparators.APP_ID_COMPARATOR;
42import static org.onosproject.utils.Comparators.CLUSTER_COMPARATOR;
43import static org.onosproject.utils.Comparators.DEVICE_KEY_COMPARATOR;
44import static org.onosproject.utils.Comparators.ELEMENT_COMPARATOR;
45import static org.onosproject.utils.Comparators.ELEMENT_ID_COMPARATOR;
46import static org.onosproject.utils.Comparators.FLOWENTRY_WITHLOAD_COMPARATOR;
47import static org.onosproject.utils.Comparators.FLOW_RULE_COMPARATOR;
48import static org.onosproject.utils.Comparators.GROUP_COMPARATOR;
49import static org.onosproject.utils.Comparators.INTERFACES_COMPARATOR;
50import static org.onosproject.utils.Comparators.LAYOUT_COMPARATOR;
51import static org.onosproject.utils.Comparators.NODE_COMPARATOR;
52import static org.onosproject.utils.Comparators.PORT_COMPARATOR;
53import static org.onosproject.utils.Comparators.REGION_COMPARATOR;
54import static org.onosproject.utils.Comparators.TENANT_ID_COMPARATOR;
55import static org.onosproject.utils.Comparators.VIRTUAL_DEVICE_COMPARATOR;
56import static org.onosproject.utils.Comparators.VIRTUAL_NETWORK_COMPARATOR;
57import static org.onosproject.utils.Comparators.VIRTUAL_PORT_COMPARATOR;
58
Yuta HIGUCHI9312a802017-06-12 20:01:27 -070059import java.util.Optional;
60
61import org.junit.Test;
62import org.onlab.packet.ChassisId;
63import org.onlab.packet.Ip4Address;
64import org.onosproject.cluster.ControllerNode;
65import org.onosproject.cluster.DefaultControllerNode;
66import org.onosproject.cluster.NodeId;
67import org.onosproject.core.Application;
68import org.onosproject.core.ApplicationId;
69import org.onosproject.core.DefaultApplication;
70import org.onosproject.core.DefaultApplicationId;
71import org.onosproject.core.GroupId;
Ray Milkeyfacf2862017-08-03 11:58:29 -070072import org.onosproject.net.intf.Interface;
Yuta HIGUCHI9312a802017-06-12 20:01:27 -070073import org.onosproject.incubator.net.virtual.DefaultVirtualDevice;
74import org.onosproject.incubator.net.virtual.DefaultVirtualNetwork;
75import org.onosproject.incubator.net.virtual.DefaultVirtualPort;
76import org.onosproject.incubator.net.virtual.NetworkId;
77import org.onosproject.incubator.net.virtual.TenantId;
78import org.onosproject.incubator.net.virtual.VirtualDevice;
79import org.onosproject.incubator.net.virtual.VirtualNetwork;
80import org.onosproject.incubator.net.virtual.VirtualPort;
81import org.onosproject.net.ConnectPoint;
82import org.onosproject.net.DefaultAnnotations;
83import org.onosproject.net.DefaultDevice;
84import org.onosproject.net.DefaultPort;
85import org.onosproject.net.DeviceId;
86import org.onosproject.net.Element;
87import org.onosproject.net.ElementId;
88import org.onosproject.net.Port;
89import org.onosproject.net.PortNumber;
90import org.onosproject.net.flow.DefaultFlowEntry;
91import org.onosproject.net.flow.DefaultFlowRule;
92import org.onosproject.net.flow.DefaultTrafficTreatment;
93import org.onosproject.net.flow.FlowEntry;
94import org.onosproject.net.flow.FlowRule;
95import org.onosproject.net.group.DefaultGroup;
96import org.onosproject.net.group.DefaultGroupBucket;
97import org.onosproject.net.group.DefaultGroupDescription;
98import org.onosproject.net.group.Group;
99import org.onosproject.net.group.GroupBucket;
100import org.onosproject.net.group.GroupBuckets;
101import org.onosproject.net.group.GroupDescription;
102import org.onosproject.net.key.DeviceKey;
103import org.onosproject.net.key.DeviceKeyId;
104import org.onosproject.net.provider.ProviderId;
105import org.onosproject.net.region.DefaultRegion;
106import org.onosproject.net.region.Region;
107import org.onosproject.net.region.RegionId;
108import org.onosproject.net.statistic.DefaultLoad;
109import org.onosproject.net.statistic.FlowEntryWithLoad;
110import org.onosproject.net.topology.DefaultTopologyCluster;
111import org.onosproject.net.topology.DefaultTopologyVertex;
112import org.onosproject.net.topology.TopologyCluster;
113import org.onosproject.ui.model.topo.UiTopoLayout;
114import org.onosproject.ui.model.topo.UiTopoLayoutId;
115
116import com.google.common.collect.ImmutableList;
117
Sbhat3599d66962017-06-08 11:25:35 -0700118
119public class ComparatorsTest {
Yuta HIGUCHI9312a802017-06-12 20:01:27 -0700120 private static final ProviderId PID = new ProviderId("of", "foo");
121 private static final DeviceId DID = deviceId("of:foo");
122 private static final String MFR = "whitebox";
123 private static final String HW = "1.1.x";
124 private static final String HW1 = "2.2.x";
125 private static final String SW = "3.9.1";
126 private static final String SW1 = "4.0.0";
127 private static final String SN = "43311-12345";
128 private static final ChassisId CID = new ChassisId();
Sbhat3599d66962017-06-08 11:25:35 -0700129 private final ConnectPoint cp =
130 new ConnectPoint(DeviceId.deviceId("of:00001"), PortNumber.portNumber(100));
131 private final GroupBucket testBucket =
Charles Chanc88ebaa2018-11-01 20:08:47 -0700132 DefaultGroupBucket.createAllGroupBucket(DefaultTrafficTreatment.emptyTreatment());
Sbhat3599d66962017-06-08 11:25:35 -0700133 private final GroupBuckets groupBuckets =
134 new GroupBuckets(ImmutableList.of(testBucket));
135 private final GroupDescription groupDesc1 =
136 new DefaultGroupDescription(did("1"),
137 GroupDescription.Type.ALL,
138 groupBuckets);
139 private final DefaultFlowEntry fEntry = new DefaultFlowEntry(fRule(10, 10),
140 FlowEntry.FlowEntryState.ADDED, 5, 5, 5);
141 Ip4Address ipAddress;
142
143 @Test
144 public void testAppIdComparator() {
145 assertEquals(0, APP_ID_COMPARATOR.compare(appID(1, "a"), appID(1, "a")));
146 assertTrue(APP_ID_COMPARATOR.compare(appID(2, "a"), appID(0, "a")) > 0);
147 assertTrue(APP_ID_COMPARATOR.compare(appID(1, "b"), appID(3, "x")) < 0);
148 }
149
150 private ApplicationId appID(int id, String name) {
151 return new DefaultApplicationId(id, name);
152 }
153
154 @Test
155 public void testAppComparator() {
156 assertEquals(0, APP_COMPARATOR.compare(app(1, "foo"), app(1, "foo")));
157 assertEquals(0, (APP_COMPARATOR.compare(app(2, "foo"), app(2, "bar"))));
158 assertNotEquals(0, APP_COMPARATOR.compare(app(1, "foo"), app(2, "foo")));
159 assertNotEquals(0, APP_COMPARATOR.compare(app(1, "bar"), app(2, "foo")));
160 }
161
162 private Application app(int id, String name) {
Ray Milkey47c95412017-09-15 10:40:48 -0700163 return DefaultApplication.builder()
164 .withAppId(new DefaultApplicationId(id, name))
165 .withVersion(VER)
166 .withTitle(TITLE)
167 .withDescription(DESC)
168 .withOrigin(ORIGIN)
169 .withCategory(CATEGORY)
170 .withUrl(URL)
171 .withReadme(README)
172 .withIcon(ICON)
173 .withRole(ROLE)
174 .withPermissions(PERMS)
175 .withFeaturesRepo(Optional.of(FURL))
176 .withFeatures(FEATURES)
177 .withRequiredApps(APPS)
178 .build();
Sbhat3599d66962017-06-08 11:25:35 -0700179 }
180
181 @Test
182 public void testElementIdComparator() {
183 ElementId elementid1 = new ElementId() {
184 };
185 ElementId elementid2 = elementid1;
186 ElementId elementid3 = new ElementId() {
187 };
188 while (elementid1 == elementid3) {
189 elementid3 = new ElementId() {
190 };
191 }
192 assertTrue(0 == ELEMENT_ID_COMPARATOR.compare(elementid1, elementid2));
193 assertFalse(0 == ELEMENT_ID_COMPARATOR.compare(elementid3, elementid1));
194 }
195
196 @Test
197 public void testFlowRuleComparator() {
198 assertEquals(0, FLOW_RULE_COMPARATOR.compare(fRule(100, 10), fRule(100, 10)));
199 assertEquals(-8, FLOW_RULE_COMPARATOR.compare(fRule(100, 10), fRule(100, 2)));
200 assertEquals(90, FLOW_RULE_COMPARATOR.compare(fRule(100, 10), fRule(10, 10)));
201 assertEquals(20, FLOW_RULE_COMPARATOR.compare(fRule(40, 10), fRule(20, 2)));
202
203 }
204
205 private FlowRule fRule(int tableID, int priority) {
206 return DefaultFlowRule.builder()
207 .forDevice(did("id" + Integer.toString(10)))
208 .withPriority(priority)
209 .forTable(tableID)
210 .fromApp(APP_ID)
211 .makeTemporary(44)
212 .build();
213 }
214
215 @Test
216 public void testFlowEntryWithLoad() {
217 //Rate = (current-previous)/interval
Yuta HIGUCHI9312a802017-06-12 20:01:27 -0700218 assertEquals(0, FLOWENTRY_WITHLOAD_COMPARATOR.compare(flowEntryWithLoad(20, 10, 1),
219 flowEntryWithLoad(20, 10, 1)));
220 assertEquals(0, FLOWENTRY_WITHLOAD_COMPARATOR.compare(flowEntryWithLoad(50, 30, 2),
221 flowEntryWithLoad(100, 50, 5)));
222 assertEquals(-1, FLOWENTRY_WITHLOAD_COMPARATOR.compare(flowEntryWithLoad(200, 100, 4),
223 flowEntryWithLoad(300, 200, 10)));
Sbhat3599d66962017-06-08 11:25:35 -0700224 }
225
Yuta HIGUCHI9312a802017-06-12 20:01:27 -0700226 private FlowEntryWithLoad flowEntryWithLoad(long current, long previous, long interval) {
Sbhat3599d66962017-06-08 11:25:35 -0700227 return new FlowEntryWithLoad(cp, fEntry, new DefaultLoad(current, previous, interval));
228 }
229
230 @Test
231 public void testElementComparator() {
232 assertEquals(0, ELEMENT_COMPARATOR.compare(element("of", "foo", "of:foo"), element("of", "foo", "of:foo")));
233 assertEquals(0, ELEMENT_COMPARATOR.compare(element("of", "bar", "of:bar"), element("of", "foo", "of:bar")));
234 assertNotEquals(0, ELEMENT_COMPARATOR.compare(element("of", "foo", "of:foo"), element("of", "foo", "of:bar")));
235 }
236
237 private Element element(String scheme, String provID, String devID) {
238 return new DefaultDevice((new ProviderId(scheme, provID)), deviceId(devID), null, MFR, HW1, SW1, SN, CID);
239 }
240
241 @Test
242 public void testGroupComparator() {
243 assertEquals(0, GROUP_COMPARATOR.compare(group(10), group(10)));
244 assertEquals(-1, GROUP_COMPARATOR.compare(group(25), group(100)));
245 assertEquals(1, GROUP_COMPARATOR.compare(group(20), group(10)));
246 }
247
248 private Group group(int id) {
249 return new DefaultGroup(new GroupId(id), groupDesc1);
250 }
251
252 @Test
253 public void testPortComparator() {
254 assertEquals(0, PORT_COMPARATOR.compare(portTest(100), portTest(100)));
255 assertNotEquals(0, PORT_COMPARATOR.compare(portTest(100), portTest(200)));
256 }
257
258 private Port portTest(long portNumber) {
259 return new DefaultPort(null, PortNumber.portNumber(portNumber), true, Port.Type.COPPER, 100);
260 }
261
262 @Test
263 public void testTopologyClusterTest() {
264 assertEquals(0, CLUSTER_COMPARATOR.compare(cluster(3, 2, 1, "of:1"), cluster(3, 2, 1, "of:1")));
265 assertNotEquals(0, CLUSTER_COMPARATOR.compare(cluster(5, 2, 1, "of:1"), cluster(3, 2, 1, "of:1")));
266 }
267
268 private TopologyCluster cluster(int id, int dc, int lc, String root) {
269 return new DefaultTopologyCluster(clusterId(id), dc, lc,
270 new DefaultTopologyVertex(deviceId(root)));
271 }
272
273 @Test
274 public void testControllerNode() {
275 assertEquals(0, NODE_COMPARATOR.compare(node("testId"), node("testId")));
276 assertTrue(NODE_COMPARATOR.compare(node("abc"), node("xyz")) < 0);
277 assertTrue(NODE_COMPARATOR.compare(node("xyz"), node("abc")) > 0);
278 }
279
280 private ControllerNode node(String id) {
281 return new DefaultControllerNode(NodeId.nodeId(id), ipAddress, 9876);
282 }
283
284 @Test
285 public void testInterfaceComparator() {
Yuta HIGUCHI9312a802017-06-12 20:01:27 -0700286 assertEquals(0, INTERFACES_COMPARATOR.compare(intface("of:0000000000000001", 100),
287 intface("of:0000000000000001", 100)));
288 assertTrue(INTERFACES_COMPARATOR.compare(intface("of:0000000000000001", 2),
289 intface("of:0000000000000001", 100)) < 0);
290 assertTrue(INTERFACES_COMPARATOR.compare(intface("of:0000000000000001", 2),
291 intface("of:0000000000000002", 2)) < 0);
Sbhat3599d66962017-06-08 11:25:35 -0700292 }
293
294 private Interface intface(String deviceID, long port) {
295 return new Interface("testInterface", connectPoint1(deviceID, port), null, null, null);
296 }
297
298 final ConnectPoint connectPoint1(String deviceID, long portNumber) {
299 return new ConnectPoint(DeviceId.deviceId(deviceID), PortNumber.portNumber(portNumber));
300 }
301
302 @Test
303 public void testDeviceKeyComparator() {
Yuta HIGUCHI9312a802017-06-12 20:01:27 -0700304 assertEquals(0, DEVICE_KEY_COMPARATOR.compare(testDK("ID1", "label", "name"),
305 testDK("ID1", "label", "name")));
306 assertEquals(0, DEVICE_KEY_COMPARATOR.compare(testDK("ID2", "label", "name"),
307 testDK("ID2", "label", "name")));
308 assertNotEquals(0, DEVICE_KEY_COMPARATOR.compare(testDK("ID1", "label", "name"),
309 testDK("ID2", "label", "name")));
Sbhat3599d66962017-06-08 11:25:35 -0700310 }
311
Yuta HIGUCHI9312a802017-06-12 20:01:27 -0700312 private DeviceKey testDK(String id, String testLabel, String testName) {
313 return DeviceKey.createDeviceKeyUsingCommunityName(DeviceKeyId.deviceKeyId(id), testLabel, testName);
Sbhat3599d66962017-06-08 11:25:35 -0700314 }
315
316 @Test
317 public void testRegionComparator() {
318 assertEquals(0, REGION_COMPARATOR.compare(region("id1"), region("id1")));
319 assertNotEquals(0, REGION_COMPARATOR.compare(region("id1"), region("id2")));
320 }
321
322 private Region region(String id) {
323 return new DefaultRegion(RegionId.regionId(id), "name", Region.Type.METRO, DefaultAnnotations.EMPTY, null);
324 }
325
326 @Test
327 public void testTopographicLayoutComparator() {
328 assertEquals(0, LAYOUT_COMPARATOR.compare(layout("test"), layout("test")));
329 assertNotEquals(0, LAYOUT_COMPARATOR.compare(layout("same"), layout("different")));
330 }
331
332 private UiTopoLayout layout(String id) {
333 return new UiTopoLayout(UiTopoLayoutId.layoutId(id));
334 }
335
336 @Test
337 public void testTenantIdComparator() {
338 assertEquals(0, TENANT_ID_COMPARATOR.compare(id("1"), id("1")));
339 assertEquals(0, TENANT_ID_COMPARATOR.compare(id("tenant1"), id("tenant1")));
340 assertNotEquals(0, TENANT_ID_COMPARATOR.compare(id("tenant1"), id("tenant2")));
341 assertTrue(TENANT_ID_COMPARATOR.compare(id("1"), id("9")) < 0);
342 assertTrue(TENANT_ID_COMPARATOR.compare(id("Tenant5"), id("Tenant0")) > 0);
343 }
344
345 private TenantId id(String id) {
346 return TenantId.tenantId(id);
347 }
348
349 @Test
350 public void testVirtualNetworkComparator() {
351 assertNotEquals(0, VIRTUAL_NETWORK_COMPARATOR.compare(network(10, "tenantID"), network(10, "tenantID1")));
352 assertNotEquals(0, VIRTUAL_NETWORK_COMPARATOR.compare(network(10, "tenantID"), network(15, "tenantID1")));
Harold Huangd5abc4b2017-07-01 19:57:26 +0800353 assertNotEquals(0, VIRTUAL_NETWORK_COMPARATOR.compare(network(15, "tenantID1"), network(10, "tenantID1")));
Sbhat3599d66962017-06-08 11:25:35 -0700354 assertNotEquals(0, VIRTUAL_NETWORK_COMPARATOR.compare(network(15, "tenantID"), network(10, "tenantID1")));
355 }
356
357 private VirtualNetwork network(int networkID, String tenantID) {
358 return new DefaultVirtualNetwork(NetworkId.networkId(networkID), TenantId.tenantId(tenantID));
359 }
360
361 @Test
362 public void testVirtualDeviceComparator() {
Yuta HIGUCHI9312a802017-06-12 20:01:27 -0700363 assertEquals(0, VIRTUAL_DEVICE_COMPARATOR.compare(vd(0, "of:foo"), vd(0, "of:foo")));
364 assertEquals(0, VIRTUAL_DEVICE_COMPARATOR.compare(vd(3, "of:foo"), vd(0, "of:foo")));
365 assertNotEquals(0, VIRTUAL_DEVICE_COMPARATOR.compare(vd(0, "of:bar"), vd(0, "of:foo")));
366 assertNotEquals(0, VIRTUAL_DEVICE_COMPARATOR.compare(vd(3, "of:bar"), vd(0, "of:foo")));
Sbhat3599d66962017-06-08 11:25:35 -0700367 }
368
Yuta HIGUCHI9312a802017-06-12 20:01:27 -0700369 private VirtualDevice vd(int netID, String devID) {
Sbhat3599d66962017-06-08 11:25:35 -0700370 return new DefaultVirtualDevice(NetworkId.networkId(netID), DeviceId.deviceId(devID));
371 }
372
373 @Test
374 public void testVirtualPortComparator() {
375 assertEquals(0, VIRTUAL_PORT_COMPARATOR.compare(vPort(2), vPort(2)));
376 assertEquals(4, VIRTUAL_PORT_COMPARATOR.compare(vPort(900), vPort(5)));
377 assertEquals(-8, VIRTUAL_PORT_COMPARATOR.compare(vPort(0), vPort(8)));
378 }
379
380 private VirtualPort vPort(int portNumber) {
381 return new DefaultVirtualPort(NetworkId.networkId(20), new DefaultDevice(PID, DID, null, MFR, HW, SW, SN, CID),
382 PortNumber.portNumber(portNumber), new ConnectPoint(DID, PortNumber.portNumber(900)));
383 }
384}
385
386
387
388
389
390
391
392
393
394
395