fix for BUG-709 - connectionCookie generate, use
[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     private int seed;
188
189     MockSessionContext(int conductorNum) {
190         conductor = new MockConnectionConductor(conductorNum);
191         map = new HashMap<SwitchConnectionDistinguisher, ConnectionConductor>();
192         messageService = new MessageDispatchServiceImpl(this);
193     }
194
195     @Override
196     public MockConnectionConductor getPrimaryConductor() {
197         // TODO Auto-generated method stub
198         return conductor;
199     }
200
201     @Override
202     public GetFeaturesOutput getFeatures() {
203         // TODO Auto-generated method stub
204         return null;
205     }
206
207     @Override
208     public ConnectionConductor getAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey) {
209
210         return map.get(auxiliaryKey);
211     }
212
213     @Override
214     public Set<Entry<SwitchConnectionDistinguisher, ConnectionConductor>> getAuxiliaryConductors() {
215         // TODO Auto-generated method stub
216         return null;
217     }
218
219     @Override
220     public void addAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey, ConnectionConductor conductor) {
221         map.put(auxiliaryKey, conductor);
222     }
223
224     @Override
225     public ConnectionConductor removeAuxiliaryConductor(SwitchConnectionDistinguisher connectionCookie) {
226         return map.remove(connectionCookie);
227     }
228
229     @Override
230     public boolean isValid() {
231         // TODO Auto-generated method stub
232         return isValid;
233     }
234
235     @Override
236     public void setValid(boolean valid) {
237         isValid = valid;
238     }
239
240     @Override
241     public SwitchSessionKeyOF getSessionKey() {
242         // TODO Auto-generated method stub
243         return null;
244     }
245     
246     @Override
247     public Cache<TransactionKey, Object> getbulkTransactionCache() {
248         return null;
249     }
250
251     @Override
252     public IMessageDispatchService getMessageDispatchService() {
253         // TODO Auto-generated method stub
254         return messageService;
255     }
256
257     @Override
258     public Long getNextXid() {
259         // TODO Auto-generated method stub
260         return null;
261     }
262
263     @Override
264     public Map<Long, PortGrouping> getPhysicalPorts() {
265         // TODO Auto-generated method stub
266         return null;
267     }
268
269     @Override
270     public Set<Long> getPorts() {
271         // TODO Auto-generated method stub
272         return null;
273     }
274
275     @Override
276     public PortGrouping getPhysicalPort(Long portNumber) {
277         // TODO Auto-generated method stub
278         return null;
279     }
280
281     @Override
282     public Boolean getPortBandwidth(Long portNumber) {
283         // TODO Auto-generated method stub
284         return null;
285     }
286
287     @Override
288     public boolean isPortEnabled(long portNumber) {
289         // TODO Auto-generated method stub
290         return false;
291     }
292
293     @Override
294     public boolean isPortEnabled(PortGrouping port) {
295         // TODO Auto-generated method stub
296         return false;
297     }
298
299     @Override
300     public List<PortGrouping> getEnabledPorts() {
301         // TODO Auto-generated method stub
302         return null;
303     }
304
305     @Override
306     public Map<Long, Boolean> getPortsBandwidth() {
307         // TODO Auto-generated method stub
308         return null;
309     }
310
311     @Override
312     public CompositeObjectRegistration<ModelDrivenSwitch> getProviderRegistration() {
313         return registration;
314     }
315
316     @Override
317     public void setProviderRegistration(
318             CompositeObjectRegistration<ModelDrivenSwitch> registration) {
319         this.registration = registration;
320     }
321
322     @Override
323     public int getSeed() {
324         return seed;
325     }
326     
327     /**
328      * @param seed the seed to set
329      */
330     public void setSeed(int seed) {
331         this.seed = seed;
332     }
333 }
334
335 class MockConnectionConductor implements ConnectionConductor {
336
337     private int conductorNum;
338     private MockConnectionAdapter adapter;
339
340     public MockConnectionConductor(int conductorNumber) {
341         conductorNum = conductorNumber;
342         adapter = new MockConnectionAdapter();
343     }
344
345     @Override
346     public void init() {
347         // TODO Auto-generated method stub
348
349     }
350
351     @Override
352     public Short getVersion() {
353         // TODO Auto-generated method stub
354         return null;
355     }
356
357     @Override
358     public CONDUCTOR_STATE getConductorState() {
359         // TODO Auto-generated method stub
360         return null;
361     }
362
363     @Override
364     public void setConductorState(CONDUCTOR_STATE conductorState) {
365         // TODO Auto-generated method stub
366
367     }
368
369     @Override
370     public Future<Boolean> disconnect() {
371         // TODO Auto-generated method stub
372         return null;
373     }
374
375     @Override
376     public void setSessionContext(SessionContext context) {
377         // TODO Auto-generated method stub
378
379     }
380
381     @Override
382     public void setConnectionCookie(SwitchConnectionDistinguisher auxiliaryKey) {
383         // TODO Auto-generated method stub
384
385     }
386
387     @Override
388     public SessionContext getSessionContext() {
389         // TODO Auto-generated method stub
390         return null;
391     }
392
393     @Override
394     public SwitchConnectionDistinguisher getAuxiliaryKey() {
395         if (0 != conductorNum) {
396             SwitchConnectionCookieOFImpl key = new SwitchConnectionCookieOFImpl();
397             key.setAuxiliaryId((short) conductorNum);
398             key.init(42);
399             return key;
400         }
401         return null;
402     }
403
404     @Override
405     public ConnectionAdapter getConnectionAdapter() {
406         // TODO Auto-generated method stub
407         return adapter;
408     }
409
410     public MessageType getMessageType() {
411         return adapter.getMessageType();
412     }
413
414     @Override
415     public void setQueueKeeper(QueueKeeper<OfHeader, DataObject> queueKeeper) {
416         // NOOP
417     }
418
419     @Override
420     public void setErrorHandler(ErrorHandler errorHandler) {
421     }
422 }
423
424 enum MessageType {
425     NONE, BARRIER, FLOWMOD, TABLEMOD, PACKETOUT;
426 }
427
428 class MockConnectionAdapter implements ConnectionAdapter {
429
430     private MessageType messageType;
431     private ConnectionReadyListener connectionReadyListener;
432
433     public MockConnectionAdapter() {
434         setMessageType(MessageType.NONE);
435     }
436
437     @Override
438     public Future<RpcResult<BarrierOutput>> barrier(BarrierInput input) {
439         setMessageType(MessageType.BARRIER);
440         return null;
441     }
442
443     @Override
444     public Future<RpcResult<EchoOutput>> echo(EchoInput input) {
445         // TODO Auto-generated method stub
446         return null;
447     }
448
449     @Override
450     public Future<RpcResult<Void>> echoReply(EchoReplyInput input) {
451         // TODO Auto-generated method stub
452         return null;
453     }
454
455     @Override
456     public Future<RpcResult<Void>> experimenter(ExperimenterInput input) {
457         // TODO Auto-generated method stub
458         return null;
459     }
460
461     @Override
462     public Future<RpcResult<Void>> flowMod(FlowModInput input) {
463         setMessageType(MessageType.FLOWMOD);
464         return null;
465     }
466
467     @Override
468     public Future<RpcResult<GetAsyncOutput>> getAsync(GetAsyncInput input) {
469         // TODO Auto-generated method stub
470         return null;
471     }
472
473     @Override
474     public Future<RpcResult<GetConfigOutput>> getConfig(GetConfigInput input) {
475         // TODO Auto-generated method stub
476         return null;
477     }
478
479     @Override
480     public Future<RpcResult<GetFeaturesOutput>> getFeatures(GetFeaturesInput input) {
481         // TODO Auto-generated method stub
482         return null;
483     }
484
485     @Override
486     public Future<RpcResult<GetQueueConfigOutput>> getQueueConfig(GetQueueConfigInput input) {
487         // TODO Auto-generated method stub
488         return null;
489     }
490
491     @Override
492     public Future<RpcResult<Void>> groupMod(GroupModInput input) {
493         // TODO Auto-generated method stub
494         return null;
495     }
496
497     @Override
498     public Future<RpcResult<Void>> hello(HelloInput input) {
499         // TODO Auto-generated method stub
500         return null;
501     }
502
503     @Override
504     public Future<RpcResult<Void>> meterMod(MeterModInput input) {
505         // TODO Auto-generated method stub
506         return null;
507     }
508
509     @Override
510     public Future<RpcResult<Void>> packetOut(PacketOutInput input) {
511         setMessageType(MessageType.PACKETOUT);
512         return null;
513     }
514
515     @Override
516     public Future<RpcResult<Void>> portMod(PortModInput input) {
517         // TODO Auto-generated method stub
518         return null;
519     }
520
521     @Override
522     public Future<RpcResult<RoleRequestOutput>> roleRequest(RoleRequestInput input) {
523         // TODO Auto-generated method stub
524         return null;
525     }
526
527     @Override
528     public Future<RpcResult<Void>> setAsync(SetAsyncInput input) {
529         // TODO Auto-generated method stub
530         return null;
531     }
532
533     @Override
534     public Future<RpcResult<Void>> setConfig(SetConfigInput input) {
535         // TODO Auto-generated method stub
536         return null;
537     }
538
539     @Override
540     public Future<RpcResult<Void>> tableMod(TableModInput input) {
541         setMessageType(MessageType.TABLEMOD);
542         return null;
543     }
544
545     @Override
546     public Future<Boolean> disconnect() {
547         // TODO Auto-generated method stub
548         return null;
549     }
550
551     @Override
552     public boolean isAlive() {
553         // TODO Auto-generated method stub
554         return false;
555     }
556
557     @Override
558     public void setMessageListener(OpenflowProtocolListener messageListener) {
559         // TODO Auto-generated method stub
560
561     }
562
563     @Override
564     public void setSystemListener(SystemNotificationsListener systemListener) {
565         // TODO Auto-generated method stub
566
567     }
568
569     @Override
570     public void checkListeners() {
571         // TODO Auto-generated method stub
572
573     }
574
575     /**
576      * @return the messageType
577      */
578     public MessageType getMessageType() {
579         return messageType;
580     }
581
582     /**
583      * @param messageType
584      *            the messageType to set
585      */
586     public void setMessageType(MessageType messageType) {
587         this.messageType = messageType;
588     }
589
590     @Override
591     public void fireConnectionReadyNotification() {
592             connectionReadyListener.onConnectionReady();
593     }
594
595     @Override
596     public void setConnectionReadyListener(
597             ConnectionReadyListener connectionReadyListener) {
598         this.connectionReadyListener = connectionReadyListener;
599     }
600
601     @Override
602     public Future<RpcResult<Void>> multipartRequest(
603             MultipartRequestInput input) {
604         // TODO Auto-generated method stub
605         return null;
606     }
607
608 }