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