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