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