InstallInterop.cs (34814B)
1 // ----------------------------------------------------------------------------- 2 // <copyright file="InstallInterop.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 /// Install 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 InstallInterop : BaseInterop 23 { 24 private string installDir; 25 private PackageManager packageManager; 26 private PackageCatalogReference testSource; 27 28 /// <summary> 29 /// Initializes a new instance of the <see cref="InstallInterop"/> class. 30 /// </summary> 31 /// <param name="initializer">Initializer.</param> 32 public InstallInterop(IInstanceInitializer initializer) 33 : base(initializer) 34 { 35 } 36 37 /// <summary> 38 /// Set up. 39 /// </summary> 40 [SetUp] 41 public void SetUp() 42 { 43 this.packageManager = this.TestFactory.CreatePackageManager(); 44 this.testSource = this.packageManager.GetPackageCatalogByName(Constants.TestSourceName); 45 this.installDir = TestCommon.GetRandomTestDir(); 46 } 47 48 /// <summary> 49 /// Install exe. 50 /// </summary> 51 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 52 [Test] 53 public async Task InstallExe() 54 { 55 // Find package 56 var searchResult = this.FindOnePackage(this.testSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, "AppInstallerTest.TestExeInstaller"); 57 58 // Configure installation 59 var installOptions = this.TestFactory.CreateInstallOptions(); 60 installOptions.PackageInstallMode = PackageInstallMode.Silent; 61 installOptions.PreferredInstallLocation = this.installDir; 62 installOptions.AcceptPackageAgreements = true; 63 64 // Install 65 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 66 67 // Assert 68 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 69 Assert.True(TestCommon.VerifyTestExeInstalledAndCleanup(this.installDir)); 70 } 71 72 /// <summary> 73 /// Test install with inapplicable os version. 74 /// </summary> 75 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 76 [Test] 77 public async Task InstallExeWithInsufficientMinOsVersion() 78 { 79 // Find package 80 var searchResult = this.FindOnePackage(this.testSource, PackageMatchField.Name, PackageFieldMatchOption.Equals, "InapplicableOsVersion"); 81 82 // Configure installation 83 var installOptions = this.TestFactory.CreateInstallOptions(); 84 installOptions.PackageInstallMode = PackageInstallMode.Silent; 85 installOptions.PreferredInstallLocation = this.installDir; 86 87 // Install 88 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 89 90 // Assert 91 Assert.AreEqual(InstallResultStatus.NoApplicableInstallers, installResult.Status); 92 Assert.False(TestCommon.VerifyTestExeInstalledAndCleanup(this.installDir)); 93 } 94 95 /// <summary> 96 /// Test install with hash mismatch. 97 /// </summary> 98 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 99 [Test] 100 public async Task InstallExeWithHashMismatch() 101 { 102 // Find package 103 var searchResult = this.FindOnePackage(this.testSource, PackageMatchField.Name, PackageFieldMatchOption.Equals, "TestExeSha256Mismatch"); 104 105 // Configure installation 106 var installOptions = this.TestFactory.CreateInstallOptions(); 107 installOptions.PackageInstallMode = PackageInstallMode.Silent; 108 installOptions.PreferredInstallLocation = this.installDir; 109 110 // Install 111 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 112 113 // Assert 114 Assert.AreEqual(InstallResultStatus.DownloadError, installResult.Status); 115 Assert.False(TestCommon.VerifyTestExeInstalledAndCleanup(this.installDir)); 116 } 117 118 /// <summary> 119 /// Test installing inno installer. 120 /// </summary> 121 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 122 [Test] 123 public async Task InstallWithInno() 124 { 125 // Find package 126 var searchResult = this.FindOnePackage(this.testSource, PackageMatchField.Name, PackageFieldMatchOption.Equals, "TestInnoInstaller"); 127 128 // Configure installation 129 var installOptions = this.TestFactory.CreateInstallOptions(); 130 installOptions.PackageInstallMode = PackageInstallMode.Silent; 131 installOptions.PreferredInstallLocation = this.installDir; 132 133 // Install 134 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 135 136 // Assert 137 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 138 Assert.True(TestCommon.VerifyTestExeInstalledAndCleanup(this.installDir)); 139 } 140 141 /// <summary> 142 /// Test installing burn installer. 143 /// </summary> 144 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 145 [Test] 146 public async Task InstallBurn() 147 { 148 // Find package 149 var searchResult = this.FindOnePackage(this.testSource, PackageMatchField.Name, PackageFieldMatchOption.Equals, "TestBurnInstaller"); 150 151 // Configure installation 152 var installOptions = this.TestFactory.CreateInstallOptions(); 153 installOptions.PackageInstallMode = PackageInstallMode.Silent; 154 installOptions.PreferredInstallLocation = this.installDir; 155 156 // Install 157 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 158 159 // Assert 160 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 161 Assert.True(TestCommon.VerifyTestExeInstalledAndCleanup(this.installDir)); 162 } 163 164 /// <summary> 165 /// Test installing nullsoft installer. 166 /// </summary> 167 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 168 [Test] 169 public async Task InstallNullSoft() 170 { 171 // Find package 172 var searchResult = this.FindOnePackage(this.testSource, PackageMatchField.Name, PackageFieldMatchOption.Equals, "TestNullsoftInstaller"); 173 174 // Configure installation 175 var installOptions = this.TestFactory.CreateInstallOptions(); 176 installOptions.PackageInstallMode = PackageInstallMode.Silent; 177 installOptions.PreferredInstallLocation = this.installDir; 178 179 // Install 180 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 181 182 // Assert 183 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 184 Assert.True(TestCommon.VerifyTestExeInstalledAndCleanup(this.installDir)); 185 } 186 187 /// <summary> 188 /// Test installing msi. 189 /// </summary> 190 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 191 [Test] 192 public async Task InstallMSI() 193 { 194 if (string.IsNullOrEmpty(TestIndex.MsiInstaller)) 195 { 196 Assert.Ignore("MSI installer not available"); 197 } 198 199 // Find package 200 var searchResult = this.FindOnePackage(this.testSource, PackageMatchField.Name, PackageFieldMatchOption.Equals, "TestMsiInstaller"); 201 202 // Configure installation 203 var installOptions = this.TestFactory.CreateInstallOptions(); 204 installOptions.PackageInstallMode = PackageInstallMode.Silent; 205 installOptions.PreferredInstallLocation = this.installDir; 206 207 // Install 208 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 209 210 // Assert 211 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 212 Assert.True(TestCommon.VerifyTestMsiInstalledAndCleanup(this.installDir)); 213 } 214 215 /// <summary> 216 /// Test installing an msix. 217 /// </summary> 218 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 219 [Test] 220 public async Task InstallMSIX() 221 { 222 // Find package 223 var searchResult = this.FindOnePackage(this.testSource, PackageMatchField.Name, PackageFieldMatchOption.Equals, "TestMsixInstaller"); 224 225 // Configure installation 226 var installOptions = this.TestFactory.CreateInstallOptions(); 227 228 // Install 229 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 230 231 // Assert 232 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 233 Assert.True(TestCommon.VerifyTestMsixInstalledAndCleanup()); 234 } 235 236 /// <summary> 237 /// Test installing msix with machine scope. 238 /// </summary> 239 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 240 [Test] 241 public async Task InstallMSIXMachineScope() 242 { 243 // TODO: Provision and Deprovision api not supported in build server. 244 Assert.Ignore(); 245 246 // Find package 247 var searchResult = this.FindOnePackage(this.testSource, PackageMatchField.Name, PackageFieldMatchOption.Equals, "TestMsixInstaller"); 248 249 // Configure installation 250 var installOptions = this.TestFactory.CreateInstallOptions(); 251 installOptions.PackageInstallScope = PackageInstallScope.System; 252 253 // Install 254 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 255 256 // Assert 257 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 258 Assert.True(TestCommon.VerifyTestMsixInstalledAndCleanup(true)); 259 } 260 261 /// <summary> 262 /// Test installing msix with signature. 263 /// </summary> 264 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 265 [Test] 266 public async Task InstallMSIXWithSignature() 267 { 268 // Task to investigate installation error 269 // TODO: https://task.ms/40489822 270 Assert.Ignore(); 271 272 // Find package 273 var searchResult = this.FindOnePackage(this.testSource, PackageMatchField.Name, PackageFieldMatchOption.Equals, "TestMsixWithSignatureHash"); 274 275 // Configure installation 276 var installOptions = this.TestFactory.CreateInstallOptions(); 277 278 // Install 279 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 280 281 // Assert 282 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 283 Assert.True(TestCommon.VerifyTestMsixInstalledAndCleanup()); 284 } 285 286 /// <summary> 287 /// Test installing msix with signature machine scope. 288 /// </summary> 289 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 290 [Test] 291 public async Task InstallMSIXWithSignatureMachineScope() 292 { 293 // TODO: Provision and Deprovision api not supported in build server. 294 Assert.Ignore(); 295 296 // Find package 297 var searchResult = this.FindOnePackage(this.testSource, PackageMatchField.Name, PackageFieldMatchOption.Equals, "TestMsixWithSignatureHash"); 298 299 // Configure installation 300 var installOptions = this.TestFactory.CreateInstallOptions(); 301 installOptions.PackageInstallScope = PackageInstallScope.System; 302 303 // Install 304 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 305 306 // Assert 307 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 308 Assert.True(TestCommon.VerifyTestMsixInstalledAndCleanup(true)); 309 } 310 311 /// <summary> 312 /// Test installing msix with signature hash mismatch. 313 /// </summary> 314 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 315 [Test] 316 public async Task InstallMSIXWithSignatureHashMismatch() 317 { 318 // Find package 319 var searchResult = this.FindOnePackage(this.testSource, PackageMatchField.Name, PackageFieldMatchOption.Equals, "TestMsixSignatureHashMismatch"); 320 321 // Configure installation 322 var installOptions = this.TestFactory.CreateInstallOptions(); 323 324 // Install 325 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 326 327 // Assert 328 Assert.AreEqual(InstallResultStatus.DownloadError, installResult.Status); 329 Assert.False(TestCommon.VerifyTestMsixInstalledAndCleanup()); 330 } 331 332 /// <summary> 333 /// Test installing exe. 334 /// </summary> 335 [Test] 336 public void InstallExeWithAlternateSourceFailure() 337 { 338 // Add mock source 339 TestCommon.RunAICLICommand("source add", "failSearch \"{ \"\"SearchHR\"\": \"\"0x80070002\"\" }\" Microsoft.Test.Configurable --header \"{}\""); 340 341 // Get mock source 342 var failSearchSource = this.packageManager.GetPackageCatalogByName("failSearch"); 343 344 // Find package 345 var searchResult = this.FindAllPackages(failSearchSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, "AppInstallerTest.TestExeInstaller"); 346 347 // Assert 348 Assert.NotNull(failSearchSource); 349 Assert.AreEqual(0, searchResult.Count); 350 351 // Remove mock source 352 TestCommon.RunAICLICommand("source remove", "failSearch"); 353 } 354 355 /// <summary> 356 /// Test installing portable exe. 357 /// </summary> 358 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 359 [Test] 360 public async Task InstallPortableExe() 361 { 362 string installDir = Path.Combine(Environment.GetEnvironmentVariable(Constants.LocalAppData), "Microsoft", "WinGet", "Packages"); 363 string productCode = Constants.PortableExePackageDirName; 364 string commandAlias = $"{Constants.ExeInstaller}.exe"; 365 string fileName = $"{Constants.ExeInstaller}.exe"; 366 367 // Find package 368 var searchResult = this.FindOnePackage(this.testSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, Constants.PortableExePackageId); 369 370 // Configure installation 371 var installOptions = this.TestFactory.CreateInstallOptions(); 372 373 // Install 374 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 375 376 // Assert 377 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 378 TestCommon.VerifyPortablePackage(Path.Combine(installDir, Constants.PortableExePackageDirName), commandAlias, fileName, productCode, true); 379 } 380 381 /// <summary> 382 /// Test installing portable exe with command. 383 /// </summary> 384 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 385 [Test] 386 public async Task InstallPortableExeWithCommand() 387 { 388 string productCode = Constants.PortableExeWithCommandPackageDirName; 389 string fileName = Constants.AppInstallerTestExeInstallerExe; 390 string commandAlias = Constants.TestCommandExe; 391 392 // Find package 393 var searchResult = this.FindOnePackage(this.testSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, Constants.PortableExeWithCommandPackageId); 394 395 // Configure installation 396 var installOptions = this.TestFactory.CreateInstallOptions(); 397 installOptions.PreferredInstallLocation = this.installDir; 398 399 // Install 400 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 401 402 // Assert 403 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 404 TestCommon.VerifyPortablePackage(this.installDir, commandAlias, fileName, productCode, true); 405 } 406 407 /// <summary> 408 /// Test installing portable package to existing directory. 409 /// </summary> 410 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 411 [Test] 412 public async Task InstallPortableToExistingDirectory() 413 { 414 var existingDir = Path.Combine(this.installDir, "testDirectory"); 415 Directory.CreateDirectory(existingDir); 416 417 string productCode = Constants.PortableExePackageDirName; 418 string commandAlias = Constants.AppInstallerTestExeInstallerExe; 419 string fileName = Constants.AppInstallerTestExeInstallerExe; 420 421 // Find package 422 var searchResult = this.FindOnePackage(this.testSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, Constants.PortableExePackageId); 423 424 // Configure installation 425 var installOptions = this.TestFactory.CreateInstallOptions(); 426 installOptions.PreferredInstallLocation = existingDir; 427 428 // Install 429 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 430 431 // Assert 432 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 433 TestCommon.VerifyPortablePackage(existingDir, commandAlias, fileName, productCode, true); 434 } 435 436 /// <summary> 437 /// Test installing portable package where it fails on clean up. 438 /// </summary> 439 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 440 [Test] 441 public async Task InstallPortableFailsWithCleanup() 442 { 443 if (this.TestFactory.Context == ClsidContext.InProc) 444 { 445 // Task to investigate validation error when running in-process 446 // TODO: https://task.ms/40489822 447 Assert.Ignore(); 448 } 449 450 string winGetDir = Path.Combine(Environment.GetEnvironmentVariable(Constants.LocalAppData), "Microsoft", "WinGet"); 451 string installDir = Path.Combine(winGetDir, "Packages"); 452 string symlinkDirectory = Path.Combine(winGetDir, "Links"); 453 string packageDirName = Constants.PortableExePackageDirName; 454 string productCode = Constants.PortableExePackageDirName; 455 string commandAlias = Constants.AppInstallerTestExeInstallerExe; 456 string fileName = Constants.AppInstallerTestExeInstallerExe; 457 string conflictDirectory = Path.Combine(symlinkDirectory, commandAlias); 458 459 // Create a directory with the same name as the symlink in order to cause install to fail. 460 Directory.CreateDirectory(conflictDirectory); 461 462 // Find package 463 var searchResult = this.FindOnePackage(this.testSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, Constants.PortableExePackageId); 464 465 // Configure installation 466 var installOptions = this.TestFactory.CreateInstallOptions(); 467 468 // Install 469 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 470 471 // Assert 472 Assert.AreEqual(InstallResultStatus.InstallError, installResult.Status); 473 TestCommon.VerifyPortablePackage(Path.Combine(installDir, packageDirName), commandAlias, fileName, productCode, false); 474 Directory.Delete(conflictDirectory, true); 475 } 476 477 /// <summary> 478 /// Test installing a package with user scope. 479 /// </summary> 480 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 481 [Test] 482 public async Task InstallRequireUserScope() 483 { 484 // Find package 485 var searchResult = this.FindOnePackage(this.testSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, "AppInstallerTest.TestExeInstallerNoScope"); 486 487 // Configure installation 488 var installOptions = this.TestFactory.CreateInstallOptions(); 489 installOptions.PackageInstallMode = PackageInstallMode.Silent; 490 installOptions.PreferredInstallLocation = this.installDir; 491 installOptions.PackageInstallScope = PackageInstallScope.User; 492 493 // Install 494 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 495 496 // Assert 497 Assert.AreEqual(InstallResultStatus.NoApplicableInstallers, installResult.Status); 498 } 499 500 /// <summary> 501 /// Test installing package with user scope or unknown. 502 /// </summary> 503 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 504 [Test] 505 public async Task InstallRequireUserScopeAndUnknown() 506 { 507 // Find package 508 var searchResult = this.FindOnePackage(this.testSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, "AppInstallerTest.TestExeInstallerNoScope"); 509 510 // Configure installation 511 var installOptions = this.TestFactory.CreateInstallOptions(); 512 installOptions.PackageInstallMode = PackageInstallMode.Silent; 513 installOptions.PreferredInstallLocation = this.installDir; 514 installOptions.PackageInstallScope = PackageInstallScope.UserOrUnknown; 515 516 // Install 517 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 518 519 // Assert 520 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 521 } 522 523 /// <summary> 524 /// Test installing package with agreements and accepting those agreements. 525 /// </summary> 526 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 527 [Test] 528 public async Task InstallWithAgreementsAccepted() 529 { 530 // Find package 531 var searchResult = this.FindOnePackage(this.testSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, "AppInstallerTest.CatalogPackageMetadata"); 532 533 // Configure installation 534 var installOptions = this.TestFactory.CreateInstallOptions(); 535 installOptions.PackageInstallMode = PackageInstallMode.Silent; 536 installOptions.PreferredInstallLocation = this.installDir; 537 installOptions.AcceptPackageAgreements = true; 538 539 // Install 540 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 541 542 // Assert 543 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 544 } 545 546 /// <summary> 547 /// Test installing package with agreements and not accepting those agreements. 548 /// </summary> 549 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 550 [Test] 551 public async Task InstallWithAgreementsNotAccepted() 552 { 553 // Find package 554 var searchResult = this.FindOnePackage(this.testSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, "AppInstallerTest.CatalogPackageMetadata"); 555 556 // Configure installation 557 var installOptions = this.TestFactory.CreateInstallOptions(); 558 installOptions.PackageInstallMode = PackageInstallMode.Silent; 559 installOptions.PreferredInstallLocation = this.installDir; 560 installOptions.AcceptPackageAgreements = false; 561 562 // Install 563 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 564 565 // Assert 566 Assert.AreEqual(InstallResultStatus.PackageAgreementsNotAccepted, installResult.Status); 567 } 568 569 /// <summary> 570 /// Test installing a package with a package dependency and passing in the 'skip-dependencies' install option. 571 /// </summary> 572 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 573 [Test] 574 public async Task InstallWithSkipDependencies() 575 { 576 // Find package 577 var searchResult = this.FindOnePackage(this.testSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, "AppInstallerTest.PackageDependency"); 578 579 // Configure installation 580 var installOptions = this.TestFactory.CreateInstallOptions(); 581 installOptions.PackageInstallMode = PackageInstallMode.Silent; 582 installOptions.PreferredInstallLocation = this.installDir; 583 installOptions.AcceptPackageAgreements = true; 584 installOptions.SkipDependencies = true; 585 586 // Install 587 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 588 589 // Assert that only the exe installer is installed and not the portable package dependency. 590 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 591 Assert.True(TestCommon.VerifyTestExeInstalledAndCleanup(this.installDir)); 592 593 string installDir = Path.Combine(Environment.GetEnvironmentVariable(Constants.LocalAppData), "Microsoft", "WinGet", "Packages"); 594 string productCode = Constants.PortableExePackageDirName; 595 string commandAlias = $"{Constants.ExeInstaller}.exe"; 596 string fileName = $"{Constants.ExeInstaller}.exe"; 597 TestCommon.VerifyPortablePackage(Path.Combine(installDir, Constants.PortableExePackageDirName), commandAlias, fileName, productCode, false); 598 } 599 600 /// <summary> 601 /// Test installing a package with a specific installer type install option. 602 /// </summary> 603 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 604 [Test] 605 public async Task InstallWithInstallerType() 606 { 607 // Find package 608 var searchResult = this.FindOnePackage(this.testSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, "AppInstallerTest.TestMultipleInstallers"); 609 610 // Configure installation 611 var installOptions = this.TestFactory.CreateInstallOptions(); 612 installOptions.PackageInstallMode = PackageInstallMode.Silent; 613 installOptions.PreferredInstallLocation = this.installDir; 614 installOptions.InstallerType = PackageInstallerType.Msi; 615 installOptions.AcceptPackageAgreements = true; 616 617 // Install 618 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 619 620 // Assert 621 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 622 Assert.True(TestCommon.VerifyTestMsiInstalledAndCleanup(this.installDir)); 623 } 624 625 /// <summary> 626 /// Test to verify the GetApplicableInstaller() COM call returns the correct manifest installer metadata. 627 /// </summary> 628 [Test] 629 public void GetApplicableInstaller() 630 { 631 // Find package 632 var searchResult = this.FindAllPackages(this.testSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, "AppInstallerTest.PackageInstallerInfo"); 633 Assert.AreEqual(1, searchResult.Count); 634 635 // Configure installation 636 var catalogPackage = searchResult[0].CatalogPackage; 637 var packageVersionId = catalogPackage.AvailableVersions[0]; 638 var packageVersionInfo = catalogPackage.GetPackageVersionInfo(packageVersionId); 639 640 // Use install options with no applicable match. 641 var badInstallOptions = this.TestFactory.CreateInstallOptions(); 642 badInstallOptions.PackageInstallScope = PackageInstallScope.System; 643 644 Assert.IsNull(packageVersionInfo.GetApplicableInstaller(badInstallOptions)); 645 646 // Use install options with valid applicable match. 647 var installOptions = this.TestFactory.CreateInstallOptions(); 648 installOptions.PackageInstallScope = PackageInstallScope.User; 649 var packageInstallerInfo = packageVersionInfo.GetApplicableInstaller(installOptions); 650 651 // Assert 652 Assert.IsNotNull(packageInstallerInfo); 653 Assert.AreEqual(ElevationRequirement.ElevationRequired, packageInstallerInfo.ElevationRequirement); 654 Assert.AreEqual(Windows.System.ProcessorArchitecture.X64, packageInstallerInfo.Architecture); 655 Assert.AreEqual(PackageInstallerType.Zip, packageInstallerInfo.InstallerType); 656 Assert.AreEqual(PackageInstallerType.Exe, packageInstallerInfo.NestedInstallerType); 657 Assert.AreEqual(PackageInstallerScope.User, packageInstallerInfo.Scope); 658 Assert.AreEqual("en-US", packageInstallerInfo.Locale); 659 } 660 661 /// <summary> 662 /// Install exe and verify that we can find it as installed after. 663 /// </summary> 664 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 665 [Test] 666 public async Task InstallExe_VerifyInstalledCatalog() 667 { 668 var installedCatalogReference = this.packageManager.GetLocalPackageCatalog(LocalPackageCatalog.InstalledPackages); 669 670 // Ensure package is not installed 671 var installedResult = this.FindAllPackages(installedCatalogReference, PackageMatchField.ProductCode, PackageFieldMatchOption.Equals, Constants.ExeInstalledDefaultProductCode); 672 Assert.IsNotNull(installedResult); 673 Assert.AreEqual(0, installedResult.Count); 674 675 // Find package 676 var searchResult = this.FindOnePackage(this.testSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, "AppInstallerTest.TestExeInstaller"); 677 678 // Configure installation 679 var installOptions = this.TestFactory.CreateInstallOptions(); 680 installOptions.PackageInstallMode = PackageInstallMode.Silent; 681 installOptions.PreferredInstallLocation = this.installDir; 682 installOptions.AcceptPackageAgreements = true; 683 684 // Install 685 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 686 687 // Assert 688 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 689 690 // Check installed catalog after 691 this.FindOnePackage(installedCatalogReference, PackageMatchField.ProductCode, PackageFieldMatchOption.Equals, Constants.ExeInstalledDefaultProductCode); 692 693 Assert.True(TestCommon.VerifyTestExeInstalledAndCleanup(this.installDir)); 694 } 695 696 /// <summary> 697 /// Install msix and verify that we can find it as installed after. 698 /// </summary> 699 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 700 [Test] 701 public async Task InstallMSIX_VerifyInstalledCatalog() 702 { 703 var installedCatalogReference = this.packageManager.GetLocalPackageCatalog(LocalPackageCatalog.InstalledPackages); 704 705 // Ensure package is not installed 706 var installedResult = this.FindAllPackages(installedCatalogReference, PackageMatchField.PackageFamilyName, PackageFieldMatchOption.Equals, Constants.MsixInstallerPackageFamilyName); 707 Assert.IsNotNull(installedResult); 708 Assert.AreEqual(0, installedResult.Count); 709 710 // Find package 711 var searchResult = this.FindOnePackage(this.testSource, PackageMatchField.Name, PackageFieldMatchOption.Equals, "TestMsixInstaller"); 712 713 // Configure installation 714 var installOptions = this.TestFactory.CreateInstallOptions(); 715 716 // Install 717 var installResult = await this.packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 718 719 // Assert 720 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 721 722 // Check installed catalog after 723 this.FindOnePackage(installedCatalogReference, PackageMatchField.PackageFamilyName, PackageFieldMatchOption.Equals, Constants.MsixInstallerPackageFamilyName); 724 725 Assert.True(TestCommon.VerifyTestMsixInstalledAndCleanup()); 726 } 727 } 728 }