blob: 564bea266006d5b439545a81c263423f5f32b11e [file] [log] [blame]
tombe988312014-09-19 18:38:47 -07001package org.onlab.onos.net.flow.impl;
Ayaka Koshibeb55524f2014-09-18 09:59:24 -07002
3import static org.junit.Assert.assertEquals;
4import static org.junit.Assert.assertFalse;
5import static org.junit.Assert.assertNotNull;
6import static org.junit.Assert.assertTrue;
alshabib97044902014-09-18 14:52:16 -07007import static org.onlab.onos.net.flow.FlowRuleEvent.Type.RULE_ADDED;
8import static org.onlab.onos.net.flow.FlowRuleEvent.Type.RULE_REMOVED;
alshabib219ebaa2014-09-22 15:41:24 -07009import static org.onlab.onos.net.flow.FlowRuleEvent.Type.RULE_UPDATED;
Ayaka Koshibeb55524f2014-09-18 09:59:24 -070010
11import java.util.ArrayList;
12import java.util.List;
13
14import org.junit.After;
15import org.junit.Before;
16import org.junit.Test;
17import org.onlab.onos.event.impl.TestEventDispatcher;
18import org.onlab.onos.net.DefaultDevice;
19import org.onlab.onos.net.Device;
20import org.onlab.onos.net.Device.Type;
21import org.onlab.onos.net.DeviceId;
22import org.onlab.onos.net.MastershipRole;
23import org.onlab.onos.net.Port;
24import org.onlab.onos.net.PortNumber;
25import org.onlab.onos.net.device.DeviceListener;
26import org.onlab.onos.net.device.DeviceService;
Ayaka Koshibeb55524f2014-09-18 09:59:24 -070027import org.onlab.onos.net.flow.DefaultFlowRule;
Ayaka Koshibeb55524f2014-09-18 09:59:24 -070028import org.onlab.onos.net.flow.FlowRule;
29import org.onlab.onos.net.flow.FlowRuleEvent;
30import org.onlab.onos.net.flow.FlowRuleListener;
31import org.onlab.onos.net.flow.FlowRuleProvider;
32import org.onlab.onos.net.flow.FlowRuleProviderRegistry;
33import org.onlab.onos.net.flow.FlowRuleProviderService;
34import org.onlab.onos.net.flow.FlowRuleService;
35import org.onlab.onos.net.flow.TrafficSelector;
36import org.onlab.onos.net.flow.TrafficTreatment;
37import org.onlab.onos.net.flow.criteria.Criterion;
38import org.onlab.onos.net.flow.instructions.Instruction;
39import org.onlab.onos.net.provider.AbstractProvider;
40import org.onlab.onos.net.provider.ProviderId;
alshabib219ebaa2014-09-22 15:41:24 -070041import org.onlab.onos.net.trivial.impl.SimpleFlowRuleStore;
Ayaka Koshibeb55524f2014-09-18 09:59:24 -070042
43import com.google.common.collect.Lists;
44import com.google.common.collect.Sets;
45
Ayaka Koshibeb55524f2014-09-18 09:59:24 -070046/**
47 * Test codifying the flow rule service & flow rule provider service contracts.
48 */
tom202175a2014-09-19 19:00:11 -070049public class FlowRuleManagerTest {
Ayaka Koshibeb55524f2014-09-18 09:59:24 -070050
tomf6ab2152014-09-18 12:08:29 -070051 private static final ProviderId PID = new ProviderId("of", "foo");
Ayaka Koshibeb55524f2014-09-18 09:59:24 -070052 private static final DeviceId DID = DeviceId.deviceId("of:001");
53 private static final Device DEV = new DefaultDevice(
54 PID, DID, Type.SWITCH, "", "", "", "");
55
tom202175a2014-09-19 19:00:11 -070056 private FlowRuleManager mgr;
Ayaka Koshibeb55524f2014-09-18 09:59:24 -070057
58 protected FlowRuleService service;
59 protected FlowRuleProviderRegistry registry;
60 protected FlowRuleProviderService providerSerivce;
61 protected TestProvider provider;
62 protected TestListener listener = new TestListener();
63
64 @Before
65 public void setUp() {
tom202175a2014-09-19 19:00:11 -070066 mgr = new FlowRuleManager();
tombe988312014-09-19 18:38:47 -070067 mgr.store = new SimpleFlowRuleStore();
Ayaka Koshibeb55524f2014-09-18 09:59:24 -070068 mgr.eventDispatcher = new TestEventDispatcher();
69 mgr.deviceService = new TestDeviceService();
70 service = mgr;
71 registry = mgr;
72
73 mgr.activate();
74 mgr.addListener(listener);
75 provider = new TestProvider(PID);
76 providerSerivce = registry.register(provider);
77 assertTrue("provider should be registered",
78 registry.getProviders().contains(provider.id()));
79 }
80
81 @After
82 public void tearDown() {
83 registry.unregister(provider);
84 assertFalse("provider should not be registered",
alshabib97044902014-09-18 14:52:16 -070085 registry.getProviders().contains(provider.id()));
Ayaka Koshibeb55524f2014-09-18 09:59:24 -070086 service.removeListener(listener);
87 mgr.deactivate();
88 mgr.eventDispatcher = null;
89 mgr.deviceService = null;
90 }
91
92 private FlowRule flowRule(int tsval, int trval) {
93 TestSelector ts = new TestSelector(tsval);
94 TestTreatment tr = new TestTreatment(trval);
Ayaka Koshibed4e53e12014-09-18 14:24:55 -070095 return new DefaultFlowRule(DID, ts, tr, 0);
Ayaka Koshibeb55524f2014-09-18 09:59:24 -070096 }
97
98 private void addFlowRule(int hval) {
99 FlowRule rule = flowRule(hval, hval);
100 providerSerivce.flowAdded(rule);
101 assertNotNull("rule should be found", service.getFlowEntries(DID));
102 }
103
104 private void validateEvents(FlowRuleEvent.Type ... events) {
105 if (events == null) {
106 assertTrue("events generated", listener.events.isEmpty());
107 }
108
109 int i = 0;
110 for (FlowRuleEvent e : listener.events) {
111 assertTrue("unexpected event", e.type().equals(events[i]));
112 i++;
113 }
114
115 assertEquals("mispredicted number of events",
116 events.length, listener.events.size());
117
118 listener.events.clear();
119 }
120
121 private int flowCount() {
122 return Sets.newHashSet(service.getFlowEntries(DID)).size();
123 }
124 @Test
125 public void getFlowEntries() {
126 assertTrue("store should be empty",
127 Sets.newHashSet(service.getFlowEntries(DID)).isEmpty());
128 addFlowRule(1);
129 addFlowRule(2);
130 assertEquals("2 rules should exist", 2, flowCount());
131 validateEvents(RULE_ADDED, RULE_ADDED);
132
133 addFlowRule(1);
134 assertEquals("should still be 2 rules", 2, flowCount());
alshabib219ebaa2014-09-22 15:41:24 -0700135 validateEvents(RULE_UPDATED);
Ayaka Koshibeb55524f2014-09-18 09:59:24 -0700136 }
137
138 @Test
139 public void applyFlowRules() {
140 TestSelector ts = new TestSelector(1);
141 FlowRule r1 = flowRule(1, 1);
142 FlowRule r2 = flowRule(1, 2);
143 FlowRule r3 = flowRule(1, 3);
144
145 //current FlowRules always return 0. FlowEntries inherit the value
Ayaka Koshibed4e53e12014-09-18 14:24:55 -0700146 FlowRule e1 = new DefaultFlowRule(DID, ts, r1.treatment(), 0);
147 FlowRule e2 = new DefaultFlowRule(DID, ts, r2.treatment(), 0);
148 FlowRule e3 = new DefaultFlowRule(DID, ts, r3.treatment(), 0);
149 List<FlowRule> fel = Lists.newArrayList(e1, e2, e3);
Ayaka Koshibeb55524f2014-09-18 09:59:24 -0700150
151 assertTrue("store should be empty",
152 Sets.newHashSet(service.getFlowEntries(DID)).isEmpty());
alshabib219ebaa2014-09-22 15:41:24 -0700153 mgr.applyFlowRules(r1, r2, r3);
Ayaka Koshibeb55524f2014-09-18 09:59:24 -0700154 assertEquals("3 rules should exist", 3, flowCount());
alshabib219ebaa2014-09-22 15:41:24 -0700155 assertTrue("3 entries should result", fel.containsAll(Lists.newArrayList(r1, r2, r3)));
Ayaka Koshibeb55524f2014-09-18 09:59:24 -0700156 }
157
158 @Test
159 public void removeFlowRules() {
160 addFlowRule(1);
161 addFlowRule(2);
162 addFlowRule(3);
163 assertEquals("3 rules should exist", 3, flowCount());
164 validateEvents(RULE_ADDED, RULE_ADDED, RULE_ADDED);
165
166 FlowRule rem1 = flowRule(1, 1);
167 FlowRule rem2 = flowRule(2, 2);
168 mgr.removeFlowRules(rem1, rem2);
169 //removing from north, so no events generated
170 validateEvents();
alshabib219ebaa2014-09-22 15:41:24 -0700171 assertEquals("3 rule should exist", 3, flowCount());
Ayaka Koshibeb55524f2014-09-18 09:59:24 -0700172
173 mgr.removeFlowRules(rem1);
alshabib219ebaa2014-09-22 15:41:24 -0700174 assertEquals("3 rule should still exist", 3, flowCount());
Ayaka Koshibeb55524f2014-09-18 09:59:24 -0700175 }
176
177 @Test
178 public void flowRemoved() {
179 addFlowRule(1);
180 addFlowRule(2);
181 FlowRule rem1 = flowRule(1, 1);
182 providerSerivce.flowRemoved(rem1);
183 validateEvents(RULE_ADDED, RULE_ADDED, RULE_REMOVED);
184
185 providerSerivce.flowRemoved(rem1);
186 validateEvents();
187 }
188
189 private static class TestListener implements FlowRuleListener {
190 final List<FlowRuleEvent> events = new ArrayList<>();
191
192 @Override
193 public void event(FlowRuleEvent event) {
194 events.add(event);
195 }
196 }
197
198 private static class TestDeviceService implements DeviceService {
199
200 @Override
201 public int getDeviceCount() {
202 return 0;
203 }
204
205 @Override
206 public Iterable<Device> getDevices() {
207 return null;
208 }
209
210 @Override
211 public Device getDevice(DeviceId deviceId) {
212 return DEV;
213 }
214
215 @Override
216 public MastershipRole getRole(DeviceId deviceId) {
217 return null;
218 }
219
220 @Override
221 public List<Port> getPorts(DeviceId deviceId) {
222 return null;
223 }
224
225 @Override
226 public Port getPort(DeviceId deviceId, PortNumber portNumber) {
227 return null;
228 }
229
230 @Override
231 public boolean isAvailable(DeviceId deviceId) {
232 return false;
233 }
234
235 @Override
236 public void addListener(DeviceListener listener) {
237 }
238
239 @Override
240 public void removeListener(DeviceListener listener) {
241 }
242
243 }
244
245 private class TestProvider extends AbstractProvider implements FlowRuleProvider {
246
247 protected TestProvider(ProviderId id) {
248 super(PID);
249 }
250
251 @Override
252 public void applyFlowRule(FlowRule... flowRules) {
253 }
254
255 @Override
256 public void removeFlowRule(FlowRule... flowRules) {
257 }
258
Ayaka Koshibeb55524f2014-09-18 09:59:24 -0700259 }
260
261 private class TestSelector implements TrafficSelector {
262
263 //for controlling hashcode uniqueness;
alshabib97044902014-09-18 14:52:16 -0700264 private final int testval;
Ayaka Koshibeb55524f2014-09-18 09:59:24 -0700265
266 public TestSelector(int val) {
267 testval = val;
268 }
269
270 @Override
271 public List<Criterion> criteria() {
272 return null;
273 }
274
275 @Override
276 public int hashCode() {
277 return testval;
278 }
279
280 @Override
281 public boolean equals(Object o) {
282 if (o instanceof TestSelector) {
283 return this.testval == ((TestSelector) o).testval;
284 }
285 return false;
286 }
287 }
288
289 private class TestTreatment implements TrafficTreatment {
290
291 //for controlling hashcode uniqueness;
alshabib97044902014-09-18 14:52:16 -0700292 private final int testval;
Ayaka Koshibeb55524f2014-09-18 09:59:24 -0700293
294 public TestTreatment(int val) {
295 testval = val;
296 }
297
298 @Override
299 public List<Instruction> instructions() {
300 return null;
301 }
302
303 @Override
304 public int hashCode() {
305 return testval;
306 }
307
308 @Override
309 public boolean equals(Object o) {
310 if (o instanceof TestTreatment) {
311 return this.testval == ((TestTreatment) o).testval;
312 }
313 return false;
314 }
315
316 }
317
318}