public void AddUiActionEngineTelemetryProperties_AddsVulnerabilityInfo_Succeeds() { // Arrange var telemetrySession = new Mock <ITelemetrySession>(); TelemetryEvent lastTelemetryEvent = null; telemetrySession .Setup(x => x.PostEvent(It.IsAny <TelemetryEvent>())) .Callback <TelemetryEvent>(x => lastTelemetryEvent = x); var operationId = Guid.NewGuid().ToString(); var actionTelemetryData = new VSActionsTelemetryEvent( operationId, projectIds: new[] { Guid.NewGuid().ToString() }, operationType: NuGetOperationType.Install, source: OperationSource.PMC, startTime: DateTimeOffset.Now.AddSeconds(-1), status: NuGetOperationStatus.NoOp, packageCount: 1, endTime: DateTimeOffset.Now, duration: .40, isPackageSourceMappingEnabled: false); UIActionEngine.AddUiActionEngineTelemetryProperties( actionTelemetryEvent: actionTelemetryData, continueAfterPreview: true, acceptedLicense: true, userAction: UserAction.CreateInstallAction("mypackageId", new NuGetVersion(1, 0, 0)), selectedIndex: 0, recommendedCount: 0, recommendPackages: false, recommenderVersion: null, topLevelVulnerablePackagesCount: 3, topLevelVulnerablePackagesMaxSeverities: new List <int> { 1, 1, 3 }, // each package has its own max severity existingPackages: null, addedPackages: null, removedPackages: null, updatedPackagesOld: null, updatedPackagesNew: null, targetFrameworks: null); // Act var service = new NuGetVSTelemetryService(telemetrySession.Object); service.EmitTelemetryEvent(actionTelemetryData); // Assert Assert.NotNull(lastTelemetryEvent); Assert.NotNull(lastTelemetryEvent.ComplexData["TopLevelVulnerablePackagesMaxSeverities"] as List <int>); var pkgSeverities = lastTelemetryEvent.ComplexData["TopLevelVulnerablePackagesMaxSeverities"] as List <int>; Assert.Equal(lastTelemetryEvent["TopLevelVulnerablePackagesCount"], pkgSeverities.Count()); Assert.Collection(pkgSeverities, item => Assert.Equal(1, item), item => Assert.Equal(1, item), item => Assert.Equal(3, item)); Assert.Equal(3, pkgSeverities.Count()); }
public async Task CreateInstallAction_OnInstallingProject_EmitsPkgWasTransitiveTelemetryAndTabAndIsSolutionPropertiesAsync(ContractsItemFilter activeTab, bool isSolutionLevel, string packageIdToInstall, bool?expectedPkgWasTransitive) { // Arrange var telemetrySession = new Mock <ITelemetrySession>(); TelemetryEvent lastTelemetryEvent = null; telemetrySession .Setup(x => x.PostEvent(It.IsAny <TelemetryEvent>())) .Callback <TelemetryEvent>(x => lastTelemetryEvent = x); var telemetryService = new NuGetVSTelemetryService(telemetrySession.Object); TelemetryActivity.NuGetTelemetryService = telemetryService; var sourceProvider = new Mock <ISourceRepositoryProvider>(); var settings = new Mock <ISettings>(); var nugetPM = new NuGetPackageManager(sourceProvider.Object, settings.Object, @"\packagesFolder"); var lockService = new NuGetLockService(ThreadHelper.JoinableTaskContext); var uiEngine = new UIActionEngine(sourceProvider.Object, nugetPM, lockService); var installedAndTransitive = new InstalledAndTransitivePackages( new[] { new PackageReferenceContextInfo(new PackageIdentity("installedA", NuGetVersion.Parse("1.0.0")), NuGetFramework.Parse("net472")), new PackageReferenceContextInfo(new PackageIdentity("installedB", NuGetVersion.Parse("1.0.0")), NuGetFramework.Parse("net472")) }, new[] { new TransitivePackageReferenceContextInfo(new PackageIdentity("transitiveA", NuGetVersion.Parse("1.0.0")), NuGetFramework.Parse("net472")) }); var prjMgrSvc = new Mock <INuGetProjectManagerService>(); prjMgrSvc .Setup(mgr => mgr.GetInstalledAndTransitivePackagesAsync(It.IsAny <IReadOnlyCollection <string> >(), It.IsAny <CancellationToken>())) .Returns(new ValueTask <IInstalledAndTransitivePackages>(installedAndTransitive)); var dictMetadata = new Dictionary <string, object> { [NuGetProjectMetadataKeys.UniqueName] = "a", [NuGetProjectMetadataKeys.ProjectId] = "a" }; ProjectMetadataContextInfo metadataCtxtInfo = ProjectMetadataContextInfo.Create(dictMetadata); prjMgrSvc .Setup(mgr => mgr.GetMetadataAsync(It.IsAny <string>(), It.IsAny <CancellationToken>())) .Returns(new ValueTask <IProjectMetadataContextInfo>(metadataCtxtInfo)); var uiService = new Mock <INuGetUI>(); var uiContext = new Mock <INuGetUIContext>(); var projectContext = new Mock <INuGetProjectContext>(); var serviceBroker = new Mock <IServiceBroker>(); _ = serviceBroker.Setup(sb => sb.GetProxyAsync <INuGetProjectManagerService>( It.Is <ServiceRpcDescriptor>(s => s == NuGetServices.ProjectManagerService), It.IsAny <ServiceActivationOptions>(), It.IsAny <CancellationToken>())) .Returns(new ValueTask <INuGetProjectManagerService>(prjMgrSvc.Object)); uiContext.Setup(ctx => ctx.ServiceBroker).Returns(serviceBroker.Object); uiService.Setup(ui => ui.UIContext).Returns(uiContext.Object); uiService.Setup(ui => ui.ProjectContext).Returns(projectContext.Object); uiService.Setup(ui => ui.Settings).Returns(settings.Object); uiService.Setup(ui => ui.Projects).Returns(new[] { new ProjectContextInfo("a", ProjectModel.ProjectStyle.PackageReference, NuGetProjectKind.PackageReference) }); var action = UserAction.CreateInstallAction(packageIdToInstall, NuGetVersion.Parse("1.0.0"), isSolutionLevel, activeTab); // Act await uiEngine.PerformInstallOrUninstallAsync(uiService.Object, action, CancellationToken.None); // Assert Assert.NotNull(lastTelemetryEvent); // expect failed action because we mocked just enough objects to emit telemetry Assert.Equal(NuGetOperationStatus.Failed, lastTelemetryEvent[nameof(ActionEventBase.Status)]); Assert.Equal(NuGetOperationType.Install, lastTelemetryEvent[nameof(ActionsTelemetryEvent.OperationType)]); Assert.Equal(isSolutionLevel, lastTelemetryEvent[nameof(VSActionsTelemetryEvent.IsSolutionLevel)]); Assert.Equal(activeTab, lastTelemetryEvent[nameof(VSActionsTelemetryEvent.Tab)]); Assert.Equal(expectedPkgWasTransitive, lastTelemetryEvent[nameof(VSActionsTelemetryEvent.PackageToInstallWasTransitive)]); }