winget-cli

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

WinGetSettingsHelper.cs (11425B)


      1 // -----------------------------------------------------------------------------
      2 // <copyright file="WinGetSettingsHelper.cs" company="Microsoft Corporation">
      3 //     Copyright (c) Microsoft Corporation. Licensed under the MIT License.
      4 // </copyright>
      5 // -----------------------------------------------------------------------------
      6 
      7 namespace AppInstallerCLIE2ETests.Helpers
      8 {
      9     using System.Collections;
     10     using System.IO;
     11     using Newtonsoft.Json;
     12     using Newtonsoft.Json.Linq;
     13 
     14     /// <summary>
     15     /// Helper class to set winget settings.
     16     /// </summary>
     17     internal static class WinGetSettingsHelper
     18     {
     19         /// <summary>
     20         /// Gets or sets the experimental features that should be forcibly enabled.
     21         /// </summary>
     22         public static string[] ForcedExperimentalFeatures { get; set; }
     23 
     24         /// <summary>
     25         /// Gets the user settings path by calling winget settings export.
     26         /// </summary>
     27         /// <returns>Expanded path for user settings.</returns>
     28         public static string GetUserSettingsPath()
     29         {
     30             var result = TestCommon.RunAICLICommand("settings", "export");
     31             var output = result.StdOut;
     32             var serialized = JObject.Parse(output);
     33             return (string)serialized.GetValue("userSettingsFile");
     34         }
     35 
     36         /// <summary>
     37         /// Initialize settings.
     38         /// </summary>
     39         public static void InitializeWingetSettings()
     40         {
     41             Hashtable experimentalFeatures = new Hashtable();
     42 
     43             var forcedExperimentalFeatures = ForcedExperimentalFeatures;
     44             if (forcedExperimentalFeatures != null)
     45             {
     46                 foreach (var feature in forcedExperimentalFeatures)
     47                 {
     48                     experimentalFeatures[feature] = true;
     49                 }
     50             }
     51 
     52             var settingsJson = new Hashtable()
     53             {
     54                 {
     55                     "$schema",
     56                     "https://aka.ms/winget-settings.schema.json"
     57                 },
     58                 {
     59                     "experimentalFeatures",
     60                     experimentalFeatures
     61                 },
     62                 {
     63                     "debugging",
     64                     new Hashtable()
     65                     {
     66                         { "enableSelfInitiatedMinidump", true },
     67                         { "keepAllLogFiles", true },
     68                     }
     69                 },
     70                 {
     71                     "installBehavior",
     72                     new Hashtable()
     73                     {
     74                     }
     75                 },
     76                 {
     77                     "configureBehavior",
     78                     new Hashtable()
     79                     {
     80                     }
     81                 },
     82             };
     83 
     84             // Run winget one time to initialize settings directory
     85             // when running in unpackaged context
     86             TestCommon.RunAICLICommand(string.Empty, "-v");
     87 
     88             SetWingetSettings(JsonConvert.SerializeObject(settingsJson, Formatting.Indented));
     89         }
     90 
     91         /// <summary>
     92         /// Configure experimental features.
     93         /// </summary>
     94         /// <param name="featureName">Feature name.</param>
     95         /// <param name="status">Status.</param>
     96         public static void ConfigureFeature(string featureName, bool status)
     97         {
     98             JObject settingsJson = GetJsonSettingsObject("experimentalFeatures");
     99             ConfigureFeature(settingsJson, featureName, status);
    100             SetWingetSettings(settingsJson);
    101         }
    102 
    103         /// <summary>
    104         /// Configure the install behavior.
    105         /// </summary>
    106         /// <param name="settingName">Setting name.</param>
    107         /// <param name="value">Setting value.</param>
    108         public static void ConfigureInstallBehavior(string settingName, string value)
    109         {
    110             JObject settingsJson = GetJsonSettingsObject("installBehavior");
    111             var installBehavior = settingsJson["installBehavior"];
    112             installBehavior[settingName] = value;
    113 
    114             SetWingetSettings(settingsJson);
    115         }
    116 
    117         /// <summary>
    118         /// Configure the configuration behavior.
    119         /// </summary>
    120         /// <param name="settingName">Setting name.</param>
    121         /// <param name="value">Setting value.</param>
    122         public static void ConfigureConfigureBehavior(string settingName, string value)
    123         {
    124             JObject settingsJson = GetJsonSettingsObject("configureBehavior");
    125             var configureBehavior = settingsJson["configureBehavior"];
    126             configureBehavior[settingName] = value;
    127 
    128             SetWingetSettings(settingsJson);
    129         }
    130 
    131         /// <summary>
    132         /// Configure the install behavior preferences.
    133         /// </summary>
    134         /// <param name="settingName">Setting name.</param>
    135         /// <param name="value">Setting value.</param>
    136         public static void ConfigureInstallBehaviorPreferences(string settingName, string value)
    137         {
    138             JObject settingsJson = GetJsonSettingsObject("installBehavior");
    139             var installBehavior = settingsJson["installBehavior"];
    140 
    141             if (installBehavior["preferences"] == null)
    142             {
    143                 installBehavior["preferences"] = new JObject();
    144             }
    145 
    146             var preferences = installBehavior["preferences"];
    147             preferences[settingName] = value;
    148 
    149             SetWingetSettings(settingsJson);
    150         }
    151 
    152         /// <summary>
    153         /// Configure the install behavior preferences.
    154         /// </summary>
    155         /// <param name="settingName">Setting name.</param>
    156         /// <param name="value">Setting value array.</param>
    157         public static void ConfigureInstallBehaviorPreferences(string settingName, string[] value)
    158         {
    159             JObject settingsJson = GetJsonSettingsObject("installBehavior");
    160             var installBehavior = settingsJson["installBehavior"];
    161 
    162             if (installBehavior["preferences"] == null)
    163             {
    164                 installBehavior["preferences"] = new JObject();
    165             }
    166 
    167             var preferences = installBehavior["preferences"];
    168             preferences[settingName] = new JArray(value);
    169 
    170             SetWingetSettings(settingsJson);
    171         }
    172 
    173         /// <summary>
    174         /// Configure the install behavior requirements.
    175         /// </summary>
    176         /// <param name="settingName">Setting name.</param>
    177         /// <param name="value">Setting value.</param>
    178         public static void ConfigureInstallBehaviorRequirements(string settingName, string value)
    179         {
    180             JObject settingsJson = GetJsonSettingsObject("installBehavior");
    181             var installBehavior = settingsJson["installBehavior"];
    182 
    183             if (installBehavior["requirements"] == null)
    184             {
    185                 installBehavior["requirements"] = new JObject();
    186             }
    187 
    188             var requirements = installBehavior["requirements"];
    189             requirements[settingName] = value;
    190 
    191             SetWingetSettings(settingsJson);
    192         }
    193 
    194         /// <summary>
    195         /// Configure the install behavior requirements.
    196         /// </summary>
    197         /// <param name="settingName">Setting name.</param>
    198         /// <param name="value">Setting value array.</param>
    199         public static void ConfigureInstallBehaviorRequirements(string settingName, string[] value)
    200         {
    201             JObject settingsJson = GetJsonSettingsObject("installBehavior");
    202             var installBehavior = settingsJson["installBehavior"];
    203 
    204             if (installBehavior["requirements"] == null)
    205             {
    206                 installBehavior["requirements"] = new JObject();
    207             }
    208 
    209             var requirements = installBehavior["requirements"];
    210             requirements[settingName] = new JArray(value);
    211 
    212             SetWingetSettings(settingsJson);
    213         }
    214 
    215         /// <summary>
    216         /// Initialize all features.
    217         /// </summary>
    218         /// <param name="status">Initialized feature value.</param>
    219         public static void InitializeAllFeatures(bool status)
    220         {
    221             JObject settingsJson = GetJsonSettingsObject("experimentalFeatures");
    222 
    223             ConfigureFeature(settingsJson, "experimentalArg", status);
    224             ConfigureFeature(settingsJson, "experimentalCmd", status);
    225             ConfigureFeature(settingsJson, "directMSI", status);
    226             ConfigureFeature(settingsJson, "windowsFeature", status);
    227             ConfigureFeature(settingsJson, "resume", status);
    228             ConfigureFeature(settingsJson, "reboot", status);
    229 
    230             SetWingetSettings(settingsJson);
    231         }
    232 
    233         /// <summary>
    234         /// Configure the logging level for the settings.
    235         /// </summary>
    236         /// <param name="level">The logging level to set; null removes the value.</param>
    237         public static void ConfigureLoggingLevel(string level)
    238         {
    239             JObject settingsJson = GetJsonSettingsObject("logging");
    240 
    241             if (level == null)
    242             {
    243                 settingsJson["logging"]["level"]?.Parent?.Remove();
    244             }
    245             else
    246             {
    247                 settingsJson["logging"]["level"] = new JValue(level);
    248             }
    249 
    250             SetWingetSettings(settingsJson);
    251         }
    252 
    253         /// <summary>
    254         /// Configure experimental features.
    255         /// </summary>
    256         /// <param name="settingsJson">The settings JSON object to modify.</param>
    257         /// <param name="featureName">Feature name.</param>
    258         /// <param name="status">Status.</param>
    259         private static void ConfigureFeature(JObject settingsJson, string featureName, bool status)
    260         {
    261             var experimentalFeatures = settingsJson["experimentalFeatures"];
    262             experimentalFeatures[featureName] = status;
    263         }
    264 
    265         private static JObject GetJsonSettingsObject(string objectName)
    266         {
    267             JObject settingsJson = JObject.Parse(File.ReadAllText(TestSetup.Parameters.SettingsJsonFilePath));
    268 
    269             if (!settingsJson.ContainsKey(objectName))
    270             {
    271                 settingsJson[objectName] = new JObject();
    272             }
    273 
    274             return settingsJson;
    275         }
    276 
    277         /// <summary>
    278         /// Converts a JObject to a string and writes to the settings file.
    279         /// </summary>
    280         /// <param name="settingsJson">Settings to set.</param>
    281         private static void SetWingetSettings(JObject settingsJson)
    282         {
    283             var forcedExperimentalFeatures = ForcedExperimentalFeatures;
    284             if (forcedExperimentalFeatures != null)
    285             {
    286                 foreach (var feature in forcedExperimentalFeatures)
    287                 {
    288                     ConfigureFeature(settingsJson, feature, true);
    289                 }
    290             }
    291 
    292             SetWingetSettings(settingsJson.ToString());
    293         }
    294 
    295         /// <summary>
    296         /// Writes string to settings file.
    297         /// </summary>
    298         /// <param name="settings">Settings as string.</param>
    299         private static void SetWingetSettings(string settings)
    300         {
    301             File.WriteAllText(TestSetup.Parameters.SettingsJsonFilePath, settings);
    302         }
    303     }
    304 }