blob: 285b190a438f21d29c36bc4bbc7c0db0194c57d0 [file] [log] [blame]
Jian Lifeb84802021-01-12 16:34:49 +09001/*
2 * Copyright 2021-present Open Networking Foundation
3 *
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.onosproject.kubevirtnetworking.codec;
17
18import com.fasterxml.jackson.databind.JsonNode;
19import com.fasterxml.jackson.databind.ObjectMapper;
20import com.fasterxml.jackson.databind.node.ObjectNode;
21import com.google.common.collect.ImmutableSet;
22import org.hamcrest.MatcherAssert;
23import org.junit.Before;
24import org.junit.Test;
25import org.onlab.packet.IpAddress;
26import org.onlab.packet.IpPrefix;
27import org.onosproject.codec.CodecContext;
28import org.onosproject.codec.JsonCodec;
29import org.onosproject.codec.impl.CodecManager;
30import org.onosproject.core.CoreService;
31import org.onosproject.kubevirtnetworking.api.DefaultKubevirtNetwork;
32import org.onosproject.kubevirtnetworking.api.KubevirtHostRoute;
33import org.onosproject.kubevirtnetworking.api.KubevirtIpPool;
34import org.onosproject.kubevirtnetworking.api.KubevirtNetwork;
35
36import java.io.IOException;
37import java.io.InputStream;
38import java.util.HashMap;
39import java.util.Map;
40
41import static org.easymock.EasyMock.createMock;
42import static org.easymock.EasyMock.expect;
43import static org.easymock.EasyMock.replay;
44import static org.hamcrest.MatcherAssert.assertThat;
45import static org.hamcrest.Matchers.is;
46import static org.hamcrest.Matchers.notNullValue;
47import static org.onosproject.kubevirtnetworking.codec.KubevirtNetworkJsonMatcher.matchesKubevirtNetwork;
48import static org.onosproject.net.NetTestTools.APP_ID;
49
50/**
51 * Unit tests for KubevirtNetwork codec.
52 */
53public final class KubevirtNetworkCodecTest {
54
55 MockCodecContext context;
56
57 JsonCodec<KubevirtNetwork> kubevirtNetworkCodec;
58 JsonCodec<KubevirtHostRoute> kubevirtHostRouteCodec;
59 JsonCodec<KubevirtIpPool> kubevirtIpPoolCodec;
60
61 final CoreService mockCoreService = createMock(CoreService.class);
62 private static final String REST_APP_ID = "org.onosproject.rest";
63
64 @Before
65 public void setUp() {
66 context = new MockCodecContext();
67 kubevirtNetworkCodec = new KubevirtNetworkCodec();
68 kubevirtHostRouteCodec = new KubevirtHostRouteCodec();
69 kubevirtIpPoolCodec = new KubevirtIpPoolCodec();
70
71 assertThat(kubevirtNetworkCodec, notNullValue());
72 assertThat(kubevirtHostRouteCodec, notNullValue());
73 assertThat(kubevirtIpPoolCodec, notNullValue());
74
75 expect(mockCoreService.registerApplication(REST_APP_ID))
76 .andReturn(APP_ID).anyTimes();
77 replay(mockCoreService);
78 context.registerService(CoreService.class, mockCoreService);
79 }
80
81 /**
82 * Tests the kubevirt network encoding.
83 */
84 @Test
85 public void testKubevirtNetworkEncode() {
86 KubevirtHostRoute hostRoute1 = new KubevirtHostRoute(IpPrefix.valueOf("10.10.10.0/24"),
87 IpAddress.valueOf("20.20.20.1"));
88 KubevirtHostRoute hostRoute2 = new KubevirtHostRoute(IpPrefix.valueOf("20.20.20.0/24"),
89 IpAddress.valueOf("10.10.10.1"));
90
91 KubevirtIpPool ipPool = new KubevirtIpPool(IpAddress.valueOf("10.10.10.100"),
92 IpAddress.valueOf("10.10.10.200"));
93
94 KubevirtNetwork network = DefaultKubevirtNetwork.builder()
95 .networkId("net-1")
96 .name("net-1")
97 .type(KubevirtNetwork.Type.FLAT)
98 .gatewayIp(IpAddress.valueOf("10.10.10.1"))
99 .mtu(1500)
100 .cidr("10.10.10.0/24")
101 .hostRoutes(ImmutableSet.of(hostRoute1, hostRoute2))
102 .ipPool(ipPool)
103 .build();
104
105 ObjectNode networkJson = kubevirtNetworkCodec.encode(network, context);
106 assertThat(networkJson, matchesKubevirtNetwork(network));
107 }
108
109 /**
110 * Tests the kubevirt network decoding.
111 *
112 * @throws IOException io exception
113 */
114 @Test
115 public void testKubevirtNetworkDecode() throws IOException {
116 KubevirtNetwork network = getKubevirtNetwork("KubevirtNetwork.json");
117
118 assertThat(network.networkId(), is("network-1"));
119 assertThat(network.name(), is("network-1"));
120 assertThat(network.type().name(), is("FLAT"));
121 assertThat(network.cidr(), is("10.10.0.0/24"));
122 assertThat(network.gatewayIp().toString(), is("10.10.0.1"));
123 assertThat(network.ipPool().start().toString(), is("10.10.10.100"));
124 assertThat(network.ipPool().end().toString(), is("10.10.10.200"));
125 }
126
127 private KubevirtNetwork getKubevirtNetwork(String resourceName) throws IOException {
128 InputStream jsonStream = KubevirtNetworkCodecTest.class.getResourceAsStream(resourceName);
129 JsonNode json = context.mapper().readTree(jsonStream);
130 MatcherAssert.assertThat(json, notNullValue());
131 KubevirtNetwork network = kubevirtNetworkCodec.decode((ObjectNode) json, context);
132 assertThat(network, notNullValue());
133 return network;
134 }
135
136 private class MockCodecContext implements CodecContext {
137
138 private final ObjectMapper mapper = new ObjectMapper();
139 private final CodecManager manager = new CodecManager();
140 private final Map<Class<?>, Object> services = new HashMap<>();
141
142 /**
143 * Constructs a new mock codec context.
144 */
145 public MockCodecContext() {
146 manager.activate();
147 }
148
149 @Override
150 public ObjectMapper mapper() {
151 return mapper;
152 }
153
154 @Override
155 public <T> JsonCodec<T> codec(Class<T> entityClass) {
156 if (entityClass == KubevirtHostRoute.class) {
157 return (JsonCodec<T>) kubevirtHostRouteCodec;
158 }
159
160 if (entityClass == KubevirtIpPool.class) {
161 return (JsonCodec<T>) kubevirtIpPoolCodec;
162 }
163
164 return manager.getCodec(entityClass);
165 }
166
167 @Override
168 public <T> T getService(Class<T> serviceClass) {
169 return (T) services.get(serviceClass);
170 }
171
172 // for registering mock services
173 public <T> void registerService(Class<T> serviceClass, T impl) {
174 services.put(serviceClass, impl);
175 }
176 }
177}