コード例 #1
0
        private async Task ActionListExecutor_SecondActionFail(bool waitForCompletion)
        {
            await TestHostHelper.CreateCollectionRulesHost(_outputHelper, rootOptions =>
            {
                rootOptions.CreateCollectionRule(DefaultRuleName)
                .AddExecuteActionAppAction(waitForCompletion, new string[] { ActionTestsConstants.ZeroExitCode })
                .AddExecuteActionAppAction(waitForCompletion, new string[] { ActionTestsConstants.NonzeroExitCode })
                .SetStartupTrigger();
            }, async host =>
            {
                ActionListExecutor executor = host.Services.GetService <ActionListExecutor>();

                using CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(DefaultTimeout);

                CollectionRuleOptions ruleOptions      = host.Services.GetRequiredService <IOptionsMonitor <CollectionRuleOptions> >().Get(DefaultRuleName);
                ILogger <CollectionRuleService> logger = host.Services.GetRequiredService <ILogger <CollectionRuleService> >();
                ISystemClock clock = host.Services.GetRequiredService <ISystemClock>();

                CollectionRuleContext context = new(DefaultRuleName, ruleOptions, null, logger, clock);

                int callbackCount    = 0;
                Action startCallback = () => callbackCount++;

                CollectionRuleActionExecutionException actionExecutionException = await Assert.ThrowsAsync <CollectionRuleActionExecutionException>(
                    () => executor.ExecuteActions(context, startCallback, cancellationTokenSource.Token));

                Assert.Equal(1, actionExecutionException.ActionIndex);

                Assert.Equal(string.Format(Strings.ErrorMessage_NonzeroExitCode, "1"), actionExecutionException.Message);

                VerifyStartCallbackCount(waitForCompletion, callbackCount);
            });
        }
コード例 #2
0
        public async Task ActionListExecutor_AllActionsSucceed()
        {
            await TestHostHelper.CreateCollectionRulesHost(_outputHelper, rootOptions =>
            {
                rootOptions.CreateCollectionRule(DefaultRuleName)
                .AddExecuteActionAppAction(new string[] { ActionTestsConstants.ZeroExitCode })
                .AddExecuteActionAppAction(new string[] { ActionTestsConstants.ZeroExitCode })
                .SetStartupTrigger();
            }, async host =>
            {
                ActionListExecutor executor = host.Services.GetService <ActionListExecutor>();

                using CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(DefaultTimeout);

                CollectionRuleOptions ruleOptions      = host.Services.GetRequiredService <IOptionsMonitor <CollectionRuleOptions> >().Get(DefaultRuleName);
                ILogger <CollectionRuleService> logger = host.Services.GetRequiredService <ILogger <CollectionRuleService> >();
                ISystemClock clock = host.Services.GetRequiredService <ISystemClock>();

                CollectionRuleContext context = new(DefaultRuleName, ruleOptions, null, logger, clock);

                int callbackCount    = 0;
                Action startCallback = () => callbackCount++;

                await executor.ExecuteActions(context, startCallback, cancellationTokenSource.Token);

                VerifyStartCallbackCount(waitForCompletion: false, callbackCount);
            });
        }
コード例 #3
0
        public async Task ActionListExecutor_Dependencies()
        {
            const string Output1 = nameof(Output1);
            const string Output2 = nameof(Output2);
            const string Output3 = nameof(Output3);

            string a2input1 = FormattableString.Invariant($"$(Actions.a1.{Output1}) with $(Actions.a1.{Output2})T");
            string a2input2 = FormattableString.Invariant($"$(Actions.a1.{Output2})");
            string a2input3 = FormattableString.Invariant($"Output $(Actions.a1.{Output3}) trail");

            PassThroughOptions a2Settings = null;

            await TestHostHelper.CreateCollectionRulesHost(_outputHelper, rootOptions =>
            {
                CollectionRuleOptions options = rootOptions.CreateCollectionRule(DefaultRuleName)
                                                .AddPassThroughAction("a1", "a1input1", "a1input2", "a1input3")
                                                .AddPassThroughAction("a2", a2input1, a2input2, a2input3)
                                                .SetStartupTrigger();

                a2Settings = (PassThroughOptions)options.Actions.Last().Settings;
            }, async host =>
            {
                ActionListExecutor executor = host.Services.GetService <ActionListExecutor>();

                using CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(DefaultTimeout);

                CollectionRuleOptions ruleOptions      = host.Services.GetRequiredService <IOptionsMonitor <CollectionRuleOptions> >().Get(DefaultRuleName);
                ILogger <CollectionRuleService> logger = host.Services.GetRequiredService <ILogger <CollectionRuleService> >();
                ISystemClock clock = host.Services.GetRequiredService <ISystemClock>();

                CollectionRuleContext context = new(DefaultRuleName, ruleOptions, null, logger, clock);

                int callbackCount    = 0;
                Action startCallback = () => callbackCount++;

                IDictionary <string, CollectionRuleActionResult> results = await executor.ExecuteActions(context, startCallback, cancellationTokenSource.Token);

                //Verify that the original settings were not altered during execution.
                Assert.Equal(a2input1, a2Settings.Input1);
                Assert.Equal(a2input2, a2Settings.Input2);
                Assert.Equal(a2input3, a2Settings.Input3);

                Assert.Equal(1, callbackCount);
                Assert.Equal(2, results.Count);
                Assert.True(results.TryGetValue("a2", out CollectionRuleActionResult a2result));
                Assert.Equal(3, a2result.OutputValues.Count);

                Assert.True(a2result.OutputValues.TryGetValue(Output1, out string a2output1));
                Assert.Equal("a1input1 with a1input2T", a2output1);
                Assert.True(a2result.OutputValues.TryGetValue(Output2, out string a2output2));
                Assert.Equal("a1input2", a2output2);
                Assert.True(a2result.OutputValues.TryGetValue(Output3, out string a2output3));
                Assert.Equal("Output a1input3 trail", a2output3);
            }, serviceCollection =>
            {
                serviceCollection.RegisterCollectionRuleAction <PassThroughActionFactory, PassThroughOptions>(nameof(PassThroughAction));
            });
        }
