public override int Run(ExportConfigurationOptions exportOptions) { int result = FAILURE; try { PropertiesDictionary allOptions = new PropertiesDictionary(); // The export command could be updated in the future to accept an arbitrary set // of analyzers for which to build an options XML file suitable for configuring them. // Currently, we perform discovery against the built-in CodeFormatter rules // and analyzers only. ImmutableArray <IOptionsProvider> providers = DriverUtilities.GetExports <IOptionsProvider>(DefaultPlugInAssemblies); foreach (IOptionsProvider provider in providers) { foreach (IOption option in provider.GetOptions()) { allOptions.SetProperty(option, option.DefaultValue, cacheDescription: true); } } string extension = Path.GetExtension(exportOptions.OutputFilePath); if (extension.Equals(".xml", StringComparison.OrdinalIgnoreCase)) { allOptions.SaveToXml(exportOptions.OutputFilePath); } else if (extension.Equals(".json", StringComparison.OrdinalIgnoreCase)) { allOptions.SaveToJson(exportOptions.OutputFilePath); } else if (exportOptions.FileFormat == FileFormat.Xml) { allOptions.SaveToXml(exportOptions.OutputFilePath); } else { allOptions.SaveToJson(exportOptions.OutputFilePath); } Console.WriteLine("Configuration file saved to: " + Path.GetFullPath(exportOptions.OutputFilePath)); result = SUCCESS; } catch (Exception ex) { Console.Error.WriteLine(ex.ToString()); } return(result); }
public void AnalyzeCommand_ReportsWarningOnUnsupportedPlatformForRuleAndNoRulesLoaded() { PropertiesDictionary allRulesDisabledConfiguration = ExportConfigurationCommandBaseTests.s_allRulesDisabledConfiguration; string path = Path.GetTempFileName() + ".xml"; try { allRulesDisabledConfiguration.SaveToXml(path); var options = new TestAnalyzeOptions() { TargetFileSpecifiers = new string[] { GetThisTestAssemblyFilePath() }, ConfigurationFilePath = path }; // There are two default rules.One of which is disabled by configuration, // the other is disabled as unsupported on current platform. ExceptionTestHelper( ExceptionCondition.InvalidPlatform, RuntimeConditions.NoRulesLoaded | RuntimeConditions.RuleWasExplicitlyDisabled | RuntimeConditions.RuleCannotRunOnPlatform, expectedExitReason: ExitReason.NoRulesLoaded, analyzeOptions: options); } finally { if (File.Exists(path)) { File.Delete(path); } } }
public void AnalyzeCommandBase_EndToEndAnalysisWithExplicitlyDisabledRules() { PropertiesDictionary allRulesDisabledConfiguration = ExportConfigurationCommandBaseTests.s_allRulesDisabledConfiguration; string path = Path.GetTempFileName() + ".xml"; try { allRulesDisabledConfiguration.SaveToXml(path); string location = GetThisTestAssemblyFilePath(); Run run = AnalyzeFile( location, configFileName: path, runtimeConditions: RuntimeConditions.RuleWasExplicitlyDisabled | RuntimeConditions.NoRulesLoaded, expectedReturnCode: TestAnalyzeCommand.FAILURE); int resultCount = 0; int toolNotificationCount = 0; int configurationNotificationCount = 0; SarifHelpers.ValidateRun( run, (issue) => { resultCount++; }, (toolNotification) => { toolNotificationCount++; }, (configurationNotification) => { configurationNotificationCount++; }); // When rules are disabled, we expect a configuration warning for each // disabled check that documents it was turned off for the analysis. resultCount.Should().Be(0); // Three notifications. One for each disabled rule, i.e. SimpleTestRule // and SimpleTestRule + an error notification that all rules have been disabled configurationNotificationCount.Should().Be(3); run.Invocations.Should().NotBeNull(); run.Invocations.Count.Should().Be(1); // Error: all rules were disabled run.Invocations[0].ToolConfigurationNotifications.Count((notification) => notification.Level == FailureLevel.Error).Should().Be(1); run.Invocations[0].ToolConfigurationNotifications.Count((notification) => notification.Descriptor.Id == Errors.ERR997_AllRulesExplicitlyDisabled).Should().Be(1); // Warnings: one per disabled rule. run.Invocations[0].ToolConfigurationNotifications.Count((notification) => notification.Level == FailureLevel.Warning).Should().Be(2); run.Invocations[0].ToolConfigurationNotifications.Where((notification) => notification.Descriptor.Id == Warnings.Wrn999_RuleExplicitlyDisabled).Count().Should().Be(2); // We raised a notification error, which means the invocation failed. run.Invocations[0].ExecutionSuccessful.Should().Be(false); toolNotificationCount.Should().Be(0); } finally { if (File.Exists(path)) { File.Delete(path); } } }
public void AnalyzeCommand_EndToEndAnalysisWithExplicitlyDisabledRules() { PropertiesDictionary allRulesDisabledConfiguration = ExportConfigurationCommandBaseTests.s_allRulesDisabledConfiguration; string path = Path.GetTempFileName() + ".xml"; try { allRulesDisabledConfiguration.SaveToXml(path); string location = GetThisTestAssemblyFilePath(); Run run = AnalyzeFile( location, configFileName: path, runtimeConditions: RuntimeConditions.RuleWasExplicitlyDisabled | RuntimeConditions.NoRulesLoaded, expectedReturnCode: TestAnalyzeCommand.FAILURE); int resultCount = 0; int toolNotificationCount = 0; int configurationNotificationCount = 0; SarifHelpers.ValidateRun( run, (issue) => { resultCount++; }, (toolNotification) => { toolNotificationCount++; }, (configurationNotification) => { configurationNotificationCount++; }); // When rules are disabled, we expect a configuration warning for each // disabled check that documents it was turned off for the analysis. resultCount.Should().Be(0); // Three notifications. One for each disabled rule. And an error // notification that all rules have been disabled configurationNotificationCount.Should().Be(4); run.Invocations.Should().NotBeNull(); run.Invocations.Count.Should().Be(1); run.Invocations[0].ConfigurationNotifications.Where((notification) => notification.Level == NotificationLevel.Error).Count().Should().Be(1); run.Invocations[0].ConfigurationNotifications.Where((notification) => notification.Level == NotificationLevel.Warning).Count().Should().Be(3); run.Invocations[0].ConfigurationNotifications.Where((notification) => notification.Id == Warnings.Wrn999_RuleExplicitlyDisabled).Count().Should().Be(3); toolNotificationCount.Should().Be(0); } finally { if (File.Exists(path)) { File.Delete(path); } } }
public void AnalyzeCommand_FireAllRules() { PropertiesDictionary configuration = ExportConfigurationCommandBaseTests.s_defaultConfiguration; string path = Path.GetTempFileName() + ".xml"; configuration.SetProperty(SimpleTestRule.Behaviors, TestRuleBehaviors.LogError); try { configuration.SaveToXml(path); string location = GetThisTestAssemblyFilePath(); Run run = AnalyzeFile(location, configFileName: path); int resultCount = 0; int toolNotificationCount = 0; int configurationNotificationCount = 0; SarifHelpers.ValidateRun( run, (issue) => { resultCount++; }, (toolNotification) => { toolNotificationCount++; }, (configurationNotification) => { configurationNotificationCount++; }); // By default, the exception raising rule produces a single error. // The simple test rule doesn't raise anything without add'l configuration resultCount.Should().Be(2); run.Results.Where((result) => result.Level == ResultLevel.Error).Count().Should().Be(1); run.Results.Where((result) => result.Level == ResultLevel.Warning).Count().Should().Be(1); run.Results.Where((result) => result.Level == ResultLevel.NotApplicable).Count().Should().Be(0); toolNotificationCount.Should().Be(1); configurationNotificationCount.Should().Be(0); } finally { if (File.Exists(path)) { File.Delete(path); } } }
public void AnalyzeCommandBase_FireAllRules() { PropertiesDictionary configuration = ExportConfigurationCommandBaseTests.s_defaultConfiguration; string path = Path.GetTempFileName() + ".xml"; configuration.SetProperty(TestRule.Behaviors, TestRuleBehaviors.LogError); try { configuration.SaveToXml(path); string location = GetThisTestAssemblyFilePath(); Run run = AnalyzeFile(location, configFileName: path); int resultCount = 0; int toolNotificationCount = 0; int configurationNotificationCount = 0; SarifHelpers.ValidateRun( run, (issue) => { resultCount++; }, (toolNotification) => { toolNotificationCount++; }, (configurationNotification) => { configurationNotificationCount++; }); // As configured by context, we should see a single error raised. resultCount.Should().Be(1); run.Results.Count((result) => result.Level == FailureLevel.Error).Should().Be(1); toolNotificationCount.Should().Be(0); configurationNotificationCount.Should().Be(0); } finally { if (File.Exists(path)) { File.Delete(path); } } }
private TempFile CreateTempConfigFile(string ruleId, object parameter) { var propertiesDictionary = new PropertiesDictionary(); if (IsSarifRule(ruleId)) { var rulePropertiesDictionary = new PropertiesDictionary(); SarifValidationSkimmerBase rule = GetRuleFromId(ruleId); RuleEnabledState ruleEnabledState = GetRuleEnabledState(rule); rulePropertiesDictionary.Add(nameof(DefaultDriverOptions.RuleEnabled), ruleEnabledState); if (parameter is KeyValuePair <string, object> pair) { rulePropertiesDictionary.Add(pair.Key, pair.Value); } propertiesDictionary.Add($"{rule.Moniker}.Options", rulePropertiesDictionary); } var tempFile = new TempFile(".xml"); propertiesDictionary.SaveToXml(tempFile.Name); return(tempFile); }
public void AnalyzeCommandBase_ReportsWarningOnUnsupportedPlatformForRuleAndNoRulesLoaded() { PropertiesDictionary allRulesDisabledConfiguration = ExportConfigurationCommandBaseTests.s_allRulesDisabledConfiguration; string path = Path.GetTempFileName() + ".xml"; try { allRulesDisabledConfiguration.SaveToXml(path); var options = new TestAnalyzeOptions() { // This option needs to be specified here as the file-based // configuration has not yet been read when skimmers are loaded. // This means we can't use that data to inject a skimmer // behavior to assert that it doesn't work against the current // platform. TestRuleBehaviors = TestRuleBehaviors.TreatPlatformAsInvalid, TargetFileSpecifiers = new string[] { GetThisTestAssemblyFilePath() }, ConfigurationFilePath = path }; // There are two default rules. One of which is disabled by configuration, // the other is disabled as unsupported on current platform. ExceptionTestHelper( RuntimeConditions.NoRulesLoaded | RuntimeConditions.RuleWasExplicitlyDisabled | RuntimeConditions.RuleCannotRunOnPlatform, expectedExitReason: ExitReason.NoRulesLoaded, analyzeOptions: options); } finally { if (File.Exists(path)) { File.Delete(path); } } }
public override int Run(ExportConfigurationOptions exportOptions) { int result = FAILURE; try { PropertiesDictionary allOptions = new PropertiesDictionary(); // The export command could be updated in the future to accept an arbitrary set // of analyzers for which to build an options XML file suitable for configuring them. ImmutableArray <IOptionsProvider> providers = DriverUtilities.GetExports <IOptionsProvider>(DefaultPlugInAssemblies); foreach (IOptionsProvider provider in providers) { IOption sampleOption = null; // Every analysis options provider has access to the following default configuration knobs foreach (IOption option in provider.GetOptions()) { sampleOption = sampleOption ?? option; allOptions.SetProperty(option, option.DefaultValue, cacheDescription: true); } } IEnumerable <IRule> rules; rules = DriverUtilities.GetExports <IRule>(DefaultPlugInAssemblies); // This code injects properties that are provided for every rule instance. foreach (IRule rule in rules) { object objectResult; PropertiesDictionary properties; string ruleOptionsKey = rule.Id + "." + rule.Name + ".Options"; if (!allOptions.TryGetValue(ruleOptionsKey, out objectResult)) { objectResult = allOptions[ruleOptionsKey] = new PropertiesDictionary(); } properties = (PropertiesDictionary)objectResult; foreach (IOption option in DefaultDriverOptions.Instance.GetOptions()) { properties.SetProperty(option, option.DefaultValue, cacheDescription: true, persistToSettingsContainer: false); } } string extension = Path.GetExtension(exportOptions.OutputFilePath); if (extension.Equals(".xml", StringComparison.OrdinalIgnoreCase)) { allOptions.SaveToXml(exportOptions.OutputFilePath); } else if (extension.Equals(".json", StringComparison.OrdinalIgnoreCase)) { allOptions.SaveToJson(exportOptions.OutputFilePath); } else if (exportOptions.FileFormat == FileFormat.Xml) { allOptions.SaveToXml(exportOptions.OutputFilePath); } else { allOptions.SaveToJson(exportOptions.OutputFilePath); } Console.WriteLine("Configuration file saved to: " + Path.GetFullPath(exportOptions.OutputFilePath)); result = SUCCESS; } catch (Exception ex) { Console.Error.WriteLine(ex.ToString()); } return(result); }