blob: e139e73ac9838cebe32752407ce40b069ab97cce [file] [log] [blame]
sanghoa09f2742015-02-06 14:49:47 -08001package org.onosproject.provider.of.group.impl;
2
3import com.google.common.collect.Lists;
4import org.junit.After;
5import org.junit.Before;
6import org.junit.Test;
7import org.onosproject.core.DefaultGroupId;
8import org.onosproject.core.GroupId;
9import org.onosproject.net.DeviceId;
10import org.onosproject.net.PortNumber;
11import org.onosproject.net.flow.DefaultTrafficTreatment;
12import org.onosproject.net.flow.TrafficTreatment;
13import org.onosproject.net.group.DefaultGroupBucket;
14import org.onosproject.net.group.Group;
15import org.onosproject.net.group.GroupBucket;
16import org.onosproject.net.group.GroupBuckets;
17import org.onosproject.net.group.GroupDescription;
18import org.onosproject.net.group.GroupOperation;
19import org.onosproject.net.group.GroupOperations;
20import org.onosproject.net.group.GroupProvider;
21import org.onosproject.net.group.GroupProviderRegistry;
22import org.onosproject.net.group.GroupProviderService;
23import org.onosproject.net.provider.AbstractProviderService;
24import org.onosproject.net.provider.ProviderId;
25import org.onosproject.openflow.controller.Dpid;
26import org.onosproject.openflow.controller.OpenFlowController;
27import org.onosproject.openflow.controller.OpenFlowEventListener;
28import org.onosproject.openflow.controller.OpenFlowSwitch;
29import org.onosproject.openflow.controller.OpenFlowSwitchListener;
30import org.onosproject.openflow.controller.PacketListener;
31import org.onosproject.openflow.controller.RoleState;
32import org.projectfloodlight.openflow.protocol.OFFactories;
33import org.projectfloodlight.openflow.protocol.OFFactory;
34import org.projectfloodlight.openflow.protocol.OFGroupDescStatsReply;
35import org.projectfloodlight.openflow.protocol.OFGroupMod;
36import org.projectfloodlight.openflow.protocol.OFGroupModFailedCode;
37import org.projectfloodlight.openflow.protocol.OFGroupStatsReply;
38import org.projectfloodlight.openflow.protocol.OFGroupType;
39import org.projectfloodlight.openflow.protocol.OFMessage;
40import org.projectfloodlight.openflow.protocol.OFPortDesc;
41import org.projectfloodlight.openflow.protocol.OFVersion;
42import org.projectfloodlight.openflow.protocol.errormsg.OFGroupModFailedErrorMsg;
43import org.projectfloodlight.openflow.types.OFGroup;
44
45import java.util.Collection;
46import java.util.List;
47import java.util.Set;
48
alshabibb452fd72015-04-22 20:46:20 -070049import static org.junit.Assert.*;
sanghoa09f2742015-02-06 14:49:47 -080050
51public class OpenFlowGroupProviderTest {
52
53 OpenFlowGroupProvider provider = new OpenFlowGroupProvider();
54 private final OpenFlowController controller = new TestController();
55 GroupProviderRegistry providerRegistry = new TestGroupProviderRegistry();
56 GroupProviderService providerService;
57
58 private DeviceId deviceId = DeviceId.deviceId("of:0000000000000001");
59 private Dpid dpid1 = Dpid.dpid(deviceId.uri());
60
61 @Before
62 public void setUp() {
63 provider.controller = controller;
64 provider.providerRegistry = providerRegistry;
65 provider.activate();
66 }
67
68 @Test
69 public void basics() {
70 assertNotNull("registration expected", providerService);
71 assertEquals("incorrect provider", provider, providerService.provider());
72 }
73
74 @Test
75 public void addGroup() {
76
77 GroupId groupId = new DefaultGroupId(1);
78
79 List<GroupBucket> bucketList = Lists.newArrayList();
80 TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder();
81 builder.setOutput(PortNumber.portNumber(1));
82 GroupBucket bucket =
83 DefaultGroupBucket.createSelectGroupBucket(builder.build());
84 bucketList.add(bucket);
85 GroupBuckets buckets = new GroupBuckets(bucketList);
86
87 List<GroupOperation> operationList = Lists.newArrayList();
88 GroupOperation operation = GroupOperation.createAddGroupOperation(groupId,
89 GroupDescription.Type.SELECT, buckets);
90 operationList.add(operation);
91 GroupOperations operations = new GroupOperations(operationList);
92
93 provider.performGroupOperation(deviceId, operations);
94
95 final Dpid dpid = Dpid.dpid(deviceId.uri());
96 TestOpenFlowSwitch sw = (TestOpenFlowSwitch) controller.getSwitch(dpid);
97 assertNotNull("Switch should not be nul", sw);
98 assertNotNull("OFGroupMsg should not be null", sw.msg);
99
100 }
101
102
103 @Test
104 public void groupModFailure() {
105 TestOpenFlowGroupProviderService testProviderService =
106 (TestOpenFlowGroupProviderService) providerService;
107
108 GroupId groupId = new DefaultGroupId(1);
109 List<GroupBucket> bucketList = Lists.newArrayList();
110 TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder();
111 builder.setOutput(PortNumber.portNumber(1));
112 GroupBucket bucket =
113 DefaultGroupBucket.createSelectGroupBucket(builder.build());
114 bucketList.add(bucket);
115 GroupBuckets buckets = new GroupBuckets(bucketList);
116 List<GroupOperation> operationList = Lists.newArrayList();
117 GroupOperation operation = GroupOperation.createAddGroupOperation(groupId,
118 GroupDescription.Type.SELECT, buckets);
119 operationList.add(operation);
120 GroupOperations operations = new GroupOperations(operationList);
121
122 provider.performGroupOperation(deviceId, operations);
123
124 OFGroupModFailedErrorMsg.Builder errorBuilder =
125 OFFactories.getFactory(OFVersion.OF_13).errorMsgs().buildGroupModFailedErrorMsg();
126 OFGroupMod.Builder groupBuilder = OFFactories.getFactory(OFVersion.OF_13).buildGroupModify();
127 groupBuilder.setGroupType(OFGroupType.ALL);
128 groupBuilder.setGroup(OFGroup.of(1));
129 errorBuilder.setCode(OFGroupModFailedCode.GROUP_EXISTS);
130 errorBuilder.setXid(provider.getXidAndAdd(0) - 1);
131
132 controller.processPacket(dpid1, errorBuilder.build());
133
134 assertNotNull("Operation failed should not be null",
135 testProviderService.failedOperation);
136 }
137
138
139 @Test
140 public void groupStatsEvent() {
141 TestOpenFlowGroupProviderService testProviderService =
142 (TestOpenFlowGroupProviderService) providerService;
143
144 OFGroupStatsReply.Builder rep1 =
145 OFFactories.getFactory(OFVersion.OF_13).buildGroupStatsReply();
146 rep1.setXid(1);
147 controller.processPacket(dpid1, rep1.build());
148 OFGroupDescStatsReply.Builder rep2 =
149 OFFactories.getFactory(OFVersion.OF_13).buildGroupDescStatsReply();
150 assertNull("group entries is not set yet", testProviderService.getGroupEntries());
151
152 rep2.setXid(2);
153 controller.processPacket(dpid1, rep2.build());
154 assertNotNull("group entries should be set", testProviderService.getGroupEntries());
155 }
156
157
158
159 @After
160 public void tearDown() {
161 provider.deactivate();
162 provider.providerRegistry = null;
163 provider.controller = null;
164 }
165
166 private class TestOpenFlowGroupProviderService
167 extends AbstractProviderService<GroupProvider>
168 implements GroupProviderService {
169
170 Collection<Group> groups = null;
171 GroupOperation failedOperation = null;
172
173 protected TestOpenFlowGroupProviderService(GroupProvider provider) {
174 super(provider);
175 }
176
177 @Override
sangho7ff01812015-02-09 16:21:53 -0800178 public void groupOperationFailed(DeviceId deviceId, GroupOperation operation) {
sanghoa09f2742015-02-06 14:49:47 -0800179 this.failedOperation = operation;
180 }
181
182 @Override
183 public void pushGroupMetrics(DeviceId deviceId, Collection<Group> groupEntries) {
184 this.groups = groupEntries;
185 }
186
187 public Collection<Group> getGroupEntries() {
188 return groups;
189 }
190 }
191
192 private class TestController implements OpenFlowController {
193
194 OpenFlowEventListener eventListener = null;
195 List<OpenFlowSwitch> switches = Lists.newArrayList();
196
197 public TestController() {
198 OpenFlowSwitch testSwitch = new TestOpenFlowSwitch();
199 switches.add(testSwitch);
200 }
201
202 @Override
203 public void addListener(OpenFlowSwitchListener listener) {
204 }
205
206 @Override
207 public void removeListener(OpenFlowSwitchListener listener) {
208
209 }
210
211 @Override
212 public void addPacketListener(int priority, PacketListener listener) {
213
214 }
215
216 @Override
217 public void removePacketListener(PacketListener listener) {
218
219 }
220
221 @Override
222 public void addEventListener(OpenFlowEventListener listener) {
223 this.eventListener = listener;
224 }
225
226 @Override
227 public void removeEventListener(OpenFlowEventListener listener) {
228
229 }
230
231 @Override
232 public void write(Dpid dpid, OFMessage msg) {
233
234 }
235
236 @Override
237 public void processPacket(Dpid dpid, OFMessage msg) {
238 eventListener.handleMessage(dpid, msg);
239 }
240
241 @Override
242 public void setRole(Dpid dpid, RoleState role) {
243
244 }
245
246 @Override
247 public Iterable<OpenFlowSwitch> getSwitches() {
248 return switches;
249 }
250
251 @Override
252 public Iterable<OpenFlowSwitch> getMasterSwitches() {
253 return null;
254 }
255
256 @Override
257 public Iterable<OpenFlowSwitch> getEqualSwitches() {
258 return null;
259 }
260
261 @Override
262 public OpenFlowSwitch getSwitch(Dpid dpid) {
263 return switches.get(0);
264 }
265
266 @Override
267 public OpenFlowSwitch getMasterSwitch(Dpid dpid) {
268 return null;
269 }
270
271 @Override
272 public OpenFlowSwitch getEqualSwitch(Dpid dpid) {
273 return null;
274 }
275
276 }
277
278 private class TestGroupProviderRegistry implements GroupProviderRegistry {
279
280 @Override
281 public GroupProviderService register(GroupProvider provider) {
282 providerService = new TestOpenFlowGroupProviderService(provider);
283 return providerService;
284 }
285
286 @Override
287 public void unregister(GroupProvider provider) {
288 }
289
290 @Override
291 public Set<ProviderId> getProviders() {
292 return null;
293 }
294 }
295
296 private class TestOpenFlowSwitch implements OpenFlowSwitch {
297
298 OFMessage msg = null;
299
300 @Override
301 public void sendMsg(OFMessage msg) {
302 this.msg = msg;
303 }
304
305 @Override
306 public void sendMsg(List<OFMessage> msgs) {
307
308 }
309
310 @Override
sanghoa09f2742015-02-06 14:49:47 -0800311 public void handleMessage(OFMessage fromSwitch) {
312
313 }
314
315 @Override
316 public void setRole(RoleState role) {
317
318 }
319
320 @Override
321 public RoleState getRole() {
322 return null;
323 }
324
325 @Override
326 public List<OFPortDesc> getPorts() {
327 return null;
328 }
329
330 @Override
331 public OFFactory factory() {
332 return OFFactories.getFactory(OFVersion.OF_13);
333 }
334
335 @Override
336 public String getStringId() {
337 return null;
338 }
339
340 @Override
341 public long getId() {
342 return 0;
343 }
344
345 @Override
346 public String manufacturerDescription() {
347 return null;
348 }
349
350 @Override
351 public String datapathDescription() {
352 return null;
353 }
354
355 @Override
356 public String hardwareDescription() {
357 return null;
358 }
359
360 @Override
361 public String softwareDescription() {
362 return null;
363 }
364
365 @Override
366 public String serialNumber() {
367 return null;
368 }
369
370 @Override
371 public boolean isConnected() {
372 return false;
373 }
374
375 @Override
376 public void disconnectSwitch() {
377
378 }
379
380 @Override
381 public void returnRoleReply(RoleState requested, RoleState response) {
382
383 }
384
385 @Override
386 public boolean isOptical() {
387 return false;
388 }
389
390 @Override
391 public String channelId() {
392 return null;
393 }
Saurav Dasfa2fa932015-03-03 11:29:48 -0800394
sanghoa09f2742015-02-06 14:49:47 -0800395 }
396}