1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package org.apache.hc.client5.http.impl.classic;
28
29
30 import org.apache.hc.client5.http.HttpRoute;
31 import org.apache.hc.core5.http.HttpHost;
32 import org.apache.hc.core5.util.TimeValue;
33 import org.junit.jupiter.api.BeforeEach;
34 import org.junit.jupiter.api.Test;
35
36 import static org.junit.jupiter.api.Assertions.assertEquals;
37 import static org.junit.jupiter.api.Assertions.assertTrue;
38
39 public class TestLinearBackoffManager {
40
41 private LinearBackoffManager impl;
42 private MockConnPoolControl connPerRoute;
43 private HttpRoute route;
44 private static final long DEFAULT_COOL_DOWN_MS = 10;
45
46 @BeforeEach
47 public void setUp() {
48 connPerRoute = new MockConnPoolControl();
49 route = new HttpRoute(new HttpHost("localhost", 80));
50 impl = new LinearBackoffManager(connPerRoute);
51 impl.setCoolDown(TimeValue.ofMilliseconds(DEFAULT_COOL_DOWN_MS));
52 }
53
54 @Test
55 public void incrementsConnectionsOnBackoff() {
56 final LinearBackoffManager impl = new LinearBackoffManager(connPerRoute);
57 impl.setCoolDown(TimeValue.ofMilliseconds(DEFAULT_COOL_DOWN_MS));
58 connPerRoute.setMaxPerRoute(route, 4);
59 impl.backOff(route);
60 assertEquals(5, connPerRoute.getMaxPerRoute(route));
61 }
62
63 @Test
64 public void decrementsConnectionsOnProbe() {
65 connPerRoute.setMaxPerRoute(route, 4);
66 impl.probe(route);
67 assertEquals(3, connPerRoute.getMaxPerRoute(route));
68 }
69
70 @Test
71 public void backoffDoesNotAdjustDuringCoolDownPeriod() {
72 connPerRoute.setMaxPerRoute(route, 4);
73 impl.backOff(route);
74 final long max = connPerRoute.getMaxPerRoute(route);
75
76 final long end = System.currentTimeMillis() + 1;
77 while (System.currentTimeMillis() < end) {
78
79 }
80
81 impl.backOff(route);
82 assertEquals(max, connPerRoute.getMaxPerRoute(route));
83 }
84
85 @Test
86 public void backoffStillAdjustsAfterCoolDownPeriod() throws InterruptedException {
87 final LinearBackoffManager impl = new LinearBackoffManager(connPerRoute);
88 impl.setCoolDown(TimeValue.ofMilliseconds(DEFAULT_COOL_DOWN_MS));
89 connPerRoute.setMaxPerRoute(route, 4);
90 impl.backOff(route);
91 final int max1 = connPerRoute.getMaxPerRoute(route);
92
93 Thread.sleep(DEFAULT_COOL_DOWN_MS + 1);
94
95 impl.backOff(route);
96 final int max2 = connPerRoute.getMaxPerRoute(route);
97
98 assertTrue(max2 > max1);
99 }
100
101
102 @Test
103 public void probeDoesNotAdjustDuringCooldownPeriod() {
104 connPerRoute.setMaxPerRoute(route, 4);
105 impl.probe(route);
106 final long max = connPerRoute.getMaxPerRoute(route);
107
108 final long end = System.currentTimeMillis() + 1;
109 while (System.currentTimeMillis() < end) {
110
111 }
112
113 impl.probe(route);
114 assertEquals(max, connPerRoute.getMaxPerRoute(route));
115 }
116
117 @Test
118 public void probeStillAdjustsAfterCoolDownPeriod() throws InterruptedException {
119 connPerRoute.setMaxPerRoute(route, 4);
120 impl.probe(route);
121 Thread.sleep(DEFAULT_COOL_DOWN_MS + 1);
122 impl.probe(route);
123 final long newMax = connPerRoute.getMaxPerRoute(route);
124 assertEquals(2, newMax);
125 }
126
127 @Test
128 public void testSetPerHostConnectionCap() {
129 connPerRoute.setMaxPerRoute(route, 5);
130 impl.setPerHostConnectionCap(10);
131 impl.backOff(route);
132 assertEquals(6, connPerRoute.getMaxPerRoute(route));
133 }
134
135 @Test
136 public void probeUpdatesRemainingAttemptsIndirectly() throws InterruptedException {
137
138 connPerRoute.setMaxPerRoute(route, 4);
139
140
141 impl.backOff(route);
142 Thread.sleep(DEFAULT_COOL_DOWN_MS + 1);
143 impl.backOff(route);
144
145
146 assertEquals(6, connPerRoute.getMaxPerRoute(route));
147
148
149 impl.probe(route);
150
151
152 Thread.sleep(DEFAULT_COOL_DOWN_MS * 2);
153
154
155 impl.probe(route);
156
157
158 assertEquals(5, connPerRoute.getMaxPerRoute(route));
159 }
160
161 @Test
162 public void linearIncrementTest() throws InterruptedException {
163 final int initialMax = 4;
164 connPerRoute.setMaxPerRoute(route, initialMax);
165 for (int i = 1; i <= 5; i++) {
166 impl.backOff(route);
167 assertEquals(initialMax + i, connPerRoute.getMaxPerRoute(route));
168 Thread.sleep(DEFAULT_COOL_DOWN_MS + 1);
169
170 }
171 }
172 }