Beispiel #1
0
        /// <summary>
        /// Parses a service command from a string with format "serviceCommandClassName property1 property2 ... propertyN"
        /// </summary>
        /// <param name="command"></param>
        /// <param name="resolver"></param>
        /// <returns></returns>
        public static IServiceCommand Parse(string command, IServiceCommandFactory resolver)
        {
            var cmdTokens = command.Split(' ');
            var cmdType   = cmdTokens[0];

            try
            {
                return(resolver.Get(cmdType, cmdTokens.Skip(1).ToArray()));
            }
            catch (Exception e)
            {
                throw new ServiceCommandNotFound("Could not resolve cmd '{0}' with options '{1}' because {2}", cmdType, cmdTokens.Skip(1).ToStringEach(), e.Message);
            }
        }
Beispiel #2
0
        public static IObservable <StartUnitTest> StartIntegrationTest(string testExpression, IServiceCommandFactory cmds, IObservable <UnitTestResult> results)
        {
            var serial = testExpression.Split(Environment.NewLine, StringSplitOptions.RemoveEmptyEntries).Select(t => t.Trim()).Where(t => !t.IsNullOrWhitespace()).ToArray();

            var stageNo = 0;

            return(Rxn.Create <StartUnitTest>(o =>
            {
                var resources = new CompositeDisposable();

                return serial
                .SelectMany(cmd =>
                {
                    var stageTrigger = new Subject <Unit>();

                    var parallel = cmd.Split(',', StringSplitOptions.RemoveEmptyEntries)
                                   .SelectMany(t =>
                    {
                        var testSytax = t.Split(';', StringSplitOptions.RemoveEmptyEntries);

                        return Enumerable.Range(0, Int32.Parse(testSytax.Skip(1).FirstOrDefault().IsNullOrWhiteSpace("1"), NumberStyles.Any)).Select(_ => testSytax.Length > 0 ? testSytax[0].Trim() : string.Empty);
                    })
                                   .Select(action =>
                    {
                        var tokens = action.Split(' ', StringSplitOptions.RemoveEmptyEntries);
                        return cmds.Get(tokens.First(), tokens.Skip(1));
                    })
                                   .ToArray();

                    if (parallel.Length < 1)
                    {
                        return new Unit().ToObservable();
                    }

                    $"Starting stage {++stageNo} with {parallel.Length} tests in parallel".LogDebug();

                    var expectedResultIds = parallel.Select(t => t.Id).ToList();

                    results.Synchronize().Where(tr =>
                    {
                        if (expectedResultIds.Contains(tr.InResponseTo))
                        {
                            expectedResultIds.Remove(tr.InResponseTo);
                        }

                        if (expectedResultIds.Count < 1)
                        {
                            $"Stage {stageNo} complete".LogDebug();
                            stageTrigger.OnNext(new Unit());
                            stageTrigger.OnCompleted();
                            return true;
                        }

                        return false;
                    })
                    .FirstOrDefaultAsync()
                    .Until()
                    .DisposedBy(resources);

                    parallel.ForEach(t => o.OnNext((StartUnitTest)t));

                    return stageTrigger;
                })
                .Where(_ => stageNo >= serial.Length)
                .FirstOrDefaultAsync()
                .Do(_ => o.OnCompleted())
                .FinallyR(() => resources.Dispose())
                .Until()
                ;
            }));
        }