blob: 49374cc4412bb73f5566246d5eee8bb32cd4cd18 [file] [log] [blame]
Andrea Campanella58454b92016-04-01 15:19:00 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
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;
Andrea Campanella58454b92016-04-01 15:19:00 -070024import org.onosproject.TestApplicationId;
25import org.onosproject.core.ApplicationId;
26import org.onosproject.core.CoreService;
27import org.onosproject.core.CoreServiceAdapter;
Andrea Campanella58454b92016-04-01 15:19:00 -070028import org.onosproject.net.AbstractProjectableModel;
29import org.onosproject.net.DefaultAnnotations;
30import org.onosproject.net.DefaultDevice;
31import org.onosproject.net.Device;
32import org.onosproject.net.DeviceId;
33import org.onosproject.net.config.Config;
Andrea Campanella59b549d2017-04-14 21:58:16 +020034import org.onosproject.net.config.ConfigApplyDelegate;
Andrea Campanella58454b92016-04-01 15:19:00 -070035import org.onosproject.net.config.ConfigFactory;
36import org.onosproject.net.config.NetworkConfigEvent;
37import org.onosproject.net.config.NetworkConfigListener;
38import org.onosproject.net.config.NetworkConfigRegistry;
39import org.onosproject.net.config.NetworkConfigRegistryAdapter;
40import org.onosproject.net.config.basics.BasicDeviceConfig;
41import org.onosproject.net.device.DeviceDescription;
42import org.onosproject.net.device.DeviceEvent;
43import org.onosproject.net.device.DeviceProvider;
44import org.onosproject.net.device.DeviceProviderRegistry;
45import org.onosproject.net.device.DeviceProviderRegistryAdapter;
46import org.onosproject.net.device.DeviceProviderService;
47import org.onosproject.net.device.DeviceProviderServiceAdapter;
48import org.onosproject.net.device.DeviceService;
49import org.onosproject.net.device.DeviceServiceAdapter;
50import org.onosproject.net.device.DeviceStore;
51import org.onosproject.net.device.DeviceStoreAdapter;
Andrea Campanella58454b92016-04-01 15:19:00 -070052import org.onosproject.net.driver.DriverServiceAdapter;
53import org.onosproject.net.provider.ProviderId;
54import org.onosproject.snmp.SnmpController;
55
Andrea Campanella59b549d2017-04-14 21:58:16 +020056import java.io.InputStream;
Andrea Campanella58454b92016-04-01 15:19:00 -070057import java.util.HashMap;
58import java.util.HashSet;
59import java.util.Set;
60
Ray Milkey4ad4a242018-02-13 13:54:40 -080061import static org.junit.Assert.assertEquals;
62import static org.junit.Assert.assertFalse;
63import static org.junit.Assert.assertNotNull;
64import static org.junit.Assert.assertNull;
65import static org.junit.Assert.assertTrue;
Andrea Campanella58454b92016-04-01 15:19:00 -070066import static org.onlab.junit.TestTools.assertAfter;
67
68/**
69 * Testing class for SnmpDeviceProvider.
70 */
71public class SnmpDeviceProviderTest {
72
Andrea Campanella59b549d2017-04-14 21:58:16 +020073 public static final int TEST_DURATION = 1500;
74 public static final int DELAY = 500;
Andrea Campanella58454b92016-04-01 15:19:00 -070075 private final SnmpDeviceProvider provider = new SnmpDeviceProvider();
76 private final SnmpController controller = new SnmpControllerAdapter();
77 private final DeviceProviderRegistry providerRegistry = new MockDeviceProviderRegistry();
78 private final DeviceService deviceService = new MockDeviceService();
79 private final NetworkConfigRegistry netCfgService = new MockNetworkConfigRegistry();
80 private final DeviceStore deviceStore = new MockDeviceStore();
81 protected CoreService coreService = new MockCoreService();
82 private final DeviceProviderService deviceProviderService = new MockDeviceProviderService();
83 private final TestApplicationId applicationId = new TestApplicationId("TestAppId");
Andrea Campanella59b549d2017-04-14 21:58:16 +020084 private final DeviceId deviceId = DeviceId.deviceId("snmp:1.1.1.1:1");
85 private final DeviceId wrongDeviceId = DeviceId.deviceId("snmp:2.2.2.2:2");
86 private final Set<ConfigFactory> cfgFactories = new HashSet<>();
87 private final Set<NetworkConfigListener> netCfgListeners = new HashSet<>();
Andrea Campanella58454b92016-04-01 15:19:00 -070088 private final NetworkConfigEvent deviceAddedIrrelevantEvent =
89 new NetworkConfigEvent(NetworkConfigEvent.Type.CONFIG_ADDED,
90 null, BasicDeviceConfig.class);
Andrea Campanella59b549d2017-04-14 21:58:16 +020091 private final NetworkConfigEvent deviceAddedNewEvent =
92 new NetworkConfigEvent(NetworkConfigEvent.Type.CONFIG_ADDED,
93 deviceId, SnmpDeviceConfig.class);
94 private final SnmpDeviceConfig config = new SnmpDeviceConfig();
95 //Testing Files
96 private final InputStream jsonStream = SnmpDeviceProviderTest.class
97 .getResourceAsStream("/device.json");
98 private final ObjectMapper mapper = new ObjectMapper();
Yuta HIGUCHI4f56bbd2017-04-27 17:38:20 -070099 private static final String KEY = "snmp";
Andrea Campanella58454b92016-04-01 15:19:00 -0700100
101
102 @Before
103 public void setUp() throws Exception {
104 provider.controller = controller;
105 provider.providerRegistry = providerRegistry;
106 provider.deviceService = deviceService;
107 provider.netCfgService = netCfgService;
108 provider.deviceStore = deviceStore;
109 provider.coreService = coreService;
Andrea Campanella59b549d2017-04-14 21:58:16 +0200110 JsonNode jsonNode = mapper.readTree(jsonStream);
111 ConfigApplyDelegate delegate = new MockDelegate();
112 config.init(deviceId, KEY, jsonNode, mapper, delegate);
Andrea Campanella58454b92016-04-01 15:19:00 -0700113 provider.activate(null);
114 }
115
116 @Test
117 public void testActivate() {
118 assertEquals("Incorrect provider service", deviceProviderService, provider.providerService);
119 assertEquals("Incorrect application id", applicationId, provider.appId);
Ray Milkey4ad4a242018-02-13 13:54:40 -0800120 assertTrue("Incorrect config factories", cfgFactories.contains(provider.factory));
Andrea Campanella58454b92016-04-01 15:19:00 -0700121 assertTrue("Incorrect network config listener", netCfgListeners.contains(provider.cfgLister));
122
123
124 }
125
126 @Test
127 public void testDeactivate() {
128 this.addDevice();
129 provider.deactivate(null);
Andrea Campanella59b549d2017-04-14 21:58:16 +0200130 assertAfter(DELAY, TEST_DURATION, () ->
Andrea Campanella58454b92016-04-01 15:19:00 -0700131 assertNull("Device should be removed", controller.getDevice(deviceId)));
Andrea Campanella59b549d2017-04-14 21:58:16 +0200132 assertTrue("Network config factory not removed", cfgFactories.isEmpty());
Andrea Campanella58454b92016-04-01 15:19:00 -0700133 assertFalse("Network config listener not removed", netCfgListeners.contains(provider.cfgLister));
134 assertFalse("Provider not unregistered", providerRegistry.getProviders().contains(provider.id()));
135 assertNull("Provider registry not removed", provider.providerService);
136 }
137
138 @Test
139 public void eventNotRelevant() {
140 assertFalse("Event should not be relevant", provider.cfgLister.isRelevant(deviceAddedIrrelevantEvent));
141 assertFalse("Device should not be reachable", provider.isReachable(wrongDeviceId));
142 }
143
144 @Test
145 public void addDevice() {
Andrea Campanella58454b92016-04-01 15:19:00 -0700146 AbstractProjectableModel.setDriverService(null, new MockDriverService());
147 //FIXME this needs sleep
Andrea Campanella59b549d2017-04-14 21:58:16 +0200148 assertAfter(DELAY, TEST_DURATION, () ->
149 assertNotNull("Device should be added to controller", controller.getDevice(deviceId)));
150 assertTrue("Device should be reachable", provider.isReachable(deviceId));
151 }
152
153 @Test
154 public void addDeviceNew() {
155 assertTrue("Event should be relevant", provider.cfgLister.isRelevant(deviceAddedNewEvent));
156 provider.cfgLister.event(deviceAddedNewEvent);
157 AbstractProjectableModel.setDriverService(null, new MockDriverService());
158 //FIXME this needs sleep
159 assertAfter(DELAY, TEST_DURATION, () ->
Andrea Campanella58454b92016-04-01 15:19:00 -0700160 assertNotNull("Device should be added to controller", controller.getDevice(deviceId)));
161 assertTrue("Device should be reachable", provider.isReachable(deviceId));
162 }
163
164 private class MockDeviceProviderRegistry extends DeviceProviderRegistryAdapter {
165
166 Set<ProviderId> providers = new HashSet<>();
167
168 @Override
169 public DeviceProviderService register(DeviceProvider provider) {
170 providers.add(provider.id());
171 return deviceProviderService;
172 }
173
174 @Override
175 public void unregister(DeviceProvider provider) {
176 providers.remove(provider.id());
177 }
178
179 @Override
180 public Set<ProviderId> getProviders() {
181 return providers;
182 }
183
184 }
185
186 private class MockDeviceService extends DeviceServiceAdapter {
187 @Override
188 public Device getDevice(DeviceId deviceId) {
189 return deviceStore.getDevice(deviceId);
190 }
191 }
192
Andrea Campanella58454b92016-04-01 15:19:00 -0700193 private class MockNetworkConfigRegistry extends NetworkConfigRegistryAdapter {
194
195 @Override
196 public void registerConfigFactory(ConfigFactory configFactory) {
Andrea Campanella59b549d2017-04-14 21:58:16 +0200197 cfgFactories.add(configFactory);
Andrea Campanella58454b92016-04-01 15:19:00 -0700198 }
199
200 @Override
201 public void unregisterConfigFactory(ConfigFactory configFactory) {
Andrea Campanella59b549d2017-04-14 21:58:16 +0200202 cfgFactories.remove(configFactory);
Andrea Campanella58454b92016-04-01 15:19:00 -0700203 }
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
216 @Override
217 public <S, C extends Config<S>> C getConfig(S subject, Class<C> configClass) {
Ray Milkey4ad4a242018-02-13 13:54:40 -0800218 if (configClass.equals(SnmpDeviceConfig.class)) {
Andrea Campanella59b549d2017-04-14 21:58:16 +0200219 return (C) config;
Andrea Campanella58454b92016-04-01 15:19:00 -0700220 } else {
221 return (C) new BasicDeviceConfig();
222 }
223 }
Andrea Campanella59b549d2017-04-14 21:58:16 +0200224
225 @Override
226 public <S, C extends Config<S>> Set<S> getSubjects(Class<S> subjectClass, Class<C> configClass) {
227 return ImmutableSet.of((S) deviceId);
228 }
Andrea Campanella58454b92016-04-01 15:19:00 -0700229 }
230
231 private class MockDeviceStore extends DeviceStoreAdapter {
232 protected HashMap<DeviceId, Device> devices = new HashMap<>();
233
234 @Override
235 public DeviceEvent createOrUpdateDevice(ProviderId providerId, DeviceId deviceId,
236 DeviceDescription desc) {
237
238 devices.put(deviceId, new DefaultDevice(providerId, deviceId, desc.type(),
239 desc.manufacturer(), desc.hwVersion(),
240 desc.swVersion(), desc.serialNumber(),
241 desc.chassisId(), DefaultAnnotations.builder().build()));
242 return null;
243 }
244
245 @Override
246 public Device getDevice(DeviceId deviceId) {
247 return devices.get(deviceId);
248 }
249
250 }
251
252 private class MockCoreService extends CoreServiceAdapter {
253 @Override
254 public ApplicationId registerApplication(String name) {
255 return applicationId;
256 }
257 }
258
259 private class MockDeviceProviderService extends DeviceProviderServiceAdapter {
260 DeviceStore store = deviceStore;
261
262 @Override
263 public void deviceConnected(DeviceId deviceId, DeviceDescription desc) {
264 store.createOrUpdateDevice(ProviderId.NONE, deviceId, desc);
265 }
266 }
267
Andrea Campanella58454b92016-04-01 15:19:00 -0700268 private class MockDriverService extends DriverServiceAdapter {
269
270 }
Andrea Campanella59b549d2017-04-14 21:58:16 +0200271
272 private class MockDelegate implements ConfigApplyDelegate {
273 @Override
274 public void onApply(Config config) {
275
276 }
277 }
Ray Milkey2d572dd2017-04-14 10:01:24 -0700278}