Exemplo n.º 1
0
        private TopologyTestDriver(InternalTopologyBuilder builder, IStreamConfig config)
        {
            this.topologyBuilder = builder;
            this.configuration   = config;

            // ONLY 1 thread for test driver
            this.configuration.NumStreamThreads = 1;
            this.configuration.Guarantee        = ProcessingGuarantee.AT_LEAST_ONCE;

            this.topicConfiguration = config.Clone();
            this.topicConfiguration.ApplicationId = $"test-driver-{this.configuration.ApplicationId}";

            var processID = Guid.NewGuid();
            var clientId  = string.IsNullOrEmpty(configuration.ClientId) ? $"{this.configuration.ApplicationId.ToLower()}-{processID}" : configuration.ClientId;

            this.configuration.ClientId = clientId;

            kafkaSupplier = new MockKafkaSupplier();
            pipeBuilder   = new PipeBuilder(kafkaSupplier);

            this.processorTopology = this.topologyBuilder.BuildTopology();

            this.threadTopology = StreamThread.Create(
                $"{this.configuration.ApplicationId.ToLower()}-stream-thread-0",
                clientId,
                builder,
                config,
                kafkaSupplier,
                kafkaSupplier.GetAdmin(configuration.ToAdminConfig($"{clientId}-admin")),
                0);

            RunDriver();
        }
        public async Task AsyncPipeAddAllTypesExecutorsWithSkip()
        {
            var execIncOne     = new IntModelIncrementOneEtor();
            var execIncTwo     = new IntModelIncrementTwoEtor();
            var execIncTwo1    = new IntModelIncrementTwoEtor();
            var funcExecIncOne = ExecutorFactory.GetFuncIntModelIncrementOneEtor();
            var funcExecIncTwo = ExecutorFactory.GetFuncIntModelIncrementTwoEtor();
            var funcDefault    = ExecutorFactory.GetFuncDefaultEtor();

            var pipe = PipeBuilder
                       .AsyncPipe <IntModel, int>()
                       .Executor(execIncOne).Label("exec_1").Add()
                       .Executor(execIncTwo, true).Label("exec_2").Add()
                       .Executor(execIncTwo1, false).Label("exec_21").Add() // skip
                       .Executor(funcExecIncOne).Label("exec_3").Add()
                       .Executor(funcExecIncTwo, true).Label("exec_4").Add()
                       .Executor(async(model) =>
            {
                var value      = await Task.FromResult <int>(10);
                model.Integer += value;
                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            }).Label("exec_5").Add()
                       .Executor((model) =>
            {
                model.Integer += 20;
                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            }).Label("exec_6").Add()
                       .Default(funcDefault).Add()
                       .Return((model, results) =>
            {
                if (results.Length < 7)
                {
                    return(PipeResult <int>
                           .DefaultUnSuccessful
                           .SetValue(model.Integer));
                }
                if (results.Sum(x => x.Value) < 136)
                {
                    return(PipeResult <int>
                           .DefaultUnSuccessful
                           .SetValue(model.Integer));
                }

                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            });

            var integer = new IntModel {
                Integer = 10
            };
            var result = await pipe.ExecuteAsync(integer);

            Assert.Equal(ExecutionResult.Successful, result.Success);
            Assert.True(result.Value >= 136);
        }
        public async Task AsyncPipeWithStopWatchAndRetry()
        {
            var execIncOne = new IntDelay50Etor();

            var pipe = PipeBuilder
                       .AsyncPipe <IntModel, double>()
                       .Cache(false)
                       .StopWatch(true)
                       .Executor(execIncOne)
                       .Label("exec_1")
                       .StopWatch()
                       .Add()
                       .Executor(async(model, cache) =>
            {
                await Task.Delay(50);
                int count = cache.GetSafely <int>("break_count") + 1;
                cache.SetOrUpdateSafely <int>("break_count", count);
                return(PipeResult <double>
                       .DefaultUnSuccessful
                       .SetValue(50));
            })
                       .Label("exec_2")
                       .IfFail().Retry(3, 100).Set()
                       .StopWatch()
                       .Add()
                       .Default((model, cache) =>
            {
                int count = cache.GetSafely <int>("break_count");
                return(PipeResult <double>
                       .DefaultSuccessful
                       .SetValue(count));
            }).Add()
                       .Return((model, results) =>
            {
                var sumElapsed = TimeSpan.FromMilliseconds(
                    results.Sum(x => x.Elapsed.TotalMilliseconds));
                if (results.FirstOrDefault(x => x.Label == "Default").Value.Value == 4)
                {
                    return(PipeResult <double>
                           .DefaultSuccessful
                           .SetValue(sumElapsed.TotalMilliseconds));
                }

                return(PipeResult <double>
                       .DefaultUnSuccessful
                       .SetValue(sumElapsed.TotalMilliseconds));
            });

            var integer = new IntModel {
                Integer = 0
            };
            var result = await pipe.ExecuteAsync(integer);

            Assert.Equal(ExecutionResult.Successful, result.Success);

            Assert.True(result.Value > 450);
            Assert.True(result.Elapsed.TotalMilliseconds > result.Value);
        }
        public async Task CreateAsyncPipeTest()
        {
            var pipe = PipeBuilder
                       .AsyncPipe <IntModel, bool>()
                       .Cache(false)
                       .Executor(x =>
            {
                x.Integer += 1;
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Label("FirstExecutor")
                       .Add()
                       .If(x => x.Integer > 0)
                       .Executor(x =>
            {
                x.Integer += 1;
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Label("SecondExecutor")
                       .Restricted(10, "SecondExecutor")
                       .StopWatch()
                       .ExecuteIf(x => x.Integer > 1)
                       .IfFail()
                       .Retry(3, 1000).Break(false).Set()
                       .IfOk()
                       .Return((m, r) => r).Set()
                       .Add()
                       .EndIf()
                       .Default((x, cache) =>
            {
                x.Integer += 100;
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Label("Default")
                       .Add()
                       .Return((model, results) =>
            {
                if (model.Integer >= 102)
                {
                    return(PipeResult <bool>
                           .DefaultSuccessful.SetValue(true));
                }
                return(PipeResult <bool>
                       .DefaultUnSuccessful);
            });

            Assert.IsAssignableFrom <IAsyncPipe <IntModel, bool> >(pipe);
            var integer = new IntModel {
                Integer = 10
            };
            var result = await pipe.ExecuteAsync(integer);

            Assert.True(result.Value.Value);
            Assert.Equal(ExecutionResult.Successful, result.Success);
        }
        public async Task AsyncPipeAddAllTypesWithCacheExecutors()
        {
            var execIncOne  = new IntModelIncrementOneEtor();
            var execIncTwo  = new IntModelIncrementTwoEtor();
            var funcDefault = ExecutorFactory.GetFuncDefaultCacheEtor();

            var pipe = PipeBuilder
                       .AsyncPipe <IntModel, int>()
                       .Cache(false)
                       .Executor(execIncOne).Label("exec_1").Add()
                       .Executor(execIncTwo).Label("exec_2").Add()
                       .Executor(async(model, cache) =>
            {
                var value      = await Task.FromResult <int>(10);
                model.Integer += value;
                cache.SetSafely <int>("3", model.Integer);
                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            }).Label("exec_5").Add()
                       .Executor((model, cache) =>
            {
                model.Integer += 20;
                cache.SetSafely <int>("4", model.Integer);
                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            }).Label("exec_6").Add()
                       .Default(funcDefault).Add()
                       .Return((model, results) =>
            {
                if (results.Length < 5)
                {
                    return(PipeResult <int>
                           .DefaultUnSuccessful
                           .SetValue(model.Integer));
                }
                if (results.Sum(x => x.Value) < 83)
                {
                    return(PipeResult <int>
                           .DefaultUnSuccessful
                           .SetValue(model.Integer));
                }

                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            });

            var integer = new IntModel {
                Integer = 0
            };
            var result = await pipe.ExecuteAsync(integer);

            Assert.Equal(ExecutionResult.Successful, result.Success);
            Assert.True(result.Value >= 83);
        }
        public static PipeDelegate <T> GetHandler <T>() where T : class
        {
            if (!Services.TryGetValue(typeof(T), out var services))
            {
                throw new InvalidOperationException($"type {typeof(T).FullName} is not configure");
            }

            return(PipeBuilder.Build <T>(services));
        }
Exemplo n.º 7
0
 public UploadFileHandler(
     ReaderAppContext dbContext,
     IAuthorizationService authService,
     IMapper mapper,
     IUserFileStore userFilesStore,
     IFileProcessedWordsCache filesWordsCache,
     ILemmatizer lemmatizer,
     IUserDictionary userDictionary,
     PipeBuilder pipeBuilder) : base(dbContext, authService, mapper) => (_userFilesStore, _filesWordsCache, _lemmatizer, _userDictionary, _pipeBuilder) = (userFilesStore, filesWordsCache, lemmatizer, userDictionary, pipeBuilder);
        public async Task AsyncPipeExecutorBreakIfFailedWithDefault()
        {
            var execIncOne = new IntModelIncrementOneEtor();
            var pipe       = PipeBuilder
                             .AsyncPipe <IntModel, int>()
                             .Cache(false)
                             .Executor(execIncOne).Label("exec_1").Add()
                             .Executor(async(model, cache) =>
            {
                model.Integer += 1;
                return(await Task.FromResult(PipeResult <int>
                                             .DefaultUnSuccessfulBreak
                                             .SetValue(model.Integer)));
            })
                             .Label("exec_2")
                             .IfFail().Break(true).Set()
                             .Add()
                             .Executor(async(model, cache) =>
            {
                model.Integer += 1;
                return(await Task.FromResult(PipeResult <int>
                                             .DefaultSuccessful
                                             .SetValue(model.Integer)));
            })
                             .Label("exec_3")
                             .Add()
                             .Default((model, cache) =>
            {
                model.Integer += 1;
                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            }).Add()
                             .Return((model, results) =>
            {
                if (results.Any(x => x.Label == "Default") &&
                    !results.Any(x => x.Label == "exec_3") &&
                    results.Length == 3)
                {
                    return(PipeResult <int>
                           .DefaultSuccessful
                           .SetValue(results.Max(x => x.Value.Value)));
                }

                return(PipeResult <int>
                       .DefaultUnSuccessful
                       .SetValue(results.Max(x => x.Value.Value)));
            });

            var result = await pipe.ExecuteAsync(new IntModel { Integer = 0 });

            Assert.Equal(ExecutionResult.Successful, result.Success);
            Assert.True(result.Value.Value == 3);
        }
Exemplo n.º 9
0
        public async Task ParallelPipeExecute()
        {
            var pipe = PipeBuilder
                       .AsyncParallelPipe <IntModel, bool>()
                       .Cache(true)
                       .StopWatch(true)
                       .Executor(async x =>
            {
                await Task.Delay(1000);
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Label("exc 1")
                       .Add()
                       .Executor(async x =>
            {
                await Task.Delay(1000);
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Label("exc 2")
                       .Add()
                       .Executor(async x =>
            {
                await Task.Delay(1000);
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Label("exc 3")
                       .Add()
                       .Executor(async x =>
            {
                await Task.Delay(1000);
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Label("exc 4")
                       .Add()
                       .Return((model, results) =>
            {
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            });

            Assert.IsAssignableFrom <IAsyncPipe <IntModel, bool> >(pipe);
            var integer = new IntModel {
                Integer = 10
            };
            var result = await pipe.ExecuteAsync(integer);

            Assert.True(result.Value.Value);
            Assert.Equal(ExecutionResult.Successful, result.Success);
            Assert.True(result.Elapsed < TimeSpan.FromSeconds(2));
        }
        public async Task AsyncPipeMultipleExecutionsWithCache()
        {
            var execIncOne = new IntModelIncrementOneEtor();
            var execIncTwo = new IntModelIncrementTwoEtor();
            var pipe       = PipeBuilder
                             .AsyncPipe <IntModel, int>()
                             .Cache(false)
                             .Executor((model, cache) =>
            {
                Assert.True(cache.GetSafely <int>("1") == 0);
                Assert.True(cache.GetSafely <int>("2") == 0);
                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            }).Label("exec_1").Add()
                             .Executor(execIncOne).Label("exec_2").Add()
                             .Executor(execIncTwo).Label("exec_3").Add()
                             .Default((model, cache) =>
            {
                Assert.True(cache.GetSafely <int>("1") == 1);
                Assert.True(cache.GetSafely <int>("2") == 3);
                cache.ClearSafely();
                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            }).Add()
                             .Return((model, results) =>
            {
                Assert.Contains(results, x => x.Label == "exec_1");
                Assert.Contains(results, x => x.Label == "exec_2");
                Assert.Contains(results, x => x.Label == "exec_3");
                Assert.Contains(results, x => x.Label == "Default");

                if (results.Length == 4)
                {
                    return(PipeResult <int>
                           .DefaultSuccessful
                           .SetValue(model.Integer));
                }

                return(PipeResult <int>
                       .DefaultUnSuccessful
                       .SetValue(model.Integer));
            });

            for (int i = 0; i < 5; i++)
            {
                var result = await pipe.ExecuteAsync(new IntModel { Integer = 0 });

                Assert.Equal(ExecutionResult.Successful, result.Success);
                Assert.True(result.Value.Value == 3);
            }
        }
Exemplo n.º 11
0
        public IPipe <TContext> Build()
        {
            var builder = new PipeBuilder <TContext>(_specifications.Count);

            var count = _specifications.Count;

            for (var index = 0; index < count; index++)
            {
                _specifications[index].Apply(builder);
            }

            return(builder.Build());
        }
Exemplo n.º 12
0
        public IPipe <TContext> Build()
        {
            ValidatePipeConfiguration();

            var builder = new PipeBuilder <TContext>();

            foreach (IPipeSpecification <TContext> configurator in _specifications)
            {
                configurator.Apply(builder);
            }

            return(builder.Build());
        }
Exemplo n.º 13
0
        public IConsumePipe BuildConsumePipe()
        {
            var filter = new DynamicFilter <ConsumeContext, Guid>(new ConsumeContextConverterFactory(), GetRequestId);

            var builder = new PipeBuilder <ConsumeContext>();

            foreach (IPipeSpecification <ConsumeContext> specification in _consumeContextSpecifications)
            {
                specification.Apply(builder);
            }

            builder.AddFilter(filter);

            return(new ConsumePipe(filter, builder.Build()));
        }
        public async Task AsyncPipeExecutorIfOkBreakAndReturn()
        {
            var execIncOne = new IntModelIncrementOneEtor();
            var pipe       = PipeBuilder
                             .AsyncPipe <IntModel, int>()
                             .Cache(false)
                             .Executor(execIncOne).Label("exec_1").Add()
                             .Executor(async(model, cache) =>
            {
                model.Integer += 1;
                return(await Task.FromResult(PipeResult <int>
                                             .DefaultSuccessfulBreak
                                             .SetValue(model.Integer)));
            })
                             .Label("exec_2")
                             .IfOk().Break(true).Return((m, r) => r.SetValue(444)).Set()
                             .Add()
                             .Executor(async(model, cache) =>
            {
                model.Integer += 1;
                return(await Task.FromResult(PipeResult <int>
                                             .DefaultSuccessful
                                             .SetValue(model.Integer)));
            })
                             .Label("exec_3")
                             .Add()
                             .Return((model, results) =>
            {
                Assert.Contains(results, x => x.Label == "exec_2");
                Assert.DoesNotContain(results, x => x.Label == "exec_3");

                if (results.Length == 2)
                {
                    return(PipeResult <int>
                           .DefaultSuccessful
                           .SetValue(results.Max(x => x.Value.Value)));
                }

                return(PipeResult <int>
                       .DefaultUnSuccessful
                       .SetValue(results.Max(x => x.Value.Value)));
            });

            var result = await pipe.ExecuteAsync(new IntModel { Integer = 0 });

            Assert.Equal(ExecutionResult.Successful, result.Success);
            Assert.True(result.Value.Value == 444);
        }
        public async Task AsyncPipeWithStopWatch()
        {
            var execIncOne = new Delay50Etor();
            var execIncTwo = new Delay100Etor();

            var pipe = PipeBuilder
                       .AsyncPipe <IntModel, TimeSpan>()
                       .StopWatch(true)
                       .Executor(execIncOne).Label("exec_1").StopWatch().Add()
                       .Executor(execIncTwo).Label("exec_2").StopWatch().Add()
                       .Executor(async(model, cache) =>
            {
                await Task.Delay(150);
                return(PipeResult <TimeSpan>
                       .DefaultSuccessful
                       .SetValue(TimeSpan.FromMilliseconds(150)));
            }).StopWatch().Label("exec_5").Add()
                       .Executor(async(model) =>
            {
                await Task.Delay(200);
                return(PipeResult <TimeSpan>
                       .DefaultSuccessful
                       .SetValue(TimeSpan.FromMilliseconds(200)));
            }).StopWatch().Label("exec_6").Add()
                       .Return((model, results) =>
            {
                var sumElapsed = TimeSpan.FromMilliseconds(
                    results.Sum(x => x.Elapsed.TotalMilliseconds));

                return(PipeResult <TimeSpan>
                       .DefaultSuccessful
                       .SetValue(sumElapsed));
            });

            var integer = new IntModel {
                Integer = 0
            };
            var result = await pipe.ExecuteAsync(integer);

            Assert.Equal(ExecutionResult.Successful, result.Success);
            Assert.True(result.Value.Value.TotalMilliseconds >= 500);
            Assert.True(result.Elapsed.TotalMilliseconds > result.Value.Value.TotalMilliseconds);
        }
Exemplo n.º 16
0
        public static void Main(string[] args)
        {
            Console.Title = EdgeTitle + EdgeVersion;

            if (Directory.Exists(IIOTFilePath))
            {
                DInfo = new(IIOTFilePath);
                DInfo.Delete(true);
            }

            DInfo = new DirectoryInfo(LocalFilePath).CreateSubdirectory(YamlBase.Protagonist.IIOTFileName);

            if (args.Length == 0 || args[0] != YamlBase.Protagonist.LocalName)
            {
                return;
            }

            FoundationProvider.ReadDocument();

            PipeBuilder.BuildAsync();

            CreateHostBuilder(args).Build().Run();
        }
Exemplo n.º 17
0
        public async Task PipeLineTest()
        {
            IPipeBuilder <PipeTestContext> pipe = new PipeBuilder <PipeTestContext>()
                                                  .Use(c =>
            {
                c.Msg   += "_1";
                c.Value += 1;
            }, "处理1")
                                                  .Use(async c => //100ms
            {
                await Task.Delay(1000);
                c.Msg   += "_2";
                c.Value += 2;
            }, "处理2")
                                                  .Use((c, t) => //1100ms
            {
                c.Msg += "_3";
#pragma warning disable AsyncFixer02 // Long-running or blocking operations inside an async method
                Thread.Sleep(1000);
#pragma warning restore AsyncFixer02 // Long-running or blocking operations inside an async method
                if (t.IsCancellationRequested)
                {
                    return;
                }
                c.Value += 3;
            }, "处理3")
                                                  .Use(async c => //2100ms
            {
                await Task.Delay(1000);
                c.Msg   += "_4";
                c.Value += 4;
            })
                                                  .UseSnapshotCloner(t =>
            {
                var s = JsonConvert.SerializeObject(t);
                var r = JsonConvert.DeserializeObject <PipeTestContext>(s);
                return(r);
            })
                                                  .Build();

            //full
            var rst = await pipe.RunAsync(new PipeTestContext("Test", 0), CancellationToken.None);

            rst.Body.Msg.Should().Be("Test_1_2_3_4");
            rst.Body.Value.Should().Be(10);

            rst.Snapshots.Count.Should().Be(4);

            rst.Snapshots[0].Body.Msg.Should().Be("Test");
            rst.Snapshots[1].Body.Msg.Should().Be("Test_1");
            rst.Snapshots[2].Body.Msg.Should().Be("Test_1_2");
            rst.Snapshots[3].Body.Msg.Should().Be("Test_1_2_3");

            rst.Snapshots[0].Body.Value.Should().Be(0);
            rst.Snapshots[1].Body.Value.Should().Be(1);
            rst.Snapshots[2].Body.Value.Should().Be(3);
            rst.Snapshots[3].Body.Value.Should().Be(6);

            var dt = rst.Snapshots[0].CreateTime;

            rst.Snapshots[1].CreateTime.Should().BeCloseTo(dt, 100);
            rst.Snapshots[2].CreateTime.Should().BeCloseTo(dt.AddSeconds(1), 100);
            rst.Snapshots[3].CreateTime.Should().BeCloseTo(dt.AddSeconds(2), 100);

            //800ms _1_2
            var rst800 = await pipe.RunAsync(new PipeTestContext("Test", 0), new CancellationTokenSource(800).Token);

            var rst800CreateTimes = rst800.Snapshots.Select(p => p.CreateTime);

            (rst800CreateTimes.Max() - rst800CreateTimes.Min()).TotalMilliseconds.Should()
            .BeGreaterThan(800);     //进入方法前不足800ms, 执行完毕后超过800ms, 快照间隔也超过了800ms

            rst800.Body.Msg.Should().Be("Test_1_2");
            rst800.Body.Value.Should().Be(3);

            //2100ms _1_2_3(第三步执行中断, 因此快照与数据不符)
            var rst1500 = await pipe.RunAsync(new PipeTestContext("Test", 0), new CancellationTokenSource(1500).Token);

            var rst1500CreateTimes = rst1500.Snapshots.Select(p => p.CreateTime);

            (rst1500CreateTimes.Max() - rst1500CreateTimes.Min()).TotalMilliseconds.Should().BeLessThan(1500);

            rst1500.Body.Msg.Should().Be("Test_1_2_3");
            rst1500.Body.Value.Should().Be(3); //执行中断, 因此不等于6

            Debugger.Break();
        }
        public async Task AsyncPipeIfEndIdWithNestedIf()
        {
            var execIncOne = new IntModelIncrementOneEtor();
            var pipe       = PipeBuilder
                             .AsyncPipe <IntModel, int>()
                             .Executor(execIncOne) // in pipe, will not be executed
                             .ExecuteIf(model => model.Integer > 0)
                             .Label("exec_1").Add()
                             .If(model => model.Integer == 0)
                             .Executor(execIncOne).Label("exec_2").Add()
                             .EndIf()
                             .Executor(execIncOne).Label("exec_3").Add()
                             .If(model => model.Integer > 0)
                             .Executor(execIncOne).Label("exec_3.1").Add()
                             .If(model => model.Integer > 100)
                             .Executor(execIncOne) // in pipe, will not be executed
                             .Label("exec_3.2")
                             .Add()
                             .EndIf()
                             .EndIf()
                             .If(model => model.Integer > 0)
                             .Executor(execIncOne).Label("exec_4").Add()
                             .If(false)
                             .Executor(execIncOne).Label("exec_4.1").Add() // excluded from pipe
                             .Executor(execIncOne).Label("exec_4.2").Add() // excluded from pipe
                             .EndIf()
                             .Executor(execIncOne)
                             .ExecuteIf(model => model.Integer > 0)
                             .Label("exec_4.3")
                             .Add()
                             .EndIf()
                             .Return((model, results) =>
            {
                Assert.Contains(results, x => x.Label == "exec_2");
                Assert.Contains(results, x => x.Label == "exec_3");
                Assert.Contains(results, x => x.Label == "exec_3.1");
                Assert.Contains(results, x => x.Label == "exec_4");
                Assert.Contains(results, x => x.Label == "exec_4.3");

                Assert.DoesNotContain(results, x => x.Label == "exec_1");
                Assert.DoesNotContain(results, x => x.Label == "exec_3.2");
                Assert.DoesNotContain(results, x => x.Label == "exec_4.1");
                Assert.DoesNotContain(results, x => x.Label == "exec_4.2");

                if (results.Length == 5)
                {
                    return(PipeResult <int>
                           .DefaultSuccessful
                           .SetValue(model.Integer));
                }

                return(PipeResult <int>
                       .DefaultUnSuccessful
                       .SetValue(model.Integer));
            });

            var result = await pipe.ExecuteAsync(new IntModel { Integer = 0 });

            Assert.Equal(ExecutionResult.Successful, result.Success);
            Assert.True(result.Value.Value == 5);
        }
Exemplo n.º 19
0
        public async Task ParallelPipeExecuteWithIfAndDefault()
        {
            var pipe = PipeBuilder
                       .AsyncParallelPipe <IntModel, bool>()
                       .StopWatch(true)
                       .If(x => x.Integer == 0)
                       .Executor(async x =>
            {
                await Task.Delay(1000);
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Label("exc 1")
                       .Add()
                       .If(x => x.Integer > 110) // in pipe, will not be executed
                       .Executor(async x =>
            {
                await Task.Delay(1000);
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Label("exc 2")
                       .Add()
                       .EndIf()
                       .Executor(async x =>
            {
                await Task.Delay(1000);
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Label("exc 3")
                       .Add()
                       .If(false) //excluded from pipe, will not be executed
                       .Executor(async x =>
            {
                await Task.Delay(1000);
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Label("exc 4")
                       .Add()
                       .EndIf()
                       .Executor(async x =>
            {
                await Task.Delay(1000);
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Label("exc 5")
                       .Add()
                       .EndIf()
                       .Default((x, cache) =>
            {
                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            })
                       .Add()
                       .Return((model, results) =>
            {
                Assert.True(results.Length == 4);
                Assert.Contains(results, x => x.Label == "exc 1");
                Assert.Contains(results, x => x.Label == "exc 3");
                Assert.Contains(results, x => x.Label == "exc 5");
                Assert.Contains(results, x => x.Label == "Default");
                Assert.DoesNotContain(results, x => x.Label == "exc 2");
                Assert.DoesNotContain(results, x => x.Label == "exc 4");

                return(PipeResult <bool>
                       .DefaultSuccessful.SetValue(true));
            });

            Assert.IsAssignableFrom <IAsyncPipe <IntModel, bool> >(pipe);
            var integer = new IntModel {
                Integer = 0
            };
            var result = await pipe.ExecuteAsync(integer);

            Assert.True(result.Value.Value);
            Assert.Equal(ExecutionResult.Successful, result.Success);
            Assert.True(result.Elapsed < TimeSpan.FromSeconds(2));
        }
Exemplo n.º 20
0
 private void Awake()
 {
     Instance = this;
 }
Exemplo n.º 21
0
 public SendPipeBuilder()
 {
     _messageTypeSendFilter = new MessageTypeSendFilter();
     _pipeBuilder           = new PipeBuilder <SendContext>();
 }
        public async Task AsyncPipeMultipleExecutionsWithRestriction()
        {
            var restriction  = new RestrictionTester();
            var execIncOne   = new IntModelIncrementOneEtor();
            var execIncTwo   = new IntModelIncrementTwoEtor();
            var execIncThree = new IntModelIncrementThreeEtor(restriction);

            var pipe = PipeBuilder
                       .AsyncPipe <IntModel, int>()
                       .Executor(execIncOne).Label("exec_1").Add()
                       .Executor(execIncTwo).Label("exec_2").Add()
                       .Executor(execIncThree).Label("exec_3")
                       .Restricted(3, "rest_1")
                       .Add()
                       .Return((model, results) =>
            {
                Assert.Equal(3, results.Length);
                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            });

            var execIncOne1   = new IntModelIncrementOneEtor();
            var execIncTwo1   = new IntModelIncrementTwoEtor();
            var execIncThree1 = new IntModelIncrementThreeEtor(restriction);

            var pipe1 = PipeBuilder
                        .AsyncPipe <IntModel, int>()
                        .Executor(execIncOne1).Label("exec_1").Add()
                        .Executor(execIncTwo1).Label("exec_2").Add()
                        .Executor(execIncThree1).Label("exec_3")
                        .Restricted(3, "rest_1")
                        .Add()
                        .Return((model, results) =>
            {
                Assert.Equal(3, results.Length);
                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            });

            var execIncOne2   = new IntModelIncrementOneEtor();
            var execIncTwo2   = new IntModelIncrementTwoEtor();
            var execIncThree2 = new IntModelIncrementThreeEtor(restriction);

            var pipe2 = PipeBuilder
                        .AsyncPipe <IntModel, int>()
                        .Executor(execIncOne2).Label("exec_1").Add()
                        .Executor(execIncTwo2).Label("exec_2").Add()
                        .Executor(execIncThree2).Label("exec_3")
                        .Restricted(3, "rest_1")
                        .Add()
                        .Return((model, results) =>
            {
                Assert.Equal(3, results.Length);
                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            });

            var execIncOne3   = new IntModelIncrementOneEtor();
            var execIncTwo3   = new IntModelIncrementTwoEtor();
            var execIncThree3 = new IntModelIncrementThreeEtor(restriction);

            var pipe3 = PipeBuilder
                        .AsyncPipe <IntModel, int>()
                        .Executor(execIncOne3).Label("exec_1").Add()
                        .Executor(execIncTwo3).Label("exec_2").Add()
                        .Executor(execIncThree3).Label("exec_3")
                        .Restricted(3, "rest_1")
                        .Add()
                        .Return((model, results) =>
            {
                Assert.Equal(3, results.Length);
                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            });

            var execIncOne4   = new IntModelIncrementOneEtor();
            var execIncTwo4   = new IntModelIncrementTwoEtor();
            var execIncThree4 = new IntModelIncrementThreeEtor(restriction);

            var pipe4 = PipeBuilder
                        .AsyncPipe <IntModel, int>()
                        .Executor(execIncOne4).Label("exec_1").Add()
                        .Executor(execIncTwo4).Label("exec_2").Add()
                        .Executor(execIncThree4).Label("exec_3")
                        .Restricted(3, "rest_1")
                        .Add()
                        .Return((model, results) =>
            {
                Assert.Equal(3, results.Length);
                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            });

            var length = 20;
            var array  = new int[length];

            for (int i = 0; i < length; i++)
            {
                var pipeTask = pipe.ExecuteAsync(new IntModel {
                    Integer = 0
                });
                var pipeTask1 = pipe1.ExecuteAsync(new IntModel {
                    Integer = 0
                });
                var pipeTask2 = pipe2.ExecuteAsync(new IntModel {
                    Integer = 0
                });
                var pipeTask3 = pipe3.ExecuteAsync(new IntModel {
                    Integer = 0
                });
                var pipeTask4 = pipe4.ExecuteAsync(new IntModel {
                    Integer = 0
                });

                var results = await Task.WhenAll(pipeTask, pipeTask1, pipeTask2, pipeTask3, pipeTask4);

                Assert.True(restriction.MaxCount < 4);
                array[i] = restriction.MaxCount;
            }
            var avg = array.Average();
            var max = array.Max();
        }
Exemplo n.º 23
0
 public ConsumePipeBuilder()
 {
     _messageTypeConsumeFilter = new MessageTypeConsumeFilter();
     _pipeBuilder = new PipeBuilder <ConsumeContext>();
 }
Exemplo n.º 24
0
 private void BuildPipe()
 {
     PipeBuilder.GetInstance().BuildPipe();
     landPanel.HideAll();
 }
Exemplo n.º 25
0
        public async Task ParralelSubPipe()
        {
            var subPipe = PipeBuilder
                          .AsyncParallelPipe <IntModel, int>()
                          .StopWatch(true)
                          .Executor(async(x, cache) =>
            {
                cache.SetSafely <int>("sub_1", 1);
                await Task.Delay(1000);
                return(PipeResult <int>
                       .DefaultSuccessful.SetValue(1));
            })
                          .Label("exc 1")
                          .Add()
                          .Executor(async(x, cache) =>
            {
                cache.SetSafely <int>("sub_2", 1);
                await Task.Delay(1000);
                return(PipeResult <int>
                       .DefaultSuccessful.SetValue(1));
            })
                          .Label("exc 2")
                          .Add()
                          .Executor(async(x, cache) =>
            {
                cache.SetSafely <int>("sub_3", 1);
                await Task.Delay(1000);
                return(PipeResult <int>
                       .DefaultSuccessful.SetValue(1));
            })
                          .Label("exc 3")
                          .Add()
                          .Return((model, results) =>
            {
                return(PipeResult <int>
                       .DefaultSuccessful.SetValue(1));
            })
                          .ToExecutor();

            var pipe = PipeBuilder
                       .AsyncPipe <IntModel, int>()
                       .StopWatch(true)
                       .Cache(true)
                       .Executor(async(x, cache) =>
            {
                cache.SetSafely <int>("pipe_1", 1);
                await Task.Delay(100);
                return(PipeResult <int>
                       .DefaultSuccessful.SetValue(1));
            })
                       .Label("exc 1")
                       .Add()
                       .Executor(async(x, cache) =>
            {
                cache.SetSafely <int>("pipe_2", 1);
                await Task.Delay(100);
                return(PipeResult <int>
                       .DefaultSuccessful.SetValue(1));
            })
                       .Label("exc 2")
                       .Add()
                       .Executor(subPipe)
                       .Label("sub_pipe")
                       .Add()
                       .Default((x, cache) =>
            {
                var sub1  = cache.GetSafely <int>("sub_1");
                var sub2  = cache.GetSafely <int>("sub_2");
                var sub3  = cache.GetSafely <int>("sub_3");
                var pipe1 = cache.GetSafely <int>("pipe_1");
                var pipe2 = cache.GetSafely <int>("pipe_2");

                return(PipeResult <int>
                       .DefaultSuccessful.SetValue(sub1 + sub2 + sub3 + pipe1 + pipe2));
            })
                       .Add()
                       .Return((model, results) =>
            {
                var sum = results
                          .FirstOrDefault(x => x.Label == "Default").Value.Value;

                Assert.Contains(results, x => x.Label == "sub_pipe");
                Assert.Equal(5, sum);

                return(PipeResult <int>
                       .DefaultSuccessful.SetValue(sum));
            });

            Assert.IsAssignableFrom <IAsyncPipe <IntModel, int> >(pipe);
            var integer = new IntModel {
                Integer = 10
            };
            var result = await pipe.ExecuteAsync(integer);

            Assert.Equal(5, result.Value.Value);
            Assert.Equal(ExecutionResult.Successful, result.Success);
            Assert.True(result.Elapsed < TimeSpan.FromSeconds(2));
        }
Exemplo n.º 26
0
 public ConsumePipeBuilder()
 {
     _filter      = new DynamicFilter <ConsumeContext, Guid>(new ConsumeContextConverterFactory(), GetRequestId);
     _pipeBuilder = new PipeBuilder <ConsumeContext>();
 }
Exemplo n.º 27
0
 public PublishPipeBuilder()
 {
     _messageTypePublishFilter = new MessageTypePublishFilter();
     _pipeBuilder = new PipeBuilder <PublishContext>();
 }