public async Task ExecuteAction_TextFileOutput() { using TemporaryDirectory outputDirectory = new(_outputHelper); string textFileOutputPath = Path.Combine(outputDirectory.FullName, "file.txt"); const string testMessage = "TestMessage"; await ValidateAction( options => { options.Path = DotNetHost.HostExePath; options.Arguments = ExecuteActionTestHelper.GenerateArgumentsString(new string[] { ActionTestsConstants.TextFileOutput, textFileOutputPath, testMessage }); }, async (action, token) => { await action.StartAsync(token); CollectionRuleActionResult result = await action.WaitForCompletionAsync(token); ValidateActionResult(result, "0"); }); Assert.Equal(testMessage, File.ReadAllText(textFileOutputPath)); }
private async Task PerformTrace(IHost host, TargetFrameworkMoniker tfm) { CollectTraceOptions options = ActionTestsHelper.GetActionOptions <CollectTraceOptions>(host, DefaultRuleName); ICollectionRuleActionFactoryProxy factory; Assert.True(host.Services.GetService <ICollectionRuleActionOperations>().TryCreateFactory(KnownCollectionRuleActions.CollectTrace, out factory)); EndpointInfoSourceCallback callback = new(_outputHelper); await using ServerSourceHolder sourceHolder = await _endpointUtilities.StartServerAsync(callback); AppRunner runner = _endpointUtilities.CreateAppRunner(sourceHolder.TransportName, tfm); Task <IEndpointInfo> newEndpointInfoTask = callback.WaitAddedEndpointInfoAsync(runner, CommonTestTimeouts.StartProcess); await runner.ExecuteAsync(async() => { IEndpointInfo endpointInfo = await newEndpointInfoTask; ICollectionRuleAction action = factory.Create(endpointInfo, options); CollectionRuleActionResult result = await ActionTestsHelper.ExecuteAndDisposeAsync(action, CommonTestTimeouts.TraceTimeout); string egressPath = ActionTestsHelper.ValidateEgressPath(result); using FileStream traceStream = new(egressPath, FileMode.Open, FileAccess.Read); Assert.NotNull(traceStream); await ValidateTrace(traceStream); await runner.SendCommandAsync(TestAppScenarios.AsyncWait.Commands.Continue); }); }
internal static string ValidateEgressPath(CollectionRuleActionResult result) { Assert.NotNull(result.OutputValues); Assert.True(result.OutputValues.TryGetValue(CollectionRuleActionConstants.EgressPathOutputValueName, out string egressPath)); Assert.True(File.Exists(egressPath)); return(egressPath); }
private static void ValidateActionResult(CollectionRuleActionResult result, string expectedExitCode) { string actualExitCode; Assert.NotNull(result.OutputValues); Assert.True(result.OutputValues.TryGetValue("ExitCode", out actualExitCode)); Assert.Equal(expectedExitCode, actualExitCode); }
public async Task TestGetEnvVar(TargetFrameworkMoniker tfm) { const string VariableDoesNotExist = "SomeEnvVarThatIsNotSet"; await TestHostHelper.CreateCollectionRulesHost( outputHelper : _outputHelper, setup : (Tools.Monitor.RootOptions rootOptions) => { rootOptions.CreateCollectionRule(DefaultRuleName) .SetStartupTrigger() .AddGetEnvironmentVariableAction(TestAppScenarios.EnvironmentVariables.IncrementVariableName) .AddGetEnvironmentVariableAction(VariableDoesNotExist); }, hostCallback : async(Extensions.Hosting.IHost host) => { GetEnvironmentVariableOptions getOpts = ActionTestsHelper.GetActionOptions <GetEnvironmentVariableOptions>(host, DefaultRuleName, 0); GetEnvironmentVariableOptions getFailOpts = ActionTestsHelper.GetActionOptions <GetEnvironmentVariableOptions>(host, DefaultRuleName, 1); ICollectionRuleActionOperations actionOperationsService = host.Services.GetService <ICollectionRuleActionOperations>(); Assert.True(actionOperationsService.TryCreateFactory(KnownCollectionRuleActions.GetEnvironmentVariable, out ICollectionRuleActionFactoryProxy getFactory)); EndpointInfoSourceCallback endpointInfoCallback = new(_outputHelper); await using ServerSourceHolder sourceHolder = await _endpointUtilities.StartServerAsync(endpointInfoCallback); AppRunner runner = _endpointUtilities.CreateAppRunner(sourceHolder.TransportName, tfm); runner.ScenarioName = TestAppScenarios.EnvironmentVariables.Name; Task <IEndpointInfo> newEndpointInfoTask = endpointInfoCallback.WaitAddedEndpointInfoAsync(runner, CommonTestTimeouts.StartProcess); await runner.ExecuteAsync(async() => { IEndpointInfo endpointInfo = await newEndpointInfoTask; ICollectionRuleAction getAction = getFactory.Create(endpointInfo, getOpts); await runner.SendCommandAsync(TestAppScenarios.EnvironmentVariables.Commands.IncVar); Assert.Equal("1", await runner.GetEnvironmentVariable(TestAppScenarios.EnvironmentVariables.IncrementVariableName, CommonTestTimeouts.EnvVarsTimeout)); await runner.SendCommandAsync(TestAppScenarios.EnvironmentVariables.Commands.IncVar); Assert.Equal("2", await runner.GetEnvironmentVariable(TestAppScenarios.EnvironmentVariables.IncrementVariableName, CommonTestTimeouts.EnvVarsTimeout)); CollectionRuleActionResult result = await ActionTestsHelper.ExecuteAndDisposeAsync(getAction, CommonTestTimeouts.EnvVarsTimeout); Assert.Equal("2", result.OutputValues[CollectionRuleActionConstants.EnvironmentVariableValueName]); await runner.SendCommandAsync(TestAppScenarios.EnvironmentVariables.Commands.IncVar); Assert.Equal("3", await runner.GetEnvironmentVariable(TestAppScenarios.EnvironmentVariables.IncrementVariableName, CommonTestTimeouts.EnvVarsTimeout)); ICollectionRuleAction getActionFailure = getFactory.Create(endpointInfo, getFailOpts); CollectionRuleActionException thrownEx = await Assert.ThrowsAsync <CollectionRuleActionException>(async() => { await ActionTestsHelper.ExecuteAndDisposeAsync(getActionFailure, CommonTestTimeouts.EnvVarsTimeout); }); Assert.Contains(VariableDoesNotExist, thrownEx.Message); await runner.SendCommandAsync(TestAppScenarios.EnvironmentVariables.Commands.ShutdownScenario); }); }); }
public async Task CollectDumpAction_Success(TargetFrameworkMoniker tfm, DumpType?dumpType) { // MacOS dumps inconsistently segfault the runtime on .NET 5: https://github.com/dotnet/dotnet-monitor/issues/174 if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX) && tfm == TargetFrameworkMoniker.Net50) { return; } using TemporaryDirectory tempDirectory = new(_outputHelper); await TestHostHelper.CreateCollectionRulesHost(_outputHelper, rootOptions => { rootOptions.AddFileSystemEgress(ActionTestsConstants.ExpectedEgressProvider, tempDirectory.FullName); rootOptions.CreateCollectionRule(DefaultRuleName) .AddCollectDumpAction(ActionTestsConstants.ExpectedEgressProvider, dumpType) .SetStartupTrigger(); }, async host => { CollectDumpOptions options = ActionTestsHelper.GetActionOptions <CollectDumpOptions>(host, DefaultRuleName); ICollectionRuleActionFactoryProxy factory; Assert.True(host.Services.GetService <ICollectionRuleActionOperations>().TryCreateFactory(KnownCollectionRuleActions.CollectDump, out factory)); EndpointInfoSourceCallback callback = new(_outputHelper); await using ServerSourceHolder sourceHolder = await _endpointUtilities.StartServerAsync(callback); AppRunner runner = _endpointUtilities.CreateAppRunner(sourceHolder.TransportName, tfm); Task <IEndpointInfo> newEndpointInfoTask = callback.WaitAddedEndpointInfoAsync(runner, CommonTestTimeouts.StartProcess); await runner.ExecuteAsync(async() => { IEndpointInfo endpointInfo = await newEndpointInfoTask; ICollectionRuleAction action = factory.Create(endpointInfo, options); CollectionRuleActionResult result = await ActionTestsHelper.ExecuteAndDisposeAsync(action, CommonTestTimeouts.DumpTimeout); string egressPath = ActionTestsHelper.ValidateEgressPath(result); using FileStream dumpStream = new(egressPath, FileMode.Open, FileAccess.Read); Assert.NotNull(dumpStream); await DumpTestUtilities.ValidateDump(runner.Environment.ContainsKey(DumpTestUtilities.EnableElfDumpOnMacOS), dumpStream); await runner.SendCommandAsync(TestAppScenarios.AsyncWait.Commands.Continue); }); }); }
protected override Task <CollectionRuleActionResult> ExecuteCoreAsync(TaskCompletionSource <object> startCompletionSource, CancellationToken token) { startCompletionSource.TrySetResult(null); CollectionRuleActionResult result = new CollectionRuleActionResult() { OutputValues = new Dictionary <string, string>() }; result.OutputValues.Add("Output1", Options.Input1); result.OutputValues.Add("Output2", Options.Input2); result.OutputValues.Add("Output3", Options.Input3); return(Task.FromResult(result)); }
public async Task ExecuteAction_ZeroExitCode() { await ValidateAction( options => { options.Path = DotNetHost.HostExePath; options.Arguments = ExecuteActionTestHelper.GenerateArgumentsString(new string[] { ActionTestsConstants.ZeroExitCode }); }, async (action, token) => { await action.StartAsync(token); CollectionRuleActionResult result = await action.WaitForCompletionAsync(token); ValidateActionResult(result, "0"); }); }
public async Task TestEnvVarRoundTrip(TargetFrameworkMoniker tfm) { await TestHostHelper.CreateCollectionRulesHost( outputHelper : _outputHelper, setup : (Tools.Monitor.RootOptions rootOptions) => { rootOptions.CreateCollectionRule(DefaultRuleName) .SetStartupTrigger() .AddSetEnvironmentVariableAction(DefaultVarName, DefaultVarValue) .AddGetEnvironmentVariableAction(DefaultVarName); }, hostCallback : async(Extensions.Hosting.IHost host) => { SetEnvironmentVariableOptions setOpts = ActionTestsHelper.GetActionOptions <SetEnvironmentVariableOptions>(host, DefaultRuleName, 0); GetEnvironmentVariableOptions getOpts = ActionTestsHelper.GetActionOptions <GetEnvironmentVariableOptions>(host, DefaultRuleName, 1); ICollectionRuleActionOperations actionOperationsService = host.Services.GetService <ICollectionRuleActionOperations>(); Assert.True(actionOperationsService.TryCreateFactory(KnownCollectionRuleActions.SetEnvironmentVariable, out ICollectionRuleActionFactoryProxy setFactory)); Assert.True(actionOperationsService.TryCreateFactory(KnownCollectionRuleActions.GetEnvironmentVariable, out ICollectionRuleActionFactoryProxy getFactory)); EndpointInfoSourceCallback endpointInfoCallback = new(_outputHelper); await using ServerSourceHolder sourceHolder = await _endpointUtilities.StartServerAsync(endpointInfoCallback); AppRunner runner = _endpointUtilities.CreateAppRunner(sourceHolder.TransportName, tfm); runner.ScenarioName = TestAppScenarios.EnvironmentVariables.Name; Task <IEndpointInfo> newEndpointInfoTask = endpointInfoCallback.WaitAddedEndpointInfoAsync(runner, CommonTestTimeouts.StartProcess); await runner.ExecuteAsync(async() => { IEndpointInfo endpointInfo = await newEndpointInfoTask; ICollectionRuleAction setAction = setFactory.Create(endpointInfo, setOpts); ICollectionRuleAction getAction = getFactory.Create(endpointInfo, getOpts); await ActionTestsHelper.ExecuteAndDisposeAsync(setAction, CommonTestTimeouts.EnvVarsTimeout); CollectionRuleActionResult getResult = await ActionTestsHelper.ExecuteAndDisposeAsync(getAction, CommonTestTimeouts.EnvVarsTimeout); await runner.SendCommandAsync(TestAppScenarios.EnvironmentVariables.Commands.ShutdownScenario); Assert.True(getResult.OutputValues.TryGetValue(CollectionRuleActionConstants.EnvironmentVariableValueName, out string value)); Assert.Equal(DefaultVarValue, value); }); }); }
public async Task CollectGCDumpAction_Success(TargetFrameworkMoniker tfm) { using TemporaryDirectory tempDirectory = new(_outputHelper); await TestHostHelper.CreateCollectionRulesHost(_outputHelper, rootOptions => { rootOptions.AddFileSystemEgress(ActionTestsConstants.ExpectedEgressProvider, tempDirectory.FullName); rootOptions.CreateCollectionRule(DefaultRuleName) .AddCollectGCDumpAction(ActionTestsConstants.ExpectedEgressProvider) .SetStartupTrigger(); }, async host => { CollectGCDumpOptions options = ActionTestsHelper.GetActionOptions <CollectGCDumpOptions>(host, DefaultRuleName); ICollectionRuleActionFactoryProxy factory; Assert.True(host.Services.GetService <ICollectionRuleActionOperations>().TryCreateFactory(KnownCollectionRuleActions.CollectGCDump, out factory)); EndpointInfoSourceCallback callback = new(_outputHelper); await using ServerSourceHolder sourceHolder = await _endpointUtilities.StartServerAsync(callback); AppRunner runner = _endpointUtilities.CreateAppRunner(sourceHolder.TransportName, tfm); Task <IEndpointInfo> newEndpointInfoTask = callback.WaitAddedEndpointInfoAsync(runner, CommonTestTimeouts.StartProcess); await runner.ExecuteAsync(async() => { IEndpointInfo endpointInfo = await newEndpointInfoTask; ICollectionRuleAction action = factory.Create(endpointInfo, options); CollectionRuleActionResult result = await ActionTestsHelper.ExecuteAndDisposeAsync(action, CommonTestTimeouts.GCDumpTimeout); string egressPath = ActionTestsHelper.ValidateEgressPath(result); using FileStream gcdumpStream = new(egressPath, FileMode.Open, FileAccess.Read); Assert.NotNull(gcdumpStream); await ValidateGCDump(gcdumpStream); await runner.SendCommandAsync(TestAppScenarios.AsyncWait.Commands.Continue); }); }); }