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