blob: 5ab0d4a8f147f37a2d0b70c90e4daeabb3a116fb [file] [log] [blame]
weibitf7c31a42014-06-23 16:51:01 -07001package net.onrc.onos.core.topology;
2
Pavlin Radoslavov695f8952014-07-23 16:57:01 -07003import net.floodlightcontroller.core.IFloodlightProviderService.Role;
weibitf7c31a42014-06-23 16:51:01 -07004import net.floodlightcontroller.util.MACAddress;
5import net.onrc.onos.core.datagrid.IDatagridService;
6import net.onrc.onos.core.datagrid.IEventChannel;
7import net.onrc.onos.core.datagrid.IEventChannelListener;
8import net.onrc.onos.core.registry.IControllerRegistryService;
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07009import net.onrc.onos.core.registry.RegistryException;
weibitf7c31a42014-06-23 16:51:01 -070010import net.onrc.onos.core.util.Dpid;
Pavlin Radoslavovc6236412014-08-01 20:37:46 -070011import net.onrc.onos.core.util.EventEntry;
Pavlin Radoslavov41633642014-08-11 14:24:52 -070012import static net.onrc.onos.core.util.ImmutableClassChecker.assertThatClassIsImmutable;
Pavlin Radoslavov53b208a2014-07-28 13:16:11 -070013import net.onrc.onos.core.util.OnosInstanceId;
weibitf7c31a42014-06-23 16:51:01 -070014import net.onrc.onos.core.util.PortNumber;
15import net.onrc.onos.core.util.SwitchPort;
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -070016import net.onrc.onos.core.util.TestUtils;
Ray Milkey38301352014-07-28 08:51:54 -070017import net.onrc.onos.core.util.UnitTest;
weibitf7c31a42014-06-23 16:51:01 -070018import org.junit.Before;
19import org.junit.Test;
20
Ray Milkey38301352014-07-28 08:51:54 -070021import java.util.ArrayList;
22import java.util.Collection;
Pavlin Radoslavovc6236412014-08-01 20:37:46 -070023import java.util.LinkedList;
Ray Milkey38301352014-07-28 08:51:54 -070024import java.util.List;
25import java.util.concurrent.CopyOnWriteArrayList;
26
27import static org.easymock.EasyMock.anyObject;
28import static org.easymock.EasyMock.createMock;
Sho SHIMIZU107344e2014-08-13 16:11:53 -070029import static org.easymock.EasyMock.createNiceMock;
Ray Milkey38301352014-07-28 08:51:54 -070030import static org.easymock.EasyMock.eq;
31import static org.easymock.EasyMock.expect;
Sho SHIMIZU107344e2014-08-13 16:11:53 -070032import static org.easymock.EasyMock.expectLastCall;
Ray Milkey38301352014-07-28 08:51:54 -070033import static org.easymock.EasyMock.replay;
Pavlin Radoslavovc6236412014-08-01 20:37:46 -070034import static org.easymock.EasyMock.reset;
Ray Milkey38301352014-07-28 08:51:54 -070035import static org.easymock.EasyMock.verify;
36import static org.hamcrest.Matchers.containsInAnyOrder;
Pavlin Radoslavovc6236412014-08-01 20:37:46 -070037import static org.hamcrest.Matchers.empty;
Ray Milkey38301352014-07-28 08:51:54 -070038import static org.hamcrest.Matchers.hasItem;
Pavlin Radoslavovc6236412014-08-01 20:37:46 -070039import static org.hamcrest.Matchers.is;
Ray Milkey38301352014-07-28 08:51:54 -070040import static org.hamcrest.Matchers.not;
41import static org.junit.Assert.assertEquals;
Pavlin Radoslavovc6236412014-08-01 20:37:46 -070042import static org.junit.Assert.assertNotNull;
Ray Milkey38301352014-07-28 08:51:54 -070043import static org.junit.Assert.assertNull;
44import static org.junit.Assert.assertThat;
45import static org.junit.Assert.assertTrue;
46
weibitf7c31a42014-06-23 16:51:01 -070047/**
48 * Unit tests for the TopologyManager class in the Topology module.
49 * These test cases only check the sanity of functions in the TopologyManager.
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -070050 * Note that we do not test the eventHandler functions in the TopologyManager
51 * class.
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -070052 * DatagridService, eventChannel, and controllerRegistryService are mocked out.
weibitf7c31a42014-06-23 16:51:01 -070053 */
Ray Milkey38301352014-07-28 08:51:54 -070054public class TopologyManagerTest extends UnitTest {
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -070055 private TopologyPublisher theTopologyPublisher;
weibitf7c31a42014-06-23 16:51:01 -070056 private TopologyManager theTopologyManager;
Pavlin Radoslavovc6236412014-08-01 20:37:46 -070057 private TopologyManager.EventHandler theEventHandler;
58 private TopologyListenerTest theTopologyListener =
59 new TopologyListenerTest();
weibitf7c31a42014-06-23 16:51:01 -070060 private final String eventChannelName = "onos.topology";
61 private IEventChannel<byte[], TopologyEvent> eventChannel;
62 private IDatagridService datagridService;
weibitf7c31a42014-06-23 16:51:01 -070063 private IControllerRegistryService registryService;
weibitf7c31a42014-06-23 16:51:01 -070064 private Collection<TopologyEvent> allTopologyEvents;
Pavlin Radoslavovc6236412014-08-01 20:37:46 -070065 private static final OnosInstanceId ONOS_INSTANCE_ID_1 =
66 new OnosInstanceId("ONOS-Instance-ID-1");
67 private static final OnosInstanceId ONOS_INSTANCE_ID_2 =
68 new OnosInstanceId("ONOS-Instance-ID-2");
69 private static final Dpid DPID_1 = new Dpid(1);
70 private static final Dpid DPID_2 = new Dpid(2);
71
72 /**
73 * Topology events listener.
74 */
75 private class TopologyListenerTest implements ITopologyListener {
76 private TopologyEvents topologyEvents;
77
78 @Override
79 public void topologyEvents(TopologyEvents events) {
80 this.topologyEvents = events;
81 }
82
83 /**
84 * Clears the Topology Listener state.
85 */
86 public void clear() {
87 this.topologyEvents = null;
88 }
89 }
weibitf7c31a42014-06-23 16:51:01 -070090
91 @SuppressWarnings("unchecked")
92 @Before
93 public void setUp() throws Exception {
94 // Mock objects for testing
Sho SHIMIZU107344e2014-08-13 16:11:53 -070095 datagridService = createNiceMock(IDatagridService.class);
weibitf7c31a42014-06-23 16:51:01 -070096 registryService = createMock(IControllerRegistryService.class);
Sho SHIMIZU107344e2014-08-13 16:11:53 -070097 eventChannel = createNiceMock(IEventChannel.class);
weibitf7c31a42014-06-23 16:51:01 -070098
99 expect(datagridService.createChannel(
100 eq(eventChannelName),
101 eq(byte[].class),
102 eq(TopologyEvent.class)))
103 .andReturn(eventChannel).once();
104
105 expect(datagridService.addListener(
106 eq(eventChannelName),
107 anyObject(IEventChannelListener.class),
108 eq(byte[].class),
109 eq(TopologyEvent.class)))
110 .andReturn(eventChannel).once();
111
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700112 // Setup the Registry Service
113 expect(registryService.getOnosInstanceId()).andReturn(ONOS_INSTANCE_ID_1).anyTimes();
Pavlin Radoslavov054cd592014-08-07 20:57:16 -0700114 expect(registryService.getControllerForSwitch(DPID_1.value()))
115 .andReturn(ONOS_INSTANCE_ID_1.toString()).anyTimes();
116 expect(registryService.getControllerForSwitch(DPID_2.value()))
117 .andReturn(ONOS_INSTANCE_ID_2.toString()).anyTimes();
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700118 expect(registryService.hasControl(DPID_1.value()))
119 .andReturn(true).anyTimes();
120 expect(registryService.hasControl(DPID_2.value()))
121 .andReturn(false).anyTimes();
weibitf7c31a42014-06-23 16:51:01 -0700122
123 allTopologyEvents = new CopyOnWriteArrayList<>();
Yuta HIGUCHI81d8b9e2014-07-14 23:56:34 -0700124 expect(eventChannel.getAllEntries())
125 .andReturn(allTopologyEvents).anyTimes();
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700126
127 replay(datagridService);
128 replay(registryService);
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700129 // replay(eventChannel);
Yuta HIGUCHI81d8b9e2014-07-14 23:56:34 -0700130 }
weibitf7c31a42014-06-23 16:51:01 -0700131
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700132 /**
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700133 * Setup the Topology Publisher.
134 */
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700135 private void setupTopologyPublisher() throws RegistryException {
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700136 // Create a TopologyPublisher object for testing
137 theTopologyPublisher = new TopologyPublisher();
138
139 // Setup the registry service
140 TestUtils.setField(theTopologyPublisher, "registryService",
141 registryService);
142
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700143 //
144 // Update the Registry Service, so the ONOS instance is the
145 // Master for both switches.
146 //
147 reset(registryService);
148 expect(registryService.getOnosInstanceId()).andReturn(ONOS_INSTANCE_ID_1).anyTimes();
149 expect(registryService.getControllerForSwitch(DPID_1.value()))
150 .andReturn(ONOS_INSTANCE_ID_1.toString()).anyTimes();
151 expect(registryService.getControllerForSwitch(DPID_2.value()))
152 .andReturn(ONOS_INSTANCE_ID_2.toString()).anyTimes();
153 expect(registryService.hasControl(DPID_1.value()))
154 .andReturn(true).anyTimes();
155 expect(registryService.hasControl(DPID_2.value()))
156 .andReturn(true).anyTimes();
157 replay(registryService);
158
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700159 // Setup the event channel
160 TestUtils.setField(theTopologyPublisher, "eventChannel", eventChannel);
161 }
162
163 /**
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700164 * Setup the Topology Manager.
165 */
Yuta HIGUCHI81d8b9e2014-07-14 23:56:34 -0700166 private void setupTopologyManager() {
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700167 // Create a TopologyManager object for testing
Pavlin Radoslavov8a44b782014-08-07 12:53:27 -0700168 theTopologyManager = new TopologyManager(registryService);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700169
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700170 // Replace the eventHandler to prevent the thread from starting
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700171 TestUtils.setField(theTopologyManager, "eventHandler",
Sho SHIMIZU107344e2014-08-13 16:11:53 -0700172 createNiceMock(TopologyManager.EventHandler.class));
weibitf7c31a42014-06-23 16:51:01 -0700173 theTopologyManager.startup(datagridService);
weibitf7c31a42014-06-23 16:51:01 -0700174 }
175
weibitf7c31a42014-06-23 16:51:01 -0700176 /**
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700177 * Setup the Topology Manager with the Event Handler.
178 */
179 private void setupTopologyManagerWithEventHandler() {
180 // Create a TopologyManager object for testing
Pavlin Radoslavov8a44b782014-08-07 12:53:27 -0700181 theTopologyManager = new TopologyManager(registryService);
Pavlin Radoslavov054cd592014-08-07 20:57:16 -0700182 theTopologyManager.addListener(theTopologyListener, true);
Pavlin Radoslavov8a44b782014-08-07 12:53:27 -0700183
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700184 // Allocate the Event Handler, so we can have direct access to it
185 theEventHandler = theTopologyManager.new EventHandler();
186 TestUtils.setField(theTopologyManager, "eventHandler",
187 theEventHandler);
188
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700189 replay(eventChannel);
190 //
191 // NOTE: Uncomment-out the line below if the startup() method needs
192 // to be called for some of the unit tests. For now it is commented-out
193 // to avoid any side effects of starting the eventHandler thread.
194 //
195 // theTopologyManager.startup(datagridService);
196 }
197
198 /**
Pavlin Radoslavov41633642014-08-11 14:24:52 -0700199 * Tests the immutability of {@link TopologyEvents}.
200 */
201 @Test
202 public void testImmutableTopologyEvents() {
203 assertThatClassIsImmutable(TopologyEvents.class);
204 }
205
206 /**
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700207 * Tests the publishing of Add Switch Mastership Event.
Pavlin Radoslavov695f8952014-07-23 16:57:01 -0700208 */
209 @Test
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700210 public void testPublishAddSwitchMastershipEvent() throws RegistryException {
211 setupTopologyPublisher();
212
213 // Mock the eventChannel functions
Pavlin Radoslavov695f8952014-07-23 16:57:01 -0700214 eventChannel.addEntry(anyObject(byte[].class),
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700215 anyObject(TopologyEvent.class));
Sho SHIMIZU107344e2014-08-13 16:11:53 -0700216 expectLastCall().times(1, 1); // 1 event
Pavlin Radoslavov695f8952014-07-23 16:57:01 -0700217 replay(eventChannel);
218
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700219 // Generate the Switch Mastership event
Pavlin Radoslavov695f8952014-07-23 16:57:01 -0700220 Role role = Role.MASTER;
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -0700221 MastershipData mastershipData =
222 new MastershipData(DPID_1, ONOS_INSTANCE_ID_1, role);
Pavlin Radoslavov695f8952014-07-23 16:57:01 -0700223
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700224 // Call the TopologyPublisher function for adding the event
225 TestUtils.callMethod(theTopologyPublisher,
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700226 "publishAddSwitchMastershipEvent",
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -0700227 MastershipData.class, mastershipData);
Pavlin Radoslavov695f8952014-07-23 16:57:01 -0700228
229 // Verify the function calls
230 verify(eventChannel);
231 }
232
233 /**
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700234 * Tests the publishing of Remove Switch Mastership Event.
Pavlin Radoslavov695f8952014-07-23 16:57:01 -0700235 */
236 @Test
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700237 public void testPublishRemoveSwitchMastershipEvent() throws RegistryException {
238 setupTopologyPublisher();
239
240 // Mock the eventChannel functions
Pavlin Radoslavov695f8952014-07-23 16:57:01 -0700241 eventChannel.removeEntry(anyObject(byte[].class));
Sho SHIMIZU107344e2014-08-13 16:11:53 -0700242 expectLastCall().times(1, 1); // 1 event
Pavlin Radoslavov695f8952014-07-23 16:57:01 -0700243 replay(eventChannel);
244
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700245 // Generate the Switch Mastership Event
Pavlin Radoslavov695f8952014-07-23 16:57:01 -0700246 Role role = Role.MASTER;
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -0700247 MastershipData mastershipData =
248 new MastershipData(DPID_1, ONOS_INSTANCE_ID_1, role);
Pavlin Radoslavov695f8952014-07-23 16:57:01 -0700249
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700250 // Call the TopologyPublisher function for adding the event
251 TestUtils.callMethod(theTopologyPublisher,
252 "publishAddSwitchMastershipEvent",
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -0700253 MastershipData.class, mastershipData);
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700254
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700255 // Call the TopologyPublisher function for removing the event
256 TestUtils.callMethod(theTopologyPublisher,
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700257 "publishRemoveSwitchMastershipEvent",
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -0700258 MastershipData.class, mastershipData);
Pavlin Radoslavov695f8952014-07-23 16:57:01 -0700259
260 // Verify the function calls
261 verify(eventChannel);
262 }
263
264 /**
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700265 * Tests the publishing of Add Switch and Port Events.
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700266 */
267 @Test
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700268 public void testPublishAddSwitchAndPortEvent() throws RegistryException {
269 setupTopologyPublisher();
270
271 // Mock the eventChannel functions
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700272 eventChannel.addEntry(anyObject(byte[].class),
273 anyObject(TopologyEvent.class));
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700274 expectLastCall().times(3, 3); // (1 Switch + 1 Port), 1 Port
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700275 replay(eventChannel);
276
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700277 // Mock Switch has one Port
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700278 PortNumber portNumber = PortNumber.uint32(1);
279
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700280 // Generate the Switch Event along with a Port Event
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700281 SwitchData switchData = new SwitchData(DPID_1);
282 Collection<PortData> portDataEntries = new ArrayList<PortData>();
283 portDataEntries.add(new PortData(DPID_1, portNumber));
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700284
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700285 // Call the TopologyPublisher function for adding a Switch
286 TestUtils.callMethod(theTopologyPublisher,
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700287 "publishAddSwitchEvent",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700288 new Class<?>[] {SwitchData.class,
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700289 Collection.class},
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700290 switchData, portDataEntries);
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700291 // Call the TopologyPublisher function for adding a Port
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700292 for (PortData portData : portDataEntries) {
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700293 TestUtils.callMethod(theTopologyPublisher,
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700294 "publishAddPortEvent",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700295 PortData.class, portData);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700296 }
297
298 // Verify the function calls
299 verify(eventChannel);
300
301 }
302
303 /**
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700304 * Tests the publishing of Remove Switch and Port Events.
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700305 */
306 @Test
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700307 public void testPublishRemoveSwitchAndPortEvent() throws RegistryException {
308 setupTopologyPublisher();
309
310 // Mock the eventChannel functions
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700311 eventChannel.removeEntry(anyObject(byte[].class));
Sho SHIMIZU107344e2014-08-13 16:11:53 -0700312 expectLastCall().times(2, 2); // 1 Switch, 1 Port
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700313 replay(eventChannel);
314
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700315 PortNumber portNumber = PortNumber.uint32(1);
316
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700317 // Generate the Switch Event along with a Port Event
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700318 SwitchData switchData = new SwitchData(DPID_1);
319 Collection<PortData> portDataEntries = new ArrayList<PortData>();
320 portDataEntries.add(new PortData(DPID_1, portNumber));
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700321
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700322 // Call the TopologyPublisher function for adding a Switch and Ports
323 TestUtils.callMethod(theTopologyPublisher,
324 "publishAddSwitchEvent",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700325 new Class<?>[] {SwitchData.class,
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700326 Collection.class},
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700327 switchData, portDataEntries);
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700328
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700329 // Call the TopologyPublisher function for removing a Port
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700330 for (PortData portData : portDataEntries) {
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700331 TestUtils.callMethod(theTopologyPublisher,
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700332 "publishRemovePortEvent",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700333 PortData.class, portData);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700334 }
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700335 // Call the TopologyPublisher function for removing a Switch
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700336 TestUtils.callMethod(theTopologyPublisher,
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700337 "publishRemoveSwitchEvent",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700338 SwitchData.class, switchData);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700339
340 // Verify the function calls
341 verify(eventChannel);
342
343 }
344
345 /**
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700346 * Tests the publishing of Add Link Event.
weibitf7c31a42014-06-23 16:51:01 -0700347 */
348 @Test
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700349 public void testPublishAddLinkEvent() throws RegistryException {
350 setupTopologyPublisher();
351
352 // Mock the eventChannel functions
weibitf7c31a42014-06-23 16:51:01 -0700353 eventChannel.addEntry(anyObject(byte[].class),
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700354 anyObject(TopologyEvent.class));
Sho SHIMIZU107344e2014-08-13 16:11:53 -0700355 expectLastCall().times(5, 5); // (2 Switch + 2 Port + 1 Link)
weibitf7c31a42014-06-23 16:51:01 -0700356 replay(eventChannel);
357
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700358 // Generate the Switch and Port Events
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700359 PortNumber portNumber1 = PortNumber.uint32(1);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700360 SwitchData switchData1 = new SwitchData(DPID_1);
361 Collection<PortData> portDataEntries1 = new ArrayList<PortData>();
362 portDataEntries1.add(new PortData(DPID_1, portNumber1));
weibitf7c31a42014-06-23 16:51:01 -0700363
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700364 // Call the TopologyPublisher function for adding a Switch
365 TestUtils.callMethod(theTopologyPublisher,
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700366 "publishAddSwitchEvent",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700367 new Class<?>[] {SwitchData.class,
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700368 Collection.class},
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700369 switchData1, portDataEntries1);
weibitf7c31a42014-06-23 16:51:01 -0700370
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700371 // Generate the Switch and Port Events
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700372 PortNumber portNumber2 = PortNumber.uint32(2);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700373 SwitchData switchData2 = new SwitchData(DPID_2);
374 Collection<PortData> portDataEntries2 = new ArrayList<PortData>();
375 portDataEntries2.add(new PortData(DPID_2, portNumber2));
weibitf7c31a42014-06-23 16:51:01 -0700376
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700377 // Call the TopologyPublisher function for adding a Switch
378 TestUtils.callMethod(theTopologyPublisher,
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700379 "publishAddSwitchEvent",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700380 new Class<?>[] {SwitchData.class,
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700381 Collection.class},
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700382 switchData2, portDataEntries2);
weibitf7c31a42014-06-23 16:51:01 -0700383
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700384 // Generate the Link Event
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700385 LinkData linkData =
386 new LinkData(new SwitchPort(DPID_1, portNumber1),
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700387 new SwitchPort(DPID_2, portNumber2));
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700388
389 // Call the TopologyPublisher function for adding a Link
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700390 TestUtils.callMethod(theTopologyPublisher,
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700391 "publishAddLinkEvent",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700392 LinkData.class, linkData);
weibitf7c31a42014-06-23 16:51:01 -0700393
394 // Verify the function calls
395 verify(eventChannel);
396 }
397
398 /**
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700399 * Tests the publishing of Remove Link Event.
weibitf7c31a42014-06-23 16:51:01 -0700400 */
401 @Test
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700402 public void testPublishRemoveLinkEvent() throws RegistryException {
403 setupTopologyPublisher();
404
405 // Mock the eventChannel functions
weibitf7c31a42014-06-23 16:51:01 -0700406 eventChannel.removeEntry(anyObject(byte[].class));
Sho SHIMIZU107344e2014-08-13 16:11:53 -0700407 expectLastCall().times(1, 1); // (1 Link)
weibitf7c31a42014-06-23 16:51:01 -0700408 replay(eventChannel);
409
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700410 // Generate the Switch and Port Events
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700411 PortNumber portNumber1 = PortNumber.uint32(1);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700412 SwitchData switchData1 = new SwitchData(DPID_1);
413 Collection<PortData> portDataEntries1 = new ArrayList<PortData>();
414 portDataEntries1.add(new PortData(DPID_1, portNumber1));
weibitf7c31a42014-06-23 16:51:01 -0700415
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700416 // Call the TopologyPublisher function for adding a Switch
417 TestUtils.callMethod(theTopologyPublisher,
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700418 "publishAddSwitchEvent",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700419 new Class<?>[] {SwitchData.class,
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700420 Collection.class},
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700421 switchData1, portDataEntries1);
weibitf7c31a42014-06-23 16:51:01 -0700422
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700423 // Generate the Switch and Port Events
424 PortNumber portNumber2 = PortNumber.uint32(2);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700425 SwitchData switchData2 = new SwitchData(DPID_2);
426 Collection<PortData> portDataEntries2 = new ArrayList<PortData>();
427 portDataEntries2.add(new PortData(DPID_2, portNumber2));
weibitf7c31a42014-06-23 16:51:01 -0700428
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700429 // Call the TopologyPublisher function for adding a Switch
430 TestUtils.callMethod(theTopologyPublisher,
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700431 "publishAddSwitchEvent",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700432 new Class<?>[] {SwitchData.class,
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700433 Collection.class},
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700434 switchData2, portDataEntries2);
weibitf7c31a42014-06-23 16:51:01 -0700435
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700436 // Generate the Link Event
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700437 LinkData linkData =
438 new LinkData(new SwitchPort(DPID_1, portNumber1),
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700439 new SwitchPort(DPID_2, portNumber2));
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700440
441 // Call the TopologyPublisher function for adding a Link
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700442 TestUtils.callMethod(theTopologyPublisher,
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700443 "publishAddLinkEvent",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700444 LinkData.class, linkData);
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700445
446 // Call the TopologyPublisher function for removing a Link
447 TestUtils.callMethod(theTopologyPublisher,
448 "publishRemoveLinkEvent",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700449 LinkData.class, linkData);
weibitf7c31a42014-06-23 16:51:01 -0700450
451 // Verify the function calls
452 verify(eventChannel);
453 }
454
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700455 /**
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700456 * Tests the publishing of Add Host Event.
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700457 */
458 @Test
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700459 public void testPublishAddHostEvent() throws RegistryException {
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700460 setupTopologyPublisher();
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700461
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700462 // Mock the eventChannel functions
463 eventChannel.addEntry(anyObject(byte[].class),
464 anyObject(TopologyEvent.class));
465 expectLastCall().times(3, 3); // (1 Switch + 1 Port + 1 Host)
466 replay(eventChannel);
467
468 // Generate the Switch and Port Events
469 PortNumber portNumber1 = PortNumber.uint32(1);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700470 SwitchData switchData1 = new SwitchData(DPID_1);
471 Collection<PortData> portDataEntries1 = new ArrayList<PortData>();
472 portDataEntries1.add(new PortData(DPID_1, portNumber1));
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700473
474 // Call the TopologyPublisher function for adding a Switch
475 TestUtils.callMethod(theTopologyPublisher,
476 "publishAddSwitchEvent",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700477 new Class<?>[] {SwitchData.class,
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700478 Collection.class},
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700479 switchData1, portDataEntries1);
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700480
481 // Generate the Host Event
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700482 PortNumber portNumber = PortNumber.uint32(1);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700483 MACAddress hostMac = MACAddress.valueOf("00:AA:11:BB:33:CC");
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700484 SwitchPort sp = new SwitchPort(DPID_1, portNumber);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700485 List<SwitchPort> spLists = new ArrayList<SwitchPort>();
486 spLists.add(sp);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700487 HostData hostData = new HostData(hostMac);
488 hostData.setAttachmentPoints(spLists);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700489
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700490 // Call the TopologyPublisher function for adding a Host
491 TestUtils.callMethod(theTopologyPublisher,
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700492 "publishAddHostEvent",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700493 HostData.class, hostData);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700494
495 // Verify the function calls
496 verify(eventChannel);
497 }
498
499 /**
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700500 * Tests the publising of Remove Host Event.
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700501 */
502 @Test
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700503 public void testPublishRemoveHostEvent() throws RegistryException {
504 setupTopologyPublisher();
505
506 // Mock the eventChannel functions
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700507 eventChannel.removeEntry(anyObject(byte[].class));
Sho SHIMIZU107344e2014-08-13 16:11:53 -0700508 expectLastCall().times(1, 1); // 1 Host
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700509 replay(eventChannel);
510
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700511 // Generate the Switch and Port Events
512 PortNumber portNumber1 = PortNumber.uint32(1);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700513 SwitchData switchData1 = new SwitchData(DPID_1);
514 Collection<PortData> portDataEntries1 = new ArrayList<PortData>();
515 portDataEntries1.add(new PortData(DPID_1, portNumber1));
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700516
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700517 // Call the TopologyPublisher function for adding a Switch
518 TestUtils.callMethod(theTopologyPublisher,
519 "publishAddSwitchEvent",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700520 new Class<?>[] {SwitchData.class,
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700521 Collection.class},
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700522 switchData1, portDataEntries1);
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700523
524 // Generate the Host Event
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700525 PortNumber portNumber = PortNumber.uint32(1);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700526 MACAddress hostMac = MACAddress.valueOf("00:AA:11:BB:33:CC");
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700527 SwitchPort sp = new SwitchPort(DPID_1, portNumber);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700528 List<SwitchPort> spLists = new ArrayList<SwitchPort>();
529 spLists.add(sp);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700530 HostData hostData = new HostData(hostMac);
531 hostData.setAttachmentPoints(spLists);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700532
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700533 // Call the TopologyPublisher function for adding a Host
534 TestUtils.callMethod(theTopologyPublisher,
535 "publishAddHostEvent",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700536 HostData.class, hostData);
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700537
Pavlin Radoslavovb46f89b2014-08-15 23:00:26 -0700538 // Call the TopologyPublisher function for removing a Host
539 TestUtils.callMethod(theTopologyPublisher,
Pavlin Radoslavov000fbae2014-08-19 19:42:58 -0700540 "publishRemoveHostEvent",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700541 HostData.class, hostData);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700542
543 // Verify the function calls
544 verify(eventChannel);
545 }
546
547 /**
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700548 * Tests adding of a Switch Mastership event and the topology replica
549 * transformation.
550 */
551 @Test
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -0700552 public void testAddMastershipData() {
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700553 setupTopologyManager();
554
555 // Prepare the event
556 Role role = Role.MASTER;
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -0700557 MastershipData mastershipData =
558 new MastershipData(DPID_1, ONOS_INSTANCE_ID_1, role);
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700559 // Add the event
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -0700560 TestUtils.callMethod(theTopologyManager, "addMastershipData",
561 MastershipData.class, mastershipData);
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700562
563 //
564 // NOTE: The topology itself doesn't contain the Mastership Events,
565 // hence we don't check the topology.
566 //
567
568 // Check the events to be fired
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -0700569 List<MastershipData> apiAddedMastershipDataEntries
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700570 = TestUtils.getField(theTopologyManager,
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -0700571 "apiAddedMastershipDataEntries");
572 assertThat(apiAddedMastershipDataEntries, hasItem(mastershipData));
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700573 }
574
575 /**
576 * Tests removing of a Switch Mastership event and the topology replica
577 * transformation.
578 */
579 @Test
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -0700580 public void testRemoveMastershipData() {
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700581 setupTopologyManager();
582
583 // Prepare the event
584 Role role = Role.MASTER;
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -0700585 MastershipData mastershipData =
586 new MastershipData(DPID_1, ONOS_INSTANCE_ID_1, role);
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700587 // Add the event
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -0700588 TestUtils.callMethod(theTopologyManager, "addMastershipData",
589 MastershipData.class, mastershipData);
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700590
591 // Check the events to be fired
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -0700592 List<MastershipData> apiAddedMastershipDataEntries
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700593 = TestUtils.getField(theTopologyManager,
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -0700594 "apiAddedMastershipDataEntries");
595 assertThat(apiAddedMastershipDataEntries, hasItem(mastershipData));
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700596
597 // Remove the event
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -0700598 TestUtils.callMethod(theTopologyManager, "removeMastershipData",
599 MastershipData.class,
600 new MastershipData(mastershipData));
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700601
602 // Check the events to be fired
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -0700603 List<MastershipData> apiRemovedMastershipDataEntries
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700604 = TestUtils.getField(theTopologyManager,
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -0700605 "apiRemovedMastershipDataEntries");
606 assertThat(apiRemovedMastershipDataEntries, hasItem(mastershipData));
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700607 }
608
609 /**
610 * Tests adding of a Switch and the topology replica transformation.
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700611 */
612 @Test
613 public void testAddSwitch() {
614 setupTopologyManager();
615
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700616 SwitchData sw = new SwitchData(DPID_1);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700617 sw.createStringAttribute("foo", "bar");
618
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700619 TestUtils.callMethod(theTopologyManager, "addSwitch",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700620 SwitchData.class, sw);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700621
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700622 // Check the topology structure
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700623 BaseInternalTopology topology =
624 (BaseInternalTopology) theTopologyManager.getTopology();
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700625 SwitchData swInTopo = topology.getSwitchData(DPID_1);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700626 assertEquals(sw, swInTopo);
627 assertTrue(swInTopo.isFrozen());
628 assertEquals("bar", swInTopo.getStringAttribute("foo"));
629
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700630 // Check the events to be fired
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700631 List<SwitchData> apiAddedSwitchDataEntries
632 = TestUtils.getField(theTopologyManager, "apiAddedSwitchDataEntries");
633 assertThat(apiAddedSwitchDataEntries, hasItem(sw));
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700634 }
635
636 /**
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700637 * Tests adding of a Port and the topology replica transformation.
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700638 */
639 @Test
640 public void testAddPort() {
641 setupTopologyManager();
642
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700643 SwitchData sw = new SwitchData(DPID_1);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700644 sw.createStringAttribute("foo", "bar");
645
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700646 final PortNumber portNumber = PortNumber.uint32(2);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700647 PortData port = new PortData(DPID_1, portNumber);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700648 port.createStringAttribute("fuzz", "buzz");
649
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700650 TestUtils.callMethod(theTopologyManager, "addSwitch",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700651 SwitchData.class, sw);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700652 TestUtils.callMethod(theTopologyManager, "addPort",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700653 PortData.class, port);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700654
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700655 // Check the topology structure
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700656 BaseInternalTopology topology =
657 (BaseInternalTopology) theTopologyManager.getTopology();
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700658 SwitchData swInTopo = topology.getSwitchData(DPID_1);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700659 assertEquals(sw, swInTopo);
660 assertTrue(swInTopo.isFrozen());
661 assertEquals("bar", swInTopo.getStringAttribute("foo"));
662
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700663 final SwitchPort switchPort = new SwitchPort(DPID_1, portNumber);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700664 PortData portInTopo = topology.getPortData(switchPort);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700665 assertEquals(port, portInTopo);
666 assertTrue(portInTopo.isFrozen());
667 assertEquals("buzz", portInTopo.getStringAttribute("fuzz"));
668
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700669 // Check the events to be fired
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700670 List<PortData> apiAddedPortDataEntries
671 = TestUtils.getField(theTopologyManager, "apiAddedPortDataEntries");
672 assertThat(apiAddedPortDataEntries, hasItem(port));
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700673 }
674
675 /**
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700676 * Tests removing of a Port followed by removing of a Switch,
677 * and the topology replica transformation.
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700678 */
679 @Test
680 public void testRemovePortThenSwitch() {
681 setupTopologyManager();
682
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700683 SwitchData sw = new SwitchData(DPID_1);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700684 sw.createStringAttribute("foo", "bar");
685
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700686 final PortNumber portNumber = PortNumber.uint32(2);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700687 PortData port = new PortData(DPID_1, portNumber);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700688 port.createStringAttribute("fuzz", "buzz");
689
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700690 TestUtils.callMethod(theTopologyManager, "addSwitch",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700691 SwitchData.class, sw);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700692 TestUtils.callMethod(theTopologyManager, "addPort",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700693 PortData.class, port);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700694
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700695 // Check the topology structure
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700696 BaseInternalTopology topology =
697 (BaseInternalTopology) theTopologyManager.getTopology();
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700698 SwitchData swInTopo = topology.getSwitchData(DPID_1);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700699 assertEquals(sw, swInTopo);
700 assertTrue(swInTopo.isFrozen());
701 assertEquals("bar", swInTopo.getStringAttribute("foo"));
702
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700703 final SwitchPort switchPort = new SwitchPort(DPID_1, portNumber);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700704 PortData portInTopo = topology.getPortData(switchPort);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700705 assertEquals(port, portInTopo);
706 assertTrue(portInTopo.isFrozen());
707 assertEquals("buzz", portInTopo.getStringAttribute("fuzz"));
708
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700709 // Remove in proper order
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700710 TestUtils.callMethod(theTopologyManager, "removePort",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700711 PortData.class, new PortData(port));
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700712 TestUtils.callMethod(theTopologyManager, "removeSwitch",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700713 SwitchData.class, new SwitchData(sw));
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700714
715
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700716 // Check the events to be fired
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700717 List<PortData> apiRemovedPortDataEntries
718 = TestUtils.getField(theTopologyManager, "apiRemovedPortDataEntries");
719 assertThat(apiRemovedPortDataEntries, hasItem(port));
720 List<SwitchData> apiRemovedSwitchDataEntries
721 = TestUtils.getField(theTopologyManager, "apiRemovedSwitchDataEntries");
722 assertThat(apiRemovedSwitchDataEntries, hasItem(sw));
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700723 }
724
725 /**
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700726 * Tests removing of a Switch without removing of a Port,
727 * and the topology replica transformation.
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700728 */
729 @Test
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700730 public void testRemoveSwitchWithoutPortRemoval() {
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700731 setupTopologyManager();
732
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700733 SwitchData sw = new SwitchData(DPID_1);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700734 sw.createStringAttribute("foo", "bar");
735
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700736 final PortNumber portNumber = PortNumber.uint32(2);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700737 PortData port = new PortData(DPID_1, portNumber);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700738 port.createStringAttribute("fuzz", "buzz");
739
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700740 TestUtils.callMethod(theTopologyManager, "addSwitch",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700741 SwitchData.class, sw);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700742 TestUtils.callMethod(theTopologyManager, "addPort",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700743 PortData.class, port);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700744
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700745 // Check the topology structure
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700746 BaseInternalTopology topology =
747 (BaseInternalTopology) theTopologyManager.getTopology();
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700748 SwitchData swInTopo = topology.getSwitchData(DPID_1);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700749 assertEquals(sw, swInTopo);
750 assertTrue(swInTopo.isFrozen());
751 assertEquals("bar", swInTopo.getStringAttribute("foo"));
752
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700753 final SwitchPort switchPort = new SwitchPort(DPID_1, portNumber);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700754 PortData portInTopo = topology.getPortData(switchPort);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700755 assertEquals(port, portInTopo);
756 assertTrue(portInTopo.isFrozen());
757 assertEquals("buzz", portInTopo.getStringAttribute("fuzz"));
758
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700759 // Remove in in-proper order
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700760// TestUtils.callMethod(theTopologyManager, "removePort",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700761// PortData.class, new PortData(port));
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700762 TestUtils.callMethod(theTopologyManager, "removeSwitch",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700763 SwitchData.class, new SwitchData(sw));
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700764
765
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700766 // Check the events to be fired
767 // The outcome should be the same as #testRemovePortThenSwitch
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700768 List<PortData> apiRemovedPortDataEntries
769 = TestUtils.getField(theTopologyManager, "apiRemovedPortDataEntries");
770 assertThat(apiRemovedPortDataEntries, hasItem(port));
771 List<SwitchData> apiRemovedSwitchDataEntries
772 = TestUtils.getField(theTopologyManager, "apiRemovedSwitchDataEntries");
773 assertThat(apiRemovedSwitchDataEntries, hasItem(sw));
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700774 }
775
776 /**
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700777 * Tests adding of a Link and the topology replica transformation.
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700778 */
779 @Test
780 public void testAddLink() {
781 setupTopologyManager();
782
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700783 SwitchData sw = new SwitchData(DPID_1);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700784 sw.createStringAttribute("foo", "bar");
785
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700786 final PortNumber portNumberA = PortNumber.uint32(2);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700787 PortData portA = new PortData(DPID_1, portNumberA);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700788 portA.createStringAttribute("fuzz", "buzz");
789
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700790 final PortNumber portNumberB = PortNumber.uint32(3);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700791 PortData portB = new PortData(DPID_1, portNumberB);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700792 portB.createStringAttribute("fizz", "buz");
793
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700794 LinkData linkA = new LinkData(portA.getSwitchPort(),
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700795 portB.getSwitchPort());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700796 linkA.createStringAttribute(TopologyElement.TYPE,
797 TopologyElement.TYPE_OPTICAL_LAYER);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700798 LinkData linkB = new LinkData(portB.getSwitchPort(),
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700799 portA.getSwitchPort());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700800 linkB.createStringAttribute(TopologyElement.TYPE,
801 TopologyElement.TYPE_OPTICAL_LAYER);
802
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700803 TestUtils.callMethod(theTopologyManager, "addSwitch",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700804 SwitchData.class, sw);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700805 TestUtils.callMethod(theTopologyManager, "addPort",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700806 PortData.class, portA);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700807 TestUtils.callMethod(theTopologyManager, "addPort",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700808 PortData.class, portB);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700809 TestUtils.callMethod(theTopologyManager, "addLink",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700810 LinkData.class, linkA);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700811 TestUtils.callMethod(theTopologyManager, "addLink",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700812 LinkData.class, linkB);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700813
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700814 // Check the topology structure
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700815 BaseInternalTopology topology =
816 (BaseInternalTopology) theTopologyManager.getTopology();
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700817 SwitchData swInTopo = topology.getSwitchData(DPID_1);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700818 assertEquals(sw, swInTopo);
819 assertTrue(swInTopo.isFrozen());
820 assertEquals("bar", swInTopo.getStringAttribute("foo"));
821
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700822 final SwitchPort switchPortA = new SwitchPort(DPID_1, portNumberA);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700823 PortData portAInTopo = topology.getPortData(switchPortA);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700824 assertEquals(portA, portAInTopo);
825 assertTrue(portAInTopo.isFrozen());
826 assertEquals("buzz", portAInTopo.getStringAttribute("fuzz"));
827
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700828 final SwitchPort switchPortB = new SwitchPort(DPID_1, portNumberB);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700829 PortData portBInTopo = topology.getPortData(switchPortB);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700830 assertEquals(portB, portBInTopo);
831 assertTrue(portBInTopo.isFrozen());
832 assertEquals("buz", portBInTopo.getStringAttribute("fizz"));
833
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700834 LinkData linkAInTopo = topology.getLinkData(linkA.getLinkTuple());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700835 assertEquals(linkA, linkAInTopo);
836 assertTrue(linkAInTopo.isFrozen());
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700837 assertEquals(TopologyElement.TYPE_OPTICAL_LAYER,
838 linkAInTopo.getType());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700839
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700840 LinkData linkBInTopo = topology.getLinkData(linkB.getLinkTuple());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700841 assertEquals(linkB, linkBInTopo);
842 assertTrue(linkBInTopo.isFrozen());
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700843 assertEquals(TopologyElement.TYPE_OPTICAL_LAYER,
844 linkBInTopo.getType());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700845
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700846 // Check the events to be fired
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700847 List<LinkData> apiAddedLinkDataEntries
848 = TestUtils.getField(theTopologyManager, "apiAddedLinkDataEntries");
849 assertThat(apiAddedLinkDataEntries, containsInAnyOrder(linkA, linkB));
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700850 }
851
852 /**
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700853 * Tests removing of a Link without removing of a Host, and the topology
854 * replica transformation.
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700855 */
856 @Test
857 public void testAddLinkKickingOffHost() {
858 setupTopologyManager();
859
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700860 SwitchData sw = new SwitchData(DPID_1);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700861 sw.createStringAttribute("foo", "bar");
862
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700863 final PortNumber portNumberA = PortNumber.uint32(2);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700864 PortData portA = new PortData(DPID_1, portNumberA);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700865 portA.createStringAttribute("fuzz", "buzz");
866
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700867 final PortNumber portNumberB = PortNumber.uint32(3);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700868 PortData portB = new PortData(DPID_1, portNumberB);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700869 portB.createStringAttribute("fizz", "buz");
870
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700871 final PortNumber portNumberC = PortNumber.uint32(4);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700872 PortData portC = new PortData(DPID_1, portNumberC);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700873 portC.createStringAttribute("fizz", "buz");
874
875 final MACAddress macA = MACAddress.valueOf(666L);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700876 HostData hostA = new HostData(macA);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700877 hostA.addAttachmentPoint(portA.getSwitchPort());
878 final long timestampA = 392893200L;
879 hostA.setLastSeenTime(timestampA);
880
881 final MACAddress macB = MACAddress.valueOf(999L);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700882 HostData hostB = new HostData(macB);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700883 hostB.addAttachmentPoint(portB.getSwitchPort());
884 hostB.addAttachmentPoint(portC.getSwitchPort());
885 final long timestampB = 392893201L;
886 hostB.setLastSeenTime(timestampB);
887
888
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700889 LinkData linkA = new LinkData(portA.getSwitchPort(),
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700890 portB.getSwitchPort());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700891 linkA.createStringAttribute(TopologyElement.TYPE,
892 TopologyElement.TYPE_OPTICAL_LAYER);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700893 LinkData linkB = new LinkData(portB.getSwitchPort(),
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700894 portA.getSwitchPort());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700895 linkB.createStringAttribute(TopologyElement.TYPE,
896 TopologyElement.TYPE_OPTICAL_LAYER);
897
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700898 TestUtils.callMethod(theTopologyManager, "addSwitch",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700899 SwitchData.class, sw);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700900 TestUtils.callMethod(theTopologyManager, "addPort",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700901 PortData.class, portA);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700902 TestUtils.callMethod(theTopologyManager, "addPort",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700903 PortData.class, portB);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700904 TestUtils.callMethod(theTopologyManager, "addPort",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700905 PortData.class, portC);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700906 TestUtils.callMethod(theTopologyManager, "addHost",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700907 HostData.class, hostA);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700908 TestUtils.callMethod(theTopologyManager, "addHost",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700909 HostData.class, hostB);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700910
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700911 TestUtils.callMethod(theTopologyManager, "addLink",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700912 LinkData.class, linkA);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700913 TestUtils.callMethod(theTopologyManager, "addLink",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700914 LinkData.class, linkB);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700915
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700916 // Check the topology structure
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700917 BaseInternalTopology topology =
918 (BaseInternalTopology) theTopologyManager.getTopology();
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700919 SwitchData swInTopo = topology.getSwitchData(DPID_1);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700920 assertEquals(sw, swInTopo);
921 assertTrue(swInTopo.isFrozen());
922 assertEquals("bar", swInTopo.getStringAttribute("foo"));
923
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700924 final SwitchPort switchPortA = new SwitchPort(DPID_1, portNumberA);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700925 PortData portAInTopo = topology.getPortData(switchPortA);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700926 assertEquals(portA, portAInTopo);
927 assertTrue(portAInTopo.isFrozen());
928 assertEquals("buzz", portAInTopo.getStringAttribute("fuzz"));
929
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700930 final SwitchPort switchPortB = new SwitchPort(DPID_1, portNumberB);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700931 PortData portBInTopo = topology.getPortData(switchPortB);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700932 assertEquals(portB, portBInTopo);
933 assertTrue(portBInTopo.isFrozen());
934 assertEquals("buz", portBInTopo.getStringAttribute("fizz"));
935
936 // hostA expected to be removed
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700937 assertNull(topology.getHostData(macA));
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700938 // hostB expected to be there with reduced attachment point
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700939 HostData hostBrev = new HostData(macB);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700940 hostBrev.addAttachmentPoint(portC.getSwitchPort());
941 hostBrev.setLastSeenTime(timestampB);
942 hostBrev.freeze();
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700943 assertEquals(hostBrev, topology.getHostData(macB));
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700944
945
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700946 LinkData linkAInTopo = topology.getLinkData(linkA.getLinkTuple());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700947 assertEquals(linkA, linkAInTopo);
948 assertTrue(linkAInTopo.isFrozen());
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700949 assertEquals(TopologyElement.TYPE_OPTICAL_LAYER,
950 linkAInTopo.getType());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700951
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700952 LinkData linkBInTopo = topology.getLinkData(linkB.getLinkTuple());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700953 assertEquals(linkB, linkBInTopo);
954 assertTrue(linkBInTopo.isFrozen());
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700955 assertEquals(TopologyElement.TYPE_OPTICAL_LAYER,
956 linkBInTopo.getType());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700957
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700958 // Check the events to be fired
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700959 List<HostData> apiAddedHostDataEntries
960 = TestUtils.getField(theTopologyManager, "apiAddedHostDataEntries");
961 assertThat(apiAddedHostDataEntries, hasItem(hostBrev));
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700962
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700963 List<HostData> apiRemovedHostDataEntries
964 = TestUtils.getField(theTopologyManager, "apiRemovedHostDataEntries");
965 assertThat(apiRemovedHostDataEntries, hasItem(hostA));
966 List<LinkData> apiAddedLinkDataEntries
967 = TestUtils.getField(theTopologyManager, "apiAddedLinkDataEntries");
968 assertThat(apiAddedLinkDataEntries, containsInAnyOrder(linkA, linkB));
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700969 }
970
971 /**
Pavlin Radoslavovc6236412014-08-01 20:37:46 -0700972 * Tests removing of a Link and the topology replica transformation.
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700973 */
974 @Test
975 public void testRemoveLink() {
976 setupTopologyManager();
977
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700978 SwitchData sw = new SwitchData(DPID_1);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700979 sw.createStringAttribute("foo", "bar");
980
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700981 final PortNumber portNumberA = PortNumber.uint32(2);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700982 PortData portA = new PortData(DPID_1, portNumberA);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700983 portA.createStringAttribute("fuzz", "buzz");
984
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700985 final PortNumber portNumberB = PortNumber.uint32(3);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700986 PortData portB = new PortData(DPID_1, portNumberB);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700987 portB.createStringAttribute("fizz", "buz");
988
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700989 LinkData linkA = new LinkData(portA.getSwitchPort(),
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700990 portB.getSwitchPort());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700991 linkA.createStringAttribute(TopologyElement.TYPE,
992 TopologyElement.TYPE_OPTICAL_LAYER);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700993 LinkData linkB = new LinkData(portB.getSwitchPort(),
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700994 portA.getSwitchPort());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700995 linkB.createStringAttribute(TopologyElement.TYPE,
996 TopologyElement.TYPE_OPTICAL_LAYER);
997
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -0700998 TestUtils.callMethod(theTopologyManager, "addSwitch",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700999 SwitchData.class, sw);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001000 TestUtils.callMethod(theTopologyManager, "addPort",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001001 PortData.class, portA);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001002 TestUtils.callMethod(theTopologyManager, "addPort",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001003 PortData.class, portB);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001004 TestUtils.callMethod(theTopologyManager, "addLink",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001005 LinkData.class, linkA);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001006 TestUtils.callMethod(theTopologyManager, "addLink",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001007 LinkData.class, linkB);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001008
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001009 // Check the topology structure
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -07001010 BaseInternalTopology topology =
1011 (BaseInternalTopology) theTopologyManager.getTopology();
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001012 SwitchData swInTopo = topology.getSwitchData(DPID_1);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001013 assertEquals(sw, swInTopo);
1014 assertTrue(swInTopo.isFrozen());
1015 assertEquals("bar", swInTopo.getStringAttribute("foo"));
1016
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001017 final SwitchPort switchPortA = new SwitchPort(DPID_1, portNumberA);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001018 PortData portAInTopo = topology.getPortData(switchPortA);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001019 assertEquals(portA, portAInTopo);
1020 assertTrue(portAInTopo.isFrozen());
1021 assertEquals("buzz", portAInTopo.getStringAttribute("fuzz"));
1022
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001023 final SwitchPort switchPortB = new SwitchPort(DPID_1, portNumberB);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001024 PortData portBInTopo = topology.getPortData(switchPortB);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001025 assertEquals(portB, portBInTopo);
1026 assertTrue(portBInTopo.isFrozen());
1027 assertEquals("buz", portBInTopo.getStringAttribute("fizz"));
1028
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001029 LinkData linkAInTopo = topology.getLinkData(linkA.getLinkTuple());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001030 assertEquals(linkA, linkAInTopo);
1031 assertTrue(linkAInTopo.isFrozen());
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001032 assertEquals(TopologyElement.TYPE_OPTICAL_LAYER,
1033 linkAInTopo.getType());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001034
1035
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001036 LinkData linkBInTopo = topology.getLinkData(linkB.getLinkTuple());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001037 assertEquals(linkB, linkBInTopo);
1038 assertTrue(linkBInTopo.isFrozen());
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001039 assertEquals(TopologyElement.TYPE_OPTICAL_LAYER,
1040 linkBInTopo.getType());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001041
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001042 // Check the events to be fired
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001043 // FIXME if link flapped (linkA in this scenario),
1044 // linkA appears in both removed and added is this expected behavior?
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001045 List<LinkData> apiAddedLinkDataEntries
1046 = TestUtils.getField(theTopologyManager, "apiAddedLinkDataEntries");
1047 assertThat(apiAddedLinkDataEntries, containsInAnyOrder(linkA, linkB));
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001048
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001049 // Clear the events before removing the link
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001050 apiAddedLinkDataEntries.clear();
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001051
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001052 // Remove the link
1053 TestUtils.callMethod(theTopologyManager, "removeLink",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001054 LinkData.class, new LinkData(linkA));
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001055
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001056 LinkData linkANotInTopo = topology.getLinkData(linkA.getLinkTuple());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001057 assertNull(linkANotInTopo);
1058
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001059 List<LinkData> apiRemovedLinkDataEntries
1060 = TestUtils.getField(theTopologyManager, "apiRemovedLinkDataEntries");
1061 assertThat(apiRemovedLinkDataEntries, hasItem(linkA));
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001062 }
1063
1064 /**
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001065 * Tests adding of a Host without adding of a Link, and the topology
1066 * replica transformation.
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001067 */
1068 @Test
1069 public void testAddHostIgnoredByLink() {
1070 setupTopologyManager();
1071
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001072 SwitchData sw = new SwitchData(DPID_1);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001073 sw.createStringAttribute("foo", "bar");
1074
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001075 final PortNumber portNumberA = PortNumber.uint32(2);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001076 PortData portA = new PortData(DPID_1, portNumberA);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001077 portA.createStringAttribute("fuzz", "buzz");
1078
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001079 final PortNumber portNumberB = PortNumber.uint32(3);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001080 PortData portB = new PortData(DPID_1, portNumberB);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001081 portB.createStringAttribute("fizz", "buz");
1082
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001083 final PortNumber portNumberC = PortNumber.uint32(4);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001084 PortData portC = new PortData(DPID_1, portNumberC);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001085 portC.createStringAttribute("fizz", "buz");
1086
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001087 LinkData linkA = new LinkData(portA.getSwitchPort(),
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001088 portB.getSwitchPort());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001089 linkA.createStringAttribute(TopologyElement.TYPE,
1090 TopologyElement.TYPE_OPTICAL_LAYER);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001091 LinkData linkB = new LinkData(portB.getSwitchPort(),
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001092 portA.getSwitchPort());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001093 linkB.createStringAttribute(TopologyElement.TYPE,
1094 TopologyElement.TYPE_OPTICAL_LAYER);
1095
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001096 TestUtils.callMethod(theTopologyManager, "addSwitch",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001097 SwitchData.class, sw);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001098 TestUtils.callMethod(theTopologyManager, "addPort",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001099 PortData.class, portA);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001100 TestUtils.callMethod(theTopologyManager, "addPort",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001101 PortData.class, portB);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001102 TestUtils.callMethod(theTopologyManager, "addPort",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001103 PortData.class, portC);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001104 TestUtils.callMethod(theTopologyManager, "addLink",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001105 LinkData.class, linkA);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001106 TestUtils.callMethod(theTopologyManager, "addLink",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001107 LinkData.class, linkB);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001108
1109 // Add hostA attached to a port which already has a link
1110 final MACAddress macA = MACAddress.valueOf(666L);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001111 HostData hostA = new HostData(macA);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001112 hostA.addAttachmentPoint(portA.getSwitchPort());
1113 final long timestampA = 392893200L;
1114 hostA.setLastSeenTime(timestampA);
1115
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001116 TestUtils.callMethod(theTopologyManager, "addHost",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001117 HostData.class, hostA);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001118
1119 // Add hostB attached to multiple ports,
1120 // some of them which already has a link
1121 final MACAddress macB = MACAddress.valueOf(999L);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001122 HostData hostB = new HostData(macB);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001123 hostB.addAttachmentPoint(portB.getSwitchPort());
1124 hostB.addAttachmentPoint(portC.getSwitchPort());
1125 final long timestampB = 392893201L;
1126 hostB.setLastSeenTime(timestampB);
1127
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001128 TestUtils.callMethod(theTopologyManager, "addHost",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001129 HostData.class, hostB);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001130
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001131 // Check the topology structure
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -07001132 BaseInternalTopology topology =
1133 (BaseInternalTopology) theTopologyManager.getTopology();
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001134 SwitchData swInTopo = topology.getSwitchData(DPID_1);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001135 assertEquals(sw, swInTopo);
1136 assertTrue(swInTopo.isFrozen());
1137 assertEquals("bar", swInTopo.getStringAttribute("foo"));
1138
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001139 final SwitchPort switchPortA = new SwitchPort(DPID_1, portNumberA);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001140 PortData portAInTopo = topology.getPortData(switchPortA);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001141 assertEquals(portA, portAInTopo);
1142 assertTrue(portAInTopo.isFrozen());
1143 assertEquals("buzz", portAInTopo.getStringAttribute("fuzz"));
1144
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001145 final SwitchPort switchPortB = new SwitchPort(DPID_1, portNumberB);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001146 PortData portBInTopo = topology.getPortData(switchPortB);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001147 assertEquals(portB, portBInTopo);
1148 assertTrue(portBInTopo.isFrozen());
1149 assertEquals("buz", portBInTopo.getStringAttribute("fizz"));
1150
1151 // hostA expected to be completely ignored
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001152 assertNull(topology.getHostData(macA));
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001153 // hostB expected to be there with reduced attachment point
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001154 HostData hostBrev = new HostData(macB);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001155 hostBrev.addAttachmentPoint(portC.getSwitchPort());
1156 hostBrev.setLastSeenTime(timestampB);
1157 hostBrev.freeze();
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001158 assertEquals(hostBrev, topology.getHostData(macB));
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001159
1160
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001161 LinkData linkAInTopo = topology.getLinkData(linkA.getLinkTuple());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001162 assertEquals(linkA, linkAInTopo);
1163 assertTrue(linkAInTopo.isFrozen());
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001164 assertEquals(TopologyElement.TYPE_OPTICAL_LAYER,
1165 linkAInTopo.getType());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001166
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001167 LinkData linkBInTopo = topology.getLinkData(linkB.getLinkTuple());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001168 assertEquals(linkB, linkBInTopo);
1169 assertTrue(linkBInTopo.isFrozen());
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001170 assertEquals(TopologyElement.TYPE_OPTICAL_LAYER,
1171 linkBInTopo.getType());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001172
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001173 // Check the events to be fired
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001174 // hostB should be added with reduced attachment points
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001175 List<HostData> apiAddedHostDataEntries
1176 = TestUtils.getField(theTopologyManager, "apiAddedHostDataEntries");
1177 assertThat(apiAddedHostDataEntries, hasItem(hostBrev));
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001178
1179 // hostA should not be ignored
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001180 List<HostData> apiRemovedHostDataEntries
1181 = TestUtils.getField(theTopologyManager, "apiRemovedHostDataEntries");
1182 assertThat(apiRemovedHostDataEntries, not(hasItem(hostA)));
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001183
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001184 List<LinkData> apiAddedLinkDataEntries
1185 = TestUtils.getField(theTopologyManager, "apiAddedLinkDataEntries");
1186 assertThat(apiAddedLinkDataEntries, containsInAnyOrder(linkA, linkB));
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001187 }
1188
1189 /**
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001190 * Tests adding and moving of a Host, and the topology replica
1191 * transformation.
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001192 */
1193 @Test
1194 public void testAddHostMove() {
1195 setupTopologyManager();
1196
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001197 SwitchData sw = new SwitchData(DPID_1);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001198 sw.createStringAttribute("foo", "bar");
1199
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001200 final PortNumber portNumberA = PortNumber.uint32(2);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001201 PortData portA = new PortData(DPID_1, portNumberA);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001202 portA.createStringAttribute("fuzz", "buzz");
1203
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001204 final PortNumber portNumberB = PortNumber.uint32(3);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001205 PortData portB = new PortData(DPID_1, portNumberB);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001206 portB.createStringAttribute("fizz", "buz");
1207
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001208 final PortNumber portNumberC = PortNumber.uint32(4);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001209 PortData portC = new PortData(DPID_1, portNumberC);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001210 portC.createStringAttribute("fizz", "buz");
1211
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001212 TestUtils.callMethod(theTopologyManager, "addSwitch",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001213 SwitchData.class, sw);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001214 TestUtils.callMethod(theTopologyManager, "addPort",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001215 PortData.class, portA);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001216 TestUtils.callMethod(theTopologyManager, "addPort",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001217 PortData.class, portB);
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001218 TestUtils.callMethod(theTopologyManager, "addPort",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001219 PortData.class, portC);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001220
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001221 // Add hostA attached to a Port which already has a Link
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001222 final MACAddress macA = MACAddress.valueOf(666L);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001223 HostData hostA = new HostData(macA);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001224 hostA.addAttachmentPoint(portA.getSwitchPort());
1225 final long timestampA = 392893200L;
1226 hostA.setLastSeenTime(timestampA);
1227
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001228 TestUtils.callMethod(theTopologyManager, "addHost",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001229 HostData.class, hostA);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001230
1231
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001232 // Check the topology structure
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -07001233 BaseInternalTopology topology =
1234 (BaseInternalTopology) theTopologyManager.getTopology();
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001235 SwitchData swInTopo = topology.getSwitchData(DPID_1);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001236 assertEquals(sw, swInTopo);
1237 assertTrue(swInTopo.isFrozen());
1238 assertEquals("bar", swInTopo.getStringAttribute("foo"));
1239
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001240 final SwitchPort switchPortA = new SwitchPort(DPID_1, portNumberA);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001241 PortData portAInTopo = topology.getPortData(switchPortA);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001242 assertEquals(portA, portAInTopo);
1243 assertTrue(portAInTopo.isFrozen());
1244 assertEquals("buzz", portAInTopo.getStringAttribute("fuzz"));
1245
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001246 final SwitchPort switchPortB = new SwitchPort(DPID_1, portNumberB);
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001247 PortData portBInTopo = topology.getPortData(switchPortB);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001248 assertEquals(portB, portBInTopo);
1249 assertTrue(portBInTopo.isFrozen());
1250 assertEquals("buz", portBInTopo.getStringAttribute("fizz"));
1251
1252 // hostA expected to be there
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001253 assertEquals(hostA, topology.getHostData(macA));
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001254 assertEquals(timestampA,
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001255 topology.getHostData(macA).getLastSeenTime());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001256
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001257 // Check the events to be fired
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001258 // hostA should be added
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001259 List<HostData> apiAddedHostDataEntries
1260 = TestUtils.getField(theTopologyManager, "apiAddedHostDataEntries");
1261 assertThat(apiAddedHostDataEntries, hasItem(hostA));
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001262
1263
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001264 // Clear the events before moving the Host
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001265 apiAddedHostDataEntries.clear();
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001266
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001267 HostData hostAmoved = new HostData(macA);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001268 hostAmoved.addAttachmentPoint(portB.getSwitchPort());
1269 final long timestampAmoved = 392893201L;
1270 hostAmoved.setLastSeenTime(timestampAmoved);
1271
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001272 TestUtils.callMethod(theTopologyManager, "addHost",
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001273 HostData.class, hostAmoved);
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001274
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001275 assertEquals(hostAmoved, topology.getHostData(macA));
Pavlin Radoslavovefa17b22014-08-01 16:57:56 -07001276 assertEquals(timestampAmoved,
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001277 topology.getHostData(macA).getLastSeenTime());
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001278
1279 // hostA expected to be there with new attachment point
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001280 apiAddedHostDataEntries
1281 = TestUtils.getField(theTopologyManager, "apiAddedHostDataEntries");
1282 assertThat(apiAddedHostDataEntries, hasItem(hostAmoved));
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001283
1284 // hostA is updated not removed
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001285 List<HostData> apiRemovedHostDataEntries
1286 = TestUtils.getField(theTopologyManager, "apiRemovedHostDataEntries");
1287 assertThat(apiRemovedHostDataEntries, not(hasItem(hostA)));
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -07001288 }
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001289
1290 /**
1291 * Tests processing of a Switch Mastership Event and the delivery of the
1292 * topology events.
1293 */
1294 @Test
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001295 public void testProcessMastershipData() {
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001296 List<EventEntry<TopologyEvent>> events = new LinkedList<>();
1297 EventEntry<TopologyEvent> eventEntry;
1298 TopologyEvent topologyEvent;
1299
1300 setupTopologyManagerWithEventHandler();
1301
1302 // Prepare the Mastership Event
1303 Role role = Role.MASTER;
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001304 MastershipData mastershipData =
1305 new MastershipData(DPID_1, ONOS_INSTANCE_ID_1, role);
1306 topologyEvent = new TopologyEvent(mastershipData, ONOS_INSTANCE_ID_1);
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001307
1308 // Add the Mastership Event
1309 eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
1310 topologyEvent);
1311 events.add(eventEntry);
1312
1313 // Process the events
1314 TestUtils.callMethod(theEventHandler, "processEvents",
1315 List.class, events);
1316
1317 // Check the fired events
1318 TopologyEvents topologyEvents = theTopologyListener.topologyEvents;
1319 assertNotNull(topologyEvents);
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001320 assertThat(topologyEvents.getAddedMastershipDataEntries(),
1321 hasItem(mastershipData));
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001322 theTopologyListener.clear();
1323 }
1324
1325 /**
1326 * Tests processing of a Switch Event, and the delivery of the topology
1327 * events.
1328 *
1329 * We test the following scenario:
1330 * - Switch Mastership Event is processed along with a Switch Event - both
1331 * events should be delivered.
1332 */
1333 @Test
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001334 public void testProcessSwitchData() {
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001335 TopologyEvents topologyEvents;
1336 List<EventEntry<TopologyEvent>> events = new LinkedList<>();
1337 EventEntry<TopologyEvent> eventEntry;
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001338 TopologyEvent topologyMastershipData;
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001339 TopologyEvent topologySwitchData;
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001340
1341 setupTopologyManagerWithEventHandler();
1342
1343 // Prepare the Mastership Event
1344 Role role = Role.MASTER;
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001345 MastershipData mastershipData =
1346 new MastershipData(DPID_1, ONOS_INSTANCE_ID_1, role);
1347 topologyMastershipData = new TopologyEvent(mastershipData,
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001348 ONOS_INSTANCE_ID_1);
1349
1350 // Prepare the Switch Event
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001351 SwitchData switchData = new SwitchData(DPID_1);
1352 topologySwitchData = new TopologyEvent(switchData,
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001353 ONOS_INSTANCE_ID_1);
1354
1355 // Add the Mastership Event
1356 eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001357 topologyMastershipData);
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001358 events.add(eventEntry);
1359
1360 // Add the Switch Event
1361 eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001362 topologySwitchData);
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001363 events.add(eventEntry);
1364
1365 // Process the events
1366 TestUtils.callMethod(theEventHandler, "processEvents",
1367 List.class, events);
1368
1369 // Check the fired events
1370 topologyEvents = theTopologyListener.topologyEvents;
1371 assertNotNull(topologyEvents);
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001372 assertThat(topologyEvents.getAddedMastershipDataEntries(),
1373 hasItem(mastershipData));
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001374 assertThat(topologyEvents.getAddedSwitchDataEntries(),
1375 hasItem(switchData));
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001376 theTopologyListener.clear();
1377 }
1378
1379 /**
1380 * Tests processing of a misordered Switch Event, and the delivery of the
1381 * topology events.
1382 *
1383 * We test the following scenario:
1384 * - Only a Switch Event is processed first, later followed by a Switch
1385 * Mastership Event - the Switch Event should be delivered after the
1386 * Switch Mastership Event is processed.
1387 */
1388 @Test
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001389 public void testProcessMisorderedSwitchData() {
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001390 TopologyEvents topologyEvents;
1391 List<EventEntry<TopologyEvent>> events = new LinkedList<>();
1392 EventEntry<TopologyEvent> eventEntry;
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001393 TopologyEvent topologyMastershipData;
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001394 TopologyEvent topologySwitchData;
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001395
1396 setupTopologyManagerWithEventHandler();
1397
1398 // Prepare the Mastership Event
1399 Role role = Role.MASTER;
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001400 MastershipData mastershipData =
1401 new MastershipData(DPID_1, ONOS_INSTANCE_ID_1, role);
1402 topologyMastershipData = new TopologyEvent(mastershipData,
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001403 ONOS_INSTANCE_ID_1);
1404
1405 // Prepare the Switch Event
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001406 SwitchData switchData = new SwitchData(DPID_1);
1407 topologySwitchData = new TopologyEvent(switchData,
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001408 ONOS_INSTANCE_ID_1);
1409
1410 // Add the Switch Event
1411 eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001412 topologySwitchData);
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001413 events.add(eventEntry);
1414
1415 // Process the events
1416 TestUtils.callMethod(theEventHandler, "processEvents",
1417 List.class, events);
1418
1419 // Check the fired events: no events should be fired
1420 topologyEvents = theTopologyListener.topologyEvents;
1421 assertNull(topologyEvents);
1422 theTopologyListener.clear();
1423 events.clear();
1424
1425 // Add the Mastership Event
1426 eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001427 topologyMastershipData);
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001428 events.add(eventEntry);
1429
1430 // Process the events
1431 TestUtils.callMethod(theEventHandler, "processEvents",
1432 List.class, events);
1433
1434 // Check the fired events: both events should be fired
1435 topologyEvents = theTopologyListener.topologyEvents;
1436 assertNotNull(topologyEvents);
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001437 assertThat(topologyEvents.getAddedMastershipDataEntries(),
1438 hasItem(mastershipData));
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001439 assertThat(topologyEvents.getAddedSwitchDataEntries(),
1440 hasItem(switchData));
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001441 theTopologyListener.clear();
1442 }
1443
1444 /**
1445 * Tests processing of a Switch Event with Mastership Event from
1446 * another ONOS instance, and the delivery of the topology events.
1447 *
1448 * We test the following scenario:
1449 * - Only a Switch Event is processed first, later followed by a Switch
1450 * Mastership Event from another ONOS instance - only the Switch
1451 * Mastership Event should be delivered.
1452 */
1453 @Test
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001454 public void testProcessSwitchDataNoMastership() {
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001455 TopologyEvents topologyEvents;
1456 List<EventEntry<TopologyEvent>> events = new LinkedList<>();
1457 EventEntry<TopologyEvent> eventEntry;
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001458 TopologyEvent topologyMastershipData;
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001459 TopologyEvent topologySwitchData;
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001460
1461 setupTopologyManagerWithEventHandler();
1462
1463 // Prepare the Mastership Event
1464 Role role = Role.MASTER;
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001465 MastershipData mastershipData =
1466 new MastershipData(DPID_2, ONOS_INSTANCE_ID_2, role);
1467 topologyMastershipData = new TopologyEvent(mastershipData,
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001468 ONOS_INSTANCE_ID_2);
1469
1470 // Prepare the Switch Event
1471 // NOTE: The originator (ONOS_INSTANCE_ID_1) is NOT the Master
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001472 SwitchData switchData = new SwitchData(DPID_2);
1473 topologySwitchData = new TopologyEvent(switchData,
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001474 ONOS_INSTANCE_ID_1);
1475
1476 // Add the Switch Event
1477 eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001478 topologySwitchData);
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001479 events.add(eventEntry);
1480
1481 // Process the events
1482 TestUtils.callMethod(theEventHandler, "processEvents",
1483 List.class, events);
1484
1485 // Check the fired events: no events should be fired
1486 topologyEvents = theTopologyListener.topologyEvents;
1487 assertNull(topologyEvents);
1488 theTopologyListener.clear();
1489 events.clear();
1490
1491 // Add the Mastership Event
1492 eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001493 topologyMastershipData);
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001494 events.add(eventEntry);
1495
1496 // Process the events
1497 TestUtils.callMethod(theEventHandler, "processEvents",
1498 List.class, events);
1499
1500 // Check the fired events: only the Mastership event should be fired
1501 topologyEvents = theTopologyListener.topologyEvents;
1502 assertNotNull(topologyEvents);
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001503 assertThat(topologyEvents.getAddedMastershipDataEntries(),
1504 hasItem(mastershipData));
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001505 assertThat(topologyEvents.getAddedSwitchDataEntries(), is(empty()));
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001506 theTopologyListener.clear();
1507 }
1508
1509 /**
1510 * Tests processing of Switch Events with Mastership switchover between
1511 * two ONOS instance, and the delivery of the topology events.
1512 *
1513 * We test the following scenario:
1514 * - Initially, a Mastership Event and a Switch Event from one ONOS
1515 * instance are processed - both events should be delivered.
1516 * - Later, a Mastership Event and a Switch event from another ONOS
1517 * instances are processed - both events should be delivered.
1518 * - Finally, a REMOVE Switch Event is received from the first ONOS
1519 * instance - no event should be delivered.
Pavlin Radoslavov054cd592014-08-07 20:57:16 -07001520 *
1521 * @throws RegistryException
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001522 */
1523 @Test
Pavlin Radoslavov054cd592014-08-07 20:57:16 -07001524 public void testProcessSwitchMastershipSwitchover()
1525 throws RegistryException {
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001526 TopologyEvents topologyEvents;
1527 List<EventEntry<TopologyEvent>> events = new LinkedList<>();
1528 EventEntry<TopologyEvent> eventEntry;
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001529 TopologyEvent topologyMastershipData;
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001530 TopologyEvent topologySwitchData;
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001531
1532 setupTopologyManagerWithEventHandler();
1533
1534 // Prepare the Mastership Event from the first ONOS instance
1535 Role role = Role.MASTER;
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001536 MastershipData mastershipData =
1537 new MastershipData(DPID_1, ONOS_INSTANCE_ID_1, role);
1538 topologyMastershipData = new TopologyEvent(mastershipData,
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001539 ONOS_INSTANCE_ID_1);
1540
1541 // Prepare the Switch Event from the first ONOS instance
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001542 SwitchData switchData = new SwitchData(DPID_1);
1543 topologySwitchData = new TopologyEvent(switchData,
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001544 ONOS_INSTANCE_ID_1);
1545
1546 // Add the Mastership Event
1547 eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001548 topologyMastershipData);
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001549 events.add(eventEntry);
1550
1551 // Add the Switch Event
1552 eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001553 topologySwitchData);
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001554 events.add(eventEntry);
1555
1556 // Process the events
1557 TestUtils.callMethod(theEventHandler, "processEvents",
1558 List.class, events);
1559
1560 // Check the fired events: both events should be fired
1561 topologyEvents = theTopologyListener.topologyEvents;
1562 assertNotNull(topologyEvents);
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001563 assertThat(topologyEvents.getAddedMastershipDataEntries(),
1564 hasItem(mastershipData));
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001565 assertThat(topologyEvents.getAddedSwitchDataEntries(),
1566 hasItem(switchData));
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001567 theTopologyListener.clear();
1568 events.clear();
1569
1570 //
1571 // Update the Registry Service, so the second ONOS instance is the
1572 // Master.
1573 //
1574 reset(registryService);
Pavlin Radoslavov054cd592014-08-07 20:57:16 -07001575 expect(registryService.getControllerForSwitch(DPID_1.value()))
1576 .andReturn(ONOS_INSTANCE_ID_2.toString()).anyTimes();
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001577 replay(registryService);
1578
1579 // Prepare the Mastership Event from the second ONOS instance
1580 role = Role.MASTER;
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001581 mastershipData = new MastershipData(DPID_1,
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001582 ONOS_INSTANCE_ID_2, role);
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001583 topologyMastershipData = new TopologyEvent(mastershipData,
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001584 ONOS_INSTANCE_ID_2);
1585
1586 // Prepare the Switch Event from second ONOS instance
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001587 switchData = new SwitchData(DPID_1);
1588 topologySwitchData = new TopologyEvent(switchData,
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001589 ONOS_INSTANCE_ID_2);
1590
1591 // Add the Mastership Event
1592 eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001593 topologyMastershipData);
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001594 events.add(eventEntry);
1595
1596 // Add the Switch Event
1597 eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001598 topologySwitchData);
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001599 events.add(eventEntry);
1600
1601 // Process the events
1602 TestUtils.callMethod(theEventHandler, "processEvents",
1603 List.class, events);
1604
1605 // Check the fired events: both events should be fired
1606 topologyEvents = theTopologyListener.topologyEvents;
1607 assertNotNull(topologyEvents);
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001608 assertThat(topologyEvents.getAddedMastershipDataEntries(),
1609 hasItem(mastershipData));
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001610 assertThat(topologyEvents.getAddedSwitchDataEntries(),
1611 hasItem(switchData));
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001612 theTopologyListener.clear();
1613 events.clear();
1614
1615 // Prepare the REMOVE Switch Event from first ONOS instance
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001616 switchData = new SwitchData(DPID_1);
1617 topologySwitchData = new TopologyEvent(switchData,
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001618 ONOS_INSTANCE_ID_1);
1619 // Add the Switch Event
1620 eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_REMOVE,
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001621 topologySwitchData);
Pavlin Radoslavovc6236412014-08-01 20:37:46 -07001622 events.add(eventEntry);
1623
1624 // Process the events
1625 TestUtils.callMethod(theEventHandler, "processEvents",
1626 List.class, events);
1627
1628 // Check the fired events: no events should be fired
1629 topologyEvents = theTopologyListener.topologyEvents;
1630 assertNull(topologyEvents);
1631 theTopologyListener.clear();
1632 events.clear();
1633 }
Pavlin Radoslavovae7e8482014-08-11 16:58:19 -07001634
1635 /**
1636 * Tests processing of Configured Switch Events with Mastership switchover
1637 * between two ONOS instance, and the delivery of the topology events.
1638 * <p/>
1639 * NOTE: This test is similar to testProcessSwitchMastershipSwitchover()
1640 * except that the topology and all events are considered as statically
1641 * configured.
1642 * <p/>
1643 * We test the following scenario:
1644 * - Initially, a Mastership Event and a Switch Event from one ONOS
1645 * instance are processed - both events should be delivered.
1646 * - Later, a Mastership Event and a Switch event from another ONOS
1647 * instances are processed - both events should be delivered.
1648 */
1649 @Test
1650 public void testProcessConfiguredSwitchMastershipSwitchover() {
1651 TopologyEvents topologyEvents;
1652 List<EventEntry<TopologyEvent>> events = new LinkedList<>();
1653 EventEntry<TopologyEvent> eventEntry;
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001654 TopologyEvent topologyMastershipData;
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001655 TopologyEvent topologySwitchData;
Pavlin Radoslavovae7e8482014-08-11 16:58:19 -07001656
1657 setupTopologyManagerWithEventHandler();
1658
1659 // Reset the Registry Service so it is not used
1660 reset(registryService);
1661
1662 // Prepare the Mastership Event from the first ONOS instance
1663 Role role = Role.MASTER;
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001664 MastershipData mastershipData =
1665 new MastershipData(DPID_1, ONOS_INSTANCE_ID_1, role);
1666 mastershipData.createStringAttribute(
Pavlin Radoslavovae7e8482014-08-11 16:58:19 -07001667 TopologyElement.ELEMENT_CONFIG_STATE,
1668 ConfigState.CONFIGURED.toString());
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001669 topologyMastershipData = new TopologyEvent(mastershipData,
Pavlin Radoslavovae7e8482014-08-11 16:58:19 -07001670 ONOS_INSTANCE_ID_1);
1671
1672 // Prepare the Switch Event from the first ONOS instance
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001673 SwitchData switchData = new SwitchData(DPID_1);
1674 switchData.createStringAttribute(
Pavlin Radoslavovae7e8482014-08-11 16:58:19 -07001675 TopologyElement.ELEMENT_CONFIG_STATE,
1676 ConfigState.CONFIGURED.toString());
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001677 topologySwitchData = new TopologyEvent(switchData,
Pavlin Radoslavovae7e8482014-08-11 16:58:19 -07001678 ONOS_INSTANCE_ID_1);
1679
1680 // Add the Mastership Event
1681 eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001682 topologyMastershipData);
Pavlin Radoslavovae7e8482014-08-11 16:58:19 -07001683 events.add(eventEntry);
1684
1685 // Add the Switch Event
1686 eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001687 topologySwitchData);
Pavlin Radoslavovae7e8482014-08-11 16:58:19 -07001688 events.add(eventEntry);
1689
1690 // Process the events
1691 TestUtils.callMethod(theEventHandler, "processEvents",
1692 List.class, events);
1693
1694 // Check the fired events: both events should be fired
1695 topologyEvents = theTopologyListener.topologyEvents;
1696 assertNotNull(topologyEvents);
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001697 assertThat(topologyEvents.getAddedMastershipDataEntries(),
1698 hasItem(mastershipData));
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001699 assertThat(topologyEvents.getAddedSwitchDataEntries(),
1700 hasItem(switchData));
Pavlin Radoslavovae7e8482014-08-11 16:58:19 -07001701 theTopologyListener.clear();
1702 events.clear();
1703
1704 // Prepare the Mastership Event from the second ONOS instance
1705 role = Role.MASTER;
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001706 mastershipData = new MastershipData(DPID_1,
Pavlin Radoslavovae7e8482014-08-11 16:58:19 -07001707 ONOS_INSTANCE_ID_2, role);
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001708 mastershipData.createStringAttribute(
Pavlin Radoslavovae7e8482014-08-11 16:58:19 -07001709 TopologyElement.ELEMENT_CONFIG_STATE,
1710 ConfigState.CONFIGURED.toString());
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001711 topologyMastershipData = new TopologyEvent(mastershipData,
Pavlin Radoslavovae7e8482014-08-11 16:58:19 -07001712 ONOS_INSTANCE_ID_2);
1713
1714 // Prepare the Switch Event from second ONOS instance
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001715 switchData = new SwitchData(DPID_1);
1716 switchData.createStringAttribute(
Pavlin Radoslavovae7e8482014-08-11 16:58:19 -07001717 TopologyElement.ELEMENT_CONFIG_STATE,
1718 ConfigState.CONFIGURED.toString());
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001719 topologySwitchData = new TopologyEvent(switchData,
Pavlin Radoslavovae7e8482014-08-11 16:58:19 -07001720 ONOS_INSTANCE_ID_2);
1721
1722 // Add the Mastership Event
1723 eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001724 topologyMastershipData);
Pavlin Radoslavovae7e8482014-08-11 16:58:19 -07001725 events.add(eventEntry);
1726
1727 // Add the Switch Event
1728 eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001729 topologySwitchData);
Pavlin Radoslavovae7e8482014-08-11 16:58:19 -07001730 events.add(eventEntry);
1731
1732 // Process the events
1733 TestUtils.callMethod(theEventHandler, "processEvents",
1734 List.class, events);
1735
1736 // Check the fired events: both events should be fired
1737 topologyEvents = theTopologyListener.topologyEvents;
1738 assertNotNull(topologyEvents);
Yuta HIGUCHId8fd2f52014-09-01 23:19:45 -07001739 assertThat(topologyEvents.getAddedMastershipDataEntries(),
1740 hasItem(mastershipData));
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001741 assertThat(topologyEvents.getAddedSwitchDataEntries(),
1742 hasItem(switchData));
Pavlin Radoslavovae7e8482014-08-11 16:58:19 -07001743 theTopologyListener.clear();
1744 events.clear();
1745
1746 // Prepare the REMOVE Switch Event from first ONOS instance
1747 //
1748 // NOTE: This event only is explicitly marked as NOT_CONFIGURED,
1749 // otherwise it will override the previous configuration events.
1750 //
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001751 switchData = new SwitchData(DPID_1);
1752 switchData.createStringAttribute(
Pavlin Radoslavovae7e8482014-08-11 16:58:19 -07001753 TopologyElement.ELEMENT_CONFIG_STATE,
1754 ConfigState.NOT_CONFIGURED.toString());
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001755 topologySwitchData = new TopologyEvent(switchData,
Pavlin Radoslavovae7e8482014-08-11 16:58:19 -07001756 ONOS_INSTANCE_ID_1);
1757 // Add the Switch Event
1758 eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_REMOVE,
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -07001759 topologySwitchData);
Pavlin Radoslavovae7e8482014-08-11 16:58:19 -07001760 events.add(eventEntry);
1761
1762 // Process the events
1763 TestUtils.callMethod(theEventHandler, "processEvents",
1764 List.class, events);
1765
1766 // Check the fired events: no events should be fired
1767 topologyEvents = theTopologyListener.topologyEvents;
1768 assertNull(topologyEvents);
1769 theTopologyListener.clear();
1770 events.clear();
1771 }
weibitf7c31a42014-06-23 16:51:01 -07001772}