예제 #1
0
        public void GetQualityProfile_WhenHasExportResponse_ReturnsExportResponse()
        {
            // Arrange
            XmlDocument rulesetDoc = new XmlDocument();

            var rulesXml = @"<?xml version=""1.0"" encoding=""utf-8""?>
<RuleSet Name=""Rules for SonarQube"" Description=""This rule set was automatically generated from SonarQube."" ToolsVersion=""14.0"">
  <Rules AnalyzerId=""SonarAnalyzer.CSharp"" RuleNamespace=""SonarAnalyzer.CSharp"">
    <Rule Id=""S121"" Action=""Warning"" />
    <Rule Id=""S122"" Action=""Warning"" />
  </Rules>
</RuleSet>";

            rulesetDoc.LoadXml(rulesXml);
            var exportResponse = new RoslynExportProfileResponse
            {
                Configuration = new ConfigurationResponse
                {
                    RuleSet = rulesetDoc.DocumentElement
                }
            };

            SetupServiceResponses(ValidQualityProfileResponse, exportResponse);
            var testSubject = new SonarQubeQualityProfileProvider(serviceMock.Object, loggerMock.Object);

            // Act
            var result = testSubject.GetQualityProfile(new BoundSonarQubeProject(), Language.VBNET);

            // Assert
            result.Should().NotBeNull();
            result.Rules.Count().Should().Be(2);
        }
        public async Task GetConfig_LegacyMode_WithNoNugetPackage_Fails()
        {
            // Arrange
            const string QualityProfileName = "SQQualityProfileName";
            const string ProjectName        = "SQProjectName";
            var          legacyNuGetBinding = new NuGetBindingOperation(new ConfigurableHost(), this.logger);
            var          testSubject        = this.CreateTestSubject("key", ProjectName, legacyNuGetBinding);

            RuleSet ruleSet         = TestRuleSetHelper.CreateTestRuleSetWithRuleIds(new[] { "Key1", "Key2" });
            var     additionalFiles = new[] { new AdditionalFileResponse {
                                                  FileName = "abc.xml", Content = new byte[] { 1, 2, 3 }
                                              } };
            RoslynExportProfileResponse export = RoslynExportProfileHelper.CreateExport(ruleSet, Enumerable.Empty <PackageName>(), additionalFiles);

            var language = Language.VBNET;
            var profile  = this.ConfigureProfileExport(export, language, QualityProfileName);

            // Act
            var result = await testSubject.GetConfigurationAsync(profile, null, language, CancellationToken.None)
                         .ConfigureAwait(false);

            // Assert
            result.Should().BeNull();

            this.logger.AssertOutputStrings(1);
            var expectedOutput = string.Format(Strings.SubTextPaddingFormat,
                                               string.Format(Strings.NoNuGetPackageForQualityProfile, language.Name));

            this.logger.AssertOutputStrings(expectedOutput);
        }
        public async Task BindingWorkflow_DownloadQualityProfile_WithNoRules_Fails()
        {
            // Arrange
            const string    QualityProfileName        = "SQQualityProfileName";
            const string    ProjectName               = "SQProjectName";
            BindingWorkflow testSubject               = this.CreateTestSubject("key", ProjectName);
            ConfigurableProgressController controller = new ConfigurableProgressController();
            var notifications = new ConfigurableProgressStepExecutionEvents();

            RuleSet ruleSet         = TestRuleSetHelper.CreateTestRuleSetWithRuleIds(Enumerable.Empty <string>());
            var     nugetPackages   = new[] { new PackageName("myPackageId", new SemanticVersion("1.0.0")) };
            var     additionalFiles = new[] { new AdditionalFileResponse {
                                                  FileName = "abc.xml", Content = new byte[] { 1, 2, 3 }
                                              } };
            RoslynExportProfileResponse export = RoslynExportProfileHelper.CreateExport(ruleSet, nugetPackages, additionalFiles);

            var language = Language.VBNET;
            SonarQubeQualityProfile profile = this.ConfigureProfileExport(export, language, QualityProfileName);

            // Act
            await testSubject.DownloadQualityProfileAsync(controller, notifications, new[] { language }, CancellationToken.None);

            // Assert
            testSubject.Rulesets.Should().NotContainKey(Language.VBNET, "Not expecting any rules for this language");
            testSubject.Rulesets.Should().NotContainKey(language, "Not expecting any rules");
            controller.NumberOfAbortRequests.Should().Be(1);

            notifications.AssertProgressMessages(Strings.DownloadingQualityProfileProgressMessage);

            this.outputWindowPane.AssertOutputStrings(1);
            var expectedOutput = string.Format(Strings.SubTextPaddingFormat,
                                               string.Format(Strings.NoSonarAnalyzerActiveRulesForQualityProfile, QualityProfileName, language.Name));

            this.outputWindowPane.AssertOutputStrings(expectedOutput);
        }
        public async Task GetConfig_WithNoActiveRules_Fails()
        {
            // Arrange
            const string QualityProfileName = "SQQualityProfileName";
            const string ProjectName        = "SQProjectName";
            var          testSubject        = this.CreateTestSubject(ProjectName, "http://connected");

            RuleSet ruleSet = TestRuleSetHelper.CreateTestRuleSetWithRuleIds(new[] { "Key1", "Key2" });

            foreach (var rule in ruleSet.Rules)
            {
                rule.Action = RuleAction.None;
            }
            var nugetPackages   = new[] { new PackageName("myPackageId", new SemanticVersion("1.0.0")) };
            var additionalFiles = new[] { new AdditionalFileResponse {
                                              FileName = "abc.xml", Content = new byte[] { 1, 2, 3 }
                                          } };
            RoslynExportProfileResponse export = RoslynExportProfileHelper.CreateExport(ruleSet, nugetPackages, additionalFiles);

            var language = Language.VBNET;
            var profile  = this.ConfigureProfileExport(export, language, QualityProfileName);

            // Act
            var result = await testSubject.GetConfigurationAsync(profile, null, language, CancellationToken.None)
                         .ConfigureAwait(false);

            // Assert
            result.Should().BeNull();

            this.logger.AssertOutputStrings(1);
            var expectedOutput = string.Format(Strings.SubTextPaddingFormat,
                                               string.Format(Strings.NoSonarAnalyzerActiveRulesForQualityProfile, QualityProfileName, language.Name));

            this.logger.AssertOutputStrings(expectedOutput);
        }
        private ConfigurablePackageInstaller PrepareInstallPackagesTest(NuGetBindingOperation testSubject, Dictionary <Language, IEnumerable <PackageName> > nugetPackagesByLanguage)
        {
            var exportResponse = new RoslynExportProfileResponse
            {
                Deployment = new DeploymentResponse
                {
                    NuGetPackages = new List <NuGetPackageInfoResponse>()
                }
            };

            foreach (var nugetPackagesForLanguage in nugetPackagesByLanguage)
            {
                testSubject.NuGetPackages.Add(nugetPackagesForLanguage.Key,
                                              nugetPackagesForLanguage.Value.Select(x => new NuGetPackageInfoResponse {
                    Id = x.Id, Version = x.Version.ToNormalizedString()
                }).ToList());
            }


            ConfigurablePackageInstaller packageInstaller = new ConfigurablePackageInstaller(nugetPackagesByLanguage.Values.SelectMany(x => x));

            this.serviceProvider.RegisterService(typeof(SComponentModel),
                                                 ConfigurableComponentModel.CreateWithExports(MefTestHelpers.CreateExport <IVsPackageInstaller>(packageInstaller)));

            return(packageInstaller);
        }
        public async Task BindingWorkflow_DownloadQualityProfile_Success()
        {
            // Arrange
            const string QualityProfileName = "SQQualityProfileName";
            const string ProjectName        = "SQProjectName";

            // Record all of the calls to NuGetBindingOperation.ProcessExport
            var actualProfiles = new List <Tuple <Language, RoslynExportProfileResponse> >();
            Mock <INuGetBindingOperation> nuGetOpMock = new Mock <INuGetBindingOperation>();

            nuGetOpMock.Setup(x => x.ProcessExport(It.IsAny <Language>(), It.IsAny <RoslynExportProfileResponse>()))
            .Callback <Language, RoslynExportProfileResponse>((l, r) => actualProfiles.Add(new Tuple <Language, RoslynExportProfileResponse>(l, r)))
            .Returns(true);

            BindingWorkflow testSubject = this.CreateTestSubject("key", ProjectName, nuGetOpMock.Object);


            ConfigurableProgressController controller = new ConfigurableProgressController();
            var notifications = new ConfigurableProgressStepExecutionEvents();

            RuleSet ruleSet         = TestRuleSetHelper.CreateTestRuleSetWithRuleIds(new[] { "Key1", "Key2" });
            var     expectedRuleSet = new RuleSet(ruleSet)
            {
                NonLocalizedDisplayName = string.Format(Strings.SonarQubeRuleSetNameFormat, ProjectName, QualityProfileName),
                NonLocalizedDescription = "\r\nhttp://connected/profiles/show?key="
            };
            var nugetPackages   = new[] { new PackageName("myPackageId", new SemanticVersion("1.0.0")) };
            var additionalFiles = new[] { new AdditionalFileResponse {
                                              FileName = "abc.xml", Content = new byte[] { 1, 2, 3 }
                                          } };
            RoslynExportProfileResponse export = RoslynExportProfileHelper.CreateExport(ruleSet, nugetPackages, additionalFiles);

            var language = Language.VBNET;
            SonarQubeQualityProfile profile = this.ConfigureProfileExport(export, language, QualityProfileName);

            // Act
            await testSubject.DownloadQualityProfileAsync(controller, notifications, new[] { language }, CancellationToken.None);

            // Assert
            RuleSetAssert.AreEqual(expectedRuleSet, testSubject.Rulesets[language], "Unexpected rule set");
            testSubject.QualityProfiles[language].Should().Be(profile);
            VerifyNuGetPackgesDownloaded(nugetPackages, language, actualProfiles);

            controller.NumberOfAbortRequests.Should().Be(0);
            notifications.AssertProgress(0.0, 1.0);
            notifications.AssertProgressMessages(Strings.DownloadingQualityProfileProgressMessage, string.Empty);

            this.outputWindowPane.AssertOutputStrings(1);
            var expectedOutput = string.Format(Strings.SubTextPaddingFormat,
                                               string.Format(Strings.QualityProfileDownloadSuccessfulMessageFormat, QualityProfileName, string.Empty, language.Name));

            this.outputWindowPane.AssertOutputStrings(expectedOutput);
        }
