Пример #1
0
        public void RetryConcat_tolerate_killswitch_terminations_inside_the_flow_after_start()
        {
            var innerFlow = RetryFlow <int>().ViaMaterialized(KillSwitches.Single <Tuple <Result <int>, int> >(), Keep.Right);

            var t = this.SourceProbe <int>()
                    .Select(i => Tuple.Create(i, i * i))
                    .ViaMaterialized(Retry.Concat(100, innerFlow, x =>
            {
                if (x % 4 == 0)
                {
                    return new[] { Tuple.Create(x / 2, x / 4) }
                }
                ;
                var sqrt = (int)Math.Sqrt(x);
                return(new[] { Tuple.Create(sqrt, x) });
            }), Keep.Both)
                    .ToMaterialized(this.SinkProbe <Tuple <Result <int>, int> >(), Keep.Both)
                    .Run(Sys.Materializer());

            var source     = t.Item1.Item1;
            var killSwitch = t.Item1.Item2;
            var sink       = t.Item2;

            sink.Request(99);
            source.SendNext(1);
            sink.ExpectNext().Item1.Value.Should().Be(2);
            source.SendNext(2);
            sink.ExpectNext().Item1.Value.Should().Be(2);
            killSwitch.Abort(FailedElement.Exception);
            sink.ExpectError().InnerException.Should().Be(FailedElement.Exception);
        }
Пример #2
0
        public void RetryConcat_squares_by_division()
        {
            var t = this.SourceProbe <int>()
                    .Select(i => Tuple.Create(i, i * i))
                    .Via(Retry.Concat(100, RetryFlow <int>(), x =>
            {
                if (x % 4 == 0)
                {
                    return new[] { Tuple.Create(x / 2, x / 4) }
                }
                ;
                var sqrt = (int)Math.Sqrt(x);
                return(new[] { Tuple.Create(sqrt, x) });
            }))
                    .ToMaterialized(this.SinkProbe <Tuple <Result <int>, int> >(), Keep.Both)
                    .Run(Sys.Materializer());

            var source = t.Item1;
            var sink   = t.Item2;

            sink.Request(99);
            source.SendNext(1);
            sink.ExpectNext().Item1.Value.Should().Be(2);
            source.SendNext(2);
            sink.ExpectNext().Item1.Value.Should().Be(2);
            source.SendNext(4);
            sink.ExpectNext().Item1.Value.Should().Be(2);
            sink.ExpectNoMsg(TimeSpan.FromSeconds(3));
            source.SendComplete();
            sink.ExpectComplete();
        }
Пример #3
0
        public void RetryConcat_tolerate_killswitch_terminations_inside_the_flow_on_start()
        {
            var t = this.SourceProbe <int>()
                    .ViaMaterialized(KillSwitches.Single <int>(), Keep.Right)
                    .Select(i => Tuple.Create(i, i))
                    .Via(Retry.Concat(100, RetryFlow <int>(), x => new[] { Tuple.Create(x, x + 1) }))
                    .ToMaterialized(this.SinkProbe <Tuple <Result <int>, int> >(), Keep.Both)
                    .Run(Sys.Materializer());

            var killSwitch = t.Item1;
            var sink       = t.Item2;

            sink.Request(99);
            killSwitch.Abort(FailedElement.Exception);
            sink.ExpectError().InnerException.Should().Be(FailedElement.Exception);
        }
Пример #4
0
        public void RetryConcat_should_concat_incremented_ints_and_modulo_3_incremented_ints_from_retries()
        {
            var t = this.SourceProbe <int>()
                    .Select(i => Tuple.Create(i, i))
                    .Via(Retry.Concat(100, RetryFlow <int>(), os =>
            {
                var s = (os + 1) % 3;
                if (os < 42)
                {
                    return new[] { Tuple.Create(os + 1, os + 1), Tuple.Create(s, s) }
                }
                ;
                if (os == 42)
                {
                    return(new Tuple <int, int> [0]);
                }
                return(null);
            }))
                    .ToMaterialized(this.SinkProbe <Tuple <Result <int>, int> >(), Keep.Both)
                    .Run(Sys.Materializer());

            var source = t.Item1;
            var sink   = t.Item2;

            sink.Request(99);
            source.SendNext(1);
            sink.ExpectNext().Item1.Value.Should().Be(2);
            source.SendNext(2);
            sink.ExpectNext().Item1.Value.Should().Be(4);
            sink.ExpectNext().Item1.Value.Should().Be(2);
            sink.ExpectNext().Item1.Value.Should().Be(2);
            source.SendNext(44);
            sink.ExpectNext().Item1.Value.Should().Be(FailedElement.Value);
            source.SendNext(42);
            sink.ExpectNoMsg();
            source.SendComplete();
            sink.ExpectComplete();
        }
Пример #5
0
        public void RetryConcat_should_swallow_failed_elements_that_are_retried_with_an_empty_seq()
        {
            var t = this.SourceProbe <int>()
                    .Select(i => Tuple.Create(i, i))
                    .Via(Retry.Concat(100, RetryFlow <int>(), _ => Enumerable.Empty <Tuple <int, int> >()))
                    .ToMaterialized(this.SinkProbe <Tuple <Result <int>, int> >(), Keep.Both)
                    .Run(Sys.Materializer());

            var source = t.Item1;
            var sink   = t.Item2;

            sink.Request(99);
            source.SendNext(1);
            sink.ExpectNext().Item1.Value.Should().Be(2);
            source.SendNext(2);
            sink.ExpectNoMsg();
            source.SendNext(3);
            sink.ExpectNext().Item1.Value.Should().Be(4);
            source.SendNext(4);
            sink.ExpectNoMsg();
            source.SendComplete();
            sink.ExpectComplete();
        }