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); }); }
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); }); }
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)); }); }
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)); }
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); }); }