blob: a0a6c041efb169b15830180594c8b0aba5c6253a [file] [log] [blame]
Andrea Campanellabc112a92017-06-26 19:06:43 +02001/*
2 * Copyright 2017-present Open Networking Laboratory
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 */
16
17package org.onosproject.net.pi.impl;
18
19import com.fasterxml.jackson.databind.JsonNode;
20import com.fasterxml.jackson.databind.ObjectMapper;
21import com.google.common.collect.ImmutableList;
22import com.google.common.collect.ImmutableSet;
23import org.junit.Before;
24import org.junit.Test;
25import org.onlab.util.ItemNotFoundException;
Carmelo Cascone07d72712017-07-14 15:57:47 -040026import org.onosproject.bmv2.model.Bmv2PipelineModelParser;
Andrea Campanellabc112a92017-06-26 19:06:43 +020027import org.onosproject.net.DeviceId;
28import org.onosproject.net.behaviour.Pipeliner;
29import org.onosproject.net.behaviour.PipelinerAdapter;
30import org.onosproject.net.config.Config;
31import org.onosproject.net.config.ConfigApplyDelegate;
32import org.onosproject.net.config.ConfigFactory;
33import org.onosproject.net.config.NetworkConfigListener;
34import org.onosproject.net.config.NetworkConfigRegistry;
35import org.onosproject.net.config.NetworkConfigRegistryAdapter;
36import org.onosproject.net.config.basics.BasicDeviceConfig;
37import org.onosproject.net.device.DeviceDescription;
38import org.onosproject.net.device.DeviceDescriptionDiscovery;
39import org.onosproject.net.device.PortDescription;
40import org.onosproject.net.driver.AbstractHandlerBehaviour;
41import org.onosproject.net.driver.Behaviour;
42import org.onosproject.net.driver.Driver;
43import org.onosproject.net.driver.DriverAdapter;
44import org.onosproject.net.driver.DriverAdminService;
45import org.onosproject.net.driver.DriverAdminServiceAdapter;
46import org.onosproject.net.driver.DriverProvider;
47import org.onosproject.net.driver.DriverService;
48import org.onosproject.net.driver.DriverServiceAdapter;
Carmelo Cascone07d72712017-07-14 15:57:47 -040049import org.onosproject.net.pi.model.DefaultPiPipeconf;
50import org.onosproject.net.pi.model.PiPipeconf;
Andrea Campanellabc112a92017-06-26 19:06:43 +020051import org.onosproject.net.pi.model.PiPipeconfId;
52import org.onosproject.net.pi.model.PiPipelineInterpreter;
53import org.onosproject.net.pi.runtime.PiPipeconfConfig;
54
55import java.io.IOException;
56import java.io.InputStream;
57import java.util.HashMap;
58import java.util.HashSet;
59import java.util.List;
60import java.util.Map;
61import java.util.Set;
62
Carmelo Cascone07d72712017-07-14 15:57:47 -040063import static org.junit.Assert.*;
Andrea Campanellabc112a92017-06-26 19:06:43 +020064
65
66/**
Andrea Campanella48f99fa2017-07-13 19:06:21 +020067 * Unit Test Class for PiPipeconfManager.
Andrea Campanellabc112a92017-06-26 19:06:43 +020068 */
Andrea Campanella48f99fa2017-07-13 19:06:21 +020069public class PiPipeconfManagerTest {
Andrea Campanellabc112a92017-06-26 19:06:43 +020070
Carmelo Cascone07d72712017-07-14 15:57:47 -040071 private static final String PIPECONF_ID = "org.project.pipeconf.default";
72 private static final String BMV2_JSON_PATH = "/org/onosproject/net/pi/impl/default.json";
73
74 private final InputStream bmv2JsonConfigStream = this.getClass().getResourceAsStream(BMV2_JSON_PATH);
75
Andrea Campanellabc112a92017-06-26 19:06:43 +020076 private static final DeviceId DEVICE_ID = DeviceId.deviceId("test:test");
77 private static final String BASE_DRIVER = "baseDriver";
78 private static final Set<Class<? extends Behaviour>> EXPECTED_BEHAVIOURS =
79 ImmutableSet.of(DeviceDescriptionDiscovery.class, Pipeliner.class, PiPipelineInterpreter.class);
80
81 //Mock util sets and classes
82 private final NetworkConfigRegistry cfgService = new MockNetworkConfigRegistry();
83 private final DriverService driverService = new MockDriverService();
84 private final DriverAdminService driverAdminService = new MockDriverAdminService();
85 private Driver baseDriver = new MockDriver();
86 private String completeDriverName;
87
88 private final Set<ConfigFactory> cfgFactories = new HashSet<>();
89 private final Set<NetworkConfigListener> netCfgListeners = new HashSet<>();
90 private final Set<DriverProvider> providers = new HashSet<>();
91
92 private final PiPipeconfConfig piPipeconfConfig = new PiPipeconfConfig();
Andrea Campanella48f99fa2017-07-13 19:06:21 +020093 private final InputStream jsonStream = PiPipeconfManagerTest.class
Andrea Campanellabc112a92017-06-26 19:06:43 +020094 .getResourceAsStream("/org/onosproject/net/pi/impl/piPipeconfId.json");
95 private final BasicDeviceConfig basicDeviceConfig = new BasicDeviceConfig();
Andrea Campanella48f99fa2017-07-13 19:06:21 +020096 private final InputStream jsonStreamBasic = PiPipeconfManagerTest.class
Andrea Campanellabc112a92017-06-26 19:06:43 +020097 .getResourceAsStream("/org/onosproject/net/pi/impl/basic.json");
98
99
100 //Services
Andrea Campanella48f99fa2017-07-13 19:06:21 +0200101 private PiPipeconfManager piPipeconfService;
Carmelo Cascone07d72712017-07-14 15:57:47 -0400102 private PiPipeconf piPipeconf;
Andrea Campanellabc112a92017-06-26 19:06:43 +0200103
104 @Before
105 public void setUp() throws IOException {
Andrea Campanella48f99fa2017-07-13 19:06:21 +0200106 piPipeconfService = new PiPipeconfManager();
Carmelo Cascone07d72712017-07-14 15:57:47 -0400107 piPipeconf = DefaultPiPipeconf.builder()
108 .withId(new PiPipeconfId(PIPECONF_ID))
109 .withPipelineModel(Bmv2PipelineModelParser.parse(bmv2JsonConfigStream))
110 .addBehaviour(Pipeliner.class, PipelinerAdapter.class)
111 .build();
Andrea Campanellabc112a92017-06-26 19:06:43 +0200112 completeDriverName = BASE_DRIVER + ":" + piPipeconf.id();
Andrea Campanellabc112a92017-06-26 19:06:43 +0200113 piPipeconfService.cfgService = cfgService;
114 piPipeconfService.driverService = driverService;
115 piPipeconfService.driverAdminService = driverAdminService;
116 String key = "piPipeconf";
117 ObjectMapper mapper = new ObjectMapper();
118 JsonNode jsonNode = mapper.readTree(jsonStream);
119 ConfigApplyDelegate delegate = new MockDelegate();
120 piPipeconfConfig.init(DEVICE_ID, key, jsonNode, mapper, delegate);
121 String keyBasic = "basic";
122 JsonNode jsonNodeBasic = mapper.readTree(jsonStreamBasic);
123 basicDeviceConfig.init(DEVICE_ID, keyBasic, jsonNodeBasic, mapper, delegate);
124 piPipeconfService.activate();
125 }
126
127 @Test
128 public void activate() {
129 assertEquals("Incorrect driver service", driverService, piPipeconfService.driverService);
130 assertEquals("Incorrect driverAdminService service", driverAdminService, piPipeconfService.driverAdminService);
131 assertEquals("Incorrect configuration service", cfgService, piPipeconfService.cfgService);
132 assertTrue("Incorrect config factory", cfgFactories.contains(piPipeconfService.factory));
133 assertTrue("Incorrect network configuration listener", netCfgListeners.contains(piPipeconfService.cfgListener));
134 }
135
136 @Test
137 public void deactivate() {
138 piPipeconfService.deactivate();
139 assertEquals("Incorrect driver service", null, piPipeconfService.driverService);
140 assertEquals("Incorrect driverAdminService service", null, piPipeconfService.driverAdminService);
141 assertEquals("Incorrect configuration service", null, piPipeconfService.cfgService);
142 assertFalse("Config factory should be unregistered", cfgFactories.contains(piPipeconfService.factory));
143 assertFalse("Network configuration listener should be unregistered",
Carmelo Cascone07d72712017-07-14 15:57:47 -0400144 netCfgListeners.contains(piPipeconfService.cfgListener));
Andrea Campanellabc112a92017-06-26 19:06:43 +0200145 }
146
147 @Test
148 public void register() {
149 piPipeconfService.register(piPipeconf);
150 assertTrue("PiPipeconf should be registered", piPipeconfService.piPipeconfs.contains(piPipeconf));
151 }
152
153 @Test
154 public void getPipeconf() {
155 piPipeconfService.register(piPipeconf);
156 assertEquals("Returned PiPipeconf is not correct", piPipeconf,
Carmelo Cascone07d72712017-07-14 15:57:47 -0400157 piPipeconfService.getPipeconf(piPipeconf.id()).get());
Andrea Campanellabc112a92017-06-26 19:06:43 +0200158 }
159
160
161 @Test
162 public void bindToDevice() throws Exception {
163 PiPipeconfId piPipeconfId = cfgService.getConfig(DEVICE_ID, PiPipeconfConfig.class).piPipeconfId();
164 assertEquals(piPipeconf.id(), piPipeconfId);
165
166 String baseDriverName = cfgService.getConfig(DEVICE_ID, BasicDeviceConfig.class).driver();
167 assertEquals(BASE_DRIVER, baseDriverName);
168
169 piPipeconfService.register(piPipeconf);
170 assertEquals("Returned PiPipeconf is not correct", piPipeconf,
Carmelo Cascone07d72712017-07-14 15:57:47 -0400171 piPipeconfService.getPipeconf(piPipeconf.id()).get());
Andrea Campanellabc112a92017-06-26 19:06:43 +0200172
173 piPipeconfService.bindToDevice(piPipeconfId, DEVICE_ID).whenComplete((booleanResult, ex) -> {
174
175 //we assume that the provider is 1 and that it contains 1 driver
176 //we also assume that everything after driverAdminService.registerProvider(provider); has been tested.
177 assertTrue("Provider should be registered", providers.size() != 0);
178
179 assertTrue("Boolean Result of method should be True", booleanResult);
180
181 providers.forEach(p -> {
182 assertTrue("Provider should contain a driver", p.getDrivers().size() != 0);
183 p.getDrivers().forEach(driver -> {
184 assertEquals("The driver has wrong name", driver.name(), completeDriverName);
185 assertEquals("The driver contains wrong behaviours", EXPECTED_BEHAVIOURS, driver.behaviours());
186
187 });
188 });
189 }).exceptionally(ex -> {
190 throw new IllegalStateException(ex);
191 });
192 }
193
194 private class MockNetworkConfigRegistry extends NetworkConfigRegistryAdapter {
195 @Override
196 public void registerConfigFactory(ConfigFactory configFactory) {
197 cfgFactories.add(configFactory);
198 }
199
200 @Override
201 public void unregisterConfigFactory(ConfigFactory configFactory) {
202 cfgFactories.remove(configFactory);
203 }
204
205 @Override
206 public void addListener(NetworkConfigListener listener) {
207 netCfgListeners.add(listener);
208 }
209
210 @Override
211 public void removeListener(NetworkConfigListener listener) {
212 netCfgListeners.remove(listener);
213 }
214
215 @Override
216 public <S, C extends Config<S>> C getConfig(S subject, Class<C> configClass) {
217 DeviceId did = (DeviceId) subject;
218 if (configClass.equals(PiPipeconfConfig.class)
219 && did.equals(DEVICE_ID)) {
220 return (C) piPipeconfConfig;
221 } else if (configClass.equals(BasicDeviceConfig.class)
222 && did.equals(DEVICE_ID)) {
223 return (C) basicDeviceConfig;
224 }
225 return null;
226 }
227 }
228
229 private class MockDriverService extends DriverServiceAdapter {
230 @Override
231 public Driver getDriver(String driverName) {
232 if (driverName.equals(BASE_DRIVER)) {
233 return baseDriver;
234 }
235 throw new ItemNotFoundException("Driver not found");
236 }
237 }
238
239 private class MockDriverAdminService extends DriverAdminServiceAdapter {
240
241 @Override
242 public void registerProvider(DriverProvider provider) {
243 providers.add(provider);
244 }
245 }
246
247 private class MockDelegate implements ConfigApplyDelegate {
248 @Override
249 public void onApply(Config configFile) {
250 }
251 }
252
253 private class MockDriver extends DriverAdapter {
254
255 @Override
256 public List<Driver> parents() {
257 return ImmutableList.of();
258 }
259
260 @Override
261 public String manufacturer() {
262 return "On.Lab";
263 }
264
265 @Override
266 public String hwVersion() {
267 return "testHW";
268 }
269
270 @Override
271 public Class<? extends Behaviour> implementation(Class<? extends Behaviour> behaviour) {
272 return MockDeviceDescriptionDiscovery.class;
273 }
274
275 @Override
276 public Map<String, String> properties() {
277 return new HashMap<>();
278 }
279
280 @Override
281 public Set<Class<? extends Behaviour>> behaviours() {
282 return ImmutableSet.of(DeviceDescriptionDiscovery.class);
283 }
284
285 @Override
286 public String swVersion() {
287 return "testSW";
288 }
289
290 @Override
291 public String name() {
292 return BASE_DRIVER;
293 }
294 }
295
296 private class MockDeviceDescriptionDiscovery extends AbstractHandlerBehaviour
297 implements DeviceDescriptionDiscovery {
298 @Override
299 public DeviceDescription discoverDeviceDetails() {
300 return null;
301 }
302
303 @Override
304 public List<PortDescription> discoverPortDetails() {
305 return null;
306 }
307 }
308}