You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2020/07/31 09:24:35 UTC

[james-project] 14/28: JAMES-3350 Significant test speedup by weakening RabbitMQ isolation

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 f252a64843ad842320c721b3b040c655e77acabb
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Jul 27 13:37:19 2020 +0700

    JAMES-3350 Significant test speedup by weakening RabbitMQ isolation
    
    Each isolation enforcement takes 4 seconds. All of our tests do not require such isolation thus we are waisting
    valuable testing time.
    
    Note that re-enabling isolation to ensure isolation is not the cause of a noticed issue is a one-liner. Thus
    it remains easy for devs to investigate if it is the root cause of their issue.
---
 .../james/backends/rabbitmq/RabbitMQExtension.java | 36 ++++++++++++++++++----
 .../james/backends/rabbitmq/RabbitMQFixture.java   |  1 +
 .../backends/rabbitmq/RabbitMQHealthCheckTest.java |  4 ++-
 .../james/backends/rabbitmq/RabbitMQTest.java      |  3 +-
 .../rabbitmq/ReactorRabbitMQChannelPoolTest.java   |  3 +-
 .../james/mailbox/events/RabbitMQEventBusTest.java |  6 ++--
 .../RabbitMQMailQueueConfigurationChangeTest.java  |  3 +-
 .../queue/rabbitmq/RabbitMQMailQueueTest.java      |  3 +-
 .../rabbitmq/RabbitMqMailQueueFactoryTest.java     |  3 +-
 .../distributed/DistributedTaskManagerTest.java    |  3 +-
 .../RabbitMQTerminationSubscriberTest.java         |  4 ++-
 .../RabbitMQWorkQueuePersistenceTest.java          |  3 +-
 .../distributed/RabbitMQWorkQueueTest.java         |  3 +-
 13 files changed, 57 insertions(+), 18 deletions(-)

diff --git a/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQExtension.java b/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQExtension.java
index 871e592..c2a89a2 100644
--- a/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQExtension.java
+++ b/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQExtension.java
@@ -33,6 +33,8 @@ import org.junit.jupiter.api.extension.ParameterContext;
 import org.junit.jupiter.api.extension.ParameterResolutionException;
 import org.junit.jupiter.api.extension.ParameterResolver;
 
+import com.github.fge.lambdas.consumers.ThrowingConsumer;
+
 import reactor.rabbitmq.Sender;
 
 public class RabbitMQExtension implements BeforeAllCallback, BeforeEachCallback, AfterAllCallback, AfterEachCallback, ParameterResolver {
@@ -76,13 +78,33 @@ public class RabbitMQExtension implements BeforeAllCallback, BeforeEachCallback,
         }
     }
 
+    public enum IsolationPolicy {
+        WEAK(any -> {}),
+        STRONG(DockerRabbitMQ::reset);
+
+        private final ThrowingConsumer<DockerRabbitMQ> isolationCall;
+
+        IsolationPolicy(ThrowingConsumer<DockerRabbitMQ> isolationCall) {
+            this.isolationCall = isolationCall;
+        }
+
+        void enforceIsolation(DockerRabbitMQ container) {
+            isolationCall.accept(container);
+        }
+    }
+
     @FunctionalInterface
     public interface RequireRestartPolicy {
-        RabbitMQExtension restartPolicy(DockerRestartPolicy dockerRestartPolicy);
+        RequireIsolationPolicy restartPolicy(DockerRestartPolicy dockerRestartPolicy);
+    }
+
+    @FunctionalInterface
+    public interface RequireIsolationPolicy {
+        RabbitMQExtension isolationPolicy(IsolationPolicy isolationPolicy);
     }
 
