diff --git a/docs/api/resource_reuse.md b/docs/api/resource_reuse.md index 3f04c6901..f99f4c06b 100644 --- a/docs/api/resource_reuse.md +++ b/docs/api/resource_reuse.md @@ -17,6 +17,9 @@ _ = new ContainerBuilder() The current implementation considers the following resource configurations and their corresponding builder APIs when calculating the hash value. +> [!NOTE] +> Version 3.8.0 did not include the container configuration's name in the hash value. + - [ContainerConfiguration](https://github.com/testcontainers/testcontainers-dotnet/blob/develop/src/Testcontainers/Configurations/Containers/ContainerConfiguration.cs) - Image - Entrypoint @@ -26,6 +29,7 @@ The current implementation considers the following resource configurations and t - PortBindings - NetworkAliases - ExtraHosts + - Name - Labels - [NetworkConfiguration](https://github.com/testcontainers/testcontainers-dotnet/blob/develop/src/Testcontainers/Configurations/Networks/NetworkConfiguration.cs) - Name diff --git a/src/Testcontainers/Configurations/Containers/ContainerConfiguration.cs b/src/Testcontainers/Configurations/Containers/ContainerConfiguration.cs index 4058c248d..6fc4da4d7 100644 --- a/src/Testcontainers/Configurations/Containers/ContainerConfiguration.cs +++ b/src/Testcontainers/Configurations/Containers/ContainerConfiguration.cs @@ -155,7 +155,6 @@ public ContainerConfiguration(IContainerConfiguration oldValue, IContainerConfig public Func ImagePullPolicy { get; } /// - [JsonIgnore] public string Name { get; } /// diff --git a/tests/Testcontainers.Platform.Linux.Tests/ReusableResourceTest.cs b/tests/Testcontainers.Platform.Linux.Tests/ReusableResourceTest.cs index 798556267..6a6f1a228 100644 --- a/tests/Testcontainers.Platform.Linux.Tests/ReusableResourceTest.cs +++ b/tests/Testcontainers.Platform.Linux.Tests/ReusableResourceTest.cs @@ -76,6 +76,15 @@ public async Task ShouldReuseExistingResource() Assert.Single(response.Volumes); } + [Fact] + public void ContainersWithDifferentNamesShouldHaveDifferentHashes() + { + var hash1 = new ReuseHashContainerBuilder().WithName("Name1").GetReuseHash(); + var hash2 = new ReuseHashContainerBuilder().WithName("Name2").GetReuseHash(); + + Assert.NotEqual(hash1, hash2); + } + public static class UnsupportedBuilderConfigurationTest { private const string EnabledCleanUpExceptionMessage = "Reuse cannot be used in conjunction with WithCleanUp(true). (Parameter 'Reuse')"; @@ -143,4 +152,30 @@ public void EnabledCleanUpThrowsException() } } } + + private sealed class ReuseHashContainerBuilder : ContainerBuilder + { + public ReuseHashContainerBuilder() : this(new ContainerConfiguration()) + => DockerResourceConfiguration = Init().DockerResourceConfiguration; + + private ReuseHashContainerBuilder(ContainerConfiguration configuration) : base(configuration) + => DockerResourceConfiguration = configuration; + + protected override ContainerConfiguration DockerResourceConfiguration { get; } + + public string GetReuseHash() + => DockerResourceConfiguration.GetReuseHash(); + + public override DockerContainer Build() + => new(DockerResourceConfiguration); + + protected override ReuseHashContainerBuilder Clone(IResourceConfiguration resourceConfiguration) + => Merge(DockerResourceConfiguration, new ContainerConfiguration(resourceConfiguration)); + + protected override ReuseHashContainerBuilder Clone(IContainerConfiguration resourceConfiguration) + => Merge(DockerResourceConfiguration, new ContainerConfiguration(resourceConfiguration)); + + protected override ReuseHashContainerBuilder Merge(ContainerConfiguration oldValue, ContainerConfiguration newValue) + => new(new ContainerConfiguration(oldValue, newValue)); + } } \ No newline at end of file