JAMES-2334 Reuse rabbitmq cluster after each test

- update extension to reuse rabbit cluster and make each rabbit
leave cluster & restart after each test
- move extension to nested class level to optimize test executing time
(each class makes RabbitMQ cluster start one time -> 3 class = three times)


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/614ebad3
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/614ebad3
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/614ebad3

Branch: refs/heads/master
Commit: 614ebad33a1ab846ccfede59c22c29f613949451
Parents: b1035f3
Author: duc <dt...@linagora.com>
Authored: Fri Oct 19 14:32:25 2018 +0700
Committer: Benoit Tellier <btell...@linagora.com>
Committed: Wed Oct 24 08:48:16 2018 +0700

----------------------------------------------------------------------
 .../DockerClusterRabbitMQExtension.java         | 40 ++++++++++++++++----
 .../james/backend/rabbitmq/DockerRabbitMQ.java  | 27 +++++++++++--
 .../backend/rabbitmq/RabbitMQClusterTest.java   |  3 +-
 .../apache/james/util/docker/RateLimiters.java  |  5 ---
 4 files changed, 58 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/614ebad3/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/DockerClusterRabbitMQExtension.java
----------------------------------------------------------------------
diff --git 
a/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/DockerClusterRabbitMQExtension.java
 
b/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/DockerClusterRabbitMQExtension.java
index aede7c6..81f62a5 100644
--- 
a/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/DockerClusterRabbitMQExtension.java
+++ 
b/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/DockerClusterRabbitMQExtension.java
@@ -21,7 +21,9 @@ package org.apache.james.backend.rabbitmq;
 import java.nio.charset.StandardCharsets;
 
 import org.apache.james.util.Runnables;
+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;
@@ -34,16 +36,22 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.hash.Hashing;
 import com.rabbitmq.client.Address;
 
