additional fix fro BUG-782 unregistering switch providers
[openflowplugin.git] / openflowplugin / src / test / java / org / opendaylight / openflowplugin / openflow / md / core / session / MessageDispatchServiceImplTest.java
1 /**
2  * Copyright IBM Corporation, 2013.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.openflowplugin.openflow.md.core.session;
9
10 import java.math.BigInteger;
11 import java.util.HashMap;
12 import java.util.List;
13 import java.util.Map;
14 import java.util.Map.Entry;
15 import java.util.Set;
16 import java.util.concurrent.Future;
17
18 import junit.framework.Assert;
19
20 import org.junit.After;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
24 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionReadyListener;
25 import org.opendaylight.openflowplugin.openflow.md.ModelDrivenSwitch;
26 import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor;
27 import org.opendaylight.openflowplugin.openflow.md.core.ErrorHandler;
28 import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
29 import org.opendaylight.openflowplugin.openflow.md.queue.QueueKeeper;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInputBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoInput;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoOutput;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoReplyInput;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInput;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncInput;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutput;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigInput;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigOutput;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesInput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigInput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigOutput;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInput;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInputBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortGrouping;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestInput;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestOutput;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInput;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetConfigInput;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.TableModInput;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
62 import org.opendaylight.yangtools.concepts.CompositeObjectRegistration;
63 import org.opendaylight.yangtools.yang.binding.DataObject;
64 import org.opendaylight.yangtools.yang.common.RpcResult;
65
66 import com.google.common.cache.Cache;
67
68 public class MessageDispatchServiceImplTest {
69
70     MockSessionContext session;
71
72     /**
73      * @throws java.lang.Exception
74      */
75     @Before
76     public void setUp() throws Exception {
77         session = new MockSessionContext(0);
78
79     }
80
81     /**
82      * @throws java.lang.Exception
83      */
84     @After
85     public void tearDown() throws Exception {
86
87     }
88
89     /**
90      * Test barrier message for null cookie
91      *
92      * @throws Exception
93      */
94     @Test
95     public void testBarrierMessageForPrimary() throws Exception {
96         MockConnectionConductor conductor = new MockConnectionConductor(1);
97         SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();       
98         BarrierInputBuilder barrierMsg = new BarrierInputBuilder();
99         session.getMessageDispatchService().barrier(barrierMsg.build(), cookie);
100         Assert.assertEquals(MessageType.BARRIER, session.getPrimaryConductor().getMessageType());
101     }
102
103     /**
104      * Test packet out message for primary connection
105      *
106      * @throws Exception
107      */
108     @Test
109     public void testPacketOutMessageForPrimary() throws Exception {
110         session.getMessageDispatchService().packetOut(null, null);
111         Assert.assertEquals(MessageType.PACKETOUT, session.getPrimaryConductor().getMessageType());
112     }
113
114     /**
115      * Test packet out message for auxiliary connection
116      *
117      * @throws Exception
118      */
119     @Test
120     public void testPacketOutMessageForAuxiliary() throws Exception {
121         MockConnectionConductor conductor = new MockConnectionConductor(1);
122         SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
123         session.addAuxiliaryConductor(cookie, conductor);
124         session.getMessageDispatchService().packetOut(null, cookie);
125         Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
126         conductor = (MockConnectionConductor) session.getAuxiliaryConductor(cookie);
127         Assert.assertEquals(MessageType.PACKETOUT, conductor.getMessageType());
128     }
129
130     /**
131      * Test packet out message when multiple auxiliary connection exist
132      *
133      * @throws Exception
134      */
135     @Test
136     public void testPacketOutMessageForMultipleAuxiliary() throws Exception {
137         MockConnectionConductor conductor1 = new MockConnectionConductor(1);
138         SwitchConnectionDistinguisher cookie1 = conductor1.getAuxiliaryKey();
139         session.addAuxiliaryConductor(cookie1, conductor1);
140         MockConnectionConductor conductor2 = new MockConnectionConductor(2);
141         SwitchConnectionDistinguisher cookie2 = conductor2.getAuxiliaryKey();
142         session.addAuxiliaryConductor(cookie2, conductor2);
143         MockConnectionConductor conductor3 = new MockConnectionConductor(3);
144         SwitchConnectionDistinguisher cookie3 = conductor3.getAuxiliaryKey();
145         session.addAuxiliaryConductor(cookie3, conductor3);
146         PacketOutInputBuilder builder = new PacketOutInputBuilder();
147         // send message
148         session.getMessageDispatchService().packetOut(builder.build(), cookie2);
149
150         Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
151
152         conductor3 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie3);
153         Assert.assertEquals(MessageType.NONE, conductor3.getMessageType());
154
155         conductor2 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie2);
156         Assert.assertEquals(MessageType.PACKETOUT, conductor2.getMessageType());
157
158         conductor1 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie1);
159         Assert.assertEquals(MessageType.NONE, conductor1.getMessageType());
160
161     }
162
163     /**
164      * Test for invalid session
165      *
166      * @throws Exception
167      */
168     @Test
169     public void testInvalidSession() throws Exception {
170         session.setValid(false);
171         try {
172             session.getMessageDispatchService().packetOut(null, null);
173             Assert.assertTrue(false);
174         } catch (IllegalArgumentException ex) {
175             Assert.assertTrue(true);
176         }
177     }
178
179 }
180
181 class MockSessionContext implements SessionContext {
182     private MockConnectionConductor conductor;
183     private Map<SwitchConnectionDistinguisher, ConnectionConductor> map;
184     private IMessageDispatchService messageService;
185     private boolean isValid = true;
186     private CompositeObjectRegistration<ModelDrivenSwitch> registration;
187
188     MockSessionContext(int conductorNum) {
189         conductor = new MockConnectionConductor(conductorNum);
190         map = new HashMap<SwitchConnectionDistinguisher, ConnectionConductor>();
191         messageService = new MessageDispatchServiceImpl(this);
192     }
193
194     @Override
195     public MockConnectionConductor getPrimaryConductor() {
196         // TODO Auto-generated method stub
197         return conductor;
198     }
199
200     @Override
201     public GetFeaturesOutput getFeatures() {
202         // TODO Auto-generated method stub
203         return null;
204     }
205
206     @Override
207     public ConnectionConductor getAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey) {
208
209         return map.get(auxiliaryKey);
210     }
211
212     @Override
213     public Set<Entry<SwitchConnectionDistinguisher, ConnectionConductor>> getAuxiliaryConductors() {
214         // TODO Auto-generated method stub
215         return null;
216     }
217
218     @Override
219     public void addAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey, ConnectionConductor conductor) {
220         map.put(auxiliaryKey, conductor);
221     }
222
223     @Override
224     public ConnectionConductor removeAuxiliaryConductor(SwitchConnectionDistinguisher connectionCookie) {
225         return map.remove(connectionCookie);
226     }
227
228     @Override
229     public boolean isValid() {
230         // TODO Auto-generated method stub
231         return isValid;
232     }
233
234     @Override
235     public void setValid(boolean valid) {
236         isValid = valid;
237     }
238
239     @Override
240     public SwitchConnectionDistinguisher getSessionKey() {
241         // TODO Auto-generated method stub
242         return null;
243     }
244     
245     @Override
246     public Cache<TransactionKey, Object> getbulkTransactionCache() {
247         return null;
248     }
249
250     @Override
251     public IMessageDispatchService getMessageDispatchService() {
252         // TODO Auto-generated method stub
253         return messageService;
254     }
255
256     @Override
257     public Long getNextXid() {
258         // TODO Auto-generated method stub
259         return null;
260     }
261
262     @Override
263     public Map<Long, PortGrouping> getPhysicalPorts() {
264         // TODO Auto-generated method stub
265         return null;
266     }
267
268     @Override
269     public Set<Long> getPorts() {
270         // TODO Auto-generated method stub
271         return null;
272     }
273
274     @Override
275     public PortGrouping getPhysicalPort(Long portNumber) {
276         // TODO Auto-generated method stub
277         return null;
278     }
279
280     @Override
281     public Boolean getPortBandwidth(Long portNumber) {
282         // TODO Auto-generated method stub
283         return null;
284     }
285
286     @Override
287     public boolean isPortEnabled(long portNumber) {
288         // TODO Auto-generated method stub
289         return false;
290     }
291
292     @Override
293     public boolean isPortEnabled(PortGrouping port) {
294         // TODO Auto-generated method stub
295         return false;
296     }
297
298     @Override
299     public List<PortGrouping> getEnabledPorts() {
300         // TODO Auto-generated method stub
301         return null;
302     }
303
304     @Override
305     public Map<Long, Boolean> getPortsBandwidth() {
306         // TODO Auto-generated method stub
307         return null;
308     }
309
310     @Override
311     public CompositeObjectRegistration<ModelDrivenSwitch> getProviderRegistration() {
312         return registration;
313     }
314
315     @Override
316     public void setProviderRegistration(
317             CompositeObjectRegistration<ModelDrivenSwitch> registration) {
318         this.registration = registration;
319     }
320 }
321
322 class MockConnectionConductor implements ConnectionConductor {
323
324     private int conductorNum;
325     private MockConnectionAdapter adapter;
326
327     public MockConnectionConductor(int conductorNumber) {
328         conductorNum = conductorNumber;
329         adapter = new MockConnectionAdapter();
330     }
331
332     @Override
333     public void init() {
334         // TODO Auto-generated method stub
335
336     }
337
338     @Override
339     public Short getVersion() {
340         // TODO Auto-generated method stub
341         return null;
342     }
343
344     @Override
345     public CONDUCTOR_STATE getConductorState() {
346         // TODO Auto-generated method stub
347         return null;
348     }
349
350     @Override
351     public void setConductorState(CONDUCTOR_STATE conductorState) {
352         // TODO Auto-generated method stub
353
354     }
355
356     @Override
357     public Future<Boolean> disconnect() {
358         // TODO Auto-generated method stub
359         return null;
360     }
361
362     @Override
363     public void setSessionContext(SessionContext context) {
364         // TODO Auto-generated method stub
365
366     }
367
368     @Override
369     public void setConnectionCookie(SwitchConnectionDistinguisher auxiliaryKey) {
370         // TODO Auto-generated method stub
371
372     }
373
374     @Override
375     public SessionContext getSessionContext() {
376         // TODO Auto-generated method stub
377         return null;
378     }
379
380     @Override
381     public SwitchConnectionDistinguisher getAuxiliaryKey() {
382         if (0 != conductorNum) {
383             SwitchConnectionCookieOFImpl key = new SwitchConnectionCookieOFImpl();
384             key.setDatapathId(BigInteger.valueOf(10L));
385             key.setAuxiliaryId((short) conductorNum);
386             key.initId();
387             return key;
388         }
389         return null;
390     }
391
392     @Override
393     public ConnectionAdapter getConnectionAdapter() {
394         // TODO Auto-generated method stub
395         return adapter;
396     }
397
398     public MessageType getMessageType() {
399         return adapter.getMessageType();
400     }
401
402     @Override
403     public void setQueueKeeper(QueueKeeper<OfHeader, DataObject> queueKeeper) {
404         // NOOP
405     }
406
407     @Override
408     public void setErrorHandler(ErrorHandler errorHandler) {
409     }
410 }
411
412 enum MessageType {
413     NONE, BARRIER, FLOWMOD, TABLEMOD, PACKETOUT;
414 }
415
416 class MockConnectionAdapter implements ConnectionAdapter {
417
418     private MessageType messageType;
419     private ConnectionReadyListener connectionReadyListener;
420
421     public MockConnectionAdapter() {
422         setMessageType(MessageType.NONE);
423     }
424
425     @Override
426     public Future<RpcResult<BarrierOutput>> barrier(BarrierInput input) {
427         setMessageType(MessageType.BARRIER);
428         return null;
429     }
430
431     @Override
432     public Future<RpcResult<EchoOutput>> echo(EchoInput input) {
433         // TODO Auto-generated method stub
434         return null;
435     }
436
437     @Override
438     public Future<RpcResult<Void>> echoReply(EchoReplyInput input) {
439         // TODO Auto-generated method stub
440         return null;
441     }
442
443     @Override
444     public Future<RpcResult<Void>> experimenter(ExperimenterInput input) {
445         // TODO Auto-generated method stub
446         return null;
447     }
448
449     @Override
450     public Future<RpcResult<Void>> flowMod(FlowModInput input) {
451         setMessageType(MessageType.FLOWMOD);
452         return null;
453     }
454
455     @Override
456     public Future<RpcResult<GetAsyncOutput>> getAsync(GetAsyncInput input) {
457         // TODO Auto-generated method stub
458         return null;
459     }
460
461     @Override
462     public Future<RpcResult<GetConfigOutput>> getConfig(GetConfigInput input) {
463         // TODO Auto-generated method stub
464         return null;
465     }
466
467     @Override
468     public Future<RpcResult<GetFeaturesOutput>> getFeatures(GetFeaturesInput input) {
469         // TODO Auto-generated method stub
470         return null;
471     }
472
473     @Override
474     public Future<RpcResult<GetQueueConfigOutput>> getQueueConfig(GetQueueConfigInput input) {
475         // TODO Auto-generated method stub
476         return null;
477     }
478
479     @Override
480     public Future<RpcResult<Void>> groupMod(GroupModInput input) {
481         // TODO Auto-generated method stub
482         return null;
483     }
484
485     @Override
486     public Future<RpcResult<Void>> hello(HelloInput input) {
487         // TODO Auto-generated method stub
488         return null;
489     }
490
491     @Override
492     public Future<RpcResult<Void>> meterMod(MeterModInput input) {
493         // TODO Auto-generated method stub
494         return null;
495     }
496
497     @Override
498     public Future<RpcResult<Void>> packetOut(PacketOutInput input) {
499         setMessageType(MessageType.PACKETOUT);
500         return null;
501     }
502
503     @Override
504     public Future<RpcResult<Void>> portMod(PortModInput input) {
505         // TODO Auto-generated method stub
506         return null;
507     }
508
509     @Override
510     public Future<RpcResult<RoleRequestOutput>> roleRequest(RoleRequestInput input) {
511         // TODO Auto-generated method stub
512         return null;
513     }
514
515     @Override
516     public Future<RpcResult<Void>> setAsync(SetAsyncInput input) {
517         // TODO Auto-generated method stub
518         return null;
519     }
520
521     @Override
522     public Future<RpcResult<Void>> setConfig(SetConfigInput input) {
523         // TODO Auto-generated method stub
524         return null;
525     }
526
527     @Override
528     public Future<RpcResult<Void>> tableMod(TableModInput input) {
529         setMessageType(MessageType.TABLEMOD);
530         return null;
531     }
532
533     @Override
534     public Future<Boolean> disconnect() {
535         // TODO Auto-generated method stub
536         return null;
537     }
538
539     @Override
540     public boolean isAlive() {
541         // TODO Auto-generated method stub
542         return false;
543     }
544
545     @Override
546     public void setMessageListener(OpenflowProtocolListener messageListener) {
547         // TODO Auto-generated method stub
548
549     }
550
551     @Override
552     public void setSystemListener(SystemNotificationsListener systemListener) {
553         // TODO Auto-generated method stub
554
555     }
556
557     @Override
558     public void checkListeners() {
559         // TODO Auto-generated method stub
560
561     }
562
563     /**
564      * @return the messageType
565      */
566     public MessageType getMessageType() {
567         return messageType;
568     }
569
570     /**
571      * @param messageType
572      *            the messageType to set
573      */
574     public void setMessageType(MessageType messageType) {
575         this.messageType = messageType;
576     }
577
578     @Override
579     public void fireConnectionReadyNotification() {
580             connectionReadyListener.onConnectionReady();
581     }
582
583     @Override
584     public void setConnectionReadyListener(
585             ConnectionReadyListener connectionReadyListener) {
586         this.connectionReadyListener = connectionReadyListener;
587     }
588
589     @Override
590     public Future<RpcResult<Void>> multipartRequest(
591             MultipartRequestInput input) {
592         // TODO Auto-generated method stub
593         return null;
594     }
595
596 }