This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit c27641f5bc9877ef88ab7b8c85de7c9aeacd9ea1
Author: Tran Tien Duc <[email protected]>
AuthorDate: Thu May 23 14:53:20 2019 +0700

    JAMES-2774 Avoid starting too many docker rabbitmq in RabbitMQEventBusTest
    
    By using singleton docker rabbitmq, and it can be reused in other tests
---
 .../james/backend/rabbitmq/RabbitMQExtension.java  | 77 ++++++++++++++++++++--
 .../backend/rabbitmq/RabbitMQHealthCheckTest.java  |  2 +-
 .../james/backend/rabbitmq/RabbitMQTest.java       | 34 +---------
 .../james/mailbox/events/RabbitMQEventBusTest.java | 23 ++-----
 .../RabbitMQMailQueueConfigurationChangeTest.java  |  2 +-
 .../queue/rabbitmq/RabbitMQMailQueueTest.java      |  2 +-
 .../rabbitmq/RabbitMqMailQueueFactoryTest.java     |  2 +-
 7 files changed, 83 insertions(+), 59 deletions(-)

diff --git 
a/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQExtension.java
 
b/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQExtension.java
index 3c4f3a5..1c9f46d 100644
--- 
a/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQExtension.java
+++ 
b/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQExtension.java
@@ -21,6 +21,7 @@ package org.apache.james.backend.rabbitmq;
 import static 
org.apache.james.backend.rabbitmq.RabbitMQFixture.DEFAULT_MANAGEMENT_CREDENTIAL;
 
 import java.net.URISyntaxException;
+import java.util.function.Consumer;
 
 import org.junit.jupiter.api.extension.AfterAllCallback;
 import org.junit.jupiter.api.extension.AfterEachCallback;
@@ -32,19 +33,85 @@ import 
org.junit.jupiter.api.extension.ParameterResolutionException;
 import org.junit.jupiter.api.extension.ParameterResolver;
 
 public class RabbitMQExtension implements BeforeAllCallback, 
