Skip to content

Commit

Permalink
#189 short method for getting available tokens for each bandwidth
Browse files Browse the repository at this point in the history
  • Loading branch information
vladimir-bukhtoyarov committed Nov 14, 2021
1 parent 099b1ac commit 43be28b
Show file tree
Hide file tree
Showing 2 changed files with 105 additions and 0 deletions.
29 changes: 29 additions & 0 deletions bucket4j-core/src/main/java/io/github/bucket4j/VerboseResult.java
Expand Up @@ -43,6 +43,20 @@ public class VerboseResult<T extends Serializable> implements Serializable {
public long calculateFullRefillingTime() {
return state.calculateFullRefillingTime(configuration.getBandwidths(), operationTimeNanos);
}
@Override
public long getAvailableTokens() {
return state.getAvailableTokens(configuration.getBandwidths());
}

@Override
public long[] getAvailableTokensPerEachBandwidth() {
Bandwidth[] bandwidths = configuration.getBandwidths();
long[] availableTokens = new long[bandwidths.length];
for (int i = 0; i < bandwidths.length; i++) {
availableTokens[i] = state.getCurrentSize(i);
}
return availableTokens;
}
};

public VerboseResult(long operationTimeNanos, T value, BucketConfiguration configuration, BucketState state) {
Expand Down Expand Up @@ -99,6 +113,21 @@ interface Diagnostics {
*/
long calculateFullRefillingTime();

/**
* Returns currently available tokens
*
* @return currently available tokens
*/
long getAvailableTokens();

/**
* Returns currently available tokens per each bandwidth.
* Element's order inside resulted array depends from order in which bandwidth is specified inside {@link BucketConfiguration}.
*
* @return currently available tokens per each bandwidth
*/
long[] getAvailableTokensPerEachBandwidth();

}

public <R extends Serializable> VerboseResult<R> map(Function<T, R> mapper) {
Expand Down
Expand Up @@ -94,4 +94,80 @@ class VerboseApiTest extends Specification {
]
}

def "getAvailableTokens"(String testNumber, long requiredAvailableTokens, BucketConfiguration configuration) {
setup:
long currentTimeNanos = 0L
BucketState state = BucketState.createInitialState(configuration, currentTimeNanos)
VerboseResult verboseResult = new VerboseResult(currentTimeNanos, 42, configuration, state)
when:
long availableTokens = verboseResult.getDiagnostics().getAvailableTokens()
then:
availableTokens == requiredAvailableTokens
where:
[testNumber, requiredAvailableTokens, configuration] << [
[
"#1",
3,
Bucket4j.configurationBuilder()
.addLimit(Bandwidth.simple(10, Duration.ofNanos(100)).withInitialTokens(3))
.build()
], [
"#2",
10,
Bucket4j.configurationBuilder()
.addLimit(Bandwidth.classic(10, Refill.intervally(10, Duration.ofNanos(100))))
.build()
], [
"#3",
1,
Bucket4j.configurationBuilder()
.addLimit(Bandwidth.classic(10, Refill.greedy(2, Duration.ofNanos(100))).withInitialTokens(1))
.addLimit(Bandwidth.classic(100, Refill.greedy(20, Duration.ofNanos(100))))
.build()
]
]
}

@Unroll
def "getAvailableTokensPerEachBandwidth"(String testNumber, List<Long> requiredAvailableTokens, BucketConfiguration configuration) {
setup:
long currentTimeNanos = 0L
BucketState state = BucketState.createInitialState(configuration, currentTimeNanos)
VerboseResult verboseResult = new VerboseResult(currentTimeNanos, 42, configuration, state)
when:
long[] availableTokens = verboseResult.getDiagnostics().getAvailableTokensPerEachBandwidth()
then:
Arrays.asList(availableTokens) == requiredAvailableTokens
where:
[testNumber, requiredAvailableTokens, configuration] << [
[
"#1",
[ 3l ] as List,
Bucket4j.configurationBuilder()
.addLimit(Bandwidth.simple(10, Duration.ofNanos(100)).withInitialTokens(3))
.build()
], [
"#2",
[ 10l ] as List,
Bucket4j.configurationBuilder()
.addLimit(Bandwidth.classic(10, Refill.intervally(10, Duration.ofNanos(100))))
.build()
], [
"#3",
[ 1l, 100l ] as List,
Bucket4j.configurationBuilder()
.addLimit(Bandwidth.classic(10, Refill.greedy(2, Duration.ofNanos(100))).withInitialTokens(1))
.addLimit(Bandwidth.classic(100, Refill.greedy(20, Duration.ofNanos(100))))
.build()
], [
"#3",
[ 100l, 1l ] as List,
Bucket4j.configurationBuilder()
.addLimit(Bandwidth.classic(100, Refill.greedy(20, Duration.ofNanos(100))))
.addLimit(Bandwidth.classic(10, Refill.greedy(2, Duration.ofNanos(100))).withInitialTokens(1))
.build()
]
]
}

}

0 comments on commit 43be28b

Please sign in to comment.