fixed it-test (added bundles)
[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
369 enum MessageType {
370     NONE, BARRIER, FLOWMOD, TABLEMOD, PACKETOUT;
371 }
372
373 class MockConnectionAdapter implements ConnectionAdapter {
374
375     private MessageType messageType;
376     private ConnectionReadyListener connectionReadyListener;
377
378     public MockConnectionAdapter() {
379         setMessageType(MessageType.NONE);
380     }
381
382     @Override
383     public Future<RpcResult<BarrierOutput>> barrier(BarrierInput input) {
384         setMessageType(MessageType.BARRIER);
385         return null;
386     }
387
388     @Override
389     public Future<RpcResult<EchoOutput>> echo(EchoInput input) {
390         // TODO Auto-generated method stub
391         return null;
392     }
393
394     @Override
395     public Future<RpcResult<Void>> echoReply(EchoReplyInput input) {
396         // TODO Auto-generated method stub
397         return null;
398     }
399
400     @Override
401     public Future<RpcResult<Void>> experimenter(ExperimenterInput input) {
402         // TODO Auto-generated method stub
403         return null;
404     }
405
406     @Override
407     public Future<RpcResult<Void>> flowMod(FlowModInput input) {
408         setMessageType(MessageType.FLOWMOD);
409         return null;
410     }
411
412     @Override
413     public Future<RpcResult<GetAsyncOutput>> getAsync(GetAsyncInput input) {
414         // TODO Auto-generated method stub
415         return null;
416     }
417
418     @Override
419     public Future<RpcResult<GetConfigOutput>> getConfig(GetConfigInput input) {
420         // TODO Auto-generated method stub
421         return null;
422     }
423
424     @Override
425     public Future<RpcResult<GetFeaturesOutput>> getFeatures(GetFeaturesInput input) {
426         // TODO Auto-generated method stub
427         return null;
428     }
429
430     @Override
431     public Future<RpcResult<GetQueueConfigOutput>> getQueueConfig(GetQueueConfigInput input) {
432         // TODO Auto-generated method stub
433         return null;
434     }
435
436     @Override
437     public Future<RpcResult<Void>> groupMod(GroupModInput input) {
438         // TODO Auto-generated method stub
439         return null;
440     }
441
442     @Override
443     public Future<RpcResult<Void>> hello(HelloInput input) {
444         // TODO Auto-generated method stub
445         return null;
446     }
447
448     @Override
449     public Future<RpcResult<Void>> meterMod(MeterModInput input) {
450         // TODO Auto-generated method stub
451         return null;
452     }
453
454     @Override
455     public Future<RpcResult<Void>> packetOut(PacketOutInput input) {
456         setMessageType(MessageType.PACKETOUT);
457         return null;
458     }
459
460     @Override
461     public Future<RpcResult<Void>> portMod(PortModInput input) {
462         // TODO Auto-generated method stub
463         return null;
464     }
465
466     @Override
467     public Future<RpcResult<RoleRequestOutput>> roleRequest(RoleRequestInput input) {
468         // TODO Auto-generated method stub
469         return null;
470     }
471
472     @Override
473     public Future<RpcResult<Void>> setAsync(SetAsyncInput input) {
474         // TODO Auto-generated method stub
475         return null;
476     }
477
478     @Override
479     public Future<RpcResult<Void>> setConfig(SetConfigInput input) {
480         // TODO Auto-generated method stub
481         return null;
482     }
483
484     @Override
485     public Future<RpcResult<Void>> tableMod(TableModInput input) {
486         setMessageType(MessageType.TABLEMOD);
487         return null;
488     }
489
490     @Override
491     public Future<Boolean> disconnect() {
492         // TODO Auto-generated method stub
493         return null;
494     }
495
496     @Override
497     public boolean isAlive() {
498         // TODO Auto-generated method stub
499         return false;
500     }
501
502     @Override
503     public void setMessageListener(OpenflowProtocolListener messageListener) {
504         // TODO Auto-generated method stub
505
506     }
507
508     @Override
509     public void setSystemListener(SystemNotificationsListener systemListener) {
510         // TODO Auto-generated method stub
511
512     }
513
514     @Override
515     public void checkListeners() {
516         // TODO Auto-generated method stub
517
518     }
519
520     /**
521      * @return the messageType
522      */
523     public MessageType getMessageType() {
524         return messageType;
525     }
526
527     /**
528      * @param messageType
529      *            the messageType to set
530      */
531     public void setMessageType(MessageType messageType) {
532         this.messageType = messageType;
533     }
534
535     @Override
536     public void fireConnectionReadyNotification() {
537         if (connectionReadyListener != null) {
538             connectionReadyListener.onConnectionReady();
539         }
540     }
541
542     @Override
543     public void setConnectionReadyListener(
544             ConnectionReadyListener connectionReadyListener) {
545         this.connectionReadyListener = connectionReadyListener;
546     }
547
548 }