public void SonarRunner_CmdLineArgsOrdering()
        {
            // Check that user arguments are passed through to the wrapper and that they appear first

            // Arrange
            TestLogger logger = new TestLogger();

            string exePath            = CreateDummarySonarRunnerBatchFile();
            string propertiesFilePath = CreateDummySonarRunnerPropertiesFile();

            string[] userArgs = new string[] { "-Dsonar.login=me", "-Dsonar.password=my.pwd" };

            // Act
            bool success = SonarRunnerWrapper.ExecuteJavaRunner(new AnalysisConfig(), userArgs, logger, exePath, propertiesFilePath);

            Assert.IsTrue(success, "Expecting execution to succeed");

            string actualCmdLineArgs = CheckStandardArgsPassed(logger, propertiesFilePath);

            int loginIndex = CheckArgExists("-Dsonar.login=me", actualCmdLineArgs);
            int pwdIndex   = CheckArgExists("-Dsonar.password=my.pwd", actualCmdLineArgs);

            int standardArgsIndex   = CheckArgExists(SonarRunnerWrapper.StandardAdditionalRunnerArguments, actualCmdLineArgs);
            int propertiesFileIndex = CheckArgExists(SonarRunnerWrapper.ProjectSettingsFileArgName, actualCmdLineArgs);

            Assert.IsTrue(loginIndex < standardArgsIndex && loginIndex < propertiesFileIndex, "User arguments should appear first");
            Assert.IsTrue(pwdIndex < standardArgsIndex && pwdIndex < propertiesFileIndex, "User arguments should appear first");
        }
        public void SonarRunner_SensitiveArgsPassedOnCommandLine()
        {
            // Check that sensitive arguments from the config are passed on the command line

            // Arrange
            TestLogger logger = new TestLogger();

            string testDir = TestUtils.CreateTestSpecificFolder(this.TestContext);

            string exePath            = CreateDummarySonarRunnerBatchFile();
            string propertiesFilePath = CreateDummySonarRunnerPropertiesFile();

            string[] userArgs = new string[] { "-Dxxx=yyy", "-Dsonar.password=cmdline.password" };

            // Create a config file containing sensitive arguments
            AnalysisProperties fileSettings = new AnalysisProperties();

            fileSettings.Add(new Property()
            {
                Id = SonarProperties.DbPassword, Value = "file db pwd"
            });
            fileSettings.Add(new Property()
            {
                Id = SonarProperties.SonarPassword, Value = "file.password - should not be returned"
            });
            fileSettings.Add(new Property()
            {
                Id = "file.not.sensitive.key", Value = "not sensitive value"
            });
            string settingsFilePath = Path.Combine(testDir, "fileSettings.txt");

            fileSettings.Save(settingsFilePath);

            AnalysisConfig config = new AnalysisConfig()
            {
                SonarRunnerWorkingDirectory = this.TestContext.DeploymentDirectory
            };

            config.SetSettingsFilePath(settingsFilePath);

            // Act
            bool success = SonarRunnerWrapper.ExecuteJavaRunner(config, userArgs, logger, exePath, propertiesFilePath);

            // Assert
            VerifyProcessRunOutcome(logger, this.TestContext.DeploymentDirectory, success, true);
            string actualCmdLineArgs = CheckStandardArgsPassed(logger, propertiesFilePath);

            // Non-sensitive values from the file should not be passed on the command line
            CheckArgDoesNotExist("file.not.sensitive.key", actualCmdLineArgs);

            int dbPwdIndex   = CheckArgExists("-Dsonar.jdbc.password=file db pwd", actualCmdLineArgs); // sensitive value from file
            int userPwdIndex = CheckArgExists("-Dsonar.password=cmdline.password", actualCmdLineArgs); // sensitive value from cmd line: overrides file value

            int standardArgsIndex   = CheckArgExists(SonarRunnerWrapper.StandardAdditionalRunnerArguments, actualCmdLineArgs);
            int propertiesFileIndex = CheckArgExists(SonarRunnerWrapper.ProjectSettingsFileArgName, actualCmdLineArgs);

            Assert.IsTrue(dbPwdIndex < standardArgsIndex && dbPwdIndex < propertiesFileIndex, "User arguments should appear first");
            Assert.IsTrue(userPwdIndex < standardArgsIndex && userPwdIndex < propertiesFileIndex, "User arguments should appear first");
        }
        public void SonarRunner_StandardAdditionalArgumentsPassed()
        {
            // Arrange
            TestLogger logger             = new TestLogger();
            string     exePath            = CreateDummarySonarRunnerBatchFile();
            string     propertiesFilePath = CreateDummySonarRunnerPropertiesFile();

            // Act
            bool success = SonarRunnerWrapper.ExecuteJavaRunner(new AnalysisConfig(), Enumerable.Empty <string>(), logger, exePath, propertiesFilePath);

            Assert.IsTrue(success, "Expecting execution to succeed");
            CheckStandardArgsPassed(logger, propertiesFilePath);
        }
        public void SonarRunner_StandardAdditionalArgumentsPassed()
        {
            // Arrange
            TestLogger     logger             = new TestLogger();
            string         exePath            = CreateDummarySonarRunnerBatchFile();
            string         propertiesFilePath = CreateDummySonarRunnerPropertiesFile();
            AnalysisConfig config             = new AnalysisConfig()
            {
                SonarRunnerWorkingDirectory = this.TestContext.DeploymentDirectory
            };

            // Act
            bool success = SonarRunnerWrapper.ExecuteJavaRunner(config, Enumerable.Empty <string>(), logger, exePath, propertiesFilePath);

            // Assert
            VerifyProcessRunOutcome(logger, this.TestContext.DeploymentDirectory, success, true);
        }
        private void TestWrapperErrorHandling(int?exitCode, bool addMessageToStdErr, bool expectedOutcome)
        {
            // Arrange
            TestLogger     logger             = new TestLogger();
            string         exePath            = CreateDummarySonarRunnerBatchFile(addMessageToStdErr, exitCode);
            string         propertiesFilePath = CreateDummySonarRunnerPropertiesFile();
            AnalysisConfig config             = new AnalysisConfig()
            {
                SonarRunnerWorkingDirectory = this.TestContext.DeploymentDirectory
            };

            // Act
            bool success = SonarRunnerWrapper.ExecuteJavaRunner(config, Enumerable.Empty <string>(), logger, exePath, propertiesFilePath);

            // Assert
            VerifyProcessRunOutcome(logger, this.TestContext.DeploymentDirectory, success, expectedOutcome);
        }
        public void SonarRunnerHome_MessageLoggedIfAlreadySet()
        {
            using (EnvironmentVariableScope scope = new EnvironmentVariableScope())
            {
                scope.SetVariable(SonarRunnerWrapper.SonarRunnerHomeVariableName, "some_path");

                // Arrange
                TestLogger testLogger         = new TestLogger();
                string     exePath            = CreateDummarySonarRunnerBatchFile();
                string     propertiesFilePath = CreateDummySonarRunnerPropertiesFile();

                // Act
                bool success = SonarRunnerWrapper.ExecuteJavaRunner(new AnalysisConfig(), Enumerable.Empty <string>(), testLogger, exePath, propertiesFilePath);

                // Assert
                Assert.IsTrue(success, "Expecting execution to succeed");
                testLogger.AssertInfoMessageExists(SonarRunner.Shim.Resources.MSG_SonarRunnerHomeIsSet);
            }
        }
        public void SonarRunnerHome_MessageLoggedIfAlreadySet()
        {
            using (EnvironmentVariableScope scope = new EnvironmentVariableScope())
            {
                scope.SetVariable(SonarRunnerWrapper.SonarRunnerHomeVariableName, "some_path");

                // Arrange
                TestLogger     testLogger         = new TestLogger();
                string         exePath            = CreateDummarySonarRunnerBatchFile();
                string         propertiesFilePath = CreateDummySonarRunnerPropertiesFile();
                AnalysisConfig config             = new AnalysisConfig()
                {
                    SonarRunnerWorkingDirectory = this.TestContext.DeploymentDirectory
                };

                // Act
                bool success = SonarRunnerWrapper.ExecuteJavaRunner(config, Enumerable.Empty <string>(), testLogger, exePath, propertiesFilePath);

                // Assert
                VerifyProcessRunOutcome(testLogger, this.TestContext.DeploymentDirectory, success, true);
            }
        }
        public void SonarRunnerHome_NoMessageIfNotAlreadySet()
        {
            // Arrange
            TestLogger testLogger         = new TestLogger();
            string     exePath            = CreateDummarySonarRunnerBatchFile();
            string     propertiesFilePath = CreateDummySonarRunnerPropertiesFile();

            using (EnvironmentVariableScope scope = new EnvironmentVariableScope())
            {
                scope.SetVariable(SonarRunnerWrapper.SonarRunnerHomeVariableName, null);
                AnalysisConfig config = new AnalysisConfig()
                {
                    SonarRunnerWorkingDirectory = this.TestContext.DeploymentDirectory
                };

                // Act
                bool success = SonarRunnerWrapper.ExecuteJavaRunner(config, Enumerable.Empty <string>(), testLogger, exePath, propertiesFilePath);

                // Assert
                VerifySuccessfullRun(testLogger, success, this.TestContext.DeploymentDirectory);
                testLogger.AssertMessageNotLogged(SonarRunner.Shim.Resources.MSG_SonarRunnerHomeIsSet);
            }
        }