BUG-4283: experimenter msg support - deserialization part
[openflowjava.git] / openflow-protocol-impl / src / test / java / org / opendaylight / openflowjava / protocol / impl / core / connection / SwitchConnectionProviderImpl02Test.java
1 /*
2  * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. 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.openflowjava.protocol.impl.core.connection;
9
10 import com.google.common.util.concurrent.ListenableFuture;
11 import java.net.InetAddress;
12 import java.net.UnknownHostException;
13 import org.junit.Assert;
14 import org.junit.Test;
15 import org.mockito.Mock;
16 import org.mockito.MockitoAnnotations;
17 import org.opendaylight.openflowjava.protocol.api.connection.SwitchConnectionHandler;
18 import org.opendaylight.openflowjava.protocol.api.connection.TlsConfiguration;
19 import org.opendaylight.openflowjava.protocol.api.connection.TlsConfigurationImpl;
20 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
21 import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralDeserializer;
22 import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralSerializer;
23 import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
24 import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterActionDeserializerKey;
25 import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterActionSerializerKey;
26 import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterIdDeserializerKey;
27 import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterIdSerializerKey;
28 import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterInstructionDeserializerKey;
29 import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterInstructionSerializerKey;
30 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey;
31 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey;
32 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
33 import org.opendaylight.openflowjava.protocol.impl.core.ServerFacade;
34 import org.opendaylight.openflowjava.protocol.impl.core.SwitchConnectionProviderImpl;
35 import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.ExperimenterActionSubType;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.config.rev140630.KeystoreType;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.config.rev140630.PathType;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.config.rev140630.TransportProtocol;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPort;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessage;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.experimenter.core.ExperimenterDataOfChoice;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterCase;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.queue.property.header.QueueProperty;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.table.features.properties.grouping.TableFeatureProperties;
49
50 /**
51  * @author madamjak
52  * @author michal.polkorab
53  */
54 public class SwitchConnectionProviderImpl02Test {
55     @Mock SwitchConnectionHandler handler;
56     @Mock OFGeneralSerializer serializer;
57     @Mock OFGeneralDeserializer deserializer;
58     @Mock OFDeserializer<ErrorMessage> deserializerError;
59     @Mock OFDeserializer<ExperimenterDataOfChoice> deserializerExpMsg;
60     @Mock OFDeserializer<ExperimenterDataOfChoice> deserializerMultipartRplMsg;
61     @Mock OFDeserializer<QueueProperty> deserializerQueueProperty;
62     @Mock OFDeserializer<MeterBandExperimenterCase> deserializerMeterBandExpCase;
63     @Mock OFSerializer<ExperimenterDataOfChoice> serializerExperimenterInput;
64     @Mock OFSerializer<ExperimenterDataOfChoice> serializerMultipartRequestExpCase;
65     @Mock OFSerializer<MeterBandExperimenterCase> serializerMeterBandExpCase;
66     private static final int SWITCH_IDLE_TIMEOUT = 2000;
67     private InetAddress startupAddress;
68     private TlsConfiguration tlsConfiguration;
69     private SwitchConnectionProviderImpl provider;
70     private ConnectionConfigurationImpl config;
71
72     /**
73      * Creates new {@link SwitchConnectionProvider} instance for each test
74      * @param protocol communication protocol
75      */
76     public void startUp(TransportProtocol protocol) {
77         MockitoAnnotations.initMocks(this);
78         config = null;
79         if (protocol != null) {
80             createConfig(protocol);
81         }
82         provider = new SwitchConnectionProviderImpl();
83     }
84
85     private void createConfig(TransportProtocol protocol) {
86         try {
87             startupAddress = InetAddress.getLocalHost();
88         } catch (UnknownHostException e) {
89             e.printStackTrace();
90         }
91         tlsConfiguration = null;
92         if (protocol.equals(TransportProtocol.TLS)) {
93             tlsConfiguration = new TlsConfigurationImpl(KeystoreType.JKS,
94                     "/selfSignedSwitch", PathType.CLASSPATH, KeystoreType.JKS,
95                     "/selfSignedController", PathType.CLASSPATH) ;
96         }
97         config = new ConnectionConfigurationImpl(startupAddress, 0, tlsConfiguration, SWITCH_IDLE_TIMEOUT);
98         config.setTransferProtocol(protocol);
99     }
100
101
102     /**
103      * Test getServerFacade
104      */
105     @Test
106     public void testServerFacade(){
107         startUp(TransportProtocol.TCP);
108         provider.setConfiguration(config);
109         ListenableFuture<Boolean> future = provider.startup();
110         ServerFacade serverFacade = provider.getServerFacade();
111         Assert.assertNotNull("Wrong -- getServerFacade return null",serverFacade);
112     }
113
114     /**
115      * Test shutdown on unconfigured provider
116      */
117     @Test(expected = IllegalStateException.class)
118     public void testShutdownUnconfigured(){
119         startUp(TransportProtocol.TCP);
120         provider.shutdown();
121     }
122     /**
123      * Test unregister by wrong key
124      */
125     @Test
126     public void testUnregisterWrongKeys(){
127         startUp(TransportProtocol.TCP);
128         provider.setConfiguration(config);
129         ExperimenterInstructionSerializerKey testSerKey
130             = new ExperimenterInstructionSerializerKey(EncodeConstants.OF10_VERSION_ID,42L);
131         Assert.assertFalse("Wrong -- unregisterSerializer",provider.unregisterSerializer(testSerKey));
132         ExperimenterInstructionDeserializerKey tesDeserKey
133             = new ExperimenterInstructionDeserializerKey(EncodeConstants.OF10_VERSION_ID,24L);
134         Assert.assertFalse("Wrong -- unregisterDeserializer",provider.unregisterDeserializer(tesDeserKey));
135     }
136
137     /**
138      * Test register and unregister method
139      */
140     @Test
141     public void testUnregisterExistingKeys(){
142         startUp(TransportProtocol.TCP);
143         provider.setConfiguration(config);
144         // -- registerActionSerializer
145         ExperimenterActionSerializerKey key1
146             = new ExperimenterActionSerializerKey(EncodeConstants.OF10_VERSION_ID, 42L, TestSubType.class);
147         provider.registerActionSerializer(key1, serializer);
148         Assert.assertTrue("Wrong -- unregister ActionSerializer", provider.unregisterSerializer(key1));
149         Assert.assertFalse("Wrong -- unregister ActionSerializer by not existing key", provider.unregisterSerializer(key1));
150         // -- registerActionDeserializer
151         ExperimenterActionDeserializerKey key2
152             = new ExperimenterActionDeserializerKey(EncodeConstants.OF10_VERSION_ID, 42L);
153         provider.registerActionDeserializer(key2, deserializer);
154         Assert.assertTrue("Wrong -- unregister ActionDeserializer", provider.unregisterDeserializer(key2));
155         Assert.assertFalse("Wrong -- unregister ActionDeserializer by not existing key", provider.unregisterDeserializer(key2));
156         // -- registerInstructionSerializer
157         ExperimenterInstructionSerializerKey key3
158             = new ExperimenterInstructionSerializerKey(EncodeConstants.OF10_VERSION_ID,42L);
159         provider.registerInstructionSerializer(key3, serializer);
160         Assert.assertTrue("Wrong -- unregister InstructionSerializer", provider.unregisterSerializer(key3));
161         Assert.assertFalse("Wrong -- unregister InstructionSerializer by not existing key", provider.unregisterSerializer(key3));
162         // -- registerInstructionDeserializer
163         ExperimenterInstructionDeserializerKey key4
164             = new ExperimenterInstructionDeserializerKey(EncodeConstants.OF10_VERSION_ID,42L);
165         provider.registerInstructionDeserializer(key4, deserializer);
166         Assert.assertTrue("Wrong -- unregister InstructionDeserializer", provider.unregisterDeserializer(key4));
167         Assert.assertFalse("Wrong -- unregister InstructionDeserializer by not existing key", provider.unregisterDeserializer(key4));
168         // -- registerMatchEntryDeserializer
169         MatchEntryDeserializerKey key5
170             = new MatchEntryDeserializerKey(EncodeConstants.OF10_VERSION_ID, 0x8000, 42);
171         provider.registerMatchEntryDeserializer(key5, deserializer);
172         Assert.assertTrue("Wrong -- unregister MatchEntryDeserializer", provider.unregisterDeserializer(key5));
173         Assert.assertFalse("Wrong -- unregister MatchEntryDeserializer by not existing key", provider.unregisterDeserializer(key5));
174         // -- registerErrorDeserializer
175         ExperimenterIdDeserializerKey key6
176             = new ExperimenterIdDeserializerKey(EncodeConstants.OF10_VERSION_ID, 42L, ErrorMessage.class);
177         provider.registerErrorDeserializer(key6, deserializerError);
178         Assert.assertTrue("Wrong -- unregister ErrorDeserializer", provider.unregisterDeserializer(key6));
179         Assert.assertFalse("Wrong -- unregister ErrorDeserializer by not existing key", provider.unregisterDeserializer(key6));
180         // -- registerExperimenterMessageDeserializer
181         ExperimenterIdDeserializerKey key7
182             = new ExperimenterIdDeserializerKey(EncodeConstants.OF10_VERSION_ID, 42L, ExperimenterMessage.class);
183         provider.registerExperimenterMessageDeserializer(key7, deserializerExpMsg);
184         Assert.assertTrue("Wrong -- unregister ExperimenterMessageDeserializer", provider.unregisterDeserializer(key7));
185         Assert.assertFalse("Wrong -- unregister ExperimenterMessageDeserializer by not existing key", provider.unregisterDeserializer(key7));
186         // -- registerMultipartReplyMessageDeserializer
187         ExperimenterIdDeserializerKey key8
188             = new ExperimenterIdDeserializerKey(EncodeConstants.OF10_VERSION_ID, 42L, MultipartReplyMessage.class);
189         provider.registerMultipartReplyMessageDeserializer(key8, deserializerMultipartRplMsg);
190         Assert.assertTrue("Wrong -- unregister MultipartReplyMessageDeserializer", provider.unregisterDeserializer(key8));
191         Assert.assertFalse("Wrong -- unregister MultipartReplyMessageDeserializer by not existing key", provider.unregisterDeserializer(key8));
192         // -- registerMultipartReplyTFDeserializer
193         ExperimenterIdDeserializerKey key9 =
194                 new ExperimenterIdDeserializerKey(EncodeConstants.OF10_VERSION_ID, 42L, MultipartReplyMessage.class);
195         provider.registerMultipartReplyTFDeserializer(key9, deserializer);
196         Assert.assertTrue("Wrong -- unregister MultipartReplyTFDeserializer", provider.unregisterDeserializer(key9));
197         Assert.assertFalse("Wrong -- unregister MultipartReplyTFDeserializer by non existing key", provider.unregisterDeserializer(key9));
198         // -- registerQueuePropertyDeserializer
199         ExperimenterIdDeserializerKey key10
200             = new ExperimenterIdDeserializerKey(EncodeConstants.OF10_VERSION_ID, 42L, QueueProperty.class);
201         provider.registerQueuePropertyDeserializer(key10, deserializerQueueProperty);
202         Assert.assertTrue("Wrong -- unregister QueuePropertyDeserializer", provider.unregisterDeserializer(key10));
203         Assert.assertFalse("Wrong -- unregister QueuePropertyDeserializer by not existing key", provider.unregisterDeserializer(key10));
204         // -- registerMeterBandDeserializer
205         ExperimenterIdDeserializerKey key11
206             = new ExperimenterIdDeserializerKey(EncodeConstants.OF10_VERSION_ID, 42L, MeterBandExperimenterCase.class);
207         provider.registerMeterBandDeserializer(key11, deserializerMeterBandExpCase);
208         Assert.assertTrue("Wrong -- unregister MeterBandDeserializer", provider.unregisterDeserializer(key11));
209         Assert.assertFalse("Wrong -- unregister MeterBandDeserializer by not existing key", provider.unregisterDeserializer(key11));
210         // -- registerExperimenterMessageSerializer
211         ExperimenterIdSerializerKey<ExperimenterDataOfChoice> key12
212                 = new ExperimenterIdSerializerKey<>(EncodeConstants.OF10_VERSION_ID, 42L, ExperimenterDataOfChoice.class);
213         provider.registerExperimenterMessageSerializer(key12, serializerExperimenterInput);
214         Assert.assertTrue("Wrong -- unregister ExperimenterMessageSerializer", provider.unregisterSerializer(key12));
215         Assert.assertFalse("Wrong -- unregister ExperimenterMessageSerializer by not existing key", provider.unregisterSerializer(key12));
216         //registerMultipartRequestSerializer
217         ExperimenterIdSerializerKey<ExperimenterDataOfChoice> key13
218                 = new ExperimenterIdSerializerKey<>(EncodeConstants.OF10_VERSION_ID, 42L, ExperimenterDataOfChoice.class);
219         provider.registerMultipartRequestSerializer(key13, serializerMultipartRequestExpCase);
220         Assert.assertTrue("Wrong -- unregister MultipartRequestSerializer", provider.unregisterSerializer(key13));
221         Assert.assertFalse("Wrong -- unregister MultipartRequestSerializer by not existing key", provider.unregisterSerializer(key13));
222         // -- registerMultipartRequestTFSerializer
223         ExperimenterIdSerializerKey<TableFeatureProperties> key14
224             = new ExperimenterIdSerializerKey<>(EncodeConstants.OF10_VERSION_ID,42L,TableFeatureProperties.class);
225         provider.registerMultipartRequestTFSerializer(key14, serializer);
226         Assert.assertTrue("Wrong -- unregister MultipartRequestTFSerializer", provider.unregisterSerializer(key14));
227         Assert.assertFalse("Wrong -- unregister MultipartRequestTFSerializer by not existing key", provider.unregisterSerializer(key14));
228         // -- registerMeterBandSerializer
229         ExperimenterIdSerializerKey<MeterBandExperimenterCase> key15
230             = new ExperimenterIdSerializerKey<>(EncodeConstants.OF10_VERSION_ID,42L,MeterBandExperimenterCase.class);
231         provider.registerMeterBandSerializer(key15, serializerMeterBandExpCase);
232         Assert.assertTrue("Wrong -- unregister MeterBandSerializer", provider.unregisterSerializer(key15));
233         Assert.assertFalse("Wrong -- unregister MeterBandSerializer by not existing key", provider.unregisterSerializer(key15));
234         // -- registerMatchEntrySerializer
235         MatchEntrySerializerKey<OpenflowBasicClass, InPort> key16
236             = new MatchEntrySerializerKey<>(EncodeConstants.OF13_VERSION_ID, OpenflowBasicClass.class, InPort.class);
237         provider.registerMatchEntrySerializer(key16, serializer);
238         Assert.assertTrue("Wrong -- unregister MatchEntrySerializer", provider.unregisterSerializer(key16));
239         Assert.assertFalse("Wrong -- unregister MatchEntrySerializer by not existing key", provider.unregisterSerializer(key15));
240     }
241
242     private static class TestSubType extends ExperimenterActionSubType {
243         // empty class - only used in test for comparation
244     }
245 }