blob: b3094796c98e332d6f4361819ef429f08b20a15d [file] [log] [blame]
Tian Jian5e4be912017-09-19 12:47:55 +08001/*
2* Copyright 2017-present Open Networking Foundation
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.protobuf.services.nb;
18
19import io.grpc.BindableService;
20import io.grpc.ManagedChannel;
21import io.grpc.inprocess.InProcessChannelBuilder;
22import org.junit.AfterClass;
23import org.junit.BeforeClass;
24import org.junit.Test;
25import org.onosproject.core.ApplicationId;
26import org.onosproject.core.DefaultApplicationId;
27import org.onosproject.grpc.core.models.ApplicationIdProtoOuterClass;
28import org.onosproject.grpc.nb.net.meter.MeterServiceGrpc;
29import org.onosproject.grpc.nb.net.meter.MeterServiceNbProto;
30import org.onosproject.grpc.net.meter.models.BandProtoOuterClass;
31import org.onosproject.grpc.net.meter.models.MeterEnumsProto;
32import org.onosproject.grpc.net.meter.models.MeterProtoOuterClass;
33import org.onosproject.grpc.net.meter.models.MeterRequestProtoOuterClass;
34import org.onosproject.net.DeviceId;
35
36import org.onosproject.net.meter.Band;
37import org.onosproject.net.meter.DefaultBand;
38import org.onosproject.net.meter.Meter;
39import org.onosproject.net.meter.MeterId;
40import org.onosproject.net.meter.MeterService;
41import org.onosproject.net.meter.MeterState;
42import org.onosproject.net.meter.MeterListener;
43import org.onosproject.net.meter.MeterRequest;
44
45import java.io.IOException;
46import java.util.Set;
47import java.util.HashSet;
48import java.util.List;
49import java.util.ArrayList;
50import java.util.Collection;
51
52import static org.junit.Assert.assertTrue;
53
54
55public class GrpcNbMeterServiceTest {
56
57 private static InProcessServer<BindableService> inProcessServer;
58 private static ManagedChannel channel;
59 private static MeterServiceGrpc.MeterServiceBlockingStub blockingStub;
60
61 private static final MeterService MOCK_METER = new MockMeterService();
62
63 private static final DeviceId DEVICE_ID_1 = DeviceId.deviceId("d1");
64 private static final DeviceId DEVICE_ID_2 = DeviceId.deviceId("d2");
65 private static final DeviceId DEVICE_ID_3 = DeviceId.deviceId("d3");
66
67 private static final long METER_ID_1 = 1L;
68 private static final long METER_ID_2 = 2L;
69 private static final long METER_ID_3 = 3L;
70 private static final long METER_ID_4 = 4L;
71
72 private static final Meter METER_1 = new MockMeter(DEVICE_ID_1, 1, METER_ID_1, 1);
73 private static final Meter METER_2 = new MockMeter(DEVICE_ID_2, 1, METER_ID_2, 2);
74 private static final Meter METER_3 = new MockMeter(DEVICE_ID_3, 1, METER_ID_3, 3);
75 private static final Meter METER_4 = new MockMeter(DEVICE_ID_3, 1, METER_ID_4, 4);
76
77 private static Set<Meter> allMeters = new HashSet<>();
78
79 /**
80 * Create inProcessServer and bind grpcNbMeterService.
81 *
82 * @throws IllegalAccessException
83 * @throws IOException
84 * @throws InstantiationException
85 */
86 @BeforeClass
87 public static void setup() throws IllegalAccessException, IOException, InstantiationException {
88
89 GrpcNbMeterService grpcNbMeterService = new GrpcNbMeterService();
90 grpcNbMeterService.meterService = MOCK_METER;
91 inProcessServer = new InProcessServer(GrpcNbMeterService.class);
92 inProcessServer.addServiceToBind(grpcNbMeterService);
93
94 inProcessServer.start();
95 channel = InProcessChannelBuilder.forName("test").directExecutor()
96 // Channels are secure by default (via SSL/TLS). For the example we disable TLS to avoid
97 // needing certificates.
98 .usePlaintext(true).build();
99 blockingStub = MeterServiceGrpc.newBlockingStub(channel);
100
101 allMeters.add(METER_2);
102 allMeters.add(METER_3);
103 allMeters.add(METER_4);
104 }
105
106 @AfterClass
107 public static void down() {
108 channel.shutdown();
109
110 inProcessServer.stop();
111 }
112
113 @Test
114 public void testSubmit() {
115 MeterServiceNbProto.submitRequest request = MeterServiceNbProto.submitRequest.newBuilder()
116 .setMeter(MeterRequestProtoOuterClass.MeterRequestProto.newBuilder()
117 .setDeviceId(DEVICE_ID_1.toString())
118 .setApplicationId(ApplicationIdProtoOuterClass.ApplicationIdProto.newBuilder()
119 .setId(METER_1.appId().id())
120 .build())
121 .setUnit(MeterEnumsProto.MeterUnitProto.KB_PER_SEC)
122 .setIsBurst(false)
123 .addBands(BandProtoOuterClass.BandProto.getDefaultInstance())
124 .setType(MeterEnumsProto.MeterRequestTypeProto.ADD)
125 .build())
126 .build();
127 MeterServiceNbProto.submitReply reply;
128
129 int size = allMeters.size();
130 reply = blockingStub.submit(request);
131 MeterProtoOuterClass.MeterProto meter = reply.getSubmitMeter();
132 assertTrue(allMeters.size() == (size + 1)
133 && meter.getDeviceId().equals(METER_1.deviceId().toString())
134 && meter.getApplicationId().getId() == METER_1.appId().id());
135
136 }
137
138 @Test
139 public void testWithdraw() {
140 MeterServiceNbProto.withdrawRequest request = MeterServiceNbProto.withdrawRequest.newBuilder()
141 .setMeter(MeterRequestProtoOuterClass.MeterRequestProto.newBuilder()
142 .setDeviceId(DEVICE_ID_2.toString())
143 .setApplicationId(ApplicationIdProtoOuterClass.ApplicationIdProto.newBuilder()
144 .setId(1)
145 .build())
146 .setUnit(MeterEnumsProto.MeterUnitProto.KB_PER_SEC)
147 .setIsBurst(false)
148 .addBands(BandProtoOuterClass.BandProto.getDefaultInstance())
149 .setType(MeterEnumsProto.MeterRequestTypeProto.REMOVE)
150 .build())
151 .setMeterId(METER_ID_2)
152 .build();
153 MeterServiceNbProto.withdrawReply reply;
154
155 int size = allMeters.size();
156 reply = blockingStub.withdraw(request);
157 assertTrue(allMeters.size() == (size - 1));
158 }
159
160 @Test
161 public void testGetMeter() {
162 MeterServiceNbProto.getMeterRequest request = MeterServiceNbProto.getMeterRequest.newBuilder()
163 .setDeviceId(DEVICE_ID_3.toString())
164 .setMeterId(METER_ID_3)
165 .build();
166 MeterServiceNbProto.getMeterReply reply;
167
168 reply = blockingStub.getMeter(request);
169 MeterProtoOuterClass.MeterProto meter = reply.getMeter();
170 assertTrue(meter.getApplicationId().getId() == METER_3.appId().id()
171 && meter.getDeviceId().equals(DEVICE_ID_3.toString()));
172 }
173
174 @Test
175 public void testGetAllMeters() {
176 MeterServiceNbProto.getAllMetersRequest request = MeterServiceNbProto.getAllMetersRequest.getDefaultInstance();
177 MeterServiceNbProto.getAllMetersReply reply;
178
179 reply = blockingStub.getAllMeters(request);
180 assertTrue(reply.getMetersCount() == allMeters.size());
181
182 }
183
184 @Test
185 public void testGetMeters() {
186 MeterServiceNbProto.getMetersRequest request = MeterServiceNbProto.getMetersRequest.newBuilder()
187 .setDeviceId(DEVICE_ID_3.toString())
188 .build();
189 MeterServiceNbProto.getMetersReply reply;
190
191 reply = blockingStub.getMeters(request);
192 assertTrue(reply.getMetersCount() == 2);
193 }
194
195
196 /**
197 * A mock class of meter.
198 */
199 private static class MockMeter implements Meter {
200
201 final DeviceId deviceId;
202 final ApplicationId appId;
203 final MeterId meterId;
204 final long baseValue;
205 final List<Band> bandList;
206
207 public MockMeter(DeviceId deviceId, int appId, long meterId, int id) {
208 this.deviceId = deviceId;
209 this.appId = new DefaultApplicationId(appId, String.valueOf(appId));
210 this.baseValue = id * 200L;
211 this.meterId = MeterId.meterId(meterId);
212
213 Band band = DefaultBand.builder()
214 .ofType(Band.Type.REMARK)
215 .withRate(10)
216 .dropPrecedence((short) 20)
217 .burstSize(30).build();
218
219 this.bandList = new ArrayList<>();
220 this.bandList.add(band);
221 }
222
223 @Override
224 public DeviceId deviceId() {
225 return this.deviceId;
226 }
227
228 @Override
229 public MeterId id() {
230 return this.meterId;
231 }
232
233 @Override
234 public ApplicationId appId() {
235 return this.appId;
236 }
237
238 @Override
239 public Unit unit() {
240 return Unit.KB_PER_SEC;
241 }
242
243 @Override
244 public boolean isBurst() {
245 return false;
246 }
247
248 @Override
249 public Collection<Band> bands() {
250 return this.bandList;
251 }
252
253 @Override
254 public MeterState state() {
255 return MeterState.ADDED;
256 }
257
258 @Override
259 public long life() {
260 return baseValue + 11;
261 }
262
263 @Override
264 public long referenceCount() {
265 return baseValue + 22;
266 }
267
268 @Override
269 public long packetsSeen() {
270 return baseValue + 33;
271 }
272
273 @Override
274 public long bytesSeen() {
275 return baseValue + 44;
276 }
277 }
278
279 /**
280 * A mock class of MeterService.
281 */
282 public static class MockMeterService implements MeterService {
283 @Override
284 public void addListener(MeterListener listener) {
285 }
286
287 @Override
288 public void removeListener(MeterListener listener) {
289 }
290
291 @Override
292 public Meter submit(MeterRequest meter) {
293 Meter m = new MockMeter(meter.deviceId(), meter.appId().id(), METER_ID_1, 1);
294 allMeters.add(m);
295 return m;
296 }
297
298 @Override
299 public void withdraw(MeterRequest meter, MeterId meterId) {
300 Meter toRemove = null;
301 for (Meter m: allMeters) {
302 if (meter.appId().id() == m.appId().id() && meter.deviceId().equals(m.deviceId())
303 && m.id().equals(meterId)) {
304 toRemove = m;
305 break;
306 }
307 }
308 if (null != toRemove) {
309 allMeters.remove(toRemove);
310 }
311 }
312
313 @Override
314 public Meter getMeter(DeviceId deviceId, MeterId id) {
315 for (Meter m: allMeters) {
316 if (deviceId.equals(m.deviceId()) && m.id().equals(id)) {
317 return m;
318 }
319 }
320 return null;
321 }
322
323 @Override
324 public Collection<Meter> getAllMeters() {
325 return allMeters;
326 }
327
328 @Override
329 public Collection<Meter> getMeters(DeviceId deviceId) {
330 List<Meter> meters = new ArrayList<>();
331 for (Meter m: allMeters) {
332 if (deviceId.equals(m.deviceId())) {
333 meters.add(m);
334 }
335 }
336 return meters;
337 }
338 }
339
340}