UninstallInterop.cs (16661B)
1 // ----------------------------------------------------------------------------- 2 // <copyright file="UninstallInterop.cs" company="Microsoft Corporation"> 3 // Copyright (c) Microsoft Corporation. Licensed under the MIT License. 4 // </copyright> 5 // ----------------------------------------------------------------------------- 6 7 namespace AppInstallerCLIE2ETests.Interop 8 { 9 using System; 10 using System.IO; 11 using System.Threading.Tasks; 12 using AppInstallerCLIE2ETests.Helpers; 13 using Microsoft.Management.Deployment; 14 using Microsoft.Management.Deployment.Projection; 15 using NUnit.Framework; 16 17 /// <summary> 18 /// Test uninstall interop. 19 /// </summary> 20 [TestFixtureSource(typeof(InstanceInitializersSource), nameof(InstanceInitializersSource.InProcess), Category = nameof(InstanceInitializersSource.InProcess))] 21 [TestFixtureSource(typeof(InstanceInitializersSource), nameof(InstanceInitializersSource.OutOfProcess), Category = nameof(InstanceInitializersSource.OutOfProcess))] 22 public class UninstallInterop : BaseInterop 23 { 24 private string installDir; 25 private PackageManager packageManager; 26 private PackageCatalogReference compositeSource; 27 28 /// <summary> 29 /// Initializes a new instance of the <see cref="UninstallInterop"/> class. 30 /// </summary> 31 /// <param name="initializer">Initializer.</param> 32 public UninstallInterop(IInstanceInitializer initializer) 33 : base(initializer) 34 { 35 } 36 37 /// <summary> 38 /// Set up. 39 /// </summary> 40 [SetUp] 41 public void Init() 42 { 43 this.packageManager = this.TestFactory.CreatePackageManager(); 44 this.installDir = TestCommon.GetRandomTestDir(); 45 46 // Create composite package catalog source 47 var options = this.TestFactory.CreateCreateCompositePackageCatalogOptions(); 48 var testSource = this.packageManager.GetPackageCatalogByName(Constants.TestSourceName); 49 Assert.NotNull(testSource, $"{Constants.TestSourceName} cannot be null"); 50 options.Catalogs.Add(testSource); 51 options.CompositeSearchBehavior = CompositeSearchBehavior.AllCatalogs; 52 this.compositeSource = this.packageManager.CreateCompositePackageCatalog(options); 53 } 54 55 /// <summary> 56 /// Test uninstall exe. 57 /// </summary> 58 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 59 [Test] 60 public async Task UninstallTestExe() 61 { 62 // Find package 63 var searchResult = this.FindOnePackage(this.compositeSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, Constants.ExeInstallerPackageId); 64 65 // Configure installation 66 var installOptions = this.TestFactory.CreateInstallOptions(); 67 installOptions.PackageInstallMode = PackageInstallMode.Silent; 68 installOptions.PreferredInstallLocation = this.installDir; 69 70 // Install 71 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 72 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 73 74 // Find package again, but this time it should detect the installed version 75 searchResult = this.FindOnePackage(this.compositeSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, Constants.ExeInstallerPackageId); 76 Assert.NotNull(searchResult.CatalogPackage.InstalledVersion); 77 78 // Uninstall 79 var uninstallResult = await this.packageManager.UninstallPackageAsync(searchResult.CatalogPackage, this.TestFactory.CreateUninstallOptions()); 80 Assert.AreEqual(UninstallResultStatus.Ok, uninstallResult.Status); 81 Assert.True(TestCommon.VerifyTestExeUninstalled(this.installDir)); 82 } 83 84 /// <summary> 85 /// Test uninstall msi. 86 /// </summary> 87 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 88 [Test] 89 public async Task UninstallTestMsi() 90 { 91 if (string.IsNullOrEmpty(TestIndex.MsiInstaller)) 92 { 93 Assert.Ignore("MSI installer not available"); 94 } 95 96 // Find package 97 var searchResult = this.FindOnePackage(this.compositeSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, Constants.MsiInstallerPackageId); 98 99 // Configure installation 100 var installOptions = this.TestFactory.CreateInstallOptions(); 101 installOptions.PreferredInstallLocation = this.installDir; 102 103 // Install 104 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 105 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 106 107 // Find package again, but this time it should detect the installed version 108 searchResult = this.FindOnePackage(this.compositeSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, Constants.MsiInstallerPackageId); 109 Assert.NotNull(searchResult.CatalogPackage.InstalledVersion); 110 111 // Uninstall 112 var uninstallResult = await this.packageManager.UninstallPackageAsync(searchResult.CatalogPackage, this.TestFactory.CreateUninstallOptions()); 113 Assert.AreEqual(UninstallResultStatus.Ok, uninstallResult.Status); 114 Assert.True(TestCommon.VerifyTestMsiUninstalled(this.installDir)); 115 } 116 117 /// <summary> 118 /// Test uninstall msix. 119 /// </summary> 120 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 121 [Test] 122 public async Task UninstallTestMsix() 123 { 124 // Find package 125 var searchResult = this.FindOnePackage(this.compositeSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, Constants.MsixInstallerPackageId); 126 127 // Configure installation 128 var installOptions = this.TestFactory.CreateInstallOptions(); 129 130 // Install 131 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 132 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 133 134 // Find package again, but this time it should detect the installed version 135 searchResult = this.FindOnePackage(this.compositeSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, Constants.MsixInstallerPackageId); 136 Assert.NotNull(searchResult.CatalogPackage.InstalledVersion); 137 138 // Uninstall 139 var uninstallResult = await this.packageManager.UninstallPackageAsync(searchResult.CatalogPackage, this.TestFactory.CreateUninstallOptions()); 140 Assert.AreEqual(UninstallResultStatus.Ok, uninstallResult.Status); 141 Assert.True(TestCommon.VerifyTestMsixUninstalled()); 142 } 143 144 /// <summary> 145 /// Test uninstall msix with machine scope. 146 /// </summary> 147 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 148 [Test] 149 public async Task UninstallTestMsixMachineScope() 150 { 151 // TODO: Provision and Deprovision api not supported in build server. 152 Assert.Ignore(); 153 154 // Find package 155 var searchResult = this.FindOnePackage(this.compositeSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, Constants.MsixInstallerPackageId); 156 157 // Configure installation 158 var installOptions = this.TestFactory.CreateInstallOptions(); 159 installOptions.PackageInstallScope = PackageInstallScope.System; 160 161 // Install 162 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 163 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 164 165 // Find package again, but this time it should detect the installed version 166 searchResult = this.FindOnePackage(this.compositeSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, Constants.MsixInstallerPackageId); 167 Assert.NotNull(searchResult.CatalogPackage.InstalledVersion); 168 169 // Uninstall 170 var uninstallOptions = this.TestFactory.CreateUninstallOptions(); 171 uninstallOptions.PackageUninstallScope = PackageUninstallScope.System; 172 173 var uninstallResult = await this.packageManager.UninstallPackageAsync(searchResult.CatalogPackage, uninstallOptions); 174 Assert.AreEqual(UninstallResultStatus.Ok, uninstallResult.Status); 175 Assert.True(TestCommon.VerifyTestMsixUninstalled(true)); 176 } 177 178 /// <summary> 179 /// Test uninstall portable package. 180 /// </summary> 181 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 182 [Test] 183 public async Task UninstallPortable() 184 { 185 string installDir = Path.Combine(Environment.GetEnvironmentVariable(Constants.LocalAppData), "Microsoft", "WinGet", "Packages"); 186 string packageDirName = Constants.PortableExePackageDirName; 187 string productCode = Constants.PortableExePackageDirName; 188 string commandAlias = Constants.AppInstallerTestExeInstallerExe; 189 string fileName = Constants.AppInstallerTestExeInstallerExe; 190 191 // Find package 192 var searchResult = this.FindOnePackage(this.compositeSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, Constants.PortableExePackageId); 193 194 // Configure installation 195 var installOptions = this.TestFactory.CreateInstallOptions(); 196 197 // Install 198 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 199 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 200 201 // Find package again, but this time it should detect the installed version 202 searchResult = this.FindOnePackage(this.compositeSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, Constants.PortableExePackageId); 203 Assert.NotNull(searchResult.CatalogPackage.InstalledVersion); 204 205 // Uninstall 206 var uninstallResult = await this.packageManager.UninstallPackageAsync(searchResult.CatalogPackage, this.TestFactory.CreateUninstallOptions()); 207 Assert.AreEqual(UninstallResultStatus.Ok, uninstallResult.Status); 208 TestCommon.VerifyPortablePackage(Path.Combine(installDir, packageDirName), commandAlias, fileName, productCode, false); 209 } 210 211 /// <summary> 212 /// Test uninstall portable package with product code. 213 /// </summary> 214 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 215 [Test] 216 public async Task UninstallPortableWithProductCode() 217 { 218 string installDir = Path.Combine(Environment.GetEnvironmentVariable(Constants.LocalAppData), "Microsoft", "WinGet", "Packages"); 219 string packageDirName = Constants.PortableExePackageDirName; 220 string productCode = Constants.PortableExePackageDirName; 221 string commandAlias = Constants.AppInstallerTestExeInstallerExe; 222 string fileName = Constants.AppInstallerTestExeInstallerExe; 223 224 // Find package 225 var searchResult = this.FindOnePackage(this.compositeSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, Constants.PortableExePackageId); 226 227 // Configure installation 228 var installOptions = this.TestFactory.CreateInstallOptions(); 229 230 // Install 231 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 232 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 233 234 // Find package again, but this time it should detect the installed version 235 searchResult = this.FindOnePackage(this.compositeSource, PackageMatchField.ProductCode, PackageFieldMatchOption.Equals, productCode); 236 Assert.NotNull(searchResult.CatalogPackage.InstalledVersion); 237 238 // Uninstall 239 var uninstallResult = await this.packageManager.UninstallPackageAsync(searchResult.CatalogPackage, this.TestFactory.CreateUninstallOptions()); 240 Assert.AreEqual(UninstallResultStatus.Ok, uninstallResult.Status); 241 TestCommon.VerifyPortablePackage(Path.Combine(installDir, packageDirName), commandAlias, fileName, productCode, false); 242 } 243 244 /// <summary> 245 /// Test uninstall portable package modified symlink. 246 /// </summary> 247 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 248 [Test] 249 public async Task UninstallPortableModifiedSymlink() 250 { 251 string packageId = Constants.PortableExePackageId; 252 string commandAlias = Constants.AppInstallerTestExeInstallerExe; 253 string symlinkDirectory = Path.Combine(Environment.GetEnvironmentVariable(Constants.LocalAppData), "Microsoft", "WinGet", "Links"); 254 string symlinkPath = Path.Combine(symlinkDirectory, commandAlias); 255 256 // Find package 257 var searchResult = this.FindOnePackage(this.compositeSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, packageId); 258 259 // Configure installation 260 var installOptions = this.TestFactory.CreateInstallOptions(); 261 262 // Install 263 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 264 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 265 266 // Replace symlink with modified symlink 267 File.Delete(symlinkPath); 268 FileSystemInfo modifiedSymlinkInfo = File.CreateSymbolicLink(symlinkPath, "fakeTargetExe"); 269 270 // Find package again, but this time it should detect the installed version 271 searchResult = this.FindOnePackage(this.compositeSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, packageId); 272 Assert.NotNull(searchResult.CatalogPackage.InstalledVersion); 273 274 // Uninstall 275 var uninstallResult = await this.packageManager.UninstallPackageAsync(searchResult.CatalogPackage, this.TestFactory.CreateUninstallOptions()); 276 Assert.AreEqual(UninstallResultStatus.UninstallError, uninstallResult.Status); 277 Assert.True(modifiedSymlinkInfo.Exists, "Modified symlink should still exist"); 278 279 // Remove modified symlink as to not interfere with other tests 280 modifiedSymlinkInfo.Delete(); 281 282 // Uninstall again to clean up. 283 await this.packageManager.UninstallPackageAsync(searchResult.CatalogPackage, this.TestFactory.CreateUninstallOptions()); 284 } 285 286 /// <summary> 287 /// Test uninstall not indexed. 288 /// </summary> 289 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 290 [Test] 291 public async Task UninstallNotIndexed() 292 { 293 const string customProductCode = "{f08fc03c-0b7e-4fca-9b3c-3a384d18a9f3}"; 294 295 // Find package 296 var searchResult = this.FindOnePackage(this.compositeSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, Constants.ExeInstallerPackageId); 297 298 // Configure installation 299 var installOptions = this.TestFactory.CreateInstallOptions(); 300 installOptions.ReplacementInstallerArguments = $"/ProductID {customProductCode} /InstallDir {this.installDir}"; 301 302 // Install 303 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 304 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 305 306 // Find package again, but this time it should detect the installed version 307 searchResult = this.FindOnePackage(this.compositeSource, PackageMatchField.ProductCode, PackageFieldMatchOption.Equals, customProductCode); 308 Assert.NotNull(searchResult.CatalogPackage.InstalledVersion); 309 310 // Uninstall 311 var uninstallResult = await this.packageManager.UninstallPackageAsync(searchResult.CatalogPackage, this.TestFactory.CreateUninstallOptions()); 312 Assert.AreEqual(UninstallResultStatus.Ok, uninstallResult.Status); 313 Assert.True(TestCommon.VerifyTestExeUninstalled(this.installDir)); 314 } 315 } 316 }