public void AnalysisConfGen_AnalysisConfigDoesNotContainSensitiveData() { // Arrange string analysisDir = TestUtils.CreateTestSpecificFolder(this.TestContext); TestLogger logger = new TestLogger(); ListPropertiesProvider cmdLineArgs = new ListPropertiesProvider(); // Public args - should be written to the config file cmdLineArgs.AddProperty("sonar.host.url", "http://host"); cmdLineArgs.AddProperty("public.key", "public value"); // Sensitive values - should not be written to the config file cmdLineArgs.AddProperty(SonarProperties.DbPassword, "secret db password"); cmdLineArgs.AddProperty(SonarProperties.DbUserName, "secret db user"); // Create a settings file with public and sensitive data AnalysisProperties fileSettings = new AnalysisProperties(); fileSettings.Add(new Property() { Id = "file.public.key", Value = "file public value" }); fileSettings.Add(new Property() {Id = SonarProperties.DbUserName, Value = "secret db user"}); fileSettings.Add(new Property() { Id = SonarProperties.DbPassword, Value = "secret db password"}); string fileSettingsPath = Path.Combine(analysisDir, "fileSettings.txt"); fileSettings.Save(fileSettingsPath); FilePropertyProvider fileProvider = FilePropertyProvider.Load(fileSettingsPath); ProcessedArgs args = new ProcessedArgs("key", "name", "1.0", false, cmdLineArgs, fileProvider); IDictionary<string, string> serverProperties = new Dictionary<string, string>(); // Public server settings serverProperties.Add("server.key.1", "server value 1"); // Sensitive server settings serverProperties.Add(SonarProperties.SonarUserName, "secret user"); serverProperties.Add(SonarProperties.SonarPassword, "secret pwd"); TeamBuildSettings settings = TeamBuildSettings.CreateNonTeamBuildSettingsForTesting(analysisDir); Directory.CreateDirectory(settings.SonarConfigDirectory); // config directory needs to exist // Act AnalysisConfig config = AnalysisConfigGenerator.GenerateFile(args, settings, serverProperties, logger); // Assert AssertConfigFileExists(config); logger.AssertErrorsLogged(0); logger.AssertWarningsLogged(0); // Check the config // "Public" arguments should be in the file Assert.AreEqual("key", config.SonarProjectKey, "Unexpected project key"); Assert.AreEqual("name", config.SonarProjectName, "Unexpected project name"); Assert.AreEqual("1.0", config.SonarProjectVersion, "Unexpected project version"); AssertExpectedLocalSetting(SonarProperties.HostUrl, "http://host", config); AssertExpectedServerSetting("server.key.1", "server value 1", config); AssertFileDoesNotContainText(config.FileName, "file.public.key"); // file settings values should not be in the config // SONARMSBRU-136: TODO - uncomment the following code: AssertFileDoesNotContainText(config.FileName, "secret"); // sensitive data should not be in config }
public void BuildWrapper_OldCppPluginInstalled_FilesDownloaded() { // If an older version of the C++ plugin is installed then the embedded resource // won't exist. In that case we expect a warning message telling the user to upgrade. // Arrange string rootDir = TestUtils.CreateTestSpecificFolder(this.TestContext); TestLogger logger = new TestLogger(); MockSonarQubeServer mockServer = new MockSonarQubeServer(); mockServer.Data.InstalledPlugins.Add("cpp"); // plugin exists but no zip file BuildWrapperInstaller testSubject = new BuildWrapperInstaller(logger); // Act AnalysisProperties properties = testSubject.InstallBuildWrapper(mockServer, rootDir, "c:\\output\\"); // Assert logger.AssertSingleWarningExists(SonarQube.TeamBuild.PreProcessor.Resources.BW_CppPluginUpgradeRequired); logger.AssertErrorsLogged(0); AssertNoFilesExist(rootDir); Assert.IsNotNull(properties, "Returned properties should not be null"); Assert.AreEqual(0, properties.Count, "Not expecting any properties to be set"); }
public void RoslynConfig_BranchMissingRuleset() { // This test is a regression scenario for SONARMSBRU-187: // We do not expect the project profile to be returned if we ask for a branch-specific profile // Arrange string rootDir = CreateTestFolders(); TestLogger logger = new TestLogger(); TeamBuildSettings settings = CreateSettings(rootDir); WellKnownProfile testProfile = CreateValidCSharpProfile(); MockSonarQubeServer mockServer = CreateServer("valid.project", null, "valid.profile", testProfile); MockAnalyzerInstaller mockInstaller = new MockAnalyzerInstaller(); mockInstaller.AssemblyPathsToReturn = new HashSet<string>(new string[] { "c:\\assembly1.dll", "d:\\foo\\assembly2.dll" }); RoslynAnalyzerProvider testSubject = new RoslynAnalyzerProvider(mockInstaller, logger); // Act AnalyzerSettings actualSettings = testSubject.SetupAnalyzers(mockServer, settings, "valid.project", "missingBranch"); // Assert AssertAnalyzerSetupNotPerformed(actualSettings, rootDir); logger.AssertErrorsLogged(0); logger.AssertWarningsLogged(0); }
public void ReportProcessor_CannotConvertFiles() { // Arrange MockReportUrlProvider urlProvider = new MockReportUrlProvider() { UrlsToReturn = new string[] { ValidUrl1 } }; MockReportDownloader downloader = new MockReportDownloader(); MockReportConverter converter = new MockReportConverter() { CanConvert = false }; AnalysisConfig context = this.CreateValidContext(); TeamBuildSettings settings = this.CreateValidSettings(); TestLogger logger = new TestLogger(); TfsLegacyCoverageReportProcessor processor = new TfsLegacyCoverageReportProcessor(urlProvider, downloader, converter); // Act bool initResult = processor.Initialise(context, settings, logger); // Assert Assert.IsFalse(initResult, "Expecting false: processor should not have been initialised successfully"); urlProvider.AssertGetUrlsNotCalled(); downloader.AssertDownloadNotCalled(); converter.AssertConvertNotCalled(); logger.AssertWarningsLogged(0); logger.AssertErrorsLogged(0); }
private static void CheckVerbosity(string errorMessage, LoggerVerbosity expectedVerbosity, string verbosity = null, string logLevel = null, int expectedNumberOfWarnings = 0) { var provider = CreatePropertiesProvider(verbosity, logLevel); TestLogger logger = new TestLogger(); var actualVerbosity = VerbosityCalculator.ComputeVerbosity(provider, logger); Assert.AreEqual(expectedVerbosity, actualVerbosity, errorMessage); logger.AssertErrorsLogged(0); logger.AssertWarningsLogged(expectedNumberOfWarnings); }
public void AnalysisConfGen_Simple() { // Arrange string analysisDir = TestUtils.CreateTestSpecificFolder(this.TestContext); TestLogger logger = new TestLogger(); ListPropertiesProvider propertyProvider = new ListPropertiesProvider(); propertyProvider.AddProperty(SonarProperties.HostUrl, "http://foo"); ProcessedArgs args = new ProcessedArgs("valid.key", "valid.name", "1.0", false, EmptyPropertyProvider.Instance, propertyProvider); TeamBuildSettings tbSettings = TeamBuildSettings.CreateNonTeamBuildSettingsForTesting(analysisDir); Dictionary<string, string> serverSettings = new Dictionary<string, string>(); serverSettings.Add("server.key.1", "server.value.1"); AnalyzerSettings analyzerSettings = new AnalyzerSettings(); analyzerSettings.RuleSetFilePath = "c:\\xxx.ruleset"; analyzerSettings.AdditionalFilePaths = new List<string>(); analyzerSettings.AdditionalFilePaths.Add("f:\\additionalPath1.txt"); analyzerSettings.AnalyzerAssemblyPaths = new List<string>(); analyzerSettings.AnalyzerAssemblyPaths.Add("f:\\temp\\analyzer1.dll"); Directory.CreateDirectory(tbSettings.SonarConfigDirectory); // config directory needs to exist // Act AnalysisConfig actualConfig = AnalysisConfigGenerator.GenerateFile(args, tbSettings, serverSettings, analyzerSettings, logger); // Assert AssertConfigFileExists(actualConfig); logger.AssertErrorsLogged(0); logger.AssertWarningsLogged(0); Assert.AreEqual("valid.key", actualConfig.SonarProjectKey); Assert.AreEqual("valid.name", actualConfig.SonarProjectName); Assert.AreEqual("1.0", actualConfig.SonarProjectVersion); Assert.AreEqual("http://foo", actualConfig.SonarQubeHostUrl); Assert.AreEqual(tbSettings.SonarBinDirectory, actualConfig.SonarBinDir); Assert.AreEqual(tbSettings.SonarConfigDirectory, actualConfig.SonarConfigDir); Assert.AreEqual(tbSettings.SonarOutputDirectory, actualConfig.SonarOutputDir); Assert.AreEqual(tbSettings.SonarRunnerWorkingDirectory, actualConfig.SonarRunnerWorkingDirectory); Assert.AreEqual(tbSettings.BuildUri, actualConfig.GetBuildUri()); Assert.AreEqual(tbSettings.TfsUri, actualConfig.GetTfsUri()); Assert.IsNotNull(actualConfig.ServerSettings); Property serverProperty = actualConfig.ServerSettings.SingleOrDefault(s => string.Equals(s.Id, "server.key.1", System.StringComparison.Ordinal)); Assert.IsNotNull(serverProperty); Assert.AreEqual("server.value.1", serverProperty.Value); Assert.AreSame(analyzerSettings, actualConfig.AnalyzerSettings); }
public void TrxReader_TestsResultsDirectoryMissing() { // Arrange string testDir = TestUtils.CreateTestSpecificFolder(this.TestContext); TestLogger logger = new TestLogger(); // Act string coverageFilePath = TrxFileReader.LocateCodeCoverageFile(testDir, logger); // Assert Assert.AreEqual(null, coverageFilePath); // Not expecting errors or warnings: we assume it means that tests have not been executed logger.AssertErrorsLogged(0); logger.AssertWarningsLogged(0); }
public void FileProvider_InvalidDefaultPropertiesFile() { // Arrange TestLogger logger = new TestLogger(); string defaultPropertiesDir = TestUtils.CreateTestSpecificFolder(this.TestContext); string invalidFile = CreateFile(defaultPropertiesDir, FilePropertyProvider.DefaultFileName, "not a valid XML properties file"); IList<ArgumentInstance> args = new List<ArgumentInstance>(); // Act CheckProcessingFails(args, defaultPropertiesDir, logger); // Assert logger.AssertErrorsLogged(1); logger.AssertSingleErrorExists(invalidFile); }
public void TrxReader_InvalidTrxFile() { // Arrange string testDir = TestUtils.CreateTestSpecificFolder(this.TestContext); string resultsDir = TestUtils.CreateTestSpecificFolder(this.TestContext, "TestResults"); string textFile = CreateTextFile(resultsDir, "dummy.trx", "this is not a trx file"); TestLogger logger = new TestLogger(); // Act string coverageFilePath = TrxFileReader.LocateCodeCoverageFile(testDir, logger); // Assert Assert.AreEqual(null, coverageFilePath); logger.AssertSingleWarningExists("dummy.trx"); // expecting a warning about the invalid file logger.AssertErrorsLogged(0); // should be a warning, not an error }
[TestCategory("Task")] // Regression test for bug http://jira.codehaus.org/browse/SONARMSBRU-11 public void TaskUtils_LoadConfig_RetryIfConfigLocked_ValueReturned() { // Arrange string testFolder = TestUtils.CreateTestSpecificFolder(this.TestContext); string configFile = CreateAnalysisConfig(testFolder); TestLogger logger = new TestLogger(); AnalysisConfig result = null; PerformOpOnLockedFile(configFile, () => result = TaskUtilities.TryGetConfig(testFolder, logger), shouldTimeoutReadingConfig: false); Assert.IsNotNull(result, "Expecting the config to have been loaded"); AssertRetryAttempted(logger); logger.AssertWarningsLogged(0); logger.AssertErrorsLogged(0); }
public void SonarLint_InvalidRuleset() { // Arrange string rootDir = CreateTestFolders(); TestLogger logger = new TestLogger(); TeamBuildSettings settings = CreateSettings(rootDir); MockSonarQubeServer mockServer = CreateValidServer("valid.project", "valid.profile"); mockServer.Data.FindProfile("valid.profile", SonarLintAnalyzerProvider.CSharpLanguage).SetExport(SonarLintAnalyzerProvider.SonarLintProfileFormatName, "not a ruleset"); // Act SonarLintAnalyzerProvider.SetupAnalyzers(mockServer, settings, "valid.project", logger); // Assert CheckRulesetDoesNotExist(rootDir); CheckBinariesDoNotExist(rootDir); logger.AssertErrorsLogged(1); // Expecting an error in this case: the profile exists but couldn't be retrieved }
public void SonarLint_ProjectNotInProfile() { // Arrange string rootDir = CreateTestFolders(); TestLogger logger = new TestLogger(); TeamBuildSettings settings = CreateSettings(rootDir); MockSonarQubeServer mockServer = CreateValidServer("valid.project", "valid.profile"); mockServer.Data.FindProfile("valid.profile", SonarLintAnalyzerProvider.CSharpLanguage).ActiveRules.Clear(); // Act SonarLintAnalyzerProvider.SetupAnalyzers(mockServer, settings, "unknown.project", logger); // Assert CheckRulesetDoesNotExist(rootDir); CheckBinariesDoNotExist(rootDir); logger.AssertErrorsLogged(0); }
public void TrxReader_MultipleTrxFiles() { // Arrange string testDir = TestUtils.CreateTestSpecificFolder(this.TestContext); string resultsDir = TestUtils.CreateTestSpecificFolder(this.TestContext, "TestResults"); string trx1 = CreateTextFile(resultsDir, "mytrx1.trx", "<TestRun />"); string trx2 = CreateTextFile(resultsDir, "mytrx2.trx", "<TestRun />"); TestLogger logger = new TestLogger(); // Act string coverageFilePath = TrxFileReader.LocateCodeCoverageFile(testDir, logger); // Assert Assert.AreEqual(null, coverageFilePath); logger.AssertSingleWarningExists(trx1, trx2); // expecting a warning referring the log files logger.AssertErrorsLogged(0); }
public void SonarLint_PluginNotInstalled() { // Arrange string rootDir = CreateTestFolders(); TestLogger logger = new TestLogger(); TeamBuildSettings settings = CreateSettings(rootDir); MockSonarQubeServer mockServer = CreateValidServer("valid.project", "valid.profile"); mockServer.Data.InstalledPlugins.Remove(SonarLintAnalyzerProvider.CSharpPluginKey); // Act SonarLintAnalyzerProvider.SetupAnalyzers(mockServer, settings, "valid.project", logger); // Assert CheckRulesetDoesNotExist(rootDir); CheckBinariesDoNotExist(rootDir); logger.AssertErrorsLogged(0); }
public void V0_9Upgrade_CalledFromV0_9() { // Arrange TestLogger logger = new TestLogger(); ProcessRunnerArguments runnerArgs = new ProcessRunnerArguments(typeof(V0_9UpgradeMessageExe.Program).Assembly.Location, logger) { WorkingDirectory = this.TestContext.DeploymentDirectory }; // Act ProcessRunner runner = new ProcessRunner(); bool success = runner.Execute(runnerArgs); // Assert Assert.IsFalse(success); logger.AssertSingleErrorExists(SonarQube.V0_9UpgradeMessageExe.Resources.UpgradeMessage); logger.AssertErrorsLogged(1); }
public void RoslynConfig_ProjectNotInProfile() { // Arrange string rootDir = CreateTestFolders(); TestLogger logger = new TestLogger(); TeamBuildSettings settings = CreateSettings(rootDir); MockSonarQubeServer mockServer = CreateValidServer("valid.project", null, "valid.profile"); RoslynAnalyzerProvider testSubject = CreateTestSubject(logger); // Act AnalyzerSettings actualSettings = testSubject.SetupAnalyzers(mockServer, settings, "unknown.project", null); // Assert AssertAnalyzerSetupNotPerformed(actualSettings, rootDir); logger.AssertErrorsLogged(0); }
[TestCategory("Task")] // Regression test for bug http://jira.codehaus.org/browse/SONARMSBRU-11 public void TaskUtils_LoadConfig_TimeoutIfConfigLocked_NullReturned() { // Arrange // We'll lock the file and sleep for long enough for the task to timeout string testFolder = TestUtils.CreateTestSpecificFolder(this.TestContext); string configFile = CreateAnalysisConfig(testFolder); TestLogger logger = new TestLogger(); AnalysisConfig result = null; PerformOpOnLockedFile(configFile, () => result = TaskUtilities.TryGetConfig(testFolder, logger), shouldTimeoutReadingConfig: true); Assert.IsNull(result, "Not expecting the config to be retrieved"); AssertRetryAttempted(logger); logger.AssertWarningsLogged(0); logger.AssertErrorsLogged(1); }
public void RoslynConfig_PluginNotInstalled() { // Arrange string rootDir = CreateTestFolders(); TestLogger logger = new TestLogger(); TeamBuildSettings settings = CreateSettings(rootDir); MockSonarQubeServer mockServer = CreateValidServer("valid.project", "valid.profile"); mockServer.Data.InstalledPlugins.Remove(RoslynAnalyzerProvider.CSharpPluginKey); RoslynAnalyzerProvider testSubject = CreateTestSubject(logger); // Act AnalyzerSettings actualSettings = testSubject.SetupAnalyzers(mockServer, settings, "valid.project"); // Assert AssertAnalyzerSetupNotPerformed(actualSettings, rootDir); logger.AssertErrorsLogged(0); }
[WorkItem(72)] // Regression test for bug #72: fail the conversion if the output file is not created public void Conv_FailsIfFileNotFound() { // Arrange TestLogger logger = new TestLogger(); string testDir = TestUtils.CreateTestSpecificFolder(this.TestContext); string outputFilePath = Path.Combine(testDir, "output.txt"); string inputFilePath = Path.Combine(testDir, "input.txt"); File.WriteAllText(inputFilePath, "dummy input file"); string converterFilePath = Path.Combine(testDir, "converter.bat"); File.WriteAllText(converterFilePath, @"REM Do nothing - don't create a file"); // Act bool success = CoverageReportConverter.ConvertBinaryToXml(converterFilePath, inputFilePath, outputFilePath, logger); // Assert Assert.IsFalse(success, "Expecting the process to fail"); logger.AssertErrorsLogged(); logger.AssertSingleErrorExists(outputFilePath); // error message should refer to the output file Assert.IsFalse(File.Exists(outputFilePath), "Not expecting the output file to exist"); }
public void RoslynConfig_NoAnalyzerAssemblies_Succeeds() { // Arrange string rootDir = CreateTestFolders(); TestLogger logger = new TestLogger(); TeamBuildSettings settings = CreateSettings(rootDir); MockSonarQubeServer mockServer = CreateValidServer("valid.project", null, "valid.profile"); QualityProfile csProfile = mockServer.Data.FindProfile("valid.profile", RoslynAnalyzerProvider.CSharpLanguage); csProfile.SetExport(RoslynAnalyzerProvider.RoslynCSharpFormatName, @"<?xml version=""1.0"" encoding=""utf-8""?> <RoslynExportProfile Version=""1.0=""> <Configuration> <RuleSet /> <AdditionalFiles /> </Configuration> <Deployment> <NuGetPackages /> <!-- empty --> </Deployment> </RoslynExportProfile>"); RoslynAnalyzerProvider testSubject = CreateTestSubject(logger); // Act AnalyzerSettings actualSettings = testSubject.SetupAnalyzers(mockServer, settings, "valid.project", null); // Assert CheckSettingsInvariants(actualSettings); CheckExpectedAssemblies(actualSettings /* none */ ); logger.AssertErrorsLogged(0); logger.AssertWarningsLogged(0); }
public void RoslynConfig_DuplicateAdditionalFileName_DuplicateFileIgnored() { // Arrange string rootDir = CreateTestFolders(); TestLogger logger = new TestLogger(); TeamBuildSettings settings = CreateSettings(rootDir); string expectedFileContent = "expected"; string unexpectedFileContent = "not expected: file should already exist with the expected content"; MockSonarQubeServer mockServer = CreateValidServer("valid.project", null, "valid.profile"); QualityProfile csProfile = mockServer.Data.FindProfile("valid.profile", RoslynAnalyzerProvider.CSharpLanguage); csProfile.SetExport(RoslynAnalyzerProvider.RoslynCSharpFormatName, @"<?xml version=""1.0"" encoding=""utf-8""?> <RoslynExportProfile Version=""1.0=""> <Configuration> <RuleSet /> <AdditionalFiles> <AdditionalFile FileName=""foo.txt"" >" + GetBase64EncodedString(expectedFileContent) + @"</AdditionalFile> <AdditionalFile FileName=""foo.txt"" >" + GetBase64EncodedString(unexpectedFileContent) + @"</AdditionalFile> <AdditionalFile FileName=""file2.txt""></AdditionalFile> </AdditionalFiles> </Configuration> <Deployment /> </RoslynExportProfile>"); RoslynAnalyzerProvider testSubject = CreateTestSubject(logger); // Act AnalyzerSettings actualSettings = testSubject.SetupAnalyzers(mockServer, settings, "valid.project", null); // Assert CheckSettingsInvariants(actualSettings); CheckRuleset(actualSettings, rootDir); CheckExpectedAdditionalFileExists("foo.txt", expectedFileContent, actualSettings); CheckExpectedAdditionalFileExists("file2.txt", string.Empty, actualSettings); logger.AssertErrorsLogged(0); logger.AssertWarningsLogged(0); }
public void RoslynConfig_ValidRealSonarLintProfile() { // Arrange string rootDir = CreateTestFolders(); TestLogger logger = new TestLogger(); TeamBuildSettings settings = CreateSettings(rootDir); WellKnownProfile testProfile = CreateRealSonarLintProfile(); MockSonarQubeServer mockServer = CreateServer("valid.project", null, "valid.profile", testProfile); RoslynAnalyzerProvider testSubject = CreateTestSubject(logger); // Act AnalyzerSettings actualSettings = testSubject.SetupAnalyzers(mockServer, settings, "valid.project", null); // Assert CheckSettingsInvariants(actualSettings); logger.AssertWarningsLogged(0); logger.AssertErrorsLogged(0); CheckRuleset(actualSettings, rootDir); CheckExpectedAdditionalFiles(testProfile, actualSettings); // Check the additional file is valid XML Assert.AreEqual(1, actualSettings.AdditionalFilePaths.Count(), "Test setup error: expecting only one additional file. Check the sample export XML has not changed"); string filePath = actualSettings.AdditionalFilePaths.First(); CheckFileIsXml(filePath); }
public void RoslynConfig_ValidProfile_BranchSpecific() { // Arrange string rootDir = CreateTestFolders(); TestLogger logger = new TestLogger(); TeamBuildSettings settings = CreateSettings(rootDir); // Differentiate the branch-specific and non-branch-specific profiles WellKnownProfile nonBranchSpecificProfile = CreateValidCSharpProfile(); WellKnownProfile branchSpecificProfile = CreateValidCSharpProfile(); branchSpecificProfile.AssemblyFilePaths.Add("e:\\assembly3.dll"); MockSonarQubeServer mockServer = CreateServer("valid.project", null, "valid.profile", nonBranchSpecificProfile); AddWellKnownProfileToServer("valid.project", "aBranch", "valid.anotherProfile", branchSpecificProfile, mockServer); MockAnalyzerInstaller mockInstaller = new MockAnalyzerInstaller(); mockInstaller.AssemblyPathsToReturn = new HashSet<string>(new string[] { "c:\\assembly1.dll", "d:\\foo\\assembly2.dll", "e:\\assembly3.dll" }); RoslynAnalyzerProvider testSubject = new RoslynAnalyzerProvider(mockInstaller, logger); // Act AnalyzerSettings actualSettings = testSubject.SetupAnalyzers(mockServer, settings, "valid.project", "aBranch"); // Assert CheckSettingsInvariants(actualSettings); logger.AssertWarningsLogged(0); logger.AssertErrorsLogged(0); CheckRuleset(actualSettings, rootDir); CheckExpectedAdditionalFiles(branchSpecificProfile, actualSettings); mockInstaller.AssertExpectedPackagesRequested(branchSpecificProfile.Packages); CheckExpectedAssemblies(actualSettings, "c:\\assembly1.dll", "d:\\foo\\assembly2.dll", "e:\\assembly3.dll"); }
public void RoslynConfig_ValidProfile() { // Arrange string rootDir = CreateTestFolders(); TestLogger logger = new TestLogger(); TeamBuildSettings settings = CreateSettings(rootDir); WellKnownProfile testProfile = CreateValidCSharpProfile(); MockSonarQubeServer mockServer = CreateServer("valid.project", null, "valid.profile", testProfile); MockAnalyzerInstaller mockInstaller = new MockAnalyzerInstaller(); mockInstaller.AssemblyPathsToReturn = new HashSet<string>(new string[] { "c:\\assembly1.dll", "d:\\foo\\assembly2.dll" }); RoslynAnalyzerProvider testSubject = new RoslynAnalyzerProvider(mockInstaller, logger); // Act AnalyzerSettings actualSettings = testSubject.SetupAnalyzers(mockServer, settings, "valid.project", null); // Assert CheckSettingsInvariants(actualSettings); logger.AssertWarningsLogged(0); logger.AssertErrorsLogged(0); CheckRuleset(actualSettings, rootDir); CheckExpectedAdditionalFiles(testProfile, actualSettings); mockInstaller.AssertExpectedPackagesRequested(testProfile.Packages); CheckExpectedAssemblies(actualSettings, "c:\\assembly1.dll", "d:\\foo\\assembly2.dll"); }
public void ReportProcessor_MultipleUrlsFound() { // Arrange MockReportUrlProvider urlProvider = new MockReportUrlProvider() { UrlsToReturn = new string[] { ValidUrl1, ValidUrl2 } }; MockReportDownloader downloader = new MockReportDownloader(); MockReportConverter converter = new MockReportConverter() { CanConvert = true }; AnalysisConfig context = this.CreateValidContext(); TeamBuildSettings settings = this.CreateValidSettings(); TestLogger logger = new TestLogger(); TfsLegacyCoverageReportProcessor processor = new TfsLegacyCoverageReportProcessor(urlProvider, downloader, converter); // Act bool initResult = processor.Initialise(context, settings, logger); Assert.IsTrue(initResult, "Expecting true: processor should have been initialised successfully"); bool result = processor.ProcessCoverageReports(); // Assert urlProvider.AssertGetUrlsCalled(); downloader.AssertDownloadNotCalled(); // Multiple urls so should early out converter.AssertConvertNotCalled(); Assert.IsFalse(result, "Expecting false: can't process multiple coverage reports"); logger.AssertErrorsLogged(1); logger.AssertWarningsLogged(0); }
public void RoslynConfig_MissingRuleset() { // Arrange string rootDir = CreateTestFolders(); TestLogger logger = new TestLogger(); TeamBuildSettings settings = CreateSettings(rootDir); MockSonarQubeServer mockServer = CreateValidServer("valid.project", null, "valid.profile"); QualityProfile csProfile = mockServer.Data.FindProfile("valid.profile", RoslynAnalyzerProvider.CSharpLanguage); csProfile.SetExport(RoslynAnalyzerProvider.RoslynCSharpFormatName, @"<?xml version=""1.0"" encoding=""utf-8""?> <RoslynExportProfile Version=""1.0=""> <Configuration> <!-- Missing ruleset --> <AdditionalFiles> <AdditionalFile FileName=""SonarLint.xml"" > </AdditionalFile> </AdditionalFiles> </Configuration> <Deployment> <NuGetPackages> <NuGetPackage Id=""SonarLint"" Version=""1.3.0""/> </NuGetPackages> </Deployment> </RoslynExportProfile>"); RoslynAnalyzerProvider testSubject = CreateTestSubject(logger); // Act AnalyzerSettings actualSettings = testSubject.SetupAnalyzers(mockServer, settings, "valid.project", null); // Assert AssertAnalyzerSetupNotPerformed(actualSettings, rootDir); logger.AssertErrorsLogged(0); logger.AssertWarningsLogged(0); }
public void ReportProcessor_SingleUrlFound_DownloadedOk() { // Arrange MockReportUrlProvider urlProvider = new MockReportUrlProvider() { UrlsToReturn = new string[] { ValidUrl2 } }; MockReportDownloader downloader = new MockReportDownloader(); MockReportConverter converter = new MockReportConverter() { CanConvert = true }; AnalysisConfig context = this.CreateValidContext(); TeamBuildSettings settings = this.CreateValidSettings(); TestLogger logger = new TestLogger(); downloader.CreateFileOnDownloadRequest = true; TfsLegacyCoverageReportProcessor processor = new TfsLegacyCoverageReportProcessor(urlProvider, downloader, converter); // Act bool initResult = processor.Initialise(context, settings, logger); Assert.IsTrue(initResult, "Expecting true: processor should have been initialised successfully"); bool result = processor.ProcessCoverageReports(); // Assert urlProvider.AssertGetUrlsCalled(); downloader.AssertExpectedDownloads(1); converter.AssertExpectedNumberOfConversions(1); downloader.AssertExpectedUrlsRequested(ValidUrl2); downloader.AssertExpectedTargetFileNamesSupplied(Path.Combine(context.SonarOutputDir, TfsLegacyCoverageReportProcessor.DownloadFileName)); Assert.IsTrue(result, "Expecting true: happy path"); logger.AssertWarningsLogged(0); logger.AssertErrorsLogged(0); }
public void ReportProcessor_NoUrlsFound() { // Arrange MockReportUrlProvider urlProvider = new MockReportUrlProvider() { UrlsToReturn = new string[] { } }; MockReportDownloader downloader = new MockReportDownloader(); MockReportConverter converter = new MockReportConverter() { CanConvert = true }; AnalysisConfig context = this.CreateValidContext(); TeamBuildSettings settings = this.CreateValidSettings(); TestLogger logger = new TestLogger(); TfsLegacyCoverageReportProcessor processor = new TfsLegacyCoverageReportProcessor(urlProvider, downloader, converter); // Act bool initResult = processor.Initialise(context, settings, logger); Assert.IsTrue(initResult, "Expecting true: processor should have been initialised successfully"); bool result = processor.ProcessCoverageReports(); // Assert urlProvider.AssertGetUrlsCalled(); downloader.AssertDownloadNotCalled(); // no urls returned, so should go any further converter.AssertConvertNotCalled(); Assert.IsTrue(result, "Expecting true: no coverage reports is a valid scenario"); logger.AssertWarningsLogged(0); logger.AssertErrorsLogged(0); }
public void PreProc_EndToEnd_SuccessCase() { // Checks end-to-end happy path for the pre-processor i.e. // * arguments are parsed // * targets are installed // * build wrapper installer is called // * server properties are fetched // * rulesets are generated // * config file is created // Arrange string workingDir = TestUtils.CreateTestSpecificFolder(this.TestContext); TestLogger logger = new TestLogger(); // Configure the server MockSonarQubeServer mockServer = new MockSonarQubeServer(); ServerDataModel data = mockServer.Data; data.ServerProperties.Add("server.key", "server value 1"); data.InstalledPlugins.Add("csharp"); data.InstalledPlugins.Add("vbnet"); data.AddRepository("fxcop", "cs") .AddRule("cs.rule1", "cs.rule1.internal") .AddRule("cs.rule2", "cs.rule2.internal"); data.AddRepository("fxcop-vbnet", "vbnet") .AddRule("vb.rule1", "vb.rule1.internal") .AddRule("vb.rule2", "vb.rule2.internal"); data.AddQualityProfile("test.profile", "cs") .AddProject("key"); data.AddRuleToProfile("cs.rule1", "test.profile"); data.AddQualityProfile("test.profile", "vbnet") .AddProject("key"); data.AddRuleToProfile("vb.rule2", "test.profile"); MockRoslynAnalyzerProvider mockAnalyzerProvider = new MockRoslynAnalyzerProvider(); mockAnalyzerProvider.SettingsToReturn = new AnalyzerSettings(); mockAnalyzerProvider.SettingsToReturn.RuleSetFilePath = "c:\\xxx.ruleset"; MockTargetsInstaller mockTargetsInstaller = new MockTargetsInstaller(); MockBuildWrapperInstaller mockBuildWrapperInstaller = new MockBuildWrapperInstaller(); MockObjectFactory mockFactory = new MockObjectFactory(mockServer, mockTargetsInstaller, mockAnalyzerProvider, mockBuildWrapperInstaller); string[] validArgs = new string[] { "/k:key", "/n:name", "/v:1.0", "/d:cmd.line1=cmdline.value.1", "/d:sonar.host.url=http://host", "/d:sonar.log.level=INFO|DEBUG"}; TeamBuildSettings settings; using (PreprocessTestUtils.CreateValidNonTeamBuildScope()) using (new WorkingDirectoryScope(workingDir)) { settings = TeamBuildSettings.GetSettingsFromEnvironment(new TestLogger()); Assert.IsNotNull(settings, "Test setup error: TFS environment variables have not been set correctly"); Assert.AreEqual(BuildEnvironment.NotTeamBuild, settings.BuildEnvironment, "Test setup error: build environment was not set correctly"); TeamBuildPreProcessor preProcessor = new TeamBuildPreProcessor(mockFactory, logger); // Act bool success = preProcessor.Execute(validArgs); Assert.IsTrue(success, "Expecting the pre-processing to complete successfully"); } // Assert AssertDirectoryExists(settings.AnalysisBaseDirectory); AssertDirectoryExists(settings.SonarConfigDirectory); AssertDirectoryExists(settings.SonarOutputDirectory); // The bootstrapper is responsible for creating the bin directory mockTargetsInstaller.AssertsTargetsCopied(); mockServer.AssertMethodCalled("GetProperties", 1); mockServer.AssertMethodCalled("GetInternalKeys", 2); // C# and VB mockBuildWrapperInstaller.AssertExpectedCallCount(1); logger.AssertErrorsLogged(0); logger.AssertWarningsLogged(0); logger.AssertVerbosity(LoggerVerbosity.Debug); AssertConfigFileExists(settings.AnalysisConfigFilePath); AnalysisConfig actualConfig = AnalysisConfig.Load(settings.AnalysisConfigFilePath); Assert.AreEqual("key", actualConfig.SonarProjectKey, "Unexpected project key"); Assert.AreEqual("name", actualConfig.SonarProjectName, "Unexpected project name"); Assert.AreEqual("1.0", actualConfig.SonarProjectVersion, "Unexpected project version"); Assert.IsNotNull(actualConfig.AnalyzerSettings, "Analyzer settings should not be null"); Assert.AreEqual("c:\\xxx.ruleset", actualConfig.AnalyzerSettings.RuleSetFilePath, "Unexpected ruleset path"); AssertExpectedLocalSetting(SonarProperties.HostUrl, "http://host", actualConfig); AssertExpectedLocalSetting("cmd.line1", "cmdline.value.1", actualConfig); AssertExpectedServerSetting("server.key", "server value 1", actualConfig); string fxCopFilePath = AssertFileExists(settings.SonarConfigDirectory, TeamBuildPreProcessor.FxCopCSharpRuleset); PreProcessAsserts.AssertRuleSetContainsRules(fxCopFilePath, "cs.rule1"); fxCopFilePath = AssertFileExists(settings.SonarConfigDirectory, TeamBuildPreProcessor.FxCopVBNetRuleset); PreProcessAsserts.AssertRuleSetContainsRules(fxCopFilePath, "vb.rule2"); }
private static TestLogger CheckProcessingFails(params string[] cmdLineArgs) { TestLogger logger = new TestLogger(); IBootstrapperSettings settings; bool success = ArgumentProcessor.TryProcessArgs(cmdLineArgs, logger, out settings); Assert.IsFalse(success, "Expecting processing to fail"); Assert.IsNull(settings, "Settings should be null if processing fails"); logger.AssertErrorsLogged(); return logger; }