blob: 4a8a3e904023ee0bda7fae4c1f137bc2f6270e68 [file] [log] [blame]
tombe988312014-09-19 18:38:47 -07001package org.onlab.onos.net.topology.impl;
tomb86066b2014-09-15 09:52:24 -07002
tombe988312014-09-19 18:38:47 -07003import com.google.common.collect.ImmutableSet;
Yuta HIGUCHI8bca2352014-10-14 11:17:49 -07004
tomb86066b2014-09-15 09:52:24 -07005import org.junit.After;
6import org.junit.Before;
7import org.junit.Test;
8import org.onlab.onos.event.Event;
9import org.onlab.onos.event.impl.TestEventDispatcher;
10import org.onlab.onos.net.Device;
11import org.onlab.onos.net.Link;
12import org.onlab.onos.net.device.DeviceEvent;
tombe988312014-09-19 18:38:47 -070013import org.onlab.onos.net.device.impl.DeviceManager;
tomb86066b2014-09-15 09:52:24 -070014import org.onlab.onos.net.link.LinkEvent;
tombe988312014-09-19 18:38:47 -070015import org.onlab.onos.net.link.impl.LinkManager;
tomb86066b2014-09-15 09:52:24 -070016import org.onlab.onos.net.provider.AbstractProviderService;
17import org.onlab.onos.net.provider.ProviderId;
18import org.onlab.onos.net.topology.GraphDescription;
19import org.onlab.onos.net.topology.TopologyProvider;
20import org.onlab.onos.net.topology.TopologyProviderRegistry;
21import org.onlab.onos.net.topology.TopologyProviderService;
tomb86066b2014-09-15 09:52:24 -070022
23import java.util.List;
24import java.util.Set;
Yuta HIGUCHI8bca2352014-10-14 11:17:49 -070025import java.util.concurrent.Phaser;
26import java.util.concurrent.TimeUnit;
27import java.util.concurrent.TimeoutException;
tomb86066b2014-09-15 09:52:24 -070028
Yuta HIGUCHI8bca2352014-10-14 11:17:49 -070029import static org.junit.Assert.*;
30import static org.hamcrest.Matchers.*;
tomca90c462014-09-22 11:40:58 -070031import static org.onlab.onos.net.NetTestTools.device;
32import static org.onlab.onos.net.NetTestTools.link;
tomb86066b2014-09-15 09:52:24 -070033import static org.onlab.onos.net.device.DeviceEvent.Type.DEVICE_ADDED;
34import static org.onlab.onos.net.link.LinkEvent.Type.LINK_ADDED;
tomb86066b2014-09-15 09:52:24 -070035
36/**
37 * Test of the default topology provider implementation.
38 */
39public class DefaultTopologyProviderTest {
40
41 private DefaultTopologyProvider provider = new DefaultTopologyProvider();
42 private TestTopoRegistry topologyService = new TestTopoRegistry();
43 private TestDeviceService deviceService = new TestDeviceService();
44 private TestLinkService linkService = new TestLinkService();
45 private TestTopoProviderService providerService;
46
Yuta HIGUCHI8bca2352014-10-14 11:17:49 -070047 // phase corresponds to number of topologyChanged called
48 private Phaser topologyChangedCounts = new Phaser(1);
49
tomb86066b2014-09-15 09:52:24 -070050 @Before
51 public void setUp() {
52 provider.deviceService = deviceService;
53 provider.linkService = linkService;
54 provider.providerRegistry = topologyService;
55 provider.activate();
56 }
57
58 @After
59 public void tearDown() {
60 provider.deactivate();
61 provider.providerRegistry = null;
62 provider.deviceService = null;
63 provider.linkService = null;
64 }
65
66 private void validateSubmission() {
67 assertNotNull("registration expected", providerService);
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070068 assertEquals("incorrect provider", provider, providerService.provider());
tomb86066b2014-09-15 09:52:24 -070069 assertNotNull("topo change should be submitted", providerService.graphDesc);
70 assertEquals("incorrect vertex count", 6, providerService.graphDesc.vertexes().size());
71 assertEquals("incorrect edge count", 10, providerService.graphDesc.edges().size());
72 }
73
74 @Test
Yuta HIGUCHI8bca2352014-10-14 11:17:49 -070075 public void basics() throws InterruptedException, TimeoutException {
76 assertEquals(1, topologyChangedCounts.awaitAdvanceInterruptibly(0, 1, TimeUnit.SECONDS));
77 validateSubmission();
tomb86066b2014-09-15 09:52:24 -070078 }
79
80 @Test
Yuta HIGUCHI8bca2352014-10-14 11:17:49 -070081 public void eventDriven() throws InterruptedException, TimeoutException {
82 assertEquals(1, topologyChangedCounts.awaitAdvanceInterruptibly(0, 1, TimeUnit.SECONDS));
83 validateSubmission();
84
85 deviceService.post(new DeviceEvent(DEVICE_ADDED, device("z"), null));
86 linkService.post(new LinkEvent(LINK_ADDED, link("z", 1, "a", 4)));
87 assertThat(topologyChangedCounts.awaitAdvanceInterruptibly(1, 1, TimeUnit.SECONDS),
88 is(greaterThanOrEqualTo(2)));
89 // Note: posting event, to trigger topologyChanged call,
90 // but dummy topology will not change.
91 validateSubmission();
tomb86066b2014-09-15 09:52:24 -070092 }
93
94
95 private class TestTopoRegistry implements TopologyProviderRegistry {
96
97 @Override
98 public TopologyProviderService register(TopologyProvider provider) {
99 providerService = new TestTopoProviderService(provider);
100 return providerService;
101 }
102
103 @Override
104 public void unregister(TopologyProvider provider) {
105 }
106
107 @Override
108 public Set<ProviderId> getProviders() {
109 return null;
110 }
111 }
112
113 private class TestTopoProviderService
114 extends AbstractProviderService<TopologyProvider>
115 implements TopologyProviderService {
116 GraphDescription graphDesc;
117
118 protected TestTopoProviderService(TopologyProvider provider) {
119 super(provider);
120 }
121
122 @Override
123 public void topologyChanged(GraphDescription graphDescription, List<Event> reasons) {
124 graphDesc = graphDescription;
Yuta HIGUCHI8bca2352014-10-14 11:17:49 -0700125 topologyChangedCounts.arrive();
tomb86066b2014-09-15 09:52:24 -0700126 }
127 }
128
tom41a2c5f2014-09-19 09:20:35 -0700129 private class TestDeviceService extends DeviceManager {
tomb86066b2014-09-15 09:52:24 -0700130 TestDeviceService() {
131 eventDispatcher = new TestEventDispatcher();
132 eventDispatcher.addSink(DeviceEvent.class, listenerRegistry);
133 }
134
135 @Override
136 public Iterable<Device> getDevices() {
tomca90c462014-09-22 11:40:58 -0700137 return ImmutableSet.of(device("a"), device("b"),
138 device("c"), device("d"),
139 device("e"), device("f"));
tomb86066b2014-09-15 09:52:24 -0700140 }
141
142 void post(DeviceEvent event) {
143 eventDispatcher.post(event);
144 }
145 }
146
tom35c0dc32014-09-19 10:00:58 -0700147 private class TestLinkService extends LinkManager {
tomb86066b2014-09-15 09:52:24 -0700148 TestLinkService() {
149 eventDispatcher = new TestEventDispatcher();
150 eventDispatcher.addSink(LinkEvent.class, listenerRegistry);
151 }
152
153 @Override
154 public Iterable<Link> getLinks() {
tomca90c462014-09-22 11:40:58 -0700155 return ImmutableSet.of(link("a", 1, "b", 1), link("b", 1, "a", 1),
156 link("b", 2, "c", 1), link("c", 1, "b", 2),
157 link("c", 2, "d", 1), link("d", 1, "c", 2),
158 link("d", 2, "a", 2), link("a", 2, "d", 2),
159 link("e", 1, "f", 1), link("f", 1, "e", 1));
tomb86066b2014-09-15 09:52:24 -0700160 }
161
162 void post(LinkEvent event) {
163 eventDispatcher.post(event);
164 }
165 }
Yuta HIGUCHI4e9c37c2014-09-21 14:34:33 -0700166}