blob: bbf2de257f39383ae52cf49b02e82f393aba7358 [file] [log] [blame]
alshabib0ed6a202014-10-19 12:42:57 -07001package org.onlab.onos.provider.lldp.impl;
2
3
4import com.google.common.collect.ArrayListMultimap;
5import com.google.common.collect.Lists;
6import com.google.common.collect.Maps;
Yuta HIGUCHI376d7502014-10-19 15:57:52 -07007
alshabib0ed6a202014-10-19 12:42:57 -07008import org.junit.After;
9import org.junit.Before;
10import org.junit.Test;
11import org.onlab.onos.cluster.NodeId;
12import org.onlab.onos.mastership.MastershipListener;
13import org.onlab.onos.mastership.MastershipService;
14import org.onlab.onos.mastership.MastershipTermService;
15import org.onlab.onos.net.ConnectPoint;
16import org.onlab.onos.net.DefaultDevice;
17import org.onlab.onos.net.DefaultPort;
18import org.onlab.onos.net.Device;
19import org.onlab.onos.net.DeviceId;
20import org.onlab.onos.net.MastershipRole;
21import org.onlab.onos.net.Port;
22import org.onlab.onos.net.PortNumber;
23import org.onlab.onos.net.device.DeviceEvent;
24import org.onlab.onos.net.device.DeviceListener;
25import org.onlab.onos.net.device.DeviceService;
26import org.onlab.onos.net.flow.TrafficTreatment;
27import org.onlab.onos.net.link.LinkDescription;
28import org.onlab.onos.net.link.LinkProvider;
29import org.onlab.onos.net.link.LinkProviderRegistry;
30import org.onlab.onos.net.link.LinkProviderService;
31import org.onlab.onos.net.packet.DefaultInboundPacket;
32import org.onlab.onos.net.packet.InboundPacket;
33import org.onlab.onos.net.packet.OutboundPacket;
34import org.onlab.onos.net.packet.PacketContext;
35import org.onlab.onos.net.packet.PacketProcessor;
36import org.onlab.onos.net.packet.PacketService;
37import org.onlab.onos.net.provider.AbstractProviderService;
38import org.onlab.onos.net.provider.ProviderId;
alshabib0ed6a202014-10-19 12:42:57 -070039import org.onlab.packet.ChassisId;
40import org.onlab.packet.Ethernet;
alshabib0ed6a202014-10-19 12:42:57 -070041import org.onlab.packet.ONOSLLDP;
42
43import java.nio.ByteBuffer;
Yuta HIGUCHI376d7502014-10-19 15:57:52 -070044import java.util.Collections;
alshabib0ed6a202014-10-19 12:42:57 -070045import java.util.HashMap;
alshabib0ed6a202014-10-19 12:42:57 -070046import java.util.List;
47import java.util.Map;
48import java.util.Set;
49
50import static org.junit.Assert.*;
alshabib0ed6a202014-10-19 12:42:57 -070051
52public class LLDPLinkProviderTest {
53
54 private static final DeviceId DID1 = DeviceId.deviceId("of:0000000000000001");
55 private static final DeviceId DID2 = DeviceId.deviceId("of:0000000000000002");
56
57 private static Port pd1;
58 private static Port pd2;
59 private static Port pd3;
60 private static Port pd4;
61
62 private final LLDPLinkProvider provider = new LLDPLinkProvider();
63 private final TestLinkRegistry linkService = new TestLinkRegistry();
64 private final TestPacketService packetService = new TestPacketService();
65 private final TestDeviceService deviceService = new TestDeviceService();
66 private final TestMasterShipService masterService = new TestMasterShipService();
67
68 private TestLinkProviderService providerService;
69
70 private PacketProcessor testProcessor;
71 private DeviceListener deviceListener;
72
73 @Before
74 public void setUp() {
75
76 provider.deviceService = deviceService;
77 provider.packetSevice = packetService;
78 provider.providerRegistry = linkService;
79 provider.masterService = masterService;
80
81
82 provider.activate();
83 }
84
85 @Test
86 public void basics() {
87 assertNotNull("registration expected", providerService);
88 assertEquals("incorrect provider", provider, providerService.provider());
89 }
90
91 @Test
92 public void switchAdd() {
93 DeviceEvent de = deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID1);
94 deviceListener.event(de);
95
96 assertFalse("Device not added", provider.discoverers.isEmpty());
97 }
98
99 @Test
100 public void switchRemove() {
101 deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID1));
102 deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_REMOVED, DID1));
103
104 assertTrue("Discoverer is not gone", provider.discoverers.get(DID1).isStopped());
105 assertTrue("Device is not gone.", vanishedDpid(DID1));
106 }
107
108 @Test
109 public void portUp() {
110 deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID1));
111 deviceListener.event(portEvent(DeviceEvent.Type.PORT_ADDED, DID1, port(DID1, 3, true)));
112
113 assertTrue("Port not added to discoverer",
114 provider.discoverers.get(DID1).containsPort((long) 3));
115 }
116
117 @Test
118 public void portDown() {
119
120 deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID1));
121 deviceListener.event(portEvent(DeviceEvent.Type.PORT_ADDED, DID1, port(DID1, 1, false)));
122
123
124
125 assertFalse("Port added to discoverer",
126 provider.discoverers.get(DID1).containsPort((long) 1));
127 assertTrue("Port is not gone.", vanishedPort((long) 1));
128 }
129
130 @Test
131 public void portUnknown() {
132 deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID1));
133 deviceListener.event(portEvent(DeviceEvent.Type.PORT_ADDED, DID2, port(DID2, 1, false)));
134
135
136 assertNull("DPID exists",
137 provider.discoverers.get(DID2));
138 }
139
140 @Test
141 public void unknownPktCtx() {
142
143 PacketContext pktCtx = new TestPacketContext(deviceService.getDevice(DID2));
144
145 testProcessor.process(pktCtx);
146 assertFalse("Context should still be free", pktCtx.isHandled());
147 }
148
149 @Test
150 public void knownPktCtx() {
151 deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID1));
152 deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID2));
153 PacketContext pktCtx = new TestPacketContext(deviceService.getDevice(DID2));
154
155
156 testProcessor.process(pktCtx);
157
158 assertTrue("Link not detected", detectedLink(DID1, DID2));
159
160 }
161
162
163 @After
164 public void tearDown() {
165 provider.deactivate();
166 provider.providerRegistry = null;
167 provider.deviceService = null;
168 provider.packetSevice = null;
169 }
170
171 private DeviceEvent deviceEvent(DeviceEvent.Type type, DeviceId did) {
172 return new DeviceEvent(type, deviceService.getDevice(did));
173
174 }
175
176 private DeviceEvent portEvent(DeviceEvent.Type type, DeviceId did, PortNumber port) {
177 return new DeviceEvent(type, deviceService.getDevice(did),
178 deviceService.getPort(did, port));
179 }
180
181 private DeviceEvent portEvent(DeviceEvent.Type type, DeviceId did, Port port) {
182 return new DeviceEvent(type, deviceService.getDevice(did), port);
183 }
184
185 private Port port(DeviceId did, long port, boolean enabled) {
186 return new DefaultPort(deviceService.getDevice(did),
187 PortNumber.portNumber(port), enabled);
188 }
189
190
191 private boolean vanishedDpid(DeviceId... dids) {
192 for (int i = 0; i < dids.length; i++) {
193 if (!providerService.vanishedDpid.contains(dids[i])) {
194 return false;
195 }
196 }
197 return true;
198 }
199
200 private boolean vanishedPort(Long... ports) {
201 for (int i = 0; i < ports.length; i++) {
202 if (!providerService.vanishedPort.contains(ports[i])) {
203 return false;
204 }
205 }
206 return true;
207 }
208
209 private boolean detectedLink(DeviceId src, DeviceId dst) {
210 for (DeviceId key : providerService.discoveredLinks.keySet()) {
211 if (key.equals(src)) {
212 return providerService.discoveredLinks.get(src).equals(dst);
213 }
214 }
215 return false;
216 }
217
218
219 private class TestLinkRegistry implements LinkProviderRegistry {
220
221 @Override
222 public LinkProviderService register(LinkProvider provider) {
223 providerService = new TestLinkProviderService(provider);
224 return providerService;
225 }
226
227 @Override
228 public void unregister(LinkProvider provider) {
229 }
230
231 @Override
232 public Set<ProviderId> getProviders() {
233 return null;
234 }
235
236 }
237
238 private class TestLinkProviderService
239 extends AbstractProviderService<LinkProvider>
240 implements LinkProviderService {
241
242 List<DeviceId> vanishedDpid = Lists.newLinkedList();
243 List<Long> vanishedPort = Lists.newLinkedList();
244 Map<DeviceId, DeviceId> discoveredLinks = Maps.newHashMap();
245
246 protected TestLinkProviderService(LinkProvider provider) {
247 super(provider);
248 }
249
250 @Override
251 public void linkDetected(LinkDescription linkDescription) {
252 DeviceId sDid = linkDescription.src().deviceId();
253 DeviceId dDid = linkDescription.dst().deviceId();
254 discoveredLinks.put(sDid, dDid);
255 }
256
257 @Override
258 public void linkVanished(LinkDescription linkDescription) {
259 // TODO Auto-generated method stub
260
261 }
262
263 @Override
264 public void linksVanished(ConnectPoint connectPoint) {
265 vanishedPort.add(connectPoint.port().toLong());
266
267 }
268
269 @Override
270 public void linksVanished(DeviceId deviceId) {
271 vanishedDpid.add(deviceId);
272 }
273
274
275 }
276
277
278
279 private class TestPacketContext implements PacketContext {
280
281 protected Device device;
282 protected boolean blocked = false;
283
284 public TestPacketContext(Device dev) {
285 device = dev;
286 }
287
288 @Override
289 public long time() {
290 return 0;
291 }
292
293 @Override
294 public InboundPacket inPacket() {
295 ONOSLLDP lldp = new ONOSLLDP();
296 lldp.setChassisId(device.chassisId());
297 lldp.setPortId((int) pd1.number().toLong());
298 lldp.setDevice(deviceService.getDevice(DID1).id().toString());
299
300
301 Ethernet ethPacket = new Ethernet();
302 ethPacket.setEtherType(Ethernet.TYPE_LLDP);
303 ethPacket.setDestinationMACAddress(ONOSLLDP.LLDP_NICIRA);
304 ethPacket.setPayload(lldp);
305 ethPacket.setPad(true);
306
307
308
309 ethPacket.setSourceMACAddress("DE:AD:BE:EF:BA:11");
310
311 ConnectPoint cp = new ConnectPoint(device.id(), pd3.number());
312
313 return new DefaultInboundPacket(cp, ethPacket,
314 ByteBuffer.wrap(ethPacket.serialize()));
315
316 }
317
318 @Override
319 public OutboundPacket outPacket() {
320 return null;
321 }
322
323 @Override
324 public TrafficTreatment.Builder treatmentBuilder() {
325 return null;
326 }
327
328 @Override
329 public void send() {
330
331 }
332
333 @Override
334 public boolean block() {
335 blocked = true;
336 return blocked;
337 }
338
339 @Override
340 public boolean isHandled() {
341 return blocked;
342 }
343
344 }
345
346 private class TestPacketService implements PacketService {
347
348 @Override
349 public void addProcessor(PacketProcessor processor, int priority) {
350 testProcessor = processor;
351 }
352
353 @Override
354 public void removeProcessor(PacketProcessor processor) {
355
356 }
357
358 @Override
359 public void emit(OutboundPacket packet) {
360
361 }
362 }
363
364 private class TestDeviceService implements DeviceService {
365
366 private Map<DeviceId, Device> devices = new HashMap<>();
367 private final ArrayListMultimap<DeviceId, Port> ports =
368 ArrayListMultimap.create();
369
370 public TestDeviceService() {
371 Device d1 = new DefaultDevice(ProviderId.NONE, DID1, Device.Type.SWITCH,
372 "TESTMF", "TESTHW", "TESTSW", "TESTSN", new ChassisId());
373 Device d2 = new DefaultDevice(ProviderId.NONE, DID2, Device.Type.SWITCH,
374 "TESTMF", "TESTHW", "TESTSW", "TESTSN", new ChassisId());
375 devices.put(DID1, d1);
376 devices.put(DID2, d2);
377
378 pd1 = new DefaultPort(d1, PortNumber.portNumber(1), true);
379 pd2 = new DefaultPort(d1, PortNumber.portNumber(2), true);
380 pd3 = new DefaultPort(d2, PortNumber.portNumber(1), true);
381 pd4 = new DefaultPort(d2, PortNumber.portNumber(2), true);
382
383 ports.putAll(DID1, Lists.newArrayList(pd1, pd2));
384 ports.putAll(DID2, Lists.newArrayList(pd3, pd4));
385
386
387 }
388
389 @Override
390 public int getDeviceCount() {
391 return devices.values().size();
392 }
393
394 @Override
395 public Iterable<Device> getDevices() {
396 return devices.values();
397 }
398
399 @Override
400 public Device getDevice(DeviceId deviceId) {
401 return devices.get(deviceId);
402 }
403
404 @Override
405 public MastershipRole getRole(DeviceId deviceId) {
406 return MastershipRole.MASTER;
407 }
408
409 @Override
410 public List<Port> getPorts(DeviceId deviceId) {
411 return ports.get(deviceId);
412 }
413
414 @Override
415 public Port getPort(DeviceId deviceId, PortNumber portNumber) {
416 for (Port p : ports.get(deviceId)) {
417 if (p.number().equals(portNumber)) {
418 return p;
419 }
420 }
421 return null;
422 }
423
424 @Override
425 public boolean isAvailable(DeviceId deviceId) {
426 return true;
427 }
428
429 @Override
430 public void addListener(DeviceListener listener) {
431 deviceListener = listener;
432
433 }
434
435 @Override
436 public void removeListener(DeviceListener listener) {
437
438 }
439 }
440
441 private final class TestMasterShipService implements MastershipService {
442
443 @Override
444 public MastershipRole getLocalRole(DeviceId deviceId) {
445 return MastershipRole.MASTER;
446 }
447
448 @Override
449 public MastershipRole requestRoleFor(DeviceId deviceId) {
450 return null;
451 }
452
453 @Override
454 public void relinquishMastership(DeviceId deviceId) {
455
456 }
457
458 @Override
459 public NodeId getMasterFor(DeviceId deviceId) {
460 return null;
461 }
462
463 @Override
464 public Set<DeviceId> getDevicesOf(NodeId nodeId) {
465 return null;
466 }
467
468 @Override
469 public MastershipTermService requestTermService() {
470 return null;
471 }
472
473 @Override
474 public void addListener(MastershipListener listener) {
475
476 }
477
478 @Override
479 public void removeListener(MastershipListener listener) {
480
481 }
Yuta HIGUCHI376d7502014-10-19 15:57:52 -0700482
483 @Override
484 public List<NodeId> getNodesFor(DeviceId deviceId) {
485 return Collections.emptyList();
486 }
alshabib0ed6a202014-10-19 12:42:57 -0700487 }
488
489
490}