blob: 7572a7cf4b2a74bf2b53ef0265659dd7dae5f723 [file] [log] [blame]
Andrea Campanella58454b92016-04-01 15:19:00 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Andrea Campanella58454b92016-04-01 15:19:00 -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 */
16
17package org.onosproject.provider.snmp.device.impl;
18
Andrea Campanella59b549d2017-04-14 21:58:16 +020019import com.fasterxml.jackson.databind.JsonNode;
20import com.fasterxml.jackson.databind.ObjectMapper;
Andrea Campanella58454b92016-04-01 15:19:00 -070021import com.google.common.collect.ImmutableSet;
22import org.junit.Before;
23import org.junit.Test;
24import org.onlab.packet.IpAddress;
25import org.onosproject.TestApplicationId;
26import org.onosproject.core.ApplicationId;
27import org.onosproject.core.CoreService;
28import org.onosproject.core.CoreServiceAdapter;
29import org.onosproject.incubator.net.config.basics.ConfigException;
30import org.onosproject.net.AbstractProjectableModel;
31import org.onosproject.net.DefaultAnnotations;
32import org.onosproject.net.DefaultDevice;
33import org.onosproject.net.Device;
34import org.onosproject.net.DeviceId;
35import org.onosproject.net.config.Config;
Andrea Campanella59b549d2017-04-14 21:58:16 +020036import org.onosproject.net.config.ConfigApplyDelegate;
Andrea Campanella58454b92016-04-01 15:19:00 -070037import 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.DeviceEvent;
45import org.onosproject.net.device.DeviceProvider;
46import org.onosproject.net.device.DeviceProviderRegistry;
47import org.onosproject.net.device.DeviceProviderRegistryAdapter;
48import org.onosproject.net.device.DeviceProviderService;
49import org.onosproject.net.device.DeviceProviderServiceAdapter;
50import org.onosproject.net.device.DeviceService;
51import org.onosproject.net.device.DeviceServiceAdapter;
52import org.onosproject.net.device.DeviceStore;
53import org.onosproject.net.device.DeviceStoreAdapter;
Andrea Campanella58454b92016-04-01 15:19:00 -070054import org.onosproject.net.driver.DriverServiceAdapter;
55import org.onosproject.net.provider.ProviderId;
56import org.onosproject.snmp.SnmpController;
57
Andrea Campanella59b549d2017-04-14 21:58:16 +020058import java.io.InputStream;
Andrea Campanella58454b92016-04-01 15:19:00 -070059import java.util.HashMap;
60import java.util.HashSet;
61import java.util.Set;
62
63import static org.junit.Assert.*;
64import static org.onlab.junit.TestTools.assertAfter;
65
66/**
67 * Testing class for SnmpDeviceProvider.
68 */
69public class SnmpDeviceProviderTest {
70
Andrea Campanella59b549d2017-04-14 21:58:16 +020071 public static final int TEST_DURATION = 1500;
72 public static final int DELAY = 500;
Andrea Campanella58454b92016-04-01 15:19:00 -070073 private final SnmpDeviceProvider provider = new SnmpDeviceProvider();
74 private final SnmpController controller = new SnmpControllerAdapter();
75 private final DeviceProviderRegistry providerRegistry = new MockDeviceProviderRegistry();
76 private final DeviceService deviceService = new MockDeviceService();
77 private final NetworkConfigRegistry netCfgService = new MockNetworkConfigRegistry();
78 private final DeviceStore deviceStore = new MockDeviceStore();
79 protected CoreService coreService = new MockCoreService();
80 private final DeviceProviderService deviceProviderService = new MockDeviceProviderService();
81 private final TestApplicationId applicationId = new TestApplicationId("TestAppId");
Andrea Campanella59b549d2017-04-14 21:58:16 +020082 private final SnmpProviderConfig snmpProviderConfig = new MockSnmpProviderConfig();
83 private final DeviceId deviceId = DeviceId.deviceId("snmp:1.1.1.1:1");
84 private final DeviceId wrongDeviceId = DeviceId.deviceId("snmp:2.2.2.2:2");
85 private final Set<ConfigFactory> cfgFactories = new HashSet<>();
86 private final Set<NetworkConfigListener> netCfgListeners = new HashSet<>();
Andrea Campanella58454b92016-04-01 15:19:00 -070087 private final NetworkConfigEvent deviceAddedEvent =
88 new NetworkConfigEvent(NetworkConfigEvent.Type.CONFIG_ADDED,
89 null, SnmpProviderConfig.class);
Andrea Campanella58454b92016-04-01 15:19:00 -070090 private final NetworkConfigEvent deviceAddedIrrelevantEvent =
91 new NetworkConfigEvent(NetworkConfigEvent.Type.CONFIG_ADDED,
92 null, BasicDeviceConfig.class);
Andrea Campanella59b549d2017-04-14 21:58:16 +020093 private final NetworkConfigEvent deviceAddedNewEvent =
94 new NetworkConfigEvent(NetworkConfigEvent.Type.CONFIG_ADDED,
95 deviceId, SnmpDeviceConfig.class);
96 private final SnmpDeviceConfig config = new SnmpDeviceConfig();
97 //Testing Files
98 private final InputStream jsonStream = SnmpDeviceProviderTest.class
99 .getResourceAsStream("/device.json");
100 private final ObjectMapper mapper = new ObjectMapper();
Yuta HIGUCHI4f56bbd2017-04-27 17:38:20 -0700101 private static final String KEY = "snmp";
Andrea Campanella58454b92016-04-01 15:19:00 -0700102
103
104 @Before
105 public void setUp() throws Exception {
106 provider.controller = controller;
107 provider.providerRegistry = providerRegistry;
108 provider.deviceService = deviceService;
109 provider.netCfgService = netCfgService;
110 provider.deviceStore = deviceStore;
111 provider.coreService = coreService;
Andrea Campanella59b549d2017-04-14 21:58:16 +0200112 JsonNode jsonNode = mapper.readTree(jsonStream);
113 ConfigApplyDelegate delegate = new MockDelegate();
114 config.init(deviceId, KEY, jsonNode, mapper, delegate);
Andrea Campanella58454b92016-04-01 15:19:00 -0700115 provider.activate(null);
116 }
117
118 @Test
119 public void testActivate() {
120 assertEquals("Incorrect provider service", deviceProviderService, provider.providerService);
121 assertEquals("Incorrect application id", applicationId, provider.appId);
Andrea Campanella59b549d2017-04-14 21:58:16 +0200122 assertTrue("Incorrect config factories", cfgFactories.containsAll(provider.factories));
Andrea Campanella58454b92016-04-01 15:19:00 -0700123 assertTrue("Incorrect network config listener", netCfgListeners.contains(provider.cfgLister));
124
125
126 }
127
128 @Test
129 public void testDeactivate() {
130 this.addDevice();
131 provider.deactivate(null);
Andrea Campanella59b549d2017-04-14 21:58:16 +0200132 assertAfter(DELAY, TEST_DURATION, () ->
Andrea Campanella58454b92016-04-01 15:19:00 -0700133 assertNull("Device should be removed", controller.getDevice(deviceId)));
Andrea Campanella59b549d2017-04-14 21:58:16 +0200134 assertTrue("Network config factory not removed", cfgFactories.isEmpty());
Andrea Campanella58454b92016-04-01 15:19:00 -0700135 assertFalse("Network config listener not removed", netCfgListeners.contains(provider.cfgLister));
136 assertFalse("Provider not unregistered", providerRegistry.getProviders().contains(provider.id()));
137 assertNull("Provider registry not removed", provider.providerService);
138 }
139
140 @Test
141 public void eventNotRelevant() {
142 assertFalse("Event should not be relevant", provider.cfgLister.isRelevant(deviceAddedIrrelevantEvent));
143 assertFalse("Device should not be reachable", provider.isReachable(wrongDeviceId));
144 }
145
146 @Test
147 public void addDevice() {
148 assertTrue("Event should be relevant", provider.cfgLister.isRelevant(deviceAddedEvent));
149 provider.cfgLister.event(deviceAddedEvent);
150 AbstractProjectableModel.setDriverService(null, new MockDriverService());
151 //FIXME this needs sleep
Andrea Campanella59b549d2017-04-14 21:58:16 +0200152 assertAfter(DELAY, TEST_DURATION, () ->
153 assertNotNull("Device should be added to controller", controller.getDevice(deviceId)));
154 assertTrue("Device should be reachable", provider.isReachable(deviceId));
155 }
156
157 @Test
158 public void addDeviceNew() {
159 assertTrue("Event should be relevant", provider.cfgLister.isRelevant(deviceAddedNewEvent));
160 provider.cfgLister.event(deviceAddedNewEvent);
161 AbstractProjectableModel.setDriverService(null, new MockDriverService());
162 //FIXME this needs sleep
163 assertAfter(DELAY, TEST_DURATION, () ->
Andrea Campanella58454b92016-04-01 15:19:00 -0700164 assertNotNull("Device should be added to controller", controller.getDevice(deviceId)));
165 assertTrue("Device should be reachable", provider.isReachable(deviceId));
166 }
167
168 private class MockDeviceProviderRegistry extends DeviceProviderRegistryAdapter {
169
170 Set<ProviderId> providers = new HashSet<>();
171
172 @Override
173 public DeviceProviderService register(DeviceProvider provider) {
174 providers.add(provider.id());
175 return deviceProviderService;
176 }
177
178 @Override
179 public void unregister(DeviceProvider provider) {
180 providers.remove(provider.id());
181 }
182
183 @Override
184 public Set<ProviderId> getProviders() {
185 return providers;
186 }
187
188 }
189
190 private class MockDeviceService extends DeviceServiceAdapter {
191 @Override
192 public Device getDevice(DeviceId deviceId) {
193 return deviceStore.getDevice(deviceId);
194 }
195 }
196
Andrea Campanella58454b92016-04-01 15:19:00 -0700197 private class MockNetworkConfigRegistry extends NetworkConfigRegistryAdapter {
198
199 @Override
200 public void registerConfigFactory(ConfigFactory configFactory) {
Andrea Campanella59b549d2017-04-14 21:58:16 +0200201 cfgFactories.add(configFactory);
Andrea Campanella58454b92016-04-01 15:19:00 -0700202 }
203
204 @Override
205 public void unregisterConfigFactory(ConfigFactory configFactory) {
Andrea Campanella59b549d2017-04-14 21:58:16 +0200206 cfgFactories.remove(configFactory);
Andrea Campanella58454b92016-04-01 15:19:00 -0700207 }
208
209 @Override
210 public void addListener(NetworkConfigListener listener) {
211 netCfgListeners.add(listener);
212 }
213
214 @Override
215 public void removeListener(NetworkConfigListener listener) {
216 netCfgListeners.remove(listener);
217 }
218
219
220 @Override
221 public <S, C extends Config<S>> C getConfig(S subject, Class<C> configClass) {
222 if (configClass.equals(SnmpProviderConfig.class)) {
223 return (C) snmpProviderConfig;
Andrea Campanella59b549d2017-04-14 21:58:16 +0200224 } else if (configClass.equals(SnmpDeviceConfig.class)) {
225 return (C) config;
Andrea Campanella58454b92016-04-01 15:19:00 -0700226 } else {
227 return (C) new BasicDeviceConfig();
228 }
229 }
Andrea Campanella59b549d2017-04-14 21:58:16 +0200230
231 @Override
232 public <S, C extends Config<S>> Set<S> getSubjects(Class<S> subjectClass, Class<C> configClass) {
233 return ImmutableSet.of((S) deviceId);
234 }
Andrea Campanella58454b92016-04-01 15:19:00 -0700235 }
236
237 private class MockDeviceStore extends DeviceStoreAdapter {
238 protected HashMap<DeviceId, Device> devices = new HashMap<>();
239
240 @Override
241 public DeviceEvent createOrUpdateDevice(ProviderId providerId, DeviceId deviceId,
242 DeviceDescription desc) {
243
244 devices.put(deviceId, new DefaultDevice(providerId, deviceId, desc.type(),
245 desc.manufacturer(), desc.hwVersion(),
246 desc.swVersion(), desc.serialNumber(),
247 desc.chassisId(), DefaultAnnotations.builder().build()));
248 return null;
249 }
250
251 @Override
252 public Device getDevice(DeviceId deviceId) {
253 return devices.get(deviceId);
254 }
255
256 }
257
258 private class MockCoreService extends CoreServiceAdapter {
259 @Override
260 public ApplicationId registerApplication(String name) {
261 return applicationId;
262 }
263 }
264
265 private class MockDeviceProviderService extends DeviceProviderServiceAdapter {
266 DeviceStore store = deviceStore;
267
268 @Override
269 public void deviceConnected(DeviceId deviceId, DeviceDescription desc) {
270 store.createOrUpdateDevice(ProviderId.NONE, deviceId, desc);
271 }
272 }
273
274 private class MockSnmpProviderConfig extends SnmpProviderConfig {
275 protected SnmpDeviceInfo deviceInfo = new SnmpDeviceInfo(IpAddress.valueOf("1.1.1.1"), 1, "test", "test");
276
277 @Override
278 public Set<SnmpProviderConfig.SnmpDeviceInfo> getDevicesInfo() throws ConfigException {
279 return ImmutableSet.of(deviceInfo);
280 }
281
282 }
283
284 private class MockDriverService extends DriverServiceAdapter {
285
286 }
Andrea Campanella59b549d2017-04-14 21:58:16 +0200287
288 private class MockDelegate implements ConfigApplyDelegate {
289 @Override
290 public void onApply(Config config) {
291
292 }
293 }
Ray Milkey2d572dd2017-04-14 10:01:24 -0700294}