public void ProcRunner_FailsOnTimeout() { // Arrange string exeName = TestUtils.WriteBatchFileForTest(TestContext, @"TIMEOUT 2 @echo Hello world "); TestLogger logger = new TestLogger(); ProcessRunnerArguments args = new ProcessRunnerArguments(exeName, logger) { TimeoutInMilliseconds = 100 }; ProcessRunner runner = new ProcessRunner(); // Act bool success = runner.Execute(args); // Assert Assert.IsFalse(success, "Expecting the process to have failed"); Assert.AreEqual(ProcessRunner.ErrorCode, runner.ExitCode, "Unexpected exit code"); logger.AssertMessageNotLogged("Hello world"); // Give the spawned process a chance to terminate. // This isn't essential (and having a Sleep in the test isn't ideal), but it stops // the test framework outputting this warning which appears in the TeamBuild summary: // "System.AppDomainUnloadedException: Attempted to access an unloaded AppDomain. This can happen // if the test(s) started a thread but did not stop it. Make sure that all the threads started by // the test(s) are stopped before completion." System.Threading.Thread.Sleep(1100); }
public void ProcRunner_ExecutionFailed() { // Arrange string exeName = TestUtils.WriteBatchFileForTest(TestContext, "exit -2"); TestLogger logger = new TestLogger(); ProcessRunnerArguments args = new ProcessRunnerArguments(exeName, logger); ProcessRunner runner = new ProcessRunner(); // Act bool success = runner.Execute(args); // Assert Assert.IsFalse(success, "Expecting the process to have failed"); Assert.AreEqual(-2, runner.ExitCode, "Unexpected exit code"); }
public void ProcRunner_ArgumentQuoting() { // Checks arguments passed to the child process are correctly quoted // Arrange string testDir = TestUtils.CreateTestSpecificFolder(this.TestContext); // Create a dummy exe that will produce a log file showing any input args string exeName = DummyExeHelper.CreateDummyPostProcessor(testDir, 0); TestLogger logger = new TestLogger(); ProcessRunnerArguments args = new ProcessRunnerArguments(exeName, logger); args.CmdLineArgs = new string[] { "unquoted", "\"quoted\"", "\"quoted with spaces\"", "/test:\"quoted arg\"", "unquoted with spaces" }; ProcessRunner runner = new ProcessRunner(); // Act bool success = runner.Execute(args); // Assert Assert.IsTrue(success, "Expecting the process to have succeeded"); Assert.AreEqual(0, runner.ExitCode, "Unexpected exit code"); // Check that the public and private arguments are passed to the child process string exeLogFile = DummyExeHelper.AssertDummyPostProcLogExists(testDir, this.TestContext); DummyExeHelper.AssertExpectedLogContents(exeLogFile, "unquoted", "quoted", "quoted with spaces", "/test:quoted arg", "unquoted with spaces"); }
public void ProcRunner_ExecutionSucceeded() { // Arrange string exeName = TestUtils.WriteBatchFileForTest(TestContext, @"@echo Hello world xxx yyy @echo Testing 1,2,3... "); TestLogger logger = new TestLogger(); ProcessRunnerArguments args = new ProcessRunnerArguments(exeName, logger); ProcessRunner runner = new ProcessRunner(); // Act bool success = runner.Execute(args); // Assert Assert.IsTrue(success, "Expecting the process to have succeeded"); Assert.AreEqual(0, runner.ExitCode, "Unexpected exit code"); logger.AssertMessageLogged("Hello world"); // Check output message are passed to the logger logger.AssertMessageLogged("Testing 1,2,3..."); logger.AssertErrorLogged("'xxx' is not recognized as an internal or external command,"); // Check error messages are passed to the logger }
public void ProcRunner_ExecutionSucceeded() { // Arrange string exeName = TestUtils.WriteBatchFileForTest(TestContext, @"@echo Hello world xxx yyy @echo Testing 1,2,3... "); TestLogger logger = new TestLogger(); ProcessScannerArguments args = new ProcessScannerArguments(exeName, true, logger); ProcessRunner runner = new ProcessRunner(); // Act bool success = runner.Execute(args); // Assert Assert.IsTrue(success, "Expecting the process to have succeeded"); Assert.AreEqual(0, runner.ExitCode, "Unexpected exit code"); logger.AssertMessageLogged("Hello world"); // Check output message are passed to the logger logger.AssertMessageLogged("Testing 1,2,3..."); logger.AssertErrorLogged("'xxx' is not recognized as an internal or external command,"); // Check error messages are passed to the logger }
[WorkItem(126)] // Exclude secrets from log data: http://jira.sonarsource.com/browse/SONARMSBRU-126 public void ProcRunner_DoNotLogSensitiveData() { // Arrange var testDir = TestUtils.CreateTestSpecificFolder(TestContext); // Create a dummy exe that will produce a log file showing any input args var exeName = DummyExeHelper.CreateDummyPostProcessor(testDir, 0); var logger = new TestLogger(); // Public args - should appear in the log var publicArgs = new string[] { "public1", "public2", "/d:sonar.projectKey=my.key" }; var sensitiveArgs = new string[] { // Public args - should appear in the log "public1", "public2", "/dmy.key=value", // Sensitive args - should not appear in the log "/d:sonar.password=secret data password", "/d:sonar.login=secret data login", "/d:sonar.jdbc.password=secret data db password", "/d:sonar.jdbc.username=secret data db user name", // Sensitive args - different cases -> exclude to be on the safe side "/d:SONAR.jdbc.password=secret data db password upper", "/d:sonar.PASSWORD=secret data password upper", // Sensitive args - parameter format is slightly incorrect -> exclude to be on the safe side "/dsonar.login =secret data key typo", "sonar.password=secret data password typo" }; var allArgs = sensitiveArgs.Union(publicArgs).ToArray(); var runnerArgs = new ProcessRunnerArguments(exeName, false) { CmdLineArgs = allArgs }; var runner = new ProcessRunner(logger); // Act var success = runner.Execute(runnerArgs); // Assert Assert.IsTrue(success, "Expecting the process to have succeeded"); Assert.AreEqual(0, runner.ExitCode, "Unexpected exit code"); // Check public arguments are logged but private ones are not foreach (var arg in publicArgs) { logger.AssertSingleDebugMessageExists(arg); } logger.AssertSingleDebugMessageExists("<sensitive data removed>"); AssertTextDoesNotAppearInLog("secret", logger); // Check that the public and private arguments are passed to the child process var exeLogFile = DummyExeHelper.AssertDummyPostProcLogExists(testDir, TestContext); DummyExeHelper.AssertExpectedLogContents(exeLogFile, allArgs); }
public int ScriptMigration(ScriptMigrationParams commandParams) { var processRunner = new ProcessRunner(); return(processRunner.Execute(commandParams)); }
public void ProcRunner_DoNotLogSensitiveData() { // Arrange string testDir = TestUtils.CreateTestSpecificFolder(this.TestContext); // Create a dummy exe that will produce a log file showing any input args string exeName = DummyExeHelper.CreateDummyPostProcessor(testDir, 0); TestLogger logger = new TestLogger(); // Public args - should appear in the log string[] publicArgs = new string[] { "public1", "public2", "/d:sonar.projectKey=my.key" }; string[] sensitiveArgs = new string[] { // Public args - should appear in the log "public1", "public2", "/dmy.key=value", // Sensitive args - should not appear in the log "/d:sonar.password=secret data password", "/d:sonar.login=secret data login", "/d:sonar.jdbc.password=secret data db password", "/d:sonar.jdbc.username=secret data db user name", // Sensitive args - different cases -> exclude to be on the safe side "/d:SONAR.jdbc.password=secret data db password upper", "/d:sonar.PASSWORD=secret data password upper", // Sensitive args - parameter format is slightly incorrect -> exclude to be on the safe side "/dsonar.login =secret data key typo", "sonar.password=secret data password typo" }; string[] allArgs = sensitiveArgs.Union(publicArgs).ToArray(); ProcessRunnerArguments runnerArgs = new ProcessRunnerArguments(exeName, logger) { CmdLineArgs = allArgs }; ProcessRunner runner = new ProcessRunner(); // Act bool success = runner.Execute(runnerArgs); // Assert Assert.IsTrue(success, "Expecting the process to have succeeded"); Assert.AreEqual(0, runner.ExitCode, "Unexpected exit code"); // Check public arguments are logged but private ones are not foreach(string arg in publicArgs) { logger.AssertSingleDebugMessageExists(arg); } logger.AssertSingleDebugMessageExists(SonarQube.Common.Resources.MSG_CmdLine_SensitiveCmdLineArgsAlternativeText); AssertTextDoesNotAppearInLog("secret", logger); // Check that the public and private arguments are passed to the child process string exeLogFile = DummyExeHelper.AssertDummyPostProcLogExists(testDir, this.TestContext); DummyExeHelper.AssertExpectedLogContents(exeLogFile, allArgs); }
public void ProcRunner_PassesEnvVariables_OverrideExisting() { // Tests that existing environment variables will be overwritten successfully // Arrange TestLogger logger = new TestLogger(); ProcessRunner runner = new ProcessRunner(); try { // It's possible the user won't be have permissions to set machine level variables // (e.g. when running on a build agent). Carry on with testing the other variables. SafeSetEnvironmentVariable("proc.runner.test.machine", "existing machine value", EnvironmentVariableTarget.Machine, logger); Environment.SetEnvironmentVariable("proc.runner.test.process", "existing process value", EnvironmentVariableTarget.Process); Environment.SetEnvironmentVariable("proc.runner.test.user", "existing user value", EnvironmentVariableTarget.User); string exeName = TestUtils.WriteBatchFileForTest(TestContext, @"@echo file: %proc.runner.test.machine% @echo file: %proc.runner.test.process% @echo file: %proc.runner.test.user% "); var envVariables = new Dictionary<string, string>() { { "proc.runner.test.machine", "machine override" }, { "proc.runner.test.process", "process override" }, { "proc.runner.test.user", "user override" } }; ProcessRunnerArguments args = new ProcessRunnerArguments(exeName, logger) { EnvironmentVariables = envVariables }; // Act bool success = runner.Execute(args); // Assert Assert.IsTrue(success, "Expecting the process to have succeeded"); Assert.AreEqual(0, runner.ExitCode, "Unexpected exit code"); } finally { SafeSetEnvironmentVariable("proc.runner.test.machine", null, EnvironmentVariableTarget.Machine, logger); Environment.SetEnvironmentVariable("proc.runner.test.process", null, EnvironmentVariableTarget.Process); Environment.SetEnvironmentVariable("proc.runner.test.user", null, EnvironmentVariableTarget.User); } // Check the child process used expected values logger.AssertMessageLogged("file: machine override"); logger.AssertMessageLogged("file: process override"); logger.AssertMessageLogged("file: user override"); // Check the runner reported it was overwriting existing variables // Note: the existing non-process values won't be visible to the child process // unless they were set *before* the test host launched, which won't be the case. logger.AssertSingleDebugMessageExists("proc.runner.test.process", "existing process value", "process override"); }
public void ProcRunner_PassesEnvVariables() { // Arrange TestLogger logger = new TestLogger(); ProcessRunner runner = new ProcessRunner(); string exeName = TestUtils.WriteBatchFileForTest(TestContext, @"echo %PROCESS_VAR% @echo %PROCESS_VAR2% @echo %PROCESS_VAR3% "); var envVariables = new Dictionary<string, string>() { { "PROCESS_VAR", "PROCESS_VAR value" }, { "PROCESS_VAR2", "PROCESS_VAR2 value" }, { "PROCESS_VAR3", "PROCESS_VAR3 value" } }; ProcessRunnerArguments args = new ProcessRunnerArguments(exeName, logger) { EnvironmentVariables = envVariables }; // Act bool success = runner.Execute(args); // Assert Assert.IsTrue(success, "Expecting the process to have succeeded"); Assert.AreEqual(0, runner.ExitCode, "Unexpected exit code"); logger.AssertMessageLogged("PROCESS_VAR value"); logger.AssertMessageLogged("PROCESS_VAR2 value"); logger.AssertMessageLogged("PROCESS_VAR3 value"); }
public void ProcRunner_MissingExe() { // Tests attempting to launch a non-existent exe // Arrange TestLogger logger = new TestLogger(); ProcessRunnerArguments args = new ProcessRunnerArguments("missingExe.foo", logger); ProcessRunner runner = new ProcessRunner(); // Act bool success = runner.Execute(args); // Assert Assert.IsFalse(success, "Expecting the process to have failed"); Assert.AreEqual(ProcessRunner.ErrorCode, runner.ExitCode, "Unexpected exit code"); logger.AssertSingleErrorExists("missingExe.foo"); }
private static string CreateNuGet(string tempDir, string outDir, string name, string version, long size) { Console.WriteLine(); var nuspec = $@"<?xml version=""1.0""?> <package xmlns=""http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd""> <metadata> <id>{name}</id> <version>{version}</version> <authors>Someone</authors> <owners>Someone</owners> <description>Core utility functions for web applications</description> </metadata> <files> <file src=""*"" target="""" /> </files> </package>"; File.WriteAllText(Path.Combine(tempDir, $"{name}.{version}.nuspec"), nuspec); long size1 = size; var rnd = new Random(); void Write(int fileSize) { var contents = new byte[fileSize]; while (size1 > fileSize) { rnd.NextBytes(contents); File.WriteAllBytes(Path.Combine(tempDir, Guid.NewGuid().ToString("N")), contents); size1 -= fileSize; } } Write(100_000_000); Write(10_000_000); Write(1_000_000); Write(100_000); Write(10_000); Write(1_000); Write(100); Write(10); Write(1); var nugetExe = Path.Combine(Path.GetTempFileName() + ".exe"); using (var stream = typeof(PackageCreator).Assembly.GetManifestResourceStream($"{typeof(PackageCreator).Namespace}.nuget.exe")) using (var fs = File.OpenWrite(nugetExe)) stream.CopyTo(fs); try { if (outDir.EndsWith("\\")) { outDir += "\\"; } var command = $"pack -OutputDirectory \"{outDir}\""; var result = ProcessRunner.Execute(nugetExe, command, workingDirectory: tempDir); if (result.ExitCode != 0) { throw new Exception("Failed to create package: " + result.Error); } return(Path.Combine(outDir, $"{name}.{version}.nupkg")); } finally { File.Delete(nugetExe); } }