Skip to content

Commit d6fa570

Browse files
committed
Add Azure Service Bus Emulator container to Azure module
- Fix code review findings Signed-off-by: Esta Nagy <[email protected]>
1 parent 5246f6d commit d6fa570

File tree

2 files changed

+54
-32
lines changed

2 files changed

+54
-32
lines changed

modules/azure/src/main/java/org/testcontainers/azure/AzureServiceBusEmulatorContainer.java

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,24 +25,39 @@ public class AzureServiceBusEmulatorContainer extends GenericContainer<AzureServ
2525
"mcr.microsoft.com/azure-messaging/servicebus-emulator"
2626
);
2727

28-
private final MSSQLServerContainer<?> mssqlServerContainer;
28+
private MSSQLServerContainer<?> msSqlServerContainer;
2929

3030
/**
31-
* @param dockerImageName The specified docker image name to run
32-
* @param mssqlServerContainer The MS SQL Server container used by Service Bus as a dependency
31+
* @param dockerImageName The specified docker image name to run
3332
*/
34-
public AzureServiceBusEmulatorContainer(
35-
final DockerImageName dockerImageName,
36-
final MSSQLServerContainer<?> mssqlServerContainer
37-
) {
33+
public AzureServiceBusEmulatorContainer(final String dockerImageName) {
34+
this(DockerImageName.parse(dockerImageName));
35+
}
36+
37+
/**
38+
* @param dockerImageName The specified docker image name to run
39+
*/
40+
public AzureServiceBusEmulatorContainer(final DockerImageName dockerImageName) {
3841
super(dockerImageName);
3942
dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME);
40-
this.mssqlServerContainer = mssqlServerContainer;
41-
dependsOn(mssqlServerContainer);
4243
withExposedPorts(DEFAULT_PORT);
4344
waitingFor(Wait.forLogMessage(".*Emulator Service is Successfully Up!.*", 1));
4445
}
4546

