blob: 6047719bb3c1f8fccf0a7e189ab4a8a3a9e7a026 [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 =
132 DefaultGroupBucket.createSelectGroupBucket(
133 DefaultTrafficTreatment.emptyTreatment());
134 private final GroupBuckets groupBuckets =
135 new GroupBuckets(ImmutableList.of(testBucket));
136 private final GroupDescription groupDesc1 =
137 new DefaultGroupDescription(did("1"),
138 GroupDescription.Type.ALL,
139 groupBuckets);
140 private final DefaultFlowEntry fEntry = new DefaultFlowEntry(fRule(10, 10),
141 FlowEntry.FlowEntryState.ADDED, 5, 5, 5);
142 Ip4Address ipAddress;
143
144 @Test
145 public void testAppIdComparator() {
146 assertEquals(0, APP_ID_COMPARATOR.compare(appID(1, "a"), appID(1, "a")));
147 assertTrue(APP_ID_COMPARATOR.compare(appID(2, "a"), appID(0, "a")) > 0);
148 assertTrue(APP_ID_COMPARATOR.compare(appID(1, "b"), appID(3, "x")) < 0);
149 }
150
151 private ApplicationId appID(int id, String name) {
152 return new DefaultApplicationId(id, name);
153 }
154
155 @Test
156 public void testAppComparator() {
157 assertEquals(0, APP_COMPARATOR.compare(app(1, "foo"), app(1, "foo")));
158 assertEquals(0, (APP_COMPARATOR.compare(app(2, "foo"), app(2, "bar"))));
159 assertNotEquals(0, APP_COMPARATOR.compare(app(1, "foo"), app(2, "foo")));
160 assertNotEquals(0, APP_COMPARATOR.compare(app(1, "bar"), app(2, "foo")));
161 }
162
163 private Application app(int id, String name) {
Ray Milkey47c95412017-09-15 10:40:48 -0700164 return DefaultApplication.builder()
165 .withAppId(new DefaultApplicationId(id, name))
166 .withVersion(VER)
167 .withTitle(TITLE)
168 .withDescription(DESC)
169 .withOrigin(ORIGIN)
170 .withCategory(CATEGORY)
171 .withUrl(URL)
172 .withReadme(README)
173 .withIcon(ICON)
174 .withRole(ROLE)
175 .withPermissions(PERMS)
176 .withFeaturesRepo(Optional.of(FURL))
177 .withFeatures(FEATURES)
178 .withRequiredApps(APPS)
179 .build();
Sbhat3599d66962017-06-08 11:25:35 -0700180 }
181
182 @Test
183 public void testElementIdComparator() {
184 ElementId elementid1 = new ElementId() {
185 };
186 ElementId elementid2 = elementid1;
187 ElementId elementid3 = new ElementId() {
188 };
189 while (elementid1 == elementid3) {
190 elementid3 = new ElementId() {
191 };
192 }
193 assertTrue(0 == ELEMENT_ID_COMPARATOR.compare(elementid1, elementid2));
194 assertFalse(0 == ELEMENT_ID_COMPARATOR.compare(elementid3, elementid1));
195 }
196
197 @Test
198 public void testFlowRuleComparator() {
199 assertEquals(0, FLOW_RULE_COMPARATOR.compare(fRule(100, 10), fRule(100, 10)));
200 assertEquals(-8, FLOW_RULE_COMPARATOR.compare(fRule(100, 10), fRule(100, 2)));
201 assertEquals(90, FLOW_RULE_COMPARATOR.compare(fRule(100, 10), fRule(10, 10)));
202 assertEquals(20, FLOW_RULE_COMPARATOR.compare(fRule(40, 10), fRule(20, 2)));
203
204 }
205
206 private FlowRule fRule(int tableID, int priority) {
207 return DefaultFlowRule.builder()
208 .forDevice(did("id" + Integer.toString(10)))
209 .withPriority(priority)
210 .forTable(tableID)
211 .fromApp(APP_ID)
212 .makeTemporary(44)
213 .build();
214 }
215
216 @Test
217 public void testFlowEntryWithLoad() {
218 //Rate = (current-previous)/interval
Yuta HIGUCHI9312a802017-06-12 20:01:27 -0700219 assertEquals(0, FLOWENTRY_WITHLOAD_COMPARATOR.compare(flowEntryWithLoad(20, 10, 1),
220 flowEntryWithLoad(20, 10, 1)));
221 assertEquals(0, FLOWENTRY_WITHLOAD_COMPARATOR.compare(flowEntryWithLoad(50, 30, 2),
222 flowEntryWithLoad(100, 50, 5)));
223 assertEquals(-1, FLOWENTRY_WITHLOAD_COMPARATOR.compare(flowEntryWithLoad(200, 100, 4),
224 flowEntryWithLoad(300, 200, 10)));
Sbhat3599d66962017-06-08 11:25:35 -0700225 }
226
Yuta HIGUCHI9312a802017-06-12 20:01:27 -0700227 private FlowEntryWithLoad flowEntryWithLoad(long current, long previous, long interval) {
Sbhat3599d66962017-06-08 11:25:35 -0700228 return new FlowEntryWithLoad(cp, fEntry, new DefaultLoad(current, previous, interval));
229 }
230
231 @Test
232 public void testElementComparator() {
233 assertEquals(0, ELEMENT_COMPARATOR.compare(element("of", "foo", "of:foo"), element("of", "foo", "of:foo")));
234 assertEquals(0, ELEMENT_COMPARATOR.compare(element("of", "bar", "of:bar"), element("of", "foo", "of:bar")));
235 assertNotEquals(0, ELEMENT_COMPARATOR.compare(element("of", "foo", "of:foo"), element("of", "foo", "of:bar")));
236 }
237
238 private Element element(String scheme, String provID, String devID) {
239 return new DefaultDevice((new ProviderId(scheme, provID)), deviceId(devID), null, MFR, HW1, SW1, SN, CID);
240 }
241
242 @Test
243 public void testGroupComparator() {
244 assertEquals(0, GROUP_COMPARATOR.compare(group(10), group(10)));
245 assertEquals(-1, GROUP_COMPARATOR.compare(group(25), group(100)));
246 assertEquals(1, GROUP_COMPARATOR.compare(group(20), group(10)));
247 }
248
249 private Group group(int id) {
250 return new DefaultGroup(new GroupId(id), groupDesc1);
251 }
252
253 @Test
254 public void testPortComparator() {
255 assertEquals(0, PORT_COMPARATOR.compare(portTest(100), portTest(100)));
256 assertNotEquals(0, PORT_COMPARATOR.compare(portTest(100), portTest(200)));
257 }
258
259 private Port portTest(long portNumber) {
260 return new DefaultPort(null, PortNumber.portNumber(portNumber), true, Port.Type.COPPER, 100);
261 }
262
263 @Test
264 public void testTopologyClusterTest() {
265 assertEquals(0, CLUSTER_COMPARATOR.compare(cluster(3, 2, 1, "of:1"), cluster(3, 2, 1, "of:1")));
266 assertNotEquals(0, CLUSTER_COMPARATOR.compare(cluster(5, 2, 1, "of:1"), cluster(3, 2, 1, "of:1")));
267 }
268
269 private TopologyCluster cluster(int id, int dc, int lc, String root) {
270 return new DefaultTopologyCluster(clusterId(id), dc, lc,
271 new DefaultTopologyVertex(deviceId(root)));
272 }
273
274 @Test
275 public void testControllerNode() {
276 assertEquals(0, NODE_COMPARATOR.compare(node("testId"), node("testId")));
277 assertTrue(NODE_COMPARATOR.compare(node("abc"), node("xyz")) < 0);
278 assertTrue(NODE_COMPARATOR.compare(node("xyz"), node("abc")) > 0);
279 }
280
281 private ControllerNode node(String id) {
282 return new DefaultControllerNode(NodeId.nodeId(id), ipAddress, 9876);
283 }
284
285 @Test
286 public void testInterfaceComparator() {
Yuta HIGUCHI9312a802017-06-12 20:01:27 -0700287 assertEquals(0, INTERFACES_COMPARATOR.compare(intface("of:0000000000000001", 100),
288 intface("of:0000000000000001", 100)));
289 assertTrue(INTERFACES_COMPARATOR.compare(intface("of:0000000000000001", 2),
290 intface("of:0000000000000001", 100)) < 0);
291 assertTrue(INTERFACES_COMPARATOR.compare(intface("of:0000000000000001", 2),
292 intface("of:0000000000000002", 2)) < 0);
Sbhat3599d66962017-06-08 11:25:35 -0700293 }
294
295 private Interface intface(String deviceID, long port) {
296 return new Interface("testInterface", connectPoint1(deviceID, port), null, null, null);
297 }
298
299 final ConnectPoint connectPoint1(String deviceID, long portNumber) {
300 return new ConnectPoint(DeviceId.deviceId(deviceID), PortNumber.portNumber(portNumber));
301 }
302
303 @Test
304 public void testDeviceKeyComparator() {
Yuta HIGUCHI9312a802017-06-12 20:01:27 -0700305 assertEquals(0, DEVICE_KEY_COMPARATOR.compare(testDK("ID1", "label", "name"),
306 testDK("ID1", "label", "name")));
307 assertEquals(0, DEVICE_KEY_COMPARATOR.compare(testDK("ID2", "label", "name"),
308 testDK("ID2", "label", "name")));
309 assertNotEquals(0, DEVICE_KEY_COMPARATOR.compare(testDK("ID1", "label", "name"),
310 testDK("ID2", "label", "name")));
Sbhat3599d66962017-06-08 11:25:35 -0700311 }
312
Yuta HIGUCHI9312a802017-06-12 20:01:27 -0700313 private DeviceKey testDK(String id, String testLabel, String testName) {
314 return DeviceKey.createDeviceKeyUsingCommunityName(DeviceKeyId.deviceKeyId(id), testLabel, testName);
Sbhat3599d66962017-06-08 11:25:35 -0700315 }
316
317 @Test
318 public void testRegionComparator() {
319 assertEquals(0, REGION_COMPARATOR.compare(region("id1"), region("id1")));
320 assertNotEquals(0, REGION_COMPARATOR.compare(region("id1"), region("id2")));
321 }
322
323 private Region region(String id) {
324 return new DefaultRegion(RegionId.regionId(id), "name", Region.Type.METRO, DefaultAnnotations.EMPTY, null);
325 }
326
327 @Test
328 public void testTopographicLayoutComparator() {
329 assertEquals(0, LAYOUT_COMPARATOR.compare(layout("test"), layout("test")));
330 assertNotEquals(0, LAYOUT_COMPARATOR.compare(layout("same"), layout("different")));
331 }
332
333 private UiTopoLayout layout(String id) {
334 return new UiTopoLayout(UiTopoLayoutId.layoutId(id));
335 }
336
337 @Test
338 public void testTenantIdComparator() {
339 assertEquals(0, TENANT_ID_COMPARATOR.compare(id("1"), id("1")));
340 assertEquals(0, TENANT_ID_COMPARATOR.compare(id("tenant1"), id("tenant1")));
341 assertNotEquals(0, TENANT_ID_COMPARATOR.compare(id("tenant1"), id("tenant2")));
342 assertTrue(TENANT_ID_COMPARATOR.compare(id("1"), id("9")) < 0);
343 assertTrue(TENANT_ID_COMPARATOR.compare(id("Tenant5"), id("Tenant0")) > 0);
344 }
345
346 private TenantId id(String id) {
347 return TenantId.tenantId(id);
348 }
349
350 @Test
351 public void testVirtualNetworkComparator() {
352 assertNotEquals(0, VIRTUAL_NETWORK_COMPARATOR.compare(network(10, "tenantID"), network(10, "tenantID1")));
353 assertNotEquals(0, VIRTUAL_NETWORK_COMPARATOR.compare(network(10, "tenantID"), network(15, "tenantID1")));
Harold Huangd5abc4b2017-07-01 19:57:26 +0800354 assertNotEquals(0, VIRTUAL_NETWORK_COMPARATOR.compare(network(15, "tenantID1"), network(10, "tenantID1")));
Sbhat3599d66962017-06-08 11:25:35 -0700355 assertNotEquals(0, VIRTUAL_NETWORK_COMPARATOR.compare(network(15, "tenantID"), network(10, "tenantID1")));
356 }
357
358 private VirtualNetwork network(int networkID, String tenantID) {
359 return new DefaultVirtualNetwork(NetworkId.networkId(networkID), TenantId.tenantId(tenantID));
360 }
361
362 @Test
363 public void testVirtualDeviceComparator() {
Yuta HIGUCHI9312a802017-06-12 20:01:27 -0700364 assertEquals(0, VIRTUAL_DEVICE_COMPARATOR.compare(vd(0, "of:foo"), vd(0, "of:foo")));
365 assertEquals(0, VIRTUAL_DEVICE_COMPARATOR.compare(vd(3, "of:foo"), vd(0, "of:foo")));
366 assertNotEquals(0, VIRTUAL_DEVICE_COMPARATOR.compare(vd(0, "of:bar"), vd(0, "of:foo")));
367 assertNotEquals(0, VIRTUAL_DEVICE_COMPARATOR.compare(vd(3, "of:bar"), vd(0, "of:foo")));
Sbhat3599d66962017-06-08 11:25:35 -0700368 }
369
Yuta HIGUCHI9312a802017-06-12 20:01:27 -0700370 private VirtualDevice vd(int netID, String devID) {
Sbhat3599d66962017-06-08 11:25:35 -0700371 return new DefaultVirtualDevice(NetworkId.networkId(netID), DeviceId.deviceId(devID));
372 }
373
374 @Test
375 public void testVirtualPortComparator() {
376 assertEquals(0, VIRTUAL_PORT_COMPARATOR.compare(vPort(2), vPort(2)));
377 assertEquals(4, VIRTUAL_PORT_COMPARATOR.compare(vPort(900), vPort(5)));
378 assertEquals(-8, VIRTUAL_PORT_COMPARATOR.compare(vPort(0), vPort(8)));
379 }
380
381 private VirtualPort vPort(int portNumber) {
382 return new DefaultVirtualPort(NetworkId.networkId(20), new DefaultDevice(PID, DID, null, MFR, HW, SW, SN, CID),
383 PortNumber.portNumber(portNumber), new ConnectPoint(DID, PortNumber.portNumber(900)));
384 }
385}
386
387
388
389
390
391
392
393
394
395
396