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