Skip to content

Commit 087ac7a

Browse files
committed
feat(testcontainers#421) Added AzuriteTestcontainer - added binding workspace location to host
1 parent 96cadd5 commit 087ac7a

File tree

3 files changed

+137
-5
lines changed

3 files changed

+137
-5
lines changed

src/Testcontainers/Builders/TestcontainersBuilderAzuriteExtension.cs

+50-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
namespace DotNet.Testcontainers.Builders
22
{
3+
using System.Collections.Generic;
34
using System.Collections.ObjectModel;
45
using DotNet.Testcontainers.Configurations.Modules.Databases;
56
using DotNet.Testcontainers.Containers;
@@ -40,22 +41,67 @@ public static ITestcontainersBuilder<AzuriteTestcontainer> WithAzurite(this ITes
4041
builder = builder.WithPortBinding(configuration.TablePort, AzuriteTestcontainerConfiguration.DefaultTablePort);
4142
}
4243

44+
if (!string.IsNullOrWhiteSpace(configuration.Location))
45+
{
46+
builder = builder.WithBindMount(configuration.Location, AzuriteTestcontainerConfiguration.DefaultLocation);
47+
}
48+
49+
builder = builder
50+
.WithCommand(GetMainCommand(configuration))
51+
.WithCommand(GetServiceEndpointArgs(configuration))
52+
.WithCommand(GetWorkspaceLocation());
53+
54+
return builder;
55+
}
56+
57+
private static string[] GetWorkspaceLocation()
58+
{
59+
return new[] { "--location", AzuriteTestcontainerConfiguration.DefaultLocation };
60+
}
61+
62+
private static string[] GetServiceEndpointArgs(AzuriteTestcontainerConfiguration configuration)
63+
{
64+
var args = new List<string>();
65+
66+
if (configuration.RunBlobOnly || configuration.RunAllServices)
67+
{
68+
args.Add("--blobHost");
69+
args.Add(AzuriteTestcontainerConfiguration.DefaultBlobEndpoint);
70+
}
71+
72+
if (configuration.RunQueueOnly || configuration.RunAllServices)
73+
{
74+
args.Add("--queueHost");
75+
args.Add(AzuriteTestcontainerConfiguration.DefaultQueueEndpoint);
76+
}
77+
78+
if (configuration.RunTableOnly || configuration.RunAllServices)
79+
{
80+
args.Add("--tableHost");
81+
args.Add(AzuriteTestcontainerConfiguration.DefaultTableEndpoint);
82+
}
83+
84+
return args.Count > 0 ? args.ToArray() : null;
85+
}
86+
87+
private static string GetMainCommand(AzuriteTestcontainerConfiguration configuration)
88+
{
4389
if (configuration.RunBlobOnly)
4490
{
45-
builder = builder.WithCommand("azurite-blob", "--blobHost", AzuriteTestcontainerConfiguration.DefaultBlobEndpoint);
91+
return "azurite-blob";
4692
}
4793

4894
if (configuration.RunQueueOnly)
4995
{
50-
builder = builder.WithCommand("azurite-queue", "--queueHost", AzuriteTestcontainerConfiguration.DefaultQueueEndpoint);
96+
return "azurite-queue";
5197
}
5298

5399
if (configuration.RunTableOnly)
54100
{
55-
builder = builder.WithCommand("azurite-table", "--tableHost", AzuriteTestcontainerConfiguration.DefaultTableEndpoint);
101+
return "azurite-table";
56102
}
57103

58-
return builder;
104+
return "azurite";
59105
}
60106
}
61107
}

src/Testcontainers/Configurations/Modules/Databases/AzuriteTestcontainerConfiguration.cs

+30-1
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,27 @@ public class AzuriteTestcontainerConfiguration : IDisposable
1010
/// <summary>
1111
/// Default Blob service listening port. Default is 10000.
1212
/// </summary>
13+
[PublicAPI]
1314
public const int DefaultBlobPort = 10000;
1415

1516
/// <summary>
1617
/// Default Queue service listening port. Default is 10001.
1718
/// </summary>
19+
[PublicAPI]
1820
public const int DefaultQueuePort = 10001;
1921

2022
/// <summary>
21-
/// Default Table service listening port. Default 10002.
23+
/// Default Table service listening port. Default is 10002.
2224
/// </summary>
25+
[PublicAPI]
2326
public const int DefaultTablePort = 10002;
2427

