diff --git a/src/libraries/System.Threading.RateLimiting/src/Resources/Strings.resx b/src/libraries/System.Threading.RateLimiting/src/Resources/Strings.resx
index 0bbb8516816a24..cb67a1ee66da12 100644
--- a/src/libraries/System.Threading.RateLimiting/src/Resources/Strings.resx
+++ b/src/libraries/System.Threading.RateLimiting/src/Resources/Strings.resx
@@ -126,4 +126,13 @@
Over 49 days is not supported.
+
+ {0} must be set to a value greater than 0.
+
+
+ {0} must be set to a value greater than or equal to 0.
+
+
+ {0} must be set to a value greater than TimeSpan.Zero.
+
\ No newline at end of file
diff --git a/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/ConcurrencyLimiter.cs b/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/ConcurrencyLimiter.cs
index 508340a2e138be..90c4620d18d33c 100644
--- a/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/ConcurrencyLimiter.cs
+++ b/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/ConcurrencyLimiter.cs
@@ -47,11 +47,11 @@ public ConcurrencyLimiter(ConcurrencyLimiterOptions options)
}
if (options.PermitLimit <= 0)
{
- throw new ArgumentException($"{nameof(options.PermitLimit)} must be set to a value greater than 0.", nameof(options));
+ throw new ArgumentException(SR.Format(SR.ShouldBeGreaterThan0, nameof(options.PermitLimit)), nameof(options));
}
if (options.QueueLimit < 0)
{
- throw new ArgumentException($"{nameof(options.QueueLimit)} must be set to a value greater than or equal to 0.", nameof(options));
+ throw new ArgumentException(SR.Format(SR.ShouldBeGreaterThanOrEqual0, nameof(options.QueueLimit)), nameof(options));
}
_options = new ConcurrencyLimiterOptions
diff --git a/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/FixedWindowRateLimiter.cs b/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/FixedWindowRateLimiter.cs
index 774a6876c245ed..71dd29faa14256 100644
--- a/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/FixedWindowRateLimiter.cs
+++ b/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/FixedWindowRateLimiter.cs
@@ -53,15 +53,15 @@ public FixedWindowRateLimiter(FixedWindowRateLimiterOptions options)
}
if (options.PermitLimit <= 0)
{
- throw new ArgumentException($"{nameof(options.PermitLimit)} must be set to a value greater than 0.", nameof(options));
+ throw new ArgumentException(SR.Format(SR.ShouldBeGreaterThan0, nameof(options.PermitLimit)), nameof(options));
}
if (options.QueueLimit < 0)
{
- throw new ArgumentException($"{nameof(options.QueueLimit)} must be set to a value greater than or equal to 0.", nameof(options));
+ throw new ArgumentException(SR.Format(SR.ShouldBeGreaterThanOrEqual0, nameof(options.QueueLimit)), nameof(options));
}
- if (options.Window < TimeSpan.Zero)
+ if (options.Window <= TimeSpan.Zero)
{
- throw new ArgumentException($"{nameof(options.Window)} must be set to a value greater than or equal to TimeSpan.Zero.", nameof(options));
+ throw new ArgumentException(SR.Format(SR.ShouldBeGreaterThanTimeSpan0, nameof(options.Window)), nameof(options));
}
_options = new FixedWindowRateLimiterOptions
diff --git a/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/FixedWindowRateLimiterOptions.cs b/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/FixedWindowRateLimiterOptions.cs
index a6d2b164755520..8f7dbaa344beba 100644
--- a/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/FixedWindowRateLimiterOptions.cs
+++ b/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/FixedWindowRateLimiterOptions.cs
@@ -10,9 +10,8 @@ public sealed class FixedWindowRateLimiterOptions
{
///
/// Specifies the time window that takes in the requests.
- /// Must be set to a value >= by the time these options are passed to the constructor of .
+ /// Must be set to a value greater than by the time these options are passed to the constructor of .
///
- /// means the limiter will never replenish.
public TimeSpan Window { get; set; } = TimeSpan.Zero;
///
diff --git a/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/SlidingWindowRateLimiter.cs b/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/SlidingWindowRateLimiter.cs
index a1fe3e2839ed28..205b2d5b5bc395 100644
--- a/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/SlidingWindowRateLimiter.cs
+++ b/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/SlidingWindowRateLimiter.cs
@@ -55,17 +55,21 @@ public SlidingWindowRateLimiter(SlidingWindowRateLimiterOptions options)
{
throw new ArgumentNullException(nameof(options));
}
- if (options.PermitLimit <= 0 || options.SegmentsPerWindow <= 0)
+ if (options.PermitLimit <= 0)
{
- throw new ArgumentException($"Both {nameof(options.PermitLimit)} and {nameof(options.SegmentsPerWindow)} must be set to values greater than 0.", nameof(options));
+ throw new ArgumentException(SR.Format(SR.ShouldBeGreaterThan0, nameof(options.PermitLimit)), nameof(options));
+ }
+ if (options.SegmentsPerWindow <= 0)
+ {
+ throw new ArgumentException(SR.Format(SR.ShouldBeGreaterThan0, nameof(options.SegmentsPerWindow)), nameof(options));
}
if (options.QueueLimit < 0)
{
- throw new ArgumentException($"{nameof(options.QueueLimit)} must be set to a value greater than or equal to 0.", nameof(options));
+ throw new ArgumentException(SR.Format(SR.ShouldBeGreaterThanOrEqual0, nameof(options.QueueLimit)), nameof(options));
}
- if (options.Window < TimeSpan.Zero)
+ if (options.Window <= TimeSpan.Zero)
{
- throw new ArgumentException($"{nameof(options.Window)} must be set to a value greater than or equal to TimeSpan.Zero.", nameof(options));
+ throw new ArgumentException(SR.Format(SR.ShouldBeGreaterThanTimeSpan0, nameof(options.Window)), nameof(options));
}
_options = new SlidingWindowRateLimiterOptions
diff --git a/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/SlidingWindowRateLimiterOptions.cs b/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/SlidingWindowRateLimiterOptions.cs
index f7f399e175b1fc..93f7ba933b464f 100644
--- a/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/SlidingWindowRateLimiterOptions.cs
+++ b/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/SlidingWindowRateLimiterOptions.cs
@@ -10,9 +10,8 @@ public sealed class SlidingWindowRateLimiterOptions
{
///
/// Specifies the minimum period between replenishments.
- /// Must be set to a value >= by the time these options are passed to the constructor of .
+ /// Must be set to a value greater than by the time these options are passed to the constructor of .
///
- /// means the limiter will never replenish.
public TimeSpan Window { get; set; } = TimeSpan.Zero;
///
diff --git a/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/TokenBucketRateLimiter.cs b/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/TokenBucketRateLimiter.cs
index 9238a62a0c03ee..8423b13a603519 100644
--- a/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/TokenBucketRateLimiter.cs
+++ b/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/TokenBucketRateLimiter.cs
@@ -53,17 +53,21 @@ public TokenBucketRateLimiter(TokenBucketRateLimiterOptions options)
{
throw new ArgumentNullException(nameof(options));
}
- if (options.TokenLimit <= 0 || options.TokensPerPeriod <= 0)
+ if (options.TokenLimit <= 0)
{
- throw new ArgumentException($"Both {nameof(options.TokenLimit)} and {nameof(options.TokensPerPeriod)} must be set to values greater than 0.", nameof(options));
+ throw new ArgumentException(SR.Format(SR.ShouldBeGreaterThan0, nameof(options.TokenLimit)), nameof(options));
+ }
+ if (options.TokensPerPeriod <= 0)
+ {
+ throw new ArgumentException(SR.Format(SR.ShouldBeGreaterThan0, nameof(options.TokensPerPeriod)), nameof(options));
}
if (options.QueueLimit < 0)
{
- throw new ArgumentException($"{nameof(options.QueueLimit)} must be set to a value greater than or equal to 0.", nameof(options));
+ throw new ArgumentException(SR.Format(SR.ShouldBeGreaterThanOrEqual0, nameof(options.QueueLimit)), nameof(options));
}
- if (options.ReplenishmentPeriod < TimeSpan.Zero)
+ if (options.ReplenishmentPeriod <= TimeSpan.Zero)
{
- throw new ArgumentException($"{nameof(options.ReplenishmentPeriod)} must be set to a value greater than or equal to TimeSpan.Zero.", nameof(options));
+ throw new ArgumentException(SR.Format(SR.ShouldBeGreaterThanTimeSpan0, nameof(options.ReplenishmentPeriod)), nameof(options));
}
_options = new TokenBucketRateLimiterOptions
diff --git a/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/TokenBucketRateLimiterOptions.cs b/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/TokenBucketRateLimiterOptions.cs
index b0371119ce3c00..2c065d9432e67c 100644
--- a/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/TokenBucketRateLimiterOptions.cs
+++ b/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/TokenBucketRateLimiterOptions.cs
@@ -10,9 +10,8 @@ public sealed class TokenBucketRateLimiterOptions
{
///
/// Specifies the minimum period between replenishments.
- /// Must be set to a value >= by the time these options are passed to the constructor of .
+ /// Must be set to a value greater than by the time these options are passed to the constructor of .
///
- /// means the limiter will never replenish.
public TimeSpan ReplenishmentPeriod { get; set; } = TimeSpan.Zero;
///
diff --git a/src/libraries/System.Threading.RateLimiting/tests/ConcurrencyLimiterTests.cs b/src/libraries/System.Threading.RateLimiting/tests/ConcurrencyLimiterTests.cs
index 54e2bbecc19752..0669a4bd6bc943 100644
--- a/src/libraries/System.Threading.RateLimiting/tests/ConcurrencyLimiterTests.cs
+++ b/src/libraries/System.Threading.RateLimiting/tests/ConcurrencyLimiterTests.cs
@@ -11,13 +11,13 @@ public class ConcurrencyLimiterTests : BaseRateLimiterTests
[Fact]
public override void InvalidOptionsThrows()
{
- Assert.Throws(() => new ConcurrencyLimiter(new ConcurrencyLimiterOptions
+ AssertExtensions.Throws("options", () => new ConcurrencyLimiter(new ConcurrencyLimiterOptions
{
PermitLimit = -1,
QueueProcessingOrder = QueueProcessingOrder.NewestFirst,
QueueLimit = 1
}));
- Assert.Throws(() => new ConcurrencyLimiter(new ConcurrencyLimiterOptions
+ AssertExtensions.Throws("options", () => new ConcurrencyLimiter(new ConcurrencyLimiterOptions
{
PermitLimit = 1,
QueueProcessingOrder = QueueProcessingOrder.NewestFirst,
diff --git a/src/libraries/System.Threading.RateLimiting/tests/FixedWindowRateLimiterTests.cs b/src/libraries/System.Threading.RateLimiting/tests/FixedWindowRateLimiterTests.cs
index f5c75a0308ab28..3e67bd130d7053 100644
--- a/src/libraries/System.Threading.RateLimiting/tests/FixedWindowRateLimiterTests.cs
+++ b/src/libraries/System.Threading.RateLimiting/tests/FixedWindowRateLimiterTests.cs
@@ -35,7 +35,7 @@ public override void CanAcquireResource()
[Fact]
public override void InvalidOptionsThrows()
{
- Assert.Throws(
+ AssertExtensions.Throws("options",
() => new FixedWindowRateLimiter(new FixedWindowRateLimiterOptions
{
PermitLimit = -1,
@@ -44,7 +44,7 @@ public override void InvalidOptionsThrows()
Window = TimeSpan.FromMinutes(2),
AutoReplenishment = false
}));
- Assert.Throws(
+ AssertExtensions.Throws("options",
() => new FixedWindowRateLimiter(new FixedWindowRateLimiterOptions
{
PermitLimit = 1,
@@ -53,7 +53,7 @@ public override void InvalidOptionsThrows()
Window = TimeSpan.FromMinutes(2),
AutoReplenishment = false
}));
- Assert.Throws(
+ AssertExtensions.Throws("options",
() => new FixedWindowRateLimiter(new FixedWindowRateLimiterOptions
{
PermitLimit = 1,
@@ -62,7 +62,7 @@ public override void InvalidOptionsThrows()
Window = TimeSpan.MinValue,
AutoReplenishment = false
}));
- Assert.Throws(
+ AssertExtensions.Throws("options",
() => new FixedWindowRateLimiter(new FixedWindowRateLimiterOptions
{
PermitLimit = 1,
@@ -71,6 +71,15 @@ public override void InvalidOptionsThrows()
Window = TimeSpan.FromMinutes(-2),
AutoReplenishment = false,
}));
+ AssertExtensions.Throws("options",
+ () => new FixedWindowRateLimiter(new FixedWindowRateLimiterOptions
+ {
+ PermitLimit = 1,
+ QueueProcessingOrder = QueueProcessingOrder.NewestFirst,
+ QueueLimit = 1,
+ Window = TimeSpan.Zero,
+ AutoReplenishment = false,
+ }));
}
[Fact]
diff --git a/src/libraries/System.Threading.RateLimiting/tests/SlidingWindowRateLimiterTests.cs b/src/libraries/System.Threading.RateLimiting/tests/SlidingWindowRateLimiterTests.cs
index bd0d0d298d5adf..c45b9d75140ec3 100644
--- a/src/libraries/System.Threading.RateLimiting/tests/SlidingWindowRateLimiterTests.cs
+++ b/src/libraries/System.Threading.RateLimiting/tests/SlidingWindowRateLimiterTests.cs
@@ -37,7 +37,7 @@ public override void CanAcquireResource()
[Fact]
public override void InvalidOptionsThrows()
{
- Assert.Throws(
+ AssertExtensions.Throws("options",
() => new SlidingWindowRateLimiter(new SlidingWindowRateLimiterOptions
{
PermitLimit = -1,
@@ -47,7 +47,7 @@ public override void InvalidOptionsThrows()
SegmentsPerWindow = 1,
AutoReplenishment = false
}));
- Assert.Throws(
+ AssertExtensions.Throws("options",
() => new SlidingWindowRateLimiter(new SlidingWindowRateLimiterOptions
{
PermitLimit = 1,
@@ -57,7 +57,7 @@ public override void InvalidOptionsThrows()
SegmentsPerWindow = 1,
AutoReplenishment = false
}));
- Assert.Throws(
+ AssertExtensions.Throws("options",
() => new SlidingWindowRateLimiter(new SlidingWindowRateLimiterOptions
{
PermitLimit = 1,
@@ -67,7 +67,7 @@ public override void InvalidOptionsThrows()
SegmentsPerWindow = -1,
AutoReplenishment = false
}));
- Assert.Throws(
+ AssertExtensions.Throws("options",
() => new SlidingWindowRateLimiter(new SlidingWindowRateLimiterOptions
{
PermitLimit = 1,
@@ -77,7 +77,7 @@ public override void InvalidOptionsThrows()
SegmentsPerWindow = 1,
AutoReplenishment = false
}));
- Assert.Throws(
+ AssertExtensions.Throws("options",
() => new SlidingWindowRateLimiter(new SlidingWindowRateLimiterOptions
{
PermitLimit = 1,
@@ -87,6 +87,16 @@ public override void InvalidOptionsThrows()
SegmentsPerWindow = 1,
AutoReplenishment = false
}));
+ AssertExtensions.Throws("options",
+ () => new SlidingWindowRateLimiter(new SlidingWindowRateLimiterOptions
+ {
+ PermitLimit = 1,
+ QueueProcessingOrder = QueueProcessingOrder.NewestFirst,
+ QueueLimit = 1,
+ Window = TimeSpan.Zero,
+ SegmentsPerWindow = 1,
+ AutoReplenishment = false
+ }));
}
[Fact]
diff --git a/src/libraries/System.Threading.RateLimiting/tests/TokenBucketRateLimiterTests.cs b/src/libraries/System.Threading.RateLimiting/tests/TokenBucketRateLimiterTests.cs
index 69876938fdfba7..e7fefcbf7a025a 100644
--- a/src/libraries/System.Threading.RateLimiting/tests/TokenBucketRateLimiterTests.cs
+++ b/src/libraries/System.Threading.RateLimiting/tests/TokenBucketRateLimiterTests.cs
@@ -37,7 +37,7 @@ public override void CanAcquireResource()
[Fact]
public override void InvalidOptionsThrows()
{
- Assert.Throws(
+ AssertExtensions.Throws("options",
() => new TokenBucketRateLimiter(new TokenBucketRateLimiterOptions
{
TokenLimit = -1,
@@ -47,7 +47,7 @@ public override void InvalidOptionsThrows()
TokensPerPeriod = 1,
AutoReplenishment = false
}));
- Assert.Throws(
+ AssertExtensions.Throws("options",
() => new TokenBucketRateLimiter(new TokenBucketRateLimiterOptions
{
TokenLimit = 1,
@@ -57,7 +57,7 @@ public override void InvalidOptionsThrows()
TokensPerPeriod = 1,
AutoReplenishment = false
}));
- Assert.Throws(
+ AssertExtensions.Throws("options",
() => new TokenBucketRateLimiter(new TokenBucketRateLimiterOptions
{
TokenLimit = 1,
@@ -67,7 +67,7 @@ public override void InvalidOptionsThrows()
TokensPerPeriod = -1,
AutoReplenishment = false
}));
- Assert.Throws(
+ AssertExtensions.Throws("options",
() => new TokenBucketRateLimiter(new TokenBucketRateLimiterOptions
{
TokenLimit = 1,
@@ -77,7 +77,7 @@ public override void InvalidOptionsThrows()
TokensPerPeriod = 1,
AutoReplenishment = false
}));
- Assert.Throws(
+ AssertExtensions.Throws("options",
() => new TokenBucketRateLimiter(new TokenBucketRateLimiterOptions
{
TokenLimit = 1,
@@ -87,6 +87,16 @@ public override void InvalidOptionsThrows()
TokensPerPeriod = 1,
AutoReplenishment = false
}));
+ AssertExtensions.Throws("options",
+ () => new TokenBucketRateLimiter(new TokenBucketRateLimiterOptions
+ {
+ TokenLimit = 1,
+ QueueProcessingOrder = QueueProcessingOrder.NewestFirst,
+ QueueLimit = 1,
+ ReplenishmentPeriod = TimeSpan.Zero,
+ TokensPerPeriod = 1,
+ AutoReplenishment = false
+ }));
}
[Fact]