blob: e50f825db499926a4458aee0ef1d5fa73e15dca2 [file] [log] [blame]
ADARA Networks1fb1eb12016-09-01 12:04:07 -07001package org.onosproject.rabbitmq.listener;
2
3import static com.google.common.collect.ImmutableSet.of;
4import static org.easymock.EasyMock.createMock;
5import static org.easymock.EasyMock.expect;
6import static org.easymock.EasyMock.replay;
7import static org.junit.Assert.assertEquals;
8import static org.junit.Assert.assertFalse;
9import static org.onosproject.net.DeviceId.deviceId;
10import static org.onosproject.net.NetTestTools.device;
11import static org.onosproject.net.NetTestTools.link;
12import static org.onosproject.net.PortNumber.portNumber;
13import static org.onosproject.net.topology.TopologyEvent.Type.TOPOLOGY_CHANGED;
14import static org.onosproject.net.device.DeviceEvent.Type.*;
15import static org.onosproject.net.link.LinkEvent.Type.*;
16import static org.onosproject.net.Device.Type.*;
17
18import java.nio.ByteBuffer;
19import java.util.ArrayList;
20import java.util.HashMap;
21import java.util.List;
22import java.util.Map;
23import java.util.Set;
24
25import org.easymock.EasyMockRunner;
26import org.easymock.Mock;
27import org.junit.After;
28import org.junit.Before;
29import org.junit.Test;
30import org.junit.runner.RunWith;
31import org.onlab.packet.ChassisId;
32import org.onlab.packet.Ethernet;
33import org.onlab.packet.ONOSLLDP;
34import org.onosproject.core.ApplicationId;
35import org.onosproject.core.CoreService;
36import org.onosproject.core.DefaultApplicationId;
37import org.onosproject.event.AbstractEventTest;
38import org.onosproject.event.Event;
39import org.onosproject.net.ConnectPoint;
40import org.onosproject.net.DefaultDevice;
41import org.onosproject.net.DefaultLink;
42import org.onosproject.net.DefaultPort;
43import org.onosproject.net.Device;
44import org.onosproject.net.DeviceId;
45import org.onosproject.net.Link;
46import org.onosproject.net.link.LinkEvent;
47import org.onosproject.net.MastershipRole;
48import org.onosproject.net.Port;
49import org.onosproject.net.device.DeviceEvent;
50import org.onosproject.net.device.DeviceListener;
51import org.onosproject.net.device.DeviceServiceAdapter;
52import org.onosproject.net.flow.TrafficTreatment;
53import org.onosproject.net.link.LinkListener;
54import org.onosproject.net.link.LinkService;
55import org.onosproject.net.packet.DefaultInboundPacket;
56import org.onosproject.net.packet.InboundPacket;
57import org.onosproject.net.packet.OutboundPacket;
58import org.onosproject.net.packet.PacketContext;
59import org.onosproject.net.packet.PacketProcessor;
60import org.onosproject.net.packet.PacketServiceAdapter;
61import org.onosproject.net.provider.AbstractProvider;
62import org.onosproject.net.provider.ProviderId;
63import org.onosproject.net.topology.DefaultGraphDescription;
64import org.onosproject.net.topology.GraphDescription;
65import org.onosproject.net.topology.Topology;
66import org.onosproject.net.topology.TopologyEvent;
67import org.onosproject.net.topology.TopologyListener;
68import org.onosproject.net.topology.TopologyProvider;
69import org.onosproject.net.topology.TopologyProviderRegistry;
70import org.onosproject.net.topology.TopologyProviderService;
71import org.onosproject.net.topology.TopologyService;
72import org.onosproject.rabbitmq.api.MQService;
73import org.onosproject.rabbitmq.api.Manageable;
74import org.osgi.service.component.ComponentContext;
75
76import com.google.common.collect.ArrayListMultimap;
77import com.google.common.collect.ImmutableList;
78import com.google.common.collect.Lists;
79import com.google.common.util.concurrent.MoreExecutors;
80/**
81 * Junit tests for packet in, device, topology and link events.
82 */
83@RunWith(EasyMockRunner.class)
84public class MQEventHandlerTest extends AbstractEventTest {
85
86 private final MQEventHandler mqEventHandler = new MQEventHandler();
87 private static final DeviceId DID1 = deviceId("of:0000000000000001");
88 private static final DeviceId DID2 = deviceId("of:0000000000000002");
89 private static final DeviceId DID3 = deviceId("of:0000000000000003");
90
91 private ApplicationId appId = new DefaultApplicationId(100,
92 "org.onosproject.rabbitmq");
93 private final TestPacketService packetService = new TestPacketService();
94 private final TestDeviceService deviceService = new TestDeviceService();
95 private PacketProcessor testProcessor;
96 private DeviceListener deviceListener;
97 private static Port pd1;
98 private static Port pd2;
99 private static Port pd3;
100 private static Port pd4;
101 private CoreService coreService;
102 @Mock
103 ComponentContext context;
104 @Mock
105 private Manageable manageSender;
106
107 private static final ProviderId PID = new ProviderId("of", "foo");
108 private TestLinkListener testLinkListener = new TestLinkListener();
109 @Mock
110 private LinkService linkService;
111 @Mock
112 Topology topology;
113 @Mock
114 protected TopologyService service;
115 protected TopologyProviderRegistry registry;
116 @Mock
117 protected TopologyProviderService providerService;
118 protected TestProvider provider;
119 protected TestTopologyListener listener = new TestTopologyListener();
120 @Mock
121 MQService mqService;
122
123 @Before
124 public void setUp() {
125 coreService = createMock(CoreService.class);
126 expect(coreService.registerApplication(appId.name()))
127 .andReturn(appId).anyTimes();
128 replay(coreService);
129 mqEventHandler.deviceService = deviceService;
130 mqEventHandler.packetService = packetService;
131 mqEventHandler.eventExecutor = MoreExecutors.newDirectExecutorService();
132 linkService.addListener(testLinkListener);
133 mqEventHandler.linkService = linkService;
134 mqEventHandler.topologyService = service;
135 mqEventHandler.activate(context);
136 }
137
138 @After
139 public void tearDown() {
140 mqEventHandler.deactivate();
141 mqEventHandler.deviceService = null;
142 mqEventHandler.packetService = null;
143 }
144
145 private DeviceEvent deviceEvent(DeviceEvent.Type type, DeviceId did) {
146 return new DeviceEvent(type, deviceService.getDevice(did));
147
148 }
149
150 private Port port(DeviceId did, long port, boolean enabled) {
151 return new DefaultPort(deviceService.getDevice(did),
152 portNumber(port), enabled);
153 }
154
155 private DeviceEvent portEvent(DeviceEvent.Type type, DeviceId did,
156 Port port) {
157 return new DeviceEvent(type, deviceService.getDevice(did), port);
158 }
159
160 @Test
161 public void switchAdd() {
162 DeviceEvent de = deviceEvent(DEVICE_ADDED, DID1);
163 deviceListener.event(de);
164
165 }
166
167 @Test
168 public void switchRemove() {
169 deviceListener.event(deviceEvent(DEVICE_ADDED, DID1));
170 deviceListener.event(deviceEvent(DEVICE_REMOVED, DID1));
171 }
172
173 @Test
174 public void switchUpdate() {
175 deviceListener.event(deviceEvent(DEVICE_UPDATED, DID1));
176 deviceListener.event(deviceEvent(DEVICE_REMOVED, DID1));
177 }
178
179 @Test
180 public void switchSuspend() {
181 deviceListener.event(deviceEvent(DEVICE_SUSPENDED, DID1));
182 deviceListener.event(deviceEvent(DEVICE_REMOVED, DID1));
183 }
184
185 @Test
186 public void portUp() {
187 deviceListener.event(deviceEvent(DEVICE_ADDED, DID1));
188 deviceListener.event(portEvent(PORT_ADDED, DID1, port(DID1, 3, true)));
189 }
190
191 @Test
192 public void portDown() {
193 deviceListener.event(deviceEvent(DEVICE_ADDED, DID1));
194 deviceListener.event(portEvent(PORT_ADDED, DID1, port(DID1, 1, false)));
195 }
196
197 @Test
198 public void portRemoved() {
199 deviceListener.event(deviceEvent(DEVICE_ADDED, DID1));
200 deviceListener.event(portEvent(PORT_ADDED, DID1, port(DID1, 3, true)));
201 deviceListener.event(portEvent(PORT_REMOVED, DID1,
202 port(DID1, 3, true)));
203 }
204
205 @Test
206 public void unknownPktCtx() {
207 // Note: DID3 hasn't been added to TestDeviceService
208 PacketContext pktCtx = new TestPacketContext(device1(DID3));
209 testProcessor.process(pktCtx);
210 assertFalse("Context should still be free", pktCtx.isHandled());
211 }
212
213 private DefaultDevice device1(DeviceId did) {
214 return new DefaultDevice(ProviderId.NONE, did, SWITCH,
215 "TESTMF", "TESTHW", "TESTSW", "TESTSN",
216 new ChassisId());
217 }
218
219 @Test
220 public void knownPktCtx() {
221 deviceListener.event(deviceEvent(DEVICE_ADDED, DID1));
222 deviceListener.event(deviceEvent(DEVICE_ADDED, DID2));
223 PacketContext pktCtx = new TestPacketContext(
224 deviceService.getDevice(DID2));
225 /*
226 * EasyMock.expectLastCall(); EasyMock.replay(manageSender);
227 */
228 testProcessor.process(pktCtx);
229 }
230
231 private class TestDeviceService extends DeviceServiceAdapter {
232
233 private final Map<DeviceId, Device> devices = new HashMap<>();
234 private final ArrayListMultimap<DeviceId, Port> ports =
235 ArrayListMultimap.create();
236
237 public TestDeviceService() {
238 Device d1 = new DefaultDevice(ProviderId.NONE, DID1,
239 SWITCH, "TESTMF", "TESTHW",
240 "TESTSW", "TESTSN", new ChassisId());
241 Device d2 = new DefaultDevice(ProviderId.NONE, DID2, SWITCH,
242 "TESTMF", "TESTHW", "TESTSW",
243 "TESTSN", new ChassisId());
244 devices.put(DID1, d1);
245 devices.put(DID2, d2);
246 pd1 = new DefaultPort(d1, portNumber(1), true);
247 pd2 = new DefaultPort(d1, portNumber(2), true);
248 pd3 = new DefaultPort(d2, portNumber(1), true);
249 pd4 = new DefaultPort(d2, portNumber(2), true);
250 ports.putAll(DID1, Lists.newArrayList(pd1, pd2));
251 ports.putAll(DID2, Lists.newArrayList(pd3, pd4));
252 }
253
254 @Override
255 public int getDeviceCount() {
256 return devices.values().size();
257 }
258
259 @Override
260 public Iterable<Device> getDevices() {
261 return ImmutableList.copyOf(devices.values());
262 }
263
264 @Override
265 public Device getDevice(DeviceId deviceId) {
266 return devices.get(deviceId);
267 }
268
269 @Override
270 public MastershipRole getRole(DeviceId deviceId) {
271 return MastershipRole.MASTER;
272 }
273
274 @Override
275 public boolean isAvailable(DeviceId deviceId) {
276 return true;
277 }
278
279 @Override
280 public void addListener(DeviceListener listener) {
281 deviceListener = listener;
282
283 }
284
285 @Override
286 public void removeListener(DeviceListener listener) {
287
288 }
289 }
290
291 private class TestPacketService extends PacketServiceAdapter {
292 @Override
293 public void addProcessor(PacketProcessor processor, int priority) {
294 testProcessor = processor;
295 }
296 }
297
298 private class TestPacketContext implements PacketContext {
299
300 protected Device device;
301 protected boolean blocked = false;
302
303 public TestPacketContext(Device dev) {
304 device = dev;
305 }
306
307 @Override
308 public long time() {
309 return 0;
310 }
311
312 @Override
313 public InboundPacket inPacket() {
314 ONOSLLDP lldp = ONOSLLDP.onosLLDP(deviceService.getDevice(DID1)
315 .id().toString(),
316 device.chassisId(),
317 (int) pd1.number().toLong());
318
319 Ethernet ethPacket = new Ethernet();
320 ethPacket.setEtherType(Ethernet.TYPE_LLDP);
321 ethPacket.setDestinationMACAddress(ONOSLLDP.LLDP_ONLAB);
322 ethPacket.setPayload(lldp);
323 ethPacket.setPad(true);
324
325 ethPacket.setSourceMACAddress("DE:AD:BE:EF:BA:11");
326
327 ConnectPoint cp = new ConnectPoint(device.id(), pd3.number());
328
329 return new DefaultInboundPacket(cp, ethPacket,
330 ByteBuffer.wrap(ethPacket
331 .serialize()));
332
333 }
334
335 @Override
336 public OutboundPacket outPacket() {
337 return null;
338 }
339
340 @Override
341 public TrafficTreatment.Builder treatmentBuilder() {
342 return null;
343 }
344
345 @Override
346 public void send() {
347
348 }
349
350 @Override
351 public boolean block() {
352 blocked = true;
353 return blocked;
354 }
355
356 @Override
357 public boolean isHandled() {
358 return blocked;
359 }
360 }
361
362 private void submitTopologyGraph() {
363 Set<Device> devices = of(device("a"), device("b"), device("c"),
364 device("d"), device("e"), device("f"));
365 Set<Link> links = of(link("a", 1, "b", 1), link("b", 1, "a", 1),
366 link("b", 2, "c", 1), link("c", 1, "b", 2),
367 link("c", 2, "d", 1), link("d", 1, "c", 2),
368 link("d", 2, "a", 2), link("a", 2, "d", 2),
369 link("e", 1, "f", 1), link("f", 1, "e", 1));
370 GraphDescription data = new DefaultGraphDescription(4321L,
371 System.currentTimeMillis(),
372 devices, links);
373 providerService.topologyChanged(data, null);
374 }
375
376 protected void validateEvents(Enum... types) {
377 int i = 0;
378 for (Event event : listener.events) {
379 assertEquals("incorrect event type", types[i], event.type());
380 i++;
381 }
382 listener.events.clear();
383 }
384
385 @Test
386 public void testCreateTopology() {
387 submitTopologyGraph();
388 validateEvents(TOPOLOGY_CHANGED);
389 }
390
391 private class TestProvider extends AbstractProvider
392 implements TopologyProvider {
393 public TestProvider() {
394 super(PID);
395 }
396
397 @Override
398 public void triggerRecompute() {
399 }
400 }
401
402 private class TestTopologyListener implements TopologyListener {
403 final List<TopologyEvent> events = new ArrayList<>();
404
405 @Override
406 public void event(TopologyEvent event) {
407 mqService.publish(event);
408 }
409 }
410
411 private Link createLink() {
412 return DefaultLink.builder().providerId(new ProviderId("of", "foo"))
413 .src(new ConnectPoint(deviceId("of:foo"), portNumber(1)))
414 .dst(new ConnectPoint(deviceId("of:bar"), portNumber(2)))
415 .type(Link.Type.INDIRECT).build();
416 }
417
418 @Test
419 public void testAddLink() throws Exception {
420 Link link = createLink();
421 LinkEvent event = new LinkEvent(LINK_ADDED, link, 123L);
422 validateEvent(event, LINK_ADDED, link, 123L);
423 }
424
425 @Test
426 public void testUpdateLink() throws Exception {
427 Link link = createLink();
428 LinkEvent event = new LinkEvent(LINK_UPDATED, link, 123L);
429 validateEvent(event, LINK_UPDATED, link, 123L);
430 }
431
432 @Test
433 public void testRemoveLink() throws Exception {
434 Link link = createLink();
435 LinkEvent event = new LinkEvent(LINK_ADDED, link, 123L);
436 validateEvent(event, LINK_ADDED, link, 123L);
437 LinkEvent event1 = new LinkEvent(LINK_REMOVED, link, 123L);
438 validateEvent(event1, LINK_REMOVED, link, 123L);
439 }
440
441 private class TestLinkListener implements LinkListener {
442
443 @Override
444 public void event(LinkEvent event) {
445 mqService.publish(event);
446 }
447
448 }
449
450}