blob: ab1118868fe8f9cdf105449711496f6ac754e623 [file] [log] [blame]
Jonathan Hart23701d12014-04-03 10:45:48 -07001package net.onrc.onos.core.flowprogrammer;
Naoki Shiota75b7dd62013-12-03 18:09:21 -08002
Brian O'Connorc67f9fa2014-08-07 18:17:46 -07003
Naoki Shiota47993102014-07-09 14:00:54 -07004import static org.junit.Assert.assertNotNull;
5import static org.junit.Assert.assertTrue;
6import static org.junit.Assert.fail;
7
8import java.io.IOException;
9import java.util.ArrayList;
10import java.util.HashMap;
11import java.util.List;
12import java.util.Map;
13import java.util.concurrent.ScheduledExecutorService;
14import java.util.concurrent.TimeUnit;
15
Naoki Shiota75b7dd62013-12-03 18:09:21 -080016import net.floodlightcontroller.core.FloodlightContext;
17import net.floodlightcontroller.core.IFloodlightProviderService;
18import net.floodlightcontroller.core.IOFSwitch;
Brian O'Connorc67f9fa2014-08-07 18:17:46 -070019import net.floodlightcontroller.core.internal.OFMessageFuture;
Naoki Shiota75b7dd62013-12-03 18:09:21 -080020import net.floodlightcontroller.core.module.FloodlightModuleContext;
21import net.floodlightcontroller.threadpool.IThreadPoolService;
Brian O'Connorc67f9fa2014-08-07 18:17:46 -070022import net.onrc.onos.core.intent.FlowEntry;
23import net.onrc.onos.core.intent.IntentOperation.Operator;
Ray Milkey10643572014-06-10 15:17:39 -070024import net.onrc.onos.core.util.IntegrationTest;
Naoki Shiota47993102014-07-09 14:00:54 -070025
Naoki Shiota75b7dd62013-12-03 18:09:21 -080026import org.easymock.EasyMock;
Naoki Shiota75b7dd62013-12-03 18:09:21 -080027import org.junit.Test;
Ray Milkey10643572014-06-10 15:17:39 -070028import org.junit.experimental.categories.Category;
Brian O'Connorc67f9fa2014-08-07 18:17:46 -070029import org.projectfloodlight.openflow.protocol.OFBarrierReply;
30import org.projectfloodlight.openflow.protocol.OFBarrierRequest;
31import org.projectfloodlight.openflow.protocol.OFFactories;
32import org.projectfloodlight.openflow.protocol.OFFactory;
33import org.projectfloodlight.openflow.protocol.OFFlowModify;
34import org.projectfloodlight.openflow.protocol.OFMessage;
35import org.projectfloodlight.openflow.protocol.OFType;
36import org.projectfloodlight.openflow.protocol.OFVersion;
37import org.projectfloodlight.openflow.protocol.action.OFAction;
38import org.projectfloodlight.openflow.protocol.match.Match;
39import org.projectfloodlight.openflow.types.OFBufferId;
40import org.projectfloodlight.openflow.types.OFPort;
41import org.projectfloodlight.openflow.types.U64;
42
Naoki Shiota75b7dd62013-12-03 18:09:21 -080043
Ray Milkey10643572014-06-10 15:17:39 -070044@Category(IntegrationTest.class)
Naoki Shiota75b7dd62013-12-03 18:09:21 -080045public class FlowPusherTest {
Ray Milkey269ffb92014-04-03 14:43:30 -070046 private FlowPusher pusher;
47 private FloodlightContext context;
48 private FloodlightModuleContext modContext;
Ray Milkey269ffb92014-04-03 14:43:30 -070049 private IFloodlightProviderService flProviderService;
50 private IThreadPoolService threadPoolService;
Naoki Shiota75b7dd62013-12-03 18:09:21 -080051
Brian O'Connorc67f9fa2014-08-07 18:17:46 -070052 private OFFactory factory10 = OFFactories.getFactory(OFVersion.OF_10);
53
Ray Milkey269ffb92014-04-03 14:43:30 -070054 /**
Jonathan Hart51bb27c2014-08-11 16:00:31 -070055 * Test single OFMessage is correctly sent to single switch.
Ray Milkey269ffb92014-04-03 14:43:30 -070056 */
57 @Test
58 public void testAddMessage() {
59 beginInitMock();
Naoki Shiota75b7dd62013-12-03 18:09:21 -080060
Ray Milkey269ffb92014-04-03 14:43:30 -070061 OFMessage msg = EasyMock.createMock(OFMessage.class);
Brian O'Connorc67f9fa2014-08-07 18:17:46 -070062 EasyMock.expect(msg.getXid()).andReturn((long) 1).anyTimes();
63 //EasyMock.expect(msg.()).andReturn((short) 100).anyTimes();
Ray Milkey269ffb92014-04-03 14:43:30 -070064 EasyMock.replay(msg);
Naoki Shiota75b7dd62013-12-03 18:09:21 -080065
Naoki Shiota47993102014-07-09 14:00:54 -070066 IOFSwitch sw = createConnectedSwitchMock(1, false);
Brian O'Connorc67f9fa2014-08-07 18:17:46 -070067
68
Naoki Shiotad6ef3b32014-03-13 18:42:23 -070069
Ray Milkey269ffb92014-04-03 14:43:30 -070070 try {
Brian O'Connorc67f9fa2014-08-07 18:17:46 -070071 sw.write(EasyMock.eq(msg), EasyMock.eq((FloodlightContext) null));
72 EasyMock.expectLastCall().once();
73 EasyMock.replay(sw);
Ray Milkey269ffb92014-04-03 14:43:30 -070074 } catch (IOException e1) {
Brian O'Connorc67f9fa2014-08-07 18:17:46 -070075 fail("Failed in IOFSwitch#write()");
Ray Milkey269ffb92014-04-03 14:43:30 -070076 }
Naoki Shiota75b7dd62013-12-03 18:09:21 -080077
Ray Milkey269ffb92014-04-03 14:43:30 -070078 endInitMock();
79 initPusher(1);
Naoki Shiotad6ef3b32014-03-13 18:42:23 -070080
Yuta HIGUCHI44a0b352014-05-14 21:32:48 -070081 boolean addResult = pusher.add(sw, msg);
82 assertTrue(addResult);
Naoki Shiota75b7dd62013-12-03 18:09:21 -080083
Ray Milkey269ffb92014-04-03 14:43:30 -070084 try {
85 // wait until message is processed.
86 Thread.sleep(1000);
87 } catch (InterruptedException e) {
88 fail("Failed in Thread.sleep()");
89 }
90 EasyMock.verify(msg);
91 EasyMock.verify(sw);
92 verifyAll();
Naoki Shiota75b7dd62013-12-03 18:09:21 -080093
Ray Milkey269ffb92014-04-03 14:43:30 -070094 pusher.stop();
95 }
Naoki Shiota75b7dd62013-12-03 18:09:21 -080096
Ray Milkey269ffb92014-04-03 14:43:30 -070097 /**
Jonathan Hart51bb27c2014-08-11 16:00:31 -070098 * Test bunch of OFMessages are correctly sent to single switch.
Ray Milkey269ffb92014-04-03 14:43:30 -070099 */
100 @Test
101 public void testMassiveAddMessage() {
Yuta HIGUCHI7c39c842014-06-09 16:33:03 -0700102 // Some number larger than FlowPusher.MAX_MESSAGE_SEND
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700103 final int numMsg = FlowPusher.MAX_MESSAGE_SEND * 2;
Naoki Shiotad6ef3b32014-03-13 18:42:23 -0700104
Ray Milkey269ffb92014-04-03 14:43:30 -0700105 beginInitMock();
Naoki Shiota75b7dd62013-12-03 18:09:21 -0800106
Naoki Shiota47993102014-07-09 14:00:54 -0700107 IOFSwitch sw = createConnectedSwitchMock(1, false);
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700108
Naoki Shiota75b7dd62013-12-03 18:09:21 -0800109
Ray Milkey269ffb92014-04-03 14:43:30 -0700110 List<OFMessage> messages = new ArrayList<OFMessage>();
Naoki Shiota75b7dd62013-12-03 18:09:21 -0800111
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700112 for (int i = 0; i < numMsg; ++i) {
Ray Milkey269ffb92014-04-03 14:43:30 -0700113 OFMessage msg = EasyMock.createMock(OFMessage.class);
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700114 EasyMock.expect(msg.getXid()).andReturn((long) i).anyTimes();
Ray Milkey269ffb92014-04-03 14:43:30 -0700115 EasyMock.replay(msg);
116 messages.add(msg);
Naoki Shiota75b7dd62013-12-03 18:09:21 -0800117
Ray Milkey269ffb92014-04-03 14:43:30 -0700118 try {
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700119 sw.write(EasyMock.eq(msg), EasyMock.eq((FloodlightContext) null));
120 EasyMock.expectLastCall().once();
Ray Milkey269ffb92014-04-03 14:43:30 -0700121 } catch (IOException e1) {
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700122 fail("Failed in IOFSwitch#write()");
Ray Milkey269ffb92014-04-03 14:43:30 -0700123 }
124 }
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700125 EasyMock.replay(sw);
Ray Milkey269ffb92014-04-03 14:43:30 -0700126 endInitMock();
127 initPusher(1);
Naoki Shiota75b7dd62013-12-03 18:09:21 -0800128
Ray Milkey269ffb92014-04-03 14:43:30 -0700129 for (OFMessage msg : messages) {
Yuta HIGUCHI44a0b352014-05-14 21:32:48 -0700130 boolean addResult = pusher.add(sw, msg);
131 assertTrue(addResult);
Ray Milkey269ffb92014-04-03 14:43:30 -0700132 }
Naoki Shiota75b7dd62013-12-03 18:09:21 -0800133
Ray Milkey269ffb92014-04-03 14:43:30 -0700134 try {
135 // wait until message is processed.
Yuta HIGUCHI7c39c842014-06-09 16:33:03 -0700136 Thread.sleep(1000);
Ray Milkey269ffb92014-04-03 14:43:30 -0700137 } catch (InterruptedException e) {
138 fail("Failed in Thread.sleep()");
139 }
Naoki Shiotad6ef3b32014-03-13 18:42:23 -0700140
Ray Milkey269ffb92014-04-03 14:43:30 -0700141 for (OFMessage msg : messages) {
142 EasyMock.verify(msg);
143 }
144 EasyMock.verify(sw);
145 verifyAll();
146
147 pusher.stop();
148 }
149
150 /**
151 * Test bunch of OFMessages are correctly sent to multiple switches with single threads.
152 */
153 @Test
154 public void testMultiSwitchAddMessage() {
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700155 final int numSwitch = 10;
156 final int numMsg = 100; // messages per thread
Ray Milkey269ffb92014-04-03 14:43:30 -0700157
158 beginInitMock();
159
Yuta HIGUCHI44a0b352014-05-14 21:32:48 -0700160 Map<IOFSwitch, List<OFMessage>> swMap = new HashMap<IOFSwitch, List<OFMessage>>();
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700161 for (int i = 0; i < numSwitch; ++i) {
Naoki Shiota47993102014-07-09 14:00:54 -0700162 IOFSwitch sw = createConnectedSwitchMock(i, false);
Ray Milkey269ffb92014-04-03 14:43:30 -0700163
164 List<OFMessage> messages = new ArrayList<OFMessage>();
165
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700166 for (int j = 0; j < numMsg; ++j) {
Ray Milkey269ffb92014-04-03 14:43:30 -0700167 OFMessage msg = EasyMock.createMock(OFMessage.class);
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700168 EasyMock.expect(msg.getXid()).andReturn((long) j).anyTimes();
Ray Milkey269ffb92014-04-03 14:43:30 -0700169 EasyMock.replay(msg);
170 messages.add(msg);
171
172 try {
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700173 sw.write(EasyMock.eq(msg), EasyMock.eq((FloodlightContext) null));
174 EasyMock.expectLastCall().once();
Ray Milkey269ffb92014-04-03 14:43:30 -0700175 } catch (IOException e1) {
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700176 fail("Failed in IOFWrite#write()");
Ray Milkey269ffb92014-04-03 14:43:30 -0700177 }
178 }
Yuta HIGUCHI44a0b352014-05-14 21:32:48 -0700179 swMap.put(sw, messages);
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700180 EasyMock.replay(sw);
Ray Milkey269ffb92014-04-03 14:43:30 -0700181 }
182
183 endInitMock();
184 initPusher(1);
185
Yuta HIGUCHI44a0b352014-05-14 21:32:48 -0700186 for (IOFSwitch sw : swMap.keySet()) {
187 for (OFMessage msg : swMap.get(sw)) {
188 boolean addResult = pusher.add(sw, msg);
189 assertTrue(addResult);
Ray Milkey269ffb92014-04-03 14:43:30 -0700190 }
191 }
192
193 try {
194 // wait until message is processed.
195 Thread.sleep(1000);
196 } catch (InterruptedException e) {
197 fail("Failed in Thread.sleep()");
198 }
199
Yuta HIGUCHI44a0b352014-05-14 21:32:48 -0700200 for (IOFSwitch sw : swMap.keySet()) {
201 for (OFMessage msg : swMap.get(sw)) {
Ray Milkey269ffb92014-04-03 14:43:30 -0700202 EasyMock.verify(msg);
203 }
204
205 EasyMock.verify(sw);
206 }
207 verifyAll();
208
209 pusher.stop();
210 }
211
212 /**
213 * Test bunch of OFMessages are correctly sent to multiple switches using multiple threads.
214 */
215 @Test
216 public void testMultiThreadedAddMessage() {
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700217 final int numThreads = 10;
218 final int numMsg = 100; // messages per thread
Ray Milkey269ffb92014-04-03 14:43:30 -0700219
220 beginInitMock();
221
Yuta HIGUCHI44a0b352014-05-14 21:32:48 -0700222 Map<IOFSwitch, List<OFMessage>> swMap = new HashMap<IOFSwitch, List<OFMessage>>();
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700223 for (int i = 0; i < numThreads; ++i) {
Naoki Shiota47993102014-07-09 14:00:54 -0700224 IOFSwitch sw = createConnectedSwitchMock(i, false);
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700225 //EasyMock.replay(sw);
Ray Milkey269ffb92014-04-03 14:43:30 -0700226
227 List<OFMessage> messages = new ArrayList<OFMessage>();
228
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700229 for (int j = 0; j < numMsg; ++j) {
Ray Milkey269ffb92014-04-03 14:43:30 -0700230 OFMessage msg = EasyMock.createMock(OFMessage.class);
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700231 EasyMock.expect(msg.getXid()).andReturn((long) j).anyTimes();
232
Ray Milkey269ffb92014-04-03 14:43:30 -0700233 EasyMock.replay(msg);
234 messages.add(msg);
235
236 try {
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700237 sw.write(EasyMock.eq(msg), EasyMock.eq((FloodlightContext) null));
238 EasyMock.expectLastCall().once();
Ray Milkey269ffb92014-04-03 14:43:30 -0700239 } catch (IOException e1) {
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700240 fail("Failed in IOFWrite#write()");
Ray Milkey269ffb92014-04-03 14:43:30 -0700241 }
242 }
Yuta HIGUCHI44a0b352014-05-14 21:32:48 -0700243 swMap.put(sw, messages);
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700244 EasyMock.replay(sw);
Ray Milkey269ffb92014-04-03 14:43:30 -0700245 }
246
247 endInitMock();
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700248 initPusher(numThreads);
Yuta HIGUCHI44a0b352014-05-14 21:32:48 -0700249 for (IOFSwitch sw : swMap.keySet()) {
250 for (OFMessage msg : swMap.get(sw)) {
251 boolean addResult = pusher.add(sw, msg);
252 assertTrue(addResult);
Ray Milkey269ffb92014-04-03 14:43:30 -0700253 }
254 }
255
256 try {
257 // wait until message is processed.
258 Thread.sleep(1000);
259 } catch (InterruptedException e) {
260 fail("Failed in Thread.sleep()");
261 }
262
Yuta HIGUCHI44a0b352014-05-14 21:32:48 -0700263 for (IOFSwitch sw : swMap.keySet()) {
264 for (OFMessage msg : swMap.get(sw)) {
Ray Milkey269ffb92014-04-03 14:43:30 -0700265 EasyMock.verify(msg);
266 }
267
268 EasyMock.verify(sw);
269 }
270 verifyAll();
271
272 pusher.stop();
273 }
274
275 private long barrierTime = 0;
276
277 /**
278 * Test rate limitation of messages works correctly.
279 */
280 @Test
281 public void testRateLimitedAddMessage() {
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700282 final long limitRate = 100; // [bytes/ms]
283 final int numMsg = 1000;
Ray Milkey269ffb92014-04-03 14:43:30 -0700284
285 // Accuracy of FlowPusher's rate calculation can't be measured by unit test
286 // because switch doesn't return BARRIER_REPLY.
287 // In unit test we use approximate way to measure rate. This value is
288 // acceptable margin of measured rate.
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700289 final double acceptableRate = limitRate * 1.2;
Ray Milkey269ffb92014-04-03 14:43:30 -0700290
291 beginInitMock();
292
Naoki Shiota47993102014-07-09 14:00:54 -0700293 IOFSwitch sw = createConnectedSwitchMock(1, true);
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700294 EasyMock.expect(sw.getOFVersion()).andReturn(OFVersion.OF_10).once();
295
Ray Milkey269ffb92014-04-03 14:43:30 -0700296
297 List<OFMessage> messages = new ArrayList<OFMessage>();
298
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700299 for (int i = 0; i < numMsg; ++i) {
Ray Milkey269ffb92014-04-03 14:43:30 -0700300 OFMessage msg = EasyMock.createMock(OFMessage.class);
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700301 EasyMock.expect(msg.getXid()).andReturn((long) 1).anyTimes();
Ray Milkey269ffb92014-04-03 14:43:30 -0700302 EasyMock.replay(msg);
303 messages.add(msg);
304
305 try {
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700306 sw.write(EasyMock.eq(msg), EasyMock.eq((FloodlightContext) null));
307 EasyMock.expectLastCall().once();
308 } catch (IOException e1) {
309 fail("Failed in IOFWrite#write()");
Ray Milkey269ffb92014-04-03 14:43:30 -0700310 }
311 }
312
313 try {
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700314 sw.write(EasyMock.anyObject(OFBarrierRequest.class), EasyMock.eq((FloodlightContext) null));
315 EasyMock.expectLastCall().once();
316 barrierTime = System.currentTimeMillis();
Ray Milkey269ffb92014-04-03 14:43:30 -0700317 } catch (IOException e1) {
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700318 fail("Failed in IOFWrite#write()");
Ray Milkey269ffb92014-04-03 14:43:30 -0700319 }
320
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700321 EasyMock.replay(sw);
322
Ray Milkey269ffb92014-04-03 14:43:30 -0700323 endInitMock();
324 initPusher(1);
325
326 pusher.createQueue(sw);
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700327 pusher.setRate(sw, limitRate);
Ray Milkey269ffb92014-04-03 14:43:30 -0700328
329 long beginTime = System.currentTimeMillis();
330 for (OFMessage msg : messages) {
Yuta HIGUCHI44a0b352014-05-14 21:32:48 -0700331 boolean addResult = pusher.add(sw, msg);
332 assertTrue(addResult);
Ray Milkey269ffb92014-04-03 14:43:30 -0700333 }
334
335 pusher.barrierAsync(sw);
336
337 try {
338 do {
339 Thread.sleep(1000);
340 } while (barrierTime == 0);
341 } catch (InterruptedException e) {
342 fail("Failed to sleep");
343 }
344
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700345 double measuredRate = numMsg * 100 / (barrierTime - beginTime);
346 assertTrue(measuredRate < acceptableRate);
Ray Milkey269ffb92014-04-03 14:43:30 -0700347
348 for (OFMessage msg : messages) {
349 EasyMock.verify(msg);
350 }
351 EasyMock.verify(sw);
352 verifyAll();
353
354 pusher.stop();
355 }
356
357 /**
358 * Test barrier message is correctly sent to a switch.
359 */
360 @Test
361 public void testBarrierMessage() {
362 beginInitMock();
363
Naoki Shiota47993102014-07-09 14:00:54 -0700364 IOFSwitch sw = createConnectedSwitchMock(1, true);
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700365 EasyMock.expect(sw.getOFVersion()).andReturn(OFVersion.OF_10).once();
Ray Milkey269ffb92014-04-03 14:43:30 -0700366
367 try {
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700368 sw.write((OFMessage) EasyMock.anyObject(), EasyMock.eq((FloodlightContext) null));
369 EasyMock.expectLastCall().once();
Ray Milkey269ffb92014-04-03 14:43:30 -0700370 } catch (IOException e1) {
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700371 fail("Failed in IOFWrite#write()");
Ray Milkey269ffb92014-04-03 14:43:30 -0700372 }
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700373 EasyMock.replay(sw);
Ray Milkey269ffb92014-04-03 14:43:30 -0700374 endInitMock();
375 initPusher(1);
376
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700377 OFMessageFuture<OFBarrierReply> future = pusher.barrierAsync(sw);
Ray Milkey269ffb92014-04-03 14:43:30 -0700378
379 assertNotNull(future);
380
381 try {
382 Thread.sleep(1000);
383 } catch (InterruptedException e) {
384 fail("Failed to sleep");
385 }
386
387 verifyAll();
388
389 pusher.stop();
390 }
391
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700392 static final long XID_TO_VERIFY = 100;
Ray Milkey269ffb92014-04-03 14:43:30 -0700393 static final long DPID_TO_VERIFY = 10;
394
395 /**
396 * Test FlowObject is correctly converted to message and is sent to a switch.
397 */
398 @SuppressWarnings("unchecked")
399 @Test
400 public void testAddFlow() {
401 // instantiate required objects
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700402 FlowEntry flowEntry1 = new FlowEntry(DPID_TO_VERIFY, 1, 11, null, null, 0, 0, Operator.ADD);
403 /*
Ray Milkey269ffb92014-04-03 14:43:30 -0700404 flowEntry1.setDpid(new Dpid(DPID_TO_VERIFY));
405 flowEntry1.setFlowId(new FlowId(1));
Yuta HIGUCHIfb564502014-06-16 21:29:00 -0700406 flowEntry1.setInPort(new PortNumber((short) 1));
407 flowEntry1.setOutPort(new PortNumber((short) 11));
Ray Milkey269ffb92014-04-03 14:43:30 -0700408 flowEntry1.setFlowEntryId(new FlowEntryId(1));
409 flowEntry1.setFlowEntryMatch(new FlowEntryMatch());
410 flowEntry1.setFlowEntryActions(new FlowEntryActions());
411 flowEntry1.setFlowEntryErrorState(new FlowEntryErrorState());
412 flowEntry1.setFlowEntryUserState(FlowEntryUserState.FE_USER_ADD);
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700413 */
Ray Milkey269ffb92014-04-03 14:43:30 -0700414
415 beginInitMock();
416
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700417 OFFlowModify fm = EasyMock.createMock(OFFlowModify.class);
Ray Milkey269ffb92014-04-03 14:43:30 -0700418
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700419 OFFlowModify.Builder bld = EasyMock.createMock(OFFlowModify.Builder.class);
420
421 EasyMock.expect(bld.setIdleTimeout(EasyMock.anyInt())).andReturn(bld);
422 EasyMock.expect(bld.setHardTimeout(EasyMock.anyInt())).andReturn(bld);
423 EasyMock.expect(bld.setPriority(EasyMock.anyShort())).andReturn(bld);
424 EasyMock.expect(bld.setBufferId(OFBufferId.NO_BUFFER)).andReturn(bld);
425 EasyMock.expect(bld.setCookie(U64.of(EasyMock.anyLong()))).andReturn(bld);
426 EasyMock.expect(bld.setMatch(EasyMock.anyObject(Match.class))).andReturn(bld);
427 EasyMock.expect(bld.setActions((List<OFAction>) EasyMock.anyObject())).andReturn(bld);
428 EasyMock.expect(bld.setOutPort(OFPort.of(EasyMock.anyInt()))).andReturn(bld).atLeastOnce();
429 EasyMock.expect(bld.build()).andReturn(fm);
430
431 EasyMock.expect(fm.getXid()).andReturn(XID_TO_VERIFY).anyTimes();
432 EasyMock.expect(fm.getType()).andReturn(OFType.FLOW_MOD).anyTimes();
433
434
435
Ray Milkey269ffb92014-04-03 14:43:30 -0700436
Naoki Shiota47993102014-07-09 14:00:54 -0700437 IOFSwitch sw = createConnectedSwitchMock(DPID_TO_VERIFY, false);
Ray Milkey269ffb92014-04-03 14:43:30 -0700438 EasyMock.expect(sw.getStringId()).andReturn("1").anyTimes();
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700439 EasyMock.expect(sw.getOFVersion()).andReturn(OFVersion.OF_10).once();
Ray Milkey269ffb92014-04-03 14:43:30 -0700440
441 try {
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700442 sw.write(EasyMock.anyObject(OFMessage.class), EasyMock.eq((FloodlightContext) null));
443 EasyMock.expectLastCall().once();
Ray Milkey269ffb92014-04-03 14:43:30 -0700444 } catch (IOException e1) {
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700445 fail("Failed in IOFWrite#write()");
Ray Milkey269ffb92014-04-03 14:43:30 -0700446 }
447
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700448 EasyMock.replay(bld, fm);
Ray Milkey269ffb92014-04-03 14:43:30 -0700449 EasyMock.replay(sw);
450
451 endInitMock();
452 initPusher(1);
453
454 pusher.pushFlowEntry(sw, flowEntry1);
455
456 try {
457 Thread.sleep(1000);
458 } catch (InterruptedException e) {
459 fail("Failed to sleep");
460 }
461
462 EasyMock.verify(sw);
463 verifyAll();
464
465 pusher.stop();
466 }
467
468 private void beginInitMock() {
469 context = EasyMock.createMock(FloodlightContext.class);
470 modContext = EasyMock.createMock(FloodlightModuleContext.class);
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700471 // AAS: I don't think we should mock factories... the rabbit whole is too deep.
472 //factory10 = EasyMock.createMock(OFFactories.getFactory(OFVersion.OF_10).getClass());
Ray Milkey269ffb92014-04-03 14:43:30 -0700473 flProviderService = EasyMock.createMock(IFloodlightProviderService.class);
474 threadPoolService = EasyMock.createMock(IThreadPoolService.class);
475
476 EasyMock.expect(modContext.getServiceImpl(EasyMock.eq(IThreadPoolService.class)))
477 .andReturn(threadPoolService).once();
478 EasyMock.expect(modContext.getServiceImpl(EasyMock.eq(IFloodlightProviderService.class)))
479 .andReturn(flProviderService).once();
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700480 // AAS: FlowPusher doesn't call the following anymore.
Ray Milkey269ffb92014-04-03 14:43:30 -0700481 flProviderService.addOFMessageListener(EasyMock.eq(OFType.BARRIER_REPLY),
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700482 EasyMock.anyObject(FlowPusher.class));
Ray Milkey269ffb92014-04-03 14:43:30 -0700483 EasyMock.expectLastCall().once();
484
485 ScheduledExecutorService executor = EasyMock.createMock(ScheduledExecutorService.class);
486 EasyMock.expect(executor.schedule((Runnable) EasyMock.anyObject(), EasyMock.anyLong(),
487 (TimeUnit) EasyMock.anyObject())).andReturn(null).once();
488 EasyMock.replay(executor);
489 EasyMock.expect(threadPoolService.getScheduledExecutor()).andReturn(executor).anyTimes();
490 }
491
492 private void endInitMock() {
493 EasyMock.replay(threadPoolService);
494 EasyMock.replay(flProviderService);
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700495 //EasyMock.replay(factory10);
Ray Milkey269ffb92014-04-03 14:43:30 -0700496 EasyMock.replay(modContext);
497 EasyMock.replay(context);
498 }
499
500 private void verifyAll() {
501 EasyMock.verify(threadPoolService);
502 EasyMock.verify(flProviderService);
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700503 //EasyMock.verify(factory10);
Ray Milkey269ffb92014-04-03 14:43:30 -0700504 EasyMock.verify(modContext);
505 EasyMock.verify(context);
506 }
507
Yuta HIGUCHI44a0b352014-05-14 21:32:48 -0700508 private void initPusher(int numThread) {
509 pusher = new FlowPusher(numThread);
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700510 pusher.init(modContext);
Ray Milkey269ffb92014-04-03 14:43:30 -0700511 pusher.start();
512 }
513
Naoki Shiota47993102014-07-09 14:00:54 -0700514 private IOFSwitch createConnectedSwitchMock(long dpid, boolean useBarrier) {
515 IOFSwitch sw = EasyMock.createMock(IOFSwitch.class);
516 EasyMock.expect(sw.isConnected()).andReturn(true).anyTimes();
517 EasyMock.expect(sw.getId()).andReturn(dpid).anyTimes();
518 sw.flush();
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700519 EasyMock.expectLastCall().anyTimes();
Naoki Shiota47993102014-07-09 14:00:54 -0700520 if (useBarrier) {
521 prepareBarrier(sw);
522 }
523
524 return sw;
525 }
526
Ray Milkey269ffb92014-04-03 14:43:30 -0700527 private void prepareBarrier(IOFSwitch sw) {
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700528 OFBarrierRequest.Builder bld = EasyMock.createMock(factory10.buildBarrierRequest().getClass());
529 EasyMock.expect(bld.setXid(EasyMock.anyInt())).andReturn(bld);
530 EasyMock.expect(bld.getXid()).andReturn((long) 1).anyTimes();
531 EasyMock.expect(bld.getType()).andReturn(OFType.BARRIER_REQUEST).anyTimes();
532
Ray Milkey269ffb92014-04-03 14:43:30 -0700533 OFBarrierRequest req = EasyMock.createMock(OFBarrierRequest.class);
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700534 EasyMock.expect(bld.build()).andReturn(req).anyTimes();
535 EasyMock.replay(bld);
Ray Milkey269ffb92014-04-03 14:43:30 -0700536 EasyMock.expect(sw.getNextTransactionId()).andReturn(1);
537 }
538
Naoki Shiota75b7dd62013-12-03 18:09:21 -0800539}