blob: 7e67c6d3367a79561ccc3fbbc05b7f5d280c12d2 [file] [log] [blame]
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07001/*
2 * Copyright 2014 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 */
tombe988312014-09-19 18:38:47 -070016package org.onlab.onos.net.topology.impl;
tomb86066b2014-09-15 09:52:24 -070017
tombe988312014-09-19 18:38:47 -070018import com.google.common.collect.ImmutableSet;
Yuta HIGUCHI8bca2352014-10-14 11:17:49 -070019
tomb86066b2014-09-15 09:52:24 -070020import org.junit.After;
21import org.junit.Before;
22import org.junit.Test;
23import org.onlab.onos.event.Event;
24import org.onlab.onos.event.impl.TestEventDispatcher;
25import org.onlab.onos.net.Device;
26import org.onlab.onos.net.Link;
27import org.onlab.onos.net.device.DeviceEvent;
tombe988312014-09-19 18:38:47 -070028import org.onlab.onos.net.device.impl.DeviceManager;
tomb86066b2014-09-15 09:52:24 -070029import org.onlab.onos.net.link.LinkEvent;
tombe988312014-09-19 18:38:47 -070030import org.onlab.onos.net.link.impl.LinkManager;
tomb86066b2014-09-15 09:52:24 -070031import org.onlab.onos.net.provider.AbstractProviderService;
32import org.onlab.onos.net.provider.ProviderId;
33import org.onlab.onos.net.topology.GraphDescription;
34import org.onlab.onos.net.topology.TopologyProvider;
35import org.onlab.onos.net.topology.TopologyProviderRegistry;
36import org.onlab.onos.net.topology.TopologyProviderService;
tomb86066b2014-09-15 09:52:24 -070037
38import java.util.List;
39import java.util.Set;
Yuta HIGUCHI8bca2352014-10-14 11:17:49 -070040import java.util.concurrent.Phaser;
41import java.util.concurrent.TimeUnit;
42import java.util.concurrent.TimeoutException;
tomb86066b2014-09-15 09:52:24 -070043
Yuta HIGUCHI8bca2352014-10-14 11:17:49 -070044import static org.junit.Assert.*;
45import static org.hamcrest.Matchers.*;
tomca90c462014-09-22 11:40:58 -070046import static org.onlab.onos.net.NetTestTools.device;
47import static org.onlab.onos.net.NetTestTools.link;
tomb86066b2014-09-15 09:52:24 -070048import static org.onlab.onos.net.device.DeviceEvent.Type.DEVICE_ADDED;
49import static org.onlab.onos.net.link.LinkEvent.Type.LINK_ADDED;
tomb86066b2014-09-15 09:52:24 -070050
51/**
52 * Test of the default topology provider implementation.
53 */
54public class DefaultTopologyProviderTest {
55
56 private DefaultTopologyProvider provider = new DefaultTopologyProvider();
57 private TestTopoRegistry topologyService = new TestTopoRegistry();
58 private TestDeviceService deviceService = new TestDeviceService();
59 private TestLinkService linkService = new TestLinkService();
60 private TestTopoProviderService providerService;
61
Yuta HIGUCHI8bca2352014-10-14 11:17:49 -070062 // phase corresponds to number of topologyChanged called
63 private Phaser topologyChangedCounts = new Phaser(1);
64
tomb86066b2014-09-15 09:52:24 -070065 @Before
66 public void setUp() {
67 provider.deviceService = deviceService;
68 provider.linkService = linkService;
69 provider.providerRegistry = topologyService;
Thomas Vachuska912bdd52014-11-17 11:39:01 -080070 provider.activate(null);
tomb86066b2014-09-15 09:52:24 -070071 }
72
73 @After
74 public void tearDown() {
Thomas Vachuska912bdd52014-11-17 11:39:01 -080075 provider.deactivate(null);
tomb86066b2014-09-15 09:52:24 -070076 provider.providerRegistry = null;
77 provider.deviceService = null;
78 provider.linkService = null;
79 }
80
81 private void validateSubmission() {
82 assertNotNull("registration expected", providerService);
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070083 assertEquals("incorrect provider", provider, providerService.provider());
tomb86066b2014-09-15 09:52:24 -070084 assertNotNull("topo change should be submitted", providerService.graphDesc);
85 assertEquals("incorrect vertex count", 6, providerService.graphDesc.vertexes().size());
86 assertEquals("incorrect edge count", 10, providerService.graphDesc.edges().size());
87 }
88
89 @Test
Yuta HIGUCHI8bca2352014-10-14 11:17:49 -070090 public void basics() throws InterruptedException, TimeoutException {
91 assertEquals(1, topologyChangedCounts.awaitAdvanceInterruptibly(0, 1, TimeUnit.SECONDS));
92 validateSubmission();
tomb86066b2014-09-15 09:52:24 -070093 }
94
95 @Test
Yuta HIGUCHI8bca2352014-10-14 11:17:49 -070096 public void eventDriven() throws InterruptedException, TimeoutException {
97 assertEquals(1, topologyChangedCounts.awaitAdvanceInterruptibly(0, 1, TimeUnit.SECONDS));
98 validateSubmission();
99
100 deviceService.post(new DeviceEvent(DEVICE_ADDED, device("z"), null));
101 linkService.post(new LinkEvent(LINK_ADDED, link("z", 1, "a", 4)));
102 assertThat(topologyChangedCounts.awaitAdvanceInterruptibly(1, 1, TimeUnit.SECONDS),
103 is(greaterThanOrEqualTo(2)));
104 // Note: posting event, to trigger topologyChanged call,
105 // but dummy topology will not change.
106 validateSubmission();
tomb86066b2014-09-15 09:52:24 -0700107 }
108
109
110 private class TestTopoRegistry implements TopologyProviderRegistry {
111
112 @Override
113 public TopologyProviderService register(TopologyProvider provider) {
114 providerService = new TestTopoProviderService(provider);
115 return providerService;
116 }
117
118 @Override
119 public void unregister(TopologyProvider provider) {
120 }
121
122 @Override
123 public Set<ProviderId> getProviders() {
124 return null;
125 }
126 }
127
128 private class TestTopoProviderService
129 extends AbstractProviderService<TopologyProvider>
130 implements TopologyProviderService {
131 GraphDescription graphDesc;
132
133 protected TestTopoProviderService(TopologyProvider provider) {
134 super(provider);
135 }
136
137 @Override
138 public void topologyChanged(GraphDescription graphDescription, List<Event> reasons) {
139 graphDesc = graphDescription;
Yuta HIGUCHI8bca2352014-10-14 11:17:49 -0700140 topologyChangedCounts.arrive();
tomb86066b2014-09-15 09:52:24 -0700141 }
142 }
143
tom41a2c5f2014-09-19 09:20:35 -0700144 private class TestDeviceService extends DeviceManager {
tomb86066b2014-09-15 09:52:24 -0700145 TestDeviceService() {
146 eventDispatcher = new TestEventDispatcher();
147 eventDispatcher.addSink(DeviceEvent.class, listenerRegistry);
148 }
149
150 @Override
151 public Iterable<Device> getDevices() {
tomca90c462014-09-22 11:40:58 -0700152 return ImmutableSet.of(device("a"), device("b"),
153 device("c"), device("d"),
154 device("e"), device("f"));
tomb86066b2014-09-15 09:52:24 -0700155 }
156
Yuta HIGUCHIf1f2ac02014-11-26 14:02:22 -0800157 @Override
158 public Iterable<Device> getAvailableDevices() {
159 return getDevices();
160 }
161
tomb86066b2014-09-15 09:52:24 -0700162 void post(DeviceEvent event) {
163 eventDispatcher.post(event);
164 }
165 }
166
tom35c0dc32014-09-19 10:00:58 -0700167 private class TestLinkService extends LinkManager {
tomb86066b2014-09-15 09:52:24 -0700168 TestLinkService() {
169 eventDispatcher = new TestEventDispatcher();
170 eventDispatcher.addSink(LinkEvent.class, listenerRegistry);
171 }
172
173 @Override
174 public Iterable<Link> getLinks() {
tomca90c462014-09-22 11:40:58 -0700175 return ImmutableSet.of(link("a", 1, "b", 1), link("b", 1, "a", 1),
176 link("b", 2, "c", 1), link("c", 1, "b", 2),
177 link("c", 2, "d", 1), link("d", 1, "c", 2),
178 link("d", 2, "a", 2), link("a", 2, "d", 2),
179 link("e", 1, "f", 1), link("f", 1, "e", 1));
tomb86066b2014-09-15 09:52:24 -0700180 }
181
Yuta HIGUCHIf1f2ac02014-11-26 14:02:22 -0800182 @Override
183 public Iterable<Link> getActiveLinks() {
184 return getLinks();
185 }
186
tomb86066b2014-09-15 09:52:24 -0700187 void post(LinkEvent event) {
188 eventDispatcher.post(event);
189 }
190 }
Yuta HIGUCHI4e9c37c2014-09-21 14:34:33 -0700191}