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