2 * Copyright 2015 Open Networking Laboratory
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package org.onosproject.incubator.net.meter.impl;
18 import com.google.common.collect.Maps;
19 import com.google.common.collect.Sets;
20 import org.junit.After;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.onlab.junit.TestUtils;
24 import org.onlab.packet.IpAddress;
25 import org.onosproject.cluster.ClusterServiceAdapter;
26 import org.onosproject.cluster.ControllerNode;
27 import org.onosproject.cluster.DefaultControllerNode;
28 import org.onosproject.cluster.NodeId;
29 import org.onosproject.common.event.impl.TestEventDispatcher;
30 import org.onosproject.core.ApplicationId;
31 import org.onosproject.core.DefaultApplicationId;
32 import org.onosproject.incubator.store.meter.impl.DistributedMeterStore;
33 import org.onosproject.mastership.MastershipServiceAdapter;
34 import org.onosproject.net.DeviceId;
35 import org.onosproject.net.meter.Band;
36 import org.onosproject.net.meter.DefaultBand;
37 import org.onosproject.net.meter.DefaultMeter;
38 import org.onosproject.net.meter.DefaultMeterRequest;
39 import org.onosproject.net.meter.Meter;
40 import org.onosproject.net.meter.MeterId;
41 import org.onosproject.net.meter.MeterOperation;
42 import org.onosproject.net.meter.MeterOperations;
43 import org.onosproject.net.meter.MeterProvider;
44 import org.onosproject.net.meter.MeterProviderRegistry;
45 import org.onosproject.net.meter.MeterProviderService;
46 import org.onosproject.net.meter.MeterRequest;
47 import org.onosproject.net.meter.MeterService;
48 import org.onosproject.net.meter.MeterState;
49 import org.onosproject.net.provider.AbstractProvider;
50 import org.onosproject.net.provider.ProviderId;
51 import org.onosproject.store.service.TestStorageService;
53 import java.util.Collections;
57 import static org.hamcrest.Matchers.is;
58 import static org.junit.Assert.assertFalse;
59 import static org.junit.Assert.assertThat;
60 import static org.junit.Assert.assertTrue;
61 import static org.onosproject.net.NetTestTools.APP_ID;
62 import static org.onosproject.net.NetTestTools.did;
63 import static org.onosproject.net.NetTestTools.injectEventDispatcher;
66 * Meter manager tests.
68 public class MeterManagerTest {
70 private static final ProviderId PID = new ProviderId("of", "foo");
71 private static final NodeId NID_LOCAL = new NodeId("local");
72 private static final IpAddress LOCALHOST = IpAddress.valueOf("127.0.0.1");
74 private MeterService service;
75 private MeterManager manager;
76 private DistributedMeterStore meterStore;
77 private MeterProviderRegistry registry;
78 private MeterProviderService providerService;
80 private TestProvider provider;
82 private ApplicationId appId;
87 private MeterRequest.Builder m1Request;
88 private MeterRequest.Builder m2Request;
90 private Map<MeterId, Meter> meters = Maps.newHashMap();
93 public void setup() throws Exception {
94 meterStore = new DistributedMeterStore();
95 TestUtils.setField(meterStore, "storageService", new TestStorageService());
96 TestUtils.setField(meterStore, "clusterService", new TestClusterService());
97 TestUtils.setField(meterStore, "mastershipService", new TestMastershipService());
98 meterStore.activate();
100 manager = new MeterManager();
101 manager.store = meterStore;
102 TestUtils.setField(manager, "storageService", new TestStorageService());
103 injectEventDispatcher(manager, new TestEventDispatcher());
109 provider = new TestProvider(PID);
110 providerService = registry.register(provider);
112 appId = new TestApplicationId(0, "MeterManagerTest");
114 assertTrue("provider should be registered",
115 registry.getProviders().contains(provider.id()));
117 Band band = DefaultBand.builder()
118 .ofType(Band.Type.DROP)
122 m1 = DefaultMeter.builder()
125 .withId(MeterId.meterId(1))
126 .withUnit(Meter.Unit.KB_PER_SEC)
127 .withBands(Collections.singletonList(band))
130 m2 = DefaultMeter.builder()
133 .withId(MeterId.meterId(2))
134 .withUnit(Meter.Unit.KB_PER_SEC)
135 .withBands(Collections.singletonList(band))
138 m1Request = DefaultMeterRequest.builder()
141 .withUnit(Meter.Unit.KB_PER_SEC)
142 .withBands(Collections.singletonList(band));
144 m2Request = DefaultMeterRequest.builder()
147 .withUnit(Meter.Unit.KB_PER_SEC)
148 .withBands(Collections.singletonList(band));
154 public void tearDown() {
155 registry.unregister(provider);
156 assertFalse("provider should not be registered",
157 registry.getProviders().contains(provider.id()));
159 manager.deactivate();
160 injectEventDispatcher(manager, null);
165 public void testAddition() {
166 manager.submit(m1Request.add());
168 assertTrue("The meter was not added", manager.getAllMeters().size() == 1);
170 assertThat(manager.getMeter(MeterId.meterId(1)), is(m1));
174 public void testRemove() {
175 manager.submit(m1Request.add());
176 manager.withdraw(m1Request.remove(), m1.id());
178 assertThat(manager.getMeter(MeterId.meterId(1)).state(),
179 is(MeterState.PENDING_REMOVE));
181 providerService.pushMeterMetrics(m1.deviceId(), Collections.emptyList());
183 assertTrue("The meter was not removed", manager.getAllMeters().size() == 0);
189 public class TestApplicationId extends DefaultApplicationId {
190 public TestApplicationId(int id, String name) {
195 private class TestProvider extends AbstractProvider implements MeterProvider {
197 protected TestProvider(ProviderId id) {
202 public void performMeterOperation(DeviceId deviceId, MeterOperations meterOps) {
207 public void performMeterOperation(DeviceId deviceId, MeterOperation meterOp) {
208 meters.put(meterOp.meter().id(), meterOp.meter());
212 private final class TestClusterService extends ClusterServiceAdapter {
214 ControllerNode local = new DefaultControllerNode(NID_LOCAL, LOCALHOST);
217 public ControllerNode getLocalNode() {
222 public Set<ControllerNode> getNodes() {
223 return Sets.newHashSet();
228 private class TestMastershipService extends MastershipServiceAdapter {
230 public NodeId getMasterFor(DeviceId deviceId) {