diff --git a/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/AppxManifests/DevelopmentApp/AppxManifest.xml b/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/AppxManifests/DevelopmentApp/AppxManifest.xml new file mode 100644 index 0000000000..f18af9d980 --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/AppxManifests/DevelopmentApp/AppxManifest.xml @@ -0,0 +1,50 @@ + + + + + + DevelopmentApp + divyan + Assets\StoreLogo.png + + + + + + + + + + + + + + + + + + + + + + + + + DevelopmentApp.exe + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/AppxManifests/FrameworkApp/AppxManifest.xml b/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/AppxManifests/FrameworkApp/AppxManifest.xml new file mode 100644 index 0000000000..3d35b6cd2b --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/AppxManifests/FrameworkApp/AppxManifest.xml @@ -0,0 +1,50 @@ + + + + + + FrameworkApp + divyan + Assets\StoreLogo.png + + + + + + + + + + + + + + + + + + + + + + + + + FrameworkApp.exe + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/AppxManifests/PackagedApp/AppxManifest.xml b/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/AppxManifests/PackagedApp/AppxManifest.xml new file mode 100644 index 0000000000..19501281f7 --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/AppxManifests/PackagedApp/AppxManifest.xml @@ -0,0 +1,50 @@ + + + + + + PackagedApp + divyan + Assets\StoreLogo.png + + + + + + + + + + + + + + + + + + + + + + + + + PackagedApp.exe + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/Microsoft.Plugin.Program.UnitTests.csproj b/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/Microsoft.Plugin.Program.UnitTests.csproj index 57e8108df5..e145bc2eab 100644 --- a/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/Microsoft.Plugin.Program.UnitTests.csproj +++ b/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/Microsoft.Plugin.Program.UnitTests.csproj @@ -6,6 +6,8 @@ false x64 + + AppxManifests\developmentApp\AppxManifest.xml @@ -23,4 +25,16 @@ + + + Always + + + Always + + + Always + + + diff --git a/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/Programs/UWPTests.cs b/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/Programs/UWPTests.cs new file mode 100644 index 0000000000..b952e82726 --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.Plugin.Program.UnitTests/Programs/UWPTests.cs @@ -0,0 +1,76 @@ +using Castle.Core.Internal; +using Microsoft.Plugin.Program.Programs; +using Moq; +using NUnit.Framework; +using System.Collections.Generic; + +namespace Microsoft.Plugin.Program.UnitTests.Programs +{ + [TestFixture] + class UWPTests + { + static readonly PackageWrapper developmentModeApp = new PackageWrapper( + "DevelopmentApp", + "DevelopmentApp", + "DevelopmentApp", + false, + true, + "AppxManifests/DevelopmentApp" + ); + + static readonly PackageWrapper frameworkApp = new PackageWrapper( + "FrameworkApp", + "FrameworkApp", + "FrameworkApp", + true, + false, + "AppxManifests/FrameworkApp" + ); + + static readonly PackageWrapper packagedApp = new PackageWrapper( + "PackagedApp", + "PackagedApp", + "PackagedApp", + false, + false, + "AppxManifests/PackagedApp" + ); + + [Test] + public void All_ShouldReturnPackagesWithDevelopmentMode_WhenCalled() + { + // Arrange + Main._settings = new Settings(); + List packages = new List() { developmentModeApp, packagedApp }; + var mock = new Mock(); + mock.Setup(x => x.FindPackagesForCurrentUser()).Returns(packages); + UWP.PackageManagerWrapper = mock.Object; + + // Act + var applications = UWP.All(); + + // Assert + Assert.AreEqual(applications.Length, 2); + Assert.IsTrue(applications.FindAll(x => x.Name == "DevelopmentApp").Length > 0); + Assert.IsTrue(applications.FindAll(x => x.Name == "PackagedApp").Length > 0); + } + + [Test] + public void All_ShouldNotReturnPackageFrameworks_WhenCalled() + { + // Arrange + Main._settings = new Settings(); + List packages = new List() { frameworkApp, packagedApp }; + var mock = new Mock(); + mock.Setup(x => x.FindPackagesForCurrentUser()).Returns(packages); + UWP.PackageManagerWrapper = mock.Object; + + // Act + var applications = UWP.All(); + + // Assert + Assert.AreEqual(applications.Length, 1); + Assert.IsTrue(applications.FindAll(x => x.Name == "PackagedApp").Length > 0); + } + } +} diff --git a/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Microsoft.Plugin.Program.csproj b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Microsoft.Plugin.Program.csproj index 01ae64eb34..62c85cf91c 100644 --- a/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Microsoft.Plugin.Program.csproj +++ b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Microsoft.Plugin.Program.csproj @@ -107,5 +107,11 @@ + + + + <_Parameter1>Microsoft.Plugin.Program.UnitTests + + \ No newline at end of file diff --git a/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/IPackage.cs b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/IPackage.cs new file mode 100644 index 0000000000..bbbf35dcd7 --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/IPackage.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Microsoft.Plugin.Program.Programs +{ + public interface IPackage + { + string Name { get; } + + string FullName { get; } + + string FamilyName { get; } + + bool IsFramework { get; } + + bool IsDevelopmentMode { get; } + + string InstalledLocation { get; } + } +} diff --git a/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/IPackageManager.cs b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/IPackageManager.cs new file mode 100644 index 0000000000..90785cebb5 --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/IPackageManager.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Microsoft.Plugin.Program.Programs +{ + public interface IPackageManager + { + IEnumerable FindPackagesForCurrentUser(); + } +} diff --git a/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/PackageWrapper.cs b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/PackageWrapper.cs new file mode 100644 index 0000000000..a3cba467ff --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/PackageWrapper.cs @@ -0,0 +1,41 @@ +using Package = Windows.ApplicationModel.Package; + +namespace Microsoft.Plugin.Program.Programs +{ + public class PackageWrapper : IPackage + { + public string Name { get; } + + public string FullName { get; } + + public string FamilyName { get; } + + public bool IsFramework { get; } + + public bool IsDevelopmentMode { get; } + + public string InstalledLocation { get; } + + public PackageWrapper(string Name, string FullName, string FamilyName, bool IsFramework, bool IsDevelopmentMode, string InstalledLocation) + { + this.Name = Name; + this.FullName = FullName; + this.FamilyName = FamilyName; + this.IsFramework = IsFramework; + this.IsDevelopmentMode = IsDevelopmentMode; + this.InstalledLocation = InstalledLocation; + } + + public static PackageWrapper GetWrapperFromPackage(Package package) + { + return new PackageWrapper( + package.Id.Name, + package.Id.FullName, + package.Id.FamilyName, + package.IsFramework, + package.IsDevelopmentMode, + package.InstalledLocation.Path + ); + } + } +} diff --git a/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/PackagemanagerWrapper.cs b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/PackagemanagerWrapper.cs new file mode 100644 index 0000000000..371223a7c5 --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/PackagemanagerWrapper.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.IO.Packaging; +using System.Security.Principal; +using Windows.Management.Deployment; +using Windows.ApplicationModel; +using Package = Windows.ApplicationModel.Package; + +namespace Microsoft.Plugin.Program.Programs +{ + public class PackageManagerWrapper : IPackageManager + { + readonly PackageManager packageManager; + + public PackageManagerWrapper() + { + packageManager = new PackageManager(); + } + + public IEnumerable FindPackagesForCurrentUser() + { + List packages = new List(); + var user = WindowsIdentity.GetCurrent().User; + + if (user != null) + { + var id = user.Value; + var m = this.packageManager.FindPackagesForUser(id); + foreach (Package p in m) + { + packages.Add(PackageWrapper.GetWrapperFromPackage(p)); + } + } + + return packages; + } + } +} diff --git a/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/UWP.cs b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/UWP.cs index c454fcd21d..3b16381203 100644 --- a/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/UWP.cs +++ b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/UWP.cs @@ -38,12 +38,13 @@ namespace Microsoft.Plugin.Program.Programs public PackageVersion Version { get; set; } - public UWP(Package package) - { - - Name = package.Id.Name; - FullName = package.Id.FullName; - FamilyName = package.Id.FamilyName; + public static IPackageManager PackageManagerWrapper { get; set; } = new PackageManagerWrapper(); + + public UWP(IPackage package) + { + Name = package.Name; + FullName = package.FullName; + FamilyName = package.FamilyName; } public void InitializeAppInfo(string installedLocation) @@ -155,12 +156,12 @@ namespace Microsoft.Plugin.Program.Programs try { u = new UWP(p); - u.InitializeAppInfo(p.InstalledLocation.Path); + u.InitializeAppInfo(p.InstalledLocation); } catch (Exception e) { ProgramLogger.LogException($"|UWP|All|{p.InstalledLocation}|An unexpected error occurred and " - + $"unable to convert Package to UWP for {p.Id.FullName}", e); + + $"unable to convert Package to UWP for {p.FullName}", e); return new Application[] { }; } return u.Apps; @@ -179,40 +180,30 @@ namespace Microsoft.Plugin.Program.Programs } } - private static IEnumerable CurrentUserPackages() + private static IEnumerable CurrentUserPackages() { - var u = WindowsIdentity.GetCurrent().User; - - if (u != null) + var ps = PackageManagerWrapper.FindPackagesForCurrentUser(); + ps = ps.Where(p => { - var id = u.Value; - var m = new PackageManager(); - var ps = m.FindPackagesForUser(id); - ps = ps.Where(p => + bool valid; + try { - bool valid; - try - { - var f = p.IsFramework; - var path = p.InstalledLocation.Path; - valid = !f && !string.IsNullOrEmpty(path); - } - catch (Exception e) - { - ProgramLogger.LogException("UWP" ,"CurrentUserPackages", $"id","An unexpected error occurred and " - + $"unable to verify if package is valid", e); - return false; - } + var f = p.IsFramework; + var path = p.InstalledLocation; + valid = !f && !string.IsNullOrEmpty(path); + } + catch (Exception e) + { + ProgramLogger.LogException("UWP" ,"CurrentUserPackages", $"id","An unexpected error occurred and " + + $"unable to verify if package is valid", e); + return false; + } - return valid; - }); - return ps; - } - else - { - return new Package[] { }; - } + return valid; + }); + + return ps; } public override string ToString() diff --git a/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Storage/PackageRepository.cs b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Storage/PackageRepository.cs index f62b0cb3a6..d495a8bc8d 100644 --- a/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Storage/PackageRepository.cs +++ b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Storage/PackageRepository.cs @@ -34,7 +34,8 @@ namespace Microsoft.Plugin.Program.Storage try { - var uwp = new UWP(args.Package); + var packageWrapper = PackageWrapper.GetWrapperFromPackage(args.Package); + var uwp = new UWP(packageWrapper); uwp.InitializeAppInfo(args.Package.InstalledLocation.Path); foreach (var app in uwp.Apps) { @@ -57,7 +58,8 @@ namespace Microsoft.Plugin.Program.Storage if (args.Progress == 0) { //find apps associated with this package. - var uwp = new UWP(args.Package); + var packageWrapper = PackageWrapper.GetWrapperFromPackage(args.Package); + var uwp = new UWP(packageWrapper); var apps = Items.Where(a => a.Package.Equals(uwp)).ToArray(); foreach (var app in apps) {