2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.openflowplugin.impl.device;
11 import static org.mockito.ArgumentMatchers.anyBoolean;
13 import org.junit.Assert;
14 import org.junit.Before;
15 import org.junit.Test;
16 import org.junit.runner.RunWith;
17 import org.mockito.InOrder;
18 import org.mockito.Mock;
19 import org.mockito.Mockito;
20 import org.mockito.junit.MockitoJUnitRunner;
21 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
22 import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
23 import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy;
26 * Test for {@link PacketInRateLimiter}.
28 @RunWith(MockitoJUnitRunner.class)
29 public class PacketInRateLimiterTest {
31 private PacketInRateLimiter rateLimiter;
33 private ConnectionAdapter connectionAdapter;
35 private MessageSpy messageSpy;
36 private InOrder caOrdered;
40 caOrdered = Mockito.inOrder(connectionAdapter);
41 rateLimiter = new PacketInRateLimiter(connectionAdapter, 4, 10, messageSpy, 0.5f);
45 public void testDisableFlow() {
46 rateLimiter.disableFlow();
48 Mockito.verify(messageSpy).spyMessage(DeviceContext.class, MessageSpy.StatisticsGroup.OFJ_BACKPRESSURE_ON);
49 Mockito.verify(connectionAdapter).setPacketInFiltering(true);
53 public void testEnableFlow() {
54 rateLimiter.enableFlow();
56 Mockito.verify(messageSpy).spyMessage(DeviceContext.class, MessageSpy.StatisticsGroup.OFJ_BACKPRESSURE_OFF);
57 Mockito.verify(connectionAdapter).setPacketInFiltering(false);
61 public void testDrainLowWaterMark() {
64 // drain low water mark = lwm temporarily set to 50% (= 2) and get limited
65 // need to free 2 permits to escape the limit and reset lwm
66 // now free to get more than 2 permits
68 Assert.assertEquals(0, rateLimiter.getOccupiedPermits());
69 Assert.assertFalse(rateLimiter.isLimited());
71 Assert.assertEquals(4, rateLimiter.getOccupiedPermits());
74 rateLimiter.drainLowWaterMark();
75 Assert.assertEquals(4, rateLimiter.getOccupiedPermits());
76 Assert.assertTrue(rateLimiter.isLimited());
77 caOrdered.verify(connectionAdapter).setPacketInFiltering(true);
79 // release 1 permit -> 3 occupied but threshold = 2 -> stay limited
80 rateLimiter.releasePermit();
81 Assert.assertEquals(3, rateLimiter.getOccupiedPermits());
82 Assert.assertTrue(rateLimiter.isLimited());
84 // release 1 permit -> 2 occupied but threshold = 2 -> escape limit
85 rateLimiter.releasePermit();
86 Assert.assertEquals(2, rateLimiter.getOccupiedPermits());
87 Assert.assertFalse(rateLimiter.isLimited());
88 caOrdered.verify(connectionAdapter).setPacketInFiltering(false);
92 Assert.assertEquals(6, rateLimiter.getOccupiedPermits());
93 Assert.assertFalse(rateLimiter.isLimited());
95 Mockito.verify(connectionAdapter, Mockito.times(2)).setPacketInFiltering(anyBoolean());
98 private void acquirePermits(int permits) {
99 for (int i = 0; i < permits; i++) {
100 final boolean gainedPermit = rateLimiter.acquirePermit();
102 throw new IllegalStateException("not enough permits");
107 private void releasePermits(int permits) {
108 for (int i = 0; i < permits; i++) {
109 rateLimiter.releasePermit();
114 public void testAcquirePermit() {
115 Assert.assertEquals(0, rateLimiter.getOccupiedPermits());
116 Assert.assertFalse(rateLimiter.isLimited());
120 Assert.assertEquals(10, rateLimiter.getOccupiedPermits());
121 Assert.assertFalse(rateLimiter.isLimited());
124 Assert.assertFalse(rateLimiter.acquirePermit());
125 Assert.assertEquals(10, rateLimiter.getOccupiedPermits());
126 Assert.assertTrue(rateLimiter.isLimited());
127 caOrdered.verify(connectionAdapter).setPacketInFiltering(true);
131 Assert.assertEquals(5, rateLimiter.getOccupiedPermits());
132 Assert.assertTrue(rateLimiter.isLimited());
135 rateLimiter.releasePermit();
136 Assert.assertEquals(4, rateLimiter.getOccupiedPermits());
137 Assert.assertFalse(rateLimiter.isLimited());
138 caOrdered.verify(connectionAdapter).setPacketInFiltering(false);
140 Mockito.verify(connectionAdapter, Mockito.times(2)).setPacketInFiltering(anyBoolean());
144 public void testChangeWaterMarks1() {
145 rateLimiter.changeWaterMarks(2, 4);
147 Assert.assertEquals(4, rateLimiter.getOccupiedPermits());
148 Assert.assertFalse(rateLimiter.isLimited());
151 Assert.assertFalse(rateLimiter.acquirePermit());
152 Assert.assertEquals(4, rateLimiter.getOccupiedPermits());
153 Assert.assertTrue(rateLimiter.isLimited());
154 caOrdered.verify(connectionAdapter).setPacketInFiltering(true);
157 rateLimiter.releasePermit();
158 Assert.assertEquals(3, rateLimiter.getOccupiedPermits());
159 Assert.assertTrue(rateLimiter.isLimited());
161 // cross lwm, escape limit
162 rateLimiter.releasePermit();
163 Assert.assertEquals(2, rateLimiter.getOccupiedPermits());
164 Assert.assertFalse(rateLimiter.isLimited());
165 caOrdered.verify(connectionAdapter).setPacketInFiltering(false);
167 Mockito.verify(connectionAdapter, Mockito.times(2)).setPacketInFiltering(anyBoolean());
171 public void testChangeWaterMarks2() {
172 // draining to lwm/occupied = 3/6
174 rateLimiter.drainLowWaterMark();
175 Assert.assertEquals(6, rateLimiter.getOccupiedPermits());
176 Assert.assertTrue(rateLimiter.isLimited());
177 caOrdered.verify(connectionAdapter).setPacketInFiltering(true);
179 rateLimiter.changeWaterMarks(7, 12);
180 Assert.assertEquals(6, rateLimiter.getOccupiedPermits());
181 Assert.assertTrue(rateLimiter.isLimited());
183 // new lwm is equal to current occupied permits - we can acquire more but flow is still limited
185 Assert.assertTrue(rateLimiter.isLimited());
186 Assert.assertEquals(7, rateLimiter.getOccupiedPermits());
188 // cross lwm, escape old lwm limit, reset lwm
189 rateLimiter.releasePermit();
190 Assert.assertEquals(6, rateLimiter.getOccupiedPermits());
191 Assert.assertFalse(rateLimiter.isLimited());
192 caOrdered.verify(connectionAdapter).setPacketInFiltering(false);
194 // free to reach hwm of 12
196 Assert.assertEquals(12, rateLimiter.getOccupiedPermits());
197 Assert.assertFalse(rateLimiter.isLimited());
199 Mockito.verify(connectionAdapter, Mockito.times(2)).setPacketInFiltering(anyBoolean());