-public class DockerClusterRabbitMQExtension implements BeforeEachCallback, 
AfterEachCallback, ParameterResolver {
+public class DockerClusterRabbitMQExtension implements BeforeAllCallback, 
BeforeEachCallback, AfterEachCallback, AfterAllCallback, ParameterResolver {
 
-    public static final String RABBIT_1 = "rabbit1";
-    public static final String RABBIT_2 = "rabbit2";
-    public static final String RABBIT_3 = "rabbit3";
+    private static final String RABBIT_1_NODE_NAME = "rabbit@rabbit1";
+    private static final String RABBIT_2_NODE_NAME = "rabbit@rabbit2";
+    private static final String RABBIT_3_NODE_NAME = "rabbit@rabbit3";
+    static final String RABBIT_1 = "rabbit1";
+    static final String RABBIT_2 = "rabbit2";
+    static final String RABBIT_3 = "rabbit3";
     private DockerRabbitMQCluster cluster;
     private Network network;
+    private DockerRabbitMQ rabbitMQ1;
+    private DockerRabbitMQ rabbitMQ2;
+    private DockerRabbitMQ rabbitMQ3;
 
     @Override
-    public void beforeEach(ExtensionContext context) {
+    public void beforeAll(ExtensionContext extensionContext) throws Exception {
         String cookie = Hashing.sha256().hashString("secret cookie here", 
StandardCharsets.UTF_8).toString();
 
         network = Network.NetworkImpl.builder()
@@ -51,15 +59,18 @@ public class DockerClusterRabbitMQExtension implements 
BeforeEachCallback, After
             .createNetworkCmdModifiers(ImmutableList.of())
             .build();
 
-        DockerRabbitMQ rabbitMQ1 = 
DockerRabbitMQ.withCookieAndNodeName(RABBIT_1, cookie, "rabbit@rabbit1", 
network);
-        DockerRabbitMQ rabbitMQ2 = 
DockerRabbitMQ.withCookieAndNodeName(RABBIT_2, cookie, "rabbit@rabbit2", 
network);
-        DockerRabbitMQ rabbitMQ3 = 
DockerRabbitMQ.withCookieAndNodeName(RABBIT_3, cookie, "rabbit@rabbit3", 
network);
+        rabbitMQ1 = DockerRabbitMQ.withCookieAndNodeName(RABBIT_1, cookie, 
RABBIT_1_NODE_NAME, network);
+        rabbitMQ2 = DockerRabbitMQ.withCookieAndNodeName(RABBIT_2, cookie, 
RABBIT_2_NODE_NAME, network);
+        rabbitMQ3 = DockerRabbitMQ.withCookieAndNodeName(RABBIT_3, cookie, 
RABBIT_3_NODE_NAME, network);
 
         Runnables.runParallel(
             rabbitMQ1::start,
             rabbitMQ2::start,
             rabbitMQ3::start);
+    }
 
+    @Override
+    public void beforeEach(ExtensionContext context) {
         Runnables.runParallel(
             Throwing.runnable(() -> rabbitMQ2.join(rabbitMQ1)),
             Throwing.runnable(() -> rabbitMQ3.join(rabbitMQ1)));
@@ -69,6 +80,11 @@ public class DockerClusterRabbitMQExtension implements 
BeforeEachCallback, After
 
     @Override
     public void afterEach(ExtensionContext context) throws Exception {
+        cluster.detach();
+    }
+
+    @Override
+    public void afterAll(ExtensionContext extensionContext) throws Exception {
         cluster.stop();
         network.close();
     }
@@ -118,5 +134,13 @@ public class DockerClusterRabbitMQExtension implements 
BeforeEachCallback, After
             return ImmutableList.of(
                 rabbitMQ1.address(), rabbitMQ2.address(), rabbitMQ3.address());
         }
+
+        public void detach() {
+            rabbitMQ3.performIfRunning(DockerRabbitMQ::reset);
+            rabbitMQ1.performIfRunning(rabbitMQ -> 
rabbitMQ.forgetNode(RABBIT_3_NODE_NAME));
+            rabbitMQ2.performIfRunning(DockerRabbitMQ::reset);
+            rabbitMQ1.performIfRunning(rabbitMQ -> 
rabbitMQ.forgetNode(RABBIT_2_NODE_NAME));
+            rabbitMQ1.performIfRunning(DockerRabbitMQ::reset);
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/614ebad3/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/DockerRabbitMQ.java
----------------------------------------------------------------------
diff --git 
a/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/DockerRabbitMQ.java
 
b/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/DockerRabbitMQ.java
index e88c74d..9153f81 100644
--- 
a/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/DockerRabbitMQ.java
+++ 
b/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/DockerRabbitMQ.java
@@ -34,7 +34,9 @@ import org.testcontainers.containers.GenericContainer;
 import org.testcontainers.containers.Network;
 import org.testcontainers.containers.wait.strategy.Wait;
 import org.testcontainers.containers.wait.strategy.WaitAllStrategy;
+import org.testcontainers.containers.wait.strategy.WaitStrategy;
 
+import com.github.fge.lambdas.consumers.ThrowingConsumer;
 import com.google.common.collect.ImmutableMap;
 import com.rabbitmq.client.Address;
 import com.rabbitmq.client.ConnectionFactory;
@@ -49,6 +51,7 @@ public class DockerRabbitMQ {
     private static final String DEFAULT_RABBITMQ_PASSWORD = "guest";
     private static final String RABBITMQ_ERLANG_COOKIE = 
"RABBITMQ_ERLANG_COOKIE";
     private static final String RABBITMQ_NODENAME = "RABBITMQ_NODENAME";
+    private static final Duration TEN_MINUTE_TIMEOUT = Duration.ofMinutes(10);
 
     private final GenericContainer<?> container;
     private final Optional<String> nodeName;
@@ -78,10 +81,13 @@ public class DockerRabbitMQ {
         this.nodeName = nodeName;
     }
 
-    private WaitAllStrategy waitStrategy() {
+    private WaitStrategy waitStrategy() {
         return new WaitAllStrategy()
-            
.withStrategy(Wait.forHttp("").forPort(DEFAULT_RABBITMQ_ADMIN_PORT).withRateLimiter(RateLimiters.TWENTIES_PER_MINUTE))
-            .withStrategy(new RabbitMQWaitStrategy(this, 
Duration.ofMinutes(10)));
+            .withStrategy(Wait.forHttp("").forPort(DEFAULT_RABBITMQ_ADMIN_PORT)
+                .withRateLimiter(RateLimiters.DEFAULT)
+                .withStartupTimeout(TEN_MINUTE_TIMEOUT))
+            .withStrategy(new RabbitMQWaitStrategy(this, TEN_MINUTE_TIMEOUT))
+            .withStartupTimeout(TEN_MINUTE_TIMEOUT);
     }
 
     private String randomName() {
@@ -177,6 +183,15 @@ public class DockerRabbitMQ {
         startApp();
     }
 
+    public void forgetNode(String removalClusterNodeName) throws Exception {
+        String stdout = container()
+            .execInContainer("rabbitmqctl", "-n", this.nodeName.get(), 
"forget_cluster_node", removalClusterNodeName)
+            .getStdout();
+        LOGGER.debug("forget_cluster_node: {}", stdout);
+
+        startApp();
+    }
+
     public void waitForReadyness() {
         waitStrategy().waitUntilReady(container);
     }
@@ -200,4 +215,10 @@ public class DockerRabbitMQ {
                 .setPort(getAdminPort())
                 .build();
     }
+
+    public void performIfRunning(ThrowingConsumer<DockerRabbitMQ> 
actionPerform) {
+        if (container.isRunning()) {
+            actionPerform.accept(this);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/614ebad3/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQClusterTest.java
----------------------------------------------------------------------
diff --git 
a/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQClusterTest.java
 
b/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQClusterTest.java
index b72b45b..bf9a875 100644
--- 
a/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQClusterTest.java
+++ 
b/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQClusterTest.java
@@ -57,13 +57,13 @@ import com.rabbitmq.client.Channel;
 import com.rabbitmq.client.Connection;
 import com.rabbitmq.client.ConnectionFactory;
 
-@ExtendWith(DockerClusterRabbitMQExtension.class)
 class RabbitMQClusterTest {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(RabbitMQClusterTest.class);
 
     private static final String QUEUE = "queue";
 
+    @ExtendWith(DockerClusterRabbitMQExtension.class)
     @Nested
     class ClusterSharing {
 
@@ -147,6 +147,7 @@ class RabbitMQClusterTest {
 
     }
 
+    @ExtendWith(DockerClusterRabbitMQExtension.class)
     @Nested
     class ClusterNodesFailure {
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/614ebad3/server/testing/src/main/java/org/apache/james/util/docker/RateLimiters.java
----------------------------------------------------------------------
diff --git 
a/server/testing/src/main/java/org/apache/james/util/docker/RateLimiters.java 
b/server/testing/src/main/java/org/apache/james/util/docker/RateLimiters.java
index de92ba1..d75730e 100644
--- 
a/server/testing/src/main/java/org/apache/james/util/docker/RateLimiters.java
+++ 
b/server/testing/src/main/java/org/apache/james/util/docker/RateLimiters.java
@@ -29,9 +29,4 @@ public interface RateLimiters {
         .withRate(20, TimeUnit.SECONDS)
         .withConstantThroughput()
         .build();
-
-    RateLimiter TWENTIES_PER_MINUTE = RateLimiterBuilder.newBuilder()
-        .withRate(20, TimeUnit.MINUTES)
-        .withConstantThroughput()
-        .build();
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to