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