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); } }
/// <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>(); 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; } } }
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); } }