winget-cli

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

GroupPolicyForInterop.cs (13552B)


      1 // -----------------------------------------------------------------------------
      2 // <copyright file="GroupPolicyForInterop.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.Text;
     12     using System.Threading;
     13     using System.Threading.Tasks;
     14     using AppInstallerCLIE2ETests.Helpers;
     15     using Microsoft.Management.Deployment;
     16     using Microsoft.Management.Deployment.Projection;
     17     using Microsoft.WinGet.SharedLib.Exceptions;
     18     using NUnit.Framework;
     19     using Windows.System;
     20 
     21     /// <summary>
     22     /// Group Policy Tests for COM/WinRT Interop classes.
     23     /// </summary>
     24     [TestFixtureSource(typeof(InstanceInitializersSource), nameof(InstanceInitializersSource.InProcess), Category = nameof(InstanceInitializersSource.InProcess))]
     25     [TestFixtureSource(typeof(InstanceInitializersSource), nameof(InstanceInitializersSource.OutOfProcess), Category = nameof(InstanceInitializersSource.OutOfProcess))]
     26     public class GroupPolicyForInterop : BaseInterop
     27     {
     28         /// <summary>
     29         /// Initializes a new instance of the <see cref="GroupPolicyForInterop"/> class.
     30         /// </summary>
     31         /// <param name="initializer">Initializer.</param>
     32         public GroupPolicyForInterop(IInstanceInitializer initializer)
     33           : base(initializer)
     34         {
     35         }
     36 
     37         /// <summary>
     38         /// Test setup.
     39         /// </summary>
     40         [SetUp]
     41         public void SetUp()
     42         {
     43             GroupPolicyHelper.DeleteExistingPolicies();
     44         }
     45 
     46         /// <summary>
     47         /// Clean up.
     48         /// </summary>
     49         [TearDown]
     50         public void CleanUp()
     51         {
     52             GroupPolicyHelper.DeleteExistingPolicies();
     53         }
     54 
     55         /// <summary>
     56         /// Test class Tear down.
     57         /// </summary>
     58         [OneTimeTearDown]
     59         public void TestClassTearDown()
     60         {
     61             // Restore the tests source if it was removed as the affects subsequent tests.
     62             TestCommon.SetupTestSource();
     63         }
     64 
     65         /// <summary>
     66         /// Validates disabling WinGetPolicy should block COM/WinRT Objects creation (InProcess and OutOfProcess).
     67         /// </summary>
     68         [Test]
     69         public void DisableWinGetPolicy()
     70         {
     71             GroupPolicyHelper.EnableWinget.Disable();
     72 
     73             GroupPolicyException groupPolicyException = Assert.Catch<GroupPolicyException>(() => { PackageManager packageManager = this.TestFactory.CreatePackageManager(); });
     74             Assert.AreEqual(Constants.BlockByWinGetPolicyErrorMessage, groupPolicyException.Message);
     75             Assert.AreEqual(Constants.ErrorCode.ERROR_BLOCKED_BY_POLICY, groupPolicyException.HResult);
     76 
     77             groupPolicyException = Assert.Catch<GroupPolicyException>(() => { FindPackagesOptions findPackagesOptions = this.TestFactory.CreateFindPackagesOptions(); });
     78             Assert.AreEqual(Constants.BlockByWinGetPolicyErrorMessage, groupPolicyException.Message);
     79             Assert.AreEqual(Constants.ErrorCode.ERROR_BLOCKED_BY_POLICY, groupPolicyException.HResult);
     80 
     81             groupPolicyException = Assert.Catch<GroupPolicyException>(() => { CreateCompositePackageCatalogOptions createCompositePackageCatalogOptions = this.TestFactory.CreateCreateCompositePackageCatalogOptions(); });
     82             Assert.AreEqual(Constants.BlockByWinGetPolicyErrorMessage, groupPolicyException.Message);
     83             Assert.AreEqual(Constants.ErrorCode.ERROR_BLOCKED_BY_POLICY, groupPolicyException.HResult);
     84 
     85             groupPolicyException = Assert.Catch<GroupPolicyException>(() => { InstallOptions installOptions = this.TestFactory.CreateInstallOptions(); });
     86             Assert.AreEqual(Constants.BlockByWinGetPolicyErrorMessage, groupPolicyException.Message);
     87             Assert.AreEqual(Constants.ErrorCode.ERROR_BLOCKED_BY_POLICY, groupPolicyException.HResult);
     88 
     89             groupPolicyException = Assert.Catch<GroupPolicyException>(() => { UninstallOptions uninstallOptions = this.TestFactory.CreateUninstallOptions(); });
     90             Assert.AreEqual(Constants.BlockByWinGetPolicyErrorMessage, groupPolicyException.Message);
     91             Assert.AreEqual(Constants.ErrorCode.ERROR_BLOCKED_BY_POLICY, groupPolicyException.HResult);
     92 
     93             groupPolicyException = Assert.Catch<GroupPolicyException>(() => { DownloadOptions downloadOptions = this.TestFactory.CreateDownloadOptions(); });
     94             Assert.AreEqual(Constants.BlockByWinGetPolicyErrorMessage, groupPolicyException.Message);
     95             Assert.AreEqual(Constants.ErrorCode.ERROR_BLOCKED_BY_POLICY, groupPolicyException.HResult);
     96 
     97             groupPolicyException = Assert.Catch<GroupPolicyException>(() => { PackageMatchFilter packageMatchFilter = this.TestFactory.CreatePackageMatchFilter(); });
     98             Assert.AreEqual(Constants.BlockByWinGetPolicyErrorMessage, groupPolicyException.Message);
     99             Assert.AreEqual(Constants.ErrorCode.ERROR_BLOCKED_BY_POLICY, groupPolicyException.HResult);
    100 
    101             groupPolicyException = Assert.Catch<GroupPolicyException>(() => { RepairOptions repairOptions = this.TestFactory.CreateRepairOptions(); });
    102             Assert.AreEqual(Constants.BlockByWinGetPolicyErrorMessage, groupPolicyException.Message);
    103             Assert.AreEqual(Constants.ErrorCode.ERROR_BLOCKED_BY_POLICY, groupPolicyException.HResult);
    104 
    105             groupPolicyException = Assert.Catch<GroupPolicyException>(() => { AddPackageCatalogOptions packageManagerSettings = this.TestFactory.CreateAddPackageCatalogOptions(); });
    106             Assert.AreEqual(Constants.BlockByWinGetPolicyErrorMessage, groupPolicyException.Message);
    107             Assert.AreEqual(Constants.ErrorCode.ERROR_BLOCKED_BY_POLICY, groupPolicyException.HResult);
    108 
    109             groupPolicyException = Assert.Catch<GroupPolicyException>(() => { RemovePackageCatalogOptions packageManagerSettings = this.TestFactory.CreateRemovePackageCatalogOptions(); });
    110             Assert.AreEqual(Constants.BlockByWinGetPolicyErrorMessage, groupPolicyException.Message);
    111             Assert.AreEqual(Constants.ErrorCode.ERROR_BLOCKED_BY_POLICY, groupPolicyException.HResult);
    112 
    113             // PackageManagerSettings is not implemented in context OutOfProcDev
    114             if (this.TestFactory.Context == ClsidContext.InProc)
    115             {
    116                 groupPolicyException = Assert.Catch<GroupPolicyException>(() => { PackageManagerSettings packageManagerSettings = this.TestFactory.CreatePackageManagerSettings(); });
    117                 Assert.AreEqual(Constants.BlockByWinGetPolicyErrorMessage, groupPolicyException.Message);
    118                 Assert.AreEqual(Constants.ErrorCode.ERROR_BLOCKED_BY_POLICY, groupPolicyException.HResult);
    119             }
    120         }
    121 
    122         /// <summary>
    123         /// Validates disabling the EnableWindowsPackageManagerCommandLineInterfaces policy should still allow COM calls.
    124         /// </summary>
    125         /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns>
    126         [Test]
    127         public async Task DisableWinGetCommandLineInterfacesPolicy()
    128         {
    129             GroupPolicyHelper.EnableWinGetCommandLineInterfaces.Disable();
    130 
    131             PackageManager packageManager = this.TestFactory.CreatePackageManager();
    132             string installDir = TestCommon.GetRandomTestDir();
    133 
    134             // Create composite package catalog source
    135             var options = this.TestFactory.CreateCreateCompositePackageCatalogOptions();
    136             var testSource = packageManager.GetPackageCatalogByName(Constants.TestSourceName);
    137             Assert.NotNull(testSource, $"{Constants.TestSourceName} cannot be null");
    138             options.Catalogs.Add(testSource);
    139             options.CompositeSearchBehavior = CompositeSearchBehavior.AllCatalogs;
    140             PackageCatalogReference compositeSource = packageManager.CreateCompositePackageCatalog(options);
    141 
    142             // Find package
    143             var searchResult = this.FindOnePackage(compositeSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, Constants.ModifyRepairInstaller);
    144 
    145             // Configure installation
    146             var installOptions = this.TestFactory.CreateInstallOptions();
    147             installOptions.AcceptPackageAgreements = true;
    148             installOptions.ReplacementInstallerArguments = $"/InstallDir {installDir} /Version 2.0.0.0 /DisplayName TestModifyRepair /UseHKLM";
    149 
    150             // Install
    151             var installResult = await packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions);
    152             Assert.AreEqual(InstallResultStatus.Ok, installResult.Status);
    153 
    154             // Find package again, but this time it should detect the installed version
    155             searchResult = this.FindOnePackage(compositeSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, Constants.ModifyRepairInstaller);
    156             Assert.NotNull(searchResult.CatalogPackage.InstalledVersion);
    157 
    158             // Repair
    159             var repairOptions = this.TestFactory.CreateRepairOptions();
    160             repairOptions.PackageRepairMode = PackageRepairMode.Silent;
    161             var repairResult = await packageManager.RepairPackageAsync(searchResult.CatalogPackage, repairOptions);
    162             Assert.AreEqual(RepairResultStatus.Ok, repairResult.Status);
    163 
    164             // Uninstall
    165             var uninstallResult = await packageManager.UninstallPackageAsync(searchResult.CatalogPackage, this.TestFactory.CreateUninstallOptions());
    166             Assert.AreEqual(UninstallResultStatus.Ok, uninstallResult.Status);
    167             Assert.True(TestCommon.VerifyTestExeUninstalled(installDir));
    168 
    169             // Clean up.
    170             if (Directory.Exists(installDir))
    171             {
    172                 Directory.Delete(installDir, true);
    173             }
    174 
    175             // Download
    176             var downloadResult = await packageManager.DownloadPackageAsync(searchResult.CatalogPackage, this.TestFactory.CreateDownloadOptions());
    177             Assert.AreEqual(DownloadResultStatus.Ok, downloadResult.Status);
    178             var packageVersion = "2.0.0.0";
    179             string downloadDir = Path.Combine(TestCommon.GetDefaultDownloadDirectory(), $"{Constants.ModifyRepairInstaller}_{packageVersion}");
    180             TestCommon.AssertInstallerDownload(downloadDir, "TestModifyRepair", packageVersion, ProcessorArchitecture.X86, TestCommon.Scope.Unknown, PackageInstallerType.Burn, "en-US");
    181 
    182             // Add, update and remove package catalog
    183             await this.AddUpdateRemovePackageCatalog();
    184         }
    185 
    186         private async Task AddUpdateRemovePackageCatalog()
    187         {
    188             // Remove the tests source if it exists.
    189             await this.RemovePackageCatalog();
    190 
    191             PackageManager packageManager = this.TestFactory.CreatePackageManager();
    192 
    193             // Add package catalog
    194             AddPackageCatalogOptions options = this.TestFactory.CreateAddPackageCatalogOptions();
    195             options.SourceUri = Constants.TestSourceUrl;
    196             options.Name = Constants.TestSourceName;
    197             options.TrustLevel = PackageCatalogTrustLevel.Trusted;
    198 
    199             var addCatalogResult = await packageManager.AddPackageCatalogAsync(options);
    200             Assert.IsNotNull(addCatalogResult);
    201             Assert.AreEqual(AddPackageCatalogStatus.Ok, addCatalogResult.Status);
    202 
    203             // Get package catalog
    204             var packageCatalog = packageManager.GetPackageCatalogByName(options.Name);
    205 
    206             Assert.IsNotNull(packageCatalog);
    207             Assert.AreEqual(options.Name, packageCatalog.Info.Name);
    208             Assert.AreEqual(options.SourceUri, packageCatalog.Info.Argument);
    209             var lastUpdatedTime = packageCatalog.Info.LastUpdateTime;
    210 
    211             // Update package catalog
    212             // Sleep for 30 seconds to make sure the last updated time is different after the refresh.
    213             Thread.Sleep(TimeSpan.FromSeconds(30));
    214 
    215             var updateResult = await packageCatalog.RefreshPackageCatalogAsync();
    216             Assert.IsNotNull(updateResult);
    217             Assert.AreEqual(RefreshPackageCatalogStatus.Ok, updateResult.Status);
    218 
    219             packageCatalog = packageManager.GetPackageCatalogByName(options.Name);
    220             Assert.IsTrue(packageCatalog.Info.LastUpdateTime > lastUpdatedTime);
    221 
    222             // Remove package catalog
    223             await this.RemovePackageCatalog();
    224         }
    225 
    226         private async Task RemovePackageCatalog()
    227         {
    228             PackageManager packageManager = this.TestFactory.CreatePackageManager();
    229 
    230             // Remove the tests source if it exists.
    231             RemovePackageCatalogOptions removePackageCatalogOptions = this.TestFactory.CreateRemovePackageCatalogOptions();
    232             removePackageCatalogOptions.Name = Constants.TestSourceName;
    233 
    234             var removeCatalogResult = await packageManager.RemovePackageCatalogAsync(removePackageCatalogOptions);
    235             Assert.IsNotNull(removeCatalogResult);
    236             Assert.AreEqual(RemovePackageCatalogStatus.Ok, removeCatalogResult.Status);
    237 
    238             var packageCatalog = packageManager.GetPackageCatalogByName(removePackageCatalogOptions.Name);
    239             Assert.IsNull(packageCatalog);
    240         }
    241     }
    242 }