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 org.junit.Assert;
12 import org.junit.Before;
13 import org.junit.Test;
14 import org.junit.runner.RunWith;
15 import org.mockito.InOrder;
16 import org.mockito.Matchers;
17 import org.mockito.Mock;
18 import org.mockito.Mockito;
19 import org.mockito.runners.MockitoJUnitRunner;
20 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
21 import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
22 import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy;
25 * Test for {@link PacketInRateLimiter}.
27 @RunWith(MockitoJUnitRunner.class)
28 public class PacketInRateLimiterTest {
30 private PacketInRateLimiter rateLimiter;
32 private ConnectionAdapter connectionAdapter;
34 private MessageSpy messageSpy;
35 private InOrder caOrdered;
38 public void setUp() throws Exception {
39 caOrdered = Mockito.inOrder(connectionAdapter);
40 rateLimiter = new PacketInRateLimiter(connectionAdapter, 4, 10, messageSpy, 0.5f);
44 public void testDisableFlow() throws Exception {
45 rateLimiter.disableFlow();
47 Mockito.verify(messageSpy).spyMessage(DeviceContext.class, MessageSpy.STATISTIC_GROUP.OFJ_BACKPRESSURE_ON);
48 Mockito.verify(connectionAdapter).setPacketInFiltering(true);
52 public void testEnableFlow() throws Exception {
53 rateLimiter.enableFlow();
55 Mockito.verify(messageSpy).spyMessage(DeviceContext.class, MessageSpy.STATISTIC_GROUP.OFJ_BACKPRESSURE_OFF);
56 Mockito.verify(connectionAdapter).setPacketInFiltering(false);
60 public void testDrainLowWaterMark() throws Exception {
63 // drain low water mark = lwm temporarily set to 50% (= 2) and get limited
64 // need to free 2 permits to escape the limit and reset lwm
65 // now free to get more than 2 permits
67 Assert.assertEquals(0, rateLimiter.getOccupiedPermits());
68 Assert.assertFalse(rateLimiter.isLimited());
70 Assert.assertEquals(4, rateLimiter.getOccupiedPermits());
73 rateLimiter.drainLowWaterMark();
74 Assert.assertEquals(4, rateLimiter.getOccupiedPermits());
75 Assert.assertTrue(rateLimiter.isLimited());
76 caOrdered.verify(connectionAdapter).setPacketInFiltering(true);
78 // release 1 permit -> 3 occupied but threshold = 2 -> stay limited
79 rateLimiter.releasePermit();
80 Assert.assertEquals(3, rateLimiter.getOccupiedPermits());
81 Assert.assertTrue(rateLimiter.isLimited());
83 // release 1 permit -> 2 occupied but threshold = 2 -> escape limit
84 rateLimiter.releasePermit();
85 Assert.assertEquals(2, rateLimiter.getOccupiedPermits());
86 Assert.assertFalse(rateLimiter.isLimited());
87 caOrdered.verify(connectionAdapter).setPacketInFiltering(false);
91 Assert.assertEquals(6, rateLimiter.getOccupiedPermits());
92 Assert.assertFalse(rateLimiter.isLimited());
94 Mockito.verify(connectionAdapter, Mockito.times(2)).setPacketInFiltering(Matchers.anyBoolean());
97 private void acquirePermits(int permits) {
98 for (int i = 0; i < permits; i++) {
99 final boolean gainedPermit = rateLimiter.acquirePermit();
101 throw new IllegalStateException("not enough permits");
106 private void releasePermits(int permits) {
107 for (int i = 0; i < permits; i++) {
108 rateLimiter.releasePermit();
113 public void testAcquirePermit() throws Exception {
114 Assert.assertEquals(0, rateLimiter.getOccupiedPermits());
115 Assert.assertFalse(rateLimiter.isLimited());
119 Assert.assertEquals(10, rateLimiter.getOccupiedPermits());
120 Assert.assertFalse(rateLimiter.isLimited());
123 Assert.assertFalse(rateLimiter.acquirePermit());
124 Assert.assertEquals(10, rateLimiter.getOccupiedPermits());
125 Assert.assertTrue(rateLimiter.isLimited());
126 caOrdered.verify(connectionAdapter).setPacketInFiltering(true);
130 Assert.assertEquals(5, rateLimiter.getOccupiedPermits());
131 Assert.assertTrue(rateLimiter.isLimited());
134 rateLimiter.releasePermit();
135 Assert.assertEquals(4, rateLimiter.getOccupiedPermits());
136 Assert.assertFalse(rateLimiter.isLimited());
137 caOrdered.verify(connectionAdapter).setPacketInFiltering(false);
139 Mockito.verify(connectionAdapter, Mockito.times(2)).setPacketInFiltering(Matchers.anyBoolean());
143 public void testChangeWaterMarks1() throws Exception {
144 rateLimiter.changeWaterMarks(2, 4);
146 Assert.assertEquals(4, rateLimiter.getOccupiedPermits());
147 Assert.assertFalse(rateLimiter.isLimited());
150 Assert.assertFalse(rateLimiter.acquirePermit());
151 Assert.assertEquals(4, rateLimiter.getOccupiedPermits());
152 Assert.assertTrue(rateLimiter.isLimited());
153 caOrdered.verify(connectionAdapter).setPacketInFiltering(true);
156 rateLimiter.releasePermit();
157 Assert.assertEquals(3, rateLimiter.getOccupiedPermits());
158 Assert.assertTrue(rateLimiter.isLimited());
160 // cross lwm, escape limit
161 rateLimiter.releasePermit();
162 Assert.assertEquals(2, rateLimiter.getOccupiedPermits());
163 Assert.assertFalse(rateLimiter.isLimited());
164 caOrdered.verify(connectionAdapter).setPacketInFiltering(false);
166 Mockito.verify(connectionAdapter, Mockito.times(2)).setPacketInFiltering(Matchers.anyBoolean());
170 public void testChangeWaterMarks2() throws Exception {
171 // draining to lwm/occupied = 3/6
173 rateLimiter.drainLowWaterMark();
174 Assert.assertEquals(6, rateLimiter.getOccupiedPermits());
175 Assert.assertTrue(rateLimiter.isLimited());
176 caOrdered.verify(connectionAdapter).setPacketInFiltering(true);
178 rateLimiter.changeWaterMarks(7, 12);
179 Assert.assertEquals(6, rateLimiter.getOccupiedPermits());
180 Assert.assertTrue(rateLimiter.isLimited());
182 // new lwm is equal to current occupied permits - we can acquire more but flow is still limited
184 Assert.assertTrue(rateLimiter.isLimited());
185 Assert.assertEquals(7, rateLimiter.getOccupiedPermits());
187 // cross lwm, escape old lwm limit, reset lwm
188 rateLimiter.releasePermit();
189 Assert.assertEquals(6, rateLimiter.getOccupiedPermits());
190 Assert.assertFalse(rateLimiter.isLimited());
191 caOrdered.verify(connectionAdapter).setPacketInFiltering(false);
193 // free to reach hwm of 12
195 Assert.assertEquals(12, rateLimiter.getOccupiedPermits());
196 Assert.assertFalse(rateLimiter.isLimited());
198 Mockito.verify(connectionAdapter, Mockito.times(2)).setPacketInFiltering(Matchers.anyBoolean());