Example #1
0
        public void TestSetup()
        {
            request       = Request.Get("foo/bar");
            replicas      = Enumerable.Range(0, 10).Select(i => new Uri($"http://replica-{i}/")).ToArray();
            resultSources = replicas.ToDictionary(r => r, _ => new TaskCompletionSource <ReplicaResult>());
            parameters    = RequestParameters.Empty.WithConnectionTimeout(1.Seconds());

            sender = Substitute.For <IRequestSender>();
            sender
            .SendToReplicaAsync(Arg.Any <Uri>(), Arg.Any <Request>(), Arg.Any <TimeSpan?>(), Arg.Any <TimeSpan>(), Arg.Any <CancellationToken>())
            .Returns(info => resultSources[info.Arg <Uri>()].Task);

            delaySources           = replicas.Select(_ => new TaskCompletionSource <bool>()).ToList();
            delaySourcesEnumerator = delaySources.GetEnumerator();
            delaysPlanner          = Substitute.For <IForkingDelaysPlanner>();
            SetupDelaysPlanner();

            delaysProvider = Substitute.For <IForkingDelaysProvider>();
            SetupForkingDelays(1.Milliseconds());

            tokenSource = new CancellationTokenSource();
            token       = tokenSource.Token;

            strategy = new ForkingRequestStrategy(delaysProvider, delaysPlanner, 3);
        }
        internal ForkingRequestStrategy([NotNull] IForkingDelaysProvider delaysProvider, [NotNull] IForkingDelaysPlanner delaysPlanner, int maximumParallelism)
        {
            if (delaysProvider == null)
            {
                throw new ArgumentNullException(nameof(delaysProvider));
            }

            if (delaysPlanner == null)
            {
                throw new ArgumentNullException(nameof(delaysPlanner));
            }

            if (maximumParallelism <= 0)
            {
                throw new ArgumentOutOfRangeException(nameof(maximumParallelism), "Maximum parallelism level must be a positive number.");
            }

            this.delaysProvider     = delaysProvider;
            this.delaysPlanner      = delaysPlanner;
            this.maximumParallelism = maximumParallelism;
        }