blob: 6fa1b1273aeeadb506120b34aa162b1a96af325b [file] [log] [blame]
Michele Santuari576f09c2016-09-28 14:20:00 +02001/*
2 * Copyright 2016-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.provider.netconf.device.impl;
18
19import com.google.common.collect.ImmutableSet;
20import org.junit.Before;
Ray Milkey1fd702a2016-12-05 15:11:06 -080021import org.junit.Ignore;
Michele Santuari576f09c2016-09-28 14:20:00 +020022import org.junit.Test;
23import org.onlab.packet.ChassisId;
24import org.onlab.packet.IpAddress;
25import org.onosproject.core.ApplicationId;
26import org.onosproject.core.CoreService;
27import org.onosproject.core.DefaultApplicationId;
28import org.onosproject.incubator.net.config.basics.ConfigException;
29import org.onosproject.mastership.MastershipService;
30import org.onosproject.mastership.MastershipServiceAdapter;
31import org.onosproject.net.AbstractProjectableModel;
32import org.onosproject.net.Annotations;
33import org.onosproject.net.DefaultDevice;
34import org.onosproject.net.Device;
35import org.onosproject.net.DeviceId;
36import org.onosproject.net.config.Config;
37import org.onosproject.net.config.ConfigFactory;
38import org.onosproject.net.config.NetworkConfigEvent;
39import org.onosproject.net.config.NetworkConfigListener;
40import org.onosproject.net.config.NetworkConfigRegistry;
41import org.onosproject.net.config.NetworkConfigRegistryAdapter;
42import org.onosproject.net.config.basics.BasicDeviceConfig;
43import org.onosproject.net.device.DeviceDescription;
44import org.onosproject.net.device.DeviceDescriptionDiscovery;
45import org.onosproject.net.device.DeviceEvent;
46import org.onosproject.net.device.DeviceListener;
47import org.onosproject.net.device.DeviceProvider;
48import org.onosproject.net.device.DeviceProviderRegistry;
49import org.onosproject.net.device.DeviceProviderRegistryAdapter;
50import org.onosproject.net.device.DeviceProviderService;
51import org.onosproject.net.device.DeviceProviderServiceAdapter;
52import org.onosproject.net.device.DeviceService;
53import org.onosproject.net.device.DeviceServiceAdapter;
54import org.onosproject.net.device.DeviceStore;
55import org.onosproject.net.device.DeviceStoreAdapter;
56import org.onosproject.net.device.PortDescription;
57import org.onosproject.net.driver.AbstractHandlerBehaviour;
58import org.onosproject.net.driver.Behaviour;
59import org.onosproject.net.driver.Driver;
60import org.onosproject.net.driver.DriverAdapter;
61import org.onosproject.net.driver.DriverHandler;
62import org.onosproject.net.driver.DriverServiceAdapter;
63import org.onosproject.net.key.DeviceKeyAdminService;
64import org.onosproject.net.key.DeviceKeyAdminServiceAdapter;
65import org.onosproject.net.provider.ProviderId;
66import org.onosproject.netconf.NetconfController;
67import org.onosproject.netconf.NetconfDeviceListener;
68
69import java.util.ArrayList;
70import java.util.HashMap;
71import java.util.HashSet;
72import java.util.List;
73import java.util.Set;
74import java.util.concurrent.CopyOnWriteArraySet;
75
76import static org.easymock.EasyMock.*;
77import static org.junit.Assert.*;
78import static org.onlab.junit.TestTools.assertAfter;
79import static org.onosproject.provider.netconf.device.impl.NetconfDeviceProvider.APP_NAME;
80
81/**
82 * Netconf device provider basic test.
83 */
84public class NetconfDeviceProviderTest {
85
86 private final NetconfDeviceProvider provider = new NetconfDeviceProvider();
87 private final NetconfController controller = new MockNetconfController();
88
89 //Provider Mock
90 private final DeviceProviderRegistry deviceRegistry = new MockDeviceProviderRegistry();
91 private final DeviceProviderService providerService = new MockDeviceProviderService();
92 private final DeviceService deviceService = new MockDeviceService();
93 private final MastershipService mastershipService = new MockMastershipService();
94 private final Driver driver = new MockDriver();
95 private final NetworkConfigRegistry cfgService = new MockNetworkConfigRegistry();
96 private final DeviceKeyAdminService deviceKeyAdminService = new DeviceKeyAdminServiceAdapter();
97 private final DeviceStore deviceStore = new MockDeviceStore();
98
99 //Class for testing
100 private final NetworkConfigEvent deviceAddedEvent =
101 new NetworkConfigEvent(NetworkConfigEvent.Type.CONFIG_ADDED,
102 null, NetconfProviderConfig.class);
103 private final NetconfProviderConfig netconfProviderConfig = new MockNetconfProviderConfig();
104 private static final String IP = "1.1.1.1";
105 private static final String TEST = "test";
106 private static final int DELAY_DISCOVERY = 500;
107
108 //Provider related classes
109 private CoreService coreService;
110 private ApplicationId appId =
111 new DefaultApplicationId(100, APP_NAME);
112 private DeviceDescriptionDiscovery descriptionDiscovery = new TestDescription();
113 private Set<DeviceListener> deviceListeners = new HashSet<>();
114 private ConfigFactory cfgFactory;
115 private Set<NetworkConfigListener> netCfgListeners = new HashSet<>();
116 private HashMap<DeviceId, Device> devices = new HashMap<>();
117
118 //Controller related classes
119 private Set<NetconfDeviceListener> netconfDeviceListeners = new CopyOnWriteArraySet<>();
120
121 @Before
122 public void setUp() {
123 coreService = createMock(CoreService.class);
124 expect(coreService.registerApplication(APP_NAME))
125 .andReturn(appId).anyTimes();
126 replay(coreService);
127 provider.coreService = coreService;
128 provider.providerRegistry = deviceRegistry;
129 provider.mastershipService = mastershipService;
130 provider.deviceService = deviceService;
131 provider.cfgService = cfgService;
132 provider.controller = controller;
133 provider.deviceKeyAdminService = deviceKeyAdminService;
134 AbstractProjectableModel.setDriverService(null, new DriverServiceAdapter());
135 provider.activate();
136 }
137
138 @Test
139 public void activate() throws Exception {
140
141 assertTrue("Provider should be registered", deviceRegistry.getProviders().contains(provider.id()));
142 assertEquals("Incorrect device service", deviceService, provider.deviceService);
143 assertEquals("Incorrect provider service", providerService, provider.providerService);
144 assertEquals("Device listener should be added", 1, deviceListeners.size());
145 assertFalse("Thread to connect device should be running",
146 provider.executor.isShutdown() || provider.executor.isTerminated());
147 assertFalse("Scheduled task to update device should be running", provider.scheduledTask.isCancelled());
148 }
149
150 @Test
151 public void deactivate() throws Exception {
152 provider.deactivate();
153 assertEquals("Device listener should be removed", 0, deviceListeners.size());
154 assertFalse("Provider should not be registered", deviceRegistry.getProviders().contains(provider));
155 assertTrue("Thread to connect device should be shutdown", provider.executor.isShutdown());
156 assertTrue("Scheduled task to update device should be shutdown", provider.scheduledTask.isCancelled());
157 assertNull("Provider service should be null", provider.providerService);
158 assertEquals("Controller listener should be removed", 0, netconfDeviceListeners.size());
159 }
160
161 @Test
Ray Milkey1fd702a2016-12-05 15:11:06 -0800162 @Ignore("Test is brittle")
Michele Santuari576f09c2016-09-28 14:20:00 +0200163 public void addDevice() {
164 assertNotNull(providerService);
165 assertTrue("Event should be relevant", provider.cfgListener.isRelevant(deviceAddedEvent));
166 provider.cfgListener.event(deviceAddedEvent);
167
168 assertAfter(DELAY_DISCOVERY, () ->
169 assertEquals("Device should be added", 1, deviceStore.getDeviceCount()));
170 devices.clear();
171 }
172
173 //TODO: implement ports discovery and check updates of the device description
174
175
176 //Mock classes
177 private class MockNetconfController extends NetconfControllerAdapter {
178
179 @Override
180 public void addDeviceListener(NetconfDeviceListener listener) {
181 if (!netconfDeviceListeners.contains(listener)) {
182 netconfDeviceListeners.add(listener);
183 }
184 }
185
186 @Override
187 public void removeDeviceListener(NetconfDeviceListener listener) {
188 netconfDeviceListeners.remove(listener);
189 }
190 }
191
192 private class MockDeviceProviderRegistry extends DeviceProviderRegistryAdapter {
193
194 Set<ProviderId> providers = new HashSet<>();
195
196 @Override
197 public DeviceProviderService register(DeviceProvider provider) {
198 providers.add(provider.id());
199 return providerService;
200 }
201
202 @Override
203 public void unregister(DeviceProvider provider) {
204 providers.remove(provider.id());
205 }
206
207 @Override
208 public Set<ProviderId> getProviders() {
209 return providers;
210 }
211
212 }
213
214 private class MockDeviceService extends DeviceServiceAdapter {
215 @Override
216 public void addListener(DeviceListener listener) {
217 deviceListeners.add(listener);
218 }
219
220 @Override
221 public void removeListener(DeviceListener listener) {
222 deviceListeners.remove(listener);
223 }
224 }
225
226 private class MockDeviceProviderService extends DeviceProviderServiceAdapter {
227
228 @Override
229 public void deviceConnected(DeviceId deviceId, DeviceDescription desc) {
230 assertNotNull("DeviceId should be not null", deviceId);
231 assertNotNull("DeviceDescription should be not null", desc);
232 deviceStore.createOrUpdateDevice(ProviderId.NONE, deviceId, desc);
233 }
234 }
235
236 private class MockDeviceStore extends DeviceStoreAdapter {
237
238 @Override
239 public DeviceEvent createOrUpdateDevice(ProviderId providerId, DeviceId deviceId,
240 DeviceDescription desc) {
241
242 devices.put(deviceId, new DefaultDevice(providerId, deviceId, desc.type(),
243 desc.manufacturer(), desc.hwVersion(),
244 desc.swVersion(), desc.serialNumber(),
245 desc.chassisId(), desc.annotations()));
246
247 return null;
248 }
249
250 @Override
251 public Device getDevice(DeviceId deviceId) {
252 return devices.get(deviceId);
253 }
254
255 @Override
256 public int getDeviceCount() {
257 return devices.size();
258 }
259
260 }
261
262 private class MockMastershipService extends MastershipServiceAdapter {
263
264 @Override
265 public boolean isLocalMaster(DeviceId deviceId) {
266 return true;
267 }
268 }
269
270 private class MockNetworkConfigRegistry extends NetworkConfigRegistryAdapter {
271
272 @Override
273 public void registerConfigFactory(ConfigFactory configFactory) {
274 cfgFactory = configFactory;
275 }
276
277 @Override
278 public void unregisterConfigFactory(ConfigFactory configFactory) {
279 cfgFactory = null;
280 }
281
282 @Override
283 public void addListener(NetworkConfigListener listener) {
284 netCfgListeners.add(listener);
285 }
286
287 @Override
288 public void removeListener(NetworkConfigListener listener) {
289 netCfgListeners.remove(listener);
290 }
291
292
293 @Override
294 public <S, C extends Config<S>> C getConfig(S subject, Class<C> configClass) {
295 if (configClass.equals(NetconfProviderConfig.class)) {
296 return (C) netconfProviderConfig;
297 } else {
298 return (C) new BasicDeviceConfig();
299 }
300 }
301 }
302
303 private class MockNetconfProviderConfig extends NetconfProviderConfig {
304 protected NetconfDeviceAddress deviceInfo =
305 new NetconfDeviceAddress(IpAddress.valueOf(IP), 1, TEST, TEST);
306
307 @Override
308 public Set<NetconfProviderConfig.NetconfDeviceAddress> getDevicesAddresses() throws ConfigException {
309 return ImmutableSet.of(deviceInfo);
310 }
311
312 }
313
314 private class MockDevice extends DefaultDevice {
315
316 public MockDevice(ProviderId providerId, DeviceId id, Type type,
317 String manufacturer, String hwVersion, String swVersion,
318 String serialNumber, ChassisId chassisId, Annotations... annotations) {
319 super(providerId, id, type, manufacturer, hwVersion, swVersion, serialNumber,
320 chassisId, annotations);
321 }
322
323 @Override
324 protected Driver locateDriver() {
325 return driver;
326 }
327
328 @Override
329 public Driver driver() {
330 return driver;
331 }
332 }
333
334 private class MockDriver extends DriverAdapter {
335 @Override
336 public <T extends Behaviour> T createBehaviour(DriverHandler handler, Class<T> behaviourClass) {
337
338 return (T) descriptionDiscovery;
339 }
340 }
341
342 private class TestDescription extends AbstractHandlerBehaviour implements DeviceDescriptionDiscovery {
343
344 List<PortDescription> portDescriptions = new ArrayList<>();
345
346 @Override
347 public DeviceDescription discoverDeviceDetails() {
348 return null;
349 }
350
351 @Override
352 public List<PortDescription> discoverPortDetails() {
353 return portDescriptions;
354 }
355
356 private void addDeviceDetails() {
357
358 }
359
360 private void addPortDesc(PortDescription portDescription) {
361 portDescriptions.add(portDescription);
362 }
363 }
364}