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