Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce DockerOpenPaasExtension #1535

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
6 changes: 6 additions & 0 deletions tmail-backend/tmail-third-party/openpaas/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,12 @@
<artifactId>wiremock-standalone</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-reactivestreams</artifactId>
<scope>test</scope>
<version>5.3.1</version>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,33 +1,28 @@
package com.linagora.tmail;

import java.util.ArrayList;
import java.util.List;

import org.junit.jupiter.api.extension.AfterAllCallback;
import org.junit.jupiter.api.extension.AfterEachCallback;
import org.junit.jupiter.api.extension.BeforeAllCallback;
import org.junit.jupiter.api.extension.BeforeEachCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.ParameterContext;
import org.junit.jupiter.api.extension.ParameterResolutionException;
import org.junit.jupiter.api.extension.ParameterResolver;

public class DockerOpenPaasExtension implements ParameterResolver, BeforeAllCallback,
AfterAllCallback {
AfterAllCallback{

private static final DockerOpenPaasContainer DOCKER_OPEN_PAAS_SINGLETON = new DockerOpenPaasContainer();
private static final DockerOpenPaasSetup DOCKER_OPEN_PAAS_SINGLETON = new DockerOpenPaasSetup();
private static final int OPEN_PASS_TEST_USERS_COUNT = 20;

private static int currentTestUserIndex = 0;
private DockerOpenPaasPopulateService dockerOpenPaasPopulateService = new DockerOpenPaasPopulateService();

public static DockerOpenPaasContainer getDockerOpenPaasSingleton() {
public static DockerOpenPaasSetup getDockerOpenPaasSingleton() {
return DOCKER_OPEN_PAAS_SINGLETON;
}

@Override
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws
ParameterResolutionException {
return (parameterContext.getParameter().getType() == DockerOpenPaasContainer.class);
return (parameterContext.getParameter().getType() == DockerOpenPaasSetup.class);
}

@Override
Expand All @@ -45,19 +40,13 @@ public void afterAll(ExtensionContext context) {
DOCKER_OPEN_PAAS_SINGLETON.stop();
}

public OpenPaasUser newTestUser() {
if (currentTestUserIndex >= 20) {
throw new IllegalStateException("No more test users available.");
}
return new OpenPaasUser("user" + currentTestUserIndex++ + "@open-paas.org", "secret");
public DockerOpenPaasSetup getDockerOpenPaasSetup() {
return DOCKER_OPEN_PAAS_SINGLETON;
}

public List<OpenPaasUser> allTestUsers() {
List<OpenPaasUser> users = new ArrayList<>();
for (int i = 0; i < OPEN_PASS_TEST_USERS_COUNT; i++) {
users.add(new OpenPaasUser("user" + i + "@open-paas.org", "secret"));
}

return users;
public OpenPaasUser newTestUser() {
return dockerOpenPaasPopulateService.createUser()
.map(OpenPaasUser::fromDocument)
.block();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.linagora.tmail;
chibenwa marked this conversation as resolved.
Show resolved Hide resolved

import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertTrue;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.testcontainers.containers.ContainerState;

public class DockerOpenPaasExtensionTest {

@RegisterExtension
static DockerOpenPaasExtension dockerOpenPaasExtension = new DockerOpenPaasExtension();

@Test
void allServersShouldStartSuccessfully() {
assertTrue(dockerOpenPaasExtension.getDockerOpenPaasSetup().getAllContainers()
.stream().allMatch(this::checkContainerStarted));
HoussemNasri marked this conversation as resolved.
Show resolved Hide resolved
}

@Test
void newTestUserShouldSucceed() {
OpenPaasUser user = dockerOpenPaasExtension.newTestUser();
assertAll(
() -> assertThat("User id should not be null", user.id() != null),
() -> assertThat("User firstname should not be null", user.firstname() != null),
() -> assertThat("User lastname should not be null", user.lastname() != null),
() -> assertThat("User email should not be null", user.email() != null),
() -> assertThat("User password should not be null", user.password() != null)
);
}

boolean checkContainerStarted(ContainerState containerState) {
return containerState.isRunning();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package com.linagora.tmail;

import static com.mongodb.client.model.Filters.eq;
import static com.mongodb.client.model.Updates.push;

import java.util.List;
import java.util.UUID;
import java.util.logging.Logger;

import org.bson.Document;

import com.mongodb.reactivestreams.client.MongoClient;
import com.mongodb.reactivestreams.client.MongoClients;
import com.mongodb.reactivestreams.client.MongoCollection;
import com.mongodb.reactivestreams.client.MongoDatabase;

import reactor.core.publisher.Mono;

public class DockerOpenPaasPopulateService {
HoussemNasri marked this conversation as resolved.
Show resolved Hide resolved

private static final Logger LOGGER = Logger.getLogger(DockerOpenPaasPopulateService.class.getName());

private final MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017");
private final MongoDatabase database = mongoClient.getDatabase("esn_docker");
private final MongoCollection<Document> usersCollection = database.getCollection("users");
private final MongoCollection<Document> domainsCollection = database.getCollection("domains");
HoussemNasri marked this conversation as resolved.
Show resolved Hide resolved

private Document getOpenPaasDomain() {
return Mono.from(domainsCollection.find()
.filter(new Document("name", "open-paas.org"))
.first()).block();
}

private Mono<Document> joinDomain(Document user, Document domain) {
return Mono.from(usersCollection
.findOneAndUpdate(
eq("_id", user.get("_id")),
push("domains", new Document("domain_id", domain.get("_id")))));
}

public Mono<Document> createUser() {
HoussemNasri marked this conversation as resolved.
Show resolved Hide resolved
UUID randomUUID = UUID.randomUUID();
Document userToSave = new Document()
.append("firstname", "User_" + randomUUID)
.append("lastname", "User_" + randomUUID)
.append("password", "secret")
.append("accounts", List.of(new Document()
.append("type", "email")
.append("emails", List.of("user_" + randomUUID + "@open-paas.org"))));

return Mono.from(usersCollection.insertOne(userToSave))
.then(joinDomain(userToSave, getOpenPaasDomain()));
}
HoussemNasri marked this conversation as resolved.
Show resolved Hide resolved
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.io.File;
import java.net.URISyntaxException;
import java.time.Duration;
import java.util.List;

import static com.google.common.io.Resources.getResource;

Expand All @@ -12,16 +13,16 @@
import org.testcontainers.containers.ContainerState;
import org.testcontainers.containers.wait.strategy.Wait;

public class DockerOpenPaasContainer {
private static final Logger LOGGER = LoggerFactory.getLogger(DockerOpenPaasContainer.class);
public class DockerOpenPaasSetup {
private static final Logger LOGGER = LoggerFactory.getLogger(DockerOpenPaasSetup.class);

private final ComposeContainer environment;

{
try {
environment = new ComposeContainer(
new File(getResource("/docker-openpaas-setup.yml").toURI()))
.waitingFor("openpaas", Wait.forLogMessage("*Users currently connected*", 1)
new File(DockerOpenPaasSetup.class.getResource("/docker-openpaas-setup.yml").toURI()))
.waitingFor("openpaas", Wait.forLogMessage(".*Users currently connected.*", 1)
.withStartupTimeout(Duration.ofMinutes(3)));
}
catch (URISyntaxException e) {
Expand All @@ -45,7 +46,29 @@ public ContainerState getRabbitMqContainer() {
return environment.getContainerByServiceName("rabbitmq").orElseThrow();
}

public ContainerState getSabreDav() {
public ContainerState getSabreDavContainer() {
return environment.getContainerByServiceName("sabre_dav").orElseThrow();
}

public ContainerState getMongoDDContainer() {
return environment.getContainerByServiceName("mongo").orElseThrow();
}

public ContainerState getElasticsearchContainer() {
return environment.getContainerByServiceName("elasticsearch").orElseThrow();
}

public ContainerState getRedisContainer() {
return environment.getContainerByServiceName("redis").orElseThrow();
}

public List<ContainerState> getAllContainers() {
return List.of(
getOpenPaasContainer(),
HoussemNasri marked this conversation as resolved.
Show resolved Hide resolved
getRabbitMqContainer(),
getSabreDavContainer(),
getMongoDDContainer(),
getElasticsearchContainer(),
getRedisContainer());
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
package com.linagora.tmail;

public record OpenPaasUser(
String username,
String password) { }
import org.bson.Document;

public record OpenPaasUser(String id, String firstname, String lastname, String email, String password) {

public static OpenPaasUser fromDocument(Document document) {
HoussemNasri marked this conversation as resolved.
Show resolved Hide resolved
return new OpenPaasUser(
document.getObjectId("_id").toString(),
document.getString("firstname"),
document.getString("lastname"),
document.getList("accounts", Document.class)
.getFirst().getList("emails", String.class).getFirst(),
document.getString("password"));
}
}