public async Task GetRules_AbortIfCancellationRequested() { // Arrange var testLogger = new TestLogger(); CancellationTokenSource cts = new CancellationTokenSource(); var serviceMock = new Mock <ISonarQubeService>(); serviceMock.Setup(x => x.GetRulesAsync(It.IsAny <bool>(), It.IsAny <string>(), It.IsAny <CancellationToken>())) .ReturnsAsync(() => { cts.Cancel(); return(new List <SonarQubeRule>()); }); var testSubject = new CFamilyBindingConfigProvider(serviceMock.Object, testLogger); // Act var result = await testSubject.GetConfigurationAsync(CreateQp(), null, Language.Cpp, cts.Token); // Assert result.Should().BeNull(); testLogger.AssertPartialOutputStringExists(CoreStrings.SonarQubeRequestTimeoutOrCancelled); }
public async Task GetRules_NoData_EmptyResultReturned() { // Arrange var testLogger = new TestLogger(); var serviceMock = new Mock <ISonarQubeService>(); serviceMock.Setup(x => x.GetRulesAsync(It.IsAny <bool>(), It.IsAny <string>(), It.IsAny <CancellationToken>())) .ReturnsAsync(() => new List <SonarQubeRule>()); var testSubject = new CFamilyBindingConfigProvider(serviceMock.Object, testLogger); // Act var result = await testSubject.GetConfigurationAsync(CreateQp(), null, Language.Cpp, CancellationToken.None); // Assert result.Should().NotBeNull(); result.Should().BeOfType <CFamilyBindingConfigFile>(); var cfamilyConfigFile = (CFamilyBindingConfigFile)result; cfamilyConfigFile.RuleSettings.Should().NotBeNull(); cfamilyConfigFile.RuleSettings.Rules.Should().NotBeNull(); cfamilyConfigFile.RuleSettings.Rules.Count.Should().Be(0); testLogger.AssertNoOutputMessages(); }
public async Task GetRules_Success() { // Arrange var testLogger = new TestLogger(); var rules = new List <SonarQubeRule> { CreateRule("key1", "repo1", true, SonarQubeIssueSeverity.Major), CreateRule("key2", "repo2", false, SonarQubeIssueSeverity.Info, new Dictionary <string, string> { { "p1", "v1" }, { "p2", "v2" } }) }; var serviceMock = new Mock <ISonarQubeService>(); serviceMock.Setup(x => x.GetRulesAsync(true, It.IsAny <string>(), It.IsAny <CancellationToken>())) .ReturnsAsync(() => rules); var bindingConfiguration = new BindingConfiguration(new BoundSonarQubeProject { ProjectKey = "test" }, SonarLintMode.Connected, "c:\\"); var testSubject = new CFamilyBindingConfigProvider(serviceMock.Object, testLogger); // Act var result = await testSubject.GetConfigurationAsync(CreateQp(), Language.Cpp, bindingConfiguration, CancellationToken.None); // Assert result.Should().NotBeNull(); result.Should().BeOfType <CFamilyBindingConfig>(); var cfamilyConfigFile = (CFamilyBindingConfig)result; cfamilyConfigFile.RuleSettings.Should().NotBeNull(); var slvsRules = cfamilyConfigFile.RuleSettings.Rules; slvsRules.Should().NotBeNull(); slvsRules.Keys.Should().BeEquivalentTo("repo1:key1", "repo2:key2"); slvsRules["repo1:key1"].Level.Should().Be(RuleLevel.On); slvsRules["repo2:key2"].Level.Should().Be(RuleLevel.Off); slvsRules["repo1:key1"].Severity.Should().Be(IssueSeverity.Major); slvsRules["repo2:key2"].Severity.Should().Be(IssueSeverity.Info); slvsRules["repo1:key1"].Parameters.Should().BeNull(); var rule2Params = slvsRules["repo2:key2"].Parameters; rule2Params.Should().NotBeNull(); rule2Params.Keys.Should().BeEquivalentTo("p1", "p2"); rule2Params["p1"].Should().Be("v1"); rule2Params["p2"].Should().Be("v2"); testLogger.AssertNoOutputMessages(); }
internal static /* for testing purposes */ IBindingProcess CreateBindingProcess(IHost host, BindCommandArgs bindingArgs) { // Choose the type of binding var configProvider = host.GetService <IConfigurationProvider>(); configProvider.AssertLocalServiceIsNotNull(); var currentConfiguration = configProvider.GetConfiguration(); SonarLintMode modeToBind; INuGetBindingOperation nugetBindingOp; // If we are currently in standalone then the project is being bound for the first time. // Otherwise, we are updating an existing binding var isFirstBinding = currentConfiguration.Mode == SonarLintMode.Standalone; if (currentConfiguration.Mode == SonarLintMode.LegacyConnected) { host.Logger.WriteLine(Strings.Bind_UpdatingLegacyBinding); modeToBind = SonarLintMode.LegacyConnected; nugetBindingOp = new NuGetBindingOperation(host, host.Logger); } else { host.Logger.WriteLine( isFirstBinding ? Strings.Bind_FirstTimeBinding : Strings.Bind_UpdatingNewStyleBinding); modeToBind = SonarLintMode.Connected; nugetBindingOp = new NoOpNuGetBindingOperation(host.Logger); } var solutionBindingOp = new SolutionBindingOperation( host, bindingArgs.Connection, bindingArgs.ProjectKey, bindingArgs.ProjectName, modeToBind, host.Logger); var unboundProjectFinder = new UnboundProjectFinder(host); var dotNetConfigProvider = new DotNetBindingConfigProvider(host.SonarQubeService, nugetBindingOp, bindingArgs.Connection.ServerUri.ToString(), bindingArgs.ProjectName, host.Logger); var cppConfigProvider = new CFamilyBindingConfigProvider(host.SonarQubeService, host.Logger); var ruleConfigProvider = new CompositeBindingConfigProvider(dotNetConfigProvider, cppConfigProvider); var bindingProcess = new BindingProcessImpl(host, bindingArgs, solutionBindingOp, nugetBindingOp, unboundProjectFinder, ruleConfigProvider, isFirstBinding); return(bindingProcess); }
public void GetRules_UnsupportedLanguage_Throws() { // Arrange var testLogger = new TestLogger(); CancellationTokenSource cts = new CancellationTokenSource(); var serviceMock = new Mock <ISonarQubeService>(); var testSubject = new CFamilyBindingConfigProvider(serviceMock.Object, testLogger); // Act Action act = () => testSubject.GetConfigurationAsync(CreateQp(), null, Language.VBNET, cts.Token).Wait(); // Assert act.Should().ThrowExactly <AggregateException>().And.InnerException.Should().BeOfType <ArgumentOutOfRangeException>(); }
public void IsSupported() { // Arrange var testLogger = new TestLogger(); var serviceMock = new Mock <ISonarQubeService>(); var testSubject = new CFamilyBindingConfigProvider(serviceMock.Object, testLogger); // 1. Supported languages testSubject.IsLanguageSupported(Language.C).Should().BeTrue(); testSubject.IsLanguageSupported(Language.Cpp).Should().BeTrue(); testSubject.IsLanguageSupported(new Language("cpp", "FooXXX", "foo", new SonarQubeLanguage("serverId", "serverName"))); // 2. Not supported testSubject.IsLanguageSupported(Language.CSharp).Should().BeFalse(); testSubject.IsLanguageSupported(Language.VBNET).Should().BeFalse(); }
public void ConvertRulesToSettings() { // Arrange var qpRules = new List <SonarQubeRule> { new SonarQubeRule("key1", "repo1", false, SonarQubeIssueSeverity.Blocker, new Dictionary <string, string>()), new SonarQubeRule("key2", "repo1", true, SonarQubeIssueSeverity.Critical, new Dictionary <string, string>()), new SonarQubeRule("key3", "repo1", false, SonarQubeIssueSeverity.Unknown, new Dictionary <string, string> { { "paramKey1", "paramValue1" }, { "paramKey2", "paramValue2" }, { "paramKey3", "" } } ), }; // Act var settings = CFamilyBindingConfigProvider.CreateRulesSettingsFromQPRules(qpRules); // Assert settings.Rules.Count.Should().Be(3); settings.Rules.Keys.Should().BeEquivalentTo("repo1:key1", "repo1:key2", "repo1:key3"); settings.Rules["repo1:key1"].Level.Should().Be(RuleLevel.Off); settings.Rules["repo1:key2"].Level.Should().Be(RuleLevel.On); settings.Rules["repo1:key3"].Level.Should().Be(RuleLevel.Off); settings.Rules["repo1:key1"].Severity.Should().Be(IssueSeverity.Blocker); settings.Rules["repo1:key2"].Severity.Should().Be(IssueSeverity.Critical); settings.Rules["repo1:key3"].Severity.Should().BeNull(); settings.Rules["repo1:key1"].Parameters.Should().BeNull(); settings.Rules["repo1:key2"].Parameters.Should().BeNull(); var rule3Params = settings.Rules["repo1:key3"].Parameters; rule3Params.Should().NotBeNull(); rule3Params.Keys.Should().BeEquivalentTo("paramKey1", "paramKey2", "paramKey3"); rule3Params["paramKey1"].Should().Be("paramValue1"); rule3Params["paramKey2"].Should().Be("paramValue2"); rule3Params["paramKey3"].Should().Be(""); }
public async Task GetRules_NonCriticalException_IsHandledAndNullResultReturned() { // Arrange var testLogger = new TestLogger(); var serviceMock = new Mock <ISonarQubeService>(); serviceMock.Setup(x => x.GetRulesAsync(It.IsAny <bool>(), It.IsAny <string>(), CancellationToken.None)) .ThrowsAsync(new InvalidOperationException("invalid op")); var testSubject = new CFamilyBindingConfigProvider(serviceMock.Object, testLogger); // Act var result = await testSubject.GetConfigurationAsync(CreateQp(), null, Language.Cpp, CancellationToken.None); // Assert result.Should().BeNull(); testLogger.AssertPartialOutputStringExists("invalid op"); }
public void SeverityEnumConversion_NotUnknown(SonarQubeIssueSeverity sqSeverity, IssueSeverity?expected) { CFamilyBindingConfigProvider.Convert(sqSeverity).Should().Be(expected); }