Aaron Kruglikov

Completed testing of EdgeManager

Change-Id: I2d2f5ba62951951f29780904acfa5eec07657129
...@@ -15,47 +15,80 @@ ...@@ -15,47 +15,80 @@
15 */ 15 */
16 package org.onosproject.net.edgeservice.impl; 16 package org.onosproject.net.edgeservice.impl;
17 17
18 +import com.google.common.collect.Lists;
19 +import com.google.common.collect.Maps;
20 +import com.google.common.collect.Sets;
18 import org.junit.After; 21 import org.junit.After;
19 import org.junit.Before; 22 import org.junit.Before;
20 import org.junit.Test; 23 import org.junit.Test;
21 import org.onosproject.common.event.impl.TestEventDispatcher; 24 import org.onosproject.common.event.impl.TestEventDispatcher;
25 +import org.onosproject.event.Event;
22 import org.onosproject.net.ConnectPoint; 26 import org.onosproject.net.ConnectPoint;
27 +import org.onosproject.net.DefaultPort;
23 import org.onosproject.net.Device; 28 import org.onosproject.net.Device;
24 import org.onosproject.net.DeviceId; 29 import org.onosproject.net.DeviceId;
30 +import org.onosproject.net.NetTestTools;
25 import org.onosproject.net.Port; 31 import org.onosproject.net.Port;
32 +import org.onosproject.net.PortNumber;
33 +import org.onosproject.net.device.DeviceEvent;
26 import org.onosproject.net.device.DeviceServiceAdapter; 34 import org.onosproject.net.device.DeviceServiceAdapter;
27 import org.onosproject.net.edge.EdgePortEvent; 35 import org.onosproject.net.edge.EdgePortEvent;
28 import org.onosproject.net.edge.EdgePortListener; 36 import org.onosproject.net.edge.EdgePortListener;
37 +import org.onosproject.net.flow.TrafficTreatment;
38 +import org.onosproject.net.link.LinkEvent;
39 +import org.onosproject.net.packet.OutboundPacket;
29 import org.onosproject.net.packet.PacketServiceAdapter; 40 import org.onosproject.net.packet.PacketServiceAdapter;
30 import org.onosproject.net.topology.Topology; 41 import org.onosproject.net.topology.Topology;
42 +import org.onosproject.net.topology.TopologyEvent;
31 import org.onosproject.net.topology.TopologyListener; 43 import org.onosproject.net.topology.TopologyListener;
32 import org.onosproject.net.topology.TopologyServiceAdapter; 44 import org.onosproject.net.topology.TopologyServiceAdapter;
33 45
46 +import java.nio.ByteBuffer;
47 +import java.util.ArrayList;
48 +import java.util.Iterator;
34 import java.util.List; 49 import java.util.List;
50 +import java.util.Map;
51 +import java.util.Optional;
35 import java.util.Set; 52 import java.util.Set;
36 53
37 -import static org.junit.Assert.assertFalse; 54 +import static org.junit.Assert.*;
55 +import static org.onosproject.net.device.DeviceEvent.Type.*;
56 +import static org.onosproject.net.edge.EdgePortEvent.Type.EDGE_PORT_ADDED;
57 +import static org.onosproject.net.edge.EdgePortEvent.Type.EDGE_PORT_REMOVED;
58 +import static org.onosproject.net.link.LinkEvent.Type.LINK_ADDED;
59 +import static org.onosproject.net.link.LinkEvent.Type.LINK_REMOVED;
60 +import static org.onosproject.net.topology.TopologyEvent.Type.TOPOLOGY_CHANGED;
38 61
39 /** 62 /**
40 - * Test of the edge port manager. 63 + * Test of the edge port manager. Each device has ports '0' through 'numPorts - 1'
64 + * as specified by the variable 'numPorts'.
41 */ 65 */
42 public class EdgeManagerTest { 66 public class EdgeManagerTest {
43 67
44 private EdgeManager mgr; 68 private EdgeManager mgr;
45 - private final EdgePortListener testListener = new TestListener(); 69 + private int totalPorts = 10;
46 - 70 + private boolean alwaysReturnPorts = false;
71 + private final Set<ConnectPoint> infrastructurePorts = Sets.newConcurrentHashSet();
72 + private List<EdgePortEvent> events = Lists.newArrayList();
73 + private final Map<DeviceId, Device> devices = Maps.newConcurrentMap();
74 + private Set<OutboundPacket> packets = Sets.newConcurrentHashSet();
75 + private final EdgePortListener testListener = new TestListener(events);
76 + private TestTopologyManager testTopologyManager;
47 77
48 @Before 78 @Before
49 public void setUp() { 79 public void setUp() {
50 mgr = new EdgeManager(); 80 mgr = new EdgeManager();
51 mgr.eventDispatcher = new TestEventDispatcher(); 81 mgr.eventDispatcher = new TestEventDispatcher();
52 - mgr.topologyService = new TestTopologyManager(); 82 + testTopologyManager = new TestTopologyManager(infrastructurePorts);
53 - mgr.deviceService = new TestDeviceManager(); 83 + mgr.topologyService = testTopologyManager;
84 + mgr.deviceService = new TestDeviceManager(devices);
54 mgr.packetService = new TestPacketManager(); 85 mgr.packetService = new TestPacketManager();
55 mgr.activate(); 86 mgr.activate();
56 mgr.addListener(testListener); 87 mgr.addListener(testListener);
88 +
57 } 89 }
58 90
91 +
59 @After 92 @After
60 public void tearDown() { 93 public void tearDown() {
61 mgr.removeListener(testListener); 94 mgr.removeListener(testListener);
...@@ -63,14 +96,347 @@ public class EdgeManagerTest { ...@@ -63,14 +96,347 @@ public class EdgeManagerTest {
63 } 96 }
64 97
65 @Test 98 @Test
66 - public void basics() { 99 + public void testBasics() {
100 + //Setup
101 + int numDevices = 20;
102 + int numPorts = 4;
103 + defaultPopulator(numDevices, numPorts);
104 +
105 + assertEquals("Unexpected number of ports", numDevices * numPorts, infrastructurePorts.size());
106 +
67 assertFalse("no ports expected", mgr.getEdgePoints().iterator().hasNext()); 107 assertFalse("no ports expected", mgr.getEdgePoints().iterator().hasNext());
108 +
109 + assertFalse("Expected isEdge to return false",
110 + mgr.isEdgePoint(NetTestTools.connectPoint(Integer.toString(1), 1)));
111 +
112 + removeInfraPort(NetTestTools.connectPoint(Integer.toString(1), 1));
113 + assertTrue("Expected isEdge to return false",
114 + mgr.isEdgePoint(NetTestTools.connectPoint(Integer.toString(1), 1)));
115 + }
116 +
117 + @Test
118 + public void testLinkUpdates() {
119 + //Setup
120 + ConnectPoint testPoint, referencePoint;
121 +
122 + //Testing link removal
123 + List<Event> eventsToAdd = Lists.newArrayList();
124 + eventsToAdd.add(new LinkEvent(LINK_REMOVED, NetTestTools.link("a", 1, "b", 2)));
125 + TopologyEvent event = new TopologyEvent(TOPOLOGY_CHANGED, null, eventsToAdd);
126 + testTopologyManager.listener.event(event);
127 +
128 + assertTrue("The list contained an unexpected number of events", events.size() == 2);
129 + assertTrue("The first element is of the wrong type.",
130 + events.get(0).type() == EDGE_PORT_ADDED);
131 + assertTrue("The second element is of the wrong type.",
132 + events.get(1).type() == EDGE_PORT_ADDED);
133 +
134 + testPoint = events.get(0).subject();
135 + referencePoint = NetTestTools.connectPoint("a", 1);
136 + assertTrue("The port numbers of the first element are incorrect",
137 + testPoint.port().toLong() == referencePoint.port().toLong());
138 + assertTrue("The device id of the first element is incorrect.",
139 + testPoint.deviceId().equals(referencePoint.deviceId()));
140 +
141 + testPoint = events.get(1).subject();
142 + referencePoint = NetTestTools.connectPoint("b", 2);
143 + assertTrue("The port numbers of the second element are incorrect",
144 + testPoint.port().toLong() == referencePoint.port().toLong());
145 + assertTrue("The device id of the second element is incorrect.",
146 + testPoint.deviceId().equals(referencePoint.deviceId()));
147 +
148 + //Rebroadcast event to ensure it results in no additional events
149 + testTopologyManager.listener.event(event);
150 + assertTrue("The list contained an unexpected number of events", events.size() == 2);
151 +
152 + //Testing link adding when links to remove exist
153 + eventsToAdd.clear();
154 + events.clear();
155 + eventsToAdd.add(new LinkEvent(LINK_ADDED, NetTestTools.link("a", 1, "b", 2)));
156 + event = new TopologyEvent(TOPOLOGY_CHANGED, null, eventsToAdd);
157 + testTopologyManager.listener.event(event);
158 +
159 + assertTrue("The list contained an unexpected number of events", events.size() == 2);
160 + assertTrue("The first element is of the wrong type.",
161 + events.get(0).type() == EDGE_PORT_REMOVED);
162 + assertTrue("The second element is of the wrong type.",
163 + events.get(1).type() == EDGE_PORT_REMOVED);
164 +
165 + testPoint = events.get(0).subject();
166 + referencePoint = NetTestTools.connectPoint("a", 1);
167 + assertTrue("The port numbers of the first element are incorrect",
168 + testPoint.port().toLong() == referencePoint.port().toLong());
169 + assertTrue("The device id of the first element is incorrect.",
170 + testPoint.deviceId().equals(referencePoint.deviceId()));
171 +
172 + testPoint = events.get(1).subject();
173 + referencePoint = NetTestTools.connectPoint("b", 2);
174 + assertTrue("The port numbers of the second element are incorrect",
175 + testPoint.port().toLong() == referencePoint.port().toLong());
176 + assertTrue("The device id of the second element is incorrect.",
177 + testPoint.deviceId().equals(referencePoint.deviceId()));
178 +
179 + //Apparent duplicate of previous method tests removal when the elements have already been removed
180 + eventsToAdd.clear();
181 + events.clear();
182 + eventsToAdd.add(new LinkEvent(LINK_ADDED, NetTestTools.link("a", 1, "b", 2)));
183 + event = new TopologyEvent(TOPOLOGY_CHANGED, null, eventsToAdd);
184 + testTopologyManager.listener.event(event);
185 +
186 + assertTrue("The list should contain no events, the removed elements don't exist.", events.size() == 0);
187 + }
188 +
189 + @Test
190 + public void testDeviceUpdates() {
191 + //Setup
192 +
193 + Device referenceDevice;
194 + TopologyEvent event;
195 + List<Event> eventsToAdd = Lists.newArrayList();
196 + int numDevices = 10;
197 + int numInfraPorts = 5;
198 + totalPorts = 10;
199 + defaultPopulator(numDevices, numInfraPorts);
200 +
201 + //Test response to device added events
202 + referenceDevice = NetTestTools.device("1");
203 + eventsToAdd.add(new DeviceEvent(DEVICE_ADDED, referenceDevice,
204 + new DefaultPort(referenceDevice, PortNumber.portNumber(1), true)));
205 + event = new TopologyEvent(TOPOLOGY_CHANGED, null, eventsToAdd);
206 + testTopologyManager.listener.event(event);
207 +
208 + //Check that ports were populated correctly
209 + assertTrue("Unexpected number of new ports added",
210 + mgr.deviceService.getPorts(NetTestTools.did("1")).size() == 10);
211 +
212 + //Check that of the ten ports the half that are infrastructure ports aren't added
213 + assertEquals("Unexpected number of new edge ports added", (totalPorts - numInfraPorts), events.size());
214 +
215 + for (int index = 0; index < numInfraPorts; index++) {
216 + assertTrue("Unexpected type of event", events.get(index).type() == EDGE_PORT_ADDED);
217 + }
218 + //Names here are irrelevant, the first 5 ports are populated as infrastructure, 6-10 are edge
219 + for (int index = 0; index < events.size(); index++) {
220 + assertEquals("Port added had unexpected port number.",
221 + events.get(index).subject().port(),
222 + NetTestTools.connectPoint("a", index + numInfraPorts + 1).port());
223 + }
224 + events.clear();
225 +
226 + //Repost the event to test repeated posts
227 + testTopologyManager.listener.event(event);
228 + assertEquals("The redundant notification should not have created additional notifications.",
229 + 0, events.size());
230 + //Calculate the size of the returned iterable of edge points.
231 + Iterable<ConnectPoint> pts = mgr.getEdgePoints();
232 + Iterator pointIterator = pts.iterator();
233 + int count = 0;
234 + for (; pointIterator.hasNext(); count++) {
235 + pointIterator.next();
236 + }
237 + assertEquals("Unexpected number of edge points", totalPorts - numInfraPorts, count);
238 + //Testing device removal
239 + events.clear();
240 + eventsToAdd.clear();
241 + eventsToAdd.add(new DeviceEvent(DEVICE_REMOVED, referenceDevice,
242 + new DefaultPort(referenceDevice, PortNumber.portNumber(1), true)));
243 + event = new TopologyEvent(TOPOLOGY_CHANGED, null, eventsToAdd);
244 + testTopologyManager.listener.event(event);
245 +
246 + assertEquals("There should be five new events from removal of edge points",
247 + totalPorts - numInfraPorts, events.size());
248 + for (int index = 0; index < events.size(); index++) {
249 + //Assert that the correct port numbers were removed in the correct order
250 + assertEquals("Port removed had unexpected port number.",
251 + events.get(index).subject().port(),
252 + (NetTestTools.connectPoint("a", index + numInfraPorts + 1).port()));
253 + //Assert that the events are of the correct type
254 + assertEquals("Unexpected type of event", events.get(index).type(), EDGE_PORT_REMOVED);
255 + }
256 + events.clear();
257 + //Rebroadcast event to check that it triggers no new behavior
258 + testTopologyManager.listener.event(event);
259 + assertEquals("Rebroadcast of removal event should not produce additional events",
260 + 0, events.size());
261 +
262 + //Testing device status change, changed from unavailable to available
263 + events.clear();
264 + eventsToAdd.clear();
265 + //Make sure that the devicemanager shows the device as available.
266 + addDevice(referenceDevice, "1", 5);
267 + devices.put(referenceDevice.id(), referenceDevice);
268 +
269 + eventsToAdd.add(new DeviceEvent(DEVICE_AVAILABILITY_CHANGED, referenceDevice));
270 + event = new TopologyEvent(TOPOLOGY_CHANGED, null, eventsToAdd);
271 + testTopologyManager.listener.event(event);
272 + //An earlier setup set half of the reference device ports to infrastructure
273 + assertEquals("An unexpected number of events were generated.", totalPorts - numInfraPorts, events.size());
274 + for (int i = 0; i < 5; i++) {
275 + assertEquals("The event was not of the right type", events.get(i).type(), EDGE_PORT_ADDED);
276 + }
277 + events.clear();
278 + testTopologyManager.listener.event(event);
279 + assertEquals("No events should have been generated for a set of existing ports.", 0, events.size());
280 +
281 + //Test removal when state changes when the device becomes unavailable
282 +
283 + //Ensure that the deviceManager shows the device as unavailable
284 + removeDevice(referenceDevice);
285 + /*This variable copies the behavior of the topology by returning ports attached to an unavailable device
286 + //this behavior is necessary for the following event to execute properly, if these statements are removed
287 + no events will be generated since no ports will be provided in getPorts() to EdgeManager.
288 + */
289 + alwaysReturnPorts = true;
290 + testTopologyManager.listener.event(event);
291 + alwaysReturnPorts = false;
292 + assertEquals("An unexpected number of events were created.", totalPorts - numInfraPorts, events.size());
293 + for (int i = 0; i < 5; i++) {
294 + EdgePortEvent edgeEvent = events.get(i);
295 + assertEquals("The event is of an unexpected type.",
296 + EdgePortEvent.Type.EDGE_PORT_REMOVED, edgeEvent.type());
297 + assertEquals("The event pertains to an unexpected port", PortNumber.portNumber(i + numInfraPorts + 1),
298 + edgeEvent.subject().port());
299 + }
300 + }
301 +
302 + @Test
303 + public void testInternalCache() {
304 + List<Event> eventsToAdd = Lists.newArrayList();
305 + int numDevices = 10;
306 + //Number of infrastructure ports per device
307 + int numPorts = 5;
308 + //Total ports per device when requesting all devices
309 + totalPorts = 10;
310 + defaultPopulator(numDevices, numPorts);
311 + for (int i = 0; i < numDevices; i++) {
312 + Device newDevice = NetTestTools.device(Integer.toString(i));
313 + devices.put(newDevice.id(), newDevice);
314 + eventsToAdd.add(new DeviceEvent(DEVICE_ADDED, newDevice));
315 + }
316 + TopologyEvent event = new TopologyEvent(TOPOLOGY_CHANGED, null, eventsToAdd);
317 + testTopologyManager.listener.event(event);
318 +
319 + //Check all ports have correct designations
320 + ConnectPoint testPoint;
321 + for (int deviceNum = 0; deviceNum < numDevices; deviceNum++) {
322 + for (int portNum = 1; portNum <= totalPorts; portNum++) {
323 + testPoint = NetTestTools.connectPoint(Integer.toString(deviceNum), portNum);
324 + if (portNum <= numPorts) {
325 + assertFalse("This should not be an edge point", mgr.isEdgePoint(testPoint));
326 + } else {
327 + assertTrue("This should be an edge point", mgr.isEdgePoint(testPoint));
328 + }
329 + }
330 + }
331 + int count = 0;
332 + for (ConnectPoint ignored : mgr.getEdgePoints()) {
333 + count++;
334 + }
335 + assertEquals("There are an unexpeceted number of edge points returned.",
336 + (totalPorts - numPorts) * numDevices, count);
337 + for (int deviceNumber = 0; deviceNumber < numDevices; deviceNumber++) {
338 + count = 0;
339 + for (ConnectPoint ignored : mgr.getEdgePoints(NetTestTools.did("1"))) {
340 + count++;
341 + }
342 + assertEquals("This element has an unexpected number of edge points.", (totalPorts - numPorts), count);
343 + }
344 + }
345 +
346 +
347 + @Test
348 + public void testEmit() {
349 + byte[] arr = new byte[10];
350 + Device referenceDevice;
351 + TopologyEvent event;
352 + List<Event> eventsToAdd = Lists.newArrayList();
353 + int numDevices = 10;
354 + int numInfraPorts = 5;
355 + totalPorts = 10;
356 + defaultPopulator(numDevices, numInfraPorts);
357 + for (byte byteIndex = 0; byteIndex < arr.length; byteIndex++) {
358 + arr[byteIndex] = byteIndex;
359 + }
360 + for (int i = 0; i < numDevices; i++) {
361 + referenceDevice = NetTestTools.device(Integer.toString(i));
362 + eventsToAdd.add(new DeviceEvent(DEVICE_ADDED, referenceDevice,
363 + new DefaultPort(referenceDevice, PortNumber.portNumber(1), true)));
364 + }
365 + event = new TopologyEvent(TOPOLOGY_CHANGED, null, eventsToAdd);
366 + testTopologyManager.listener.event(event);
367 +
368 + mgr.emitPacket(ByteBuffer.wrap(arr), Optional.<TrafficTreatment>empty());
369 +
370 + assertEquals("There were an unexpected number of emitted packets",
371 + (totalPorts - numInfraPorts) * numDevices, packets.size());
372 + Iterator<OutboundPacket> packetIter = packets.iterator();
373 + OutboundPacket packet;
374 + while (packetIter.hasNext()) {
375 + packet = packetIter.next();
376 + assertEquals("The packet had an incorrect payload.", arr, packet.data().array());
377 + }
378 + //Start testing emission to a specific device
379 + packets.clear();
380 + mgr.emitPacket(NetTestTools.did(Integer.toString(1)), ByteBuffer.wrap(arr), Optional.<TrafficTreatment>empty());
381 +
382 + assertEquals("Unexpected number of outbound packets were emitted.",
383 + totalPorts - numInfraPorts, packets.size());
384 + packetIter = packets.iterator();
385 + while (packetIter.hasNext()) {
386 + packet = packetIter.next();
387 + assertEquals("The packet had an incorrect payload", arr, packet.data().array());
388 + }
389 + }
390 +
391 +
392 + /**
393 + * @param numDevices the number of devices to populate.
394 + * @param numInfraPorts the number of ports to be set as infrastructure on each device, numbered base 0, ports 0
395 + * through numInfraPorts - 1
396 + */
397 + private void defaultPopulator(int numDevices, int numInfraPorts) {
398 + for (int device = 0; device < numDevices; device++) {
399 + String str = Integer.toString(device);
400 + Device deviceToAdd = NetTestTools.device(str);
401 + devices.put(deviceToAdd.id(), deviceToAdd);
402 + for (int port = 1; port <= numInfraPorts; port++) {
403 + infrastructurePorts.add(NetTestTools.connectPoint(str, port));
404 + }
405 + }
406 + }
407 +
408 + /**
409 + * Adds the specified device with the specified number of edge ports so long as it is less than the total ports.
410 + *
411 + * @param device The device to be added
412 + * @param deviceName The name given to generate the devices DID
413 + * @param numInfraPorts The number of ports to be added numbered 1 ... numInfraPorts
414 + */
415 + private void addDevice(Device device, String deviceName, int numInfraPorts) {
416 + if (!devices.keySet().contains(device.id())) {
417 + devices.put(device.id(), device);
418 + for (int i = 1; i <= numInfraPorts && i <= totalPorts; i++) {
419 + infrastructurePorts.add(NetTestTools.connectPoint(deviceName, i));
420 + }
421 + }
422 + }
423 +
424 + private void removeDevice(Device device) {
425 + devices.remove(device.id());
426 + }
427 +
428 + private void removeInfraPort(ConnectPoint port) {
429 + infrastructurePorts.remove(port);
68 } 430 }
69 431
70 private class TestTopologyManager extends TopologyServiceAdapter { 432 private class TestTopologyManager extends TopologyServiceAdapter {
71 private TopologyListener listener; 433 private TopologyListener listener;
72 private Set<ConnectPoint> infrastructurePorts; 434 private Set<ConnectPoint> infrastructurePorts;
73 435
436 + public TestTopologyManager(Set<ConnectPoint> infrastructurePorts) {
437 + this.infrastructurePorts = infrastructurePorts;
438 + }
439 +
74 @Override 440 @Override
75 public boolean isInfrastructure(Topology topology, ConnectPoint connectPoint) { 441 public boolean isInfrastructure(Topology topology, ConnectPoint connectPoint) {
76 return infrastructurePorts.contains(connectPoint); 442 return infrastructurePorts.contains(connectPoint);
...@@ -89,12 +455,16 @@ public class EdgeManagerTest { ...@@ -89,12 +455,16 @@ public class EdgeManagerTest {
89 455
90 private class TestDeviceManager extends DeviceServiceAdapter { 456 private class TestDeviceManager extends DeviceServiceAdapter {
91 457
92 - private Set<Device> devices; 458 + private Map<DeviceId, Device> devices;
459 +
460 + public TestDeviceManager(Map<DeviceId, Device> devices) {
461 + this.devices = devices;
462 + }
93 463
94 @Override 464 @Override
95 public boolean isAvailable(DeviceId deviceId) { 465 public boolean isAvailable(DeviceId deviceId) {
96 - for (Device device : devices) { 466 + for (DeviceId id : devices.keySet()) {
97 - if (device.id().equals(deviceId)) { 467 + if (id.equals(deviceId)) {
98 return true; 468 return true;
99 } 469 }
100 } 470 }
...@@ -103,22 +473,38 @@ public class EdgeManagerTest { ...@@ -103,22 +473,38 @@ public class EdgeManagerTest {
103 473
104 @Override 474 @Override
105 public List<Port> getPorts(DeviceId deviceId) { 475 public List<Port> getPorts(DeviceId deviceId) {
106 - return super.getPorts(deviceId); 476 + List<Port> ports = new ArrayList<>();
477 + Device device = devices.get(deviceId);
478 + if (device == null && !alwaysReturnPorts) {
479 + return ports;
480 + }
481 + for (int portNum = 1; portNum <= totalPorts; portNum++) {
482 + //String is generated using 'of:' + the passed name, this creates a
483 + ports.add(new DefaultPort(device, PortNumber.portNumber(portNum), true));
484 + }
485 + return ports;
107 } 486 }
108 487
109 @Override 488 @Override
110 public Iterable<Device> getAvailableDevices() { 489 public Iterable<Device> getAvailableDevices() {
111 - return devices; 490 + return devices.values();
112 } 491 }
113 } 492 }
114 493
115 private class TestPacketManager extends PacketServiceAdapter { 494 private class TestPacketManager extends PacketServiceAdapter {
495 + @Override
496 + public void emit(OutboundPacket packet) {
497 + packets.add(packet);
498 + }
116 } 499 }
117 -
118 500
119 private class TestListener implements EdgePortListener { 501 private class TestListener implements EdgePortListener {
120 private List<EdgePortEvent> events; 502 private List<EdgePortEvent> events;
121 503
504 + public TestListener(List<EdgePortEvent> events) {
505 + this.events = events;
506 + }
507 +
122 @Override 508 @Override
123 public void event(EdgePortEvent event) { 509 public void event(EdgePortEvent event) {
124 events.add(event); 510 events.add(event);
......