47+
/**
48+
* Sets the MS SQL Server dependency needed by the Service Bus Container,
49+
*
50+
* @param msSqlServerContainer The MS SQL Server container used by Service Bus as a dependency
51+
* @return this
52+
*/
53+
public AzureServiceBusEmulatorContainer withMsSqlServerContainer(
54+
final MSSQLServerContainer<?> msSqlServerContainer
55+
) {
56+
dependsOn(msSqlServerContainer);
57+
this.msSqlServerContainer = msSqlServerContainer;
58+
return this;
59+
}
60+
4661
/**
4762
* Provide the Service Bus configuration JSON.
4863
*
@@ -65,8 +80,15 @@ public AzureServiceBusEmulatorContainer acceptLicense() {
6580

6681
@Override
6782
protected void configure() {
68-
withEnv("SQL_SERVER", mssqlServerContainer.getNetworkAliases().get(0));
69-
withEnv("MSSQL_SA_PASSWORD", mssqlServerContainer.getPassword());
83+
if (msSqlServerContainer == null) {
84+
throw new IllegalStateException(
85+
"The image " +
86+
getDockerImageName() +
87+
" requires an Microsoft SQL Server container. Please provide one with the withMsSqlServerContainer method!"
88+
);
89+
}
90+
withEnv("SQL_SERVER", msSqlServerContainer.getNetworkAliases().get(0));
91+
withEnv("MSSQL_SA_PASSWORD", msSqlServerContainer.getPassword());
7092
// If license was not accepted programmatically, check if it was accepted via resource file
7193
if (!getEnvMap().containsKey("ACCEPT_EULA")) {
7294
LicenseAcceptance.assertLicenseAccepted(this.getDockerImageName());

modules/azure/src/test/java/org/testcontainers/azure/AzureServiceBusEmulatorContainerTest.java

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,32 @@
22

33
import com.azure.messaging.servicebus.ServiceBusClientBuilder;
44
import com.azure.messaging.servicebus.ServiceBusErrorContext;
5+
import com.azure.messaging.servicebus.ServiceBusException;
56
import com.azure.messaging.servicebus.ServiceBusMessage;
67
import com.azure.messaging.servicebus.ServiceBusProcessorClient;
7-
import com.azure.messaging.servicebus.ServiceBusReceivedMessage;
88
import com.azure.messaging.servicebus.ServiceBusReceivedMessageContext;
99
import com.azure.messaging.servicebus.ServiceBusSenderClient;
10-
import com.azure.messaging.servicebus.ServiceBusTransactionContext;
1110
import com.github.dockerjava.api.model.Capability;
1211
import org.assertj.core.api.Assertions;
1312
import org.junit.Rule;
1413
import org.junit.Test;
1514
import org.testcontainers.containers.MSSQLServerContainer;
1615
import org.testcontainers.containers.Network;
17-
import org.testcontainers.utility.DockerImageName;
1816
import org.testcontainers.utility.MountableFile;
1917

20-
import java.util.ArrayList;
2118
import java.util.List;
19+
import java.util.concurrent.CopyOnWriteArrayList;
2220
import java.util.concurrent.TimeUnit;
2321
import java.util.function.Consumer;
2422

2523
import static org.assertj.core.api.Assertions.assertThat;
24+
import static org.awaitility.Awaitility.await;
2625

2726
public class AzureServiceBusEmulatorContainerTest {
2827

2928
@Rule
3029
// network {
3130
public Network network = Network.newNetwork();
32-
3331
// }
3432

3533
@Rule
@@ -43,23 +41,21 @@ public class AzureServiceBusEmulatorContainerTest {
4341
cmd.getHostConfig().withCapAdd(Capability.SYS_PTRACE);
4442
})
4543
.withNetwork(network);
46-
4744
// }
4845

4946
@Rule
5047
// emulatorContainer {
5148
public AzureServiceBusEmulatorContainer emulator = new AzureServiceBusEmulatorContainer(
52-
DockerImageName.parse("mcr.microsoft.com/azure-messaging/servicebus-emulator:1.0.1"),
53-
mssqlServerContainer
49+
"mcr.microsoft.com/azure-messaging/servicebus-emulator:1.0.1"
5450
)
5551
.acceptLicense()
5652
.withConfig(MountableFile.forClasspathResource("/service-bus-config.json"))
57-
.withNetwork(network);
58-
53+
.withNetwork(network)
54+
.withMsSqlServerContainer(mssqlServerContainer);
5955
// }
6056

6157
@Test
62-
public void testWithClient() throws InterruptedException {
58+
public void testWithClient() {
6359
assertThat(emulator.getConnectionString()).startsWith("Endpoint=sb://");
6460

6561
// senderClient {
@@ -70,16 +66,18 @@ public void testWithClient() throws InterruptedException {
7066
.buildClient();
7167
// }
7268

73-
TimeUnit.SECONDS.sleep(5);
74-
ServiceBusTransactionContext transaction = senderClient.createTransaction();
75-
senderClient.sendMessage(new ServiceBusMessage("Hello, Testcontainers!"), transaction);
76-
senderClient.commitTransaction(transaction);
69+
await()
70+
.atMost(20, TimeUnit.SECONDS)
71+
.ignoreException(ServiceBusException.class)
72+
.until(() -> {
73+
senderClient.sendMessage(new ServiceBusMessage("Hello, Testcontainers!"));
74+
return true;
75+
});
7776
senderClient.close();
7877

79-
TimeUnit.SECONDS.sleep(5);
80-
final List<ServiceBusReceivedMessage> received = new ArrayList<>();
78+
final List<String> received = new CopyOnWriteArrayList<>();
8179
Consumer<ServiceBusReceivedMessageContext> messageConsumer = m -> {
82-
received.add(m.getMessage());
80+
received.add(m.getMessage().getBody().toString());
8381
m.complete();
8482
};
8583
Consumer<ServiceBusErrorContext> errorConsumer = e -> Assertions.fail("Unexpected error: " + e);
@@ -94,9 +92,11 @@ public void testWithClient() throws InterruptedException {
9492
// }
9593
processorClient.start();
9694

97-
TimeUnit.SECONDS.sleep(10);
95+
await()
96+
.atMost(20, TimeUnit.SECONDS)
97+
.untilAsserted(() -> {
98+
assertThat(received).hasSize(1).containsExactlyInAnyOrder("Hello, Testcontainers!");
99+
});
98100
processorClient.close();
99-
assertThat(received).hasSize(1);
100-
assertThat(received.get(0).getBody().toString()).isEqualTo("Hello, Testcontainers!");
101101
}
102102
}

0 commit comments

Comments
 (0)