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)
{