namespace MxGateway.IntegrationTests; public static class IntegrationTestEnvironment { public const string LiveMxAccessVariableName = "MXGATEWAY_RUN_LIVE_MXACCESS_TESTS"; public const string LiveMxAccessWorkerExecutableVariableName = "MXGATEWAY_LIVE_MXACCESS_WORKER_EXE"; public const string LiveMxAccessItemVariableName = "MXGATEWAY_LIVE_MXACCESS_ITEM"; public const string LiveMxAccessClientNameVariableName = "MXGATEWAY_LIVE_MXACCESS_CLIENT_NAME"; public const string LiveMxAccessEventTimeoutSecondsVariableName = "MXGATEWAY_LIVE_MXACCESS_EVENT_TIMEOUT_SECONDS"; public static bool LiveMxAccessTestsEnabled => string.Equals( Environment.GetEnvironmentVariable(LiveMxAccessVariableName), "1", StringComparison.Ordinal); public static string LiveMxAccessItem => GetOptionalEnvironmentVariable( LiveMxAccessItemVariableName, "TestChildObject.TestInt"); public static string LiveMxAccessClientName => GetOptionalEnvironmentVariable( LiveMxAccessClientNameVariableName, "MxGateway.IntegrationTests"); public static TimeSpan LiveMxAccessEventTimeout => TimeSpan.FromSeconds(GetPositiveIntegerEnvironmentVariable( LiveMxAccessEventTimeoutSecondsVariableName, defaultValue: 15)); public static string ResolveLiveMxAccessWorkerExecutablePath() { string? configuredPath = Environment.GetEnvironmentVariable(LiveMxAccessWorkerExecutableVariableName); if (!string.IsNullOrWhiteSpace(configuredPath)) { return Path.GetFullPath(configuredPath); } string repositoryRoot = ResolveRepositoryRoot(AppContext.BaseDirectory); string[] candidatePaths = [ Path.Combine(repositoryRoot, "src", "MxGateway.Worker", "bin", "x86", "Debug", "net48", "MxGateway.Worker.exe"), Path.Combine(repositoryRoot, "src", "MxGateway.Worker", "bin", "Debug", "net48", "MxGateway.Worker.exe"), Path.Combine(repositoryRoot, "src", "MxGateway.Worker", "bin", "x86", "Release", "net48", "MxGateway.Worker.exe"), Path.Combine(repositoryRoot, "src", "MxGateway.Worker", "bin", "Release", "net48", "MxGateway.Worker.exe"), Path.Combine(repositoryRoot, "src", "MxGateway.Worker", "bin", "x86", "Release", "MxGateway.Worker.exe"), ]; return candidatePaths.FirstOrDefault(File.Exists) ?? candidatePaths[0]; } private static string GetOptionalEnvironmentVariable( string name, string defaultValue) { string? value = Environment.GetEnvironmentVariable(name); return string.IsNullOrWhiteSpace(value) ? defaultValue : value; } private static int GetPositiveIntegerEnvironmentVariable( string name, int defaultValue) { string? value = Environment.GetEnvironmentVariable(name); if (int.TryParse(value, out int parsed) && parsed > 0) { return parsed; } return defaultValue; } internal static string ResolveRepositoryRoot(string startDirectory) { DirectoryInfo? directory = new(startDirectory); while (directory is not null) { if ((Directory.Exists(Path.Combine(directory.FullName, ".git")) || File.Exists(Path.Combine(directory.FullName, ".git"))) && Directory.Exists(Path.Combine(directory.FullName, "src"))) { return directory.FullName; } directory = directory.Parent; } return Directory.GetCurrentDirectory(); } }