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();
        }
Exemple #3
0
        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);
 }