diff --git a/docs/custom_configuration/index.md b/docs/custom_configuration/index.md index f44be6c6d..32dda6c64 100644 --- a/docs/custom_configuration/index.md +++ b/docs/custom_configuration/index.md @@ -14,7 +14,7 @@ Testcontainers supports various configurations to set up your test environment. | `host.override` | `TESTCONTAINERS_HOST_OVERRIDE` | The host that exposes Docker's ports. | - | | `docker.socket.override` | `TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE` | The file path to the Docker daemon socket that is used by Ryuk (resource reaper). | `/var/run/docker.sock` | | `ryuk.disabled` | `TESTCONTAINERS_RYUK_DISABLED` | Disables Ryuk (resource reaper). | `false` | -| `ryuk.container.privileged` | `TESTCONTAINERS_RYUK_CONTAINER_PRIVILEGED` | Runs Ryuk (resource reaper) in privileged mode. | `false` | +| `ryuk.container.privileged` | `TESTCONTAINERS_RYUK_CONTAINER_PRIVILEGED` | Runs Ryuk (resource reaper) in privileged mode. | `true` | | `ryuk.container.image` | `TESTCONTAINERS_RYUK_CONTAINER_IMAGE` | The Ryuk (resource reaper) Docker image. | `testcontainers/ryuk:0.5.1` | | `hub.image.name.prefix` | `TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX` | The name to use for substituting the Docker Hub registry part of the image name. | - | | `wait.strategy.retries` | `TESTCONTAINERS_WAIT_STRATEGY_RETRIES` | The wait strategy retry count. | `infinite` | diff --git a/src/Testcontainers/Builders/DockerDesktopEndpointAuthenticationProvider.cs b/src/Testcontainers/Builders/DockerDesktopEndpointAuthenticationProvider.cs index c7eddad4a..f2363f89a 100644 --- a/src/Testcontainers/Builders/DockerDesktopEndpointAuthenticationProvider.cs +++ b/src/Testcontainers/Builders/DockerDesktopEndpointAuthenticationProvider.cs @@ -91,7 +91,7 @@ public bool GetRyukDisabled() } /// - public bool GetRyukContainerPrivileged() + public bool? GetRyukContainerPrivileged() { return false; } diff --git a/src/Testcontainers/Builders/TestcontainersEndpointAuthenticationProvider.cs b/src/Testcontainers/Builders/TestcontainersEndpointAuthenticationProvider.cs index 93a42976d..49cedf99c 100644 --- a/src/Testcontainers/Builders/TestcontainersEndpointAuthenticationProvider.cs +++ b/src/Testcontainers/Builders/TestcontainersEndpointAuthenticationProvider.cs @@ -118,7 +118,7 @@ public bool GetRyukDisabled() } /// - public bool GetRyukContainerPrivileged() + public bool? GetRyukContainerPrivileged() { return _customConfiguration.GetRyukContainerPrivileged(); } diff --git a/src/Testcontainers/Configurations/CustomConfiguration.cs b/src/Testcontainers/Configurations/CustomConfiguration.cs index c757b7f26..8f2166844 100644 --- a/src/Testcontainers/Configurations/CustomConfiguration.cs +++ b/src/Testcontainers/Configurations/CustomConfiguration.cs @@ -79,9 +79,9 @@ protected virtual bool GetRyukDisabled(string propertyName) return GetPropertyValue(propertyName); } - protected virtual bool GetRyukContainerPrivileged(string propertyName) + protected virtual bool? GetRyukContainerPrivileged(string propertyName) { - return GetPropertyValue(propertyName); + return GetPropertyValue(propertyName); } protected virtual IImage GetRyukContainerImage(string propertyName) @@ -127,16 +127,18 @@ private T GetPropertyValue(string propertyName) { var type = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T); + var isNullable = type != typeof(T); + switch (Type.GetTypeCode(type)) { case TypeCode.Boolean: { - return (T)(object)(_properties.TryGetValue(propertyName, out var propertyValue) && ("1".Equals(propertyValue, StringComparison.Ordinal) || (bool.TryParse(propertyValue, out var result) && result))); + return (T)(object)(_properties.TryGetValue(propertyName, out var propertyValue) && bool.TryParse(propertyValue, out var result) ? result : isNullable ? null : "1".Equals(propertyValue, StringComparison.Ordinal)); } case TypeCode.UInt16: { - return (T)(object)(_properties.TryGetValue(propertyName, out var propertyValue) && ushort.TryParse(propertyValue, out var result) ? result : null); + return (T)(object)(_properties.TryGetValue(propertyName, out var propertyValue) && ushort.TryParse(propertyValue, out var result) ? result : isNullable ? null : 0); } case TypeCode.String: diff --git a/src/Testcontainers/Configurations/EnvironmentConfiguration.cs b/src/Testcontainers/Configurations/EnvironmentConfiguration.cs index 2d5706944..cdacdc50a 100644 --- a/src/Testcontainers/Configurations/EnvironmentConfiguration.cs +++ b/src/Testcontainers/Configurations/EnvironmentConfiguration.cs @@ -140,7 +140,7 @@ public bool GetRyukDisabled() } /// - public bool GetRyukContainerPrivileged() + public bool? GetRyukContainerPrivileged() { return GetRyukContainerPrivileged(RyukContainerPrivileged); } diff --git a/src/Testcontainers/Configurations/ICustomConfiguration.cs b/src/Testcontainers/Configurations/ICustomConfiguration.cs index 7f0b173c2..f0a205d8c 100644 --- a/src/Testcontainers/Configurations/ICustomConfiguration.cs +++ b/src/Testcontainers/Configurations/ICustomConfiguration.cs @@ -92,7 +92,8 @@ internal interface ICustomConfiguration /// /// The Ryuk container privileged custom configuration. /// https://dotnet.testcontainers.org/custom_configuration/. - bool GetRyukContainerPrivileged(); + [CanBeNull] + bool? GetRyukContainerPrivileged(); /// /// Gets the Ryuk container image custom configuration. diff --git a/src/Testcontainers/Configurations/PropertiesFileConfiguration.cs b/src/Testcontainers/Configurations/PropertiesFileConfiguration.cs index 7e303f33e..2870e5449 100644 --- a/src/Testcontainers/Configurations/PropertiesFileConfiguration.cs +++ b/src/Testcontainers/Configurations/PropertiesFileConfiguration.cs @@ -127,7 +127,7 @@ public bool GetRyukDisabled() } /// - public bool GetRyukContainerPrivileged() + public bool? GetRyukContainerPrivileged() { const string propertyName = "ryuk.container.privileged"; return GetRyukContainerPrivileged(propertyName); diff --git a/src/Testcontainers/Configurations/TestcontainersSettings.cs b/src/Testcontainers/Configurations/TestcontainersSettings.cs index efb611a91..3f7e3d57f 100644 --- a/src/Testcontainers/Configurations/TestcontainersSettings.cs +++ b/src/Testcontainers/Configurations/TestcontainersSettings.cs @@ -67,7 +67,7 @@ static TestcontainersSettings() /// Gets or sets a value indicating whether the privileged mode is enabled or not. /// public static bool ResourceReaperPrivilegedModeEnabled { get; set; } - = EnvironmentConfiguration.Instance.GetRyukContainerPrivileged() || PropertiesFileConfiguration.Instance.GetRyukContainerPrivileged(); + = EnvironmentConfiguration.Instance.GetRyukContainerPrivileged() ?? PropertiesFileConfiguration.Instance.GetRyukContainerPrivileged() ?? true; /// /// Gets or sets the image. diff --git a/tests/Testcontainers.Tests/Unit/Configurations/CustomConfigurationTest.cs b/tests/Testcontainers.Tests/Unit/Configurations/CustomConfigurationTest.cs index 260dfa067..6b4276cbc 100644 --- a/tests/Testcontainers.Tests/Unit/Configurations/CustomConfigurationTest.cs +++ b/tests/Testcontainers.Tests/Unit/Configurations/CustomConfigurationTest.cs @@ -159,11 +159,11 @@ public void GetRyukDisabledCustomConfiguration(string propertyName, string prope } [Theory] - [InlineData("", "", false)] - [InlineData("TESTCONTAINERS_RYUK_CONTAINER_PRIVILEGED", "", false)] + [InlineData("", "", null)] + [InlineData("TESTCONTAINERS_RYUK_CONTAINER_PRIVILEGED", "", null)] [InlineData("TESTCONTAINERS_RYUK_CONTAINER_PRIVILEGED", "false", false)] [InlineData("TESTCONTAINERS_RYUK_CONTAINER_PRIVILEGED", "true", true)] - public void GetRyukContainerPrivilegedCustomConfiguration(string propertyName, string propertyValue, bool expected) + public void GetRyukContainerPrivilegedCustomConfiguration(string propertyName, string propertyValue, bool? expected) { SetEnvironmentVariable(propertyName, propertyValue); ICustomConfiguration customConfiguration = new EnvironmentConfiguration(); @@ -362,11 +362,11 @@ public void GetRyukDisabledCustomConfiguration(string configuration, bool expect } [Theory] - [InlineData("", false)] - [InlineData("ryuk.container.privileged=", false)] + [InlineData("", null)] + [InlineData("ryuk.container.privileged=", null)] [InlineData("ryuk.container.privileged=false", false)] [InlineData("ryuk.container.privileged=true", true)] - public void GetRyukContainerPrivilegedCustomConfiguration(string configuration, bool expected) + public void GetRyukContainerPrivilegedCustomConfiguration(string configuration, bool? expected) { ICustomConfiguration customConfiguration = new PropertiesFileConfiguration(new[] { configuration }); Assert.Equal(expected, customConfiguration.GetRyukContainerPrivileged());