예제 #7
0
        public bool ProcessExport(Language language, RoslynExportProfileResponse exportProfileResponse)
        {
            if (exportProfileResponse.Deployment.NuGetPackages.Count == 0)
            {
                this.logger.WriteLine(string.Format(Strings.SubTextPaddingFormat,
                                                    string.Format(Strings.NoNuGetPackageForQualityProfile, language.Name)));
                return(false);
            }

            this.NuGetPackages.Add(language, exportProfileResponse.Deployment.NuGetPackages);
            return(true);
        }
 public Task <Result <RoslynExportProfileResponse> > GetRoslynExportProfileAsync(RoslynExportProfileRequest request,
                                                                                 CancellationToken token)
 {
     // Since 5.2
     return(InvokeSonarQubeApi("api/qualityprofiles/export", request, token,
                               stringResponse =>
     {
         using (var reader = new StringReader(stringResponse))
         {
             return RoslynExportProfileResponse.Load(reader);
         }
     }));
 }
        private SonarQubeQualityProfile ConfigureProfileExport(RoslynExportProfileResponse export, Language language, string profileName)
        {
            var profile = new SonarQubeQualityProfile("", profileName, "", false, DateTime.Now);

            this.sonarQubeServiceMock
            .Setup(x => x.GetQualityProfileAsync(It.IsAny <string>(), It.IsAny <string>(), language.ToServerLanguage(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(profile);
            this.sonarQubeServiceMock
            .Setup(x => x.GetRoslynExportProfileAsync(profileName, It.IsAny <string>(), It.IsAny <SonarQubeLanguage>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(export);

            return(profile);
        }
예제 #10
0
        private void SetupServiceResponses(SonarQubeQualityProfile qualityProfileResponse,
                                           RoslynExportProfileResponse exportResponse)
        {
            serviceMock.Setup(x => x.GetQualityProfileAsync(
                                  It.IsAny <string>(),
                                  It.IsAny <string>(),
                                  It.IsAny <SonarQubeLanguage>(),
                                  It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult <SonarQubeQualityProfile>(qualityProfileResponse));

            serviceMock.Setup(x => x.GetRoslynExportProfileAsync(
                                  It.IsAny <string>(),
                                  It.IsAny <string>(),
                                  It.IsAny <SonarQubeLanguage>(),
                                  It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult <RoslynExportProfileResponse>(exportResponse));
        }
        public async Task GetConfig_Success()
        {
            // Arrange
            const string QualityProfileName = "SQQualityProfileName";
            const string ProjectName        = "SQProjectName";

            // Record all of the calls to NuGetBindingOperation.ProcessExport
            var actualProfiles = new List <Tuple <Language, RoslynExportProfileResponse> >();
            Mock <INuGetBindingOperation> nuGetOpMock = new Mock <INuGetBindingOperation>();

            nuGetOpMock.Setup(x => x.ProcessExport(It.IsAny <Language>(), It.IsAny <RoslynExportProfileResponse>()))
            .Callback <Language, RoslynExportProfileResponse>((l, r) => actualProfiles.Add(new Tuple <Language, RoslynExportProfileResponse>(l, r)))
            .Returns(true);

            var testSubject = this.CreateTestSubject(ProjectName, "http://connected/", nuGetOpMock.Object);

            RuleSet ruleSet         = TestRuleSetHelper.CreateTestRuleSetWithRuleIds(new[] { "Key1", "Key2" });
            var     expectedRuleSet = new RuleSet(ruleSet)
            {
                NonLocalizedDisplayName = string.Format(Strings.SonarQubeRuleSetNameFormat, ProjectName, QualityProfileName),
                NonLocalizedDescription = "\r\nhttp://connected/profiles/show?key="
            };
            var nugetPackages   = new[] { new PackageName("myPackageId", new SemanticVersion("1.0.0")) };
            var additionalFiles = new[] { new AdditionalFileResponse {
                                              FileName = "abc.xml", Content = new byte[] { 1, 2, 3 }
                                          } };
            RoslynExportProfileResponse export = RoslynExportProfileHelper.CreateExport(ruleSet, nugetPackages, additionalFiles);

            var language = Language.VBNET;
            SonarQubeQualityProfile profile = this.ConfigureProfileExport(export, language, QualityProfileName);

            // Act
            var result = await testSubject.GetConfigurationAsync(profile, "TODO", language, CancellationToken.None)
                         .ConfigureAwait(false);

            // Assert
            result.Should().NotBeNull();
            var dotNetResult = result as DotNetBindingConfigFile;

            dotNetResult.Should().NotBeNull();

            RuleSetAssert.AreEqual(expectedRuleSet, dotNetResult.RuleSet, "Unexpected rule set");
            VerifyNuGetPackgesDownloaded(nugetPackages, language, actualProfiles);

            this.logger.AssertOutputStrings(0); // not expecting anything in the case of success
        }
        public async Task GetRoslynExportProfileAsync_ReturnsExpectedResult()
        {
            // Arrange
            var roslynExport = new RoslynExportProfileResponse();

            var client = GetMockSqClientWithCredentialAndVersion("5.6");

            client.Setup(x => x.GetRoslynExportProfileAsync(It.IsAny <RoslynExportProfileRequest>(),
                                                            It.IsAny <CancellationToken>()))
            .ReturnsAsync(() => new Result <RoslynExportProfileResponse>(new HttpResponseMessage(), roslynExport));

            var service = new SonarQubeService(WrapInMockFactory(client));
            await service.ConnectAsync(new ConnectionInformation(new Uri("http://mysq.com")), CancellationToken.None);

            // Act
            var result = await service.GetRoslynExportProfileAsync("name", SonarQubeLanguage.CSharp, CancellationToken.None);

            // Assert
            client.VerifyAll();
            result.Should().Be(roslynExport);
        }
        public async Task BindingWorkflow_DownloadQualityProfile_LegacyMode_WithNoNugetPackage_Fails()
        {
            // Arrange
            const string    QualityProfileName        = "SQQualityProfileName";
            const string    ProjectName               = "SQProjectName";
            var             legacyNuGetBinding        = new NuGetBindingOperation(this.host, this.host.Logger);
            BindingWorkflow testSubject               = this.CreateTestSubject("key", ProjectName, legacyNuGetBinding);
            ConfigurableProgressController controller = new ConfigurableProgressController();
            var notifications = new ConfigurableProgressStepExecutionEvents();

            RuleSet ruleSet         = TestRuleSetHelper.CreateTestRuleSetWithRuleIds(new[] { "Key1", "Key2" });
            var     expectedRuleSet = new RuleSet(ruleSet)
            {
                NonLocalizedDisplayName = string.Format(Strings.SonarQubeRuleSetNameFormat, ProjectName, QualityProfileName),
                NonLocalizedDescription = "\r\nhttp://connected/profiles/show?key="
            };
            var additionalFiles = new[] { new AdditionalFileResponse {
                                              FileName = "abc.xml", Content = new byte[] { 1, 2, 3 }
                                          } };
            RoslynExportProfileResponse export = RoslynExportProfileHelper.CreateExport(ruleSet, Enumerable.Empty <PackageName>(), additionalFiles);

            var language = Language.VBNET;
            SonarQubeQualityProfile profile = this.ConfigureProfileExport(export, language, QualityProfileName);

            // Act
            await testSubject.DownloadQualityProfileAsync(controller, notifications, new[] { language }, CancellationToken.None);

            // Assert
            testSubject.Rulesets.Should().NotContainKey(Language.VBNET, "Not expecting any rules for this language");
            testSubject.Rulesets.Should().NotContainKey(language, "Not expecting any rules");
            controller.NumberOfAbortRequests.Should().Be(1);

            notifications.AssertProgressMessages(Strings.DownloadingQualityProfileProgressMessage);

            this.outputWindowPane.AssertOutputStrings(1);
            var expectedOutput = string.Format(Strings.SubTextPaddingFormat,
                                               string.Format(Strings.NoNuGetPackageForQualityProfile, language.Name));

            this.outputWindowPane.AssertOutputStrings(expectedOutput);
        }
        public static RuleSet ToRuleSet(this RoslynExportProfileResponse roslynProfileExporter)
        {
            if (roslynProfileExporter == null)
            {
                return(null);
            }

            try
            {
                var tempRuleSetFilePath = Path.GetTempFileName();

                File.WriteAllText(tempRuleSetFilePath, roslynProfileExporter.Configuration.RuleSet.OuterXml);
                var ruleSet = RuleSet.LoadFromFile(tempRuleSetFilePath);
                File.Delete(tempRuleSetFilePath);

                return(ruleSet);
            }
            catch
            {
                return(null);
            }
        }
예제 #15
0
        public static RoslynExportProfileResponse CreateExport(RuleSet ruleSet, IEnumerable <PackageName> packages, IEnumerable <AdditionalFileResponse> additionalFiles)
        {
            string xml           = TestRuleSetHelper.RuleSetToXml(ruleSet);
            var    ruleSetXmlDoc = new XmlDocument();

            ruleSetXmlDoc.LoadXml(xml);

            var export = new RoslynExportProfileResponse
            {
                Configuration = new ConfigurationResponse
                {
                    RuleSet         = ruleSetXmlDoc.DocumentElement,
                    AdditionalFiles = additionalFiles.ToList()
                },
                Deployment = new DeploymentResponse
                {
                    NuGetPackages = packages.Select(x => new NuGetPackageInfoResponse {
                        Id = x.Id, Version = x.Version.ToNormalizedString()
                    }).ToList()
                }
            };

            return(export);
        }
예제 #16
0
        public async Task GetRoslynExportProfileAsync_WhenServerIsGreaterThanOrEqualTo66_ReturnsExpectedResult()
        {
            // Arrange
            var roslynExport = new RoslynExportProfileResponse();

            Expression <Func <RoslynExportProfileRequestV66Plus, bool> > matchRequest = r =>
                                                                                        r.OrganizationKey == "my-org";

            var client = GetMockSqClientWithCredentialAndVersion("6.6");

            client
            .Setup(x => x.GetRoslynExportProfileAsync(It.Is(matchRequest), CancellationToken.None))
            .ReturnsAsync(Result.Ok(roslynExport));

            var service = new SonarQubeService(WrapInMockFactory(client));
            await service.ConnectAsync(new ConnectionInformation(new Uri("http://mysq.com")), CancellationToken.None);

            // Act
            var result = await service.GetRoslynExportProfileAsync("name", "my-org", SonarQubeLanguage.CSharp, CancellationToken.None);

            // Assert
            client.VerifyAll();
            result.Should().Be(roslynExport);
        }
 public bool ProcessExport(Language language, RoslynExportProfileResponse exportProfileResponse)
 {
     // Nothing to do - just return success
     return(true);
 }
예제 #18
0
 public static void AssertAreEqual(RoslynExportProfileResponse expected, RoslynExportProfileResponse actual)
 {
     actual.Version.Should().Be(expected.Version, "Unexpected export version");
     AssertConfigSectionEqual(expected.Configuration, actual.Configuration);
     AssertDeploymentSectionEqual(expected.Deployment, actual.Deployment);
 }