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 <[email protected]> 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: [email protected] For additional commands, e-mail: [email protected]
