54 lines
3.2 KiB
C#
54 lines
3.2 KiB
C#
using MAX.Plugins;
|
|
using Microsoft.Extensions.Hosting;
|
|
|
|
internal static class ConfigurationChecks
|
|
{
|
|
public static void Run()
|
|
{
|
|
var tempRoot = Path.GetFullPath(Path.GetTempPath());
|
|
var directory = Path.GetFullPath(Path.Combine(tempRoot, "StorePluginChecks-" + Guid.NewGuid().ToString("N")));
|
|
Directory.CreateDirectory(directory);
|
|
try
|
|
{
|
|
var environment = Host.CreateApplicationBuilder().Environment;
|
|
environment.EnvironmentName = "PluginTest";
|
|
var first = Path.Combine(directory, "First");
|
|
var second = Path.Combine(directory, "Second");
|
|
Directory.CreateDirectory(first);
|
|
Directory.CreateDirectory(second);
|
|
File.WriteAllText(Path.Combine(first, "appsettings.json"), """{"Shared":"first","Required":"present"}""");
|
|
File.WriteAllText(Path.Combine(first, "appsettings.PluginTest.json"), """{"Shared":"environment"}""");
|
|
File.WriteAllText(Path.Combine(second, "appsettings.json"), """{"Shared":"second"}""");
|
|
using var a = new PluginContext("First", first, environment);
|
|
using var b = new PluginContext("Second", second, environment);
|
|
if (a.Configuration["Shared"] != "environment" || b.Configuration["Shared"] != "second")
|
|
throw new Exception("Configuration isolation/environment override failed");
|
|
if (a.RequireConfiguration("Required") != "present") throw new Exception("Required setting missing");
|
|
try { b.RequireConfiguration("Required"); throw new Exception("Expected missing key failure"); }
|
|
catch (InvalidOperationException ex) when (ex.Message.Contains("Second") && ex.Message.Contains("Required")) { }
|
|
const string envKey = "Plugins__First__Shared";
|
|
var previous = System.Environment.GetEnvironmentVariable(envKey);
|
|
try
|
|
{
|
|
System.Environment.SetEnvironmentVariable(envKey, "specific-environment-variable");
|
|
using var overridden = new PluginContext("First", first, environment);
|
|
using var untouched = new PluginContext("Second", second, environment);
|
|
if (overridden.Configuration["Shared"] != "specific-environment-variable" || untouched.Configuration["Shared"] != "second")
|
|
throw new Exception("Plugin environment variable isolation failed");
|
|
}
|
|
finally { System.Environment.SetEnvironmentVariable(envKey, previous); }
|
|
var absent = Path.Combine(directory, "Absent");
|
|
Directory.CreateDirectory(absent);
|
|
try { using var invalid = new PluginContext("Absent", absent, environment); throw new Exception("Expected missing file failure"); }
|
|
catch (FileNotFoundException) { }
|
|
Console.WriteLine("PASS configuration isolation, environment overrides, missing file/key validation");
|
|
}
|
|
finally
|
|
{
|
|
if (!directory.StartsWith(tempRoot.TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar, StringComparison.OrdinalIgnoreCase))
|
|
throw new InvalidOperationException("Unexpected fixture path");
|
|
Directory.Delete(directory, recursive: true);
|
|
}
|
|
}
|
|
}
|