protected void ShouldPermitNExecutions(IRateLimitPolicy policy, long numberOfExecutions) { for (int execution = 0; execution < numberOfExecutions; execution++) { ShouldPermitAnExecution(policy); } }
protected void ShouldPermitAnExecution(IRateLimitPolicy policy) { (bool permitExecution, TimeSpan retryAfter) = TryExecuteThroughPolicy(policy); permitExecution.Should().BeTrue(); retryAfter.Should().Be(TimeSpan.Zero); }
protected override TResult TryExecuteThroughPolicy <TResult>(IRateLimitPolicy <TResult> policy, Context context, TResult resultIfExecutionPermitted) { if (policy is RateLimitPolicy <TResult> typedPolicy) { return(typedPolicy.Execute(ctx => resultIfExecutionPermitted, context)); } else { throw new InvalidOperationException("Unexpected policy type in test construction."); } }
protected override TResult TryExecuteThroughPolicy <TResult>(IRateLimitPolicy <TResult> policy, Context context, TResult resultIfExecutionPermitted) { if (policy is AsyncRateLimitPolicy <TResult> typedPolicy) { return(typedPolicy.ExecuteAsync(ctx => Task.FromResult(resultIfExecutionPermitted), context).GetAwaiter().GetResult()); } else { throw new InvalidOperationException("Unexpected policy type in test construction."); } }
protected void ShouldNotPermitAnExecution(IRateLimitPolicy policy, TimeSpan?retryAfter = null) { (bool permitExecution, TimeSpan retryAfter)canExecute = TryExecuteThroughPolicy(policy); canExecute.permitExecution.Should().BeFalse(); if (retryAfter == null) { canExecute.retryAfter.Should().BeGreaterThan(TimeSpan.Zero); } else { canExecute.retryAfter.Should().Be(retryAfter.Value); } }
protected override (bool, TimeSpan) TryExecuteThroughPolicy(IRateLimitPolicy policy) { if (policy is RateLimitPolicy typedPolicy) { try { typedPolicy.Execute(() => new ResultClassWithRetryAfter(ResultPrimitive.Good)); return(true, TimeSpan.Zero); } catch (RateLimitRejectedException e) { return(false, e.RetryAfter); } } else { throw new InvalidOperationException("Unexpected policy type in test construction."); } }
public Requester(HttpClient httpClient, IRateLimitPolicy rateLimitPolicy) { this.httpClient = httpClient; this.rateLimitPolicy = rateLimitPolicy; }
protected abstract TResult TryExecuteThroughPolicy <TResult>(IRateLimitPolicy <TResult> policy, Context context, TResult resultIfExecutionPermitted);
public RateLimitMiddleware(RequestDelegate next, IRateLimitPolicy rateLimitPolicy) { _next = next; _rateLimitPolicy = rateLimitPolicy; }
protected abstract (bool, TimeSpan) TryExecuteThroughPolicy(IRateLimitPolicy policy);