BeforeEachCallback, AfterAllCallback, AfterEachCallback, ParameterResolver {
-    private DockerRabbitMQ rabbitMQ;
+
+    private static final Consumer<DockerRabbitMQ> DO_NOTHING = dockerRabbitMQ 
-> {};
+
+    public enum DockerRestartPolicy {
+        PER_TEST(DockerRabbitMQ::start, DockerRabbitMQ::start, 
DockerRabbitMQ::stop, DockerRabbitMQ::stop),
+        PER_CLASS(DockerRabbitMQ::start, DO_NOTHING, DO_NOTHING, 
DockerRabbitMQ::stop),
+        NEVER(DockerRabbitMQ::start, DO_NOTHING, DO_NOTHING, DO_NOTHING);
+
+        private final Consumer<DockerRabbitMQ> beforeAllCallback;
+        private final Consumer<DockerRabbitMQ> beforeEachCallback;
+        private final Consumer<DockerRabbitMQ> afterEachCallback;
+        private final Consumer<DockerRabbitMQ> afterAllCallback;
+
+        DockerRestartPolicy(Consumer<DockerRabbitMQ> beforeAllCallback,
+                            Consumer<DockerRabbitMQ> beforeEachCallback,
+                            Consumer<DockerRabbitMQ> afterEachCallback,
+                            Consumer<DockerRabbitMQ> afterAllCallback) {
+            this.beforeAllCallback = beforeAllCallback;
+            this.beforeEachCallback = beforeEachCallback;
+            this.afterEachCallback = afterEachCallback;
+            this.afterAllCallback = afterAllCallback;
+        }
+
+        public void beforeAll(DockerRabbitMQ dockerRabbitMQ) {
+            beforeAllCallback.accept(dockerRabbitMQ);
+        }
+
+        public void afterAll(DockerRabbitMQ dockerRabbitMQ) {
+            afterAllCallback.accept(dockerRabbitMQ);
+        }
+
+        public void afterEach(DockerRabbitMQ dockerRabbitMQ) {
+            afterEachCallback.accept(dockerRabbitMQ);
+        }
+
+        public void beforeEach(DockerRabbitMQ dockerRabbitMQ) {
+            beforeEachCallback.accept(dockerRabbitMQ);
+        }
+    }
+
+    @FunctionalInterface
+    public interface RequireRestartPolicy {
+        RabbitMQExtension restartPolicy(DockerRestartPolicy 
dockerRestartPolicy);
+    }
+
+    public static RabbitMQExtension singletonRabbitMQ() {
+        return new RabbitMQExtension(DockerRabbitMQSingleton.SINGLETON, 
DockerRestartPolicy.NEVER);
+    }
+
+    public static RequireRestartPolicy defaultRabbitMQ() {
+        return dockerRabbitMQ(DockerRabbitMQ.withoutCookie());
+    }
+
+    public static RequireRestartPolicy dockerRabbitMQ(DockerRabbitMQ 
dockerRabbitMQ) {
+        return dockerRestartPolicy -> new RabbitMQExtension(dockerRabbitMQ, 
dockerRestartPolicy);
+    }
+
+    private final DockerRabbitMQ rabbitMQ;
+    private final DockerRestartPolicy dockerRestartPolicy;
+
     private SimpleChannelPool simpleChannelPool;
     private RabbitMQConnectionFactory connectionFactory;
     private SimpleConnectionPool connectionPool;
 
+    public RabbitMQExtension(DockerRabbitMQ rabbitMQ,
+                             DockerRestartPolicy dockerRestartPolicy) {
+        this.rabbitMQ = rabbitMQ;
+        this.dockerRestartPolicy = dockerRestartPolicy;
+    }
+
     @Override
     public void beforeAll(ExtensionContext context) {
-        rabbitMQ = DockerRabbitMQ.withoutCookie();
-        rabbitMQ.start();
+        dockerRestartPolicy.beforeAll(rabbitMQ);
     }
 
     @Override
     public void beforeEach(ExtensionContext extensionContext) throws Exception 
{
+        dockerRestartPolicy.beforeEach(rabbitMQ);
+
         connectionFactory = createRabbitConnectionFactory();
         connectionPool = new SimpleConnectionPool(connectionFactory);
         this.simpleChannelPool = new SimpleChannelPool(connectionPool);
@@ -54,11 +121,13 @@ public class RabbitMQExtension implements 
BeforeAllCallback, BeforeEachCallback,
     public void afterEach(ExtensionContext context) {
         simpleChannelPool.close();
         connectionPool.close();
+
+        dockerRestartPolicy.afterEach(rabbitMQ);
     }
 
     @Override
     public void afterAll(ExtensionContext extensionContext) {
-        rabbitMQ.stop();
+        dockerRestartPolicy.afterAll(rabbitMQ);
     }
 
     @Override
diff --git 
a/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQHealthCheckTest.java
 
b/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQHealthCheckTest.java
index 6184517..6b811a0 100644
--- 
a/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQHealthCheckTest.java
+++ 
b/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQHealthCheckTest.java
@@ -30,7 +30,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 class RabbitMQHealthCheckTest {
 
     @RegisterExtension
-    static RabbitMQExtension rabbitMQExtension = new RabbitMQExtension();
+    static RabbitMQExtension rabbitMQExtension = 
RabbitMQExtension.singletonRabbitMQ();
 
     private RabbitMQHealthCheck healthCheck;
 
diff --git 
a/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQTest.java
 
b/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQTest.java
index 412340c..b6f1b31 100644
--- 
a/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQTest.java
+++ 
b/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQTest.java
@@ -37,13 +37,10 @@ import java.util.Queue;
 import java.util.concurrent.TimeoutException;
 import java.util.stream.IntStream;
 
-import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtensionContext;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.github.fge.lambdas.Throwing;
@@ -57,37 +54,8 @@ import com.rabbitmq.client.ConnectionFactory;
 
 class RabbitMQTest {
 
-    private static class RabbitMQNestedTestExtension extends RabbitMQExtension 
{
-
-        @Override
-        public void beforeAll(ExtensionContext context) {
-        }
-
-        void beforeAll() {
-            super.beforeAll(null);
-        }
-
-        @Override
-        public void afterAll(ExtensionContext extensionContext) {
-        }
-
-        void afterAll() {
-            super.afterAll(null);
-        }
-    }
-
     @RegisterExtension
-    static RabbitMQNestedTestExtension testExtension = new 
RabbitMQNestedTestExtension();
-
-    @BeforeAll
-    static void setup() {
-        testExtension.beforeAll();
-    }
-
-    @AfterAll
-    static void tearDown() {
-        testExtension.afterAll();
-    }
+    static RabbitMQExtension rabbitMQExtension = 
RabbitMQExtension.singletonRabbitMQ();
 
     @Nested
     class SingleConsumerTest {
diff --git 
a/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
 
b/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
index 84616ac..220f8c5 100644
--- 
a/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
+++ 
b/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
@@ -50,6 +50,7 @@ import java.nio.charset.StandardCharsets;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.james.backend.rabbitmq.RabbitMQExtension;
+import org.apache.james.backend.rabbitmq.RabbitMQExtension.DockerRestartPolicy;
 import org.apache.james.backend.rabbitmq.RabbitMQFixture;
 import org.apache.james.backend.rabbitmq.RabbitMQManagementAPI;
 import org.apache.james.backend.rabbitmq.SimpleConnectionPool;
@@ -66,11 +67,11 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtensionContext;
 import org.junit.jupiter.api.extension.RegisterExtension;
 import org.mockito.stubbing.Answer;
 
 import com.rabbitmq.client.Connection;
+
 import reactor.core.publisher.Mono;
 import reactor.rabbitmq.BindingSpecification;
 import reactor.rabbitmq.ExchangeSpecification;
@@ -86,23 +87,8 @@ class RabbitMQEventBusTest implements 
GroupContract.SingleEventBusGroupContract,
     KeyContract.SingleEventBusKeyContract, 
KeyContract.MultipleEventBusKeyContract,
     ErrorHandlingContract {
 
-    static class TestScopedRabbitMQExtension extends RabbitMQExtension {
-
-        @Override
-        public void beforeEach(ExtensionContext extensionContext) throws 
Exception {
-            super.beforeAll(extensionContext);
-            super.beforeEach(extensionContext);
-        }
-
-        @Override
-        public void afterEach(ExtensionContext context) {
-            super.afterEach(context);
-            super.afterAll(context);
-        }
-    }
-
     @RegisterExtension
-    static RabbitMQExtension rabbitMQExtension = new RabbitMQExtension();
+    static RabbitMQExtension rabbitMQExtension = 
RabbitMQExtension.singletonRabbitMQ();
 
     private RabbitMQEventBus eventBus;
     private RabbitMQEventBus eventBus2;
@@ -320,7 +306,8 @@ class RabbitMQEventBusTest implements 
GroupContract.SingleEventBusGroupContract,
             class DispatchingWhenNetWorkIssue {
 
                 @RegisterExtension
-                TestScopedRabbitMQExtension rabbitMQNetWorkIssueExtension = 
new TestScopedRabbitMQExtension();
+                RabbitMQExtension rabbitMQNetWorkIssueExtension = 
RabbitMQExtension.defaultRabbitMQ()
+                    .restartPolicy(DockerRestartPolicy.PER_TEST);
 
                 private RabbitMQEventBus rabbitMQEventBusWithNetWorkIssue;
 
diff --git 
a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueConfigurationChangeTest.java
 
b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueConfigurationChangeTest.java
index c4fe56f..cf5eb7b 100644
--- 
a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueConfigurationChangeTest.java
+++ 
b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueConfigurationChangeTest.java
@@ -85,7 +85,7 @@ class RabbitMQMailQueueConfigurationChangeTest {
         CassandraEventStoreModule.MODULE));
 
     @RegisterExtension
-    static RabbitMQExtension rabbitMQExtension = new RabbitMQExtension();
+    static RabbitMQExtension rabbitMQExtension = 
RabbitMQExtension.singletonRabbitMQ();
 
     private UpdatableTickingClock clock;
     private RabbitMQMailQueueManagement mqManagementApi;
diff --git 
a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java
 
b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java
index 5f44b02..ec9e18b 100644
--- 
a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java
+++ 
b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java
@@ -87,7 +87,7 @@ public class RabbitMQMailQueueTest implements 
ManageableMailQueueContract, MailQ
         CassandraSchemaVersionModule.MODULE));
 
     @RegisterExtension
-    static RabbitMQExtension rabbitMQExtension = new RabbitMQExtension();
+    static RabbitMQExtension rabbitMQExtension = 
RabbitMQExtension.singletonRabbitMQ();
 
     private RabbitMQMailQueueFactory mailQueueFactory;
     private UpdatableTickingClock clock;
diff --git 
a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMqMailQueueFactoryTest.java
 
b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMqMailQueueFactoryTest.java
index 24088dc..a432c4f 100644
--- 
a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMqMailQueueFactoryTest.java
+++ 
b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMqMailQueueFactoryTest.java
@@ -48,7 +48,7 @@ class RabbitMqMailQueueFactoryTest implements 
MailQueueFactoryContract<RabbitMQM
     private static final HashBlobId.Factory BLOB_ID_FACTORY = new 
HashBlobId.Factory();
 
     @RegisterExtension
-    static final RabbitMQExtension rabbitMQExtension = new RabbitMQExtension();
+    static RabbitMQExtension rabbitMQExtension = 
RabbitMQExtension.singletonRabbitMQ();
 
     private RabbitMQMailQueueFactory mailQueueFactory;
     private RabbitMQMailQueueManagement mqManagementApi;


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to