public static AnalysisConfig GenerateFile(ProcessedArgs args, TeamBuildSettings settings, IDictionary<string, string> serverProperties, ILogger logger) { if (args == null) { throw new ArgumentNullException("args"); } if (settings == null) { throw new ArgumentNullException("settings"); } if (serverProperties == null) { throw new ArgumentNullException("serverProperties"); } if (logger == null) { throw new ArgumentNullException("logger"); } AnalysisConfig config = new AnalysisConfig(); config.SonarProjectKey = args.ProjectKey; config.SonarProjectName = args.ProjectName; config.SonarProjectVersion = args.ProjectVersion; config.SonarQubeHostUrl = args.GetSetting(SonarProperties.HostUrl); config.SetBuildUri(settings.BuildUri); config.SetTfsUri(settings.TfsUri); config.SonarConfigDir = settings.SonarConfigDirectory; config.SonarOutputDir = settings.SonarOutputDirectory; config.SonarBinDir = settings.SonarBinDirectory; config.SonarRunnerWorkingDirectory = settings.SonarRunnerWorkingDirectory; // Add the server properties to the config config.ServerSettings = new AnalysisProperties(); foreach (var property in serverProperties) { if (!IsSecuredServerProperty(property.Key)) { AddSetting(config.ServerSettings, property.Key, property.Value); } } // Add command line arguments config.LocalSettings = new AnalysisProperties(); foreach (var property in args.LocalProperties.GetAllProperties()) { AddSetting(config.LocalSettings, property.Id, property.Value); } // Set the pointer to the properties file if (args.PropertiesFileName != null) { config.SetSettingsFilePath(args.PropertiesFileName); } config.Save(settings.AnalysisConfigFilePath); return config; }
public void GetAnalyzerSettings_ConfigExists_DataReturned() { // Arrange string testDir = TestUtils.CreateTestSpecificFolder(this.TestContext); GetAnalyzerSettings testSubject = new GetAnalyzerSettings(); string[] expectedAnalyzers = new string[] { "c:\\analyzer1.DLL", "c:\\analyzer2.dll" }; string[] expectedAdditionalFiles = new string[] { "c:\\add1.txt", "d:\\add2.txt" }; // SONARMSBRU-216: non-assembly files should be filtered out List<string> filesInConfig = new List<string>(expectedAnalyzers); filesInConfig.Add("c:\\not_an_assembly.exe"); filesInConfig.Add("c:\\not_an_assembly.zip"); filesInConfig.Add("c:\\not_an_assembly.txt"); filesInConfig.Add("c:\\not_an_assembly.dll.foo"); filesInConfig.Add("c:\\not_an_assembly.winmd"); AnalysisConfig config = new AnalysisConfig(); config.AnalyzerSettings = new AnalyzerSettings(); config.AnalyzerSettings.RuleSetFilePath = "f:\\yyy.ruleset"; config.AnalyzerSettings.AnalyzerAssemblyPaths = filesInConfig; config.AnalyzerSettings.AdditionalFilePaths = expectedAdditionalFiles.ToList(); string fullPath = Path.Combine(testDir, FileConstants.ConfigFileName); config.Save(fullPath); testSubject.AnalysisConfigDir = testDir; // Act ExecuteAndCheckSuccess(testSubject); // Assert Assert.AreEqual("f:\\yyy.ruleset", testSubject.RuleSetFilePath); CollectionAssert.AreEquivalent(expectedAnalyzers, testSubject.AnalyzerFilePaths); CollectionAssert.AreEquivalent(expectedAdditionalFiles, testSubject.AdditionalFiles); }
public void Roslyn_Settings_ValidSetup() { // Arrange BuildLogger logger = new BuildLogger(); // Set the config directory so the targets know where to look for the analysis config file string confDir = TestUtils.CreateTestSpecificFolder(this.TestContext, "config"); // Create a valid config file containing analyzer settings string[] expectedAssemblies = new string[] { "c:\\data\\config.analyzer1.dll", "c:\\config2.dll" }; string[] expectedAdditionalFiles = new string[] { "c:\\config.1.txt", "c:\\config.2.txt" }; AnalysisConfig config = new AnalysisConfig(); config.AnalyzerSettings = new AnalyzerSettings(); config.AnalyzerSettings.RuleSetFilePath = "d:\\my.ruleset"; config.AnalyzerSettings.AnalyzerAssemblyPaths = expectedAssemblies.ToList(); config.AnalyzerSettings.AdditionalFilePaths = expectedAdditionalFiles.ToList(); string configFilePath = Path.Combine(confDir, FileConstants.ConfigFileName); config.Save(configFilePath); // Create the project WellKnownProjectProperties properties = new WellKnownProjectProperties(); properties.SonarQubeConfigPath = confDir; properties.ResolvedCodeAnalysisRuleset = "c:\\should.be.overridden.ruleset"; ProjectRootElement projectRoot = CreateValidProjectSetup(properties); projectRoot.AddItem(TargetProperties.AnalyzerItemType, "should.be.removed.analyzer1.dll"); projectRoot.AddItem(TargetProperties.AnalyzerItemType, "c:\\should.be.removed.analyzer2.dll"); projectRoot.AddItem(TargetProperties.AdditionalFilesItemType, "should.be.removed.additional1.txt"); projectRoot.AddItem(TargetProperties.AdditionalFilesItemType, "should.be.removed.additional2.txt"); // Act BuildResult result = BuildUtilities.BuildTargets(projectRoot, logger, TargetConstants.OverrideRoslynAnalysisTarget); // Assert logger.AssertTargetExecuted(TargetConstants.OverrideRoslynAnalysisTarget); logger.AssertTargetExecuted(TargetConstants.SetRoslynAnalysisPropertiesTarget); BuildAssertions.AssertTargetSucceeded(result, TargetConstants.OverrideRoslynAnalysisTarget); // Check the error log and ruleset properties are set AssertErrorLogIsSetBySonarQubeTargets(result); AssertExpectedResolvedRuleset(result, "d:\\my.ruleset"); AssertExpectedItemValuesExists(result, TargetProperties.AdditionalFilesItemType, expectedAdditionalFiles); AssertExpectedItemValuesExists(result, TargetProperties.AnalyzerItemType, expectedAssemblies); BuildAssertions.AssertWarningsAreNotTreatedAsErrorsNorIgnored(result); }
public void GetAnalyzerSettings_ConfigExistsButNoAnalyzerSettings_NoError() { // Arrange string testDir = TestUtils.CreateTestSpecificFolder(this.TestContext); GetAnalyzerSettings testSubject = new GetAnalyzerSettings(); AnalysisConfig config = new AnalysisConfig(); string fullPath = Path.Combine(testDir, FileConstants.ConfigFileName); config.Save(fullPath); testSubject.AnalysisConfigDir = testDir; // Act ExecuteAndCheckSuccess(testSubject); // Assert CheckNoAnalyzerSettings(testSubject); }
public void E2E_FxCop_TestProject_TestProjectByName() { // Arrange string rootInputFolder = TestUtils.CreateTestSpecificFolder(this.TestContext, "Inputs"); string rootOutputFolder = TestUtils.CreateTestSpecificFolder(this.TestContext, "Outputs"); string fxCopLogFile = Path.Combine(rootInputFolder, "FxCopResults.xml"); WellKnownProjectProperties preImportProperties = new WellKnownProjectProperties(); preImportProperties.SonarQubeTempPath = rootOutputFolder; // FIXME preImportProperties.SonarQubeOutputPath = rootOutputFolder; preImportProperties.CodeAnalysisLogFile = fxCopLogFile; preImportProperties.CodeAnalysisRuleset = "specifiedInProject.ruleset"; preImportProperties.SonarQubeConfigPath = rootInputFolder; preImportProperties[TargetProperties.SonarQubeConfigPath] = rootInputFolder; CreateValidFxCopRuleset(rootInputFolder, string.Format(TargetProperties.SonarQubeRulesetFormat, "cs")); // Create a config file in the config folder containing a reg ex to identify tests projects AnalysisConfig config = new AnalysisConfig(); config.LocalSettings = new AnalysisProperties(); config.LocalSettings.Add(new Property() { Id = IsTestFileByName.TestRegExSettingId, Value = ".testp." }); string configFullPath = Path.Combine(rootInputFolder, FileConstants.ConfigFileName); config.Save(configFullPath); // Create a project with a file name that will match the reg ex ProjectDescriptor descriptor = BuildUtilities.CreateValidProjectDescriptor(rootInputFolder, "MyTestProject.proj"); ProjectRootElement projectRoot = BuildUtilities.CreateInitializedProjectRoot(this.TestContext, descriptor, preImportProperties); // Add a file to the project string itemPath = TestUtils.CreateTextFile(rootInputFolder, "code1.cs", "class myclassXXX{}"); projectRoot.AddItem(TargetProperties.ItemType_Compile, itemPath); projectRoot.Save(); BuildLogger logger = new BuildLogger(); // Act BuildResult result = BuildUtilities.BuildTargets(projectRoot, logger); // Assert BuildAssertions.AssertTargetSucceeded(result, TargetConstants.DefaultBuildTarget); logger.AssertExpectedTargetOrdering( TargetConstants.CategoriseProjectTarget, TargetConstants.OverrideFxCopSettingsTarget, TargetConstants.FxCopTarget, TargetConstants.DefaultBuildTarget, TargetConstants.CalculateFilesToAnalyzeTarget, TargetConstants.WriteProjectDataTarget); // We expect the FxCop target to be executed... logger.AssertTargetExecuted(TargetConstants.FxCopTarget); // ... but we don't expect the FxCop *task* to have executed logger.AssertTaskNotExecuted(TargetConstants.FxCopTask); logger.AssertTargetNotExecuted(TargetConstants.SetFxCopResultsTarget); ProjectInfo projectInfo = ProjectInfoAssertions.AssertProjectInfoExists(rootOutputFolder, projectRoot.FullPath); ProjectInfoAssertions.AssertAnalysisResultDoesNotExists(projectInfo, AnalysisType.FxCop.ToString()); }
/// <summary> /// Ensures an analysis config file exists in the specified directory, /// replacing one if it already exists. /// If the supplied "regExExpression" is not null then the appropriate setting /// entry will be created in the file /// </summary> private static string EnsureAnalysisConfig(string parentDir, string regExExpression) { AnalysisConfig config = new AnalysisConfig(); if (regExExpression != null) { config.LocalSettings = new AnalysisProperties(); config.LocalSettings.Add(new Property() { Id = IsTestFileByName.TestRegExSettingId, Value = regExExpression }); } string fullPath = Path.Combine(parentDir, FileConstants.ConfigFileName); if (File.Exists(fullPath)) { File.Delete(fullPath); } config.Save(fullPath); return fullPath; }
/// <summary> /// Creates a configuration file in the specified directory. /// If an output directory is supplied then the value of the build wrapper output property /// will be set to that value. /// </summary> private static string CreateConfigFile(string configDir, string buildWrapperOutputDir) { AnalysisConfig config = new AnalysisConfig(); config.LocalSettings = new AnalysisProperties(); if (buildWrapperOutputDir != null) { config.LocalSettings.Add(new Property() { Id = BuildOutputSettingName, Value = buildWrapperOutputDir }); } string filePath = Path.Combine(configDir, FileConstants.ConfigFileName); config.Save(filePath); return filePath; }
/// <summary> /// Ensures an analysis config file exists in the specified directory, /// replacing one if it already exists. /// If the supplied "regExExpression" is not null then the appropriate setting /// entry will be created in the file /// </summary> private static string CreateAnalysisConfig(string parentDir) { string fullPath = Path.Combine(parentDir, FileConstants.ConfigFileName); AnalysisConfig config = new AnalysisConfig(); config.Save(fullPath); return fullPath; }
public void GetAnalyzerSettings_ConfigExists_DataReturned() { // Arrange string testDir = TestUtils.CreateTestSpecificFolder(this.TestContext); GetAnalyzerSettings testSubject = new GetAnalyzerSettings(); string[] expectedAnalyzers = new string[] { "c:\\analyzer1.dll", "c:\\analyzer2.dll" }; string[] expectedAdditionalFiles = new string[] { "c:\\add1.txt", "d:\\add2.txt" }; AnalysisConfig config = new AnalysisConfig(); config.AnalyzerSettings = new AnalyzerSettings(); config.AnalyzerSettings.RuleSetFilePath = "f:\\yyy.ruleset"; config.AnalyzerSettings.AnalyzerAssemblyPaths = expectedAnalyzers.ToList(); config.AnalyzerSettings.AdditionalFilePaths = expectedAdditionalFiles.ToList(); string fullPath = Path.Combine(testDir, FileConstants.ConfigFileName); config.Save(fullPath); testSubject.AnalysisConfigDir = testDir; // Act ExecuteAndCheckSuccess(testSubject); // Assert Assert.AreEqual("f:\\yyy.ruleset", testSubject.RuleSetFilePath); CollectionAssert.AreEquivalent(expectedAnalyzers, testSubject.AnalyzerFilePaths); CollectionAssert.AreEquivalent(expectedAdditionalFiles, testSubject.AdditionalFiles); }
public void Roslyn_Settings_SettingsMissing_NoError() { // Arrange BuildLogger logger = new BuildLogger(); // Set the config directory so the targets know where to look for the analysis config file string confDir = TestUtils.CreateTestSpecificFolder(this.TestContext, "config"); // Create a valid config file that does not contain analyzer settings AnalysisConfig config = new AnalysisConfig(); string configFilePath = Path.Combine(confDir, FileConstants.ConfigFileName); config.Save(configFilePath); // Create the project WellKnownProjectProperties properties = new WellKnownProjectProperties(); properties.SonarQubeConfigPath = confDir; properties.ResolvedCodeAnalysisRuleset = "c:\\should.be.overridden.ruleset"; ProjectRootElement projectRoot = CreateValidProjectSetup(properties); projectRoot.AddItem(TargetProperties.AnalyzerItemType, "should.be.removed.analyzer1.dll"); projectRoot.AddItem(TargetProperties.AdditionalFilesItemType, "should.be.removed.additional1.txt"); // Act BuildResult result = BuildUtilities.BuildTargets(projectRoot, logger, TargetConstants.OverrideRoslynAnalysisTarget); // Assert logger.AssertTargetExecuted(TargetConstants.OverrideRoslynAnalysisTarget); logger.AssertTargetExecuted(TargetConstants.SetRoslynAnalysisPropertiesTarget); BuildAssertions.AssertTargetSucceeded(result, TargetConstants.OverrideRoslynAnalysisTarget); // Check the error log and ruleset properties are set AssertErrorLogIsSetBySonarQubeTargets(result); AssertExpectedResolvedRuleset(result, string.Empty); BuildAssertions.AssertExpectedItemGroupCount(result, TargetProperties.AnalyzerItemType, 0); BuildAssertions.AssertExpectedItemGroupCount(result, TargetProperties.AdditionalFilesItemType, 0); }