e0c0c868ebc6abb66a37032cadbe03b0f8ea479d
[onosfw.git] /
1 /*
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  */
16 package org.onosproject.incubator.net.meter.impl;
17
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;
52
53 import java.util.Collections;
54 import java.util.Map;
55 import java.util.Set;
56
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;
64
65 /**
66  * Meter manager tests.
67  */
68 public 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 }