blob: 0ac5d85ff33044fd9ef370f01ee1f8baed14b1bd [file] [log] [blame]
alshabibe1248b62015-08-20 17:21:55 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
alshabibe1248b62015-08-20 17:21:55 -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 */
Ray Milkeyebdd4852017-10-18 16:19:28 -070016package org.onosproject.net.meter.impl;
alshabibe1248b62015-08-20 17:21:55 -070017
Andrea Campanellae3708782017-10-16 16:00:21 +020018import com.google.common.collect.ImmutableList;
19import com.google.common.collect.ImmutableMap;
alshabibe1248b62015-08-20 17:21:55 -070020import com.google.common.collect.Sets;
21import org.junit.After;
22import org.junit.Before;
23import org.junit.Test;
Andrea Campanellae3708782017-10-16 16:00:21 +020024import org.onlab.junit.TestTools;
alshabibe1248b62015-08-20 17:21:55 -070025import org.onlab.junit.TestUtils;
26import org.onlab.packet.IpAddress;
Andrea Campanellae3708782017-10-16 16:00:21 +020027import org.onosproject.cfg.ComponentConfigAdapter;
alshabibe1248b62015-08-20 17:21:55 -070028import org.onosproject.cluster.ClusterServiceAdapter;
29import org.onosproject.cluster.ControllerNode;
30import org.onosproject.cluster.DefaultControllerNode;
31import org.onosproject.cluster.NodeId;
32import org.onosproject.common.event.impl.TestEventDispatcher;
alshabibe1248b62015-08-20 17:21:55 -070033import org.onosproject.incubator.store.meter.impl.DistributedMeterStore;
34import org.onosproject.mastership.MastershipServiceAdapter;
Andrea Campanellae3708782017-10-16 16:00:21 +020035import org.onosproject.net.AnnotationKeys;
36import org.onosproject.net.DefaultAnnotations;
37import org.onosproject.net.DefaultDevice;
38import org.onosproject.net.Device;
alshabibe1248b62015-08-20 17:21:55 -070039import org.onosproject.net.DeviceId;
Andrea Campanellae3708782017-10-16 16:00:21 +020040import org.onosproject.net.MastershipRole;
41import org.onosproject.net.behaviour.MeterQuery;
42import org.onosproject.net.device.DeviceService;
43import org.onosproject.net.device.DeviceServiceAdapter;
44import org.onosproject.net.driver.AbstractHandlerBehaviour;
45import org.onosproject.net.driver.DefaultDriver;
46import org.onosproject.net.driver.DriverRegistry;
47import org.onosproject.net.driver.impl.DriverManager;
48import org.onosproject.net.driver.impl.DriverRegistryManager;
alshabibe1248b62015-08-20 17:21:55 -070049import org.onosproject.net.meter.Band;
50import org.onosproject.net.meter.DefaultBand;
51import org.onosproject.net.meter.DefaultMeter;
Jordi Ortizaa8de492016-12-01 00:21:36 +010052import org.onosproject.net.meter.DefaultMeterFeatures;
alshabibe1248b62015-08-20 17:21:55 -070053import org.onosproject.net.meter.DefaultMeterRequest;
54import org.onosproject.net.meter.Meter;
Pier Luigif094c612017-10-14 12:15:02 +020055import org.onosproject.net.meter.MeterFeatures;
alshabibe1248b62015-08-20 17:21:55 -070056import org.onosproject.net.meter.MeterId;
57import org.onosproject.net.meter.MeterOperation;
58import org.onosproject.net.meter.MeterOperations;
Andrea Campanellae3708782017-10-16 16:00:21 +020059import org.onosproject.net.meter.MeterProgrammable;
alshabibe1248b62015-08-20 17:21:55 -070060import org.onosproject.net.meter.MeterProvider;
61import org.onosproject.net.meter.MeterProviderRegistry;
62import org.onosproject.net.meter.MeterProviderService;
63import org.onosproject.net.meter.MeterRequest;
Andrea Campanellae3708782017-10-16 16:00:21 +020064import org.onosproject.net.meter.MeterService;
alshabibe1248b62015-08-20 17:21:55 -070065import org.onosproject.net.meter.MeterState;
66import org.onosproject.net.provider.AbstractProvider;
67import org.onosproject.net.provider.ProviderId;
68import org.onosproject.store.service.TestStorageService;
69
70import java.util.Collections;
Jordi Ortizaa8de492016-12-01 00:21:36 +010071import java.util.HashSet;
Andrea Campanellae3708782017-10-16 16:00:21 +020072import java.util.ArrayList;
73import java.util.Collection;
74import java.util.List;
alshabibe1248b62015-08-20 17:21:55 -070075import java.util.Set;
Andrea Campanellae3708782017-10-16 16:00:21 +020076import java.util.concurrent.CompletableFuture;
alshabibe1248b62015-08-20 17:21:55 -070077
78import static org.hamcrest.Matchers.is;
Jordi Ortizaa8de492016-12-01 00:21:36 +010079import static org.junit.Assert.*;
alshabibe1248b62015-08-20 17:21:55 -070080import static org.onosproject.net.NetTestTools.APP_ID;
81import static org.onosproject.net.NetTestTools.did;
82import static org.onosproject.net.NetTestTools.injectEventDispatcher;
83
84/**
85 * Meter manager tests.
86 */
87public class MeterManagerTest {
88
Pier Luigif094c612017-10-14 12:15:02 +020089 // Test node id
alshabibe1248b62015-08-20 17:21:55 -070090 private static final NodeId NID_LOCAL = new NodeId("local");
Pier Luigif094c612017-10-14 12:15:02 +020091
92 // Test ip address
alshabibe1248b62015-08-20 17:21:55 -070093 private static final IpAddress LOCALHOST = IpAddress.valueOf("127.0.0.1");
94
Pier Luigif094c612017-10-14 12:15:02 +020095 private static final ProviderId PID = new ProviderId("of", "foo");
alshabibe1248b62015-08-20 17:21:55 -070096
Andrea Campanellae3708782017-10-16 16:00:21 +020097 private static final ProviderId PROGRAMMABLE_PROVIDER = new ProviderId("foo", "foo");
98 private static final DeviceId PROGRAMMABLE_DID = DeviceId.deviceId("test:002");
99
100 private static final DefaultAnnotations ANNOTATIONS =
101 DefaultAnnotations.builder().set(AnnotationKeys.DRIVER, "foo").build();
102
103 private static final Device PROGRAMMABLE_DEV =
104 new DefaultDevice(PROGRAMMABLE_PROVIDER, PROGRAMMABLE_DID, Device.Type.SWITCH,
105 "", "", "", "", null, ANNOTATIONS);
106
107
108 private MeterService service;
109
110 // Test Driver service used during the tests
111 private DriverManager driverService;
112
113 // Test device service used during the tests
114 private DeviceService deviceService;
115
Pier Luigif094c612017-10-14 12:15:02 +0200116 // Test provider used during the tests
alshabibe1248b62015-08-20 17:21:55 -0700117 private TestProvider provider;
118
Pier Luigif094c612017-10-14 12:15:02 +0200119 // Meter manager
120 private MeterManager manager;
alshabibe1248b62015-08-20 17:21:55 -0700121
Pier Luigif094c612017-10-14 12:15:02 +0200122 // Meter provider registry
123 private MeterProviderRegistry registry;
alshabibe1248b62015-08-20 17:21:55 -0700124
Pier Luigif094c612017-10-14 12:15:02 +0200125 // Meter provider service
126 private MeterProviderService providerService;
alshabibe1248b62015-08-20 17:21:55 -0700127
Pier Luigif094c612017-10-14 12:15:02 +0200128 // Store under testing
129 private DistributedMeterStore meterStore;
130
131 // Device ids used during the tests
132 private DeviceId did1 = did("1");
133 private DeviceId did2 = did("2");
134
135 // Meter ids used during the tests
136 private MeterId mid1 = MeterId.meterId(1);
137
138 // Bands used during the tests
Andrea Campanellae3708782017-10-16 16:00:21 +0200139 private static Band b1 = DefaultBand.builder()
Pier Luigif094c612017-10-14 12:15:02 +0200140 .ofType(Band.Type.DROP)
141 .withRate(500)
142 .build();
143
144 // Meters used during the tests
145 private Meter m1 = DefaultMeter.builder()
146 .forDevice(did1)
147 .fromApp(APP_ID)
148 .withId(mid1)
149 .withUnit(Meter.Unit.KB_PER_SEC)
150 .withBands(Collections.singletonList(b1))
151 .build();
152 private Meter m2 = DefaultMeter.builder()
153 .forDevice(did2)
154 .fromApp(APP_ID)
155 .withId(mid1)
156 .withUnit(Meter.Unit.KB_PER_SEC)
157 .withBands(Collections.singletonList(b1))
158 .build();
159
Andrea Campanellae3708782017-10-16 16:00:21 +0200160 private static Meter mProgrammable = DefaultMeter.builder()
161 .forDevice(PROGRAMMABLE_DID)
162 .fromApp(APP_ID)
163 .withId(MeterId.meterId(1))
164 .withUnit(Meter.Unit.KB_PER_SEC)
165 .withBands(Collections.singletonList(b1))
166 .build();
167
Pier Luigif094c612017-10-14 12:15:02 +0200168 // Meter requests used during the tests
169 private MeterRequest.Builder m1Request = DefaultMeterRequest.builder()
170 .forDevice(did1)
171 .fromApp(APP_ID)
172 .withUnit(Meter.Unit.KB_PER_SEC)
173 .withBands(Collections.singletonList(b1));
174 private MeterRequest.Builder m2Request = DefaultMeterRequest.builder()
175 .forDevice(did2)
176 .fromApp(APP_ID)
177 .withUnit(Meter.Unit.KB_PER_SEC)
178 .withBands(Collections.singletonList(b1));
179
Andrea Campanellae3708782017-10-16 16:00:21 +0200180 private MeterRequest.Builder mProgrammableRequest = DefaultMeterRequest.builder()
181 .forDevice(PROGRAMMABLE_DID)
182 .fromApp(APP_ID)
183 .withUnit(Meter.Unit.KB_PER_SEC)
184 .withBands(Collections.singletonList(b1));
185
Pier Luigif094c612017-10-14 12:15:02 +0200186 // Meter features used during the tests
187 private MeterFeatures mef1 = DefaultMeterFeatures.builder().forDevice(did1)
188 .withMaxMeters(3L)
189 .withBandTypes(new HashSet<>())
190 .withUnits(new HashSet<>())
191 .hasStats(false)
192 .hasBurst(false)
193 .withMaxBands((byte) 0)
194 .withMaxColors((byte) 0)
195 .build();
196 private MeterFeatures mef2 = DefaultMeterFeatures.builder().forDevice(did2)
197 .withMaxMeters(10L)
198 .withBandTypes(new HashSet<>())
199 .withUnits(new HashSet<>())
200 .hasStats(false)
201 .hasBurst(false)
202 .withMaxBands((byte) 0)
203 .withMaxColors((byte) 0)
204 .build();
alshabibe1248b62015-08-20 17:21:55 -0700205
Andrea Campanellae3708782017-10-16 16:00:21 +0200206
alshabibe1248b62015-08-20 17:21:55 -0700207 @Before
Pier Luigif094c612017-10-14 12:15:02 +0200208 public void setup() {
Andrea Campanellae3708782017-10-16 16:00:21 +0200209 //Init step for the deviceService
210 deviceService = new TestDeviceService();
211 //Init step for the driver registry and driver service.
212 DriverRegistryManager driverRegistry = new DriverRegistryManager();
213 driverService = new TestDriverManager(driverRegistry, deviceService);
214 driverRegistry.addDriver(new DefaultDriver("foo", ImmutableList.of(), "",
215 "", "",
216 ImmutableMap.of(MeterProgrammable.class,
217 TestMeterProgrammable.class, MeterQuery.class, TestMeterQuery.class),
218 ImmutableMap.of()));
219
Pier Luigif094c612017-10-14 12:15:02 +0200220 // Init step for the store
alshabibe1248b62015-08-20 17:21:55 -0700221 meterStore = new DistributedMeterStore();
Pier Luigif094c612017-10-14 12:15:02 +0200222 // Let's initialize some internal services of the store
alshabibe1248b62015-08-20 17:21:55 -0700223 TestUtils.setField(meterStore, "storageService", new TestStorageService());
224 TestUtils.setField(meterStore, "clusterService", new TestClusterService());
225 TestUtils.setField(meterStore, "mastershipService", new TestMastershipService());
Andrea Campanellae3708782017-10-16 16:00:21 +0200226 TestUtils.setField(meterStore, "driverService", driverService);
Pier Luigif094c612017-10-14 12:15:02 +0200227 // Activate the store
alshabibe1248b62015-08-20 17:21:55 -0700228 meterStore.activate();
Pier Luigif094c612017-10-14 12:15:02 +0200229 // Init step for the manager
alshabibe1248b62015-08-20 17:21:55 -0700230 manager = new MeterManager();
Pier Luigif094c612017-10-14 12:15:02 +0200231 // Let's initialize some internal services of the manager
232 TestUtils.setField(manager, "store", meterStore);
alshabibe1248b62015-08-20 17:21:55 -0700233 injectEventDispatcher(manager, new TestEventDispatcher());
Andrea Campanellae3708782017-10-16 16:00:21 +0200234 manager.deviceService = deviceService;
235 manager.mastershipService = new TestMastershipService();
236 manager.cfgService = new ComponentConfigAdapter();
237 TestUtils.setField(manager, "storageService", new TestStorageService());
Pier Luigif094c612017-10-14 12:15:02 +0200238 // Init the reference of the registry
alshabibe1248b62015-08-20 17:21:55 -0700239 registry = manager;
Andrea Campanellae3708782017-10-16 16:00:21 +0200240
241 manager.driverService = driverService;
242
Pier Luigif094c612017-10-14 12:15:02 +0200243 // Activate the manager
Andrea Campanellae3708782017-10-16 16:00:21 +0200244 manager.activate(null);
Pier Luigif094c612017-10-14 12:15:02 +0200245 // Initialize the test provider
Andrea Campanellae3708782017-10-16 16:00:21 +0200246
alshabibe1248b62015-08-20 17:21:55 -0700247 provider = new TestProvider(PID);
Pier Luigif094c612017-10-14 12:15:02 +0200248 // Register the provider against the manager
alshabibe1248b62015-08-20 17:21:55 -0700249 providerService = registry.register(provider);
Pier Luigif094c612017-10-14 12:15:02 +0200250 // Verify register
alshabibe1248b62015-08-20 17:21:55 -0700251 assertTrue("provider should be registered",
252 registry.getProviders().contains(provider.id()));
alshabibe1248b62015-08-20 17:21:55 -0700253 }
254
255 @After
256 public void tearDown() {
Pier Luigif094c612017-10-14 12:15:02 +0200257 // Unregister provider
alshabibe1248b62015-08-20 17:21:55 -0700258 registry.unregister(provider);
Pier Luigif094c612017-10-14 12:15:02 +0200259 // Verify unregister
alshabibe1248b62015-08-20 17:21:55 -0700260 assertFalse("provider should not be registered",
261 registry.getProviders().contains(provider.id()));
Pier Luigif094c612017-10-14 12:15:02 +0200262 // Deactivate manager
alshabibe1248b62015-08-20 17:21:55 -0700263 manager.deactivate();
Pier Luigif094c612017-10-14 12:15:02 +0200264 // Remove event dispatcher
alshabibe1248b62015-08-20 17:21:55 -0700265 injectEventDispatcher(manager, null);
Pier Luigif094c612017-10-14 12:15:02 +0200266 // Deactivate store
267 meterStore.deactivate();
alshabibe1248b62015-08-20 17:21:55 -0700268 }
269
Pier Luigif094c612017-10-14 12:15:02 +0200270 private void initMeterStore() {
271 // Let's store feature for device 1
272 meterStore.storeMeterFeatures(mef1);
273 // Let's store feature for device 2
274 meterStore.storeMeterFeatures(mef2);
275 }
276
277 // Emulate metrics coming from the dataplane
278 private void pushMetrics(MeterOperation.Type type, Meter meter) {
279 // If it is an add operation
280 if (type == MeterOperation.Type.ADD) {
281 // Update state to added
282 ((DefaultMeter) meter).setState(MeterState.ADDED);
283 // Push the update in the store
284 providerService.pushMeterMetrics(meter.deviceId(), Collections.singletonList(meter));
285 } else {
286 providerService.pushMeterMetrics(meter.deviceId(), Collections.emptyList());
287 }
288 }
289
290 /**
291 * Test add meter.
292 */
alshabibe1248b62015-08-20 17:21:55 -0700293 @Test
Pier Luigif094c612017-10-14 12:15:02 +0200294 public void testAdd() {
295 // Init store
296 initMeterStore();
297 // Submit meter request
alshabibe1248b62015-08-20 17:21:55 -0700298 manager.submit(m1Request.add());
Pier Luigif094c612017-10-14 12:15:02 +0200299 // Verify add
alshabibe1248b62015-08-20 17:21:55 -0700300 assertTrue("The meter was not added", manager.getAllMeters().size() == 1);
Pier Luigif094c612017-10-14 12:15:02 +0200301 assertTrue("The meter was not added", manager.getMeters(did1).size() == 1);
302 // Get Meter
303 Meter installingMeter = manager.getMeter(did1, mid1);
304 // Verify add of installingMeter and pending add state
305 assertThat(installingMeter, is(m1));
306 // Verify pending add state
307 assertThat(installingMeter.state(), is(MeterState.PENDING_ADD));
308 // Let's simulate a working data-plane
309 pushMetrics(MeterOperation.Type.ADD, installingMeter);
310 // Get meter
311 Meter installedMeter = manager.getMeter(did1, mid1);
312 // Verify installation
313 assertThat(installedMeter.state(), is(MeterState.ADDED));
314 assertTrue("The meter was not installed", manager.getAllMeters().size() == 1);
315 assertTrue("The meter was not installed", manager.getMeters(did1).size() == 1);
alshabibe1248b62015-08-20 17:21:55 -0700316 }
317
Pier Luigif094c612017-10-14 12:15:02 +0200318 /**
319 * Test remove meter.
320 */
alshabibe1248b62015-08-20 17:21:55 -0700321 @Test
322 public void testRemove() {
Pier Luigif094c612017-10-14 12:15:02 +0200323 // Init store
324 initMeterStore();
325 // Submit meter request
alshabibe1248b62015-08-20 17:21:55 -0700326 manager.submit(m1Request.add());
Pier Luigif094c612017-10-14 12:15:02 +0200327 // Withdraw meter
alshabibe1248b62015-08-20 17:21:55 -0700328 manager.withdraw(m1Request.remove(), m1.id());
Pier Luigif094c612017-10-14 12:15:02 +0200329 // Get Meter
330 Meter withdrawingMeter = manager.getMeter(did1, mid1);
331 // Verify withdrawing
332 assertThat(withdrawingMeter.state(), is(MeterState.PENDING_REMOVE));
333 assertTrue("The meter was not withdrawn", manager.getAllMeters().size() == 1);
334 assertTrue("The meter was not withdrawn", manager.getMeters(did1).size() == 1);
335 // Let's simulate a working data-plane
336 pushMetrics(MeterOperation.Type.REMOVE, withdrawingMeter);
337 // Verify withdrawn
338 assertNull(manager.getMeter(did1, mid1));
alshabibe1248b62015-08-20 17:21:55 -0700339 assertTrue("The meter was not removed", manager.getAllMeters().size() == 0);
Pier Luigif094c612017-10-14 12:15:02 +0200340 assertTrue("The meter was not removed", manager.getMeters(did1).size() == 0);
alshabibe1248b62015-08-20 17:21:55 -0700341 }
342
Pier Luigif094c612017-10-14 12:15:02 +0200343 /**
344 * Test add multiple device.
345 */
alshabib70aaa1b2015-09-25 14:30:59 -0700346 @Test
Pier Luigif094c612017-10-14 12:15:02 +0200347 public void testAddMultipleDevice() {
348 // Init store
349 initMeterStore();
350 // Submit meter 1
alshabib70aaa1b2015-09-25 14:30:59 -0700351 manager.submit(m1Request.add());
Pier Luigif094c612017-10-14 12:15:02 +0200352 // Submit meter 2
alshabib70aaa1b2015-09-25 14:30:59 -0700353 manager.submit(m2Request.add());
Pier Luigif094c612017-10-14 12:15:02 +0200354 // Verify add
355 assertTrue("The meter was not added", manager.getAllMeters().size() == 2);
356 assertTrue("The meter was not added", manager.getMeters(did1).size() == 1);
357 assertTrue("The meter was not added", manager.getMeters(did2).size() == 1);
358 // Get Meters
359 Meter installingMeter1 = manager.getMeter(did1, mid1);
360 Meter installingMeter2 = manager.getMeter(did2, mid1);
361 // Verify add of installingMeter
362 assertThat(installingMeter1, is(m1));
363 assertThat(installingMeter2, is(m2));
364 // Verify pending add state
365 assertThat(installingMeter1.state(), is(MeterState.PENDING_ADD));
366 assertThat(installingMeter2.state(), is(MeterState.PENDING_ADD));
367 // Let's simulate a working data-plane
368 pushMetrics(MeterOperation.Type.ADD, installingMeter1);
369 pushMetrics(MeterOperation.Type.ADD, installingMeter2);
370 // Get meter
371 Meter installedMeter1 = manager.getMeter(did1, mid1);
372 Meter installedMeter2 = manager.getMeter(did2, mid1);
373 // Verify installation
374 assertThat(installedMeter1.state(), is(MeterState.ADDED));
375 assertThat(installedMeter2.state(), is(MeterState.ADDED));
376 assertTrue("The meter was not installed", manager.getAllMeters().size() == 2);
377 assertTrue("The meter was not installed", manager.getMeters(did1).size() == 1);
378 assertTrue("The meter was not installed", manager.getMeters(did2).size() == 1);
alshabib70aaa1b2015-09-25 14:30:59 -0700379 }
alshabibe1248b62015-08-20 17:21:55 -0700380
Pier Luigif094c612017-10-14 12:15:02 +0200381 /**
382 * Test remove meter.
383 */
Jordi Ortizaa8de492016-12-01 00:21:36 +0100384 @Test
Pier Luigif094c612017-10-14 12:15:02 +0200385 public void testRemoveMultipleDevice() {
386 // Init store
387 initMeterStore();
388 // Submit meter 1
Jordi Ortiz6c847762017-01-30 17:13:05 +0100389 manager.submit(m1Request.add());
Pier Luigif094c612017-10-14 12:15:02 +0200390 // Submit meter 2
391 manager.submit(m2Request.add());
392 // Withdraw meter
393 manager.withdraw(m1Request.remove(), m1.id());
394 // Withdraw meter
395 manager.withdraw(m2Request.remove(), m2.id());
396 // Get Meters
397 Meter withdrawingMeter1 = manager.getMeter(did1, mid1);
398 Meter withdrawingMeter2 = manager.getMeter(did2, mid1);
399 // Verify withdrawing
400 assertThat(withdrawingMeter1.state(), is(MeterState.PENDING_REMOVE));
401 assertThat(withdrawingMeter2.state(), is(MeterState.PENDING_REMOVE));
402 assertTrue("The meter was not withdrawn", manager.getAllMeters().size() == 2);
403 assertTrue("The meter was not withdrawn", manager.getMeters(did1).size() == 1);
404 assertTrue("The meter was not withdrawn", manager.getMeters(did2).size() == 1);
405 // Let's simulate a working data-plane
406 pushMetrics(MeterOperation.Type.REMOVE, withdrawingMeter1);
407 pushMetrics(MeterOperation.Type.REMOVE, withdrawingMeter2);
408 // Verify withdrawn
409 assertNull(manager.getMeter(did1, mid1));
410 assertNull(manager.getMeter(did2, mid1));
411 assertTrue("The meter was not removed", manager.getAllMeters().size() == 0);
412 assertTrue("The meter was not removed", manager.getMeters(did1).size() == 0);
413 assertTrue("The meter was not removed", manager.getMeters(did2).size() == 0);
Jordi Ortiz6c847762017-01-30 17:13:05 +0100414 }
415
Andrea Campanellae3708782017-10-16 16:00:21 +0200416 @Test
417 public void testAddFromMeterProgrammable() {
418
419 // Init store
420 initMeterStore();
421
422 manager.submit(mProgrammableRequest.add());
423
424 TestTools.assertAfter(500, () -> {
425
426 assertTrue("The meter was not added", manager.getAllMeters().size() == 1);
427
428 assertThat(manager.getMeter(PROGRAMMABLE_DID, MeterId.meterId(1)), is(mProgrammable));
429 });
430
431 }
432
433 @Test
434 public void testAddBatchFromMeterProgrammable() {
435
436 // Init store
437 initMeterStore();
438
439 List<MeterOperation> operations = ImmutableList.of(new MeterOperation(mProgrammable, MeterOperation.Type.ADD));
440 manager.defaultProvider().performMeterOperation(PROGRAMMABLE_DID, new MeterOperations(operations));
441
442 TestTools.assertAfter(500, () -> {
443
444 assertTrue("The meter was not added", meterOperations.size() == 1);
445
446 assertTrue("Wrong Meter Operation", meterOperations.get(0).meter().id().equals(mProgrammable.id()));
447 });
448
449 }
450
451 @Test
452 public void testGetFromMeterProgrammable() {
453
454 // Init store
455 initMeterStore();
456
457 MeterDriverProvider fallback = (MeterDriverProvider) manager.defaultProvider();
458
459 testAddFromMeterProgrammable();
460
461 fallback.init(manager.deviceService, fallback.meterProviderService, manager.mastershipService, 1);
462
463 TestTools.assertAfter(2000, () -> {
464 assertTrue("The meter was not added", manager.getAllMeters().size() == 1);
465 Meter m = manager.getMeters(PROGRAMMABLE_DID).iterator().next();
466 assertEquals("incorrect state", MeterState.ADDED, m.state());
467 });
468
469 }
470
Pier Luigif094c612017-10-14 12:15:02 +0200471 // Test cluster service
472 private final class TestClusterService extends ClusterServiceAdapter {
Jordi Ortizaa8de492016-12-01 00:21:36 +0100473
Pier Luigif094c612017-10-14 12:15:02 +0200474 private ControllerNode local = new DefaultControllerNode(NID_LOCAL, LOCALHOST);
Jordi Ortizaa8de492016-12-01 00:21:36 +0100475
Pier Luigif094c612017-10-14 12:15:02 +0200476 @Override
477 public ControllerNode getLocalNode() {
478 return local;
alshabibe1248b62015-08-20 17:21:55 -0700479 }
Pier Luigif094c612017-10-14 12:15:02 +0200480
481 @Override
482 public Set<ControllerNode> getNodes() {
483 return Sets.newHashSet();
484 }
485
alshabibe1248b62015-08-20 17:21:55 -0700486 }
487
Andrea Campanellae3708782017-10-16 16:00:21 +0200488 private static class TestDeviceService extends DeviceServiceAdapter {
489 @Override
490 public int getDeviceCount() {
491 return 1;
492 }
493
494 @Override
495 public Iterable<Device> getDevices() {
496 return ImmutableList.of(PROGRAMMABLE_DEV);
497 }
498
499 @Override
500 public Iterable<Device> getAvailableDevices() {
501 return getDevices();
502 }
503
504 @Override
505 public Device getDevice(DeviceId deviceId) {
506 return PROGRAMMABLE_DEV;
507 }
508 }
509
510 private class TestDriverManager extends DriverManager {
511 TestDriverManager(DriverRegistry registry, DeviceService deviceService) {
512 this.registry = registry;
513 this.deviceService = deviceService;
514 activate();
515 }
516 }
517
518 public static class TestMeterQuery extends AbstractHandlerBehaviour
519 implements MeterQuery {
520 private static final long MAX_METER = 0x00000FFF;
521
522 @Override
523 public long getMaxMeters() {
524 return MAX_METER;
525 }
526 }
527
528 private static List<MeterOperation> meterOperations = new ArrayList<>();
529
530 public static class TestMeterProgrammable extends AbstractHandlerBehaviour
531 implements MeterProgrammable {
532
533 @Override
534 public CompletableFuture<Boolean> performMeterOperation(MeterOperation meterOp) {
535 return CompletableFuture.completedFuture(meterOperations.add(meterOp));
536 }
537
538 @Override
539 public CompletableFuture<Collection<Meter>> getMeters() {
540 //ADD METER
541 DefaultMeter mProgrammableAdded = (DefaultMeter) mProgrammable;
542 mProgrammableAdded.setState(MeterState.ADDED);
543 return CompletableFuture.completedFuture(ImmutableList.of(mProgrammableAdded));
544 }
545 }
546
alshabibe1248b62015-08-20 17:21:55 -0700547 private class TestProvider extends AbstractProvider implements MeterProvider {
548
549 protected TestProvider(ProviderId id) {
550 super(PID);
551 }
552
553 @Override
554 public void performMeterOperation(DeviceId deviceId, MeterOperations meterOps) {
555 //Currently unused.
556 }
557
558 @Override
559 public void performMeterOperation(DeviceId deviceId, MeterOperation meterOp) {
Pier Luigif094c612017-10-14 12:15:02 +0200560 //Currently unused
alshabibe1248b62015-08-20 17:21:55 -0700561 }
562 }
563
Pier Luigif094c612017-10-14 12:15:02 +0200564 // Test mastership service
565 private final class TestMastershipService extends MastershipServiceAdapter {
alshabibe1248b62015-08-20 17:21:55 -0700566 @Override
567 public NodeId getMasterFor(DeviceId deviceId) {
568 return NID_LOCAL;
569 }
Andrea Campanellae3708782017-10-16 16:00:21 +0200570
571 @Override
572 public MastershipRole getLocalRole(DeviceId deviceId) {
573 return MastershipRole.MASTER;
574 }
alshabibe1248b62015-08-20 17:21:55 -0700575 }
Pier Luigif094c612017-10-14 12:15:02 +0200576
alshabibe1248b62015-08-20 17:21:55 -0700577}