blob: 481e7f757ba3c5f58361341265b6c9f705fa579e [file] [log] [blame]
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2015-present Open Networking Laboratory
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -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 */
Thomas Vachuska930a8ee2015-08-04 18:49:36 -070016package org.onosproject.common;
tomdc95b8a2014-09-17 08:07:26 -070017
18import org.junit.Before;
19import org.junit.Test;
Andrey Komarov2398d962016-09-26 15:11:23 +030020import org.onlab.graph.DefaultEdgeWeigher;
21import org.onlab.graph.ScalarWeight;
22import org.onlab.graph.Weight;
Thomas Vachuskac31d9f12015-01-22 12:33:27 -080023import org.onlab.packet.ChassisId;
Brian O'Connorabafb502014-12-02 22:26:20 -080024import org.onosproject.net.ConnectPoint;
25import org.onosproject.net.DefaultDevice;
26import org.onosproject.net.DefaultLink;
27import org.onosproject.net.Device;
28import org.onosproject.net.DeviceId;
29import org.onosproject.net.Link;
30import org.onosproject.net.Path;
31import org.onosproject.net.PortNumber;
32import org.onosproject.net.provider.ProviderId;
33import org.onosproject.net.topology.ClusterId;
34import org.onosproject.net.topology.DefaultGraphDescription;
Jon Halle7539632016-05-11 15:44:31 -070035import org.onosproject.net.topology.DefaultTopologyVertex;
Brian O'Connorabafb502014-12-02 22:26:20 -080036import org.onosproject.net.topology.GraphDescription;
Andrey Komarov2398d962016-09-26 15:11:23 +030037import org.onosproject.net.topology.LinkWeigher;
Brian O'Connorabafb502014-12-02 22:26:20 -080038import org.onosproject.net.topology.TopologyCluster;
Andrey Komarov2398d962016-09-26 15:11:23 +030039import org.onosproject.net.topology.TopologyEdge;
Jon Halle7539632016-05-11 15:44:31 -070040import org.onosproject.net.topology.TopologyVertex;
tomdc95b8a2014-09-17 08:07:26 -070041
42import java.util.Set;
tomdc95b8a2014-09-17 08:07:26 -070043import static com.google.common.collect.ImmutableSet.of;
44import static org.junit.Assert.*;
Brian O'Connorabafb502014-12-02 22:26:20 -080045import static org.onosproject.net.DeviceId.deviceId;
46import static org.onosproject.net.PortNumber.portNumber;
tomdc95b8a2014-09-17 08:07:26 -070047
48/**
49 * Test of the default topology implementation.
50 */
51public class DefaultTopologyTest {
52
tom7e02cda2014-09-18 12:05:46 -070053 public static final ProviderId PID = new ProviderId("of", "foo.bar");
tomdc95b8a2014-09-17 08:07:26 -070054
55 public static final DeviceId D1 = deviceId("of:1");
56 public static final DeviceId D2 = deviceId("of:2");
57 public static final DeviceId D3 = deviceId("of:3");
58 public static final DeviceId D4 = deviceId("of:4");
59 public static final DeviceId D5 = deviceId("of:5");
60
Jon Halle7539632016-05-11 15:44:31 -070061 public static final TopologyVertex V1 = new DefaultTopologyVertex(D1);
62 public static final TopologyVertex V5 = new DefaultTopologyVertex(D5);
63
tomdc95b8a2014-09-17 08:07:26 -070064 public static final PortNumber P1 = portNumber(1);
65 public static final PortNumber P2 = portNumber(2);
66
Andrey Komarov2398d962016-09-26 15:11:23 +030067 public static final class TestLinkWeigher
68 extends DefaultEdgeWeigher<TopologyVertex, TopologyEdge>
69 implements LinkWeigher {
70 @Override
71 public Weight weight(TopologyEdge edge) {
72 double value = edge.src().deviceId().equals(D4) ||
73 edge.dst().deviceId().equals(D4)
74 ? 2.0 : HOP_WEIGHT_VALUE;
75 return new ScalarWeight(value);
76 }
77 }
78 public static final LinkWeigher WEIGHER = new TestLinkWeigher();
79
tomdc95b8a2014-09-17 08:07:26 -070080
81 private DefaultTopology dt;
82
Jon Halle7539632016-05-11 15:44:31 -070083 public static final ClusterId C0 = ClusterId.clusterId(0);
84 public static final ClusterId C1 = ClusterId.clusterId(1);
85
tomdc95b8a2014-09-17 08:07:26 -070086 @Before
87 public void setUp() {
88 long now = System.currentTimeMillis();
89 Set<Device> devices = of(device("1"), device("2"),
90 device("3"), device("4"),
91 device("5"));
92 Set<Link> links = of(link("1", 1, "2", 1), link("2", 1, "1", 1),
93 link("3", 2, "2", 2), link("2", 2, "3", 2),
94 link("1", 3, "4", 3), link("4", 3, "1", 3),
95 link("3", 4, "4", 4), link("4", 4, "3", 4));
96 GraphDescription graphDescription =
Sho SHIMIZU2581e182015-09-25 10:22:33 -070097 new DefaultGraphDescription(now, System.currentTimeMillis(), devices, links);
tomdc95b8a2014-09-17 08:07:26 -070098
99 dt = new DefaultTopology(PID, graphDescription);
100 assertEquals("incorrect supplier", PID, dt.providerId());
101 assertEquals("incorrect time", now, dt.time());
102 assertEquals("incorrect device count", 5, dt.deviceCount());
103 assertEquals("incorrect link count", 8, dt.linkCount());
104 assertEquals("incorrect cluster count", 2, dt.clusterCount());
Jon Halle7539632016-05-11 15:44:31 -0700105 assertEquals("incorrect broadcast set size", 6, dt.broadcastSetSize(C0));
106 assertEquals("incorrect root node", V1, dt.getCluster(C0).root());
107 assertEquals("incorrect root node", V5, dt.getCluster(C1).root());
tomdc95b8a2014-09-17 08:07:26 -0700108 }
109
110 @Test
111 public void pathRelated() {
112 Set<Path> paths = dt.getPaths(D1, D2);
113 assertEquals("incorrect path count", 1, paths.size());
114
115 paths = dt.getPaths(D1, D3);
116 assertEquals("incorrect path count", 2, paths.size());
117
118 paths = dt.getPaths(D1, D5);
119 assertTrue("no paths expected", paths.isEmpty());
120
Andrey Komarov2398d962016-09-26 15:11:23 +0300121 paths = dt.getPaths(D1, D3, WEIGHER);
tomdc95b8a2014-09-17 08:07:26 -0700122 assertEquals("incorrect path count", 1, paths.size());
Yuta HIGUCHIac8b2292017-03-30 19:21:57 -0700123
124 paths = dt.getKShortestPaths(D1, D2, 42);
125 assertEquals("incorrect path count", 2, paths.size());
126
127 assertEquals("incorrect path count", 2, dt.getKShortestPaths(D1, D2).limit(42).count());
128
tomdc95b8a2014-09-17 08:07:26 -0700129 }
130
131 @Test
132 public void pointRelated() {
133 assertTrue("should be infrastructure point",
134 dt.isInfrastructure(new ConnectPoint(D1, P1)));
135 assertFalse("should not be infrastructure point",
136 dt.isInfrastructure(new ConnectPoint(D1, P2)));
137 }
138
139 @Test
140 public void clusterRelated() {
141 Set<TopologyCluster> clusters = dt.getClusters();
142 assertEquals("incorrect cluster count", 2, clusters.size());
143
144 TopologyCluster c = dt.getCluster(D1);
145 Set<DeviceId> devs = dt.getClusterDevices(c);
146 assertEquals("incorrect cluster device count", 4, devs.size());
147 assertTrue("cluster should contain D2", devs.contains(D2));
148 assertFalse("cluster should not contain D5", devs.contains(D5));
149 }
150
tombe988312014-09-19 18:38:47 -0700151 // Short-hand for creating a link.
152 public static Link link(String src, int sp, String dst, int dp) {
Ray Milkey2693bda2016-01-22 16:08:14 -0800153 return DefaultLink.builder().providerId(PID)
154 .src(new ConnectPoint(did(src), portNumber(sp)))
155 .dst(new ConnectPoint(did(dst), portNumber(dp)))
156 .type(Link.Type.DIRECT)
157 .build();
tombe988312014-09-19 18:38:47 -0700158 }
159
160 // Crates a new device with the specified id
161 public static Device device(String id) {
162 return new DefaultDevice(PID, did(id), Device.Type.SWITCH,
alshabib7911a052014-10-16 17:49:37 -0700163 "mfg", "1.0", "1.1", "1234", new ChassisId());
tombe988312014-09-19 18:38:47 -0700164 }
165
166 // Short-hand for producing a device id from a string
167 public static DeviceId did(String id) {
168 return deviceId("of:" + id);
169 }
170
tomdc95b8a2014-09-17 08:07:26 -0700171}