blob: e0c0c868ebc6abb66a37032cadbe03b0f8ea479d [file] [log] [blame]
alshabibe1248b62015-08-20 17:21:55 -07001/*
2 * Copyright 2015 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 */
16package org.onosproject.incubator.net.meter.impl;
17
18import com.google.common.collect.Maps;
19import com.google.common.collect.Sets;
20import org.junit.After;
21import org.junit.Before;
22import org.junit.Test;
23import org.onlab.junit.TestUtils;
24import org.onlab.packet.IpAddress;
25import org.onosproject.cluster.ClusterServiceAdapter;
26import org.onosproject.cluster.ControllerNode;
27import org.onosproject.cluster.DefaultControllerNode;
28import org.onosproject.cluster.NodeId;
29import org.onosproject.common.event.impl.TestEventDispatcher;
30import org.onosproject.core.ApplicationId;
31import org.onosproject.core.DefaultApplicationId;
32import org.onosproject.incubator.store.meter.impl.DistributedMeterStore;
33import org.onosproject.mastership.MastershipServiceAdapter;
34import org.onosproject.net.DeviceId;
35import org.onosproject.net.meter.Band;
36import org.onosproject.net.meter.DefaultBand;
37import org.onosproject.net.meter.DefaultMeter;
38import org.onosproject.net.meter.DefaultMeterRequest;
39import org.onosproject.net.meter.Meter;
40import org.onosproject.net.meter.MeterId;
41import org.onosproject.net.meter.MeterOperation;
42import org.onosproject.net.meter.MeterOperations;
43import org.onosproject.net.meter.MeterProvider;
44import org.onosproject.net.meter.MeterProviderRegistry;
45import org.onosproject.net.meter.MeterProviderService;
46import org.onosproject.net.meter.MeterRequest;
47import org.onosproject.net.meter.MeterService;
48import org.onosproject.net.meter.MeterState;
49import org.onosproject.net.provider.AbstractProvider;
50import org.onosproject.net.provider.ProviderId;
51import org.onosproject.store.service.TestStorageService;
52
53import java.util.Collections;
54import java.util.Map;
55import java.util.Set;
56
57import static org.hamcrest.Matchers.is;
58import static org.junit.Assert.assertFalse;
59import static org.junit.Assert.assertThat;
60import static org.junit.Assert.assertTrue;
61import static org.onosproject.net.NetTestTools.APP_ID;
62import static org.onosproject.net.NetTestTools.did;
63import static org.onosproject.net.NetTestTools.injectEventDispatcher;
64
65/**
66 * Meter manager tests.
67 */
68public class MeterManagerTest {
69
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");
73
74 private MeterService service;
75 private MeterManager manager;
76 private DistributedMeterStore meterStore;
77 private MeterProviderRegistry registry;
78 private MeterProviderService providerService;
79
80 private TestProvider provider;
81
82 private ApplicationId appId;
83
84
85 private Meter m1;
86 private Meter m2;
87 private MeterRequest.Builder m1Request;
88 private MeterRequest.Builder m2Request;
89
90 private Map<MeterId, Meter> meters = Maps.newHashMap();
91
92 @Before
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();
99
100 manager = new MeterManager();
101 manager.store = meterStore;
102 TestUtils.setField(manager, "storageService", new TestStorageService());
103 injectEventDispatcher(manager, new TestEventDispatcher());
104 service = manager;
105 registry = manager;
106
107 manager.activate();
108
109 provider = new TestProvider(PID);
110 providerService = registry.register(provider);
111
112 appId = new TestApplicationId(0, "MeterManagerTest");
113
114 assertTrue("provider should be registered",
115 registry.getProviders().contains(provider.id()));
116
117 Band band = DefaultBand.builder()
118 .ofType(Band.Type.DROP)
119 .withRate(500)
120 .build();
121
122 m1 = DefaultMeter.builder()
123 .forDevice(did("1"))
124 .fromApp(APP_ID)
125 .withId(MeterId.meterId(1))
126 .withUnit(Meter.Unit.KB_PER_SEC)
127 .withBands(Collections.singletonList(band))
128 .build();
129
130 m2 = DefaultMeter.builder()
131 .forDevice(did("2"))
132 .fromApp(APP_ID)
133 .withId(MeterId.meterId(2))
134 .withUnit(Meter.Unit.KB_PER_SEC)
135 .withBands(Collections.singletonList(band))
136 .build();
137
138 m1Request = DefaultMeterRequest.builder()
139 .forDevice(did("1"))
140 .fromApp(APP_ID)
141 .withUnit(Meter.Unit.KB_PER_SEC)
142 .withBands(Collections.singletonList(band));
143
144 m2Request = DefaultMeterRequest.builder()
145 .forDevice(did("2"))
146 .fromApp(APP_ID)
147 .withUnit(Meter.Unit.KB_PER_SEC)
148 .withBands(Collections.singletonList(band));
149
150
151 }
152
153 @After
154 public void tearDown() {
155 registry.unregister(provider);
156 assertFalse("provider should not be registered",
157 registry.getProviders().contains(provider.id()));
158
159 manager.deactivate();
160 injectEventDispatcher(manager, null);
161
162 }
163
164 @Test
165 public void testAddition() {
166 manager.submit(m1Request.add());
167
168 assertTrue("The meter was not added", manager.getAllMeters().size() == 1);
169
170 assertThat(manager.getMeter(MeterId.meterId(1)), is(m1));
171 }
172
173 @Test
174 public void testRemove() {
175 manager.submit(m1Request.add());
176 manager.withdraw(m1Request.remove(), m1.id());
177
178 assertThat(manager.getMeter(MeterId.meterId(1)).state(),
179 is(MeterState.PENDING_REMOVE));
180
181 providerService.pushMeterMetrics(m1.deviceId(), Collections.emptyList());
182
183 assertTrue("The meter was not removed", manager.getAllMeters().size() == 0);
184
185 }
186
187
188
189 public class TestApplicationId extends DefaultApplicationId {
190 public TestApplicationId(int id, String name) {
191 super(id, name);
192 }
193 }
194
195 private class TestProvider extends AbstractProvider implements MeterProvider {
196
197 protected TestProvider(ProviderId id) {
198 super(PID);
199 }
200
201 @Override
202 public void performMeterOperation(DeviceId deviceId, MeterOperations meterOps) {
203 //Currently unused.
204 }
205
206 @Override
207 public void performMeterOperation(DeviceId deviceId, MeterOperation meterOp) {
208 meters.put(meterOp.meter().id(), meterOp.meter());
209 }
210 }
211
212 private final class TestClusterService extends ClusterServiceAdapter {
213
214 ControllerNode local = new DefaultControllerNode(NID_LOCAL, LOCALHOST);
215
216 @Override
217 public ControllerNode getLocalNode() {
218 return local;
219 }
220
221 @Override
222 public Set<ControllerNode> getNodes() {
223 return Sets.newHashSet();
224 }
225
226 }
227
228 private class TestMastershipService extends MastershipServiceAdapter {
229 @Override
230 public NodeId getMasterFor(DeviceId deviceId) {
231 return NID_LOCAL;
232 }
233 }
234}