Adding FlowRef,MeterRef and GroupRef for the Error message
[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 com.google.common.cache.Cache;
21 import org.junit.After;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
25 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionReadyListener;
26 import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor;
27 import org.opendaylight.openflowplugin.openflow.md.core.ErrorHandler;
28 import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
29 import org.opendaylight.openflowplugin.openflow.md.queue.QueueKeeper;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInputBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoInput;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoOutput;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoReplyInput;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInput;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncInput;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutput;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigInput;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigOutput;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesInput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigInput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigOutput;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInput;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInputBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortGrouping;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
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 Cache<TransactionKey, Object> getbulkTransactionCache() {
243         return null;
244     }
245
246     @Override
247     public IMessageDispatchService getMessageDispatchService() {
248         // TODO Auto-generated method stub
249         return messageService;
250     }
251
252     @Override
253     public Long getNextXid() {
254         // TODO Auto-generated method stub
255         return null;
256     }
257
258     @Override
259     public Map<Long, PortGrouping> getPhysicalPorts() {
260         // TODO Auto-generated method stub
261         return null;
262     }
263
264     @Override
265     public Set<Long> getPorts() {
266         // TODO Auto-generated method stub
267         return null;
268     }
269
270     @Override
271     public PortGrouping getPhysicalPort(Long portNumber) {
272         // TODO Auto-generated method stub
273         return null;
274     }
275
276     @Override
277     public Boolean getPortBandwidth(Long portNumber) {
278         // TODO Auto-generated method stub
279         return null;
280     }
281
282     @Override
283     public boolean isPortEnabled(long portNumber) {
284         // TODO Auto-generated method stub
285         return false;
286     }
287
288     @Override
289     public boolean isPortEnabled(PortGrouping port) {
290         // TODO Auto-generated method stub
291         return false;
292     }
293
294     @Override
295     public List<PortGrouping> getEnabledPorts() {
296         // TODO Auto-generated method stub
297         return null;
298     }
299
300     @Override
301     public Map<Long, Boolean> getPortsBandwidth() {
302         // TODO Auto-generated method stub
303         return null;
304     }
305
306 }
307
308 class MockConnectionConductor implements ConnectionConductor {
309
310     private int conductorNum;
311     private MockConnectionAdapter adapter;
312
313     public MockConnectionConductor(int conductorNumber) {
314         conductorNum = conductorNumber;
315         adapter = new MockConnectionAdapter();
316     }
317
318     @Override
319     public void init() {
320         // TODO Auto-generated method stub
321
322     }
323
324     @Override
325     public Short getVersion() {
326         // TODO Auto-generated method stub
327         return null;
328     }
329
330     @Override
331     public CONDUCTOR_STATE getConductorState() {
332         // TODO Auto-generated method stub
333         return null;
334     }
335
336     @Override
337     public void setConductorState(CONDUCTOR_STATE conductorState) {
338         // TODO Auto-generated method stub
339
340     }
341
342     @Override
343     public Future<Boolean> disconnect() {
344         // TODO Auto-generated method stub
345         return null;
346     }
347
348     @Override
349     public void setSessionContext(SessionContext context) {
350         // TODO Auto-generated method stub
351
352     }
353
354     @Override
355     public void setConnectionCookie(SwitchConnectionDistinguisher auxiliaryKey) {
356         // TODO Auto-generated method stub
357
358     }
359
360     @Override
361     public SessionContext getSessionContext() {
362         // TODO Auto-generated method stub
363         return null;
364     }
365
366     @Override
367     public SwitchConnectionDistinguisher getAuxiliaryKey() {
368         if (0 != conductorNum) {
369             SwitchConnectionCookieOFImpl key = new SwitchConnectionCookieOFImpl();
370             key.setDatapathId(BigInteger.valueOf(10L));
371             key.setAuxiliaryId((short) conductorNum);
372             key.initId();
373             return key;
374         }
375         return null;
376     }
377
378     @Override
379     public ConnectionAdapter getConnectionAdapter() {
380         // TODO Auto-generated method stub
381         return adapter;
382     }
383
384     public MessageType getMessageType() {
385         return adapter.getMessageType();
386     }
387
388     @Override
389     public void setQueueKeeper(QueueKeeper<OfHeader, DataObject> queueKeeper) {
390         // NOOP
391     }
392
393     @Override
394     public void setErrorHandler(ErrorHandler errorHandler) {
395     }
396 }
397
398 enum MessageType {
399     NONE, BARRIER, FLOWMOD, TABLEMOD, PACKETOUT;
400 }
401
402 class MockConnectionAdapter implements ConnectionAdapter {
403
404     private MessageType messageType;
405     private ConnectionReadyListener connectionReadyListener;
406
407     public MockConnectionAdapter() {
408         setMessageType(MessageType.NONE);
409     }
410
411     @Override
412     public Future<RpcResult<BarrierOutput>> barrier(BarrierInput input) {
413         setMessageType(MessageType.BARRIER);
414         return null;
415     }
416
417     @Override
418     public Future<RpcResult<EchoOutput>> echo(EchoInput input) {
419         // TODO Auto-generated method stub
420         return null;
421     }
422
423     @Override
424     public Future<RpcResult<Void>> echoReply(EchoReplyInput input) {
425         // TODO Auto-generated method stub
426         return null;
427     }
428
429     @Override
430     public Future<RpcResult<Void>> experimenter(ExperimenterInput input) {
431         // TODO Auto-generated method stub
432         return null;
433     }
434
435     @Override
436     public Future<RpcResult<Void>> flowMod(FlowModInput input) {
437         setMessageType(MessageType.FLOWMOD);
438         return null;
439     }
440
441     @Override
442     public Future<RpcResult<GetAsyncOutput>> getAsync(GetAsyncInput input) {
443         // TODO Auto-generated method stub
444         return null;
445     }
446
447     @Override
448     public Future<RpcResult<GetConfigOutput>> getConfig(GetConfigInput input) {
449         // TODO Auto-generated method stub
450         return null;
451     }
452
453     @Override
454     public Future<RpcResult<GetFeaturesOutput>> getFeatures(GetFeaturesInput input) {
455         // TODO Auto-generated method stub
456         return null;
457     }
458
459     @Override
460     public Future<RpcResult<GetQueueConfigOutput>> getQueueConfig(GetQueueConfigInput input) {
461         // TODO Auto-generated method stub
462         return null;
463     }
464
465     @Override
466     public Future<RpcResult<Void>> groupMod(GroupModInput input) {
467         // TODO Auto-generated method stub
468         return null;
469     }
470
471     @Override
472     public Future<RpcResult<Void>> hello(HelloInput input) {
473         // TODO Auto-generated method stub
474         return null;
475     }
476
477     @Override
478     public Future<RpcResult<Void>> meterMod(MeterModInput input) {
479         // TODO Auto-generated method stub
480         return null;
481     }
482
483     @Override
484     public Future<RpcResult<Void>> packetOut(PacketOutInput input) {
485         setMessageType(MessageType.PACKETOUT);
486         return null;
487     }
488
489     @Override
490     public Future<RpcResult<Void>> portMod(PortModInput input) {
491         // TODO Auto-generated method stub
492         return null;
493     }
494
495     @Override
496     public Future<RpcResult<RoleRequestOutput>> roleRequest(RoleRequestInput input) {
497         // TODO Auto-generated method stub
498         return null;
499     }
500
501     @Override
502     public Future<RpcResult<Void>> setAsync(SetAsyncInput input) {
503         // TODO Auto-generated method stub
504         return null;
505     }
506
507     @Override
508     public Future<RpcResult<Void>> setConfig(SetConfigInput input) {
509         // TODO Auto-generated method stub
510         return null;
511     }
512
513     @Override
514     public Future<RpcResult<Void>> tableMod(TableModInput input) {
515         setMessageType(MessageType.TABLEMOD);
516         return null;
517     }
518
519     @Override
520     public Future<Boolean> disconnect() {
521         // TODO Auto-generated method stub
522         return null;
523     }
524
525     @Override
526     public boolean isAlive() {
527         // TODO Auto-generated method stub
528         return false;
529     }
530
531     @Override
532     public void setMessageListener(OpenflowProtocolListener messageListener) {
533         // TODO Auto-generated method stub
534
535     }
536
537     @Override
538     public void setSystemListener(SystemNotificationsListener systemListener) {
539         // TODO Auto-generated method stub
540
541     }
542
543     @Override
544     public void checkListeners() {
545         // TODO Auto-generated method stub
546
547     }
548
549     /**
550      * @return the messageType
551      */
552     public MessageType getMessageType() {
553         return messageType;
554     }
555
556     /**
557      * @param messageType
558      *            the messageType to set
559      */
560     public void setMessageType(MessageType messageType) {
561         this.messageType = messageType;
562     }
563
564     @Override
565     public void fireConnectionReadyNotification() {
566             connectionReadyListener.onConnectionReady();
567     }
568
569     @Override
570     public void setConnectionReadyListener(
571             ConnectionReadyListener connectionReadyListener) {
572         this.connectionReadyListener = connectionReadyListener;
573     }
574
575     @Override
576     public Future<RpcResult<Void>> multipartRequest(
577             MultipartRequestInput input) {
578         // TODO Auto-generated method stub
579         return null;
580     }
581
582 }