28+
/// <summary>
29+
/// Default Workspace location folder path. Default is /data.
30+
/// </summary>
31+
[PublicAPI]
32+
public const string DefaultLocation = "/data";
33+
2534
internal const string DefaultBlobEndpoint = "0.0.0.0";
2635
internal const string DefaultQueueEndpoint = "0.0.0.0";
2736
internal const string DefaultTableEndpoint = "0.0.0.0";
@@ -31,6 +40,7 @@ public class AzuriteTestcontainerConfiguration : IDisposable
3140
private bool runBlobOnly;
3241
private bool runQueueOnly;
3342
private bool runTableOnly;
43+
private string location;
3444

3545
/// <summary>
3646
/// Initializes a new instance of the <see cref="AzuriteTestcontainerConfiguration" /> class with default Azurite image.
@@ -151,6 +161,25 @@ public bool RunTableOnly
151161
[PublicAPI]
152162
public bool RunAllServices => !this.RunBlobOnly && !this.RunQueueOnly && !this.RunTableOnly;
153163

164+
/// <summary>
165+
/// Gets or sets workspace location path.
166+
/// </summary>
167+
/// <remarks>
168+
/// Corresponds to the default workspace location of the hosted service.
169+
/// </remarks>
170+
[PublicAPI]
171+
public string Location
172+
{
173+
get => this.location;
174+
set
175+
{
176+
Guard.Argument(value, nameof(this.Location))
177+
.NotNull()
178+
.NotEmpty();
179+
this.location = value;
180+
}
181+
}
182+
154183
/// <summary>
155184
/// Gets the environment configuration.
156185
/// </summary>

tests/Testcontainers.Tests/Unit/Containers/Unix/Modules/Databases/AzuriteTestcontainerTest.cs

