winget-cli

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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 }