private RequestLimitRule toLimitRule(Rate rate) { return RequestLimitRule.of(Duration.ofMillis(rate.timeUnit().toMillis(rate.duration())), rate.limit()); } }
private JsonArray toJsonArray(RequestLimitRule rule) { return Json.array().asArray() .add(rule.getDurationSeconds()) .add(rule.getLimit()) .add(rule.getPrecision()); } }
DefaultRequestLimitRulesSupplierTest() { allRules.add(RequestLimitRule.of(Duration.ofSeconds(1), 10).withName("localhostPerSeconds") .matchingKeys("localhost", "127.0.0.1")); allRules.add(RequestLimitRule.of(Duration.ofHours(1), 2000).withName("localhostPerHours") .matchingKeys("localhost", "127.0.0.1")); allRules.add(RequestLimitRule.of(Duration.ofSeconds(1), 5).withName("perSeconds")); allRules.add(RequestLimitRule.of(Duration.ofHours(1), 1000).withName("perHours")); requestLimitRulesSupplier = new DefaultRequestLimitRulesSupplier(allRules); }
@Test void shouldHavePrecisionOf10() { RequestLimitRule requestLimitRule = RequestLimitRule.of(Duration.ofSeconds(1), 5).withPrecision(10); assertThat(requestLimitRule.getPrecision()).isEqualTo(10); }
@Test void shouldHaveDuration60Seconds() { RequestLimitRule requestLimitRule = RequestLimitRule.of(Duration.ofMinutes(1), 5); assertThat(requestLimitRule.getDurationSeconds()).isEqualTo(60); }
@Test void shouldDefaultPrecisionToEqualDuration() { RequestLimitRule requestLimitRule = RequestLimitRule.of(Duration.ofMinutes(1), 5); assertThat(requestLimitRule.getPrecision()).isEqualTo(60); }
@Test @DisplayName("should encode limit rule with precision in JSON array") void shouldEncodeWithPrecisions() { ImmutableList<RequestLimitRule> rules = ImmutableList.of(RequestLimitRule.of(Duration.ofSeconds(10), 10L).withPrecision(4), RequestLimitRule.of(Duration.ofMinutes(1), 20L).withPrecision(8)); assertThat(serialiser.encode(rules)).isEqualTo("[[10,10,4],[60,20,8]]"); }
/** * Applies a key to the rate limit that defines to which keys, the rule applies, empty for any unmatched key. * * @param keys Defines a set of keys to which the rule applies. * @return a limit rule */ public RequestLimitRule matchingKeys(String... keys) { Set<String> keySet = keys.length > 0 ? new HashSet<>(Arrays.asList(keys)) : null; return matchingKeys(keySet); }
@Test void shouldHaveDuration1Seconds() { RequestLimitRule requestLimitRule = RequestLimitRule.of(Duration.ofSeconds(1), 5); assertThat(requestLimitRule.getDurationSeconds()).isEqualTo(1); }
SavedKey savedKey = new SavedKey(now, rule.getDurationSeconds(), rule.getPrecision()); savedKeys.add(savedKey); if (count > rule.getLimit()) { return true; // over limit, don't record request } else if (!strictlyGreater && count == rule.getLimit()) { geLimit = true; // at limit, do record request
@Test @DisplayName("should encode limit rule in JSON array") void shouldEncode() { ImmutableList<RequestLimitRule> rules = ImmutableList.of(RequestLimitRule.of(Duration.ofSeconds(10), 10L), RequestLimitRule.of(Duration.ofMinutes(1), 20L)); assertThat(serialiser.encode(rules)).isEqualTo("[[10,10,10],[60,20,60]]"); }
SavedKey savedKey = new SavedKey(now, rule.getDurationSeconds(), rule.getPrecision()); savedKeys.add(savedKey); if (count > rule.getLimit()) { return true; // over limit, don't record request } else if (!strictlyGreater && count == rule.getLimit()) { geLimit = true; // at limit, do record request
@Test void shouldReturnTheSameInstanceForSameSetOfRules() { RequestLimitRule rule1a = RequestLimitRule.of(Duration.ofMinutes(1), 10); RequestLimitRule rule1b = RequestLimitRule.of(Duration.ofHours(1), 100); RequestRateLimiter rateLimiter1 = factory.getInstance(ImmutableSet.of(rule1a, rule1b)); RequestLimitRule rule2a = RequestLimitRule.of(Duration.ofMinutes(1), 10); RequestLimitRule rule2b = RequestLimitRule.of(Duration.ofHours(1), 100); RequestRateLimiter rateLimiter2 = factory.getInstance(ImmutableSet.of(rule2a, rule2b)); assertThat(rateLimiter1).isSameAs(rateLimiter2); }
@Test void shouldReturnTheSameInstanceForSameSetOfRules() { RequestLimitRule rule1a = RequestLimitRule.of(Duration.ofMinutes(1), 10); RequestLimitRule rule1b = RequestLimitRule.of(Duration.ofHours(1), 100); RequestRateLimiter rateLimiter1 = factory.getInstance(ImmutableSet.of(rule1a, rule1b)); RequestLimitRule rule2a = RequestLimitRule.of(Duration.ofMinutes(1), 10); RequestLimitRule rule2b = RequestLimitRule.of(Duration.ofHours(1), 100); RequestRateLimiter rateLimiter2 = factory.getInstance(ImmutableSet.of(rule2a, rule2b)); assertThat(rateLimiter1).isSameAs(rateLimiter2); }
@Test void shouldNotReturnTheSameInstanceForSameRules() { RequestLimitRule rule1 = RequestLimitRule.of(Duration.ofMinutes(1), 22); RequestRateLimiter rateLimiter1 = factory.getInstance(ImmutableSet.of(rule1)); RequestLimitRule rule2 = RequestLimitRule.of(Duration.ofMinutes(1), 33); RequestRateLimiter rateLimiter2 = factory.getInstance(ImmutableSet.of(rule2)); assertThat(rateLimiter1).isNotSameAs(rateLimiter2); } }
@Test void shouldReturnTheSameInstanceForSameRules() { RequestLimitRule rule1 = RequestLimitRule.of(Duration.ofMinutes(1), 10); RequestRateLimiter rateLimiter1 = factory.getInstance(ImmutableSet.of(rule1)); RequestLimitRule rule2 = RequestLimitRule.of(Duration.ofMinutes(1), 10); RequestRateLimiter rateLimiter2 = factory.getInstance(ImmutableSet.of(rule2)); assertThat(rateLimiter1).isSameAs(rateLimiter2); }
@Test void shouldNotReturnTheSameInstanceForSameRules() { RequestLimitRule rule1 = RequestLimitRule.of(Duration.ofMinutes(1), 22); RequestRateLimiter rateLimiter1 = factory.getInstance(ImmutableSet.of(rule1)); RequestLimitRule rule2 = RequestLimitRule.of(Duration.ofMinutes(1), 33); RequestRateLimiter rateLimiter2 = factory.getInstance(ImmutableSet.of(rule2)); assertThat(rateLimiter1).isNotSameAs(rateLimiter2); } }