public void DeterminateStepProgressNotifier_IncrementProgress_ArgChecks() { // Setup var testSubject = new DeterminateStepProgressNotifier(new ConfigurableProgressController(null), 11); Exceptions.Expect<ArgumentOutOfRangeException>(() => testSubject.IncrementProgress(0)); Exceptions.Expect<ArgumentOutOfRangeException>(() => testSubject.IncrementProgress(-1)); Exceptions.Expect<ArgumentOutOfRangeException>(() => testSubject.IncrementProgress(12)); // Check successful case (the last valid one) testSubject.IncrementProgress(11); Assert.AreEqual(11, testSubject.CurrentValue); }
public void DeterminateStepProgressNotifier_NotifyCurrentProgress() { // Setup var controller = new ConfigurableProgressController(null); const int Steps = 2; var testSubject = new DeterminateStepProgressNotifier(controller, Steps); List<Tuple<string, double>> expectedProgress = new List<Tuple<string, double>>(); // Act + Verify for (int i = 0; i < Steps; i++) { expectedProgress.Add(Tuple.Create("hello world " + i, 0.0)); testSubject.NotifyCurrentProgress(expectedProgress.Last().Item1); Assert.AreEqual(0, testSubject.CurrentValue, "Should not change"); controller.AssertProgressChangeEvents(expectedProgress); } }
public void DeterminateStepProgressNotifier_IncrementProgress() { // Setup var controller = new ConfigurableProgressController(null); const int Steps = 227; // Quite a few values for which N * (1 / N) > 1.0 var testSubject = new DeterminateStepProgressNotifier(controller, Steps); List<Tuple<string, double>> expectedProgress = new List<Tuple<string, double>>(); // Act + Verify int expectedValue = 0; int i = 0; while(expectedValue < Steps) { int increment = i % 2 == 0 ? 2 : 1; i++; expectedValue += increment; testSubject.IncrementProgress(increment); Assert.AreEqual(expectedValue, testSubject.CurrentValue); } }
public void DeterminateStepProgressNotifier_NotifyIncrementedProgress() { // Setup var controller = new ConfigurableProgressController(null); const int Steps = 11; // there are two numbers (9 and 11) for which N * (1 / N) > 1.0 var testSubject = new DeterminateStepProgressNotifier(controller, Steps); List<Tuple<string, double>> expectedProgress = new List<Tuple<string, double>>(); // Act + Verify for (int i = 0; i < Steps; i++) { int incrementedStepValue = i + 1; double progress = incrementedStepValue == Steps ? 1.0 : (double)incrementedStepValue / Steps; expectedProgress.Add(Tuple.Create("hello world " + i, progress)); Assert.AreEqual(i, testSubject.CurrentValue); testSubject.NotifyIncrementedProgress(expectedProgress.Last().Item1); Assert.AreEqual(incrementedStepValue, testSubject.CurrentValue); controller.AssertProgressChangeEvents(expectedProgress); } }
/// <summary> /// Will install the NuGet packages for the current managed projects. /// The packages that will be installed will be based on the information from <see cref="Analyzer.GetRequiredNuGetPackages"/> /// and is specific to the <see cref="RuleSet"/>. /// </summary> internal /*for testing purposes*/ void InstallPackages(IProgressController controller, CancellationToken token, IProgressStepExecutionEvents notificationEvents) { if (!this.NuGetPackages.Any()) { return; } Debug.Assert(this.NuGetPackages.Count == this.NuGetPackages.Distinct().Count(), "Duplicate NuGet packages specified"); if (!this.BindingProjects.Any()) { Debug.Fail("Not expected to be called when there are no projects"); return; } DeterminateStepProgressNotifier progressNotifier = new DeterminateStepProgressNotifier(notificationEvents, this.BindingProjects.Count * this.NuGetPackages.Count); foreach (var bindingProject in this.BindingProjects) { List<NuGetPackageInfo> nugetPackages; if (!this.NuGetPackages.TryGetValue(Language.ForProject(bindingProject), out nugetPackages)) { var message = string.Format(Strings.BindingProjectLanguageNotMatchingAnyQualityProfileLanguage, bindingProject.Name); VsShellUtils.WriteToSonarLintOutputPane(this.host, Strings.SubTextPaddingFormat, message); continue; } foreach (var packageInfo in nugetPackages) { if (token.IsCancellationRequested) { break; } string message = string.Format(CultureInfo.CurrentCulture, Strings.EnsuringNugetPackagesProgressMessage, packageInfo.Id, bindingProject.Name); VsShellUtils.WriteToSonarLintOutputPane(this.host, Strings.SubTextPaddingFormat, message); var isNugetInstallSuccessful = NuGetHelper.TryInstallPackage(this.host, bindingProject, packageInfo.Id, packageInfo.Version); if (isNugetInstallSuccessful) // NuGetHelper.TryInstallPackage already displayed the error message so only take care of the success message { message = string.Format(CultureInfo.CurrentCulture, Strings.SuccessfullyInstalledNugetPackageForProject, packageInfo.Id, bindingProject.Name); VsShellUtils.WriteToSonarLintOutputPane(this.host, Strings.SubTextPaddingFormat, message); } // TODO: SVS-33 (https://jira.sonarsource.com/browse/SVS-33) Trigger a Team Explorer warning notification to investigate the partial binding in the output window. this.AllNuGetPackagesInstalled &= isNugetInstallSuccessful; progressNotifier.NotifyIncrementedProgress(string.Empty); } } }
internal /*for testing purposes*/ void DownloadQualityProfile(IProgressController controller, CancellationToken cancellationToken, IProgressStepExecutionEvents notificationEvents, IEnumerable<Language> languages) { Debug.Assert(controller != null); Debug.Assert(notificationEvents != null); bool failed = false; var rulesets = new Dictionary<Language, RuleSet>(); var languageList = languages as IList<Language> ?? languages.ToList(); DeterminateStepProgressNotifier notifier = new DeterminateStepProgressNotifier(notificationEvents, languageList.Count); notifier.NotifyCurrentProgress(Strings.DownloadingQualityProfileProgressMessage); foreach (var language in languageList) { QualityProfile qualityProfileInfo; if (!host.SonarQubeService.TryGetQualityProfile(this.connectionInformation, this.project, language, cancellationToken, out qualityProfileInfo)) { failed = true; InformAboutQualityProfileToDownload(qualityProfileInfo.Name, qualityProfileInfo.Key, language.Name, true); break; } this.QualityProfiles[language] = qualityProfileInfo; RoslynExportProfile export; if (!this.host.SonarQubeService.TryGetExportProfile(this.connectionInformation, qualityProfileInfo, language, cancellationToken, out export)) { failed = true; InformAboutQualityProfileToDownload(qualityProfileInfo.Name, qualityProfileInfo.Key, language.Name, true); break; } this.NuGetPackages.Add(language, export.Deployment.NuGetPackages); var tempRuleSetFilePath = Path.GetTempFileName(); File.WriteAllText(tempRuleSetFilePath, export.Configuration.RuleSet.OuterXml); RuleSet ruleSet = RuleSet.LoadFromFile(tempRuleSetFilePath); // Remove/Move/Refactor code when XML ruleset file is no longer downloaded but the proper API is used to retrieve rules UpdateDownloadedSonarQubeQualityProfile(ruleSet, qualityProfileInfo); rulesets[language] = ruleSet; notifier.NotifyIncrementedProgress(string.Empty); if (rulesets[language] == null) { failed = true; InformAboutQualityProfileToDownload(qualityProfileInfo.Name, qualityProfileInfo.Key, language.Name, true); break; } InformAboutQualityProfileToDownload(qualityProfileInfo.Name, qualityProfileInfo.Key, language.Name, false); } if (failed) { this.AbortWorkflow(controller, cancellationToken); } else { // Set the rule set which should be available for the following steps foreach (var keyValue in rulesets) { this.Rulesets[keyValue.Key] = keyValue.Value; } } }
/// <summary> /// Will install the NuGet packages for the current managed projects. /// The packages that will be installed will be based on the information from <see cref="Analyzer.GetRequiredNuGetPackages"/> /// and is specific to the <see cref="RuleSet"/>. /// </summary> internal /*for testing purposes*/ void InstallPackages(IProgressController controller, CancellationToken token, IProgressStepExecutionEvents notificationEvents) { if (!this.NuGetPackages.Any()) { return; } Debug.Assert(this.NuGetPackages.Count == this.NuGetPackages.Distinct().Count(), "Duplicate NuGet packages specified"); if (!this.BindingProjects.Any()) { Debug.Fail("Not expected to be called when there are no projects"); return; } DeterminateStepProgressNotifier progressNotifier = new DeterminateStepProgressNotifier(notificationEvents, this.BindingProjects.Count * this.NuGetPackages.Count); foreach (var project in this.BindingProjects) { foreach (var packageInfo in this.NuGetPackages) { if (token.IsCancellationRequested) { break; } string message = string.Format(CultureInfo.CurrentCulture, Strings.EnsuringNugetPackagesProgressMessage, packageInfo.Id, project.Name); progressNotifier.NotifyCurrentProgress(message); // TODO: SVS-33 (https://jira.sonarsource.com/browse/SVS-33) Trigger a Team Explorer warning notification to investigate the partial binding in the output window. this.AllNuGetPackagesInstalled &= NuGetHelper.TryInstallPackage(this.host, project, packageInfo.Id, packageInfo.Version); progressNotifier.NotifyIncrementedProgress(string.Empty); } } }
internal /*for testing purposes*/ void DownloadQualityProfile(IProgressController controller, CancellationToken cancellationToken, IProgressStepExecutionEvents notificationEvents, IEnumerable<Language> languages) { Debug.Assert(controller != null); Debug.Assert(notificationEvents != null); bool failed = false; var rulesets = new Dictionary<Language, RuleSet>(); DeterminateStepProgressNotifier notifier = new DeterminateStepProgressNotifier(notificationEvents, languages.Count()); foreach (var language in languages) { notifier.NotifyCurrentProgress(string.Format(CultureInfo.CurrentCulture, Strings.DownloadingQualityProfileProgressMessage, language.Name)); QualityProfile qualityProfileInfo; if (!host.SonarQubeService.TryGetQualityProfile(this.connectionInformation, this.project, language, cancellationToken, out qualityProfileInfo)) { failed = true; break; } this.QualityProfiles[language] = qualityProfileInfo; RoslynExportProfile export; if (!this.host.SonarQubeService.TryGetExportProfile(this.connectionInformation, qualityProfileInfo, language, cancellationToken, out export)) { failed = true; break; } this.NuGetPackages.AddRange(export.Deployment.NuGetPackages); var tempRuleSetFilePath = Path.GetTempFileName(); File.WriteAllText(tempRuleSetFilePath, export.Configuration.RuleSet.OuterXml); RuleSet ruleSet = RuleSet.LoadFromFile(tempRuleSetFilePath); rulesets[language] = ruleSet; notifier.NotifyIncrementedProgress(string.Empty); if (rulesets[language] == null) { failed = true; break; } } if (failed) { VsShellUtils.WriteToSonarLintOutputPane(this.host, Strings.QualityProfileDownloadFailedMessage); this.AbortWorkflow(controller, cancellationToken); } else { // Set the rule set which should be available for the following steps foreach (var keyValue in rulesets) { this.Rulesets[keyValue.Key] = keyValue.Value; } notifier.NotifyCurrentProgress(Strings.QualityProfileDownloadedSuccessfulMessage); } }