From 97ae62f5df81afc8376b2b38ad3761ca2110ba28 Mon Sep 17 00:00:00 2001 From: dadhi Date: Sun, 26 Mar 2023 18:36:58 +0200 Subject: [PATCH] revert the wrong CreateForValidation change; better tests for #116 --- src/DryIoc/Container.cs | 2 +- ...ators_goes_wrong_for_parallel_execution.cs | 28 ++++++++----------- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/src/DryIoc/Container.cs b/src/DryIoc/Container.cs index c9534e73..b7f82420 100644 --- a/src/DryIoc/Container.cs +++ b/src/DryIoc/Container.cs @@ -9561,7 +9561,7 @@ internal static Request CreateForValidation(Container container, ServiceInfo ser { var req = RentRequestOrNull(); return req == null - ? new Request(container, Empty, 1, 0, depRequestStack, RequestFlags.IsResolutionCall, serviceInfo, serviceInfo.GetActualServiceType(), null) + ? req = new Request(container, Empty, 1, 0, depRequestStack, RequestFlags.IsResolutionCall, serviceInfo, serviceInfo.GetActualServiceType(), null) : req.SetServiceInfo(container, Empty, 1, 0, depRequestStack, RequestFlags.IsResolutionCall, serviceInfo, serviceInfo.GetActualServiceType(), null); } diff --git a/test/DryIoc.IssuesTests/GHIssue116_ReOpened_DryIoc_Resolve_with_decorators_goes_wrong_for_parallel_execution.cs b/test/DryIoc.IssuesTests/GHIssue116_ReOpened_DryIoc_Resolve_with_decorators_goes_wrong_for_parallel_execution.cs index c83c6cb2..aa16da3a 100644 --- a/test/DryIoc.IssuesTests/GHIssue116_ReOpened_DryIoc_Resolve_with_decorators_goes_wrong_for_parallel_execution.cs +++ b/test/DryIoc.IssuesTests/GHIssue116_ReOpened_DryIoc_Resolve_with_decorators_goes_wrong_for_parallel_execution.cs @@ -18,36 +18,30 @@ interface IQuery { } class Query : IQuery { }; class QueryDecorator : IQuery { - public QueryDecorator(IQuery decoratee) { } + public readonly IQuery Decoratee; + public QueryDecorator(IQuery decoratee) => Decoratee = decoratee; } public async Task DryIoc_Resolve_parallel_execution_on_repeat(int repeatCount) { for (var i = 0; i < repeatCount; i++) - await DryIoc_Resolve_parallel_execution(); + await DryIoc_Resolve_parallel_execution(i); } // [Test, Repeat(10)] - public async Task DryIoc_Resolve_parallel_execution() + public async Task DryIoc_Resolve_parallel_execution(int iter) { - var container = new Container(); + var container = new Container(Rules.Default.WithoutInterpretationForTheFirstResolution()); - container.Register(typeof(IQuery), typeof(Query)); + container.Register(typeof(IQuery), typeof(Query)); container.Register(typeof(IQuery), typeof(QueryDecorator), setup: Setup.Decorator); - IQuery ResolveInScope() - { - using (var scope = container.OpenScope()) - { - return scope.Resolve>(); - } - } - + // const int tasksCount = 1; const int tasksCount = 32; var tasks = new Task>[tasksCount]; for (var i = 0; i < tasks.Length; i++) - tasks[i] = Task.Run(() => ResolveInScope()); + tasks[i] = Task.Run(() => container.Resolve>()); await Task.WhenAll(tasks); @@ -55,12 +49,12 @@ IQuery ResolveInScope() var sb = new StringBuilder(tasks.Length); for (var i = 0; i < tasks.Length; i++) { - var success = tasks[i].Result is QueryDecorator; - if (!success) failed = true; + var success = tasks[i].Result is QueryDecorator r && r.Decoratee is QueryDecorator == false; + failed |= !success; sb.Append(success ? '_' : 'F'); } - Assert.IsFalse(failed, $"Some tasks are failed [{sb}]"); + Assert.IsFalse(failed, $"Some of {tasks.Length} tasks are failed [{sb}] on iteration {iter}"); } } }