-    public static RabbitMQExtension singletonRabbitMQ() {
-        return new RabbitMQExtension(DockerRabbitMQSingleton.SINGLETON, DockerRestartPolicy.NEVER);
+    public static RequireIsolationPolicy singletonRabbitMQ() {
+        return isolationPolicy -> new RabbitMQExtension(DockerRabbitMQSingleton.SINGLETON, DockerRestartPolicy.NEVER, isolationPolicy);
     }
 
     public static RequireRestartPolicy defaultRabbitMQ() {
@@ -90,19 +112,21 @@ public class RabbitMQExtension implements BeforeAllCallback, BeforeEachCallback,
     }
 
     public static RequireRestartPolicy dockerRabbitMQ(DockerRabbitMQ dockerRabbitMQ) {
-        return dockerRestartPolicy -> new RabbitMQExtension(dockerRabbitMQ, dockerRestartPolicy);
+        return dockerRestartPolicy -> isolationPolicy -> new RabbitMQExtension(dockerRabbitMQ, dockerRestartPolicy, isolationPolicy);
     }
 
     private final DockerRabbitMQ rabbitMQ;
     private final DockerRestartPolicy dockerRestartPolicy;
+    private final IsolationPolicy isolationPolicy;
 
     private ReactorRabbitMQChannelPool channelPool;
     private SimpleConnectionPool connectionPool;
 
     public RabbitMQExtension(DockerRabbitMQ rabbitMQ,
-                             DockerRestartPolicy dockerRestartPolicy) {
+                             DockerRestartPolicy dockerRestartPolicy, IsolationPolicy isolationPolicy) {
         this.rabbitMQ = rabbitMQ;
         this.dockerRestartPolicy = dockerRestartPolicy;
+        this.isolationPolicy = isolationPolicy;
     }
 
     @Override
@@ -127,7 +151,7 @@ public class RabbitMQExtension implements BeforeAllCallback, BeforeEachCallback,
     public void afterEach(ExtensionContext context) throws Exception {
         channelPool.close();
         connectionPool.close();
-        rabbitMQ.reset();
+        isolationPolicy.enforceIsolation(rabbitMQ);
         dockerRestartPolicy.afterEach(rabbitMQ);
     }
 
diff --git a/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQFixture.java b/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQFixture.java
index 53e49b0..eaa40e4 100644
--- a/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQFixture.java
+++ b/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQFixture.java
@@ -32,6 +32,7 @@ public interface RabbitMQFixture {
     String EXCHANGE_NAME = "exchangeName";
     String ROUTING_KEY = "routingKey";
     String WORK_QUEUE = "workQueue";
+    String WORK_QUEUE_SINGLE_ACTIVE_CONSUMER = "workQueueSingleActiveConsumer";
     String WORK_QUEUE_2 = "workQueue2";
 
     String DEFAULT_USER = "guest";
diff --git a/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQHealthCheckTest.java b/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQHealthCheckTest.java
index fa2eef4..adf24e7 100644
--- a/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQHealthCheckTest.java
+++ b/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQHealthCheckTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.backends.rabbitmq;
 
+import static org.apache.james.backends.rabbitmq.RabbitMQExtension.IsolationPolicy.WEAK;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.core.healthcheck.Result;
@@ -30,7 +31,8 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 class RabbitMQHealthCheckTest {
 
     @RegisterExtension
-    static RabbitMQExtension rabbitMQExtension = RabbitMQExtension.singletonRabbitMQ();
+    static RabbitMQExtension rabbitMQExtension = RabbitMQExtension.singletonRabbitMQ()
+        .isolationPolicy(WEAK);
 
     private RabbitMQHealthCheck healthCheck;
 
diff --git a/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQTest.java b/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQTest.java
index a12e831..ff73c05 100644
--- a/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQTest.java
+++ b/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQTest.java
@@ -74,7 +74,8 @@ class RabbitMQTest {
 
     public static final ImmutableMap<String, Object> NO_QUEUE_DECLARE_ARGUMENTS = ImmutableMap.of();
     @RegisterExtension
-    static RabbitMQExtension rabbitMQExtension = RabbitMQExtension.singletonRabbitMQ();
+    static RabbitMQExtension rabbitMQExtension = RabbitMQExtension.singletonRabbitMQ()
+        .isolationPolicy(RabbitMQExtension.IsolationPolicy.STRONG);
 
     @Nested
     class SingleConsumerTest {
diff --git a/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPoolTest.java b/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPoolTest.java
index 9ae05c1..20f83c2 100644
--- a/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPoolTest.java
+++ b/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPoolTest.java
@@ -43,7 +43,8 @@ import reactor.rabbitmq.ChannelPool;
 class ReactorRabbitMQChannelPoolTest implements ChannelPoolContract {
 
     @RegisterExtension
-    static RabbitMQExtension rabbitMQExtension = RabbitMQExtension.singletonRabbitMQ();
+    static RabbitMQExtension rabbitMQExtension = RabbitMQExtension.singletonRabbitMQ()
+        .isolationPolicy(RabbitMQExtension.IsolationPolicy.WEAK);
 
     private List<ReactorRabbitMQChannelPool> channelPools;
 
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 feb188e..78079d5 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
@@ -100,7 +100,8 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
     ErrorHandlingContract {
 
     @RegisterExtension
-    static RabbitMQExtension rabbitMQExtension = RabbitMQExtension.singletonRabbitMQ();
+    static RabbitMQExtension rabbitMQExtension = RabbitMQExtension.singletonRabbitMQ()
+        .isolationPolicy(RabbitMQExtension.IsolationPolicy.WEAK);
 
     private RabbitMQEventBus eventBus;
     private RabbitMQEventBus eventBus2;
@@ -445,7 +446,8 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
 
                 @RegisterExtension
                 RabbitMQExtension rabbitMQNetWorkIssueExtension = RabbitMQExtension.defaultRabbitMQ()
-                    .restartPolicy(DockerRestartPolicy.PER_TEST);
+                    .restartPolicy(DockerRestartPolicy.PER_TEST)
+                    .isolationPolicy(RabbitMQExtension.IsolationPolicy.WEAK);
 
                 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 6831937..6595c88 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
@@ -86,7 +86,8 @@ class RabbitMQMailQueueConfigurationChangeTest {
         CassandraEventStoreModule.MODULE()));
 
     @RegisterExtension
-    static RabbitMQExtension rabbitMQExtension = RabbitMQExtension.singletonRabbitMQ();
+    static RabbitMQExtension rabbitMQExtension = RabbitMQExtension.singletonRabbitMQ()
+        .isolationPolicy(RabbitMQExtension.IsolationPolicy.WEAK);
 
     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 0ae5ebc..b933b52 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
@@ -111,7 +111,8 @@ class RabbitMQMailQueueTest {
         CassandraSchemaVersionModule.MODULE));
 
     @RegisterExtension
-    static RabbitMQExtension rabbitMQExtension = RabbitMQExtension.singletonRabbitMQ();
+    static RabbitMQExtension rabbitMQExtension = RabbitMQExtension.singletonRabbitMQ()
+        .isolationPolicy(RabbitMQExtension.IsolationPolicy.WEAK);
 
     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 2917b35..ecf5c1c 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
@@ -44,7 +44,8 @@ class RabbitMqMailQueueFactoryTest implements MailQueueFactoryContract<RabbitMQM
     private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory();
 
     @RegisterExtension
-    static RabbitMQExtension rabbitMQExtension = RabbitMQExtension.singletonRabbitMQ();
+    static RabbitMQExtension rabbitMQExtension = RabbitMQExtension.singletonRabbitMQ()
+        .isolationPolicy(RabbitMQExtension.IsolationPolicy.WEAK);
 
     private RabbitMQMailQueueFactory mailQueueFactory;
     private RabbitMQMailQueueManagement mqManagementApi;
diff --git a/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/DistributedTaskManagerTest.java b/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/DistributedTaskManagerTest.java
index 233dd9a..88af101 100644
--- a/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/DistributedTaskManagerTest.java
+++ b/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/DistributedTaskManagerTest.java
@@ -139,7 +139,8 @@ class DistributedTaskManagerTest implements TaskManagerContract {
     static final TaskWithId TASK_WITH_ID = new TaskWithId(TASK_ID, TASK);
 
     @RegisterExtension
-    static final RabbitMQExtension rabbitMQExtension = RabbitMQExtension.singletonRabbitMQ();
+    static final RabbitMQExtension rabbitMQExtension = RabbitMQExtension.singletonRabbitMQ()
+        .isolationPolicy(RabbitMQExtension.IsolationPolicy.WEAK);
 
 
     @RegisterExtension
diff --git a/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQTerminationSubscriberTest.java b/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQTerminationSubscriberTest.java
index 3da35db..87bee6e 100644
--- a/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQTerminationSubscriberTest.java
+++ b/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQTerminationSubscriberTest.java
@@ -21,6 +21,7 @@
 package org.apache.james.task.eventsourcing.distributed;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.apache.james.backends.rabbitmq.RabbitMQExtension.IsolationPolicy.WEAK;
 import static org.apache.james.task.eventsourcing.distributed.RabbitMQTerminationSubscriber.EXCHANGE_NAME;
 import static org.apache.james.task.eventsourcing.distributed.RabbitMQTerminationSubscriber.ROUTING_KEY;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -58,7 +59,8 @@ class RabbitMQTerminationSubscriberTest implements TerminationSubscriberContract
     private static final JsonEventSerializer SERIALIZER = JsonEventSerializer.forModules(MODULES).withoutNestedType();
 
     @RegisterExtension
-    static RabbitMQExtension rabbitMQExtension = RabbitMQExtension.singletonRabbitMQ();
+    static RabbitMQExtension rabbitMQExtension = RabbitMQExtension.singletonRabbitMQ()
+        .isolationPolicy(WEAK);
 
     @Override
     public TerminationSubscriber subscriber() {
diff --git a/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueuePersistenceTest.java b/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueuePersistenceTest.java
index 491db08..05f9121 100644
--- a/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueuePersistenceTest.java
+++ b/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueuePersistenceTest.java
@@ -42,7 +42,8 @@ class RabbitMQWorkQueuePersistenceTest {
 
     @RegisterExtension
     static RabbitMQExtension rabbitMQExtension = RabbitMQExtension.defaultRabbitMQ()
-        .restartPolicy(RabbitMQExtension.DockerRestartPolicy.PER_CLASS);
+        .restartPolicy(RabbitMQExtension.DockerRestartPolicy.PER_CLASS)
+        .isolationPolicy(RabbitMQExtension.IsolationPolicy.WEAK);
 
     private RabbitMQWorkQueue testee;
     private ImmediateWorker worker;
diff --git a/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueueTest.java b/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueueTest.java
index e4b6ea3..1a534d4 100644
--- a/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueueTest.java
+++ b/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueueTest.java
@@ -56,7 +56,8 @@ class RabbitMQWorkQueueTest {
 
     @RegisterExtension
     static RabbitMQExtension rabbitMQExtension = RabbitMQExtension.defaultRabbitMQ()
-        .restartPolicy(RabbitMQExtension.DockerRestartPolicy.PER_CLASS);
+        .restartPolicy(RabbitMQExtension.DockerRestartPolicy.PER_CLASS)
+        .isolationPolicy(RabbitMQExtension.IsolationPolicy.WEAK);
 
 
     private RabbitMQWorkQueue testee;


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