diff --git a/Shared.IntegrationTesting/TestContainers/BaseDockerHelper.cs b/Shared.IntegrationTesting/TestContainers/BaseDockerHelper.cs index c230bb4..8a900d2 100644 --- a/Shared.IntegrationTesting/TestContainers/BaseDockerHelper.cs +++ b/Shared.IntegrationTesting/TestContainers/BaseDockerHelper.cs @@ -402,7 +402,7 @@ public virtual ContainerBuilder SetupFileProcessorContainer(){ String containerFolder = "/home/txnproc/bulkfiles"; Directory.CreateDirectory(uploadFolder); - fileProcessorContainer.WithBindMount(uploadFolder, containerFolder, AccessMode.ReadWrite); + fileProcessorContainer.MountHostFolder(uploadFolder, containerFolder); return fileProcessorContainer; } @@ -547,7 +547,8 @@ public virtual ContainerBuilder SetupSecurityServiceContainer() ContainerBuilder securityServiceContainer = new ContainerBuilder(imageDetailsResult.Data.imageName) .WithName(this.SecurityServiceContainerName) .WithEnvironment(environmentVariables) - .WithBindMount(this.IntegrationTestCertificate.CertificateDirectory, this.IntegrationTestCertificate.ContainerCertificateDirectory, AccessMode.ReadOnly); + .MountHostFolder(this.HostTraceFolder) + .MountHostFolder(this.IntegrationTestCertificate.CertificateDirectory, this.IntegrationTestCertificate.ContainerCertificateDirectory); Int32? hostPort = this.GetHostPort(ContainerType.SecurityService); if (hostPort is null || hostPort <= 0) diff --git a/Shared.IntegrationTesting/TestContainers/Extensions.cs b/Shared.IntegrationTesting/TestContainers/Extensions.cs index 6b4eaf0..dd490fa 100644 --- a/Shared.IntegrationTesting/TestContainers/Extensions.cs +++ b/Shared.IntegrationTesting/TestContainers/Extensions.cs @@ -5,23 +5,49 @@ namespace Shared.IntegrationTesting.TestContainers; using System; +using System.IO; public static class Extensions { - public static ContainerBuilder MountHostFolder(this ContainerBuilder containerBuilder, - String hostTraceFolder, - String containerPath = null) + public static ContainerBuilder MountHostFolder(this ContainerBuilder containerBuilder, string? hostTraceFolder, string? containerPath = null) { - if (containerPath == null) + containerPath ??= "/home/txnproc/trace"; + + if (string.IsNullOrWhiteSpace(hostTraceFolder)) + { + return containerBuilder; + } + + if (!containerPath.StartsWith('/') || containerPath.Contains('\\')) { - containerPath = "/home/txnproc/trace"; + throw new ArgumentException("Container path must be an absolute Linux path.",nameof(containerPath)); } - if (!String.IsNullOrEmpty(hostTraceFolder)) + var hostPath = Path.GetFullPath(hostTraceFolder); + Directory.CreateDirectory(hostPath); + + var useWslPaths = string.Equals( + Environment.GetEnvironmentVariable("TEST_DOCKER_WSL_PATHS"), + "true", + StringComparison.OrdinalIgnoreCase); + + if (OperatingSystem.IsWindows() && useWslPaths) { - containerBuilder = containerBuilder.WithBindMount(hostTraceFolder, containerPath, AccessMode.ReadWrite); + if (hostPath.Length < 3 || + !char.IsAsciiLetter(hostPath[0]) || + hostPath[1] != ':') + { + throw new ArgumentException( + "WSL conversion requires a Windows drive path, e.g. C:\\trace.", + nameof(hostTraceFolder)); + } + + var drive = char.ToLowerInvariant(hostPath[0]); + var relativePath = hostPath[3..].Replace('\\', '/'); + + hostPath = $"/mnt/{drive}/{relativePath}"; } - return containerBuilder; + return containerBuilder.WithBindMount(hostPath,containerPath,AccessMode.ReadWrite); } }