blob: 5577fdb10acb0bf8a0af3db7b91157895ee2d5c0 [file] [log] [blame]
Andrea Campanella58454b92016-04-01 15:19:00 -07001/*
2 * Copyright 2016 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.snmp.device.impl;
18
19import com.google.common.collect.ImmutableSet;
20import org.junit.Before;
21import org.junit.Test;
22import org.onlab.packet.IpAddress;
23import org.onosproject.TestApplicationId;
24import org.onosproject.core.ApplicationId;
25import org.onosproject.core.CoreService;
26import org.onosproject.core.CoreServiceAdapter;
27import org.onosproject.incubator.net.config.basics.ConfigException;
28import 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;
34import org.onosproject.net.config.ConfigFactory;
35import org.onosproject.net.config.NetworkConfigEvent;
36import org.onosproject.net.config.NetworkConfigListener;
37import org.onosproject.net.config.NetworkConfigRegistry;
38import org.onosproject.net.config.NetworkConfigRegistryAdapter;
39import org.onosproject.net.config.basics.BasicDeviceConfig;
40import org.onosproject.net.device.DeviceDescription;
41import org.onosproject.net.device.DeviceEvent;
42import org.onosproject.net.device.DeviceProvider;
43import org.onosproject.net.device.DeviceProviderRegistry;
44import org.onosproject.net.device.DeviceProviderRegistryAdapter;
45import org.onosproject.net.device.DeviceProviderService;
46import org.onosproject.net.device.DeviceProviderServiceAdapter;
47import org.onosproject.net.device.DeviceService;
48import org.onosproject.net.device.DeviceServiceAdapter;
49import org.onosproject.net.device.DeviceStore;
50import org.onosproject.net.device.DeviceStoreAdapter;
51import org.onosproject.net.driver.DriverService;
52import org.onosproject.net.driver.DriverServiceAdapter;
53import org.onosproject.net.provider.ProviderId;
54import org.onosproject.snmp.SnmpController;
55
56import java.util.HashMap;
57import java.util.HashSet;
58import java.util.Set;
59
60import static org.junit.Assert.*;
61import static org.onlab.junit.TestTools.assertAfter;
62
63/**
64 * Testing class for SnmpDeviceProvider.
65 */
66public class SnmpDeviceProviderTest {
67
68 private final SnmpDeviceProvider provider = new SnmpDeviceProvider();
69 private final SnmpController controller = new SnmpControllerAdapter();
70 private final DeviceProviderRegistry providerRegistry = new MockDeviceProviderRegistry();
71 private final DeviceService deviceService = new MockDeviceService();
72 private final NetworkConfigRegistry netCfgService = new MockNetworkConfigRegistry();
73 private final DeviceStore deviceStore = new MockDeviceStore();
74 protected CoreService coreService = new MockCoreService();
75 private final DeviceProviderService deviceProviderService = new MockDeviceProviderService();
76 private final TestApplicationId applicationId = new TestApplicationId("TestAppId");
77 private final NetworkConfigEvent deviceAddedEvent =
78 new NetworkConfigEvent(NetworkConfigEvent.Type.CONFIG_ADDED,
79 null, SnmpProviderConfig.class);
80 private final SnmpProviderConfig snmpProviderConfig = new MockSnmpProviderConfig();
81 private final NetworkConfigEvent deviceAddedIrrelevantEvent =
82 new NetworkConfigEvent(NetworkConfigEvent.Type.CONFIG_ADDED,
83 null, BasicDeviceConfig.class);
84 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
87
88 @Before
89 public void setUp() throws Exception {
90 provider.controller = controller;
91 provider.providerRegistry = providerRegistry;
92 provider.deviceService = deviceService;
93 provider.netCfgService = netCfgService;
94 provider.deviceStore = deviceStore;
95 provider.coreService = coreService;
96 provider.activate(null);
97 }
98
99 @Test
100 public void testActivate() {
101 assertEquals("Incorrect provider service", deviceProviderService, provider.providerService);
102 assertEquals("Incorrect application id", applicationId, provider.appId);
103 assertEquals("Incorrect config factory", cfgFactory, provider.factory);
104 assertTrue("Incorrect network config listener", netCfgListeners.contains(provider.cfgLister));
105
106
107 }
108
109 @Test
110 public void testDeactivate() {
111 this.addDevice();
112 provider.deactivate(null);
113 assertAfter(500, () ->
114 assertNull("Device should be removed", controller.getDevice(deviceId)));
115 assertNull("Network config factory not removed", cfgFactory);
116 assertFalse("Network config listener not removed", netCfgListeners.contains(provider.cfgLister));
117 assertFalse("Provider not unregistered", providerRegistry.getProviders().contains(provider.id()));
118 assertNull("Provider registry not removed", provider.providerService);
119 }
120
121 @Test
122 public void eventNotRelevant() {
123 assertFalse("Event should not be relevant", provider.cfgLister.isRelevant(deviceAddedIrrelevantEvent));
124 assertFalse("Device should not be reachable", provider.isReachable(wrongDeviceId));
125 }
126
127 @Test
128 public void addDevice() {
129 assertTrue("Event should be relevant", provider.cfgLister.isRelevant(deviceAddedEvent));
130 provider.cfgLister.event(deviceAddedEvent);
131 AbstractProjectableModel.setDriverService(null, new MockDriverService());
132 //FIXME this needs sleep
133 assertAfter(500, () ->
134 assertNotNull("Device should be added to controller", controller.getDevice(deviceId)));
135 assertTrue("Device should be reachable", provider.isReachable(deviceId));
136 }
137
138 private class MockDeviceProviderRegistry extends DeviceProviderRegistryAdapter {
139
140 Set<ProviderId> providers = new HashSet<>();
141
142 @Override
143 public DeviceProviderService register(DeviceProvider provider) {
144 providers.add(provider.id());
145 return deviceProviderService;
146 }
147
148 @Override
149 public void unregister(DeviceProvider provider) {
150 providers.remove(provider.id());
151 }
152
153 @Override
154 public Set<ProviderId> getProviders() {
155 return providers;
156 }
157
158 }
159
160 private class MockDeviceService extends DeviceServiceAdapter {
161 @Override
162 public Device getDevice(DeviceId deviceId) {
163 return deviceStore.getDevice(deviceId);
164 }
165 }
166
167 private ConfigFactory cfgFactory;
168 private Set<NetworkConfigListener> netCfgListeners = new HashSet<>();
169
170 private class MockNetworkConfigRegistry extends NetworkConfigRegistryAdapter {
171
172 @Override
173 public void registerConfigFactory(ConfigFactory configFactory) {
174 cfgFactory = configFactory;
175 }
176
177 @Override
178 public void unregisterConfigFactory(ConfigFactory configFactory) {
179 cfgFactory = null;
180 }
181
182 @Override
183 public void addListener(NetworkConfigListener listener) {
184 netCfgListeners.add(listener);
185 }
186
187 @Override
188 public void removeListener(NetworkConfigListener listener) {
189 netCfgListeners.remove(listener);
190 }
191
192
193 @Override
194 public <S, C extends Config<S>> C getConfig(S subject, Class<C> configClass) {
195 if (configClass.equals(SnmpProviderConfig.class)) {
196 return (C) snmpProviderConfig;
197 } else {
198 return (C) new BasicDeviceConfig();
199 }
200 }
201 }
202
203 private class MockDeviceStore extends DeviceStoreAdapter {
204 protected HashMap<DeviceId, Device> devices = new HashMap<>();
205
206 @Override
207 public DeviceEvent createOrUpdateDevice(ProviderId providerId, DeviceId deviceId,
208 DeviceDescription desc) {
209
210 devices.put(deviceId, new DefaultDevice(providerId, deviceId, desc.type(),
211 desc.manufacturer(), desc.hwVersion(),
212 desc.swVersion(), desc.serialNumber(),
213 desc.chassisId(), DefaultAnnotations.builder().build()));
214 return null;
215 }
216
217 @Override
218 public Device getDevice(DeviceId deviceId) {
219 return devices.get(deviceId);
220 }
221
222 }
223
224 private class MockCoreService extends CoreServiceAdapter {
225 @Override
226 public ApplicationId registerApplication(String name) {
227 return applicationId;
228 }
229 }
230
231 private class MockDeviceProviderService extends DeviceProviderServiceAdapter {
232 DeviceStore store = deviceStore;
233
234 @Override
235 public void deviceConnected(DeviceId deviceId, DeviceDescription desc) {
236 store.createOrUpdateDevice(ProviderId.NONE, deviceId, desc);
237 }
238 }
239
240 private class MockSnmpProviderConfig extends SnmpProviderConfig {
241 protected SnmpDeviceInfo deviceInfo = new SnmpDeviceInfo(IpAddress.valueOf("1.1.1.1"), 1, "test", "test");
242
243 @Override
244 public Set<SnmpProviderConfig.SnmpDeviceInfo> getDevicesInfo() throws ConfigException {
245 return ImmutableSet.of(deviceInfo);
246 }
247
248 }
249
250 private class MockDriverService extends DriverServiceAdapter {
251
252 }
253}