-
-
Notifications
You must be signed in to change notification settings - Fork 346
Expand file tree
/
Copy pathFakeGcsServerBuilder.cs
More file actions
85 lines (74 loc) · 3.68 KB
/
FakeGcsServerBuilder.cs
File metadata and controls
85 lines (74 loc) · 3.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
namespace Testcontainers.FakeGcsServer;
/// <inheritdoc cref="ContainerBuilder{TBuilderEntity, TContainerEntity, TConfigurationEntity}" />
[PublicAPI]
public sealed class FakeGcsServerBuilder : ContainerBuilder<FakeGcsServerBuilder, FakeGcsServerContainer, FakeGcsServerConfiguration>
{
public const string FakeGcsServerImage = "fsouza/fake-gcs-server:1.47";
public const ushort FakeGcsServerPort = 4443;
public const string StartupScriptFilePath = "/testcontainers.sh";
/// <summary>
/// Initializes a new instance of the <see cref="FakeGcsServerBuilder" /> class.
/// </summary>
public FakeGcsServerBuilder()
: this(new FakeGcsServerConfiguration())
{
DockerResourceConfiguration = Init().DockerResourceConfiguration;
}
/// <summary>
/// Initializes a new instance of the <see cref="FakeGcsServerBuilder" /> class.
/// </summary>
/// <param name="resourceConfiguration">The Docker resource configuration.</param>
private FakeGcsServerBuilder(FakeGcsServerConfiguration resourceConfiguration)
: base(resourceConfiguration)
{
DockerResourceConfiguration = resourceConfiguration;
}
/// <inheritdoc />
protected override FakeGcsServerConfiguration DockerResourceConfiguration { get; }
/// <inheritdoc />
public override FakeGcsServerContainer Build()
{
Validate();
return new FakeGcsServerContainer(DockerResourceConfiguration);
}
/// <inheritdoc />
protected override FakeGcsServerBuilder Init()
{
return base.Init()
.WithImage(FakeGcsServerImage)
.WithPortBinding(FakeGcsServerPort, true)
.WithEntrypoint("/bin/sh", "-c")
.WithCommand("while [ ! -f " + StartupScriptFilePath + " ]; do sleep 0.1; done; " + StartupScriptFilePath)
.WithWaitStrategy(Wait.ForUnixContainer().UntilMessageIsLogged("server started"))
.WithStartupCallback((container, ct) =>
{
const char lf = '\n';
var startupScript = new StringBuilder();
startupScript.Append("#!/bin/sh");
startupScript.Append(lf);
startupScript.Append("fake-gcs-server ");
startupScript.Append("-backend memory ");
startupScript.Append("-scheme http ");
// If we do not remove the trailing slash, uploading an object will result in an
// error: HttpStatusCode.NotFound. The HTTP request appears incorrect. The
// container logs indicate the presence of an extra slash: `PUT //upload/storage/v1`.
startupScript.Append("-external-url " + new UriBuilder(Uri.UriSchemeHttp, container.Hostname, container.GetMappedPublicPort(FakeGcsServerPort)).ToString().Trim('/'));
return container.CopyAsync(Encoding.Default.GetBytes(startupScript.ToString()), StartupScriptFilePath, fileMode: Unix.FileMode755, ct: ct);
});
}
/// <inheritdoc />
protected override FakeGcsServerBuilder Clone(IResourceConfiguration<CreateContainerParameters> resourceConfiguration)
{
return Merge(DockerResourceConfiguration, new FakeGcsServerConfiguration(resourceConfiguration));
}
/// <inheritdoc />
protected override FakeGcsServerBuilder Clone(IContainerConfiguration resourceConfiguration)
{
return Merge(DockerResourceConfiguration, new FakeGcsServerConfiguration(resourceConfiguration));
}
/// <inheritdoc />
protected override FakeGcsServerBuilder Merge(FakeGcsServerConfiguration oldValue, FakeGcsServerConfiguration newValue)
{
return new FakeGcsServerBuilder(new FakeGcsServerConfiguration(oldValue, newValue));
}
}