blob: 022df23d40347320d0c67e2e0ae41faf095858d4 [file] [log] [blame]
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07001/*
Ray Milkey34c95902015-04-15 09:47:53 -07002 * Copyright 2014-2015 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 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.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;
Thomas Vachuska6d697f12015-03-08 20:59:50 -070023import org.onosproject.cfg.ComponentConfigAdapter;
Brian O'Connorabafb502014-12-02 22:26:20 -080024import org.onosproject.event.Event;
Thomas Vachuska36002e62015-05-19 16:12:29 -070025import org.onosproject.common.event.impl.TestEventDispatcher;
Brian O'Connorabafb502014-12-02 22:26:20 -080026import org.onosproject.net.Device;
27import org.onosproject.net.Link;
28import org.onosproject.net.device.DeviceEvent;
29import org.onosproject.net.device.impl.DeviceManager;
30import org.onosproject.net.link.LinkEvent;
31import org.onosproject.net.link.impl.LinkManager;
32import org.onosproject.net.provider.AbstractProviderService;
33import org.onosproject.net.provider.ProviderId;
34import org.onosproject.net.topology.GraphDescription;
35import org.onosproject.net.topology.TopologyProvider;
36import org.onosproject.net.topology.TopologyProviderRegistry;
37import org.onosproject.net.topology.TopologyProviderService;
tomb86066b2014-09-15 09:52:24 -070038
39import java.util.List;
40import java.util.Set;
Yuta HIGUCHI8bca2352014-10-14 11:17:49 -070041import java.util.concurrent.Phaser;
42import java.util.concurrent.TimeUnit;
43import java.util.concurrent.TimeoutException;
tomb86066b2014-09-15 09:52:24 -070044
Yuta HIGUCHI8bca2352014-10-14 11:17:49 -070045import static org.junit.Assert.*;
46import static org.hamcrest.Matchers.*;
Brian O'Connorabafb502014-12-02 22:26:20 -080047import static org.onosproject.net.NetTestTools.device;
48import static org.onosproject.net.NetTestTools.link;
49import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_ADDED;
50import static org.onosproject.net.link.LinkEvent.Type.LINK_ADDED;
tomb86066b2014-09-15 09:52:24 -070051
52/**
53 * Test of the default topology provider implementation.
54 */
55public class DefaultTopologyProviderTest {
56
57 private DefaultTopologyProvider provider = new DefaultTopologyProvider();
58 private TestTopoRegistry topologyService = new TestTopoRegistry();
59 private TestDeviceService deviceService = new TestDeviceService();
60 private TestLinkService linkService = new TestLinkService();
61 private TestTopoProviderService providerService;
62
Yuta HIGUCHI8bca2352014-10-14 11:17:49 -070063 // phase corresponds to number of topologyChanged called
64 private Phaser topologyChangedCounts = new Phaser(1);
65
tomb86066b2014-09-15 09:52:24 -070066 @Before
67 public void setUp() {
68 provider.deviceService = deviceService;
69 provider.linkService = linkService;
70 provider.providerRegistry = topologyService;
Thomas Vachuska6d697f12015-03-08 20:59:50 -070071 provider.cfgService = new ComponentConfigAdapter();
Thomas Vachuska912bdd52014-11-17 11:39:01 -080072 provider.activate(null);
tomb86066b2014-09-15 09:52:24 -070073 }
74
75 @After
76 public void tearDown() {
Thomas Vachuska912bdd52014-11-17 11:39:01 -080077 provider.deactivate(null);
tomb86066b2014-09-15 09:52:24 -070078 provider.providerRegistry = null;
79 provider.deviceService = null;
80 provider.linkService = null;
Thomas Vachuska6d697f12015-03-08 20:59:50 -070081 provider.cfgService = null;
tomb86066b2014-09-15 09:52:24 -070082 }
83
84 private void validateSubmission() {
85 assertNotNull("registration expected", providerService);
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070086 assertEquals("incorrect provider", provider, providerService.provider());
tomb86066b2014-09-15 09:52:24 -070087 assertNotNull("topo change should be submitted", providerService.graphDesc);
88 assertEquals("incorrect vertex count", 6, providerService.graphDesc.vertexes().size());
89 assertEquals("incorrect edge count", 10, providerService.graphDesc.edges().size());
90 }
91
92 @Test
Yuta HIGUCHI8bca2352014-10-14 11:17:49 -070093 public void basics() throws InterruptedException, TimeoutException {
94 assertEquals(1, topologyChangedCounts.awaitAdvanceInterruptibly(0, 1, TimeUnit.SECONDS));
95 validateSubmission();
tomb86066b2014-09-15 09:52:24 -070096 }
97
98 @Test
Yuta HIGUCHI8bca2352014-10-14 11:17:49 -070099 public void eventDriven() throws InterruptedException, TimeoutException {
100 assertEquals(1, topologyChangedCounts.awaitAdvanceInterruptibly(0, 1, TimeUnit.SECONDS));
101 validateSubmission();
102
Thomas Vachuska42e8cce2015-07-29 19:25:18 -0700103 deviceService.postEvent(new DeviceEvent(DEVICE_ADDED, device("z"), null));
104 linkService.postEvent(new LinkEvent(LINK_ADDED, link("z", 1, "a", 4)));
Yuta HIGUCHI8bca2352014-10-14 11:17:49 -0700105 assertThat(topologyChangedCounts.awaitAdvanceInterruptibly(1, 1, TimeUnit.SECONDS),
106 is(greaterThanOrEqualTo(2)));
107 // Note: posting event, to trigger topologyChanged call,
108 // but dummy topology will not change.
109 validateSubmission();
tomb86066b2014-09-15 09:52:24 -0700110 }
111
112
113 private class TestTopoRegistry implements TopologyProviderRegistry {
114
115 @Override
116 public TopologyProviderService register(TopologyProvider provider) {
117 providerService = new TestTopoProviderService(provider);
118 return providerService;
119 }
120
121 @Override
122 public void unregister(TopologyProvider provider) {
123 }
124
125 @Override
126 public Set<ProviderId> getProviders() {
127 return null;
128 }
129 }
130
131 private class TestTopoProviderService
132 extends AbstractProviderService<TopologyProvider>
133 implements TopologyProviderService {
134 GraphDescription graphDesc;
135
136 protected TestTopoProviderService(TopologyProvider provider) {
137 super(provider);
138 }
139
140 @Override
141 public void topologyChanged(GraphDescription graphDescription, List<Event> reasons) {
142 graphDesc = graphDescription;
Yuta HIGUCHI8bca2352014-10-14 11:17:49 -0700143 topologyChangedCounts.arrive();
tomb86066b2014-09-15 09:52:24 -0700144 }
145 }
146
tom41a2c5f2014-09-19 09:20:35 -0700147 private class TestDeviceService extends DeviceManager {
tomb86066b2014-09-15 09:52:24 -0700148 TestDeviceService() {
149 eventDispatcher = new TestEventDispatcher();
150 eventDispatcher.addSink(DeviceEvent.class, listenerRegistry);
151 }
152
153 @Override
154 public Iterable<Device> getDevices() {
tomca90c462014-09-22 11:40:58 -0700155 return ImmutableSet.of(device("a"), device("b"),
156 device("c"), device("d"),
157 device("e"), device("f"));
tomb86066b2014-09-15 09:52:24 -0700158 }
159
Yuta HIGUCHIf1f2ac02014-11-26 14:02:22 -0800160 @Override
161 public Iterable<Device> getAvailableDevices() {
162 return getDevices();
163 }
164
Thomas Vachuska42e8cce2015-07-29 19:25:18 -0700165 void postEvent(DeviceEvent event) {
tomb86066b2014-09-15 09:52:24 -0700166 eventDispatcher.post(event);
167 }
168 }
169
tom35c0dc32014-09-19 10:00:58 -0700170 private class TestLinkService extends LinkManager {
tomb86066b2014-09-15 09:52:24 -0700171 TestLinkService() {
172 eventDispatcher = new TestEventDispatcher();
173 eventDispatcher.addSink(LinkEvent.class, listenerRegistry);
174 }
175
176 @Override
177 public Iterable<Link> getLinks() {
tomca90c462014-09-22 11:40:58 -0700178 return ImmutableSet.of(link("a", 1, "b", 1), link("b", 1, "a", 1),
179 link("b", 2, "c", 1), link("c", 1, "b", 2),
180 link("c", 2, "d", 1), link("d", 1, "c", 2),
181 link("d", 2, "a", 2), link("a", 2, "d", 2),
182 link("e", 1, "f", 1), link("f", 1, "e", 1));
tomb86066b2014-09-15 09:52:24 -0700183 }
184
Yuta HIGUCHIf1f2ac02014-11-26 14:02:22 -0800185 @Override
186 public Iterable<Link> getActiveLinks() {
187 return getLinks();
188 }
189
Thomas Vachuska42e8cce2015-07-29 19:25:18 -0700190 void postEvent(LinkEvent event) {
tomb86066b2014-09-15 09:52:24 -0700191 eventDispatcher.post(event);
192 }
193 }
Yuta HIGUCHI4e9c37c2014-09-21 14:34:33 -0700194}