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 }