+57
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
namespace DotNet.Testcontainers.Tests.Unit
22
{
33
using System;
4+
using System.Collections.Generic;
5+
using System.IO;
46
using System.Threading.Tasks;
57
using Azure;
68
using Azure.Data.Tables;
@@ -14,7 +16,11 @@ namespace DotNet.Testcontainers.Tests.Unit
1416
[Collection(nameof(Testcontainers))]
1517
public sealed class AzuriteTestcontainerTest : IAsyncLifetime
1618
{
19+
// We cannot use `Path.GetTempPath()` on macOS, see: https://github.com/common-workflow-language/cwltool/issues/328.
20+
private static readonly string TempDir = Environment.GetEnvironmentVariable("AGENT_TEMPDIRECTORY") ?? Directory.GetCurrentDirectory();
21+
1722
private AzuriteTestcontainer container;
23+
private string testDir;
1824

1925
public Task InitializeAsync()
2026
{
@@ -23,6 +29,12 @@ public Task InitializeAsync()
2329

2430
public Task DisposeAsync()
2531
{
32+
if (this.testDir != null && Directory.Exists(this.testDir))
33+
{
34+
Directory.Delete(this.testDir, true);
35+
this.testDir = null;
36+
}
37+
2638
return this.container == null ? Task.CompletedTask : this.container.DisposeAsync().AsTask();
2739
}
2840

@@ -40,11 +52,16 @@ public async Task ConnectionToAllServicesEstablished()
4052
var blobProperties = await blobServiceClient.GetPropertiesAsync();
4153
var queueProperties = await queueServiceClient.GetPropertiesAsync();
4254
var tableServiceProperties = await tableServiceClient.GetPropertiesAsync();
55+
var workspaceCommandResult = await this.container.ExecAsync(new List<string> {"ls", AzuriteTestcontainerConfiguration.DefaultLocation});
4356

4457
// Then
4558
Assert.True(blobProperties.GetRawResponse().Status is >= 200 and <= 299);
4659
Assert.True(queueProperties.GetRawResponse().Status is >= 200 and <= 299);
4760
Assert.True(tableServiceProperties.GetRawResponse().Status is >= 200 and <= 299);
61+
Assert.True(workspaceCommandResult.ExitCode == 0);
62+
Assert.Contains(GetDataFilename("blob"), workspaceCommandResult.Stdout);
63+
Assert.Contains(GetDataFilename("queue"), workspaceCommandResult.Stdout);
64+
Assert.Contains(GetDataFilename("table"), workspaceCommandResult.Stdout);
4865
}
4966

5067
[Fact]
@@ -62,11 +79,16 @@ await this.StartAzuriteContainer(config =>
6279

6380
// When
6481
var blobProperties = await blobServiceClient.GetPropertiesAsync();
82+
var workspaceCommandResult = await this.container.ExecAsync(new List<string> { "ls", AzuriteTestcontainerConfiguration.DefaultLocation });
6583

6684
// Then
6785
Assert.True(blobProperties.GetRawResponse().Status is >= 200 and <= 299);
6886
await Assert.ThrowsAsync<RequestFailedException>(() => queueServiceClient.GetPropertiesAsync());
6987
await Assert.ThrowsAsync<RequestFailedException>(() => tableServiceClient.GetPropertiesAsync());
88+
Assert.True(workspaceCommandResult.ExitCode == 0);
89+
Assert.Contains(GetDataFilename("blob"), workspaceCommandResult.Stdout);
90+
Assert.DoesNotContain(GetDataFilename("queue"), workspaceCommandResult.Stdout);
91+
Assert.DoesNotContain(GetDataFilename("table"), workspaceCommandResult.Stdout);
7092
}
7193

7294
[Fact]
@@ -84,11 +106,16 @@ await this.StartAzuriteContainer(config =>
84106

85107
// When
86108
var queueProperties = await queueServiceClient.GetPropertiesAsync();
109+
var workspaceCommandResult = await this.container.ExecAsync(new List<string> { "ls", AzuriteTestcontainerConfiguration.DefaultLocation });
87110

88111
// Then
89112
Assert.True(queueProperties.GetRawResponse().Status is >= 200 and <= 299);
90113
await Assert.ThrowsAsync<RequestFailedException>(() => blobServiceClient.GetPropertiesAsync());
91114
await Assert.ThrowsAsync<RequestFailedException>(() => tableServiceClient.GetPropertiesAsync());
115+
Assert.True(workspaceCommandResult.ExitCode == 0);
116+
Assert.DoesNotContain(GetDataFilename("blob"), workspaceCommandResult.Stdout);
117+
Assert.Contains(GetDataFilename("queue"), workspaceCommandResult.Stdout);
118+
Assert.DoesNotContain(GetDataFilename("table"), workspaceCommandResult.Stdout);
92119
}
93120

94121
[Fact]
@@ -106,11 +133,36 @@ await this.StartAzuriteContainer(config =>
106133

107134
// When
108135
var tableServiceProperties = await tableServiceClient.GetPropertiesAsync();
136+
var workspaceCommandResult = await this.container.ExecAsync(new List<string> { "ls", AzuriteTestcontainerConfiguration.DefaultLocation });
109137

110138
// Then
111139
Assert.True(tableServiceProperties.GetRawResponse().Status is >= 200 and <= 299);
112140
await Assert.ThrowsAsync<RequestFailedException>(() => blobServiceClient.GetPropertiesAsync());
113141
await Assert.ThrowsAsync<RequestFailedException>(() => queueServiceClient.GetPropertiesAsync());
142+
Assert.True(workspaceCommandResult.ExitCode == 0);
143+
Assert.DoesNotContain(GetDataFilename("blob"), workspaceCommandResult.Stdout);
144+
Assert.DoesNotContain(GetDataFilename("queue"), workspaceCommandResult.Stdout);
145+
Assert.Contains(GetDataFilename("table"), workspaceCommandResult.Stdout);
146+
}
147+
148+
[Fact]
149+
public async Task BindedLocationPathShouldContainsDataFiles()
150+
{
151+
// Given
152+
this.testDir = Path.Combine(TempDir, Guid.NewGuid().ToString("N"));
153+
Directory.CreateDirectory(this.testDir);
154+
await this.StartAzuriteContainer(config =>
155+
{
156+
config.Location = this.testDir;
157+
});
158+
159+
// When
160+
161+
// Then
162+
var files = Directory.GetFiles(this.testDir);
163+
Assert.Contains(files, file => file.EndsWith(GetDataFilename("blob"), StringComparison.InvariantCultureIgnoreCase));
164+
Assert.Contains(files, file => file.EndsWith(GetDataFilename("queue"), StringComparison.InvariantCultureIgnoreCase));
165+
Assert.Contains(files, file => file.EndsWith(GetDataFilename("table"), StringComparison.InvariantCultureIgnoreCase));
114166
}
115167

116168
private async Task StartAzuriteContainer(Action<AzuriteTestcontainerConfiguration> configure = null)
@@ -122,5 +174,10 @@ private async Task StartAzuriteContainer(Action<AzuriteTestcontainerConfiguratio
122174
.Build();
123175
await this.container.StartAsync();
124176
}
177+
178+
private static string GetDataFilename(string service)
179+
{
180+
return $"__azurite_db_{service}__.json";
181+
}
125182
}
126183
}

0 commit comments

Comments
 (0)