2 * ============LICENSE_START=======================================================
3 * ONAP : ccsdk features
4 * ================================================================================
5 * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property.
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
22 package org.onap.ccsdk.features.sdnr.wt.websocketmanager2.test;
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertNotEquals;
26 import java.time.Duration;
27 import java.time.Instant;
28 import java.util.Timer;
29 import java.util.TimerTask;
30 import org.junit.Test;
31 import org.onap.ccsdk.features.sdnr.wt.websocketmanager.utils.RateFilterManager;
32 import org.onap.ccsdk.features.sdnr.wt.websocketmanager.utils.RateFilterManager.RateFilter;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
37 * {@link #RateFilter} Problems of to many notifications during mount of thousand of devices.
40 * Testcase (e: 17 Event received, rateMaxCount=3)
41 * 1 3 4 5 6 7 8 9 10 11 14 15 16 17 18
43 * eee e e e e e e e e e e e e e e e
44 * ---//--|--------------|-----//-------|--------------|--------------|--------------|---//----|--------------|
45 * P1:1 P2:1 P1:2 P2:2 P3:2 P4:2 P1:3
46 * ms 500 1000-1002 2000 3500 4500 5500 6500 7500 8500
47 *Overload no no yes yes no no
51 public class RateFilterTest {
53 private static final Logger LOG = LoggerFactory.getLogger(RateFilterTest.class.getName());
55 private static int INTEGRATIONTIMEMILLIS = 1000;
56 private static long EVENTS_PER_INTERVALL = 4;
57 private static long RATE_PER_MINUTE = EVENTS_PER_INTERVALL * 60;
58 /* Negative event time indicates timer event */
59 private static long[] now = {-500, 1000, 1010, 1020, //P1:1 1-3
60 -1500, -2500, -3500, 3500, 3550, 3560, 3570, 3580, 3590, 3800, //P1:2 3500 4-10
61 -4500, 4510, 4520, 4530, 4540, 4900, //P2:2 4500 11-15
62 -5500, 5700, //P3:2 5500 16
63 -6500, -7500, 7500, 8000};//P1:3 17-18
64 private static boolean[] overload = {false, false, false, false, //P1:1 1-3
65 false, false, false, false, false, false, false, false, false, false, //P1:2 3500 4-10
66 true, true, true, true, true, true, //P2:2 4500 11-15
67 true, true, //P3:2 5500 16
68 false, false, false, false};//P1:3 17-18
70 private static int idx;
71 private static long millis;
74 public void testStates() {
76 RateFilterManager rateFilterManager =
77 new RateFilterManager(Duration.ofMillis(INTEGRATIONTIMEMILLIS), false, () -> getNow());
78 RateFilter rateFilter = rateFilterManager.getRateFilter(RATE_PER_MINUTE);
79 LOG.info("Init done");
80 assertEquals("Events per integration period", EVENTS_PER_INTERVALL, rateFilter.getMaxEventsPerIntegration());
82 for (int t = 1; t < 30; t++) {
83 boolean expected = tick();
85 LOG.info("{} - timer {}", t, millis);
88 LOG.info("{} - event {}", t, millis);
91 LOG.info("Overload={} {}", rateFilter.getOverloadStatus(), expected);
92 assertEquals("Filter activity", expected, rateFilter.getOverloadStatus());
98 public void testThread() throws InterruptedException {
99 LOG.info("testThread");
101 RateFilterManager rateFilterManager = new RateFilterManager(Duration.ofMillis(INTEGRATIONTIMEMILLIS));
102 RateFilter rateFilter = rateFilterManager.getRateFilter(RATE_PER_MINUTE);
107 Object objectYouNeedToLockOn = new Object();
108 Timer timer = new Timer();
109 timer.scheduleAtFixedRate(new TimerTask() {
114 long xLocalMillis = localMillis += 10;
115 long xMillis = Math.abs(millis);
116 if (xLocalMillis >= xMillis) {
117 LOG.info("aTime:{} Millis:{} Idx={}", xLocalMillis, xMillis, idx);
118 boolean expected = tick();
120 //Skip negatives .. handled by timer
122 boolean actual = rateFilter.getOverloadStatus();
123 LOG.info("bTime:{} Millis:{} Idx={} Overload={} Expected={} {}", xLocalMillis, xMillis, idx,
124 actual, expected, actual == expected ? "" : "XXXX");
126 LOG.info("Test is ending");
127 synchronized (objectYouNeedToLockOn) {
128 objectYouNeedToLockOn.notify();
132 assertEquals("Filter activity", expected, rateFilter.getOverloadStatus());
137 synchronized (objectYouNeedToLockOn) {
138 objectYouNeedToLockOn.wait();
140 //rateFilter.close();
141 LOG.info("Test end");
145 public void testMultipleClients() {
146 RateFilterManager rateFilterManager = new RateFilterManager(Duration.ofMillis(INTEGRATIONTIMEMILLIS));
147 RateFilter rateFilter1 = rateFilterManager.getRateFilter(RATE_PER_MINUTE);
148 assertEquals("Multiple clients", 1, rateFilter1.getClients());
149 RateFilter rateFilter2 = rateFilterManager.getRateFilter(RATE_PER_MINUTE);
150 assertEquals("Multiple clients", 2, rateFilter1.getClients());
151 RateFilter rateFilter3 = rateFilterManager.getRateFilter(RATE_PER_MINUTE);
152 assertEquals("Multiple clients", 3, rateFilter1.getClients());
154 assertEquals("Similar instances", rateFilter1, rateFilter3);
156 RateFilter rateFilterOther = rateFilterManager.getRateFilter(2*RATE_PER_MINUTE);
157 assertNotEquals("Different instances", rateFilter1, rateFilterOther);
158 rateFilterOther.close();
161 assertEquals("Multiple clients", 2, rateFilter1.getClients());
163 assertEquals("Multiple clients", 1, rateFilter1.getClients());
165 assertEquals("Multiple clients", 0, rateFilter1.getClients());
167 rateFilterManager.close();
170 private Instant getNow() {
171 LOG.debug("Now:{}", millis);
172 return Instant.ofEpochMilli(Math.abs(millis));
175 private void reset() {
179 private boolean tick() {
180 if (idx < now.length) {
183 int lastIdx = now.length - 1;
184 millis = now[lastIdx] + (idx - lastIdx) * INTEGRATIONTIMEMILLIS;
186 boolean expected = idx < overload.length ? overload[idx] : false;