Skip to content

Commit 16cabf1

Browse files
authored
feat: Ignore port-forwarding extra host in reuse hash (#1689)
1 parent 444958d commit 16cabf1

3 files changed

Lines changed: 34 additions & 0 deletions

File tree

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
namespace DotNet.Testcontainers.Configurations
2+
{
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using System.Text.Json;
7+
using System.Text.Json.Serialization;
8+
9+
/// <summary>
10+
/// Excludes the port-forwarding extra host entry (host.testcontainers.internal)
11+
/// from the reuse hash, its IP changes every test session, which would otherwise
12+
/// make identical configurations appear different.
13+
/// </summary>
14+
internal sealed class JsonIgnoreRuntimeExtraHosts : JsonConverter<IEnumerable<string>>
15+
{
16+
private const string PortForwardingHostEntry = "host.testcontainers.internal:";
17+
18+
public override IEnumerable<string> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
19+
{
20+
return JsonSerializer.Deserialize<IEnumerable<string>>(ref reader);
21+
}
22+
23+
public override void Write(Utf8JsonWriter writer, IEnumerable<string> value, JsonSerializerOptions options)
24+
{
25+
var extraHosts = value.Where(host => !host.StartsWith(PortForwardingHostEntry, StringComparison.OrdinalIgnoreCase)).OrderBy(host => host);
26+
JsonSerializer.Serialize(writer, extraHosts, options);
27+
}
28+
}
29+
}

src/Testcontainers/Configurations/Commons/JsonIgnoreRuntimeResourceLabels.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ namespace DotNet.Testcontainers.Configurations
66
using DotNet.Testcontainers.Clients;
77
using DotNet.Testcontainers.Containers;
88

9+
/// <summary>
10+
/// Excludes session-specific labels from the reuse hash so containers with
11+
/// identical configuration are still recognized as reusable across test sessions.
12+
/// </summary>
913
internal sealed class JsonIgnoreRuntimeResourceLabels : JsonOrderedKeysConverter
1014
{
1115
private static readonly ISet<string> IgnoreLabels = new HashSet<string>

src/Testcontainers/Configurations/Containers/ContainerConfiguration.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ public ContainerConfiguration(IContainerConfiguration oldValue, IContainerConfig
208208
public IEnumerable<string> NetworkAliases { get; }
209209

210210
/// <inheritdoc />
211+
[JsonConverter(typeof(JsonIgnoreRuntimeExtraHosts))]
211212
public IEnumerable<string> ExtraHosts { get; }
212213

213214
/// <inheritdoc />

0 commit comments

Comments
 (0)