using System.Reflection; namespace ScadaLink.Host.Tests; /// /// WP-16: Tests for CoordinatedShutdown configuration. /// Verifies no Environment.Exit calls exist in source and HOCON config is correct. /// public class CoordinatedShutdownTests { [Fact] public void HostSource_DoesNotContainEnvironmentExit() { var hostProjectDir = FindHostProjectDirectory(); Assert.NotNull(hostProjectDir); var sourceFiles = Directory.GetFiles(hostProjectDir, "*.cs", SearchOption.AllDirectories); Assert.NotEmpty(sourceFiles); foreach (var file in sourceFiles) { var content = File.ReadAllText(file); Assert.DoesNotContain("Environment.Exit", content, StringComparison.Ordinal); } } [Fact] public void AkkaHostedService_HoconConfig_IncludesCoordinatedShutdownSettings() { // Read the AkkaHostedService source to verify HOCON configuration var hostProjectDir = FindHostProjectDirectory(); Assert.NotNull(hostProjectDir); var akkaServiceFile = Path.Combine(hostProjectDir, "Actors", "AkkaHostedService.cs"); Assert.True(File.Exists(akkaServiceFile), $"AkkaHostedService.cs not found at {akkaServiceFile}"); var content = File.ReadAllText(akkaServiceFile); // Verify critical HOCON settings are present Assert.Contains("run-by-clr-shutdown-hook = on", content); Assert.Contains("run-coordinated-shutdown-when-down = on", content); } private static string? FindHostProjectDirectory() { var assemblyDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)!; var dir = new DirectoryInfo(assemblyDir); while (dir != null) { var hostPath = Path.Combine(dir.FullName, "src", "ScadaLink.Host"); if (Directory.Exists(hostPath)) return hostPath; dir = dir.Parent; } return null; } }