blob: 82108c72bc77864a59b2039435b403fd815cf276 [file] [log] [blame]
Andrea Campanellae72ac552016-04-11 10:04:52 -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.incubator.net.faultmanagement.alarm.impl;
18
19import com.google.common.collect.ImmutableList;
20import com.google.common.collect.ImmutableSet;
21import org.junit.Before;
22import org.junit.Test;
23import org.onlab.osgi.ComponentContextAdapter;
24import org.onlab.packet.ChassisId;
25import org.onosproject.cluster.NodeId;
26import org.onosproject.cluster.RoleInfo;
27import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
28import org.onosproject.incubator.net.faultmanagement.alarm.AlarmConsumer;
29import org.onosproject.incubator.net.faultmanagement.alarm.AlarmProvider;
30import org.onosproject.incubator.net.faultmanagement.alarm.AlarmProviderRegistry;
31import org.onosproject.incubator.net.faultmanagement.alarm.AlarmProviderRegistryAdapter;
32import org.onosproject.incubator.net.faultmanagement.alarm.AlarmProviderService;
33import org.onosproject.incubator.net.faultmanagement.alarm.DefaultAlarm;
34import org.onosproject.mastership.MastershipEvent;
35import org.onosproject.mastership.MastershipListener;
36import org.onosproject.mastership.MastershipService;
37import org.onosproject.mastership.MastershipServiceAdapter;
38import org.onosproject.net.AbstractProjectableModel;
39import org.onosproject.net.Annotations;
40import org.onosproject.net.DefaultAnnotations;
41import org.onosproject.net.DefaultDevice;
42import org.onosproject.net.Device;
43import org.onosproject.net.DeviceId;
44import org.onosproject.net.device.DeviceEvent;
45import org.onosproject.net.device.DeviceListener;
46import org.onosproject.net.device.DeviceService;
47import org.onosproject.net.device.DeviceServiceAdapter;
48import org.onosproject.net.driver.AbstractHandlerBehaviour;
49import org.onosproject.net.driver.Behaviour;
50import org.onosproject.net.driver.Driver;
51import org.onosproject.net.driver.DriverAdapter;
52import org.onosproject.net.driver.DriverHandler;
53import org.onosproject.net.driver.DriverServiceAdapter;
54import org.onosproject.net.provider.ProviderId;
55import org.osgi.service.component.ComponentContext;
56
57import java.io.IOException;
58import java.util.Collection;
59import java.util.Dictionary;
60import java.util.Enumeration;
61import java.util.HashMap;
62import java.util.HashSet;
63import java.util.List;
64import java.util.Set;
65
66import static org.junit.Assert.*;
67import static org.onlab.junit.TestTools.assertAfter;
68
69/**
70 * Test for the polling alarm provider based on the driver subsystem.
71 */
72public class PollingAlarmProviderTest {
73
74 private final DeviceService deviceService = new MockDeviceService();
75
76 private final MastershipService mastershipService = new MockMastershipService();
77
78 private final AlarmProviderRegistry providerRegistry = new MockDeviceProviderRegistry();
79
80 private final AlarmProviderService alarmProviderService = new MockAlarmProviderService();
81
82 private final ComponentContext context = new MockComponentContext();
83
84 private static final DeviceId DEVICE_ID = DeviceId.deviceId("foo:1.1.1.1:1");
85
86 private Device device = new MockDevice(ProviderId.NONE, DEVICE_ID, Device.Type.OTHER,
87 "foo.inc", "0", "0", "0", null,
88 DefaultAnnotations.builder().build());
89
90 private final NodeId nodeId = NodeId.nodeId("fooNode");
91
92 private final MastershipEvent mastershipEvent =
93 new MastershipEvent(MastershipEvent.Type.MASTER_CHANGED, DEVICE_ID,
94 new RoleInfo(nodeId, ImmutableList.of()));
95
96 private final DeviceEvent deviceEvent =
97 new DeviceEvent(DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED, device);
98
99
100 private static final DefaultAlarm ALARM = new DefaultAlarm.Builder(
101 DEVICE_ID, "aaa", Alarm.SeverityLevel.CRITICAL, 0).build();
102
103 private final Driver driver = new MockDriver();
104
105 private PollingAlarmProvider provider = new PollingAlarmProvider();
106 private Set<DeviceListener> deviceListeners = new HashSet<>();
107 private Set<MastershipListener> mastershipListeners = new HashSet<>();
108 private HashMap<DeviceId, Collection<Alarm>> alarmStore = new HashMap<>();
109
110 @Before
111 public void setUp() {
112 provider.providerRegistry = providerRegistry;
113 provider.deviceService = deviceService;
114 provider.mastershipService = mastershipService;
115 AbstractProjectableModel.setDriverService(null, new DriverServiceAdapter());
116 provider.activate(context);
117 }
118
119 @Test
120 public void activate() throws Exception {
121 assertFalse("Provider should be registered", providerRegistry.getProviders().contains(provider));
122 assertEquals("Device listener should be added", 1, deviceListeners.size());
123 assertEquals("Incorrect alarm provider service", alarmProviderService, provider.providerService);
124 assertEquals("Mastership listener should be added", 1, mastershipListeners.size());
125 assertEquals("Incorrect polling frequency", 1, provider.alarmPollFrequencySeconds);
126 assertFalse("Executor should be running", provider.alarmsExecutor.isShutdown());
127 provider.activate(null);
128 assertEquals("Incorrect polling frequency, should be default", 60, provider.alarmPollFrequencySeconds);
129 }
130
131 @Test
132 public void deactivate() throws Exception {
133 provider.deactivate();
134 assertEquals("Device listener should be removed", 0, deviceListeners.size());
135 assertEquals("Mastership listener should be removed", 0, mastershipListeners.size());
136 assertFalse("Provider should not be registered", providerRegistry.getProviders().contains(provider));
137 assertTrue(provider.alarmsExecutor.isShutdown());
138 assertNull(provider.providerService);
139 }
140
141 @Test
142 public void modified() throws Exception {
143 provider.modified(null);
144 assertEquals("Incorrect polling frequency", 1, provider.alarmPollFrequencySeconds);
145 provider.activate(null);
146 provider.modified(context);
147 assertEquals("Incorrect polling frequency", 1, provider.alarmPollFrequencySeconds);
148 }
149
150 @Test
151 public void alarmsPresent() throws IOException {
152 assertAfter(1100, () -> {
153 assertTrue("Alarms should be added", alarmStore.containsKey(DEVICE_ID));
154 assertTrue("Alarms should be added", alarmStore.get(DEVICE_ID).contains(ALARM));
155 });
156 }
157
158 @Test
159 public void mastershipListenerEvent() throws Exception {
160 assertTrue("Incorrect relevant event", provider.mastershipListener
161 .isRelevant(mastershipEvent));
162 provider.mastershipListener.event(mastershipEvent);
163 assertAfter(1100, () -> {
164 assertTrue("Alarms should be added", alarmStore.containsKey(DEVICE_ID));
165 });
166 }
167
168 @Test
169 public void deviceListenerEvent() throws Exception {
170 assertTrue("Incorrect relevant event", provider.deviceListener
171 .isRelevant(deviceEvent));
172 provider.deviceListener.event(deviceEvent);
173 assertAfter(1100, () -> {
174 assertTrue("Alarms should be added", alarmStore.containsKey(DEVICE_ID));
175 });
176 }
177
178 //TODO add test for modified context and event handling form device listener.
179
180 private class MockDeviceService extends DeviceServiceAdapter {
181
182 @Override
183 public Device getDevice(DeviceId did) {
184 if (did.equals(DEVICE_ID)) {
185 return device;
186 }
187 return null;
188 }
189
190 @Override
191 public Iterable<Device> getAvailableDevices() {
192 return ImmutableSet.of(device);
193 }
194
195 @Override
196 public boolean isAvailable(DeviceId did) {
197 return did.equals(DEVICE_ID);
198 }
199
200 @Override
201 public void addListener(DeviceListener listener) {
202 deviceListeners.add(listener);
203 }
204
205 @Override
206 public void removeListener(DeviceListener listener) {
207 deviceListeners.remove(listener);
208 }
209 }
210
211 private class MockMastershipService extends MastershipServiceAdapter {
212
213 @Override
214 public boolean isLocalMaster(DeviceId deviceId) {
215 return true;
216 }
217
218 @Override
219 public void addListener(MastershipListener listener) {
220 mastershipListeners.add(listener);
221 }
222
223 @Override
224 public void removeListener(MastershipListener listener) {
225 mastershipListeners.remove(listener);
226 }
227 }
228
229 private class MockDeviceProviderRegistry extends AlarmProviderRegistryAdapter {
230
231 Set<ProviderId> providers = new HashSet<>();
232
233 @Override
234 public AlarmProviderService register(AlarmProvider provider) {
235 return alarmProviderService;
236 }
237
238 @Override
239 public void unregister(AlarmProvider provider) {
240 providers.remove(provider.id());
241 }
242
243 @Override
244 public Set<ProviderId> getProviders() {
245 return providers;
246 }
247
248 }
249
250 private class MockAlarmProviderService implements AlarmProviderService {
251
252 @Override
253 public void updateAlarmList(DeviceId deviceId, Collection<Alarm> alarms) {
254 if (alarmStore.containsKey(deviceId)) {
255 Collection<Alarm> deviceAlarms = alarmStore.get(deviceId);
256 deviceAlarms.addAll(alarms);
257 alarmStore.put(deviceId, deviceAlarms);
258 } else {
259 alarmStore.put(deviceId, alarms);
260 }
261
262 }
263
264 @Override
265 public AlarmProvider provider() {
266 return null;
267 }
268 }
269
270 private class MockComponentContext extends ComponentContextAdapter {
271 @Override
272 public Dictionary getProperties() {
273 return new MockDictionary();
274 }
275 }
276
277 private class MockDictionary extends Dictionary {
278
279 @Override
280 public int size() {
281 return 0;
282 }
283
284 @Override
285 public boolean isEmpty() {
286 return false;
287 }
288
289 @Override
290 public Enumeration keys() {
291 return null;
292 }
293
294 @Override
295 public Enumeration elements() {
296 return null;
297 }
298
299 @Override
300 public Object get(Object key) {
301 if (key.equals("pollFrequency")) {
302 return "1";
303 }
304 return null;
305 }
306
307 @Override
308 public Object put(Object key, Object value) {
309 return null;
310 }
311
312 @Override
313 public Object remove(Object key) {
314 return null;
315 }
316 }
317
318 private class MockDevice extends DefaultDevice {
319 /**
320 * Creates a network element attributed to the specified provider.
321 *
322 * @param providerId identity of the provider
323 * @param id device identifier
324 * @param type device type
325 * @param manufacturer device manufacturer
326 * @param hwVersion device HW version
327 * @param swVersion device SW version
328 * @param serialNumber device serial number
329 * @param chassisId chassis id
330 * @param annotations optional key/value annotations
331 */
332 public MockDevice(ProviderId providerId, DeviceId id, Type type,
333 String manufacturer, String hwVersion, String swVersion,
334 String serialNumber, ChassisId chassisId, Annotations... annotations) {
335 super(providerId, id, type, manufacturer, hwVersion, swVersion, serialNumber,
336 chassisId, annotations);
337 }
338
339 @Override
340 protected Driver locateDriver() {
341 return driver;
342 }
343
344 @Override
345 public Driver driver() {
346 return driver;
347 }
348 }
349
350 private class MockDriver extends DriverAdapter {
351 @Override
352 public <T extends Behaviour> T createBehaviour(DriverHandler handler, Class<T> behaviourClass) {
353 return (T) new TestAlarmConsumer();
354 }
355 }
356
357 private class TestAlarmConsumer extends AbstractHandlerBehaviour implements AlarmConsumer {
358
359 @Override
360 public List<Alarm> consumeAlarms() {
361 return ImmutableList.of(ALARM);
362 }
363 }
364
365}