Repository navigation
Expand file tree
/
Copy pathWaitTimeUtilsTest.java
More file actions
114 lines (88 loc) · 4.99 KB
/
Copy pathWaitTimeUtilsTest.java
File metadata and controls
114 lines (88 loc) · 4.99 KB
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package org.kohsuke.github.internal;
import org.junit.Test;
import org.kohsuke.github.connector.GitHubConnectorResponse;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
import static org.hamcrest.Matchers.lessThanOrEqualTo;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
* Tests for {@link WaitTimeUtils}, the shared implementation behind {@code GitHubAbuseLimitHandler.parseWaitTime} and
* {@code GitHubRateLimitHandler.parseWaitTime}.
*/
public class WaitTimeUtilsTest {
private static final long DEFAULT_WAIT = 61_000L;
private static final long MINIMUM_WAIT = 1_000L;
private static String httpDate(ZonedDateTime dateTime) {
return DateTimeFormatter.RFC_1123_DATE_TIME.format(dateTime.withZoneSameInstant(ZoneOffset.UTC));
}
@Test
public void rateLimitResetClampsToMinimumWhenResetAlreadyPassed() {
ZonedDateTime serverNow = ZonedDateTime.of(2026, 10, 16, 12, 0, 0, 0, ZoneOffset.UTC);
long resetEpochSeconds = serverNow.minusSeconds(90).toInstant().getEpochSecond();
GitHubConnectorResponse response = mock(GitHubConnectorResponse.class);
when(response.header("Date")).thenReturn(httpDate(serverNow));
when(response.header("X-RateLimit-Reset")).thenReturn(String.valueOf(resetEpochSeconds));
assertThat(WaitTimeUtils.parseRateLimitResetWaitTime(response, DEFAULT_WAIT, MINIMUM_WAIT),
equalTo(MINIMUM_WAIT));
}
@Test
public void rateLimitResetComputesWaitFromResponseDate() {
ZonedDateTime serverNow = ZonedDateTime.of(2026, 10, 16, 12, 0, 0, 0, ZoneOffset.UTC);
long resetEpochSeconds = serverNow.plusSeconds(90).toInstant().getEpochSecond();
GitHubConnectorResponse response = mock(GitHubConnectorResponse.class);
when(response.header("Date")).thenReturn(httpDate(serverNow));
when(response.header("X-RateLimit-Reset")).thenReturn(String.valueOf(resetEpochSeconds));
assertThat(WaitTimeUtils.parseRateLimitResetWaitTime(response, DEFAULT_WAIT, MINIMUM_WAIT), equalTo(90_000L));
}
@Test
public void rateLimitResetFallsBackToLocalTimeWhenDateHeaderMissing() {
// No Date header: serverNow() must fall back to the local clock.
// The result depends on the wall clock, so assert a range around the expected wait
// instead of an exact value (the reset timestamp has one-second precision).
long resetEpochSeconds = ZonedDateTime.now().plusSeconds(120).toInstant().getEpochSecond();
GitHubConnectorResponse response = mock(GitHubConnectorResponse.class);
when(response.header("Date")).thenReturn(null);
when(response.header("X-RateLimit-Reset")).thenReturn(String.valueOf(resetEpochSeconds));
long wait = WaitTimeUtils.parseRateLimitResetWaitTime(response, DEFAULT_WAIT, MINIMUM_WAIT);
assertThat(wait, greaterThanOrEqualTo(115_000L));
assertThat(wait, lessThanOrEqualTo(120_000L));
}
@Test
public void rateLimitResetReturnsDefaultWhenHeaderMissing() {
GitHubConnectorResponse response = mock(GitHubConnectorResponse.class);
when(response.header("X-RateLimit-Reset")).thenReturn(null);
assertThat(WaitTimeUtils.parseRateLimitResetWaitTime(response, DEFAULT_WAIT, MINIMUM_WAIT),
equalTo(DEFAULT_WAIT));
}
@Test
public void retryAfterClampsToMinimum() {
GitHubConnectorResponse response = mock(GitHubConnectorResponse.class);
when(response.header("Retry-After")).thenReturn("0");
assertThat(WaitTimeUtils.parseRetryAfterWaitTime(response, DEFAULT_WAIT, MINIMUM_WAIT), equalTo(MINIMUM_WAIT));
}
@Test
public void retryAfterParsesHttpDateRelativeToResponseDate() {
ZonedDateTime serverNow = ZonedDateTime.of(2026, 10, 16, 12, 0, 0, 0, ZoneOffset.UTC);
GitHubConnectorResponse response = mock(GitHubConnectorResponse.class);
when(response.header("Date")).thenReturn(httpDate(serverNow));
when(response.header("Retry-After")).thenReturn(httpDate(serverNow.plusSeconds(45)));
assertThat(WaitTimeUtils.parseRetryAfterWaitTime(response, DEFAULT_WAIT, MINIMUM_WAIT), equalTo(45_000L));
}
@Test
public void retryAfterParsesSeconds() {
GitHubConnectorResponse response = mock(GitHubConnectorResponse.class);
when(response.header("Retry-After")).thenReturn("30");
assertThat(WaitTimeUtils.parseRetryAfterWaitTime(response, DEFAULT_WAIT, MINIMUM_WAIT), equalTo(30_000L));
}
@Test
public void retryAfterReturnsDefaultWhenHeaderMissing() {
GitHubConnectorResponse response = mock(GitHubConnectorResponse.class);
when(response.header("Retry-After")).thenReturn(null);
assertThat(WaitTimeUtils.parseRetryAfterWaitTime(response, DEFAULT_WAIT, MINIMUM_WAIT), equalTo(DEFAULT_WAIT));
}
}