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