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