コード例 #4
0
 public CollectionRulePipeline(
     ActionListExecutor actionListExecutor,
     ICollectionRuleTriggerOperations triggerOperations,
     CollectionRuleContext context,
     Action startCallback)
 {
     _actionListExecutor = actionListExecutor ?? throw new ArgumentNullException(nameof(actionListExecutor));
     _context            = context ?? throw new ArgumentNullException(nameof(context));
     _startCallback      = startCallback;
     _triggerOperations  = triggerOperations ?? throw new ArgumentNullException(nameof(triggerOperations));
 }
コード例 #5
0
        private async Task ExecuteScenario(
            TargetFrameworkMoniker tfm,
            string scenarioName,
            string collectionRuleName,
            Action <Tools.Monitor.RootOptions> setup,
            Func <AppRunner, CollectionRulePipeline, PipelineCallbacks, Task> pipelineCallback,
            Action <IServiceCollection> servicesCallback = null)
        {
            EndpointInfoSourceCallback endpointInfoCallback = new(_outputHelper);
            EndpointUtilities          endpointUtilities    = new(_outputHelper);

            await using ServerSourceHolder sourceHolder = await endpointUtilities.StartServerAsync(endpointInfoCallback);

            AppRunner runner = new(_outputHelper, Assembly.GetExecutingAssembly(), tfm : tfm);

            runner.ConnectionMode     = DiagnosticPortConnectionMode.Connect;
            runner.DiagnosticPortPath = sourceHolder.TransportName;
            runner.ScenarioName       = scenarioName;

            Task <IEndpointInfo> endpointInfoTask = endpointInfoCallback.WaitAddedEndpointInfoAsync(runner, CommonTestTimeouts.StartProcess);

            await runner.ExecuteAsync(async() =>
            {
                IEndpointInfo endpointInfo = await endpointInfoTask;

                await TestHostHelper.CreateCollectionRulesHost(
                    _outputHelper,
                    setup,
                    async host =>
                {
                    ActionListExecutor actionListExecutor =
                        host.Services.GetRequiredService <ActionListExecutor>();
                    ICollectionRuleTriggerOperations triggerOperations =
                        host.Services.GetRequiredService <ICollectionRuleTriggerOperations>();
                    IOptionsMonitor <CollectionRuleOptions> optionsMonitor =
                        host.Services.GetRequiredService <IOptionsMonitor <CollectionRuleOptions> >();
                    ILogger <CollectionRuleService> logger =
                        host.Services.GetRequiredService <ILogger <CollectionRuleService> >();
                    ISystemClock clock =
                        host.Services.GetRequiredService <ISystemClock>();

                    PipelineCallbacks callbacks = new();

                    CollectionRuleContext context = new(
                        collectionRuleName,
                        optionsMonitor.Get(collectionRuleName),
                        endpointInfo,
                        logger,
                        clock,
                        callbacks.NotifyActionsThrottled);

                    await using CollectionRulePipeline pipeline = new(
                                    actionListExecutor,
                                    triggerOperations,
                                    context,
                                    callbacks.NotifyPipelineStarted);

                    await pipelineCallback(runner, pipeline, callbacks);

                    Assert.Equal(1, callbacks.StartedCount);
                },
                    servicesCallback);
            });
        }