blob: d25fd59b13fdd11f624ff4aa85a8de0305dfb6ef [file] [log] [blame]
Ray Milkeyc401e6e2015-01-24 10:40:03 -08001/*
2 * Copyright 2015 Open Networking Laboratory
3 *
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 */
16package org.onosproject.rest;
17
18import java.util.Set;
19
20import org.junit.Before;
21import org.junit.Test;
22import org.onlab.osgi.ServiceDirectory;
23import org.onlab.osgi.TestServiceDirectory;
24import org.onlab.rest.BaseResource;
25import org.onosproject.codec.CodecService;
26import org.onosproject.codec.impl.CodecManager;
27import org.onosproject.net.ConnectPoint;
28import org.onosproject.net.DeviceId;
29import org.onosproject.net.Link;
30import org.onosproject.net.Path;
31import org.onosproject.net.provider.ProviderId;
32import org.onosproject.net.topology.ClusterId;
33import org.onosproject.net.topology.DefaultTopologyCluster;
34import org.onosproject.net.topology.DefaultTopologyVertex;
35import org.onosproject.net.topology.LinkWeight;
36import org.onosproject.net.topology.Topology;
37import org.onosproject.net.topology.TopologyCluster;
38import org.onosproject.net.topology.TopologyGraph;
39import org.onosproject.net.topology.TopologyListener;
40import org.onosproject.net.topology.TopologyService;
41
42import com.eclipsesource.json.JsonArray;
43import com.eclipsesource.json.JsonObject;
44import com.google.common.collect.ImmutableSet;
45import com.sun.jersey.api.client.WebResource;
Ray Milkeyc401e6e2015-01-24 10:40:03 -080046
47import static org.hamcrest.Matchers.hasSize;
48import static org.hamcrest.Matchers.is;
49import static org.hamcrest.Matchers.notNullValue;
50import static org.hamcrest.Matchers.containsString;
51import static org.junit.Assert.assertThat;
52import static org.onosproject.net.NetTestTools.did;
53import static org.onosproject.net.NetTestTools.link;
54
55/**
56 * Unit tests for Topology REST APIs.
57 */
Ray Milkey9c3d3362015-01-28 10:39:56 -080058public class TopologyResourceTest extends ResourceTest {
Ray Milkeyc401e6e2015-01-24 10:40:03 -080059
60 private static class MockTopology implements Topology {
61 @Override
62 public long time() {
63 return 11111L;
64 }
65
66 @Override
67 public long computeCost() {
68 return 0;
69 }
70
71 @Override
72 public int clusterCount() {
73 return 2;
74 }
75
76 @Override
77 public int deviceCount() {
78 return 6;
79 }
80
81 @Override
82 public int linkCount() {
83 return 4;
84 }
85
86 @Override
87 public ProviderId providerId() {
88 return ProviderId.NONE;
89 }
90 }
91
92 private static class MockTopologyService implements TopologyService {
93 final DefaultTopologyVertex root = new DefaultTopologyVertex(did("rootnode"));
94 final Topology topology = new MockTopology();
95 final TopologyCluster cluster1 =
96 new DefaultTopologyCluster(ClusterId.clusterId(0),
97 2, 1, root);
98 final TopologyCluster cluster2 =
99 new DefaultTopologyCluster(ClusterId.clusterId(1),
100 4, 3, root);
101
102 @Override
103 public Topology currentTopology() {
104 return topology;
105 }
106
107 @Override
108 public boolean isLatest(Topology topology) {
109 return true;
110 }
111
112 @Override
113 public TopologyGraph getGraph(Topology topology) {
114 return null;
115 }
116
117 @Override
118 public Set<TopologyCluster> getClusters(Topology topology) {
119 return ImmutableSet.of(cluster1, cluster2);
120 }
121
122 @Override
123 public TopologyCluster getCluster(Topology topology, ClusterId clusterId) {
124 return cluster1;
125 }
126
127 @Override
128 public Set<DeviceId> getClusterDevices(Topology topology, TopologyCluster cluster) {
129 DeviceId device1 = did("dev1");
130 DeviceId device2 = did("dev2");
131
132 return ImmutableSet.of(device1, device2);
133 }
134
135 @Override
136 public Set<Link> getClusterLinks(Topology topology, TopologyCluster cluster) {
137 Link link1 = link("src1", 1, "dst1", 1);
138 Link link2 = link("src2", 1, "dst2", 1);
139 Link link3 = link("src3", 1, "dst3", 1);
140 return ImmutableSet.of(link1, link2, link3);
141 }
142
143 @Override
144 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst) {
145 return null;
146 }
147
148 @Override
149 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight) {
150 return null;
151 }
152
153 @Override
154 public boolean isInfrastructure(Topology topology, ConnectPoint connectPoint) {
155 return connectPoint.elementId().toString().equals("dev2");
156 }
157
158 @Override
159 public boolean isBroadcastPoint(Topology topology, ConnectPoint connectPoint) {
160 return connectPoint.elementId().toString().equals("dev1");
161 }
162
163 @Override
164 public void addListener(TopologyListener listener) {
165
166 }
167
168 @Override
169 public void removeListener(TopologyListener listener) {
170
171 }
172 }
173
Ray Milkeyc401e6e2015-01-24 10:40:03 -0800174 /**
175 * Initializes the test harness.
176 */
177 @Before
178 public void setUp() {
179 TopologyService topologyService = new MockTopologyService();
180 CodecManager codecService = new CodecManager();
181 codecService.activate();
182
183 ServiceDirectory testDirectory =
184 new TestServiceDirectory()
185 .add(TopologyService.class, topologyService)
186 .add(CodecService.class, codecService);
187 BaseResource.setServiceDirectory(testDirectory);
188 }
189
190 /**
191 * Tests the topology overview.
192 */
193 @Test
194 public void getTopology() {
195 WebResource rs = resource();
196 String response = rs.path("topology").get(String.class);
197 JsonObject result = JsonObject.readFrom(response);
198 assertThat(result, notNullValue());
199
200 assertThat(result.names(), hasSize(4));
201
202 assertThat(result.get("time").asLong(), is(11111L));
203 assertThat(result.get("clusters").asLong(), is(2L));
204 assertThat(result.get("devices").asLong(), is(6L));
205 assertThat(result.get("links").asLong(), is(4L));
206 }
207
208 /**
209 * Tests the clusters overview.
210 */
211 @Test
212 public void getTopologyClusters() {
213 WebResource rs = resource();
214 String response = rs.path("topology/clusters").get(String.class);
215 JsonObject result = JsonObject.readFrom(response);
216 assertThat(result, notNullValue());
217
218 assertThat(result.names(), hasSize(1));
219 JsonArray clusters = result.get("clusters").asArray();
220 assertThat(clusters, notNullValue());
221 assertThat(clusters.size(), is(2));
222 }
223
224 /**
225 * Tests an individual cluster overview.
226 */
227 @Test
228 public void getCluster() {
229 WebResource rs = resource();
230 String response = rs.path("topology/clusters/0").get(String.class);
231 JsonObject result = JsonObject.readFrom(response);
232 assertThat(result, notNullValue());
233
234 assertThat(result.get("id").asLong(), is(0L));
235 assertThat(result.get("deviceCount").asLong(), is(2L));
236 assertThat(result.get("linkCount").asLong(), is(1L));
237 assertThat(result.get("root").asString(), containsString("rootnode"));
238
239 assertThat(result.names(), hasSize(4));
240 }
241
242 /**
243 * Tests an individual cluster's devices list.
244 */
245 @Test
246 public void getClusterDevices() {
247 WebResource rs = resource();
248 String response = rs.path("topology/clusters/0/devices").get(String.class);
249 JsonObject result = JsonObject.readFrom(response);
250 assertThat(result, notNullValue());
251
252 JsonArray devices = result.get("devices").asArray();
253 assertThat(devices.size(), is(2));
254
255 assertThat(devices.get(0).asString(), is("of:dev1"));
256 assertThat(devices.get(1).asString(), is("of:dev2"));
257 }
258
259 /**
260 * Tests an individual cluster's links list.
261 */
262 @Test
263 public void getClusterLinks() {
264 WebResource rs = resource();
265 String response = rs.path("topology/clusters/1/links").get(String.class);
266 JsonObject result = JsonObject.readFrom(response);
267 assertThat(result, notNullValue());
268
269 JsonArray links = result.get("links").asArray();
270 assertThat(links.size(), is(3));
271
272 JsonObject link0 = links.get(0).asObject();
273 JsonObject src0 = link0.get("src").asObject();
274 String device0 = src0.get("device").asString();
275 assertThat(device0, is("of:src1"));
276
277 JsonObject link2 = links.get(2).asObject();
278 JsonObject src2 = link2.get("src").asObject();
279 String device2 = src2.get("device").asString();
280 assertThat(device2, is("of:src3"));
281 }
282
283 /**
284 * Tests a broadcast query.
285 */
286 @Test
287 public void getBroadcast() {
288 WebResource rs = resource();
289 String response = rs.path("topology/broadcast/dev1:1").get(String.class);
290 JsonObject result = JsonObject.readFrom(response);
291 assertThat(result, notNullValue());
292
293 assertThat(result.get("broadcast").asBoolean(), is(true));
294 }
295
296 /**
297 * Tests an infrastructure query.
298 */
299 @Test
300 public void getInfrastructure() {
301 WebResource rs = resource();
302 String response = rs.path("topology/infrastructure/dev2:1").get(String.class);
303 JsonObject result = JsonObject.readFrom(response);
304 assertThat(result, notNullValue());
305
306 assertThat(result.get("infrastructure").asBoolean(), is(true));
307 }
308}