diff --git a/bench/Polly.Core.Benchmarks/MultipleStrategiesBenchmark.cs b/bench/Polly.Core.Benchmarks/MultipleStrategiesBenchmark.cs index 94c17b2ee4..71f33aa79e 100644 --- a/bench/Polly.Core.Benchmarks/MultipleStrategiesBenchmark.cs +++ b/bench/Polly.Core.Benchmarks/MultipleStrategiesBenchmark.cs @@ -35,13 +35,13 @@ public void Setup() [Benchmark] public async ValueTask ExecuteStrategyPipeline_NonGeneric_V8() { - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); await _nonGeneric!.ExecuteOutcomeAsync( static (_, _) => new ValueTask>(Outcome.FromResult("dummy")), context, string.Empty).ConfigureAwait(false); - ResilienceContext.Return(context); + ResilienceContextPool.Shared.Return(context); } } diff --git a/bench/Polly.Core.Benchmarks/PredicateBenchmark.cs b/bench/Polly.Core.Benchmarks/PredicateBenchmark.cs index 8d98c7e3fd..44ccefd244 100644 --- a/bench/Polly.Core.Benchmarks/PredicateBenchmark.cs +++ b/bench/Polly.Core.Benchmarks/PredicateBenchmark.cs @@ -6,7 +6,7 @@ namespace Polly.Core.Benchmarks; public class PredicateBenchmark { private readonly OutcomeArguments _args = new( - ResilienceContext.Get(), + ResilienceContextPool.Shared.Get(), Outcome.FromResult(new HttpResponseMessage(HttpStatusCode.OK)), new RetryPredicateArguments(0)); diff --git a/bench/Polly.Core.Benchmarks/ResilienceStrategyBenchmark.cs b/bench/Polly.Core.Benchmarks/ResilienceStrategyBenchmark.cs index c5656c4a36..7e01b8899a 100644 --- a/bench/Polly.Core.Benchmarks/ResilienceStrategyBenchmark.cs +++ b/bench/Polly.Core.Benchmarks/ResilienceStrategyBenchmark.cs @@ -9,17 +9,17 @@ public class ResilienceStrategyBenchmark [Benchmark(Baseline = true)] public async ValueTask ExecuteOutcomeAsync() { - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); await NullResilienceStrategy.Instance.ExecuteOutcomeAsync((_, _) => Outcome.FromResultAsTask("dummy"), context, "state").ConfigureAwait(false); - ResilienceContext.Return(context); + ResilienceContextPool.Shared.Return(context); } [Benchmark] public async ValueTask ExecuteAsync_ResilienceContextAndState() { - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); await NullResilienceStrategy.Instance.ExecuteAsync((_, _) => new ValueTask("dummy"), context, "state").ConfigureAwait(false); - ResilienceContext.Return(context); + ResilienceContextPool.Shared.Return(context); } [Benchmark] @@ -37,9 +37,9 @@ public async ValueTask ExecuteAsync_GenericStrategy_CancellationToken() [Benchmark] public void Execute_ResilienceContextAndState() { - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); NullResilienceStrategy.Instance.Execute((_, _) => "dummy", context, "state"); - ResilienceContext.Return(context); + ResilienceContextPool.Shared.Return(context); } [Benchmark] diff --git a/bench/Polly.Core.Benchmarks/TelemetryBenchmark.cs b/bench/Polly.Core.Benchmarks/TelemetryBenchmark.cs index fcd217b220..244886c2e2 100644 --- a/bench/Polly.Core.Benchmarks/TelemetryBenchmark.cs +++ b/bench/Polly.Core.Benchmarks/TelemetryBenchmark.cs @@ -33,9 +33,9 @@ public void Prepare() [Benchmark] public async ValueTask Execute() { - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); await _strategy!.ExecuteOutcomeAsync((_, _) => Outcome.FromResultAsTask("dummy"), context, "state").ConfigureAwait(false); - ResilienceContext.Return(context); + ResilienceContextPool.Shared.Return(context); } private ResilienceStrategy Build(ResilienceStrategyBuilder builder) diff --git a/bench/Polly.Core.Benchmarks/Utils/Helper.cs b/bench/Polly.Core.Benchmarks/Utils/Helper.cs index d6f7177d1e..e1876c4b44 100644 --- a/bench/Polly.Core.Benchmarks/Utils/Helper.cs +++ b/bench/Polly.Core.Benchmarks/Utils/Helper.cs @@ -12,14 +12,14 @@ public static async ValueTask ExecuteAsync(this object obj, PollyVersion version await ((IAsyncPolicy)obj).ExecuteAsync(static _ => Task.FromResult("dummy"), CancellationToken.None).ConfigureAwait(false); return; case PollyVersion.V8: - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); await ((ResilienceStrategy)obj).ExecuteOutcomeAsync( static (_, _) => Outcome.FromResultAsTask("dummy"), context, string.Empty).ConfigureAwait(false); - ResilienceContext.Return(context); + ResilienceContextPool.Shared.Return(context); return; } diff --git a/src/Polly.Core/CircuitBreaker/CircuitBreakerManualControl.cs b/src/Polly.Core/CircuitBreaker/CircuitBreakerManualControl.cs index 9872f400f5..8ff312d71b 100644 --- a/src/Polly.Core/CircuitBreaker/CircuitBreakerManualControl.cs +++ b/src/Polly.Core/CircuitBreaker/CircuitBreakerManualControl.cs @@ -23,7 +23,7 @@ internal void Initialize(Func onIsolate, Func(isSynchronous: true); + var context = ResilienceContextPool.Shared.Get().Initialize(isSynchronous: true); // if the control indicates that circuit breaker should be isolated, we isolate it right away IsolateAsync(context).GetAwaiter().GetResult(); @@ -57,7 +57,7 @@ internal async Task IsolateAsync(ResilienceContext context) /// Thrown when calling this method after this object is disposed. public async Task IsolateAsync(CancellationToken cancellationToken = default) { - var context = ResilienceContext.Get(cancellationToken).Initialize(isSynchronous: false); + var context = ResilienceContextPool.Shared.Get(cancellationToken).Initialize(isSynchronous: false); try { @@ -65,7 +65,7 @@ public async Task IsolateAsync(CancellationToken cancellationToken = default) } finally { - ResilienceContext.Return(context); + ResilienceContextPool.Shared.Return(context); } } @@ -98,7 +98,7 @@ internal async Task CloseAsync(ResilienceContext context) /// Thrown when calling this method after this object is disposed. public async Task CloseAsync(CancellationToken cancellationToken = default) { - var context = ResilienceContext.Get(cancellationToken); + var context = ResilienceContextPool.Shared.Get(cancellationToken); try { @@ -106,7 +106,7 @@ public async Task CloseAsync(CancellationToken cancellationToken = default) } finally { - ResilienceContext.Return(context); + ResilienceContextPool.Shared.Return(context); } } diff --git a/src/Polly.Core/Hedging/Controller/TaskExecution.cs b/src/Polly.Core/Hedging/Controller/TaskExecution.cs index f0a53a50a8..9b44e76bf5 100644 --- a/src/Polly.Core/Hedging/Controller/TaskExecution.cs +++ b/src/Polly.Core/Hedging/Controller/TaskExecution.cs @@ -20,7 +20,7 @@ namespace Polly.Hedging.Controller; /// internal sealed class TaskExecution { - private readonly ResilienceContext _cachedContext = ResilienceContext.Get(); + private readonly ResilienceContext _cachedContext = ResilienceContextPool.Shared.Get(); private readonly CancellationTokenSourcePool _cancellationTokenSourcePool; private readonly TimeProvider _timeProvider; private readonly ResilienceStrategyTelemetry _telemetry; diff --git a/src/Polly.Core/PublicAPI.Unshipped.txt b/src/Polly.Core/PublicAPI.Unshipped.txt index fae340ce5c..19dd6d0c5b 100644 --- a/src/Polly.Core/PublicAPI.Unshipped.txt +++ b/src/Polly.Core/PublicAPI.Unshipped.txt @@ -1,6 +1,8 @@ #nullable enable abstract Polly.Registry.ResilienceStrategyProvider.TryGetStrategy(TKey key, out Polly.ResilienceStrategy? strategy) -> bool abstract Polly.Registry.ResilienceStrategyProvider.TryGetStrategy(TKey key, out Polly.ResilienceStrategy? strategy) -> bool +abstract Polly.ResilienceContextPool.Get(string? operationKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> Polly.ResilienceContext! +abstract Polly.ResilienceContextPool.Return(Polly.ResilienceContext! context) -> void abstract Polly.ResilienceStrategy.ExecuteCoreAsync(System.Func>>! callback, Polly.ResilienceContext! context, TState state) -> System.Threading.Tasks.ValueTask> override Polly.Outcome.ToString() -> string! override Polly.Registry.ResilienceStrategyRegistry.TryGetStrategy(TKey key, out Polly.ResilienceStrategy? strategy) -> bool @@ -221,6 +223,9 @@ Polly.ResilienceContext.OperationKey.get -> string? Polly.ResilienceContext.Properties.get -> Polly.ResilienceProperties! Polly.ResilienceContext.ResilienceEvents.get -> System.Collections.Generic.IReadOnlyList! Polly.ResilienceContext.ResultType.get -> System.Type! +Polly.ResilienceContextPool +Polly.ResilienceContextPool.Get(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> Polly.ResilienceContext! +Polly.ResilienceContextPool.ResilienceContextPool() -> void Polly.ResilienceProperties Polly.ResilienceProperties.GetValue(Polly.ResiliencePropertyKey key, TValue defaultValue) -> TValue Polly.ResilienceProperties.ResilienceProperties() -> void @@ -428,9 +433,7 @@ static Polly.PredicateBuilder.implicit operator System.Func.implicit operator System.Func, System.Threading.Tasks.ValueTask>!(Polly.PredicateBuilder! builder) -> System.Func, System.Threading.Tasks.ValueTask>! static Polly.PredicateResult.False.get -> System.Threading.Tasks.ValueTask static Polly.PredicateResult.True.get -> System.Threading.Tasks.ValueTask -static Polly.ResilienceContext.Get(string! operationKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> Polly.ResilienceContext! -static Polly.ResilienceContext.Get(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> Polly.ResilienceContext! -static Polly.ResilienceContext.Return(Polly.ResilienceContext! context) -> void +static Polly.ResilienceContextPool.Shared.get -> Polly.ResilienceContextPool! static Polly.ResiliencePropertyKey.operator !=(Polly.ResiliencePropertyKey left, Polly.ResiliencePropertyKey right) -> bool static Polly.ResiliencePropertyKey.operator ==(Polly.ResiliencePropertyKey left, Polly.ResiliencePropertyKey right) -> bool static Polly.ResilienceStrategyBuilderExtensions.AddStrategy(this TBuilder! builder, Polly.ResilienceStrategy! strategy) -> TBuilder! diff --git a/src/Polly.Core/README.md b/src/Polly.Core/README.md index 97980f62d4..7aef68f3a3 100644 --- a/src/Polly.Core/README.md +++ b/src/Polly.Core/README.md @@ -66,7 +66,7 @@ For example, the synchronous `Execute` method is implemented as: ``` csharp public void Execute(Action execute) { - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); context.IsSynchronous = true; context.ResultType = typeof(VoidResult); @@ -83,7 +83,7 @@ public void Execute(Action execute) } finally { - ResilienceContext.Return(context); + ResilienceContextPool.Shared.Return(context); } } ``` diff --git a/src/Polly.Core/ResilienceContext.cs b/src/Polly.Core/ResilienceContext.cs index 78f7d044ac..59e41a6503 100644 --- a/src/Polly.Core/ResilienceContext.cs +++ b/src/Polly.Core/ResilienceContext.cs @@ -3,25 +3,22 @@ namespace Polly; -#pragma warning disable RS0026 // Do not add multiple public overloads with optional parameters - /// /// A context assigned to a single execution of . It is created manually or automatically /// when the user calls the various extensions on top of . After every execution the context should be discarded and returned to the pool. /// /// /// Do not re-use an instance of across more than one execution. The is retrieved from the pool -/// by calling the method. After you are done with it you should return it to the pool by calling the method. +/// by calling the method. After you are done with it you should return it to the pool +/// by calling the method. /// public sealed class ResilienceContext { private const bool ContinueOnCapturedContextDefault = false; - private static readonly ObjectPool Pool = new(static () => new ResilienceContext(), static c => c.Reset()); - private readonly List _resilienceEvents = new(); - private ResilienceContext() + internal ResilienceContext() { } @@ -34,7 +31,7 @@ private ResilienceContext() /// The operation key value should have a low cardinality (i.e. do not assign values such as to this property). /// /// The default value is . - public string? OperationKey { get; private set; } + public string? OperationKey { get; internal set; } /// /// Gets the associated with the execution. @@ -79,40 +76,6 @@ private ResilienceContext() /// public IReadOnlyList ResilienceEvents => _resilienceEvents; - /// - /// Gets a instance from the pool. - /// - /// The cancellation token. - /// An instance of . - /// - /// After the execution is finished you should return the back to the pool - /// by calling method. - /// - public static ResilienceContext Get(CancellationToken cancellationToken = default) - { - var context = Pool.Get(); - context.CancellationToken = cancellationToken; - return context; - } - - /// - /// Gets a instance from the pool. - /// - /// An operation key associated with the context. - /// The cancellation token. - /// An instance of . - /// - /// After the execution is finished you should return the back to the pool - /// by calling method. - /// - public static ResilienceContext Get(string operationKey, CancellationToken cancellationToken = default) - { - var context = Pool.Get(); - context.OperationKey = operationKey; - context.CancellationToken = cancellationToken; - return context; - } - internal void InitializeFrom(ResilienceContext context) { OperationKey = context.OperationKey; @@ -124,18 +87,6 @@ internal void InitializeFrom(ResilienceContext context) _resilienceEvents.AddRange(context.ResilienceEvents); } - /// - /// Returns a back to the pool. - /// - /// The context instance. - /// Thrown when is . - public static void Return(ResilienceContext context) - { - Guard.NotNull(context); - - Pool.Return(context); - } - [ExcludeFromCodeCoverage] [Conditional("DEBUG")] internal void AssertInitialized() diff --git a/src/Polly.Core/ResilienceContextPool.Shared.cs b/src/Polly.Core/ResilienceContextPool.Shared.cs new file mode 100644 index 0000000000..ca3ef4590e --- /dev/null +++ b/src/Polly.Core/ResilienceContextPool.Shared.cs @@ -0,0 +1,21 @@ +namespace Polly; + +public abstract partial class ResilienceContextPool +{ + private sealed class SharedPool : ResilienceContextPool + { + private readonly ObjectPool _pool = new(static () => new ResilienceContext(), static c => c.Reset()); + + public override ResilienceContext Get(string? operationKey, CancellationToken cancellationToken = default) + { + var context = _pool.Get(); + + context.OperationKey = operationKey; + context.CancellationToken = cancellationToken; + + return context; + } + + public override void Return(ResilienceContext context) => _pool.Return(Guard.NotNull(context)); + } +} diff --git a/src/Polly.Core/ResilienceContextPool.cs b/src/Polly.Core/ResilienceContextPool.cs new file mode 100644 index 0000000000..d0eb38efd7 --- /dev/null +++ b/src/Polly.Core/ResilienceContextPool.cs @@ -0,0 +1,45 @@ +namespace Polly; + +#pragma warning disable CA1716 // Identifiers should not match keywords +#pragma warning disable RS0026 // Do not add multiple public overloads with optional parameters + +/// +/// The pool of instances. +/// +public abstract partial class ResilienceContextPool +{ + /// + /// Gets the shared pool instance. + /// + public static ResilienceContextPool Shared { get; } = new SharedPool(); + + /// + /// Gets a instance from the pool. + /// + /// The cancellation token. + /// An instance of . + /// + /// After the execution is finished you should return the back to the pool + /// by calling method. + /// + public ResilienceContext Get(CancellationToken cancellationToken = default) => Get(null, cancellationToken); + + /// + /// Gets a instance from the pool. + /// + /// An operation key associated with the context. + /// The cancellation token. + /// An instance of . + /// + /// After the execution is finished you should return the back to the pool + /// by calling method. + /// + public abstract ResilienceContext Get(string? operationKey, CancellationToken cancellationToken = default); + + /// + /// Returns a back to the pool. + /// + /// The context instance. + /// Thrown when is . + public abstract void Return(ResilienceContext context); +} diff --git a/src/Polly.Core/ResilienceStrategy.Async.ValueTask.cs b/src/Polly.Core/ResilienceStrategy.Async.ValueTask.cs index b660749800..d09f731de0 100644 --- a/src/Polly.Core/ResilienceStrategy.Async.ValueTask.cs +++ b/src/Polly.Core/ResilienceStrategy.Async.ValueTask.cs @@ -118,7 +118,7 @@ static async (context, state) => } finally { - ResilienceContext.Return(context); + Pool.Return(context); } } @@ -160,7 +160,7 @@ static async (context, state) => } finally { - ResilienceContext.Return(context); + Pool.Return(context); } } diff --git a/src/Polly.Core/ResilienceStrategy.Async.ValueTaskT.cs b/src/Polly.Core/ResilienceStrategy.Async.ValueTaskT.cs index 1dd9e250ac..cc07f7392a 100644 --- a/src/Polly.Core/ResilienceStrategy.Async.ValueTaskT.cs +++ b/src/Polly.Core/ResilienceStrategy.Async.ValueTaskT.cs @@ -145,7 +145,7 @@ static async (context, state) => } finally { - ResilienceContext.Return(context); + Pool.Return(context); } } @@ -186,13 +186,13 @@ static async (context, state) => } finally { - ResilienceContext.Return(context); + Pool.Return(context); } } private static ResilienceContext GetAsyncContext(CancellationToken cancellationToken) { - var context = ResilienceContext.Get(cancellationToken); + var context = Pool.Get(cancellationToken); InitializeAsyncContext(context); diff --git a/src/Polly.Core/ResilienceStrategy.Sync.cs b/src/Polly.Core/ResilienceStrategy.Sync.cs index 09d97eba56..c1aee0b536 100644 --- a/src/Polly.Core/ResilienceStrategy.Sync.cs +++ b/src/Polly.Core/ResilienceStrategy.Sync.cs @@ -109,7 +109,7 @@ public void Execute( } finally { - ResilienceContext.Return(context); + Pool.Return(context); } } @@ -147,7 +147,7 @@ public void Execute( } finally { - ResilienceContext.Return(context); + Pool.Return(context); } } @@ -186,7 +186,7 @@ public void Execute( } finally { - ResilienceContext.Return(context); + Pool.Return(context); } } @@ -221,7 +221,7 @@ public void Execute(Action callback) } finally { - ResilienceContext.Return(context); + Pool.Return(context); } } diff --git a/src/Polly.Core/ResilienceStrategy.SyncT.cs b/src/Polly.Core/ResilienceStrategy.SyncT.cs index ac4a45c583..7deff6b9eb 100644 --- a/src/Polly.Core/ResilienceStrategy.SyncT.cs +++ b/src/Polly.Core/ResilienceStrategy.SyncT.cs @@ -111,7 +111,7 @@ public TResult Execute( } finally { - ResilienceContext.Return(context); + Pool.Return(context); } } @@ -147,7 +147,7 @@ public TResult Execute(Func callback) } finally { - ResilienceContext.Return(context); + Pool.Return(context); } } @@ -185,7 +185,7 @@ public TResult Execute(Func callback, TState s } finally { - ResilienceContext.Return(context); + Pool.Return(context); } } @@ -227,13 +227,13 @@ public TResult Execute( } finally { - ResilienceContext.Return(context); + Pool.Return(context); } } private static ResilienceContext GetSyncContext(CancellationToken cancellationToken) { - var context = ResilienceContext.Get(cancellationToken); + var context = Pool.Get(cancellationToken); InitializeSyncContext(context); diff --git a/src/Polly.Core/ResilienceStrategy.cs b/src/Polly.Core/ResilienceStrategy.cs index 717269aaa1..dda9e1fe01 100644 --- a/src/Polly.Core/ResilienceStrategy.cs +++ b/src/Polly.Core/ResilienceStrategy.cs @@ -11,6 +11,8 @@ namespace Polly; /// public abstract partial class ResilienceStrategy { + internal static ResilienceContextPool Pool => ResilienceContextPool.Shared; + internal ResilienceStrategyOptions? Options { get; set; } /// diff --git a/src/Polly.Core/Utils/ReloadableResilienceStrategy.cs b/src/Polly.Core/Utils/ReloadableResilienceStrategy.cs index 674ef935d6..db277fd523 100644 --- a/src/Polly.Core/Utils/ReloadableResilienceStrategy.cs +++ b/src/Polly.Core/Utils/ReloadableResilienceStrategy.cs @@ -48,7 +48,7 @@ private void RegisterOnReload(CancellationToken previousToken) _registration = token.Register(() => { - var context = ResilienceContext.Get().Initialize(isSynchronous: true); + var context = ResilienceContextPool.Shared.Get().Initialize(isSynchronous: true); #pragma warning disable CA1031 // Do not catch general exception types try @@ -60,7 +60,7 @@ private void RegisterOnReload(CancellationToken previousToken) { var args = new OutcomeArguments(context, Outcome.FromException(e), new ReloadFailedArguments(e)); _telemetry.Report(new(ResilienceEventSeverity.Error, ReloadFailedEvent), args); - ResilienceContext.Return(context); + ResilienceContextPool.Shared.Return(context); } #pragma warning restore CA1031 // Do not catch general exception types diff --git a/src/Polly/Utilities/Wrappers/ResilienceContextFactory.cs b/src/Polly/Utilities/Wrappers/ResilienceContextFactory.cs index 1ff3408571..9b6bf5854c 100644 --- a/src/Polly/Utilities/Wrappers/ResilienceContextFactory.cs +++ b/src/Polly/Utilities/Wrappers/ResilienceContextFactory.cs @@ -10,7 +10,7 @@ public static ResilienceContext Create( bool continueOnCapturedContext, out IDictionary oldProperties) { - var resilienceContext = ResilienceContext.Get(context.OperationKey, cancellationToken); + var resilienceContext = ResilienceContextPool.Shared.Get(context.OperationKey, cancellationToken); resilienceContext.ContinueOnCapturedContext = continueOnCapturedContext; resilienceContext.Properties.SetProperties(context, out oldProperties); @@ -20,6 +20,6 @@ public static ResilienceContext Create( public static void Cleanup(ResilienceContext resilienceContext, IDictionary oldProperties) { resilienceContext.Properties.SetProperties(oldProperties, out _); - ResilienceContext.Return(resilienceContext); + ResilienceContextPool.Shared.Return(resilienceContext); } } diff --git a/test/Polly.Core.Tests/CircuitBreaker/AdvancedCircuitBreakerOptionsTests.cs b/test/Polly.Core.Tests/CircuitBreaker/AdvancedCircuitBreakerOptionsTests.cs index cdd8f7233a..f0c9e6ba05 100644 --- a/test/Polly.Core.Tests/CircuitBreaker/AdvancedCircuitBreakerOptionsTests.cs +++ b/test/Polly.Core.Tests/CircuitBreaker/AdvancedCircuitBreakerOptionsTests.cs @@ -34,7 +34,7 @@ public async Task ShouldHandle_EnsureDefaults() { var options = new AdvancedCircuitBreakerStrategyOptions(); var args = new CircuitBreakerPredicateArguments(); - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); (await options.ShouldHandle(new(context, Outcome.FromResult("dummy"), args))).Should().Be(false); (await options.ShouldHandle(new(context, Outcome.FromException(new OperationCanceledException()), args))).Should().Be(false); diff --git a/test/Polly.Core.Tests/CircuitBreaker/Controller/CircuitStateControllerTests.cs b/test/Polly.Core.Tests/CircuitBreaker/Controller/CircuitStateControllerTests.cs index d8090fcb57..d937b33ac7 100644 --- a/test/Polly.Core.Tests/CircuitBreaker/Controller/CircuitStateControllerTests.cs +++ b/test/Polly.Core.Tests/CircuitBreaker/Controller/CircuitStateControllerTests.cs @@ -43,7 +43,7 @@ public async Task IsolateAsync_Ok() _timeProvider.Advance(TimeSpan.FromSeconds(1)); using var controller = CreateController(); - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); // act await controller.IsolateCircuitAsync(context); @@ -52,13 +52,13 @@ public async Task IsolateAsync_Ok() controller.CircuitState.Should().Be(CircuitState.Isolated); called.Should().BeTrue(); - var outcome = await controller.OnActionPreExecuteAsync(ResilienceContext.Get()); + var outcome = await controller.OnActionPreExecuteAsync(ResilienceContextPool.Shared.Get()); outcome.Value.Exception.Should().BeOfType(); // now close it _circuitBehavior.Setup(v => v.OnCircuitClosed()); - await controller.CloseCircuitAsync(ResilienceContext.Get()); - await controller.OnActionPreExecuteAsync(ResilienceContext.Get()); + await controller.CloseCircuitAsync(ResilienceContextPool.Shared.Get()); + await controller.OnActionPreExecuteAsync(ResilienceContextPool.Shared.Get()); context.ResilienceEvents.Should().Contain(new ResilienceEvent(ResilienceEventSeverity.Error, "OnCircuitOpened")); } @@ -81,9 +81,9 @@ public async Task BreakAsync_Ok() _timeProvider.Advance(TimeSpan.FromSeconds(1)); using var controller = CreateController(); - await controller.IsolateCircuitAsync(ResilienceContext.Get()); + await controller.IsolateCircuitAsync(ResilienceContextPool.Shared.Get()); _circuitBehavior.Setup(v => v.OnCircuitClosed()); - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); // act await controller.CloseCircuitAsync(context); @@ -91,7 +91,7 @@ public async Task BreakAsync_Ok() // assert called.Should().BeTrue(); - await controller.OnActionPreExecuteAsync(ResilienceContext.Get()); + await controller.OnActionPreExecuteAsync(ResilienceContextPool.Shared.Get()); _circuitBehavior.VerifyAll(); context.ResilienceEvents.Should().Contain(new ResilienceEvent(ResilienceEventSeverity.Information, "OnCircuitClosed")); } @@ -106,11 +106,11 @@ public async Task Disposed_EnsureThrows() Assert.Throws(() => controller.LastException); Assert.Throws(() => controller.LastHandledOutcome); - await Assert.ThrowsAsync(async () => await controller.CloseCircuitAsync(ResilienceContext.Get())); - await Assert.ThrowsAsync(async () => await controller.IsolateCircuitAsync(ResilienceContext.Get())); - await Assert.ThrowsAsync(async () => await controller.OnActionPreExecuteAsync(ResilienceContext.Get())); - await Assert.ThrowsAsync(async () => await controller.OnActionSuccessAsync(Outcome.FromResult(10), ResilienceContext.Get())); - await Assert.ThrowsAsync(async () => await controller.OnActionFailureAsync(Outcome.FromResult(10), ResilienceContext.Get())); + await Assert.ThrowsAsync(async () => await controller.CloseCircuitAsync(ResilienceContextPool.Shared.Get())); + await Assert.ThrowsAsync(async () => await controller.IsolateCircuitAsync(ResilienceContextPool.Shared.Get())); + await Assert.ThrowsAsync(async () => await controller.OnActionPreExecuteAsync(ResilienceContextPool.Shared.Get())); + await Assert.ThrowsAsync(async () => await controller.OnActionSuccessAsync(Outcome.FromResult(10), ResilienceContextPool.Shared.Get())); + await Assert.ThrowsAsync(async () => await controller.OnActionFailureAsync(Outcome.FromResult(10), ResilienceContextPool.Shared.Get())); } [Fact] @@ -119,7 +119,7 @@ public async Task OnActionPreExecute_CircuitOpenedByValue() using var controller = CreateController(); await OpenCircuit(controller, Outcome.FromResult(99)); - var error = (BrokenCircuitException)(await controller.OnActionPreExecuteAsync(ResilienceContext.Get())).Value.Exception!; + var error = (BrokenCircuitException)(await controller.OnActionPreExecuteAsync(ResilienceContextPool.Shared.Get())).Value.Exception!; error.Should().BeOfType>(); error.Result.Should().Be(99); @@ -149,14 +149,14 @@ public async Task HalfOpen_EnsureCorrectStateTransitionAfterExecution(bool succe _circuitBehavior.Setup(v => v.OnActionSuccess(CircuitState.HalfOpen)); _circuitBehavior.Setup(v => v.OnCircuitClosed()); - await controller.OnActionSuccessAsync(Outcome.FromResult(0), ResilienceContext.Get()); + await controller.OnActionSuccessAsync(Outcome.FromResult(0), ResilienceContextPool.Shared.Get()); controller.CircuitState.Should().Be(CircuitState.Closed); } else { var shouldBreak = true; _circuitBehavior.Setup(v => v.OnActionFailure(CircuitState.HalfOpen, out shouldBreak)); - await controller.OnActionFailureAsync(Outcome.FromResult(0), ResilienceContext.Get()); + await controller.OnActionFailureAsync(Outcome.FromResult(0), ResilienceContextPool.Shared.Get()); controller.CircuitState.Should().Be(CircuitState.Open); } } @@ -167,7 +167,7 @@ public async Task OnActionPreExecute_CircuitOpenedByException() using var controller = CreateController(); await OpenCircuit(controller, Outcome.FromException(new InvalidOperationException())); - var error = (BrokenCircuitException)(await controller.OnActionPreExecuteAsync(ResilienceContext.Get())).Value.Exception!; + var error = (BrokenCircuitException)(await controller.OnActionPreExecuteAsync(ResilienceContextPool.Shared.Get())).Value.Exception!; error.InnerException.Should().BeOfType(); } @@ -189,9 +189,9 @@ public async Task OnActionFailure_EnsureLock() using var controller = CreateController(); // act - var executeAction = Task.Run(() => controller.OnActionFailureAsync(Outcome.FromResult(0), ResilienceContext.Get())); + var executeAction = Task.Run(() => controller.OnActionFailureAsync(Outcome.FromResult(0), ResilienceContextPool.Shared.Get())); executing.WaitOne(); - var executeAction2 = Task.Run(() => controller.OnActionFailureAsync(Outcome.FromResult(0), ResilienceContext.Get())); + var executeAction2 = Task.Run(() => controller.OnActionFailureAsync(Outcome.FromResult(0), ResilienceContextPool.Shared.Get())); // assert executeAction.Wait(50).Should().BeFalse(); @@ -217,8 +217,8 @@ public async Task OnActionPreExecute_HalfOpen() AdvanceTime(_options.BreakDuration); // act - await controller.OnActionPreExecuteAsync(ResilienceContext.Get()); - var error = (await controller.OnActionPreExecuteAsync(ResilienceContext.Get())).Value.Exception; + await controller.OnActionPreExecuteAsync(ResilienceContextPool.Shared.Get()); + var error = (await controller.OnActionPreExecuteAsync(ResilienceContextPool.Shared.Get())).Value.Exception; error.Should().BeOfType>(); // assert @@ -252,7 +252,7 @@ public async Task OnActionSuccess_EnsureCorrectBehavior(CircuitState state, Circ } // act - await controller.OnActionSuccessAsync(Outcome.FromResult(10), ResilienceContext.Get()); + await controller.OnActionSuccessAsync(Outcome.FromResult(10), ResilienceContextPool.Shared.Get()); // assert controller.CircuitState.Should().Be(expectedState); @@ -294,7 +294,7 @@ public async Task OnActionFailureAsync_EnsureCorrectBehavior(CircuitState state, _circuitBehavior.Setup(v => v.OnActionFailure(state, out shouldBreak)); // act - await controller.OnActionFailureAsync(Outcome.FromResult(99), ResilienceContext.Get()); + await controller.OnActionFailureAsync(Outcome.FromResult(99), ResilienceContextPool.Shared.Get()); // assert controller.LastHandledOutcome!.Value.Result.Should().Be(99); @@ -327,7 +327,7 @@ public async Task OnActionFailureAsync_EnsureBreakDurationNotOverflow(bool overf _circuitBehavior.Setup(v => v.OnActionFailure(CircuitState.HalfOpen, out shouldBreak)); // act - await controller.OnActionFailureAsync(Outcome.FromResult(99), ResilienceContext.Get()); + await controller.OnActionFailureAsync(Outcome.FromResult(99), ResilienceContextPool.Shared.Get()); // assert var blockedTill = GetBlockedTill(controller); @@ -352,11 +352,11 @@ public async Task OnActionFailureAsync_VoidResult_EnsureBreakingExceptionNotSet( _circuitBehavior.Setup(v => v.OnActionFailure(CircuitState.Open, out shouldBreak)); // act - await controller.OnActionFailureAsync(Outcome.FromResult(99), ResilienceContext.Get()); + await controller.OnActionFailureAsync(Outcome.FromResult(99), ResilienceContextPool.Shared.Get()); // assert controller.LastException.Should().BeNull(); - var outcome = await controller.OnActionPreExecuteAsync(ResilienceContext.Get()); + var outcome = await controller.OnActionPreExecuteAsync(ResilienceContextPool.Shared.Get()); outcome.Value.Exception.Should().BeOfType>(); } @@ -369,14 +369,14 @@ public async Task Flow_Closed_HalfOpen_Closed() _circuitBehavior.Setup(v => v.OnActionSuccess(CircuitState.HalfOpen)); _circuitBehavior.Setup(v => v.OnCircuitClosed()); - await controller.OnActionSuccessAsync(Outcome.FromResult(0), ResilienceContext.Get()); + await controller.OnActionSuccessAsync(Outcome.FromResult(0), ResilienceContextPool.Shared.Get()); controller.CircuitState.Should().Be(CircuitState.Closed); } [Fact] public async Task Flow_Closed_HalfOpen_Open_HalfOpen_Closed() { - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); using var controller = CreateController(); bool shouldBreak = true; @@ -388,7 +388,7 @@ public async Task Flow_Closed_HalfOpen_Open_HalfOpen_Closed() // execution rejected AdvanceTime(TimeSpan.FromMilliseconds(1)); - var outcome = await controller.OnActionPreExecuteAsync(ResilienceContext.Get()); + var outcome = await controller.OnActionPreExecuteAsync(ResilienceContextPool.Shared.Get()); outcome.Value.Exception.Should().BeOfType>(); // wait and try, transition to half open @@ -399,7 +399,7 @@ public async Task Flow_Closed_HalfOpen_Open_HalfOpen_Closed() // close circuit _circuitBehavior.Setup(v => v.OnActionSuccess(CircuitState.HalfOpen)); _circuitBehavior.Setup(v => v.OnCircuitClosed()); - await controller.OnActionSuccessAsync(Outcome.FromResult(0), ResilienceContext.Get()); + await controller.OnActionSuccessAsync(Outcome.FromResult(0), ResilienceContextPool.Shared.Get()); controller.CircuitState.Should().Be(CircuitState.Closed); } @@ -407,7 +407,7 @@ public async Task Flow_Closed_HalfOpen_Open_HalfOpen_Closed() public async Task ExecuteScheduledTask_Async_Ok() { var source = new TaskCompletionSource(); - var task = CircuitStateController.ExecuteScheduledTaskAsync(source.Task, ResilienceContext.Get().Initialize(isSynchronous: false)).AsTask(); + var task = CircuitStateController.ExecuteScheduledTaskAsync(source.Task, ResilienceContextPool.Shared.Get().Initialize(isSynchronous: false)).AsTask(); task.Wait(3).Should().BeFalse(); task.IsCompleted.Should().BeFalse(); @@ -433,10 +433,10 @@ private async Task TransitionToState(CircuitStateController controller, Cir case CircuitState.HalfOpen: await OpenCircuit(controller); AdvanceTime(_options.BreakDuration); - await controller.OnActionPreExecuteAsync(ResilienceContext.Get()); + await controller.OnActionPreExecuteAsync(ResilienceContextPool.Shared.Get()); break; case CircuitState.Isolated: - await controller.IsolateCircuitAsync(ResilienceContext.Get()); + await controller.IsolateCircuitAsync(ResilienceContextPool.Shared.Get()); break; } @@ -447,7 +447,7 @@ private async Task OpenCircuit(CircuitStateController controller, Outcome v.OnActionFailure(CircuitState.Closed, out breakCircuit)); - await controller.OnActionFailureAsync(outcome ?? Outcome.FromResult(10), ResilienceContext.Get().Initialize(true)); + await controller.OnActionFailureAsync(outcome ?? Outcome.FromResult(10), ResilienceContextPool.Shared.Get().Initialize(true)); } private void AdvanceTime(TimeSpan timespan) => _timeProvider.Advance(timespan); diff --git a/test/Polly.Core.Tests/CircuitBreaker/Controller/ScheduledTaskExecutorTests.cs b/test/Polly.Core.Tests/CircuitBreaker/Controller/ScheduledTaskExecutorTests.cs index f4fba41860..9dc91d9b94 100644 --- a/test/Polly.Core.Tests/CircuitBreaker/Controller/ScheduledTaskExecutorTests.cs +++ b/test/Polly.Core.Tests/CircuitBreaker/Controller/ScheduledTaskExecutorTests.cs @@ -15,7 +15,7 @@ public async Task ScheduleTask_Success_EnsureExecuted() executed = true; return Task.CompletedTask; }, - ResilienceContext.Get(), + ResilienceContextPool.Shared.Get(), out var task); await task; @@ -29,7 +29,7 @@ public async Task ScheduleTask_OperationCancelledException_EnsureExecuted() using var scheduler = new ScheduledTaskExecutor(); scheduler.ScheduleTask( () => throw new OperationCanceledException(), - ResilienceContext.Get(), + ResilienceContextPool.Shared.Get(), out var task); await task.Invoking(async t => await task).Should().ThrowAsync(); @@ -41,7 +41,7 @@ public async Task ScheduleTask_Exception_EnsureExecuted() using var scheduler = new ScheduledTaskExecutor(); scheduler.ScheduleTask( () => throw new InvalidOperationException(), - ResilienceContext.Get(), + ResilienceContextPool.Shared.Get(), out var task); await task.Invoking(async t => await task).Should().ThrowAsync(); @@ -61,12 +61,12 @@ public async Task ScheduleTask_Multiple_EnsureExecutionSerialized() verified.WaitOne(); return Task.CompletedTask; }, - ResilienceContext.Get(), + ResilienceContextPool.Shared.Get(), out var task); executing.WaitOne(); - scheduler.ScheduleTask(() => Task.CompletedTask, ResilienceContext.Get(), out var otherTask); + scheduler.ScheduleTask(() => Task.CompletedTask, ResilienceContextPool.Shared.Get(), out var otherTask); otherTask.Wait(50).Should().BeFalse(); verified.Set(); @@ -89,11 +89,11 @@ public async Task Dispose_ScheduledTaskCancelled() verified.WaitOne(); return Task.CompletedTask; }, - ResilienceContext.Get(), + ResilienceContextPool.Shared.Get(), out var task); executing.WaitOne(); - scheduler.ScheduleTask(() => Task.CompletedTask, ResilienceContext.Get(), out var otherTask); + scheduler.ScheduleTask(() => Task.CompletedTask, ResilienceContextPool.Shared.Get(), out var otherTask); scheduler.Dispose(); verified.Set(); await task; @@ -101,7 +101,7 @@ public async Task Dispose_ScheduledTaskCancelled() await otherTask.Invoking(t => otherTask).Should().ThrowAsync(); scheduler - .Invoking(s => s.ScheduleTask(() => Task.CompletedTask, ResilienceContext.Get(), out _)) + .Invoking(s => s.ScheduleTask(() => Task.CompletedTask, ResilienceContextPool.Shared.Get(), out _)) .Should() .Throw(); } @@ -120,7 +120,7 @@ public void Dispose_WhenScheduledTaskExecuting() disposed.WaitOne(); return Task.CompletedTask; }, - ResilienceContext.Get(), + ResilienceContextPool.Shared.Get(), out var task); ready.WaitOne(TimeSpan.FromSeconds(2)).Should().BeTrue(); @@ -134,7 +134,7 @@ public void Dispose_WhenScheduledTaskExecuting() public async Task Dispose_EnsureNoBackgroundProcessing() { var scheduler = new ScheduledTaskExecutor(); - scheduler.ScheduleTask(() => Task.CompletedTask, ResilienceContext.Get(), out var otherTask); + scheduler.ScheduleTask(() => Task.CompletedTask, ResilienceContextPool.Shared.Get(), out var otherTask); await otherTask; scheduler.Dispose(); #pragma warning disable S3966 // Objects should not be disposed more than once diff --git a/test/Polly.Core.Tests/CircuitBreaker/SimpleCircuitBreakerOptionsTests.cs b/test/Polly.Core.Tests/CircuitBreaker/SimpleCircuitBreakerOptionsTests.cs index 9a53eff263..7d3512e2a5 100644 --- a/test/Polly.Core.Tests/CircuitBreaker/SimpleCircuitBreakerOptionsTests.cs +++ b/test/Polly.Core.Tests/CircuitBreaker/SimpleCircuitBreakerOptionsTests.cs @@ -31,7 +31,7 @@ public async Task ShouldHandle_EnsureDefaults() { var options = new SimpleCircuitBreakerStrategyOptions(); var args = new CircuitBreakerPredicateArguments(); - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); (await options.ShouldHandle(new(context, Outcome.FromResult(""), args))).Should().Be(false); (await options.ShouldHandle(new(context, Outcome.FromException(new OperationCanceledException()), args))).Should().Be(false); diff --git a/test/Polly.Core.Tests/Fallback/FallbackHandlerTests.cs b/test/Polly.Core.Tests/Fallback/FallbackHandlerTests.cs index dc0bb83c23..70866d1b1e 100644 --- a/test/Polly.Core.Tests/Fallback/FallbackHandlerTests.cs +++ b/test/Polly.Core.Tests/Fallback/FallbackHandlerTests.cs @@ -7,7 +7,7 @@ public class FallbackHandlerTests public async Task GenerateAction_Generic_Ok() { var handler = FallbackHelper.CreateHandler(_ => true, () => Outcome.FromResult("secondary"), true); - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); var outcome = await handler.GetFallbackOutcomeAsync(new OutcomeArguments(context, Outcome.FromResult("primary"), new FallbackPredicateArguments()))!; outcome.Result.Should().Be("secondary"); @@ -17,7 +17,7 @@ public async Task GenerateAction_Generic_Ok() public async Task GenerateAction_NonGeneric_Ok() { var handler = FallbackHelper.CreateHandler(_ => true, () => Outcome.FromResult((object)"secondary"), false); - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); var outcome = await handler.GetFallbackOutcomeAsync(new OutcomeArguments(context, Outcome.FromResult("primary"), new FallbackPredicateArguments()))!; outcome.Result.Should().Be("secondary"); diff --git a/test/Polly.Core.Tests/Fallback/FallbackStrategyOptionsTests.cs b/test/Polly.Core.Tests/Fallback/FallbackStrategyOptionsTests.cs index 828591c3c2..1d65fbbf2e 100644 --- a/test/Polly.Core.Tests/Fallback/FallbackStrategyOptionsTests.cs +++ b/test/Polly.Core.Tests/Fallback/FallbackStrategyOptionsTests.cs @@ -21,7 +21,7 @@ public async Task ShouldHandle_EnsureDefaults() { var options = new FallbackStrategyOptions(); var args = new FallbackPredicateArguments(); - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); (await options.ShouldHandle(new(context, Outcome.FromResult(0), args))).Should().Be(false); (await options.ShouldHandle(new(context, Outcome.FromException(new OperationCanceledException()), args))).Should().Be(false); diff --git a/test/Polly.Core.Tests/Hedging/Controller/HedgingControllerTests.cs b/test/Polly.Core.Tests/Hedging/Controller/HedgingControllerTests.cs index 55648169f6..3392763046 100644 --- a/test/Polly.Core.Tests/Hedging/Controller/HedgingControllerTests.cs +++ b/test/Polly.Core.Tests/Hedging/Controller/HedgingControllerTests.cs @@ -10,10 +10,10 @@ public async Task Pooling_Ok() var telemetry = TestUtilities.CreateResilienceTelemetry(_ => { }); var controller = new HedgingController(telemetry, new HedgingTimeProvider(), HedgingHelper.CreateHandler(_ => false, args => null), 3); - var context1 = controller.GetContext(ResilienceContext.Get()); + var context1 = controller.GetContext(ResilienceContextPool.Shared.Get()); await PrepareAsync(context1); - var context2 = controller.GetContext(ResilienceContext.Get()); + var context2 = controller.GetContext(ResilienceContextPool.Shared.Get()); await PrepareAsync(context2); controller.RentedContexts.Should().Be(2); diff --git a/test/Polly.Core.Tests/Hedging/Controller/HedgingExecutionContextTests.cs b/test/Polly.Core.Tests/Hedging/Controller/HedgingExecutionContextTests.cs index 1b7ca3e840..043e9ea3cb 100644 --- a/test/Polly.Core.Tests/Hedging/Controller/HedgingExecutionContextTests.cs +++ b/test/Polly.Core.Tests/Hedging/Controller/HedgingExecutionContextTests.cs @@ -33,7 +33,7 @@ public HedgingExecutionContextTests() _ => false }, args => Generator(args)); - _resilienceContext = ResilienceContext.Get().Initialize(false); + _resilienceContext = ResilienceContextPool.Shared.Get().Initialize(false); _resilienceContext.CancellationToken = _cts.Token; _resilienceContext.Properties.Set(_myKey, "dummy"); diff --git a/test/Polly.Core.Tests/Hedging/Controller/TaskExecutionTests.cs b/test/Polly.Core.Tests/Hedging/Controller/TaskExecutionTests.cs index 8be3604461..05f4665d04 100644 --- a/test/Polly.Core.Tests/Hedging/Controller/TaskExecutionTests.cs +++ b/test/Polly.Core.Tests/Hedging/Controller/TaskExecutionTests.cs @@ -289,7 +289,7 @@ private void AssertSecondaryContext(ResilienceContext context, TaskExecution(isSynchronous: false), new ResilienceProperties(), token ?? _cts.Token); + _snapshot = new ContextSnapshot(ResilienceContextPool.Shared.Get().Initialize(isSynchronous: false), new ResilienceProperties(), token ?? _cts.Token); _snapshot.Context.CancellationToken = _cts.Token; _snapshot.OriginalProperties.Set(_myKey, "dummy-value"); } diff --git a/test/Polly.Core.Tests/Hedging/HedgingActionGeneratorArgumentsTests.cs b/test/Polly.Core.Tests/Hedging/HedgingActionGeneratorArgumentsTests.cs index 332bf75050..9d669c3dfd 100644 --- a/test/Polly.Core.Tests/Hedging/HedgingActionGeneratorArgumentsTests.cs +++ b/test/Polly.Core.Tests/Hedging/HedgingActionGeneratorArgumentsTests.cs @@ -7,7 +7,7 @@ public class HedgingActionGeneratorArgumentsTests [Fact] public void Ctor_Ok() { - var args = new HedgingActionGeneratorArguments(ResilienceContext.Get(), ResilienceContext.Get(), 5, _ => Outcome.FromResultAsTask("dummy")); + var args = new HedgingActionGeneratorArguments(ResilienceContextPool.Shared.Get(), ResilienceContextPool.Shared.Get(), 5, _ => Outcome.FromResultAsTask("dummy")); args.PrimaryContext.Should().NotBeNull(); args.ActionContext.Should().NotBeNull(); diff --git a/test/Polly.Core.Tests/Hedging/HedgingDelayArgumentsTests.cs b/test/Polly.Core.Tests/Hedging/HedgingDelayArgumentsTests.cs index ec88299510..0c130aa1f8 100644 --- a/test/Polly.Core.Tests/Hedging/HedgingDelayArgumentsTests.cs +++ b/test/Polly.Core.Tests/Hedging/HedgingDelayArgumentsTests.cs @@ -7,7 +7,7 @@ public class HedgingDelayArgumentsTests [Fact] public void Ctor_Ok() { - var args = new HedgingDelayArguments(ResilienceContext.Get(), 5); + var args = new HedgingDelayArguments(ResilienceContextPool.Shared.Get(), 5); args.Context.Should().NotBeNull(); args.Attempt.Should().Be(5); diff --git a/test/Polly.Core.Tests/Hedging/HedgingHandlerTests.cs b/test/Polly.Core.Tests/Hedging/HedgingHandlerTests.cs index 3f8775165b..75de9741ce 100644 --- a/test/Polly.Core.Tests/Hedging/HedgingHandlerTests.cs +++ b/test/Polly.Core.Tests/Hedging/HedgingHandlerTests.cs @@ -13,7 +13,11 @@ public async Task GenerateAction_Generic_Ok() args => () => Outcome.FromResultAsTask("ok"), true); - var action = handler.GenerateAction(new HedgingActionGeneratorArguments(ResilienceContext.Get(), ResilienceContext.Get(), 0, _ => Outcome.FromResultAsTask("primary")))!; + var action = handler.GenerateAction(new HedgingActionGeneratorArguments( + ResilienceContextPool.Shared.Get(), + ResilienceContextPool.Shared.Get(), + 0, + _ => Outcome.FromResultAsTask("primary")))!; var res = await action(); res.Result.Should().Be("ok"); @@ -37,7 +41,11 @@ public async Task GenerateAction_NonGeneric_Ok(bool nullAction) }, false); - var action = handler.GenerateAction(new HedgingActionGeneratorArguments(ResilienceContext.Get(), ResilienceContext.Get(), 0, _ => Outcome.FromResultAsTask((object)"primary")))!; + var action = handler.GenerateAction(new HedgingActionGeneratorArguments( + ResilienceContextPool.Shared.Get(), + ResilienceContextPool.Shared.Get(), + 0, + _ => Outcome.FromResultAsTask((object)"primary")))!; if (nullAction) { action.Should().BeNull(); @@ -57,7 +65,12 @@ public async Task GenerateAction_NonGeneric_FromCallback() args => () => args.Callback(args.ActionContext), false); - var action = handler.GenerateAction(new HedgingActionGeneratorArguments(ResilienceContext.Get(), ResilienceContext.Get(), 0, _ => Outcome.FromResultAsTask((object)"callback")))!; + var action = handler.GenerateAction( + new HedgingActionGeneratorArguments( + ResilienceContextPool.Shared.Get(), + ResilienceContextPool.Shared.Get(), + 0, + _ => Outcome.FromResultAsTask((object)"callback")))!; var res = await action(); res.Result.Should().Be("callback"); } diff --git a/test/Polly.Core.Tests/Hedging/HedgingResilienceStrategyTests.cs b/test/Polly.Core.Tests/Hedging/HedgingResilienceStrategyTests.cs index 4199887864..ea95766313 100644 --- a/test/Polly.Core.Tests/Hedging/HedgingResilienceStrategyTests.cs +++ b/test/Polly.Core.Tests/Hedging/HedgingResilienceStrategyTests.cs @@ -70,7 +70,7 @@ public async Task Execute_CancellationRequested_Throws() var strategy = Create(); _cts.Cancel(); - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); context.CancellationToken = _cts.Token; var outcome = await strategy.ExecuteOutcomeAsync((_, _) => Outcome.FromResultAsTask("dummy"), context, "state"); @@ -121,7 +121,7 @@ public async Task ExecutePrimary_Cancelled_SecondaryShouldBeExecuted() return new ValueTask("primary"); }, - ResilienceContext.Get()); + ResilienceContextPool.Shared.Get()); result.Should().Be("secondary"); } @@ -138,7 +138,7 @@ public async Task GetHedgingDelayAsync_GeneratorSet_EnsureCorrectGeneratedValue( var strategy = Create(); - var result = await strategy.GetHedgingDelayAsync(ResilienceContext.Get(), 0); + var result = await strategy.GetHedgingDelayAsync(ResilienceContextPool.Shared.Get(), 0); result.Should().Be(TimeSpan.FromSeconds(seconds)); } @@ -150,7 +150,7 @@ public async Task GetHedgingDelayAsync_NoGeneratorSet_EnsureCorrectValue() var strategy = Create(); - var result = await strategy.GetHedgingDelayAsync(ResilienceContext.Get(), 0); + var result = await strategy.GetHedgingDelayAsync(ResilienceContextPool.Shared.Get(), 0); result.Should().Be(TimeSpan.FromMilliseconds(123)); } @@ -171,7 +171,7 @@ public async Task ExecuteAsync_ShouldReturnAnyPossibleResult() [Fact] public async Task ExecuteAsync_EnsurePrimaryContextFlows() { - var primaryContext = ResilienceContext.Get(); + var primaryContext = ResilienceContextPool.Shared.Get(); var attempts = 0; var key = new ResiliencePropertyKey("primary-key"); @@ -367,7 +367,7 @@ public async Task ExecuteAsync_EveryHedgedTaskShouldHaveDifferentContexts() var beforeKey = new ResiliencePropertyKey("before"); var afterKey = new ResiliencePropertyKey("after"); - var primaryContext = ResilienceContext.Get(); + var primaryContext = ResilienceContextPool.Shared.Get(); primaryContext.Properties.Set(beforeKey, "before"); var contexts = new List(); var tokenHashCodes = new List(); @@ -415,7 +415,7 @@ public async Task ExecuteAsync_EnsureOriginalCancellationTokenRestored() { // arrange using var cancellationSource = new CancellationTokenSource(); - var primaryContext = ResilienceContext.Get(); + var primaryContext = ResilienceContextPool.Shared.Get(); primaryContext.CancellationToken = cancellationSource.Token; ConfigureHedging(TimeSpan.Zero); var strategy = Create(); @@ -435,7 +435,7 @@ public async Task ExecuteAsync_EnsurePropertiesConsistency(bool primaryFails) // arrange _options.MaxHedgedAttempts = 2; var attempts = _options.MaxHedgedAttempts; - var primaryContext = ResilienceContext.Get(); + var primaryContext = ResilienceContextPool.Shared.Get(); var storedProps = primaryContext.Properties; var contexts = new List(); var primaryKey = new ResiliencePropertyKey("primary-key"); @@ -498,7 +498,7 @@ public async Task ExecuteAsync_Primary_CustomPropertiesAvailable() var key = new ResiliencePropertyKey("my-key"); var key2 = new ResiliencePropertyKey("my-key-2"); using var cancellationSource = new CancellationTokenSource(); - var primaryContext = ResilienceContext.Get(); + var primaryContext = ResilienceContextPool.Shared.Get(); primaryContext.Properties.Set(key2, "my-value-2"); primaryContext.CancellationToken = cancellationSource.Token; var props = primaryContext.Properties; @@ -528,7 +528,7 @@ public async Task ExecuteAsync_Secondary_CustomPropertiesAvailable() // arrange var key = new ResiliencePropertyKey("my-key"); var key2 = new ResiliencePropertyKey("my-key-2"); - var primaryContext = ResilienceContext.Get(); + var primaryContext = ResilienceContextPool.Shared.Get(); var storedProps = primaryContext.Properties; primaryContext.Properties.Set(key2, "my-value-2"); ConfigureHedging(args => @@ -577,7 +577,7 @@ public async Task ExecuteAsync_CancellationLinking_Ok() using var primaryCancelled = new ManualResetEvent(false); using var secondaryCancelled = new ManualResetEvent(false); using var cancellationSource = new CancellationTokenSource(); - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); context.CancellationToken = cancellationSource.Token; ConfigureHedging(async context => @@ -913,7 +913,7 @@ public async Task ExecuteAsync_EnsureOnHedgingCalled() [Fact] public async Task ExecuteAsync_EnsureOnHedgingTelemetry() { - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); ConfigureHedging(res => res.Result == Failure, args => () => Outcome.FromResultAsTask(Failure)); diff --git a/test/Polly.Core.Tests/Hedging/HedgingStrategyOptionsTests.cs b/test/Polly.Core.Tests/Hedging/HedgingStrategyOptionsTests.cs index 050314758c..fd322bea14 100644 --- a/test/Polly.Core.Tests/Hedging/HedgingStrategyOptionsTests.cs +++ b/test/Polly.Core.Tests/Hedging/HedgingStrategyOptionsTests.cs @@ -24,7 +24,7 @@ public void Ctor_EnsureDefaults() public async Task HedgingActionGenerator_EnsureDefaults(bool synchronous) { var options = new HedgingStrategyOptions(); - var context = ResilienceContext.Get().Initialize(synchronous); + var context = ResilienceContextPool.Shared.Get().Initialize(synchronous); var threadId = Thread.CurrentThread.ManagedThreadId; var action = options.HedgingActionGenerator(new HedgingActionGeneratorArguments(context, context, 1, c => @@ -50,7 +50,7 @@ public async Task ShouldHandle_EnsureDefaults() { var options = new HedgingStrategyOptions(); var args = new HedgingPredicateArguments(); - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); (await options.ShouldHandle(new(context, Outcome.FromResult(0), args))).Should().Be(false); (await options.ShouldHandle(new(context, Outcome.FromException(new OperationCanceledException()), args))).Should().Be(false); diff --git a/test/Polly.Core.Tests/OutcomeArgumentsTests.cs b/test/Polly.Core.Tests/OutcomeArgumentsTests.cs index c65f18f9ed..592127d527 100644 --- a/test/Polly.Core.Tests/OutcomeArgumentsTests.cs +++ b/test/Polly.Core.Tests/OutcomeArgumentsTests.cs @@ -6,7 +6,7 @@ public class OutcomeArgumentsTests public void Ctor_Result_Ok() { var args = new OutcomeArguments( - ResilienceContext.Get(), + ResilienceContextPool.Shared.Get(), Outcome.FromResult("dummy"), "args"); @@ -21,7 +21,7 @@ public void Ctor_Result_Ok() public void Ctor_Exception_Ok() { var args = new OutcomeArguments( - ResilienceContext.Get(), + ResilienceContextPool.Shared.Get(), Outcome.FromException(new InvalidOperationException()), "args"); diff --git a/test/Polly.Core.Tests/PredicateBuilderTests.cs b/test/Polly.Core.Tests/PredicateBuilderTests.cs index afb573dd1a..e937743d65 100644 --- a/test/Polly.Core.Tests/PredicateBuilderTests.cs +++ b/test/Polly.Core.Tests/PredicateBuilderTests.cs @@ -66,7 +66,7 @@ public async Task Operator_RetryStrategyOptions_Ok() ShouldHandle = new PredicateBuilder().HandleResult("error") }; - var handled = await options.ShouldHandle(new(ResilienceContext.Get(), Outcome.FromResult("error"), new RetryPredicateArguments(0))); + var handled = await options.ShouldHandle(new(ResilienceContextPool.Shared.Get(), Outcome.FromResult("error"), new RetryPredicateArguments(0))); handled.Should().BeTrue(); } @@ -79,7 +79,7 @@ public async Task Operator_FallbackStrategyOptions_Ok() ShouldHandle = new PredicateBuilder().HandleResult("error") }; - var handled = await options.ShouldHandle(new(ResilienceContext.Get(), Outcome.FromResult("error"), new FallbackPredicateArguments())); + var handled = await options.ShouldHandle(new(ResilienceContextPool.Shared.Get(), Outcome.FromResult("error"), new FallbackPredicateArguments())); handled.Should().BeTrue(); } @@ -92,7 +92,7 @@ public async Task Operator_HedgingStrategyOptions_Ok() ShouldHandle = new PredicateBuilder().HandleResult("error") }; - var handled = await options.ShouldHandle(new(ResilienceContext.Get(), Outcome.FromResult("error"), new HedgingPredicateArguments())); + var handled = await options.ShouldHandle(new(ResilienceContextPool.Shared.Get(), Outcome.FromResult("error"), new HedgingPredicateArguments())); handled.Should().BeTrue(); } @@ -105,7 +105,7 @@ public async Task Operator_AdvancedCircuitBreakerStrategyOptions_Ok() ShouldHandle = new PredicateBuilder().HandleResult("error") }; - var handled = await options.ShouldHandle(new(ResilienceContext.Get(), Outcome.FromResult("error"), new CircuitBreakerPredicateArguments())); + var handled = await options.ShouldHandle(new(ResilienceContextPool.Shared.Get(), Outcome.FromResult("error"), new CircuitBreakerPredicateArguments())); handled.Should().BeTrue(); } diff --git a/test/Polly.Core.Tests/ResilienceContextPoolTests.cs b/test/Polly.Core.Tests/ResilienceContextPoolTests.cs new file mode 100644 index 0000000000..b9a052efab --- /dev/null +++ b/test/Polly.Core.Tests/ResilienceContextPoolTests.cs @@ -0,0 +1,105 @@ +using Polly.Telemetry; + +namespace Polly.Core.Tests; + +public class ResilienceContextPoolTests +{ + [Fact] + public void Shared_NotNull() + { + ResilienceContextPool.Shared.Should().NotBeNull(); + } + + [Fact] + public void Shared_SameInstance() + { + ResilienceContextPool.Shared.Should().BeSameAs(ResilienceContextPool.Shared); + } + + [Fact] + public void Get_EnsureNotNull() + { + ResilienceContextPool.Shared.Get().Should().NotBeNull(); + } + + [Fact] + public void Get_EnsureDefaults() + { + var context = ResilienceContextPool.Shared.Get(); + + AssertDefaults(context); + } + + [Fact] + public void Get_CancellationToken_Ok() + { + using var token = new CancellationTokenSource(); + + var context = ResilienceContextPool.Shared.Get(token.Token); + + context.CancellationToken.Should().Be(token.Token); + } + + [InlineData(null)] + [InlineData("")] + [InlineData("some-key")] + [Theory] + public void Get_OperationKeyAndCancellationToken_Ok(string? key) + { + using var token = new CancellationTokenSource(); + + var context = ResilienceContextPool.Shared.Get(key!, token.Token); + context.OperationKey.Should().Be(key); + context.CancellationToken.Should().Be(token.Token); + } + + [Fact] + public async Task Get_EnsurePooled() + { + await TestUtilities.AssertWithTimeoutAsync(() => + { + var context = ResilienceContextPool.Shared.Get(); + + ResilienceContextPool.Shared.Return(context); + + ResilienceContextPool.Shared.Get().Should().BeSameAs(context); + }); + } + + [Fact] + public void Return_Null_Throws() + { + Assert.Throws(() => ResilienceContextPool.Shared.Return(null!)); + } + + [Fact] + public async Task Return_EnsureDefaults() + { + await TestUtilities.AssertWithTimeoutAsync(() => + { + using var cts = new CancellationTokenSource(); + var context = ResilienceContextPool.Shared.Get(); + context.CancellationToken = cts.Token; + context.Initialize(true); + context.CancellationToken.Should().Be(cts.Token); + context.Properties.Set(new ResiliencePropertyKey("abc"), 10); + context.AddResilienceEvent(new ResilienceEvent(ResilienceEventSeverity.Information, "dummy")); + ResilienceContextPool.Shared.Return(context); + + AssertDefaults(context); + }); + } + + private static void AssertDefaults(ResilienceContext context) + { + context.IsInitialized.Should().BeFalse(); + context.ContinueOnCapturedContext.Should().BeFalse(); + context.IsVoid.Should().BeFalse(); + context.ResultType.Name.Should().Be("UnknownResult"); + context.IsSynchronous.Should().BeFalse(); + context.CancellationToken.Should().Be(CancellationToken.None); + context.Properties.Options.Should().BeEmpty(); + context.ResilienceEvents.Should().BeEmpty(); + context.OperationKey.Should().BeNull(); + } +} diff --git a/test/Polly.Core.Tests/ResilienceContextTests.cs b/test/Polly.Core.Tests/ResilienceContextTests.cs index 0290df950a..b8a2b089ed 100644 --- a/test/Polly.Core.Tests/ResilienceContextTests.cs +++ b/test/Polly.Core.Tests/ResilienceContextTests.cs @@ -4,66 +4,10 @@ namespace Polly.Core.Tests; public class ResilienceContextTests { - [Fact] - public void Get_EnsureNotNull() - { - ResilienceContext.Get().Should().NotBeNull(); - } - - [Fact] - public void Get_EnsureDefaults() - { - var context = ResilienceContext.Get(); - - AssertDefaults(context); - } - - [Fact] - public void Get_CancellationToken_Ok() - { - using var token = new CancellationTokenSource(); - - var context = ResilienceContext.Get(token.Token); - - context.CancellationToken.Should().Be(token.Token); - } - - [InlineData(null)] - [InlineData("")] - [InlineData("some-key")] - [Theory] - public void Get_OperationKeyAndCancellationToken_Ok(string? key) - { - using var token = new CancellationTokenSource(); - - var context = ResilienceContext.Get(key!, token.Token); - context.OperationKey.Should().Be(key); - context.CancellationToken.Should().Be(token.Token); - } - - [Fact] - public async Task Get_EnsurePooled() - { - await TestUtilities.AssertWithTimeoutAsync(() => - { - var context = ResilienceContext.Get(); - - ResilienceContext.Return(context); - - ResilienceContext.Get().Should().BeSameAs(context); - }); - } - - [Fact] - public void Return_Null_Throws() - { - Assert.Throws(() => ResilienceContext.Return(null!)); - } - [Fact] public void AddResilienceEvent_Ok() { - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); context.AddResilienceEvent(new ResilienceEvent(ResilienceEventSeverity.Information, "Dummy")); @@ -71,30 +15,12 @@ public void AddResilienceEvent_Ok() context.ResilienceEvents.Should().Contain(new ResilienceEvent(ResilienceEventSeverity.Information, "Dummy")); } - [Fact] - public async Task Return_EnsureDefaults() - { - await TestUtilities.AssertWithTimeoutAsync(() => - { - using var cts = new CancellationTokenSource(); - var context = ResilienceContext.Get(); - context.CancellationToken = cts.Token; - context.Initialize(true); - context.CancellationToken.Should().Be(cts.Token); - context.Properties.Set(new ResiliencePropertyKey("abc"), 10); - context.AddResilienceEvent(new ResilienceEvent(ResilienceEventSeverity.Information, "dummy")); - ResilienceContext.Return(context); - - AssertDefaults(context); - }); - } - [InlineData(true)] [InlineData(false)] [Theory] public void Initialize_Typed_Ok(bool synchronous) { - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); context.Initialize(synchronous); context.ResultType.Should().Be(typeof(bool)); @@ -109,11 +35,11 @@ public void Initialize_Typed_Ok(bool synchronous) [Theory] public void Initialize_From_Ok(bool synchronous) { - var context = ResilienceContext.Get("some-key"); + var context = ResilienceContextPool.Shared.Get("some-key"); context.Initialize(synchronous); context.ContinueOnCapturedContext = true; - var other = ResilienceContext.Get(); + var other = ResilienceContextPool.Shared.Get(); other.InitializeFrom(context); other.ResultType.Should().Be(typeof(bool)); @@ -129,7 +55,7 @@ public void Initialize_From_Ok(bool synchronous) [Theory] public void Initialize_Void_Ok(bool synchronous) { - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); context.Initialize(synchronous); context.ResultType.Should().Be(typeof(VoidResult)); @@ -138,17 +64,4 @@ public void Initialize_Void_Ok(bool synchronous) context.IsSynchronous.Should().Be(synchronous); context.ContinueOnCapturedContext.Should().BeFalse(); } - - private static void AssertDefaults(ResilienceContext context) - { - context.IsInitialized.Should().BeFalse(); - context.ContinueOnCapturedContext.Should().BeFalse(); - context.IsVoid.Should().BeFalse(); - context.ResultType.Name.Should().Be("UnknownResult"); - context.IsSynchronous.Should().BeFalse(); - context.CancellationToken.Should().Be(CancellationToken.None); - context.Properties.Options.Should().BeEmpty(); - context.ResilienceEvents.Should().BeEmpty(); - context.OperationKey.Should().BeNull(); - } } diff --git a/test/Polly.Core.Tests/ResilienceStrategyTests.Async.ValueTask.cs b/test/Polly.Core.Tests/ResilienceStrategyTests.Async.ValueTask.cs index 82e4f68907..7f360bbaec 100644 --- a/test/Polly.Core.Tests/ResilienceStrategyTests.Async.ValueTask.cs +++ b/test/Polly.Core.Tests/ResilienceStrategyTests.Async.ValueTask.cs @@ -35,14 +35,14 @@ private static IEnumerable ExecuteAsync_EnsureCorrectBehavior AssertContext = AssertResilienceContextAndToken, }; - yield return new ExecuteParameters(r => r.ExecuteAsync(async (_, s) => { s.Should().Be("dummy-state"); }, ResilienceContext.Get(), "dummy-state")) + yield return new ExecuteParameters(r => r.ExecuteAsync(async (_, s) => { s.Should().Be("dummy-state"); }, ResilienceContextPool.Shared.Get(), "dummy-state")) { Caption = "ExecuteAsync_ResilienceContextAndState", AssertContext = AssertResilienceContext, AssertContextAfter = AssertContextInitialized, }; - yield return new ExecuteParameters(r => r.ExecuteAsync(context => default, ResilienceContext.Get())) + yield return new ExecuteParameters(r => r.ExecuteAsync(context => default, ResilienceContextPool.Shared.Get())) { Caption = "ExecuteAsync_ResilienceContext", AssertContext = AssertResilienceContext, @@ -90,8 +90,8 @@ public async Task ExecuteAsync_Ok(ExecuteParameters parameters) public async Task ExecuteAsync_EnsureCallStackPreserved() { await AssertStackTrace(s => s.ExecuteAsync(_ => MyThrowingMethod())); - await AssertStackTrace(s => s.ExecuteAsync(_ => MyThrowingMethod(), ResilienceContext.Get())); - await AssertStackTrace(s => s.ExecuteAsync((_, _) => MyThrowingMethod(), ResilienceContext.Get(), "state")); + await AssertStackTrace(s => s.ExecuteAsync(_ => MyThrowingMethod(), ResilienceContextPool.Shared.Get())); + await AssertStackTrace(s => s.ExecuteAsync((_, _) => MyThrowingMethod(), ResilienceContextPool.Shared.Get(), "state")); await AssertStackTrace(s => s.ExecuteAsync((_, _) => MyThrowingMethod(), "state")); static async ValueTask AssertStackTrace(Func execute) diff --git a/test/Polly.Core.Tests/ResilienceStrategyTests.Async.ValueTaskT.cs b/test/Polly.Core.Tests/ResilienceStrategyTests.Async.ValueTaskT.cs index 5d00ef0b44..edf8a4724e 100644 --- a/test/Polly.Core.Tests/ResilienceStrategyTests.Async.ValueTaskT.cs +++ b/test/Polly.Core.Tests/ResilienceStrategyTests.Async.ValueTaskT.cs @@ -36,14 +36,14 @@ private static IEnumerable ExecuteAsyncT_EnsureCorrectBehavio AssertContext = AssertResilienceContextAndToken, }; - yield return new ExecuteParameters(r => r.ExecuteAsync(async (_, s) => { s.Should().Be("dummy-state"); return result; }, ResilienceContext.Get(), "dummy-state"), result) + yield return new ExecuteParameters(r => r.ExecuteAsync(async (_, s) => { s.Should().Be("dummy-state"); return result; }, ResilienceContextPool.Shared.Get(), "dummy-state"), result) { Caption = "ExecuteAsyncT_ResilienceContextAndState", AssertContext = AssertResilienceContext, AssertContextAfter = AssertContextInitialized, }; - yield return new ExecuteParameters(r => r.ExecuteAsync(async _ => result, ResilienceContext.Get()), result) + yield return new ExecuteParameters(r => r.ExecuteAsync(async _ => result, ResilienceContextPool.Shared.Get()), result) { Caption = "ExecuteAsyncT_ResilienceContext", AssertContext = AssertResilienceContext, @@ -92,8 +92,8 @@ public async Task ExecuteAsyncT_Ok(ExecuteParameters parameters) public async Task ExecuteAsync_T_EnsureCallStackPreserved() { await AssertStackTrace(s => s.ExecuteAsync(_ => MyThrowingMethod())); - await AssertStackTrace(s => s.ExecuteAsync(_ => MyThrowingMethod(), ResilienceContext.Get())); - await AssertStackTrace(s => s.ExecuteAsync((_, _) => MyThrowingMethod(), ResilienceContext.Get(), "state")); + await AssertStackTrace(s => s.ExecuteAsync(_ => MyThrowingMethod(), ResilienceContextPool.Shared.Get())); + await AssertStackTrace(s => s.ExecuteAsync((_, _) => MyThrowingMethod(), ResilienceContextPool.Shared.Get(), "state")); await AssertStackTrace(s => s.ExecuteAsync((_, _) => MyThrowingMethod(), "state")); static async ValueTask AssertStackTrace(Func> execute) @@ -124,7 +124,7 @@ public async Task ExecuteOutcomeAsync_Ok() context.ResultType.Should().Be(typeof(int)); return Outcome.FromResultAsTask(12345); }, - ResilienceContext.Get(), + ResilienceContextPool.Shared.Get(), "state"); result.Result.Should().Be(12345); diff --git a/test/Polly.Core.Tests/ResilienceStrategyTests.Sync.cs b/test/Polly.Core.Tests/ResilienceStrategyTests.Sync.cs index ed9902a19b..461638d423 100644 --- a/test/Polly.Core.Tests/ResilienceStrategyTests.Sync.cs +++ b/test/Polly.Core.Tests/ResilienceStrategyTests.Sync.cs @@ -39,14 +39,14 @@ private static IEnumerable Execute_EnsureCorrectBehavior_Exec AssertContext = AssertResilienceContext, }; - yield return new ExecuteParameters(r => r.Execute(context => { }, ResilienceContext.Get())) + yield return new ExecuteParameters(r => r.Execute(context => { }, ResilienceContextPool.Shared.Get())) { Caption = "ResilienceContext", AssertContext = AssertResilienceContext, AssertContextAfter = AssertContextInitialized, }; - yield return new ExecuteParameters(r => r.Execute((_, s) => { s.Should().Be("dummy-state"); }, ResilienceContext.Get(), "dummy-state")) + yield return new ExecuteParameters(r => r.Execute((_, s) => { s.Should().Be("dummy-state"); }, ResilienceContextPool.Shared.Get(), "dummy-state")) { Caption = "Execute_ResilienceContextAndState", AssertContext = AssertResilienceContext, @@ -95,9 +95,9 @@ public void Execute_EnsureCallStackPreserved() { AssertStackTrace(s => s.Execute(() => MyThrowingMethod())); AssertStackTrace(s => s.Execute(_ => MyThrowingMethod())); - AssertStackTrace(s => s.Execute((_) => MyThrowingMethod(), ResilienceContext.Get())); - AssertStackTrace(s => s.Execute((_, _) => MyThrowingMethod(), ResilienceContext.Get())); - AssertStackTrace(s => s.Execute((_, _) => MyThrowingMethod(), ResilienceContext.Get(), "state")); + AssertStackTrace(s => s.Execute((_) => MyThrowingMethod(), ResilienceContextPool.Shared.Get())); + AssertStackTrace(s => s.Execute((_, _) => MyThrowingMethod(), ResilienceContextPool.Shared.Get())); + AssertStackTrace(s => s.Execute((_, _) => MyThrowingMethod(), ResilienceContextPool.Shared.Get(), "state")); AssertStackTrace(s => s.Execute((_, _) => MyThrowingMethod(), "state")); AssertStackTrace(s => s.Execute((_) => MyThrowingMethod(), "state")); diff --git a/test/Polly.Core.Tests/ResilienceStrategyTests.SyncT.cs b/test/Polly.Core.Tests/ResilienceStrategyTests.SyncT.cs index 1f8e3fd4fd..4cd89f7294 100644 --- a/test/Polly.Core.Tests/ResilienceStrategyTests.SyncT.cs +++ b/test/Polly.Core.Tests/ResilienceStrategyTests.SyncT.cs @@ -35,14 +35,14 @@ private static IEnumerable ExecuteT_EnsureCorrectBehavior_Exe AssertContext = AssertResilienceContext, }; - yield return new ExecuteParameters(r => r.Execute(_ => result, ResilienceContext.Get()), result) + yield return new ExecuteParameters(r => r.Execute(_ => result, ResilienceContextPool.Shared.Get()), result) { Caption = "ExecuteT_ResilienceContext", AssertContext = AssertResilienceContext, AssertContextAfter = AssertContextInitialized }; - yield return new ExecuteParameters(r => r.Execute((_, s) => { s.Should().Be("dummy-state"); return result; }, ResilienceContext.Get(), "dummy-state"), result) + yield return new ExecuteParameters(r => r.Execute((_, s) => { s.Should().Be("dummy-state"); return result; }, ResilienceContextPool.Shared.Get(), "dummy-state"), result) { Caption = "ExecuteT_ResilienceContext", AssertContext = AssertResilienceContext, @@ -97,9 +97,9 @@ public void Execute_T_EnsureCallStackPreserved() { AssertStackTrace(s => s.Execute(() => MyThrowingMethod())); AssertStackTrace(s => s.Execute(_ => MyThrowingMethod())); - AssertStackTrace(s => s.Execute((_, _) => MyThrowingMethod(), ResilienceContext.Get())); - AssertStackTrace(s => s.Execute((_) => MyThrowingMethod(), ResilienceContext.Get())); - AssertStackTrace(s => s.Execute((_, _) => MyThrowingMethod(), ResilienceContext.Get(), "state")); + AssertStackTrace(s => s.Execute((_, _) => MyThrowingMethod(), ResilienceContextPool.Shared.Get())); + AssertStackTrace(s => s.Execute((_) => MyThrowingMethod(), ResilienceContextPool.Shared.Get())); + AssertStackTrace(s => s.Execute((_, _) => MyThrowingMethod(), ResilienceContextPool.Shared.Get(), "state")); AssertStackTrace(s => s.Execute((_, _) => MyThrowingMethod(), "state")); AssertStackTrace(s => s.Execute((_) => MyThrowingMethod(), "state")); diff --git a/test/Polly.Core.Tests/ResilienceStrategyTests.TResult.Async.cs b/test/Polly.Core.Tests/ResilienceStrategyTests.TResult.Async.cs index 29c635bec9..c586252c46 100644 --- a/test/Polly.Core.Tests/ResilienceStrategyTests.TResult.Async.cs +++ b/test/Polly.Core.Tests/ResilienceStrategyTests.TResult.Async.cs @@ -32,7 +32,7 @@ public partial class ResilienceStrategyTests async strategy => { - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); context.CancellationToken = CancellationToken; (await strategy.ExecuteAsync( (context, state) => @@ -47,7 +47,7 @@ public partial class ResilienceStrategyTests async strategy => { - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); context.CancellationToken = CancellationToken; (await strategy.ExecuteAsync( (context) => @@ -86,7 +86,7 @@ public async Task ExecuteOutcomeAsync_GenericStrategy_Ok() context.ResultType.Should().Be(typeof(int)); return Outcome.FromResultAsTask(12345); }, - ResilienceContext.Get(), + ResilienceContextPool.Shared.Get(), "state"); result.Result.Should().Be(12345); diff --git a/test/Polly.Core.Tests/ResilienceStrategyTests.TResult.Sync.cs b/test/Polly.Core.Tests/ResilienceStrategyTests.TResult.Sync.cs index 65b3a962c8..149dd8913c 100644 --- a/test/Polly.Core.Tests/ResilienceStrategyTests.TResult.Sync.cs +++ b/test/Polly.Core.Tests/ResilienceStrategyTests.TResult.Sync.cs @@ -45,7 +45,7 @@ public partial class ResilienceStrategyTests strategy => { - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); context.CancellationToken = CancellationToken; strategy.Execute( (context, state) => @@ -61,7 +61,7 @@ public partial class ResilienceStrategyTests strategy => { - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); context.CancellationToken = CancellationToken; strategy.Execute( (context) => diff --git a/test/Polly.Core.Tests/ResilienceStrategyTests.cs b/test/Polly.Core.Tests/ResilienceStrategyTests.cs index af6dc7fe9f..fb2377a9b7 100644 --- a/test/Polly.Core.Tests/ResilienceStrategyTests.cs +++ b/test/Polly.Core.Tests/ResilienceStrategyTests.cs @@ -23,7 +23,7 @@ await TestUtilities.AssertWithTimeoutAsync(async () => throw new InvalidOperationException(); }, - ResilienceContext.Get(), + ResilienceContextPool.Shared.Get(), "dummy"); outcome.Exception.Should().BeOfType(); diff --git a/test/Polly.Core.Tests/Retry/RetryResilienceStrategyTests.cs b/test/Polly.Core.Tests/Retry/RetryResilienceStrategyTests.cs index fb59f3dc70..310cdcdc52 100644 --- a/test/Polly.Core.Tests/Retry/RetryResilienceStrategyTests.cs +++ b/test/Polly.Core.Tests/Retry/RetryResilienceStrategyTests.cs @@ -37,7 +37,7 @@ public async Task ExecuteAsync_CancellationRequested_EnsureNotRetried() var sut = CreateSut(); using var cancellationToken = new CancellationTokenSource(); cancellationToken.Cancel(); - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); context.CancellationToken = cancellationToken.Token; var executed = false; @@ -59,7 +59,7 @@ public async Task ExecuteAsync_CancellationRequestedAfterCallback_EnsureNotRetri }; var sut = CreateSut(TimeProvider.System); - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); context.CancellationToken = cancellationToken.Token; var executed = false; diff --git a/test/Polly.Core.Tests/Retry/RetryStrategyOptionsTests.cs b/test/Polly.Core.Tests/Retry/RetryStrategyOptionsTests.cs index ea5bcd7c68..f7d8c47e06 100644 --- a/test/Polly.Core.Tests/Retry/RetryStrategyOptionsTests.cs +++ b/test/Polly.Core.Tests/Retry/RetryStrategyOptionsTests.cs @@ -27,7 +27,7 @@ public async Task ShouldHandle_EnsureDefaults() { var options = new RetryStrategyOptions(); var args = new RetryPredicateArguments(0); - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); (await options.ShouldHandle(new(context, Outcome.FromResult(0), args))).Should().Be(false); (await options.ShouldHandle(new(context, Outcome.FromException(new OperationCanceledException()), args))).Should().Be(false); diff --git a/test/Polly.Core.Tests/Telemetry/ResilienceStrategyTelemetryTests.cs b/test/Polly.Core.Tests/Telemetry/ResilienceStrategyTelemetryTests.cs index b84fe2cb42..22a736bf9d 100644 --- a/test/Polly.Core.Tests/Telemetry/ResilienceStrategyTelemetryTests.cs +++ b/test/Polly.Core.Tests/Telemetry/ResilienceStrategyTelemetryTests.cs @@ -36,7 +36,7 @@ public void Report_NoOutcome_OK() args.Context.Should().NotBeNull(); }); - _sut.Report(new(ResilienceEventSeverity.Warning, "dummy-event"), ResilienceContext.Get(), new TestArguments()); + _sut.Report(new(ResilienceEventSeverity.Warning, "dummy-event"), ResilienceContextPool.Shared.Get(), new TestArguments()); _diagnosticSource.VerifyAll(); } @@ -46,7 +46,7 @@ public void Report_NoOutcomeWhenNotSubscribed_None() { _diagnosticSource.Setup(o => o.IsEnabled("dummy-event")).Returns(false); - _sut.Report(new(ResilienceEventSeverity.Warning, "dummy-event"), ResilienceContext.Get(), new TestArguments()); + _sut.Report(new(ResilienceEventSeverity.Warning, "dummy-event"), ResilienceContextPool.Shared.Get(), new TestArguments()); _diagnosticSource.VerifyAll(); _diagnosticSource.VerifyNoOtherCalls(); @@ -57,7 +57,7 @@ public void ResilienceStrategyTelemetry_NoDiagnosticSource_Ok() { var source = new ResilienceTelemetrySource("builder", "instance", new ResilienceProperties(), "strategy-name"); var sut = new ResilienceStrategyTelemetry(source, null); - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); sut.Invoking(s => s.Report(new(ResilienceEventSeverity.Warning, "dummy"), context, new TestArguments())).Should().NotThrow(); sut.Invoking(s => s.Report(new(ResilienceEventSeverity.Warning, "dummy"), new OutcomeArguments(context, Outcome.FromResult(1), new TestArguments()))).Should().NotThrow(); @@ -84,7 +84,7 @@ public void Report_Outcome_OK() args.Context.Should().NotBeNull(); }); - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); _sut.Report(new(ResilienceEventSeverity.Warning, "dummy-event"), new OutcomeArguments(context, Outcome.FromResult(99), new TestArguments())); _diagnosticSource.VerifyAll(); @@ -95,9 +95,9 @@ public void Report_SeverityNone_Skipped() { _diagnosticSource.Setup(o => o.IsEnabled("dummy-event")).Returns(true); - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); _sut.Report(new(ResilienceEventSeverity.None, "dummy-event"), new OutcomeArguments(context, Outcome.FromResult(99), new TestArguments())); - _sut.Report(new(ResilienceEventSeverity.None, "dummy-event"), ResilienceContext.Get(), new TestArguments()); + _sut.Report(new(ResilienceEventSeverity.None, "dummy-event"), ResilienceContextPool.Shared.Get(), new TestArguments()); _diagnosticSource.VerifyAll(); _diagnosticSource.VerifyNoOtherCalls(); @@ -107,7 +107,7 @@ public void Report_SeverityNone_Skipped() public void Report_OutcomeWhenNotSubscribed_None() { _diagnosticSource.Setup(o => o.IsEnabled("dummy-event")).Returns(false); - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); _sut.Report(new(ResilienceEventSeverity.Warning, "dummy-event"), new OutcomeArguments(context, Outcome.FromResult(10), new TestArguments())); _diagnosticSource.VerifyAll(); diff --git a/test/Polly.Core.Tests/Telemetry/TelemetryEventArgumentsTests.cs b/test/Polly.Core.Tests/Telemetry/TelemetryEventArgumentsTests.cs index ff5dab4e58..518c47236a 100644 --- a/test/Polly.Core.Tests/Telemetry/TelemetryEventArgumentsTests.cs +++ b/test/Polly.Core.Tests/Telemetry/TelemetryEventArgumentsTests.cs @@ -9,7 +9,7 @@ public class TelemetryEventArgumentsTests [Fact] public void Get_Ok() { - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); var args = TelemetryEventArguments.Get(_source, new ResilienceEvent(ResilienceEventSeverity.Warning, "ev"), context, Outcome.FromResult("dummy"), "arg"); args.Outcome!.Value.Result.Should().Be("dummy"); @@ -24,7 +24,7 @@ public void Get_Ok() [Fact] public void Return_EnsurePropertiesCleared() { - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); var args = TelemetryEventArguments.Get(_source, new ResilienceEvent(ResilienceEventSeverity.Warning, "ev"), context, Outcome.FromResult("dummy"), "arg"); TelemetryEventArguments.Return(args); diff --git a/test/Polly.Core.Tests/Telemetry/TelemetryUtilTests.cs b/test/Polly.Core.Tests/Telemetry/TelemetryUtilTests.cs index a2188860a8..fd138a72a4 100644 --- a/test/Polly.Core.Tests/Telemetry/TelemetryUtilTests.cs +++ b/test/Polly.Core.Tests/Telemetry/TelemetryUtilTests.cs @@ -40,7 +40,7 @@ public void ReportExecutionAttempt_Ok(bool handled, ResilienceEventSeverity seve asserted = true; }); - TelemetryUtil.ReportExecutionAttempt(telemetry, ResilienceContext.Get(), Outcome.FromResult("dummy"), 0, TimeSpan.Zero, handled); + TelemetryUtil.ReportExecutionAttempt(telemetry, ResilienceContextPool.Shared.Get(), Outcome.FromResult("dummy"), 0, TimeSpan.Zero, handled); asserted.Should().BeTrue(); } } diff --git a/test/Polly.Core.Tests/Timeout/TimeoutResilienceStrategyBuilderExtensionsTests.cs b/test/Polly.Core.Tests/Timeout/TimeoutResilienceStrategyBuilderExtensionsTests.cs index e6dacefe22..786517af42 100644 --- a/test/Polly.Core.Tests/Timeout/TimeoutResilienceStrategyBuilderExtensionsTests.cs +++ b/test/Polly.Core.Tests/Timeout/TimeoutResilienceStrategyBuilderExtensionsTests.cs @@ -61,6 +61,6 @@ private static TimeSpan GetTimeout(TimeoutResilienceStrategy strategy) return strategy.DefaultTimeout; } - return strategy.TimeoutGenerator(new TimeoutGeneratorArguments(ResilienceContext.Get())).Preserve().GetAwaiter().GetResult(); + return strategy.TimeoutGenerator(new TimeoutGeneratorArguments(ResilienceContextPool.Shared.Get())).Preserve().GetAwaiter().GetResult(); } } diff --git a/test/Polly.Core.Tests/Timeout/TimeoutResilienceStrategyTests.cs b/test/Polly.Core.Tests/Timeout/TimeoutResilienceStrategyTests.cs index 7cac4a0177..72b423b7ea 100644 --- a/test/Polly.Core.Tests/Timeout/TimeoutResilienceStrategyTests.cs +++ b/test/Polly.Core.Tests/Timeout/TimeoutResilienceStrategyTests.cs @@ -130,7 +130,7 @@ public async Task Execute_Timeout_EnsureStackTrace() return Outcome.FromResult("dummy"); }, - ResilienceContext.Get(), + ResilienceContextPool.Shared.Get(), "state"); outcome.Exception.Should().BeOfType(); outcome.Exception!.StackTrace.Should().Contain("Execute_Timeout_EnsureStackTrace"); @@ -178,7 +178,7 @@ public async Task Execute_NoTimeoutOrCancellation_EnsureCancellationTokenRestore var sut = CreateSut(); - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); context.CancellationToken = cts.Token; await sut.ExecuteAsync( diff --git a/test/Polly.Core.Tests/Timeout/TimeoutTestUtils.cs b/test/Polly.Core.Tests/Timeout/TimeoutTestUtils.cs index 8295700e6b..7d572a7014 100644 --- a/test/Polly.Core.Tests/Timeout/TimeoutTestUtils.cs +++ b/test/Polly.Core.Tests/Timeout/TimeoutTestUtils.cs @@ -4,9 +4,9 @@ namespace Polly.Core.Tests.Timeout; public static class TimeoutTestUtils { - public static OnTimeoutArguments OnTimeoutArguments() => new(ResilienceContext.Get(), new InvalidOperationException(), TimeSpan.FromSeconds(1)); + public static OnTimeoutArguments OnTimeoutArguments() => new(ResilienceContextPool.Shared.Get(), new InvalidOperationException(), TimeSpan.FromSeconds(1)); - public static TimeoutGeneratorArguments TimeoutGeneratorArguments() => new(ResilienceContext.Get()); + public static TimeoutGeneratorArguments TimeoutGeneratorArguments() => new(ResilienceContextPool.Shared.Get()); public static readonly TheoryData InvalidTimeouts = new() { diff --git a/test/Polly.Core.Tests/Utils/ResilienceStrategyPipelineTests.cs b/test/Polly.Core.Tests/Utils/ResilienceStrategyPipelineTests.cs index 153e64a34a..a6d504b582 100644 --- a/test/Polly.Core.Tests/Utils/ResilienceStrategyPipelineTests.cs +++ b/test/Polly.Core.Tests/Utils/ResilienceStrategyPipelineTests.cs @@ -48,7 +48,7 @@ public async Task CreatePipeline_EnsureExceptionsNotWrapped() var pipeline = ResilienceStrategyPipeline.CreatePipeline(strategies); await pipeline - .Invoking(p => p.ExecuteCoreAsync((_, _) => Outcome.FromResultAsTask(10), ResilienceContext.Get(), "state").AsTask()) + .Invoking(p => p.ExecuteCoreAsync((_, _) => Outcome.FromResultAsTask(10), ResilienceContextPool.Shared.Get(), "state").AsTask()) .Should() .ThrowAsync(); } @@ -84,7 +84,7 @@ public async Task CreatePipeline_Cancelled_EnsureNoExecution() }; var pipeline = ResilienceStrategyPipeline.CreatePipeline(strategies); - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); context.CancellationToken = cancellation.Token; var result = await pipeline.ExecuteOutcomeAsync((_, _) => Outcome.FromResultAsTask("result"), context, "state"); @@ -103,7 +103,7 @@ public async Task CreatePipeline_CancelledLater_EnsureNoExecution() }; var pipeline = ResilienceStrategyPipeline.CreatePipeline(strategies); - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); context.CancellationToken = cancellation.Token; var result = await pipeline.ExecuteOutcomeAsync((_, _) => Outcome.FromResultAsTask("result"), context, "state"); diff --git a/test/Polly.Core.Tests/Utils/TimeProviderExtensionsTests.cs b/test/Polly.Core.Tests/Utils/TimeProviderExtensionsTests.cs index 0768eff9b7..b36badfc87 100644 --- a/test/Polly.Core.Tests/Utils/TimeProviderExtensionsTests.cs +++ b/test/Polly.Core.Tests/Utils/TimeProviderExtensionsTests.cs @@ -15,7 +15,7 @@ public async Task DelayAsync_System_Ok(bool synchronous, bool hasCancellation) var token = hasCancellation ? tcs.Token : default; var delay = TimeSpan.FromMilliseconds(10); var timeProvider = TimeProvider.System; - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); context.Initialize(isSynchronous: synchronous); context.CancellationToken = token; @@ -31,7 +31,7 @@ await TestUtilities.AssertWithTimeoutAsync(async () => public async Task DelayAsync_SystemSynchronous_Ok() { var delay = TimeSpan.FromMilliseconds(5); - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); context.Initialize(isSynchronous: true); await TestUtilities.AssertWithTimeoutAsync(async () => @@ -48,7 +48,7 @@ public async Task DelayAsync_SystemSynchronousWhenCancelled_Ok() { using var cts = new CancellationTokenSource(5); var delay = TimeSpan.FromMilliseconds(10); - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); context.Initialize(isSynchronous: true); context.CancellationToken = cts.Token; @@ -71,7 +71,7 @@ public async Task DelayAsync_CancellationRequestedBefore_Throws(bool synchronous var token = tcs.Token; var delay = TimeSpan.FromMilliseconds(10); var timeProvider = TimeProvider.System; - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); context.Initialize(isSynchronous: synchronous); context.CancellationToken = token; @@ -90,7 +90,7 @@ await TestUtilities.AssertWithTimeoutAsync(async () => using var tcs = new CancellationTokenSource(); var token = tcs.Token; var timeProvider = TimeProvider.System; - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); context.Initialize(isSynchronous: synchronous); context.CancellationToken = token; diff --git a/test/Polly.Extensions.Tests/Issues/IssuesTests.PartitionedRateLimiter_1365.cs b/test/Polly.Extensions.Tests/Issues/IssuesTests.PartitionedRateLimiter_1365.cs index 8b562d7d1c..011ed14a31 100644 --- a/test/Polly.Extensions.Tests/Issues/IssuesTests.PartitionedRateLimiter_1365.cs +++ b/test/Polly.Extensions.Tests/Issues/IssuesTests.PartitionedRateLimiter_1365.cs @@ -61,7 +61,7 @@ async Task ExecuteBatch(string user, ManualResetEvent waitAsserted) { return Task.Run(async () => { - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); context.Properties.Set(userKey, user); await strategy.ExecuteAsync(async _ => diff --git a/test/Polly.Extensions.Tests/ReloadableResilienceStrategyTests.cs b/test/Polly.Extensions.Tests/ReloadableResilienceStrategyTests.cs index b959da2273..56ebd93afe 100644 --- a/test/Polly.Extensions.Tests/ReloadableResilienceStrategyTests.cs +++ b/test/Polly.Extensions.Tests/ReloadableResilienceStrategyTests.cs @@ -39,7 +39,7 @@ public void AddResilienceStrategy_EnsureReloadable(string? name) var serviceProvider = services.BuildServiceProvider(); var strategy = serviceProvider.GetRequiredService>().GetStrategy("my-strategy"); - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); // initial strategy.Execute(_ => "dummy", context); diff --git a/test/Polly.Extensions.Tests/Telemetry/EnrichmentContextTests.cs b/test/Polly.Extensions.Tests/Telemetry/EnrichmentContextTests.cs index fc27953175..b081619155 100644 --- a/test/Polly.Extensions.Tests/Telemetry/EnrichmentContextTests.cs +++ b/test/Polly.Extensions.Tests/Telemetry/EnrichmentContextTests.cs @@ -9,11 +9,11 @@ public async Task Pooling_OK() { await TestUtilities.AssertWithTimeoutAsync(() => { - var context = EnrichmentContext.Get(ResilienceContext.Get(), null, null); + var context = EnrichmentContext.Get(ResilienceContextPool.Shared.Get(), null, null); EnrichmentContext.Return(context); - EnrichmentContext.Get(ResilienceContext.Get(), null, null).Should().BeSameAs(context); + EnrichmentContext.Get(ResilienceContextPool.Shared.Get(), null, null).Should().BeSameAs(context); }); } } diff --git a/test/Polly.Extensions.Tests/Telemetry/ResilienceTelemetryDiagnosticSourceTests.cs b/test/Polly.Extensions.Tests/Telemetry/ResilienceTelemetryDiagnosticSourceTests.cs index 0be077e7a0..111da9d94d 100644 --- a/test/Polly.Extensions.Tests/Telemetry/ResilienceTelemetryDiagnosticSourceTests.cs +++ b/test/Polly.Extensions.Tests/Telemetry/ResilienceTelemetryDiagnosticSourceTests.cs @@ -206,7 +206,7 @@ public void WriteEvent_MeteringWithoutEnrichers_Ok(bool noOutcome, bool exceptio true when exception => Outcome.FromException(new InvalidOperationException("Dummy message.")), _ => Outcome.FromResult(true) }; - ReportEvent(telemetry, outcome, context: ResilienceContext.Get("op-key").WithResultType()); + ReportEvent(telemetry, outcome, context: ResilienceContextPool.Shared.Get("op-key").WithResultType()); var events = GetEvents("resilience-events"); events.Should().HaveCount(1); @@ -246,7 +246,7 @@ public void WriteExecutionAttemptEvent_Metering_Ok(bool noOutcome, bool exceptio true when exception => Outcome.FromException(new InvalidOperationException("Dummy message.")), _ => Outcome.FromResult(true) }; - ReportEvent(telemetry, outcome, context: ResilienceContext.Get("op-key").WithResultType(), arg: attemptArg); + ReportEvent(telemetry, outcome, context: ResilienceContextPool.Shared.Get("op-key").WithResultType(), arg: attemptArg); var events = GetEvents("execution-attempt-duration"); events.Should().HaveCount(1); @@ -359,7 +359,7 @@ private static void ReportEvent( object? arg = null, ResilienceEventSeverity severity = ResilienceEventSeverity.Warning) { - context ??= ResilienceContext.Get("op-key"); + context ??= ResilienceContextPool.Shared.Get("op-key"); var props = new ResilienceProperties(); if (!string.IsNullOrEmpty(instanceName)) { diff --git a/test/Polly.Extensions.Tests/Telemetry/TelemetryOptionsTests.cs b/test/Polly.Extensions.Tests/Telemetry/TelemetryOptionsTests.cs index 6f21c4f047..81171c51a1 100644 --- a/test/Polly.Extensions.Tests/Telemetry/TelemetryOptionsTests.cs +++ b/test/Polly.Extensions.Tests/Telemetry/TelemetryOptionsTests.cs @@ -14,7 +14,7 @@ public void Ctor_EnsureDefaults() options.Enrichers.Should().BeEmpty(); options.LoggerFactory.Should().Be(NullLoggerFactory.Instance); - var resilienceContext = ResilienceContext.Get(); + var resilienceContext = ResilienceContextPool.Shared.Get(); options.ResultFormatter(resilienceContext, null).Should().BeNull(); options.ResultFormatter(resilienceContext, "dummy").Should().Be("dummy"); diff --git a/test/Polly.Extensions.Tests/Telemetry/TelemetryResilienceStrategyTests.cs b/test/Polly.Extensions.Tests/Telemetry/TelemetryResilienceStrategyTests.cs index 698d6b90c2..f268075abb 100644 --- a/test/Polly.Extensions.Tests/Telemetry/TelemetryResilienceStrategyTests.cs +++ b/test/Polly.Extensions.Tests/Telemetry/TelemetryResilienceStrategyTests.cs @@ -46,7 +46,7 @@ public void Execute_EnsureLogged(bool healthy) ((List)c.ResilienceEvents).Add(new ResilienceEvent(ResilienceEventSeverity.Warning, "dummy")); } }, - ResilienceContext.Get("op-key"), string.Empty); + ResilienceContextPool.Shared.Get("op-key"), string.Empty); var messages = _logger.GetRecords(new EventId(1, "StrategyExecuting")).ToList(); messages.Should().HaveCount(1); @@ -74,7 +74,7 @@ public void Execute_EnsureLogged(bool healthy) public void Execute_WithException_EnsureLogged() { var strategy = CreateStrategy(); - strategy.Invoking(s => s.Execute(_ => throw new InvalidOperationException("Dummy message."), ResilienceContext.Get("op-key"))).Should().Throw(); + strategy.Invoking(s => s.Execute(_ => throw new InvalidOperationException("Dummy message."), ResilienceContextPool.Shared.Get("op-key"))).Should().Throw(); var messages = _logger.GetRecords(new EventId(1, "StrategyExecuting")).ToList(); messages.Should().HaveCount(1); @@ -115,7 +115,7 @@ public void Execute_WithResult_EnsureEnrichmentContextWithCorrectOutcome() public void Execute_WithException_EnsureMetered() { var strategy = CreateStrategy(); - strategy.Invoking(s => s.Execute(_ => throw new InvalidOperationException("Dummy message."), ResilienceContext.Get("op-key"))).Should().Throw(); + strategy.Invoking(s => s.Execute(_ => throw new InvalidOperationException("Dummy message."), ResilienceContextPool.Shared.Get("op-key"))).Should().Throw(); var ev = _events.Single(v => v.Name == "strategy-execution-duration").Tags; @@ -160,7 +160,7 @@ public void Execute_WithResult_EnsureMetered(bool healthy) return true; }, - ResilienceContext.Get("op-key"), string.Empty); + ResilienceContextPool.Shared.Get("op-key"), string.Empty); var ev = _events.Single(v => v.Name == "strategy-execution-duration").Tags; @@ -203,7 +203,7 @@ public void Execute_ExecutionHealth(bool healthy) return true; }, - ResilienceContext.Get(), string.Empty); + ResilienceContextPool.Shared.Get(), string.Empty); var ev = _events.Single(v => v.Name == "strategy-execution-duration").Tags; diff --git a/test/Polly.RateLimiting.Tests/OnRateLimiterRejectedArgumentsTests.cs b/test/Polly.RateLimiting.Tests/OnRateLimiterRejectedArgumentsTests.cs index a013fe54b7..40dddb1032 100644 --- a/test/Polly.RateLimiting.Tests/OnRateLimiterRejectedArgumentsTests.cs +++ b/test/Polly.RateLimiting.Tests/OnRateLimiterRejectedArgumentsTests.cs @@ -8,7 +8,7 @@ public class OnRateLimiterRejectedArgumentsTests [Fact] public void Ctor_Ok() { - var args = new OnRateLimiterRejectedArguments(ResilienceContext.Get(), Mock.Of(), TimeSpan.FromSeconds(1)); + var args = new OnRateLimiterRejectedArguments(ResilienceContextPool.Shared.Get(), Mock.Of(), TimeSpan.FromSeconds(1)); args.Context.Should().NotBeNull(); args.Lease.Should().NotBeNull(); diff --git a/test/Polly.RateLimiting.Tests/RateLimiterResilienceStrategyBuilderExtensionsTests.cs b/test/Polly.RateLimiting.Tests/RateLimiterResilienceStrategyBuilderExtensionsTests.cs index 2321cb4b1d..0b5aace3e8 100644 --- a/test/Polly.RateLimiting.Tests/RateLimiterResilienceStrategyBuilderExtensionsTests.cs +++ b/test/Polly.RateLimiting.Tests/RateLimiterResilienceStrategyBuilderExtensionsTests.cs @@ -139,7 +139,7 @@ private static void AssertRateLimiter(ResilienceStrategyBuilder builder, bo { strategy.OnLeaseRejected.Should().NotBeNull(); strategy - .OnLeaseRejected!(new OnRateLimiterRejectedArguments(ResilienceContext.Get(), Mock.Of(), null)) + .OnLeaseRejected!(new OnRateLimiterRejectedArguments(ResilienceContextPool.Shared.Get(), Mock.Of(), null)) .Preserve().GetAwaiter().GetResult(); } else @@ -159,7 +159,7 @@ private static void AssertConcurrencyLimiter(ResilienceStrategyBuilder buil { strategy.OnLeaseRejected.Should().NotBeNull(); strategy - .OnLeaseRejected!(new OnRateLimiterRejectedArguments(ResilienceContext.Get(), Mock.Of(), null)) + .OnLeaseRejected!(new OnRateLimiterRejectedArguments(ResilienceContextPool.Shared.Get(), Mock.Of(), null)) .Preserve().GetAwaiter().GetResult(); } else diff --git a/test/Polly.RateLimiting.Tests/RateLimiterResilienceStrategyTests.cs b/test/Polly.RateLimiting.Tests/RateLimiterResilienceStrategyTests.cs index 5f12976026..42423ffd9f 100644 --- a/test/Polly.RateLimiting.Tests/RateLimiterResilienceStrategyTests.cs +++ b/test/Polly.RateLimiting.Tests/RateLimiterResilienceStrategyTests.cs @@ -70,7 +70,7 @@ public async Task Execute_LeaseRejected(bool hasEvents, bool hasRetryAfter) } var strategy = Create(); - var context = ResilienceContext.Get(cts.Token); + var context = ResilienceContextPool.Shared.Get(cts.Token); var outcome = await strategy.ExecuteOutcomeAsync((_, _) => Outcome.FromResultAsTask("dummy"), context, "state"); outcome.Exception diff --git a/test/Polly.RateLimiting.Tests/ResilienceRateLimiterTests.cs b/test/Polly.RateLimiting.Tests/ResilienceRateLimiterTests.cs index 33ee03b619..bb04942a87 100644 --- a/test/Polly.RateLimiting.Tests/ResilienceRateLimiterTests.cs +++ b/test/Polly.RateLimiting.Tests/ResilienceRateLimiterTests.cs @@ -16,7 +16,7 @@ public async Task Create_RateLimiter_Ok() var limiter = ResilienceRateLimiter.Create(limiterMock.Object); - (await limiter.AcquireAsync(ResilienceContext.Get())).Should().Be(lease); + (await limiter.AcquireAsync(ResilienceContextPool.Shared.Get())).Should().Be(lease); limiter.Limiter.Should().NotBeNull(); limiterMock.VerifyAll(); } @@ -24,7 +24,7 @@ public async Task Create_RateLimiter_Ok() [Fact] public async Task Create_PartitionedRateLimiter_Ok() { - var context = ResilienceContext.Get(); + var context = ResilienceContextPool.Shared.Get(); var lease = Mock.Of(); var limiterMock = new Mock>(MockBehavior.Strict); limiterMock.Protected().Setup>("AcquireAsyncCore", context, 1, default(CancellationToken)).ReturnsAsync(lease);