blob: d8289b03965879acb706e46053de521e3da64700 [file] [log] [blame]
Jonathan Hart233a18a2015-03-02 17:24:58 -08001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
Jonathan Hart233a18a2015-03-02 17:24:58 -08003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onlab.util;
17
18import org.junit.After;
19import org.junit.Before;
20import org.junit.Test;
21
22import static junit.framework.TestCase.fail;
23import static org.junit.Assert.assertEquals;
24import static org.junit.Assert.assertTrue;
25
26/**
27 * Unit tests for the sliding window counter.
28 */
Jonathan Hart233a18a2015-03-02 17:24:58 -080029public class SlidingWindowCounterTest {
30
31 private SlidingWindowCounter counter;
32
33 @Before
34 public void setUp() {
35 counter = new SlidingWindowCounter(2);
36 }
37
38 @After
39 public void tearDown() {
40 counter.destroy();
41 }
42
43 @Test
44 public void testIncrementCount() {
45 assertEquals(0, counter.get(1));
46 assertEquals(0, counter.get(2));
47 counter.incrementCount();
48 assertEquals(1, counter.get(1));
49 assertEquals(1, counter.get(2));
50 counter.incrementCount(2);
51 assertEquals(3, counter.get(2));
52 }
53
54 @Test
55 public void testSlide() {
56 counter.incrementCount();
57 counter.advanceHead();
58 assertEquals(0, counter.get(1));
59 assertEquals(1, counter.get(2));
60 counter.incrementCount(2);
61 assertEquals(2, counter.get(1));
62 assertEquals(3, counter.get(2));
63 }
64
65 @Test
66 public void testWrap() {
67 counter.incrementCount();
68 counter.advanceHead();
69 counter.incrementCount(2);
70 counter.advanceHead();
71 assertEquals(0, counter.get(1));
72 assertEquals(2, counter.get(2));
73 counter.advanceHead();
74 assertEquals(0, counter.get(1));
75 assertEquals(0, counter.get(2));
76
77 }
78
79 @Test
Jordan Halterman631e7702019-04-11 15:21:01 -070080 public void testSlidingWindowStats() {
81 SlidingWindowCounter counter = new SlidingWindowCounter(3);
82
83 // 1
84 counter.incrementCount(1);
85 assertEquals(1, counter.getWindowCount());
86 assertEquals(1, counter.getWindowCount(1));
87
88 // 0, 1
89 counter.advanceHead();
90 assertEquals(1, counter.getWindowCount());
91 assertEquals(0, counter.getWindowCount(1));
92 assertEquals(1, counter.getWindowCount(2));
93
94 // 2, 1
95 counter.incrementCount(2);
96 assertEquals(3, counter.getWindowCount());
97 assertEquals(2, counter.getWindowCount(1));
98 assertEquals(3, counter.getWindowCount(2));
99
100 // 0, 2, 1
101 counter.advanceHead();
102 assertEquals(3, counter.getWindowCount());
103 assertEquals(0, counter.getWindowCount(1));
104 assertEquals(2, counter.getWindowCount(2));
105 assertEquals(3, counter.getWindowCount(3));
106
107 // 3, 2, 1
108 counter.incrementCount(3);
109 assertEquals(6, counter.getWindowCount());
110 assertEquals(3, counter.getWindowCount(1));
111 assertEquals(5, counter.getWindowCount(2));
112 assertEquals(6, counter.getWindowCount(3));
113
114 // 0, 3, 2
115 counter.advanceHead();
116 assertEquals(5, counter.getWindowCount());
117 assertEquals(0, counter.getWindowCount(1));
118 assertEquals(3, counter.getWindowCount(2));
119 assertEquals(5, counter.getWindowCount(3));
120
121 // 4, 3, 2
122 counter.incrementCount(4);
123 assertEquals(9, counter.getWindowCount());
124 assertEquals(4, counter.getWindowCount(1));
125 assertEquals(7, counter.getWindowCount(2));
126 assertEquals(9, counter.getWindowCount(3));
127
128 // 0, 4, 3
129 counter.advanceHead();
130 assertEquals(7, counter.getWindowCount());
131 assertEquals(0, counter.getWindowCount(1));
132 assertEquals(4, counter.getWindowCount(2));
133 assertEquals(7, counter.getWindowCount(3));
134
135 // 5, 4, 3
136 counter.incrementCount(5);
137 assertEquals(12, counter.getWindowCount());
138 assertEquals(5, counter.getWindowCount(1));
139 assertEquals(9, counter.getWindowCount(2));
140 assertEquals(12, counter.getWindowCount(3));
141
142 // 0, 5, 4
143 counter.advanceHead();
144 assertEquals(9, counter.getWindowCount());
145 assertEquals(0, counter.getWindowCount(1));
146 assertEquals(5, counter.getWindowCount(2));
147 assertEquals(9, counter.getWindowCount(3));
148
149 counter.destroy();
150 }
151
152 @Test
Jordan Haltermandf4b08a2019-03-05 18:44:03 -0800153 public void testRates() {
154 assertEquals(0, counter.getWindowRate(), 0.01);
155 assertEquals(0, counter.getOverallRate(), 0.01);
156 assertEquals(0, counter.getOverallCount());
157 counter.incrementCount();
158 assertEquals(1, counter.getWindowRate(), 0.01);
159 assertEquals(1, counter.getOverallRate(), 0.01);
160 assertEquals(1, counter.getOverallCount());
161 counter.advanceHead();
162 counter.incrementCount();
163 counter.incrementCount();
164 assertEquals(1.5, counter.getWindowRate(), 0.01);
165 assertEquals(2, counter.getWindowRate(1), 0.01);
166 assertEquals(1.5, counter.getOverallRate(), 0.01);
167 assertEquals(3, counter.getOverallCount());
168 counter.advanceHead();
169 counter.incrementCount();
170 counter.incrementCount();
171 counter.incrementCount();
172 assertEquals(2.5, counter.getWindowRate(), 0.01);
173 assertEquals(2, counter.getOverallRate(), 0.01);
174 assertEquals(6, counter.getOverallCount());
175 }
176
177 @Test
Jonathan Hart233a18a2015-03-02 17:24:58 -0800178 public void testCornerCases() {
179 try {
180 counter.get(3);
181 fail("Exception should have been thrown");
182 } catch (IllegalArgumentException e) {
183 assertTrue(true);
184 }
185
186 try {
187 new SlidingWindowCounter(0);
188 fail("Exception should have been thrown");
189 } catch (IllegalArgumentException e) {
190 assertTrue(true);
191 }
192
193 try {
194 new SlidingWindowCounter(-1);
195 fail("Exception should have been thrown");
196 } catch (IllegalArgumentException e) {
197 assertTrue(true);
198 }
199 }
200}