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