diff --git a/Examples/UICatalog/UICatalog.cs b/Examples/UICatalog/UICatalog.cs index 71260edf2..5bcbfe720 100644 --- a/Examples/UICatalog/UICatalog.cs +++ b/Examples/UICatalog/UICatalog.cs @@ -62,6 +62,40 @@ public class UICatalog public const string LOGFILE_LOCATION = "logs"; public static UICatalogCommandLineOptions Options { get; set; } + /// + /// Sets up the ForceDriver configuration for testing purposes. + /// This is called by UICatalogMain and can also be called by tests. + /// + /// The driver name to force + internal static void SetupForceDriverConfig (string? driver) + { + _forceDriver = driver; + + // If a driver has been specified, set it in RuntimeConfig so it persists through Init/Shutdown cycles + if (!string.IsNullOrEmpty (_forceDriver)) + { + ConfigurationManager.RuntimeConfig = $$""" + { + "Application.ForceDriver": "{{_forceDriver}}" + } + """; + } + } + + /// + /// Reloads RuntimeConfig to ensure ForceDriver persists before running a scenario. + /// This is called in the scenario loop and can also be called by tests. + /// + internal static void ReloadForceDriverConfig () + { + // Ensure RuntimeConfig is applied before each scenario to preserve ForceDriver setting + if (!Options.DontEnableConfigurationManagement && !string.IsNullOrEmpty (_forceDriver)) + { + ConfigurationManager.Load (ConfigLocations.Runtime); + ConfigurationManager.Apply (); + } + } + private static int Main (string [] args) { Console.OutputEncoding = Encoding.Default; @@ -342,21 +376,11 @@ public class UICatalog ConfigurationManager.Apply (); } - private static void UICatalogMain (UICatalogCommandLineOptions options) + internal static void UICatalogMain (UICatalogCommandLineOptions options) { // By setting _forceDriver we ensure that if the user has specified a driver on the command line, it will be used // regardless of what's in a config file. - _forceDriver = options.Driver; - - // If a driver has been specified, set it in RuntimeConfig so it persists through Init/Shutdown cycles - if (!string.IsNullOrEmpty (_forceDriver)) - { - ConfigurationManager.RuntimeConfig = $$""" - { - "Application.ForceDriver": "{{_forceDriver}}" - } - """; - } + SetupForceDriverConfig (options.Driver); // If a Scenario name has been provided on the commandline // run it and exit when done. @@ -422,12 +446,8 @@ public class UICatalog Application.InitializedChanged += ApplicationOnInitializedChanged; #endif - // Ensure RuntimeConfig is applied before each scenario to preserve ForceDriver setting - if (!Options.DontEnableConfigurationManagement && !string.IsNullOrEmpty (_forceDriver)) - { - ConfigurationManager.Load (ConfigLocations.Runtime); - ConfigurationManager.Apply (); - } + // Reload RuntimeConfig to ensure ForceDriver persists (part 2 of the fix) + ReloadForceDriverConfig (); scenario.Main (); scenario.Dispose (); diff --git a/Examples/UICatalog/UICatalog.csproj b/Examples/UICatalog/UICatalog.csproj index 0b529c499..3097a87c0 100644 --- a/Examples/UICatalog/UICatalog.csproj +++ b/Examples/UICatalog/UICatalog.csproj @@ -11,6 +11,9 @@ 2.0 Linux + + + TRACE diff --git a/Tests/IntegrationTests/UICatalog/ForceDriverTests.cs b/Tests/IntegrationTests/UICatalog/ForceDriverTests.cs index a279d9f9d..f36b5c437 100644 --- a/Tests/IntegrationTests/UICatalog/ForceDriverTests.cs +++ b/Tests/IntegrationTests/UICatalog/ForceDriverTests.cs @@ -18,17 +18,18 @@ public class ForceDriverTests /// /// Tests that ForceDriver persists when running UICatalogTop and then opening a scenario. /// - /// This test verifies the fix for issue #4391 works correctly. + /// This test verifies the fix for issue #4391 works correctly by calling UICatalog's actual methods. /// /// THE BUG: Without the fix, ForceDriver was set directly on Application, but /// ConfigurationManager would override it from config files when scenarios ran. /// - /// THE FIX has two parts: - /// 1. Set ForceDriver in ConfigurationManager.RuntimeConfig (done in UICatalog.UICatalogMain) - /// 2. Reload RuntimeConfig before each scenario (done in UICatalog scenario loop) + /// THE FIX has two parts (both in UICatalog.cs): + /// 1. SetupForceDriverConfig() - Sets ForceDriver in ConfigurationManager.RuntimeConfig + /// 2. ReloadForceDriverConfig() - Reloads RuntimeConfig before each scenario /// - /// This test simulates both parts of the fix and verifies the driver persists. - /// Without BOTH parts of the fix, this test would fail. + /// This test calls both UICatalog methods to verify the fix works. + /// If you remove the calls to these methods or modify UICatalog.cs to remove the fix, + /// this test will fail. /// [Fact] public void ForceDriver_Persists_From_UICatalogTop_To_Scenario () @@ -54,13 +55,9 @@ public class ForceDriverTests // Initialize cached scenarios (required by UICatalogTop) UICatalogTop.CachedScenarios = Scenario.GetScenarios (); - // THE FIX (part 1): UICatalog.UICatalogMain() sets ForceDriver in RuntimeConfig - // Since we can't call the private UICatalogMain() from tests, we simulate it here - ConfigurationManager.RuntimeConfig = $$""" - { - "Application.ForceDriver": "{{expectedDriver}}" - } - """; + // Call UICatalog's setup method (this is part 1 of the fix in UICatalog.cs) + // This sets ForceDriver in RuntimeConfig + global::UICatalog.UICatalog.SetupForceDriverConfig (expectedDriver); // Enable ConfigurationManager with all locations (as UICatalog does) ConfigurationManager.Enable (ConfigLocations.All); @@ -113,15 +110,10 @@ public class ForceDriverTests { _output.WriteLine ($"\n=== Phase 2: Running scenario '{scenario.GetName ()}' ==="); - // THE FIX (part 2): UICatalog reloads RuntimeConfig before each scenario + // Call UICatalog's reload method (this is part 2 of the fix in UICatalog.cs) // This ensures ForceDriver persists across Init/Shutdown cycles - // NOTE: If you comment out this block, the test will fail, demonstrating the bug - if (!global::UICatalog.UICatalog.Options.DontEnableConfigurationManagement && !string.IsNullOrEmpty(global::UICatalog.UICatalog.Options.Driver)) - { - ConfigurationManager.Load (ConfigLocations.Runtime); - ConfigurationManager.Apply (); - _output.WriteLine ("Reloaded RuntimeConfig (this is part 2 of the fix)"); - } + global::UICatalog.UICatalog.ReloadForceDriverConfig (); + _output.WriteLine ("Reloaded ForceDriver config via UICatalog.ReloadForceDriverConfig()"); // Track the driver used inside the scenario string? driverInsideScenario = null; @@ -190,10 +182,10 @@ public class ForceDriverTests /// /// Tests that ForceDriver persists when running multiple scenarios in sequence. /// - /// This verifies the fix works correctly when running multiple scenarios. + /// This verifies the fix works correctly by calling UICatalog's ReloadForceDriverConfig() method. /// - /// THE FIX: Reload RuntimeConfig before each scenario to preserve ForceDriver. - /// Without reloading RuntimeConfig, the driver would revert to platform default. + /// THE FIX: ReloadForceDriverConfig() in UICatalog.cs reloads RuntimeConfig before each scenario. + /// Without calling this method, the driver would revert to platform default. /// [Fact] public void ForceDriver_Persists_Across_Multiple_Scenarios () @@ -204,13 +196,20 @@ public class ForceDriverTests ConfigurationManager.Disable (true); Application.ResetState (true); - // THE FIX (part 1): Set ForceDriver in RuntimeConfig - // This is what UICatalog.UICatalogMain() does when --driver is specified - ConfigurationManager.RuntimeConfig = $$""" - { - "Application.ForceDriver": "{{expectedDriver}}" - } - """; + // Initialize UICatalog.Options + global::UICatalog.UICatalog.Options = new UICatalogCommandLineOptions + { + Driver = expectedDriver, + DontEnableConfigurationManagement = false, + Scenario = "none", + BenchmarkTimeout = 2500, + Benchmark = false, + ResultsFile = string.Empty, + DebugLogLevel = "Warning" + }; + + // Call UICatalog's setup method (this is part 1 of the fix in UICatalog.cs) + global::UICatalog.UICatalog.SetupForceDriverConfig (expectedDriver); // Enable ConfigurationManager ConfigurationManager.Enable (ConfigLocations.All); @@ -259,12 +258,12 @@ public class ForceDriverTests scenario1.Dispose (); _output.WriteLine ($"Scenario 1 completed with driver: {driver1}"); - // THE FIX (part 2): Reload RuntimeConfig before scenario 2 + // Call UICatalog's reload method (this is part 2 of the fix in UICatalog.cs) // This ensures ForceDriver persists across Init/Shutdown cycles - ConfigurationManager.Load (ConfigLocations.Runtime); - ConfigurationManager.Apply (); - _output.WriteLine ("Reloaded RuntimeConfig (this is part 2 of the fix)"); + global::UICatalog.UICatalog.ReloadForceDriverConfig (); + _output.WriteLine ("Reloaded ForceDriver config via UICatalog.ReloadForceDriverConfig()"); + // Run scenario 2 // Run scenario 2 initHandler2 = (s, e) => {