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