From b09313d3a58342d27593f933a0ee835ab305a928 Mon Sep 17 00:00:00 2001 From: "vladimir.bukhtoyarov" Date: Sat, 2 Oct 2021 19:12:22 +0300 Subject: [PATCH] #177 Unit tests for ADDITIVE TokensInheritanceStrategy --- ...nfigurationReplacementSpecification.groovy | 126 ++++++++++++++++++ .../AbstractSerializationTest.java | 4 +- 2 files changed, 129 insertions(+), 1 deletion(-) diff --git a/bucket4j-core/src/test/java/io/github/bucket4j/ConfigurationReplacementSpecification.groovy b/bucket4j-core/src/test/java/io/github/bucket4j/ConfigurationReplacementSpecification.groovy index d41f3c78..dedf02e0 100644 --- a/bucket4j-core/src/test/java/io/github/bucket4j/ConfigurationReplacementSpecification.groovy +++ b/bucket4j-core/src/test/java/io/github/bucket4j/ConfigurationReplacementSpecification.groovy @@ -222,6 +222,132 @@ class ConfigurationReplacementSpecification extends Specification { bucketType << BucketType.values() } + @Unroll + def "#bucketType test replace configuration additive from gready refill to gready refill when capacity increased"(BucketType bucketType) { + expect: + for (boolean sync : [true, false]) { + for (boolean verbose: [true, false]) { + // System.err.println("sync: $sync verbose: $verbose") + TimeMeterMock clock = new TimeMeterMock(0) + Bucket bucket = bucketType.createBucket(Bucket4j.builder() + .addLimit(Bandwidth.simple(3, Duration.ofNanos(5)).withInitialTokens(0)), + clock + ) + clock.addTime(3) // 1.8 + BucketConfiguration newConfiguration = Bucket4j.configurationBuilder() + .addLimit(Bandwidth.simple(60, Duration.ofNanos(1000))) + .build() + if (sync) { + if (!verbose) { + bucket.replaceConfiguration(newConfiguration, TokensInheritanceStrategy.ADDITIVE) + } else { + bucket.asVerbose().replaceConfiguration(newConfiguration, TokensInheritanceStrategy.ADDITIVE) + } + } else { + if (!verbose) { + bucket.asAsync().replaceConfiguration(newConfiguration, TokensInheritanceStrategy.ADDITIVE).get() + } else { + bucket.asAsync().asVerbose().replaceConfiguration(newConfiguration, TokensInheritanceStrategy.ADDITIVE).get() + } + } + assert bucket.getAvailableTokens() == 58 + + clock.addTime(4) + assert bucket.getAvailableTokens() == 59 + } + } + where: + bucketType << BucketType.values() + } + + @Unroll + def "#bucketType test replace configuration additive from gready refill to intervally refill when capacity increased"(BucketType bucketType) { + expect: + for (boolean sync : [true, false]) { + for (boolean verbose: [true, false]) { + // System.err.println("sync: $sync verbose: $verbose") + TimeMeterMock clock = new TimeMeterMock(0) + Bucket bucket = bucketType.createBucket(Bucket4j.builder() + .addLimit(Bandwidth.simple(3, Duration.ofNanos(5)).withInitialTokens(0)), + clock + ) + clock.addTime(3) // 1.8 + Refill refill = Refill.intervally(60, Duration.ofNanos(1000)) + BucketConfiguration newConfiguration = Bucket4j.configurationBuilder() + .addLimit(Bandwidth.classic(60, refill)) + .build() + if (sync) { + if (!verbose) { + bucket.replaceConfiguration(newConfiguration, TokensInheritanceStrategy.ADDITIVE) + } else { + bucket.asVerbose().replaceConfiguration(newConfiguration, TokensInheritanceStrategy.ADDITIVE) + } + } else { + if (!verbose) { + bucket.asAsync().replaceConfiguration(newConfiguration, TokensInheritanceStrategy.ADDITIVE).get() + } else { + bucket.asAsync().asVerbose().replaceConfiguration(newConfiguration, TokensInheritanceStrategy.ADDITIVE).get() + } + } + assert bucket.getAvailableTokens() == 58 + + clock.addTime(999) + assert bucket.getAvailableTokens() == 58 // 0.8 tokens from previous bucket should not be copied after config replacement + + clock.addTime(1) + assert bucket.getAvailableTokens() == 60 + } + } + where: + bucketType << BucketType.values() + } + + @Unroll + def "#bucketType should decrease available tokens when reducing capacity and copying tokens additive"(BucketType bucketType) { + expect: + for (boolean sync : [true, false]) { + TimeMeterMock clock = new TimeMeterMock(0) + Bucket bucket = bucketType.createBucket(Bucket4j.builder() + .addLimit(Bandwidth.classic(500, Refill.greedy(100, Duration.ofNanos(100)))), + clock + ) + BucketConfiguration newConfiguration = Bucket4j.configurationBuilder() + .addLimit(Bandwidth.classic (200, Refill.greedy(100, Duration.ofNanos(100)) )) + .build() + if (sync) { + bucket.replaceConfiguration(newConfiguration, TokensInheritanceStrategy.ADDITIVE) + } else { + bucket.asAsync().replaceConfiguration(newConfiguration, TokensInheritanceStrategy.ADDITIVE).get() + } + assert bucket.getAvailableTokens() == 200 + } + where: + bucketType << BucketType.values() + } + + @Unroll + def "#bucketType should increase available tokens when reducing capacity and copying tokens additive"(BucketType bucketType) { + expect: + for (boolean sync : [true, false]) { + TimeMeterMock clock = new TimeMeterMock(0) + Bucket bucket = bucketType.createBucket(Bucket4j.builder() + .addLimit(Bandwidth.classic(500, Refill.greedy(100, Duration.ofNanos(100))).withInitialTokens(200)), + clock + ) + BucketConfiguration newConfiguration = Bucket4j.configurationBuilder() + .addLimit(Bandwidth.classic (900, Refill.greedy(100, Duration.ofNanos(100)) )) + .build() + if (sync) { + bucket.replaceConfiguration(newConfiguration, TokensInheritanceStrategy.ADDITIVE) + } else { + bucket.asAsync().replaceConfiguration(newConfiguration, TokensInheritanceStrategy.ADDITIVE).get() + } + assert bucket.getAvailableTokens() == 600 + } + where: + bucketType << BucketType.values() + } + @Unroll def "#bucketType should decrease available tokens when reducing capacity and copying tokens proportionally"(BucketType bucketType) { expect: diff --git a/bucket4j-core/src/test/java/io/github/bucket4j/serialization/AbstractSerializationTest.java b/bucket4j-core/src/test/java/io/github/bucket4j/serialization/AbstractSerializationTest.java index b219a9f3..3d48e9d1 100644 --- a/bucket4j-core/src/test/java/io/github/bucket4j/serialization/AbstractSerializationTest.java +++ b/bucket4j-core/src/test/java/io/github/bucket4j/serialization/AbstractSerializationTest.java @@ -213,7 +213,9 @@ public void serializationOfCommands() throws IOException { BucketConfiguration configuration = Bucket4j.configurationBuilder() .addLimit(simple(10, ofSeconds(1))) .build(); - testSerialization(new ReplaceConfigurationCommand(configuration, TokensInheritanceStrategy.AS_IS)); + for (TokensInheritanceStrategy tokensInheritanceStrategy : TokensInheritanceStrategy.values()) { + testSerialization(new ReplaceConfigurationCommand(configuration, tokensInheritanceStrategy)); + } testSerialization(new ConsumeIgnoringRateLimitsCommand(100));