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