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