blob: 546656806ac429ba6a52fa51c863ca183f182e26 [file] [log] [blame]
Hyunsun Moonf5b21532016-10-25 15:45:41 -07001/*
Brian O'Connor80dff972017-08-03 22:46:30 -07002 * Copyright 2016-present Open Networking Foundation
Hyunsun Moonf5b21532016-10-25 15:45:41 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.opencord.cordvtn.codec;
17
18import com.fasterxml.jackson.databind.JsonNode;
Hyunsun Moonaf3822c2017-04-04 15:56:27 +090019import com.fasterxml.jackson.databind.node.ArrayNode;
Hyunsun Moonf5b21532016-10-25 15:45:41 -070020import com.fasterxml.jackson.databind.node.NullNode;
21import com.fasterxml.jackson.databind.node.ObjectNode;
Hyunsun Moonf5b21532016-10-25 15:45:41 -070022import org.junit.Before;
Hyunsun Moonf5b21532016-10-25 15:45:41 -070023import org.junit.Test;
Hyunsun Moonaf3822c2017-04-04 15:56:27 +090024import org.onlab.packet.IpAddress;
25import org.onlab.packet.IpPrefix;
Hyunsun Moonf5b21532016-10-25 15:45:41 -070026import org.onosproject.codec.JsonCodec;
27import org.opencord.cordvtn.api.net.NetworkId;
Hyunsun Moonaf3822c2017-04-04 15:56:27 +090028import org.opencord.cordvtn.api.net.SegmentId;
Hyunsun Moonf5b21532016-10-25 15:45:41 -070029import org.opencord.cordvtn.api.net.ServiceNetwork;
Hyunsun Moon187bf532017-01-19 10:57:40 +090030import org.opencord.cordvtn.api.net.ServiceNetwork.DependencyType;
31import org.opencord.cordvtn.impl.DefaultServiceNetwork;
Hyunsun Moonf5b21532016-10-25 15:45:41 -070032
33import java.io.IOException;
34import java.io.InputStream;
Hyunsun Moon187bf532017-01-19 10:57:40 +090035import java.util.HashMap;
36import java.util.Map;
Hyunsun Moonf5b21532016-10-25 15:45:41 -070037
38import static org.hamcrest.MatcherAssert.assertThat;
39import static org.hamcrest.Matchers.is;
40import static org.hamcrest.Matchers.notNullValue;
Hyunsun Moon187bf532017-01-19 10:57:40 +090041import static org.opencord.cordvtn.api.net.ServiceNetwork.DependencyType.BIDIRECTIONAL;
Hyunsun Moon187bf532017-01-19 10:57:40 +090042import static org.opencord.cordvtn.api.net.ServiceNetwork.NetworkType.PRIVATE;
Hyunsun Moonf5b21532016-10-25 15:45:41 -070043import static org.opencord.cordvtn.codec.ServiceNetworkJsonMatcher.matchesServiceNetwork;
44
45/**
46 * Unit tests for ServiceNetwork codec.
47 */
48public final class ServiceNetworkCodecTest {
49 private static final String SERVICE_NETWORK = "serviceNetwork";
50 private static final String ID = "id";
Hyunsun Moon187bf532017-01-19 10:57:40 +090051 private static final String NAME = "name";
Hyunsun Moonf5b21532016-10-25 15:45:41 -070052 private static final String TYPE = "type";
Hyunsun Moon187bf532017-01-19 10:57:40 +090053 private static final String PROVIDERS = "providers";
Hyunsun Moonaf3822c2017-04-04 15:56:27 +090054 private static final String SEGMENT_ID = "segment_id";
55 private static final String SUBNET = "subnet";
56 private static final String SERVICE_IP = "service_ip";
57 private static final String DEP_TYPE = "bidirectional";
Hyunsun Moonf5b21532016-10-25 15:45:41 -070058
Hyunsun Moonaf3822c2017-04-04 15:56:27 +090059 private static final String NAME_1 = "network_1";
60 private static final NetworkId ID_1 = NetworkId.of("network_1");
61 private static final NetworkId PROVIDER_ID_1 = NetworkId.of("provider_1");
62 private static final SegmentId SEGMENT_ID_1 = SegmentId.of(1L);
63 private static final IpPrefix SUBNET_1 = IpPrefix.valueOf("192.168.0.0/24");
64 private static final IpAddress SERVICE_IP_1 = IpAddress.valueOf("192.168.0.1");
65
66 private static final Map<NetworkId, DependencyType> PROVIDER_1 =
Hyunsun Moon187bf532017-01-19 10:57:40 +090067 new HashMap<NetworkId, DependencyType>() {
68 {
Hyunsun Moonaf3822c2017-04-04 15:56:27 +090069 put(NetworkId.of("provider_1"), BIDIRECTIONAL);
Hyunsun Moon187bf532017-01-19 10:57:40 +090070 }
71 };
Hyunsun Moonf5b21532016-10-25 15:45:41 -070072
Hyunsun Moonaf3822c2017-04-04 15:56:27 +090073 private static final ServiceNetwork NETWORK_1 = DefaultServiceNetwork.builder()
74 .id(ID_1)
75 .name(NAME_1)
Hyunsun Moon187bf532017-01-19 10:57:40 +090076 .type(PRIVATE)
Hyunsun Moonaf3822c2017-04-04 15:56:27 +090077 .segmentId(SEGMENT_ID_1)
78 .subnet(SUBNET_1)
79 .serviceIp(SERVICE_IP_1)
80 .providers(PROVIDER_1)
Hyunsun Moon187bf532017-01-19 10:57:40 +090081 .build();
Hyunsun Moonf5b21532016-10-25 15:45:41 -070082
Hyunsun Moonf5b21532016-10-25 15:45:41 -070083 private JsonCodec<ServiceNetwork> codec;
84 private MockCodecContext context;
85
86 /**
87 * Sets up for each test.
88 * Creates a context and fetches the ServiceNetwork codec.
89 */
90 @Before
91 public void setUp() {
92 context = new MockCodecContext();
93 codec = context.codec(ServiceNetwork.class);
94 assertThat(codec, notNullValue());
95 }
96
Hyunsun Moonaf3822c2017-04-04 15:56:27 +090097 /**
98 * Checks if encoding service network works properly.
99 */
Hyunsun Moonf5b21532016-10-25 15:45:41 -0700100 @Test
101 public void testServiceNetworkEncode() {
Hyunsun Moonaf3822c2017-04-04 15:56:27 +0900102 ObjectNode networkJson = codec.encode(NETWORK_1, context);
Hyunsun Moonf5b21532016-10-25 15:45:41 -0700103 assertThat(networkJson, notNullValue());
Hyunsun Moonaf3822c2017-04-04 15:56:27 +0900104 assertThat(networkJson, matchesServiceNetwork(NETWORK_1));
Hyunsun Moonf5b21532016-10-25 15:45:41 -0700105 }
106
Hyunsun Moonaf3822c2017-04-04 15:56:27 +0900107 /**
108 * Checks if decoding service network works properly.
109 */
Hyunsun Moonf5b21532016-10-25 15:45:41 -0700110 @Test
111 public void testServiceNetworkDecode() throws IOException {
Hyunsun Moonaf3822c2017-04-04 15:56:27 +0900112 ServiceNetwork sNet = getServiceNetwork("service-network.json");
113 assertThat(sNet.id(), is(ID_1));
114 assertThat(sNet.name(), is(NAME_1));
115 assertThat(sNet.type(), is(PRIVATE));
116 assertThat(sNet.providers(), is(PROVIDER_1));
Hyunsun Moonf5b21532016-10-25 15:45:41 -0700117 }
118
Hyunsun Moonaf3822c2017-04-04 15:56:27 +0900119 /**
120 * Checks if decoding service network without ID fails.
121 */
122 @Test(expected = IllegalArgumentException.class)
123 public void testServiceNetworkDecodeMissingId() {
Hyunsun Moonf5b21532016-10-25 15:45:41 -0700124 final JsonNode jsonMissingId = context.mapper().createObjectNode()
Hyunsun Moonaf3822c2017-04-04 15:56:27 +0900125 .put(NAME, NAME_1)
Hyunsun Moonf5b21532016-10-25 15:45:41 -0700126 .put(TYPE, PRIVATE.name())
Hyunsun Moonaf3822c2017-04-04 15:56:27 +0900127 .put(SEGMENT_ID, SEGMENT_ID_1.id())
128 .put(SUBNET, SUBNET_1.toString())
129 .put(SERVICE_IP, SERVICE_IP_1.toString());
Hyunsun Moonf5b21532016-10-25 15:45:41 -0700130 codec.decode((ObjectNode) jsonMissingId, context);
131 }
132
Hyunsun Moonaf3822c2017-04-04 15:56:27 +0900133 /**
134 * Checks if decoding service network with empty ID fails.
135 */
136 @Test(expected = IllegalArgumentException.class)
137 public void testServiceNetworkDecodeEmptyId() {
Hyunsun Moonf5b21532016-10-25 15:45:41 -0700138 final JsonNode jsonEmptyId = context.mapper().createObjectNode()
139 .put(ID, "")
Hyunsun Moonaf3822c2017-04-04 15:56:27 +0900140 .put(NAME, NAME_1)
Hyunsun Moonf5b21532016-10-25 15:45:41 -0700141 .put(TYPE, PRIVATE.name())
Hyunsun Moonaf3822c2017-04-04 15:56:27 +0900142 .put(SEGMENT_ID, SEGMENT_ID_1.id())
143 .put(SUBNET, SUBNET_1.toString())
144 .put(SERVICE_IP, SERVICE_IP_1.toString());
Hyunsun Moonf5b21532016-10-25 15:45:41 -0700145 codec.decode((ObjectNode) jsonEmptyId, context);
146 }
147
Hyunsun Moonaf3822c2017-04-04 15:56:27 +0900148 /**
149 * Checks if decoding service network with null ID fails.
150 */
151 @Test(expected = IllegalArgumentException.class)
152 public void testServiceNetworkDecodeNullId() {
Hyunsun Moonf5b21532016-10-25 15:45:41 -0700153 final JsonNode jsonNullId = context.mapper().createObjectNode()
Hyunsun Moonaf3822c2017-04-04 15:56:27 +0900154 .put(NAME, NAME_1)
Hyunsun Moonf5b21532016-10-25 15:45:41 -0700155 .put(TYPE, PRIVATE.name())
Hyunsun Moonaf3822c2017-04-04 15:56:27 +0900156 .put(SEGMENT_ID, SEGMENT_ID_1.id())
157 .put(SUBNET, SUBNET_1.toString())
158 .put(SERVICE_IP, SERVICE_IP_1.toString())
Hyunsun Moonf5b21532016-10-25 15:45:41 -0700159 .set(ID, NullNode.getInstance());
Hyunsun Moonf5b21532016-10-25 15:45:41 -0700160 codec.decode((ObjectNode) jsonNullId, context);
161 }
162
Hyunsun Moonaf3822c2017-04-04 15:56:27 +0900163 /**
164 * Checks if decoding service network with invalid type fails.
165 */
166 @Test(expected = IllegalArgumentException.class)
167 public void testServiceNetworkDecodeInvalidType() {
168 final JsonNode jsonInvalidType = context.mapper().createObjectNode()
169 .put(ID, ID_1.id())
170 .put(NAME, NAME_1)
171 .put(TYPE, "type")
172 .put(SEGMENT_ID, SEGMENT_ID_1.id())
173 .put(SUBNET, SUBNET_1.toString())
174 .put(SERVICE_IP, SERVICE_IP_1.toString());
175 codec.decode((ObjectNode) jsonInvalidType, context);
Hyunsun Moonf5b21532016-10-25 15:45:41 -0700176 }
177
Hyunsun Moonaf3822c2017-04-04 15:56:27 +0900178 /**
179 * Checks if decoding service network with null type fails.
180 */
181 @Test(expected = IllegalArgumentException.class)
182 public void testServiceNetworkDecodeNullType() {
183 final JsonNode jsonNullType = context.mapper().createObjectNode()
184 .put(ID, ID_1.id())
185 .put(NAME, NAME_1)
186 .put(SEGMENT_ID, SEGMENT_ID_1.id())
187 .put(SUBNET, SUBNET_1.toString())
188 .put(SERVICE_IP, SERVICE_IP_1.toString())
189 .set(TYPE, NullNode.getInstance());
190 codec.decode((ObjectNode) jsonNullType, context);
191 }
192
193 /**
194 * Checks if decoding service network with invalid segment ID fails.
195 */
196 @Test(expected = IllegalArgumentException.class)
197 public void testServiceNetworkDecodeInvalidSegmentId() {
198 final JsonNode jsonInvalidSeg = context.mapper().createObjectNode()
199 .put(ID, ID_1.id())
200 .put(NAME, NAME_1)
Hyunsun Moonf5b21532016-10-25 15:45:41 -0700201 .put(TYPE, PRIVATE.name())
Hyunsun Moonaf3822c2017-04-04 15:56:27 +0900202 .put(SEGMENT_ID, "segmentId")
203 .put(SUBNET, SUBNET_1.toString())
204 .put(SERVICE_IP, SERVICE_IP_1.toString());
205 codec.decode((ObjectNode) jsonInvalidSeg, context);
206 }
207
208 /**
209 * Checks if decoding service network with 0 segment ID fails.
210 */
211 @Test(expected = IllegalArgumentException.class)
212 public void testServiceNetworkDecodeZeroSegmentId() {
213 final JsonNode jsonInvalidSeg = context.mapper().createObjectNode()
214 .put(ID, ID_1.id())
215 .put(NAME, NAME_1)
216 .put(TYPE, PRIVATE.name())
217 .put(SEGMENT_ID, 0)
218 .put(SUBNET, SUBNET_1.toString())
219 .put(SERVICE_IP, SERVICE_IP_1.toString());
220 codec.decode((ObjectNode) jsonInvalidSeg, context);
221 }
222
223 /**
224 * Checks if decoding service network with 0 segment ID fails.
225 */
226 @Test(expected = IllegalArgumentException.class)
227 public void testServiceNetworkDecodeNullSegmentId() {
228 final JsonNode jsonInvalidSeg = context.mapper().createObjectNode()
229 .put(ID, ID_1.id())
230 .put(NAME, NAME_1)
231 .put(TYPE, PRIVATE.name())
232 .put(SUBNET, SUBNET_1.toString())
233 .put(SERVICE_IP, SERVICE_IP_1.toString())
234 .set(SEGMENT_ID, NullNode.getInstance());
235 codec.decode((ObjectNode) jsonInvalidSeg, context);
236 }
237
238 /**
239 * Checks if decoding service network with invalid subnet fails.
240 */
241 @Test(expected = IllegalArgumentException.class)
242 public void testServiceNetworkDecodeInvalidSubnet() {
243 final JsonNode jsonInvalidSubnet = context.mapper().createObjectNode()
244 .put(ID, ID_1.id())
245 .put(NAME, NAME_1)
246 .put(TYPE, PRIVATE.name())
247 .put(SEGMENT_ID, SEGMENT_ID_1.id())
248 .put(SUBNET, "")
249 .put(SERVICE_IP, SERVICE_IP_1.toString());
250 codec.decode((ObjectNode) jsonInvalidSubnet, context);
251 }
252
253 /**
254 * Checks if decoding service network with invalid subnet fails.
255 */
256 @Test(expected = IllegalArgumentException.class)
257 public void testServiceNetworkDecodeNullSubnet() {
258 final JsonNode jsonInvalidSubnet = context.mapper().createObjectNode()
259 .put(ID, ID_1.id())
260 .put(NAME, NAME_1)
261 .put(TYPE, PRIVATE.name())
262 .put(SEGMENT_ID, SEGMENT_ID_1.id())
263 .put(SERVICE_IP, SERVICE_IP_1.toString())
264 .set(SUBNET, NullNode.getInstance());
265 codec.decode((ObjectNode) jsonInvalidSubnet, context);
266 }
267
268 /**
269 * Checks if decoding service network with invalid service IP fails.
270 */
271 @Test(expected = IllegalArgumentException.class)
272 public void testServiceNetworkDecodeInvalidServiceIp() {
273 final JsonNode jsonInvalidServiceIp = context.mapper().createObjectNode()
274 .put(ID, ID_1.id())
275 .put(NAME, NAME_1)
276 .put(TYPE, PRIVATE.name())
277 .put(SEGMENT_ID, SEGMENT_ID_1.id())
278 .put(SUBNET, SUBNET_1.toString())
279 .put(SERVICE_IP, "");
280 codec.decode((ObjectNode) jsonInvalidServiceIp, context);
281 }
282
283 /**
284 * Checks if decoding service network with null service IP fails.
285 */
286 @Test(expected = IllegalArgumentException.class)
287 public void testServiceNetworkDecodeNullServiceIp() {
288 final JsonNode jsonInvalidServiceIp = context.mapper().createObjectNode()
289 .put(ID, ID_1.id())
290 .put(NAME, NAME_1)
291 .put(TYPE, PRIVATE.name())
292 .put(SEGMENT_ID, SEGMENT_ID_1.id())
293 .put(SUBNET, SUBNET_1.toString())
294 .set(SERVICE_IP, NullNode.getInstance());
295 codec.decode((ObjectNode) jsonInvalidServiceIp, context);
296 }
297
298 /**
299 * Checks if decoding service network with null and empty providers allowed.
300 */
301 @Test
302 public void testServiceNetworkDecodeNullAndEmptyProviders() {
303 JsonNode jsonInvalidProvider = context.mapper().createObjectNode()
304 .put(ID, ID_1.id())
305 .put(NAME, NAME_1)
306 .put(TYPE, PRIVATE.name())
307 .put(SEGMENT_ID, SEGMENT_ID_1.id())
308 .put(SUBNET, SUBNET_1.toString())
309 .put(SERVICE_IP, SERVICE_IP_1.toString())
310 .set(PROVIDERS, NullNode.getInstance());
311 codec.decode((ObjectNode) jsonInvalidProvider, context);
312
313 jsonInvalidProvider = context.mapper().createObjectNode()
314 .put(ID, ID_1.id())
315 .put(NAME, NAME_1)
316 .put(TYPE, PRIVATE.name())
317 .put(SEGMENT_ID, SEGMENT_ID_1.id())
318 .put(SUBNET, SUBNET_1.toString())
319 .put(SERVICE_IP, SERVICE_IP_1.toString())
320 .set(PROVIDERS, context.mapper().createArrayNode());
321 codec.decode((ObjectNode) jsonInvalidProvider, context);
322 }
323
324 /**
325 * Checks if decoding service network with non-array providers value fails.
326 */
327 @Test(expected = IllegalArgumentException.class)
328 public void testServiceNetworkNonArrayProviders() {
329 final JsonNode jsonProvider = context.mapper().createObjectNode()
330 .put(ID, PROVIDER_ID_1.id())
331 .put(DEP_TYPE, true);
332 final JsonNode jsonInvalidProvider = context.mapper().createObjectNode()
333 .put(ID, ID_1.id())
334 .put(NAME, NAME_1)
335 .put(TYPE, PRIVATE.name())
336 .put(SEGMENT_ID, SEGMENT_ID_1.id())
337 .put(SUBNET, SUBNET_1.toString())
338 .put(SERVICE_IP, SERVICE_IP_1.toString())
339 .set(PROVIDERS, jsonProvider);
340 codec.decode((ObjectNode) jsonInvalidProvider, context);
341 }
342
343 /**
344 * Checks if decoding service network with invalid provider fails.
345 */
346 @Test(expected = IllegalArgumentException.class)
347 public void testServiceNetworkMissingProviderId() {
348 final ArrayNode jsonProviders = context.mapper().createArrayNode();
349 final JsonNode jsonProvider = context.mapper().createObjectNode()
350 .put(DEP_TYPE, true);
351 jsonProviders.add(jsonProvider);
352 final JsonNode jsonInvalidProvider = context.mapper().createObjectNode()
353 .put(ID, ID_1.id())
354 .put(NAME, NAME_1)
355 .put(TYPE, PRIVATE.name())
356 .put(SEGMENT_ID, SEGMENT_ID_1.id())
357 .put(SUBNET, SUBNET_1.toString())
358 .put(SERVICE_IP, SERVICE_IP_1.toString())
359 .set(PROVIDERS, jsonProvider);
360 codec.decode((ObjectNode) jsonInvalidProvider, context);
361 }
362
363 /**
364 * Checks if decoding service network with invalid provider fails.
365 */
366 @Test(expected = IllegalArgumentException.class)
367 public void testServiceNetworkMissingProviderType() {
368 final ArrayNode jsonProviders = context.mapper().createArrayNode();
369 final JsonNode jsonProvider = context.mapper().createObjectNode()
370 .put(ID, PROVIDER_ID_1.id());
371 jsonProviders.add(jsonProvider);
372 final JsonNode jsonInvalidProvider = context.mapper().createObjectNode()
373 .put(ID, ID_1.id())
374 .put(NAME, NAME_1)
375 .put(TYPE, PRIVATE.name())
376 .put(SEGMENT_ID, SEGMENT_ID_1.id())
377 .put(SUBNET, SUBNET_1.toString())
378 .put(SERVICE_IP, SERVICE_IP_1.toString())
379 .set(PROVIDERS, jsonProvider);
380 codec.decode((ObjectNode) jsonInvalidProvider, context);
381 }
382
383 /**
384 * Checks if decoding service network with invalid provider fails.
385 */
386 @Test(expected = IllegalArgumentException.class)
387 public void testServiceNetworkNullProviderId() {
388 final ArrayNode jsonProviders = context.mapper().createArrayNode();
389 final JsonNode jsonProvider = context.mapper().createObjectNode()
390 .put(DEP_TYPE, true)
391 .set(ID, NullNode.getInstance());
392 jsonProviders.add(jsonProvider);
393 final JsonNode jsonInvalidProvider = context.mapper().createObjectNode()
394 .put(ID, ID_1.id())
395 .put(NAME, NAME_1)
396 .put(TYPE, PRIVATE.name())
397 .put(SEGMENT_ID, SEGMENT_ID_1.id())
398 .put(SUBNET, SUBNET_1.toString())
399 .put(SERVICE_IP, SERVICE_IP_1.toString())
400 .set(PROVIDERS, jsonProvider);
401 codec.decode((ObjectNode) jsonInvalidProvider, context);
402 }
403
404 /**
405 * Checks if decoding service network with invalid provider fails.
406 */
407 @Test(expected = IllegalArgumentException.class)
408 public void testServiceNetworkNullProviderType() {
409 final ArrayNode jsonProviders = context.mapper().createArrayNode();
410 final JsonNode jsonProvider = context.mapper().createObjectNode()
411 .put(ID, PROVIDER_ID_1.id())
412 .set(DEP_TYPE, NullNode.getInstance());
413 jsonProviders.add(jsonProvider);
414 final JsonNode jsonInvalidProvider = context.mapper().createObjectNode()
415 .put(ID, ID_1.id())
416 .put(NAME, NAME_1)
417 .put(TYPE, PRIVATE.name())
418 .put(SEGMENT_ID, SEGMENT_ID_1.id())
419 .put(SUBNET, SUBNET_1.toString())
420 .put(SERVICE_IP, SERVICE_IP_1.toString())
421 .set(PROVIDERS, jsonProvider);
422 codec.decode((ObjectNode) jsonInvalidProvider, context);
Hyunsun Moonf5b21532016-10-25 15:45:41 -0700423 }
424
425 private ServiceNetwork getServiceNetwork(String resource) throws IOException {
426 InputStream jsonStream = ServiceNetworkCodecTest.class.getResourceAsStream(resource);
427 JsonNode jsonNode = context.mapper().readTree(jsonStream).get(SERVICE_NETWORK);
428 assertThat(jsonNode, notNullValue());
429
430 ServiceNetwork snet = codec.decode((ObjectNode) jsonNode, context);
431 assertThat(snet, notNullValue());
432 return snet;
433 }
434}