1 package ch.qos.logback.core.util;
2
3 import static ch.qos.logback.core.util.DefaultInvocationGate.DEFAULT_MASK;
4 import static ch.qos.logback.core.util.DefaultInvocationGate.MASK_DECREASE_RIGHT_SHIFT_COUNT;
5 import static org.junit.jupiter.api.Assertions.assertEquals;
6 import static org.junit.jupiter.api.Assertions.assertFalse;
7 import static org.junit.jupiter.api.Assertions.assertTrue;
8
9 import org.junit.jupiter.api.Test;
10
11 public class DefaultInvocationGateTest {
12
13 @Test
14 public void smoke() {
15 long currentTime = 0;
16 long minDelayThreshold = 4;
17 long maxDelayThreshold = 8;
18
19 DefaultInvocationGate gate = new DefaultInvocationGate(minDelayThreshold, maxDelayThreshold, currentTime);
20 assertTrue(gate.isTooSoon(0));
21 }
22
23 @Test
24 public void closelyRepeatedCallsShouldCauseMaskToIncrease() {
25 long currentTime = 0;
26 long minDelayThreshold = 4;
27 long maxDelayThreshold = 8;
28
29 DefaultInvocationGate gate = new DefaultInvocationGate(minDelayThreshold, maxDelayThreshold, currentTime);
30 for (int i = 0; i < DEFAULT_MASK; i++) {
31 assertTrue(gate.isTooSoon(0));
32 }
33 assertFalse(gate.isTooSoon(0));
34 assertTrue(gate.getMask() > DEFAULT_MASK);
35 }
36
37 @Test
38 public void stableAtSteadyRate() {
39 long currentTime = 0;
40 long minDelayThreshold = DEFAULT_MASK;
41 long maxDelayThreshold = DEFAULT_MASK * 2;
42
43 DefaultInvocationGate gate = new DefaultInvocationGate(minDelayThreshold, maxDelayThreshold, currentTime);
44
45 for (int t = 0; t < 4 * minDelayThreshold; t++) {
46 gate.isTooSoon(currentTime++);
47 assertEquals(DEFAULT_MASK, gate.getMask());
48 }
49 }
50
51 @Test
52 public void intermittentCallsShouldCauseMaskToDecrease() {
53 long currentTime = 0;
54 long minDelayThreshold = 4;
55 long maxDelayThreshold = 8;
56
57 DefaultInvocationGate gate = new DefaultInvocationGate(minDelayThreshold, maxDelayThreshold, currentTime);
58 int currentMask = DEFAULT_MASK;
59
60 currentTime += maxDelayThreshold + 1;
61 assertFalse(gate.isTooSoon(currentTime));
62 assertTrue(gate.getMask() < currentMask);
63 }
64
65 @Test
66 public void maskCanDropToZeroForInfrequentInvocations() {
67 long currentTime = 0;
68 long minDelayThreshold = 4;
69 long maxDelayThreshold = 8;
70
71 DefaultInvocationGate gate = new DefaultInvocationGate(minDelayThreshold, maxDelayThreshold, currentTime);
72 int currentMask = DEFAULT_MASK;
73
74 do {
75 currentTime += maxDelayThreshold + 1;
76 assertFalse(gate.isTooSoon(currentTime));
77 assertTrue(gate.getMask() < currentMask);
78 currentMask = currentMask >> MASK_DECREASE_RIGHT_SHIFT_COUNT;
79 } while (currentMask > 0);
80
81 assertEquals(0, gate.getMask());
82 assertFalse(gate.isTooSoon(currentTime));
83 }
84 }