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