Files
Umbraco-CMS/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Telemetry/TelemetryServiceTests.cs

131 lines
5.1 KiB
C#
Raw Normal View History

Package telemetry (#11738) * Add TelemetryService Currently it only allows you to get a list of the name of all the installed packages * Create model class for package telemetry And move the telemetry report data out of ReportSiteTask * Add version as an option in package manifest * Use TelemetryService to generate telemetry data Instead of doing it directly in the ReportSiteTask * Seal TelemetryService This should not be overwritten * Add option for package creators to opt out * Add global setting to restrict package telemetry * Add TelemetryService unit tests * Add ManifestParser tests for new properties * Clean * Update src/Umbraco.Core/Telemetry/TelemetryService.cs Co-authored-by: Bjarke Berg <mail@bergmania.dk> * Create interface for telemetry service * Use IOptionsMonitor instead of IOptions However I chose to use CurrentValue since according to microsoft: "Some file systems, such as Docker containers and network shares, may not reliably send change notifications.", additionally TelemetryService only runs once pr. day, so it shouldn't be too much of an issue that it doesn't cache the result. * Use is false instead of negation It's a bit more readable * Track restrict package telemetry value * Save RestrictPackageTelemetry in report data Not packages, since it'll be the same for all packages * Fix TelemetryService unit tests * Clean * Update src/Umbraco.Core/Telemetry/ITelemetryService.cs Co-authored-by: Bjarke Berg <mail@bergmania.dk> * Remove RestrictPackageTelemetry Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2021-12-14 16:09:31 +01:00
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.Options;
using Moq;
using NUnit.Framework;
using Umbraco.Cms.Core.Configuration;
using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Core.Manifest;
using Umbraco.Cms.Core.Semver;
using Umbraco.Cms.Core.Telemetry;
namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.Telemetry
{
[TestFixture]
public class TelemetryServiceTests
{
[Test]
public void UsesGetOrCreateSiteId()
Package telemetry (#11738) * Add TelemetryService Currently it only allows you to get a list of the name of all the installed packages * Create model class for package telemetry And move the telemetry report data out of ReportSiteTask * Add version as an option in package manifest * Use TelemetryService to generate telemetry data Instead of doing it directly in the ReportSiteTask * Seal TelemetryService This should not be overwritten * Add option for package creators to opt out * Add global setting to restrict package telemetry * Add TelemetryService unit tests * Add ManifestParser tests for new properties * Clean * Update src/Umbraco.Core/Telemetry/TelemetryService.cs Co-authored-by: Bjarke Berg <mail@bergmania.dk> * Create interface for telemetry service * Use IOptionsMonitor instead of IOptions However I chose to use CurrentValue since according to microsoft: "Some file systems, such as Docker containers and network shares, may not reliably send change notifications.", additionally TelemetryService only runs once pr. day, so it shouldn't be too much of an issue that it doesn't cache the result. * Use is false instead of negation It's a bit more readable * Track restrict package telemetry value * Save RestrictPackageTelemetry in report data Not packages, since it'll be the same for all packages * Fix TelemetryService unit tests * Clean * Update src/Umbraco.Core/Telemetry/ITelemetryService.cs Co-authored-by: Bjarke Berg <mail@bergmania.dk> * Remove RestrictPackageTelemetry Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2021-12-14 16:09:31 +01:00
{
var version = CreateUmbracoVersion(9, 3, 1);
var siteIdentifierServiceMock = new Mock<ISiteIdentifierService>();
var sut = new TelemetryService(Mock.Of<IManifestParser>(), version, siteIdentifierServiceMock.Object);
Guid guid;
var result = sut.TryGetTelemetryReportData(out var telemetryReportData);
siteIdentifierServiceMock.Verify(x => x.TryGetOrCreateSiteIdentifier(out guid), Times.Once);
}
[Test]
public void SkipsIfCantGetOrCreateId()
{
var version = CreateUmbracoVersion(9, 3, 1);
var sut = new TelemetryService(Mock.Of<IManifestParser>(), version, createSiteIdentifierService(false));
Package telemetry (#11738) * Add TelemetryService Currently it only allows you to get a list of the name of all the installed packages * Create model class for package telemetry And move the telemetry report data out of ReportSiteTask * Add version as an option in package manifest * Use TelemetryService to generate telemetry data Instead of doing it directly in the ReportSiteTask * Seal TelemetryService This should not be overwritten * Add option for package creators to opt out * Add global setting to restrict package telemetry * Add TelemetryService unit tests * Add ManifestParser tests for new properties * Clean * Update src/Umbraco.Core/Telemetry/TelemetryService.cs Co-authored-by: Bjarke Berg <mail@bergmania.dk> * Create interface for telemetry service * Use IOptionsMonitor instead of IOptions However I chose to use CurrentValue since according to microsoft: "Some file systems, such as Docker containers and network shares, may not reliably send change notifications.", additionally TelemetryService only runs once pr. day, so it shouldn't be too much of an issue that it doesn't cache the result. * Use is false instead of negation It's a bit more readable * Track restrict package telemetry value * Save RestrictPackageTelemetry in report data Not packages, since it'll be the same for all packages * Fix TelemetryService unit tests * Clean * Update src/Umbraco.Core/Telemetry/ITelemetryService.cs Co-authored-by: Bjarke Berg <mail@bergmania.dk> * Remove RestrictPackageTelemetry Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2021-12-14 16:09:31 +01:00
var result = sut.TryGetTelemetryReportData(out var telemetry);
Assert.IsFalse(result);
Assert.IsNull(telemetry);
Package telemetry (#11738) * Add TelemetryService Currently it only allows you to get a list of the name of all the installed packages * Create model class for package telemetry And move the telemetry report data out of ReportSiteTask * Add version as an option in package manifest * Use TelemetryService to generate telemetry data Instead of doing it directly in the ReportSiteTask * Seal TelemetryService This should not be overwritten * Add option for package creators to opt out * Add global setting to restrict package telemetry * Add TelemetryService unit tests * Add ManifestParser tests for new properties * Clean * Update src/Umbraco.Core/Telemetry/TelemetryService.cs Co-authored-by: Bjarke Berg <mail@bergmania.dk> * Create interface for telemetry service * Use IOptionsMonitor instead of IOptions However I chose to use CurrentValue since according to microsoft: "Some file systems, such as Docker containers and network shares, may not reliably send change notifications.", additionally TelemetryService only runs once pr. day, so it shouldn't be too much of an issue that it doesn't cache the result. * Use is false instead of negation It's a bit more readable * Track restrict package telemetry value * Save RestrictPackageTelemetry in report data Not packages, since it'll be the same for all packages * Fix TelemetryService unit tests * Clean * Update src/Umbraco.Core/Telemetry/ITelemetryService.cs Co-authored-by: Bjarke Berg <mail@bergmania.dk> * Remove RestrictPackageTelemetry Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2021-12-14 16:09:31 +01:00
}
[Test]
public void ReturnsSemanticVersionWithoutBuild()
{
var version = CreateUmbracoVersion(9, 1, 1, "-rc", "-ad2f4k2d");
var sut = new TelemetryService(Mock.Of<IManifestParser>(), version, createSiteIdentifierService());
Package telemetry (#11738) * Add TelemetryService Currently it only allows you to get a list of the name of all the installed packages * Create model class for package telemetry And move the telemetry report data out of ReportSiteTask * Add version as an option in package manifest * Use TelemetryService to generate telemetry data Instead of doing it directly in the ReportSiteTask * Seal TelemetryService This should not be overwritten * Add option for package creators to opt out * Add global setting to restrict package telemetry * Add TelemetryService unit tests * Add ManifestParser tests for new properties * Clean * Update src/Umbraco.Core/Telemetry/TelemetryService.cs Co-authored-by: Bjarke Berg <mail@bergmania.dk> * Create interface for telemetry service * Use IOptionsMonitor instead of IOptions However I chose to use CurrentValue since according to microsoft: "Some file systems, such as Docker containers and network shares, may not reliably send change notifications.", additionally TelemetryService only runs once pr. day, so it shouldn't be too much of an issue that it doesn't cache the result. * Use is false instead of negation It's a bit more readable * Track restrict package telemetry value * Save RestrictPackageTelemetry in report data Not packages, since it'll be the same for all packages * Fix TelemetryService unit tests * Clean * Update src/Umbraco.Core/Telemetry/ITelemetryService.cs Co-authored-by: Bjarke Berg <mail@bergmania.dk> * Remove RestrictPackageTelemetry Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2021-12-14 16:09:31 +01:00
var result = sut.TryGetTelemetryReportData(out var telemetry);
Assert.IsTrue(result);
Assert.AreEqual("9.1.1-rc", telemetry.Version);
}
[Test]
public void CanGatherPackageTelemetry()
{
var version = CreateUmbracoVersion(9, 1, 1);
var versionPackageName = "VersionPackage";
var packageVersion = "1.0.0";
var noVersionPackageName = "NoVersionPackage";
PackageManifest[] manifests =
{
new () { PackageName = versionPackageName, Version = packageVersion },
new () { PackageName = noVersionPackageName }
};
var manifestParser = CreateManifestParser(manifests);
var sut = new TelemetryService(manifestParser, version, createSiteIdentifierService());
Package telemetry (#11738) * Add TelemetryService Currently it only allows you to get a list of the name of all the installed packages * Create model class for package telemetry And move the telemetry report data out of ReportSiteTask * Add version as an option in package manifest * Use TelemetryService to generate telemetry data Instead of doing it directly in the ReportSiteTask * Seal TelemetryService This should not be overwritten * Add option for package creators to opt out * Add global setting to restrict package telemetry * Add TelemetryService unit tests * Add ManifestParser tests for new properties * Clean * Update src/Umbraco.Core/Telemetry/TelemetryService.cs Co-authored-by: Bjarke Berg <mail@bergmania.dk> * Create interface for telemetry service * Use IOptionsMonitor instead of IOptions However I chose to use CurrentValue since according to microsoft: "Some file systems, such as Docker containers and network shares, may not reliably send change notifications.", additionally TelemetryService only runs once pr. day, so it shouldn't be too much of an issue that it doesn't cache the result. * Use is false instead of negation It's a bit more readable * Track restrict package telemetry value * Save RestrictPackageTelemetry in report data Not packages, since it'll be the same for all packages * Fix TelemetryService unit tests * Clean * Update src/Umbraco.Core/Telemetry/ITelemetryService.cs Co-authored-by: Bjarke Berg <mail@bergmania.dk> * Remove RestrictPackageTelemetry Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2021-12-14 16:09:31 +01:00
var success = sut.TryGetTelemetryReportData(out var telemetry);
Assert.IsTrue(success);
Assert.Multiple(() =>
{
Assert.AreEqual(2, telemetry.Packages.Count());
var versionPackage = telemetry.Packages.FirstOrDefault(x => x.Name == versionPackageName);
Assert.AreEqual(versionPackageName, versionPackage.Name);
Assert.AreEqual(packageVersion, versionPackage.Version);
var noVersionPackage = telemetry.Packages.FirstOrDefault(x => x.Name == noVersionPackageName);
Assert.AreEqual(noVersionPackageName, noVersionPackage.Name);
Assert.AreEqual(string.Empty, noVersionPackage.Version);
});
}
[Test]
public void RespectsAllowPackageTelemetry()
{
var version = CreateUmbracoVersion(9, 1, 1);
PackageManifest[] manifests =
{
new () { PackageName = "DoNotTrack", AllowPackageTelemetry = false },
new () { PackageName = "TrackingAllowed", AllowPackageTelemetry = true },
Package telemetry (#11738) * Add TelemetryService Currently it only allows you to get a list of the name of all the installed packages * Create model class for package telemetry And move the telemetry report data out of ReportSiteTask * Add version as an option in package manifest * Use TelemetryService to generate telemetry data Instead of doing it directly in the ReportSiteTask * Seal TelemetryService This should not be overwritten * Add option for package creators to opt out * Add global setting to restrict package telemetry * Add TelemetryService unit tests * Add ManifestParser tests for new properties * Clean * Update src/Umbraco.Core/Telemetry/TelemetryService.cs Co-authored-by: Bjarke Berg <mail@bergmania.dk> * Create interface for telemetry service * Use IOptionsMonitor instead of IOptions However I chose to use CurrentValue since according to microsoft: "Some file systems, such as Docker containers and network shares, may not reliably send change notifications.", additionally TelemetryService only runs once pr. day, so it shouldn't be too much of an issue that it doesn't cache the result. * Use is false instead of negation It's a bit more readable * Track restrict package telemetry value * Save RestrictPackageTelemetry in report data Not packages, since it'll be the same for all packages * Fix TelemetryService unit tests * Clean * Update src/Umbraco.Core/Telemetry/ITelemetryService.cs Co-authored-by: Bjarke Berg <mail@bergmania.dk> * Remove RestrictPackageTelemetry Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2021-12-14 16:09:31 +01:00
};
var manifestParser = CreateManifestParser(manifests);
var sut = new TelemetryService(manifestParser, version, createSiteIdentifierService());
Package telemetry (#11738) * Add TelemetryService Currently it only allows you to get a list of the name of all the installed packages * Create model class for package telemetry And move the telemetry report data out of ReportSiteTask * Add version as an option in package manifest * Use TelemetryService to generate telemetry data Instead of doing it directly in the ReportSiteTask * Seal TelemetryService This should not be overwritten * Add option for package creators to opt out * Add global setting to restrict package telemetry * Add TelemetryService unit tests * Add ManifestParser tests for new properties * Clean * Update src/Umbraco.Core/Telemetry/TelemetryService.cs Co-authored-by: Bjarke Berg <mail@bergmania.dk> * Create interface for telemetry service * Use IOptionsMonitor instead of IOptions However I chose to use CurrentValue since according to microsoft: "Some file systems, such as Docker containers and network shares, may not reliably send change notifications.", additionally TelemetryService only runs once pr. day, so it shouldn't be too much of an issue that it doesn't cache the result. * Use is false instead of negation It's a bit more readable * Track restrict package telemetry value * Save RestrictPackageTelemetry in report data Not packages, since it'll be the same for all packages * Fix TelemetryService unit tests * Clean * Update src/Umbraco.Core/Telemetry/ITelemetryService.cs Co-authored-by: Bjarke Berg <mail@bergmania.dk> * Remove RestrictPackageTelemetry Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2021-12-14 16:09:31 +01:00
var success = sut.TryGetTelemetryReportData(out var telemetry);
Assert.IsTrue(success);
Assert.Multiple(() =>
{
Assert.AreEqual(1, telemetry.Packages.Count());
Assert.AreEqual("TrackingAllowed", telemetry.Packages.First().Name);
});
}
private IManifestParser CreateManifestParser(IEnumerable<PackageManifest> manifests)
{
var manifestParserMock = new Mock<IManifestParser>();
manifestParserMock.Setup(x => x.GetManifests()).Returns(manifests);
return manifestParserMock.Object;
}
private IUmbracoVersion CreateUmbracoVersion(int major, int minor, int patch, string prerelease = "", string build = "")
{
var version = new SemVersion(major, minor, patch, prerelease, build);
return Mock.Of<IUmbracoVersion>(x => x.SemanticVersion == version);
}
private ISiteIdentifierService createSiteIdentifierService(bool shouldSucceed = true)
Package telemetry (#11738) * Add TelemetryService Currently it only allows you to get a list of the name of all the installed packages * Create model class for package telemetry And move the telemetry report data out of ReportSiteTask * Add version as an option in package manifest * Use TelemetryService to generate telemetry data Instead of doing it directly in the ReportSiteTask * Seal TelemetryService This should not be overwritten * Add option for package creators to opt out * Add global setting to restrict package telemetry * Add TelemetryService unit tests * Add ManifestParser tests for new properties * Clean * Update src/Umbraco.Core/Telemetry/TelemetryService.cs Co-authored-by: Bjarke Berg <mail@bergmania.dk> * Create interface for telemetry service * Use IOptionsMonitor instead of IOptions However I chose to use CurrentValue since according to microsoft: "Some file systems, such as Docker containers and network shares, may not reliably send change notifications.", additionally TelemetryService only runs once pr. day, so it shouldn't be too much of an issue that it doesn't cache the result. * Use is false instead of negation It's a bit more readable * Track restrict package telemetry value * Save RestrictPackageTelemetry in report data Not packages, since it'll be the same for all packages * Fix TelemetryService unit tests * Clean * Update src/Umbraco.Core/Telemetry/ITelemetryService.cs Co-authored-by: Bjarke Berg <mail@bergmania.dk> * Remove RestrictPackageTelemetry Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2021-12-14 16:09:31 +01:00
{
var mock = new Mock<ISiteIdentifierService>();
var siteIdentifier = shouldSucceed ? Guid.NewGuid() : Guid.Empty;
mock.Setup(x => x.TryGetOrCreateSiteIdentifier(out siteIdentifier)).Returns(shouldSucceed);
return mock.Object;
Package telemetry (#11738) * Add TelemetryService Currently it only allows you to get a list of the name of all the installed packages * Create model class for package telemetry And move the telemetry report data out of ReportSiteTask * Add version as an option in package manifest * Use TelemetryService to generate telemetry data Instead of doing it directly in the ReportSiteTask * Seal TelemetryService This should not be overwritten * Add option for package creators to opt out * Add global setting to restrict package telemetry * Add TelemetryService unit tests * Add ManifestParser tests for new properties * Clean * Update src/Umbraco.Core/Telemetry/TelemetryService.cs Co-authored-by: Bjarke Berg <mail@bergmania.dk> * Create interface for telemetry service * Use IOptionsMonitor instead of IOptions However I chose to use CurrentValue since according to microsoft: "Some file systems, such as Docker containers and network shares, may not reliably send change notifications.", additionally TelemetryService only runs once pr. day, so it shouldn't be too much of an issue that it doesn't cache the result. * Use is false instead of negation It's a bit more readable * Track restrict package telemetry value * Save RestrictPackageTelemetry in report data Not packages, since it'll be the same for all packages * Fix TelemetryService unit tests * Clean * Update src/Umbraco.Core/Telemetry/ITelemetryService.cs Co-authored-by: Bjarke Berg <mail@bergmania.dk> * Remove RestrictPackageTelemetry Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2021-12-14 16:09:31 +01:00
}
}
}