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 2018/09/14 03:19:25 UTC

[01/13] james-project git commit: JAMES-2540 Update Mail Queue Grafana board

Repository: james-project
Updated Branches:
  refs/heads/master ff3698dbc -> 6e8d222ac


JAMES-2540 Update Mail Queue Grafana board


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

Branch: refs/heads/master
Commit: 808e04aac9db1321d0834f34ba80886a3a680ca8
Parents: ff3698d
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Sep 11 09:06:06 2018 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Sep 14 10:16:46 2018 +0700

----------------------------------------------------------------------
 grafana-reporting/MailQueue-1490071879988.json | 244 ++++++++++++++++++--
 1 file changed, 227 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/808e04aa/grafana-reporting/MailQueue-1490071879988.json
----------------------------------------------------------------------
diff --git a/grafana-reporting/MailQueue-1490071879988.json b/grafana-reporting/MailQueue-1490071879988.json
index f96fa66..2a12b96 100644
--- a/grafana-reporting/MailQueue-1490071879988.json
+++ b/grafana-reporting/MailQueue-1490071879988.json
@@ -42,7 +42,7 @@
   "rows": [
     {
       "collapse": false,
-      "height": 253,
+      "height": 386,
       "panels": [
         {
           "aliasColors": {},
@@ -68,7 +68,7 @@
           "points": false,
           "renderer": "flot",
           "seriesOverrides": [],
-          "span": 3,
+          "span": 2,
           "stack": false,
           "steppedLine": false,
           "targets": [
@@ -186,7 +186,7 @@
               "yaxis": 2
             }
           ],
-          "span": 3,
+          "span": 2,
           "stack": false,
           "steppedLine": false,
           "targets": [
@@ -267,15 +267,120 @@
           "bars": false,
           "datasource": "${DS_JAMES_ES}",
           "fill": 1,
+          "id": 35,
+          "legend": {
+            "avg": true,
+            "current": true,
+            "max": true,
+            "min": false,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [
+            {
+              "alias": "Derivative Max count",
+              "yaxis": 2
+            }
+          ],
+          "span": 2,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "bucketAggs": [
+                {
+                  "field": "@timestamp",
+                  "id": "2",
+                  "settings": {
+                    "interval": "1m",
+                    "min_doc_count": 0,
+                    "trimEdges": 0
+                  },
+                  "type": "date_histogram"
+                }
+              ],
+              "dsType": "elasticsearch",
+              "metrics": [
+                {
+                  "field": "count",
+                  "id": "1",
+                  "meta": {},
+                  "pipelineAgg": "3",
+                  "settings": {},
+                  "type": "max"
+                },
+                {
+                  "field": "1",
+                  "id": "3",
+                  "meta": {},
+                  "pipelineAgg": "1",
+                  "settings": {},
+                  "type": "derivative"
+                }
+              ],
+              "query": "name:\"dequeuedMail:spool\"",
+              "refId": "A",
+              "timeField": "@timestamp"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "dequeuedMail:spool",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "none",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "opm",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": "0",
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "datasource": "${DS_JAMES_ES}",
+          "fill": 1,
           "id": 27,
           "legend": {
-            "avg": false,
+            "avg": true,
             "current": false,
-            "max": false,
+            "max": true,
             "min": false,
             "show": true,
             "total": false,
-            "values": false
+            "values": true
           },
           "lines": true,
           "linewidth": 1,
@@ -382,13 +487,13 @@
           "fill": 1,
           "id": 33,
           "legend": {
-            "avg": true,
-            "current": true,
-            "max": true,
-            "min": true,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
             "show": true,
             "total": false,
-            "values": true
+            "values": false
           },
           "lines": true,
           "linewidth": 1,
@@ -424,7 +529,7 @@
               "dsType": "elasticsearch",
               "metrics": [
                 {
-                  "field": "count",
+                  "field": "value",
                   "id": "1",
                   "meta": {},
                   "pipelineAgg": "3",
@@ -490,7 +595,7 @@
     },
     {
       "collapse": false,
-      "height": 275,
+      "height": 318,
       "panels": [
         {
           "aliasColors": {},
@@ -516,7 +621,7 @@
           "points": false,
           "renderer": "flot",
           "seriesOverrides": [],
-          "span": 3,
+          "span": 2,
           "stack": false,
           "steppedLine": false,
           "targets": [
@@ -634,7 +739,7 @@
               "yaxis": 2
             }
           ],
-          "span": 3,
+          "span": 2,
           "stack": false,
           "steppedLine": false,
           "targets": [
@@ -715,6 +820,111 @@
           "bars": false,
           "datasource": "${DS_JAMES_ES}",
           "fill": 1,
+          "id": 36,
+          "legend": {
+            "avg": true,
+            "current": true,
+            "max": true,
+            "min": false,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [
+            {
+              "alias": "Derivative Max count",
+              "yaxis": 2
+            }
+          ],
+          "span": 2,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "bucketAggs": [
+                {
+                  "field": "@timestamp",
+                  "id": "2",
+                  "settings": {
+                    "interval": "1m",
+                    "min_doc_count": 0,
+                    "trimEdges": 0
+                  },
+                  "type": "date_histogram"
+                }
+              ],
+              "dsType": "elasticsearch",
+              "metrics": [
+                {
+                  "field": "count",
+                  "id": "1",
+                  "meta": {},
+                  "pipelineAgg": "3",
+                  "settings": {},
+                  "type": "max"
+                },
+                {
+                  "field": "1",
+                  "id": "3",
+                  "meta": {},
+                  "pipelineAgg": "1",
+                  "settings": {},
+                  "type": "derivative"
+                }
+              ],
+              "query": "name:\"dequeuedMail:outgoing\"",
+              "refId": "A",
+              "timeField": "@timestamp"
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "dequeuedMails:outgoing",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "none",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "opm",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": "0",
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "datasource": "${DS_JAMES_ES}",
+          "fill": 1,
           "id": 34,
           "legend": {
             "avg": false,
@@ -872,7 +1082,7 @@
               "dsType": "elasticsearch",
               "metrics": [
                 {
-                  "field": "count",
+                  "field": "value",
                   "id": "1",
                   "meta": {},
                   "pipelineAgg": "3",
@@ -1099,5 +1309,5 @@
   },
   "timezone": "browser",
   "title": "MailQueue",
-  "version": 23
+  "version": 26
 }
\ No newline at end of file


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


[12/13] james-project git commit: JAMES-2544 Use registered extensions for Cassandra event sourcing systems

Posted by bt...@apache.org.
JAMES-2544 Use registered extensions for Cassandra event sourcing systems


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

Branch: refs/heads/master
Commit: 6e8d222aca6366f1b90b4374e693f6752e66c5da
Parents: df6fe4f
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Sep 13 15:22:51 2018 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Sep 14 10:18:33 2018 +0700

----------------------------------------------------------------------
 .../CassandraEventSourcingSystemTest.java       |  7 +-
 .../cassandra/CassandraEventStoreExtension.java | 60 ++++++++++++++-
 .../cassandra/CassandraEventStoreTest.java      |  7 +-
 .../CassandraGenericEventStoreExtension.java    | 80 --------------------
 .../listeners/CassandraEventStoreExtension.java | 31 --------
 ...draQuotaMailingListenersIntegrationTest.java | 10 ++-
 ...draEventSourcingFilteringManagementTest.java |  9 ++-
 .../filtering/CassandraFilteringExtension.java  | 30 --------
 8 files changed, 75 insertions(+), 159 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/6e8d222a/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventSourcingSystemTest.java
----------------------------------------------------------------------
diff --git a/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventSourcingSystemTest.java b/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventSourcingSystemTest.java
index e538b93..92c5401 100644
--- a/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventSourcingSystemTest.java
+++ b/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventSourcingSystemTest.java
@@ -20,9 +20,10 @@
 package org.apache.james.eventsourcing.eventstore.cassandra;
 
 import org.apache.james.eventsourcing.EventSourcingSystemTest;
-import org.junit.jupiter.api.extension.ExtendWith;
+import org.apache.james.eventsourcing.eventstore.cassandra.dto.TestEventDTOModules;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraEventStoreExtension.class)
 public class CassandraEventSourcingSystemTest implements EventSourcingSystemTest {
-
+    @RegisterExtension
+    static CassandraEventStoreExtension eventStoreExtension = new CassandraEventStoreExtension(TestEventDTOModules.TEST_TYPE);
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/6e8d222a/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreExtension.java
----------------------------------------------------------------------
diff --git a/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreExtension.java b/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreExtension.java
index b913ef8..52ce427 100644
--- a/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreExtension.java
+++ b/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreExtension.java
@@ -19,12 +19,64 @@
 
 package org.apache.james.eventsourcing.eventstore.cassandra;
 
-import org.apache.james.eventsourcing.eventstore.cassandra.dto.TestEventDTOModules;
+import java.util.Arrays;
+import java.util.Set;
+
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.utils.CassandraUtils;
+import org.apache.james.eventsourcing.eventstore.EventStore;
+import org.apache.james.eventsourcing.eventstore.cassandra.dto.EventDTOModule;
+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;
 
 import com.google.common.collect.ImmutableSet;
 
-public class CassandraEventStoreExtension extends CassandraGenericEventStoreExtension {
-    public CassandraEventStoreExtension() {
-        super(ImmutableSet.of(TestEventDTOModules.TEST_TYPE));
+public class CassandraEventStoreExtension implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback, ParameterResolver {
+    private final Set<EventDTOModule> modules;
+    private CassandraClusterExtension cassandra;
+    private EventStoreDao eventStoreDao;
+
+    public CassandraEventStoreExtension(EventDTOModule... modules) {
+        this.modules = Arrays.stream(modules).collect(ImmutableSet.toImmutableSet());
+        this.cassandra = new CassandraClusterExtension(CassandraEventStoreModule.MODULE);
+    }
+
+    @Override
+    public void beforeAll(ExtensionContext context) {
+        cassandra.beforeAll(context);
+    }
+
+    @Override
+    public void afterAll(ExtensionContext context) {
+        cassandra.afterAll(context);
+    }
+
+    @Override
+    public void beforeEach(ExtensionContext context) {
+        JsonEventSerializer jsonEventSerializer = new JsonEventSerializer(modules);
+
+        eventStoreDao = new EventStoreDao(cassandra.getCassandraCluster().getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION,
+            jsonEventSerializer);
+    }
+
+    @Override
+    public void afterEach(ExtensionContext context) {
+        cassandra.afterEach(context);
+    }
+
+    @Override
+    public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
+        return (parameterContext.getParameter().getType() == EventStore.class);
+    }
+
+    @Override
+    public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
+        return new CassandraEventStore(eventStoreDao);
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/6e8d222a/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreTest.java
----------------------------------------------------------------------
diff --git a/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreTest.java b/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreTest.java
index 6d240c3..f40eac1 100644
--- a/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreTest.java
+++ b/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreTest.java
@@ -20,9 +20,10 @@
 package org.apache.james.eventsourcing.eventstore.cassandra;
 
 import org.apache.james.eventsourcing.eventstore.EventStoreTest;
-import org.junit.jupiter.api.extension.ExtendWith;
+import org.apache.james.eventsourcing.eventstore.cassandra.dto.TestEventDTOModules;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraEventStoreExtension.class)
 class CassandraEventStoreTest implements EventStoreTest {
-
+    @RegisterExtension
+    static CassandraEventStoreExtension eventStoreExtension = new CassandraEventStoreExtension(TestEventDTOModules.TEST_TYPE);
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/6e8d222a/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraGenericEventStoreExtension.java
----------------------------------------------------------------------
diff --git a/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraGenericEventStoreExtension.java b/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraGenericEventStoreExtension.java
deleted file mode 100644
index 56eee29..0000000
--- a/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraGenericEventStoreExtension.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.eventsourcing.eventstore.cassandra;
-
-import java.util.Set;
-
-import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.utils.CassandraUtils;
-import org.apache.james.eventsourcing.eventstore.EventStore;
-import org.apache.james.eventsourcing.eventstore.cassandra.dto.EventDTOModule;
-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 CassandraGenericEventStoreExtension implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback, ParameterResolver {
-    @SuppressWarnings("rawtypes")
-    private final Set<EventDTOModule> modules;
-    private CassandraClusterExtension cassandra;
-    private EventStoreDao eventStoreDao;
-
-    public CassandraGenericEventStoreExtension(@SuppressWarnings("rawtypes") Set<EventDTOModule> modules) {
-        this.modules = modules;
-        cassandra = new CassandraClusterExtension(CassandraEventStoreModule.MODULE);
-    }
-
-    @Override
-    public void beforeAll(ExtensionContext context) {
-        cassandra.beforeAll(context);
-    }
-
-    @Override
-    public void afterAll(ExtensionContext context) {
-        cassandra.afterAll(context);
-    }
-
-    @Override
-    public void beforeEach(ExtensionContext context) {
-        JsonEventSerializer jsonEventSerializer = new JsonEventSerializer(modules);
-
-        eventStoreDao = new EventStoreDao(cassandra.getCassandraCluster().getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION,
-            jsonEventSerializer);
-    }
-
-    @Override
-    public void afterEach(ExtensionContext context) {
-        cassandra.afterEach(context);
-    }
-
-    @Override
-    public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
-        return (parameterContext.getParameter().getType() == EventStore.class);
-    }
-
-    @Override
-    public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
-        return new CassandraEventStore(eventStoreDao);
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/6e8d222a/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/listeners/CassandraEventStoreExtension.java
----------------------------------------------------------------------
diff --git a/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/listeners/CassandraEventStoreExtension.java b/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/listeners/CassandraEventStoreExtension.java
deleted file mode 100644
index 0218c78..0000000
--- a/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/listeners/CassandraEventStoreExtension.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.mailbox.quota.cassandra.listeners;
-
-import org.apache.james.eventsourcing.eventstore.cassandra.CassandraGenericEventStoreExtension;
-import org.apache.james.mailbox.quota.cassandra.dto.QuotaEventDTOModules;
-
-import com.google.common.collect.ImmutableSet;
-
-public class CassandraEventStoreExtension extends CassandraGenericEventStoreExtension {
-    public CassandraEventStoreExtension() {
-        super(ImmutableSet.of(QuotaEventDTOModules.QUOTA_THRESHOLD_CHANGE));
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/6e8d222a/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/listeners/CassandraQuotaMailingListenersIntegrationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/listeners/CassandraQuotaMailingListenersIntegrationTest.java b/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/listeners/CassandraQuotaMailingListenersIntegrationTest.java
index 7835898..8864507 100644
--- a/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/listeners/CassandraQuotaMailingListenersIntegrationTest.java
+++ b/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/listeners/CassandraQuotaMailingListenersIntegrationTest.java
@@ -19,10 +19,12 @@
 
 package org.apache.james.mailbox.quota.cassandra.listeners;
 
+import org.apache.james.eventsourcing.eventstore.cassandra.CassandraEventStoreExtension;
+import org.apache.james.mailbox.quota.cassandra.dto.QuotaEventDTOModules;
 import org.apache.james.mailbox.quota.mailing.listeners.QuotaThresholdMailingIntegrationTest;
-import org.junit.jupiter.api.extension.ExtendWith;
-
-@ExtendWith(CassandraEventStoreExtension.class)
-public class CassandraQuotaMailingListenersIntegrationTest implements QuotaThresholdMailingIntegrationTest {
+import org.junit.jupiter.api.extension.RegisterExtension;
 
+class CassandraQuotaMailingListenersIntegrationTest implements QuotaThresholdMailingIntegrationTest {
+    @RegisterExtension
+    static CassandraEventStoreExtension eventStoreExtension = new CassandraEventStoreExtension(QuotaEventDTOModules.QUOTA_THRESHOLD_CHANGE);
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/6e8d222a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/CassandraEventSourcingFilteringManagementTest.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/CassandraEventSourcingFilteringManagementTest.java b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/CassandraEventSourcingFilteringManagementTest.java
index 61cf8e8..68be998 100644
--- a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/CassandraEventSourcingFilteringManagementTest.java
+++ b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/CassandraEventSourcingFilteringManagementTest.java
@@ -19,10 +19,11 @@
 
 package org.apache.james.jmap.cassandra.filtering;
 
+import org.apache.james.eventsourcing.eventstore.cassandra.CassandraEventStoreExtension;
 import org.apache.james.jmap.api.filtering.FilteringManagementContract;
-import org.junit.jupiter.api.extension.ExtendWith;
-
-@ExtendWith(CassandraFilteringExtension.class)
-public class CassandraEventSourcingFilteringManagementTest implements FilteringManagementContract {
+import org.junit.jupiter.api.extension.RegisterExtension;
 
+class CassandraEventSourcingFilteringManagementTest implements FilteringManagementContract {
+    @RegisterExtension
+    static CassandraEventStoreExtension eventStoreExtension = new CassandraEventStoreExtension(FilteringRuleSetDefineDTOModules.FILTERING_RULE_SET_DEFINED);
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/6e8d222a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/CassandraFilteringExtension.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/CassandraFilteringExtension.java b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/CassandraFilteringExtension.java
deleted file mode 100644
index 300bd5d..0000000
--- a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/CassandraFilteringExtension.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.jmap.cassandra.filtering;
-
-import org.apache.james.eventsourcing.eventstore.cassandra.CassandraGenericEventStoreExtension;
-
-import com.google.common.collect.ImmutableSet;
-
-public class CassandraFilteringExtension extends CassandraGenericEventStoreExtension {
-    public CassandraFilteringExtension() {
-        super(ImmutableSet.of(FilteringRuleSetDefineDTOModules.FILTERING_RULE_SET_DEFINED));
-    }
-}


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


[11/13] james-project git commit: JAMES-2544 Use CassandraCluster extension where applicable

Posted by bt...@apache.org.
JAMES-2544 Use CassandraCluster extension where applicable

This also include simple migrations to JUNIT 5 for cassandra tests


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

Branch: refs/heads/master
Commit: df6fe4fb2e3c5c194aabc444d0da7de71d67574d
Parents: 7023a29
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Sep 13 15:15:24 2018 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Sep 14 10:18:33 2018 +0700

----------------------------------------------------------------------
 .../init/CassandraTypeProviderTest.java         |  45 ++++----
 .../backends/cassandra/utils/PaggingTest.java   |  51 +++------
 .../versions/CassandraSchemaVersionDAOTest.java |  44 ++-----
 .../CassandraGenericEventStoreExtension.java    |  26 ++---
 ...istributedMailboxDelegatingListenerTest.java |  41 ++-----
 ...CassandraMailboxPathRegistrerMapperTest.java |  54 +++------
 .../cassandra/mail/CassandraACLMapperTest.java  |  69 +++++------
 .../mail/CassandraApplicableFlagDAOTest.java    |  57 ++++------
 .../mail/CassandraAttachmentDAOTest.java        |  52 +++------
 .../mail/CassandraAttachmentDAOV2Test.java      |  44 ++-----
 .../mail/CassandraAttachmentFallbackTest.java   |  61 ++++------
 .../mail/CassandraAttachmentOwnerDAOTest.java   |  52 +++------
 .../mail/CassandraDeletedMessageDAOTest.java    |  77 +++++--------
 .../mail/CassandraFirstUnseenDAOTest.java       |  66 ++++-------
 .../mail/CassandraIndexTableHandlerTest.java    | 114 ++++++++-----------
 .../mail/CassandraMailboxCounterDAOTest.java    |  77 +++++--------
 .../cassandra/mail/CassandraMailboxDAOTest.java |  70 +++++-------
 .../CassandraMailboxMapperConcurrencyTest.java  |  45 +++-----
 .../mail/CassandraMailboxPathDAOImplTest.java   |  15 +--
 .../mail/CassandraMailboxPathDAOTest.java       |  55 +++------
 .../mail/CassandraMailboxPathV2DAOTest.java     |   3 +-
 .../mail/CassandraMailboxRecentDAOTest.java     |  59 ++++------
 .../cassandra/mail/CassandraMessageDAOTest.java |  68 +++++------
 .../mail/CassandraMessageIdDAOTest.java         |  74 +++++-------
 .../CassandraMessageIdToImapUidDAOTest.java     |  74 +++++-------
 .../mail/CassandraModSeqProviderTest.java       |  49 +++-----
 .../mail/CassandraUidProviderTest.java          |  50 +++-----
 .../mail/CassandraUserMailboxRightsDAOTest.java |  46 +++-----
 .../AttachmentMessageIdCreationTest.java        |  57 ++++------
 .../migration/AttachmentV2MigrationTest.java    |  67 ++++-------
 .../migration/MailboxPathV2MigrationTest.java   |  54 ++++-----
 .../blob/cassandra/CassandraBlobsDAOTest.java   |  34 ++----
 ...assandraMailRepositoryUrlStoreExtension.java |  20 ++--
 .../sieve/cassandra/CassandraSieveDAOTest.java  |  83 +++++---------
 .../cassandra/CassandraSieveQuotaDAOTest.java   |  65 ++++-------
 .../CassandraMailRepositoryCountDAOTest.java    |  43 +++----
 .../CassandraMailRepositoryKeysDAOTest.java     |  30 +----
 .../CassandraMailRepositoryMailDAOTest.java     |  40 ++-----
 .../cassandra/CassandraMailRepositoryTest.java  |  36 ++----
 39 files changed, 707 insertions(+), 1360 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/init/CassandraTypeProviderTest.java
----------------------------------------------------------------------
diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/init/CassandraTypeProviderTest.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/init/CassandraTypeProviderTest.java
index 8de8baa..1bf149c 100644
--- a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/init/CassandraTypeProviderTest.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/init/CassandraTypeProviderTest.java
@@ -23,58 +23,51 @@ import static com.datastax.driver.core.DataType.text;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.datastax.driver.core.schemabuilder.SchemaBuilder;
 
-public class CassandraTypeProviderTest {
-
+class CassandraTypeProviderTest {
     private static final String TYPE_NAME = "typename";
     private static final String PROPERTY = "property";
 
-    @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
+    public static final CassandraModule.Impl MODULE = CassandraModule.type(TYPE_NAME)
+        .statement(statement -> statement.addColumn(PROPERTY, text()))
+        .build();
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(MODULE);
     
     private CassandraCluster cassandra;
-    private CassandraModule module;
 
-    @Before
-    public void setUp() {
-        module = CassandraModule.type(TYPE_NAME)
-            .statement(statement -> statement.addColumn(PROPERTY, text()))
-            .build();
-        cassandra = CassandraCluster.create(module, cassandraServer.getHost());
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
+        this.cassandra = cassandra;
         cassandra.getTypesProvider();
     }
 
-    @After
-    public void tearDown() {
-        cassandra.close();
-    }
-
     @Test
-    public void getDefinedUserTypeShouldNotReturnNullNorFailWhenTypeIsDefined() {
+    void getDefinedUserTypeShouldNotReturnNullNorFailWhenTypeIsDefined() {
         assertThat(cassandra.getTypesProvider().getDefinedUserType(TYPE_NAME))
             .isNotNull();
     }
 
     @Test
-    public void initializeTypesShouldCreateTheTypes() {
+    void initializeTypesShouldCreateTheTypes() {
         cassandra.getConf().execute(SchemaBuilder.dropType(TYPE_NAME));
 
-        new CassandraTypesCreator(module, cassandra.getConf()).initializeTypes();
-        CassandraTypesProvider cassandraTypesProviderTest = new CassandraTypesProvider(module, cassandra.getConf());
+        new CassandraTypesCreator(MODULE, cassandra.getConf()).initializeTypes();
+        CassandraTypesProvider cassandraTypesProviderTest = new CassandraTypesProvider(MODULE, cassandra.getConf());
         assertThat(cassandraTypesProviderTest.getDefinedUserType(TYPE_NAME))
             .isNotNull();
     }
 
     @Test
-    public void initializeTypesShouldNotFailIfCalledTwice() {
-        new CassandraTypesProvider(module, cassandra.getConf());
+    void initializeTypesShouldNotFailIfCalledTwice() {
+        new CassandraTypesProvider(MODULE, cassandra.getConf());
         assertThat(cassandra.getTypesProvider().getDefinedUserType(TYPE_NAME))
             .isNotNull();
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/utils/PaggingTest.java
----------------------------------------------------------------------
diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/utils/PaggingTest.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/utils/PaggingTest.java
index f9049f9..3395e20 100644
--- a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/utils/PaggingTest.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/utils/PaggingTest.java
@@ -28,59 +28,40 @@ import java.util.UUID;
 import java.util.stream.IntStream;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.util.CompletableFutureUtil;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.datastax.driver.core.DataType;
 import com.datastax.driver.core.utils.UUIDs;
 
-public class PaggingTest {
+class PaggingTest {
     
     private static final String TABLE_NAME = "test";
     private static final String ID = "id";
     private static final String CLUSTERING = "clustering";
     private static final UUID UUID = UUIDs.timeBased();
 
-    @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-    
-    private static CassandraCluster cassandra;
-    private CassandraAsyncExecutor executor;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.table(TABLE_NAME)
+        .comment("Testing table")
+        .statement(statement -> statement
+            .addPartitionKey(ID, DataType.timeuuid())
+            .addClusteringColumn(CLUSTERING, DataType.bigint()))
+        .build());
 
-    @BeforeClass
-    public static void setUpClass() {
-        CassandraModule modules = CassandraModule.table(TABLE_NAME)
-            .comment("Testing table")
-            .statement(statement -> statement
-                .addPartitionKey(ID, DataType.timeuuid())
-                .addClusteringColumn(CLUSTERING, DataType.bigint()))
-            .build();
-        cassandra = CassandraCluster.create(modules, cassandraServer.getHost());
-    }
+    private CassandraAsyncExecutor executor;
 
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         executor = new CassandraAsyncExecutor(cassandra.getConf());
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void pagingShouldWork() {
+    void pagingShouldWork() {
         int fetchSize = 200;
         int size = 2 * fetchSize + 50;
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionDAOTest.java
----------------------------------------------------------------------
diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionDAOTest.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionDAOTest.java
index 7db01dd..e5a0b8b 100644
--- a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionDAOTest.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionDAOTest.java
@@ -24,51 +24,31 @@ import static org.assertj.core.api.Assertions.assertThat;
 import java.util.Optional;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class CassandraSchemaVersionDAOTest {
-
-    @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-
-    private static CassandraCluster cassandra;
+class CassandraSchemaVersionDAOTest {
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraSchemaVersionModule.MODULE);
 
     private CassandraSchemaVersionDAO testee;
 
-    @BeforeClass
-    public static void setUpClass() {
-        cassandra = CassandraCluster.create(CassandraSchemaVersionModule.MODULE, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         testee = new CassandraSchemaVersionDAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION);
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void getCurrentSchemaVersionShouldReturnEmptyWhenTableIsEmpty() {
+    void getCurrentSchemaVersionShouldReturnEmptyWhenTableIsEmpty() {
         assertThat(testee.getCurrentSchemaVersion().join())
             .isEqualTo(Optional.empty());
     }
 
     @Test
-    public void getCurrentSchemaVersionShouldReturnVersionPresentInTheTable() {
+    void getCurrentSchemaVersionShouldReturnVersionPresentInTheTable() {
         SchemaVersion version = new SchemaVersion(42);
 
         testee.updateVersion(version).join();
@@ -77,7 +57,7 @@ public class CassandraSchemaVersionDAOTest {
     }
 
     @Test
-    public void getCurrentSchemaVersionShouldBeIdempotent() {
+    void getCurrentSchemaVersionShouldBeIdempotent() {
         SchemaVersion version = new SchemaVersion(42);
 
         testee.updateVersion(version.next()).join();

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraGenericEventStoreExtension.java
----------------------------------------------------------------------
diff --git a/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraGenericEventStoreExtension.java b/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraGenericEventStoreExtension.java
index 2f2650b..56eee29 100644
--- a/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraGenericEventStoreExtension.java
+++ b/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraGenericEventStoreExtension.java
@@ -21,9 +21,7 @@ package org.apache.james.eventsourcing.eventstore.cassandra;
 
 import java.util.Set;
 
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraExtension;
-import org.apache.james.backends.cassandra.DockerCassandraExtension.DockerCassandra;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.eventsourcing.eventstore.EventStore;
 import org.apache.james.eventsourcing.eventstore.cassandra.dto.EventDTOModule;
@@ -37,43 +35,37 @@ import org.junit.jupiter.api.extension.ParameterResolutionException;
 import org.junit.jupiter.api.extension.ParameterResolver;
 
 public class CassandraGenericEventStoreExtension implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback, ParameterResolver {
-    private final DockerCassandraExtension dockerCassandraExtension;
     @SuppressWarnings("rawtypes")
     private final Set<EventDTOModule> modules;
-    private CassandraCluster cassandra;
-    private DockerCassandra dockerCassandra;
+    private CassandraClusterExtension cassandra;
     private EventStoreDao eventStoreDao;
 
     public CassandraGenericEventStoreExtension(@SuppressWarnings("rawtypes") Set<EventDTOModule> modules) {
         this.modules = modules;
-        dockerCassandraExtension = new DockerCassandraExtension();
+        cassandra = new CassandraClusterExtension(CassandraEventStoreModule.MODULE);
     }
 
     @Override
-    public void beforeAll(ExtensionContext context) throws Exception {
-        dockerCassandraExtension.beforeAll(context);
-        dockerCassandra = dockerCassandraExtension.getDockerCassandra();
-        cassandra = CassandraCluster.create(
-            CassandraEventStoreModule.MODULE, dockerCassandra.getHost());
+    public void beforeAll(ExtensionContext context) {
+        cassandra.beforeAll(context);
     }
 
     @Override
-    public void afterAll(ExtensionContext context) throws Exception {
-        cassandra.closeCluster();
-        dockerCassandraExtension.afterAll(context);
+    public void afterAll(ExtensionContext context) {
+        cassandra.afterAll(context);
     }
 
     @Override
     public void beforeEach(ExtensionContext context) {
         JsonEventSerializer jsonEventSerializer = new JsonEventSerializer(modules);
 
-        eventStoreDao = new EventStoreDao(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION,
+        eventStoreDao = new EventStoreDao(cassandra.getCassandraCluster().getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION,
             jsonEventSerializer);
     }
 
     @Override
     public void afterEach(ExtensionContext context) {
-        cassandra.clearTables();
+        cassandra.afterEach(context);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/event/distributed/CassandraBasedRegisteredDistributedMailboxDelegatingListenerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/event/distributed/CassandraBasedRegisteredDistributedMailboxDelegatingListenerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/event/distributed/CassandraBasedRegisteredDistributedMailboxDelegatingListenerTest.java
index b1563d1..e5150b7 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/event/distributed/CassandraBasedRegisteredDistributedMailboxDelegatingListenerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/event/distributed/CassandraBasedRegisteredDistributedMailboxDelegatingListenerTest.java
@@ -24,7 +24,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import java.util.TreeMap;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.mailbox.MailboxListener;
 import org.apache.james.mailbox.MailboxSession;
@@ -46,12 +46,9 @@ import org.apache.james.mailbox.store.json.event.MailboxConverter;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
 import org.apache.james.mailbox.util.EventCollector;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.google.common.collect.ImmutableMap;
 
@@ -60,7 +57,7 @@ import com.google.common.collect.ImmutableMap;
 
  We simulate communications using message queues in memory and check the Listener works as intended.
  */
-public class CassandraBasedRegisteredDistributedMailboxDelegatingListenerTest {
+class CassandraBasedRegisteredDistributedMailboxDelegatingListenerTest {
 
     public static final MailboxPath MAILBOX_PATH_1 = MailboxPath.forUser("user", "mbx");
     public static final MailboxPath MAILBOX_PATH_2 = MailboxPath.forUser("user", "mbx.other");
@@ -68,9 +65,8 @@ public class CassandraBasedRegisteredDistributedMailboxDelegatingListenerTest {
     public static final int SCHEDULER_PERIOD_IN_S = 20;
     public static final ImmutableMap<MessageUid, MailboxMessage> EMPTY_MESSAGE_CACHE = ImmutableMap.of();
 
-    @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-    
-    private static CassandraCluster cassandra;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraRegistrationModule.MODULE);
 
     private RegisteredDelegatingMailboxListener registeredDelegatingMailboxListener1;
     private RegisteredDelegatingMailboxListener registeredDelegatingMailboxListener2;
@@ -83,13 +79,8 @@ public class CassandraBasedRegisteredDistributedMailboxDelegatingListenerTest {
     private EventCollector eventCollectorOnce3;
     private MailboxSession mailboxSession;
 
-    @BeforeClass
-    public static void setUpClass() {
-        cassandra = CassandraCluster.create(CassandraRegistrationModule.MODULE, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) throws Exception {
         PublisherReceiver publisherReceiver = new PublisherReceiver();
         DistantMailboxPathRegister mailboxPathRegister1 = new DistantMailboxPathRegister(
             new CassandraMailboxPathRegisterMapper(
@@ -145,18 +136,8 @@ public class CassandraBasedRegisteredDistributedMailboxDelegatingListenerTest {
         registeredDelegatingMailboxListener3.addListener(MAILBOX_PATH_2, eventCollectorMailbox3, mailboxSession);
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void mailboxEventListenersShouldBeTriggeredIfRegistered() throws Exception {
+    void mailboxEventListenersShouldBeTriggeredIfRegistered() {
         SimpleMailbox simpleMailbox = new SimpleMailbox(MAILBOX_PATH_1, 42);
         simpleMailbox.setMailboxId(TestId.of(52));
         TreeMap<MessageUid, MessageMetaData> uids = new TreeMap<>();
@@ -170,7 +151,7 @@ public class CassandraBasedRegisteredDistributedMailboxDelegatingListenerTest {
     }
 
     @Test
-    public void onceEventListenersShouldBeTriggeredOnceAcrossTheCluster() {
+    void onceEventListenersShouldBeTriggeredOnceAcrossTheCluster() {
         SimpleMailbox simpleMailbox = new SimpleMailbox(MAILBOX_PATH_1, 42);
         simpleMailbox.setMailboxId(TestId.of(52));
         TreeMap<MessageUid, MessageMetaData> uids = new TreeMap<>();

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/event/distributed/CassandraMailboxPathRegistrerMapperTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/event/distributed/CassandraMailboxPathRegistrerMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/event/distributed/CassandraMailboxPathRegistrerMapperTest.java
index 9a412ea..213006a 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/event/distributed/CassandraMailboxPathRegistrerMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/event/distributed/CassandraMailboxPathRegistrerMapperTest.java
@@ -24,23 +24,18 @@ import static org.assertj.core.api.Assertions.assertThat;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.mailbox.cassandra.modules.CassandraRegistrationModule;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.store.publisher.Topic;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class CassandraMailboxPathRegistrerMapperTest {
-
-    @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-
-    private static CassandraCluster cassandra;
+class CassandraMailboxPathRegistrerMapperTest {
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraRegistrationModule.MODULE);
 
     private static final MailboxPath MAILBOX_PATH = new MailboxPath("namespace", "user", "name");
     private static final MailboxPath MAILBOX_PATH_2 = new MailboxPath("namespace2", "user2", "name2");
@@ -50,76 +45,61 @@ public class CassandraMailboxPathRegistrerMapperTest {
 
     private CassandraMailboxPathRegisterMapper mapper;
 
-    @BeforeClass
-    public static void setUpClass() {
-        cassandra = CassandraCluster.create(CassandraRegistrationModule.MODULE, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         mapper = new CassandraMailboxPathRegisterMapper(cassandra.getConf(),
             cassandra.getTypesProvider(),
             CassandraUtils.WITH_DEFAULT_CONFIGURATION,
             CASSANDRA_TIME_OUT_IN_S);
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void getTopicsShouldReturnEmptyResultByDefault() {
+    void getTopicsShouldReturnEmptyResultByDefault() {
         assertThat(mapper.getTopics(MAILBOX_PATH)).isEmpty();
     }
 
     @Test
-    public void doRegisterShouldWork() {
+    void doRegisterShouldWork() {
         mapper.doRegister(MAILBOX_PATH, TOPIC);
         assertThat(mapper.getTopics(MAILBOX_PATH)).containsOnly(TOPIC);
     }
 
     @Test
-    public void doRegisterShouldBeMailboxPathSpecific() {
+    void doRegisterShouldBeMailboxPathSpecific() {
         mapper.doRegister(MAILBOX_PATH, TOPIC);
         assertThat(mapper.getTopics(MAILBOX_PATH_2)).isEmpty();
     }
 
     @Test
-    public void doRegisterShouldAllowMultipleTopics() {
+    void doRegisterShouldAllowMultipleTopics() {
         mapper.doRegister(MAILBOX_PATH, TOPIC);
         mapper.doRegister(MAILBOX_PATH, TOPIC_2);
         assertThat(mapper.getTopics(MAILBOX_PATH)).containsOnly(TOPIC, TOPIC_2);
     }
 
     @Test
-    public void doUnRegisterShouldWork() {
+    void doUnRegisterShouldWork() {
         mapper.doRegister(MAILBOX_PATH, TOPIC);
         mapper.doUnRegister(MAILBOX_PATH, TOPIC);
         assertThat(mapper.getTopics(MAILBOX_PATH)).isEmpty();
     }
 
     @Test
-    public void doUnregisterShouldBeMailboxSpecific() {
+    void doUnregisterShouldBeMailboxSpecific() {
         mapper.doRegister(MAILBOX_PATH, TOPIC);
         mapper.doUnRegister(MAILBOX_PATH_2, TOPIC);
         assertThat(mapper.getTopics(MAILBOX_PATH)).containsOnly(TOPIC);
     }
 
     @Test
-    public void doUnregisterShouldBeTopicSpecific() {
+    void doUnregisterShouldBeTopicSpecific() {
         mapper.doRegister(MAILBOX_PATH, TOPIC);
         mapper.doUnRegister(MAILBOX_PATH, TOPIC_2);
         assertThat(mapper.getTopics(MAILBOX_PATH)).containsOnly(TOPIC);
     }
 
     @Test
-    public void entriesShouldExpire() throws Exception {
+    void entriesShouldExpire(CassandraCluster cassandra) throws Exception {
         int verySmallTimeoutInSecond = 1;
         mapper = new CassandraMailboxPathRegisterMapper(cassandra.getConf(),
             cassandra.getTypesProvider(),

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java
index b38c212..cdea6fa 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java
@@ -31,7 +31,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
@@ -40,48 +40,35 @@ import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
 import org.apache.james.mailbox.cassandra.table.CassandraACLTable;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxACL;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class CassandraACLMapperTest {
+class CassandraACLMapperTest {
 
-    public static final CassandraId MAILBOX_ID = CassandraId.of(UUID.fromString("464765a0-e4e7-11e4-aba4-710c1de3782b"));
+    static final CassandraId MAILBOX_ID = CassandraId.of(UUID.fromString("464765a0-e4e7-11e4-aba4-710c1de3782b"));
 
-    @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-    private static CassandraCluster cassandra;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraAclModule.MODULE);
 
     private CassandraACLMapper cassandraACLMapper;
     private ExecutorService executor;
 
-    @BeforeClass
-    public static void setUpClass() {
-        cassandra = CassandraCluster.create(CassandraAclModule.MODULE, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         cassandraACLMapper = GuiceUtils.testInjector(cassandra)
             .getInstance(CassandraACLMapper.class);
         executor = Executors.newFixedThreadPool(2);
     }
 
-    @After
-    public void tearDown() {
+    @AfterEach
+    void tearDown() {
         executor.shutdownNow();
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
     }
 
     @Test
-    public void retrieveACLWhenInvalidInBaseShouldReturnEmptyACL() throws Exception {
+    void retrieveACLWhenInvalidInBaseShouldReturnEmptyACL(CassandraCluster cassandra) {
         cassandra.getConf().execute(
             insertInto(CassandraACLTable.TABLE_NAME)
                 .value(CassandraACLTable.ID, MAILBOX_ID.asUuid())
@@ -92,12 +79,12 @@ public class CassandraACLMapperTest {
     }
 
     @Test
-    public void retrieveACLWhenNoACLStoredShouldReturnEmptyACL() {
+    void retrieveACLWhenNoACLStoredShouldReturnEmptyACL() {
         assertThat(cassandraACLMapper.getACL(MAILBOX_ID).join()).isEqualTo(MailboxACL.EMPTY);
     }
 
     @Test
-    public void addACLWhenNoneStoredShouldReturnUpdatedACL() throws Exception {
+    void addACLWhenNoneStoredShouldReturnUpdatedACL() throws Exception {
         MailboxACL.EntryKey key = new MailboxACL.EntryKey("bob", MailboxACL.NameType.user, false);
         MailboxACL.Rfc4314Rights rights = new MailboxACL.Rfc4314Rights(MailboxACL.Right.Read);
 
@@ -109,7 +96,7 @@ public class CassandraACLMapperTest {
     }
 
     @Test
-    public void modifyACLWhenStoredShouldReturnUpdatedACL() throws MailboxException {
+    void modifyACLWhenStoredShouldReturnUpdatedACL() throws MailboxException {
         MailboxACL.EntryKey keyBob = new MailboxACL.EntryKey("bob", MailboxACL.NameType.user, false);
         MailboxACL.Rfc4314Rights rights = new MailboxACL.Rfc4314Rights(MailboxACL.Right.Read);
 
@@ -122,7 +109,7 @@ public class CassandraACLMapperTest {
     }
 
     @Test
-    public void removeWhenStoredShouldReturnUpdatedACL() throws MailboxException {
+    void removeWhenStoredShouldReturnUpdatedACL() throws MailboxException {
         MailboxACL.EntryKey key = new MailboxACL.EntryKey("bob", MailboxACL.NameType.user, false);
         MailboxACL.Rfc4314Rights rights = new MailboxACL.Rfc4314Rights(MailboxACL.Right.Read);
 
@@ -133,7 +120,7 @@ public class CassandraACLMapperTest {
     }
 
     @Test
-    public void replaceForSingleKeyWithNullRightsWhenSingleKeyStoredShouldReturnEmptyACL() throws MailboxException {
+    void replaceForSingleKeyWithNullRightsWhenSingleKeyStoredShouldReturnEmptyACL() throws MailboxException {
         MailboxACL.EntryKey key = new MailboxACL.EntryKey("bob", MailboxACL.NameType.user, false);
         MailboxACL.Rfc4314Rights rights = new MailboxACL.Rfc4314Rights(MailboxACL.Right.Read);
 
@@ -144,7 +131,7 @@ public class CassandraACLMapperTest {
     }
 
     @Test
-    public void replaceWhenNotStoredShouldUpdateACLEntry() throws MailboxException {
+    void replaceWhenNotStoredShouldUpdateACLEntry() throws MailboxException {
         MailboxACL.EntryKey key = new MailboxACL.EntryKey("bob", MailboxACL.NameType.user, false);
         MailboxACL.Rfc4314Rights rights = new MailboxACL.Rfc4314Rights(MailboxACL.Right.Read);
 
@@ -154,7 +141,7 @@ public class CassandraACLMapperTest {
     }
 
     @Test
-    public void updateInvalidACLShouldBeBasedOnEmptyACL() throws Exception {
+    void updateInvalidACLShouldBeBasedOnEmptyACL(CassandraCluster cassandra) throws Exception {
         cassandra.getConf().execute(
             insertInto(CassandraACLTable.TABLE_NAME)
                 .value(CassandraACLTable.ID, MAILBOX_ID.asUuid())
@@ -169,13 +156,13 @@ public class CassandraACLMapperTest {
     }
 
     @Test
-    public void twoConcurrentUpdatesWhenNoACEStoredShouldReturnACEWithTwoEntries() throws Exception {
+    void twoConcurrentUpdatesWhenNoACEStoredShouldReturnACEWithTwoEntries(CassandraCluster cassandra) throws Exception {
         CountDownLatch countDownLatch = new CountDownLatch(2);
         MailboxACL.EntryKey keyBob = new MailboxACL.EntryKey("bob", MailboxACL.NameType.user, false);
         MailboxACL.Rfc4314Rights rights = new MailboxACL.Rfc4314Rights(MailboxACL.Right.Read);
         MailboxACL.EntryKey keyAlice = new MailboxACL.EntryKey("alice", MailboxACL.NameType.user, false);
-        Future<Boolean> future1 = performACLUpdateInExecutor(executor, keyBob, rights, countDownLatch::countDown);
-        Future<Boolean> future2 = performACLUpdateInExecutor(executor, keyAlice, rights, countDownLatch::countDown);
+        Future<Boolean> future1 = performACLUpdateInExecutor(cassandra, executor, keyBob, rights, countDownLatch::countDown);
+        Future<Boolean> future2 = performACLUpdateInExecutor(cassandra, executor, keyAlice, rights, countDownLatch::countDown);
         awaitAll(future1, future2);
 
         assertThat(cassandraACLMapper.getACL(MAILBOX_ID).join())
@@ -183,7 +170,7 @@ public class CassandraACLMapperTest {
     }
 
     @Test
-    public void twoConcurrentUpdatesWhenStoredShouldReturnACEWithTwoEntries() throws Exception {
+    void twoConcurrentUpdatesWhenStoredShouldReturnACEWithTwoEntries(CassandraCluster cassandra) throws Exception {
         CountDownLatch countDownLatch = new CountDownLatch(2);
         MailboxACL.EntryKey keyBenwa = new MailboxACL.EntryKey("benwa", MailboxACL.NameType.user, false);
         MailboxACL.Rfc4314Rights rights = new MailboxACL.Rfc4314Rights(MailboxACL.Right.Read);
@@ -191,8 +178,8 @@ public class CassandraACLMapperTest {
 
         MailboxACL.EntryKey keyBob = new MailboxACL.EntryKey("bob", MailboxACL.NameType.user, false);
         MailboxACL.EntryKey keyAlice = new MailboxACL.EntryKey("alice", MailboxACL.NameType.user, false);
-        Future<Boolean> future1 = performACLUpdateInExecutor(executor, keyBob, rights, countDownLatch::countDown);
-        Future<Boolean> future2 = performACLUpdateInExecutor(executor, keyAlice, rights, countDownLatch::countDown);
+        Future<Boolean> future1 = performACLUpdateInExecutor(cassandra, executor, keyBob, rights, countDownLatch::countDown);
+        Future<Boolean> future2 = performACLUpdateInExecutor(cassandra, executor, keyAlice, rights, countDownLatch::countDown);
         awaitAll(future1, future2);
 
         assertThat(cassandraACLMapper.getACL(MAILBOX_ID).join())
@@ -206,7 +193,7 @@ public class CassandraACLMapperTest {
         }
     }
 
-    private Future<Boolean> performACLUpdateInExecutor(ExecutorService executor, MailboxACL.EntryKey key, MailboxACL.Rfc4314Rights rights, CassandraACLMapper.CodeInjector runnable) {
+    private Future<Boolean> performACLUpdateInExecutor(CassandraCluster cassandra, ExecutorService executor, MailboxACL.EntryKey key, MailboxACL.Rfc4314Rights rights, CassandraACLMapper.CodeInjector runnable) {
         return executor.submit(() -> {
             CassandraACLMapper aclMapper = new CassandraACLMapper(
                 cassandra.getConf(),

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAOTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAOTest.java
index 911d0d0..e2e4f62 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAOTest.java
@@ -24,59 +24,40 @@ import static org.assertj.core.api.Assertions.assertThat;
 import javax.mail.Flags;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.google.common.collect.ImmutableSet;
 
-public class CassandraApplicableFlagDAOTest {
+class CassandraApplicableFlagDAOTest {
 
-    public static final String USER_FLAG = "User Flag";
-    public static final String USER_FLAG2 = "User Flag 2";
-    public static final CassandraId CASSANDRA_ID = CassandraId.timeBased();
+    private static final String USER_FLAG = "User Flag";
+    private static final String USER_FLAG2 = "User Flag 2";
+    private static final CassandraId CASSANDRA_ID = CassandraId.timeBased();
 
-    @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-    
-    private static CassandraCluster cassandra;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraApplicableFlagsModule.MODULE);
 
     private CassandraApplicableFlagDAO testee;
 
-    @BeforeClass
-    public static void setUpClass() {
-        cassandra = CassandraCluster.create(CassandraApplicableFlagsModule.MODULE, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         testee = new CassandraApplicableFlagDAO(cassandra.getConf());
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void updateApplicableFlagsShouldReturnEmptyByDefault() throws Exception {
+    void updateApplicableFlagsShouldReturnEmptyByDefault() {
         assertThat(testee.retrieveApplicableFlag(CASSANDRA_ID).join())
             .isEmpty();
     }
 
     @Test
-    public void updateApplicableFlagsShouldSupportEmptyUserFlags() throws Exception {
+    void updateApplicableFlagsShouldSupportEmptyUserFlags() {
         testee.updateApplicableFlags(CASSANDRA_ID, ImmutableSet.of()).join();
 
         assertThat(testee.retrieveApplicableFlag(CASSANDRA_ID).join())
@@ -84,7 +65,7 @@ public class CassandraApplicableFlagDAOTest {
     }
 
     @Test
-    public void updateApplicableFlagsShouldUpdateUserFlag() throws Exception {
+    void updateApplicableFlagsShouldUpdateUserFlag() {
         testee.updateApplicableFlags(CASSANDRA_ID, ImmutableSet.of(USER_FLAG)).join();
 
         assertThat(testee.retrieveApplicableFlag(CASSANDRA_ID).join())
@@ -92,7 +73,7 @@ public class CassandraApplicableFlagDAOTest {
     }
 
     @Test
-    public void updateApplicableFlagsShouldUnionUserFlags() throws Exception {
+    void updateApplicableFlagsShouldUnionUserFlags() {
         testee.updateApplicableFlags(CASSANDRA_ID, ImmutableSet.of(USER_FLAG)).join();
         testee.updateApplicableFlags(CASSANDRA_ID, ImmutableSet.of(USER_FLAG2)).join();
 
@@ -101,7 +82,7 @@ public class CassandraApplicableFlagDAOTest {
     }
 
     @Test
-    public void updateApplicableFlagsShouldBeIdempotent() throws Exception {
+    void updateApplicableFlagsShouldBeIdempotent() {
         testee.updateApplicableFlags(CASSANDRA_ID, ImmutableSet.of(USER_FLAG)).join();
         testee.updateApplicableFlags(CASSANDRA_ID, ImmutableSet.of(USER_FLAG)).join();
 
@@ -110,7 +91,7 @@ public class CassandraApplicableFlagDAOTest {
     }
 
     @Test
-    public void updateApplicableFlagsShouldSkipAlreadyStoredFlagsWhenAddingFlag() throws Exception {
+    void updateApplicableFlagsShouldSkipAlreadyStoredFlagsWhenAddingFlag() {
         testee.updateApplicableFlags(CASSANDRA_ID, ImmutableSet.of(USER_FLAG)).join();
         testee.updateApplicableFlags(CASSANDRA_ID, ImmutableSet.of(USER_FLAG, USER_FLAG2)).join();
 
@@ -119,7 +100,7 @@ public class CassandraApplicableFlagDAOTest {
     }
 
     @Test
-    public void updateApplicableFlagsShouldUpdateMultiFlags() throws Exception {
+    void updateApplicableFlagsShouldUpdateMultiFlags() {
         testee.updateApplicableFlags(CASSANDRA_ID, ImmutableSet.of(USER_FLAG, USER_FLAG2)).join();
 
         assertThat(testee.retrieveApplicableFlag(CASSANDRA_ID).join())

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOTest.java
index f88406e..f82375e 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOTest.java
@@ -25,63 +25,43 @@ import java.nio.charset.StandardCharsets;
 import java.util.Optional;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
 import org.apache.james.mailbox.model.Attachment;
 import org.apache.james.mailbox.model.AttachmentId;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.github.steveash.guavate.Guavate;
 
-public class CassandraAttachmentDAOTest {
-    public static final AttachmentId ATTACHMENT_ID = AttachmentId.from("id1");
-    public static final AttachmentId ATTACHMENT_ID_2 = AttachmentId.from("id2");
+class CassandraAttachmentDAOTest {
+    private static final AttachmentId ATTACHMENT_ID = AttachmentId.from("id1");
+    private static final AttachmentId ATTACHMENT_ID_2 = AttachmentId.from("id2");
 
-    @ClassRule
-    public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-
-    private static CassandraCluster cassandra;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraAttachmentModule.MODULE);
 
     private CassandraAttachmentDAO testee;
 
-    @BeforeClass
-    public static void setUpClass() {
-        cassandra = CassandraCluster.create(CassandraAttachmentModule.MODULE, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         testee = new CassandraAttachmentDAO(cassandra.getConf(),
             CassandraUtils.WITH_DEFAULT_CONFIGURATION,
             CassandraConfiguration.DEFAULT_CONFIGURATION);
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void getAttachmentShouldReturnEmptyWhenAbsent() {
+    void getAttachmentShouldReturnEmptyWhenAbsent() {
         Optional<Attachment> attachment = testee.getAttachment(ATTACHMENT_ID).join();
 
         assertThat(attachment).isEmpty();
     }
 
     @Test
-    public void retrieveAllShouldReturnEmptyByDefault() {
+    void retrieveAllShouldReturnEmptyByDefault() {
         assertThat(
             testee.retrieveAll()
                 .collect(Guavate.toImmutableList()))
@@ -89,7 +69,7 @@ public class CassandraAttachmentDAOTest {
     }
 
     @Test
-    public void retrieveAllShouldReturnStoredAttachments() throws Exception {
+    void retrieveAllShouldReturnStoredAttachments() throws Exception {
         Attachment attachment1 = Attachment.builder()
             .attachmentId(ATTACHMENT_ID)
             .type("application/json")
@@ -110,7 +90,7 @@ public class CassandraAttachmentDAOTest {
     }
 
     @Test
-    public void getAttachmentShouldReturnAttachmentWhenStored() throws Exception {
+    void getAttachmentShouldReturnAttachmentWhenStored() throws Exception {
         Attachment attachment = Attachment.builder()
             .attachmentId(ATTACHMENT_ID)
             .type("application/json")
@@ -124,7 +104,7 @@ public class CassandraAttachmentDAOTest {
     }
 
     @Test
-    public void deleteAttachmentShouldRemoveAttachment() throws Exception {
+    void deleteAttachmentShouldRemoveAttachment() throws Exception {
         Attachment attachment = Attachment.builder()
             .attachmentId(ATTACHMENT_ID)
             .type("application/json")

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2Test.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2Test.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2Test.java
index 7471609..6e3b705 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2Test.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2Test.java
@@ -25,60 +25,40 @@ import java.nio.charset.StandardCharsets;
 import java.util.Optional;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.api.HashBlobId;
 import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAOV2.DAOAttachment;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
 import org.apache.james.mailbox.model.Attachment;
 import org.apache.james.mailbox.model.AttachmentId;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class CassandraAttachmentDAOV2Test {
-    public static final AttachmentId ATTACHMENT_ID = AttachmentId.from("id1");
+class CassandraAttachmentDAOV2Test {
+    private static final AttachmentId ATTACHMENT_ID = AttachmentId.from("id1");
     private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory();
 
-    @ClassRule
-    public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-
-    private static CassandraCluster cassandra;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraAttachmentModule.MODULE);
 
     private CassandraAttachmentDAOV2 testee;
 
-    @BeforeClass
-    public static void setUpClass() {
-        cassandra = CassandraCluster.create(CassandraAttachmentModule.MODULE, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         testee = new CassandraAttachmentDAOV2(BLOB_ID_FACTORY, cassandra.getConf());
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void getAttachmentShouldReturnEmptyWhenAbsent() {
+    void getAttachmentShouldReturnEmptyWhenAbsent() {
         Optional<DAOAttachment> attachment = testee.getAttachment(ATTACHMENT_ID).join();
 
         assertThat(attachment).isEmpty();
     }
 
     @Test
-    public void getAttachmentShouldReturnAttachmentWhenStored() throws Exception {
+    void getAttachmentShouldReturnAttachmentWhenStored() {
         Attachment attachment = Attachment.builder()
             .attachmentId(ATTACHMENT_ID)
             .type("application/json")

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentFallbackTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentFallbackTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentFallbackTest.java
index 0f8a85a..862ea95 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentFallbackTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentFallbackTest.java
@@ -25,7 +25,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import java.nio.charset.StandardCharsets;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
@@ -38,24 +38,22 @@ import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
 import org.apache.james.mailbox.exception.AttachmentNotFoundException;
 import org.apache.james.mailbox.model.Attachment;
 import org.apache.james.mailbox.model.AttachmentId;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.google.common.collect.ImmutableList;
 
-public class CassandraAttachmentFallbackTest {
-    public static final AttachmentId ATTACHMENT_ID_1 = AttachmentId.from("id1");
-    public static final AttachmentId ATTACHMENT_ID_2 = AttachmentId.from("id2");
+class CassandraAttachmentFallbackTest {
+    private static final AttachmentId ATTACHMENT_ID_1 = AttachmentId.from("id1");
+    private static final AttachmentId ATTACHMENT_ID_2 = AttachmentId.from("id2");
     private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory();
 
-    @ClassRule
-    public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-
-    private static CassandraCluster cassandra;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(
+        CassandraModule.aggregateModules(
+            CassandraAttachmentModule.MODULE,
+            CassandraBlobModule.MODULE));
 
     private CassandraAttachmentDAOV2 attachmentDAOV2;
     private CassandraAttachmentDAO attachmentDAO;
@@ -63,16 +61,9 @@ public class CassandraAttachmentFallbackTest {
     private CassandraBlobsDAO blobsDAO;
     private CassandraAttachmentMessageIdDAO attachmentMessageIdDAO;
 
-    @BeforeClass
-    public static void setUpClass() {
-        CassandraModule modules = CassandraModule.aggregateModules(
-            CassandraAttachmentModule.MODULE,
-            CassandraBlobModule.MODULE);
-        cassandra = CassandraCluster.create(modules, cassandraServer.getHost());
-    }
 
-    @Before
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         attachmentDAOV2 = new CassandraAttachmentDAOV2(BLOB_ID_FACTORY, cassandra.getConf());
         attachmentDAO = new CassandraAttachmentDAO(cassandra.getConf(),
             CassandraUtils.WITH_DEFAULT_CONFIGURATION,
@@ -83,30 +74,20 @@ public class CassandraAttachmentFallbackTest {
         attachmentMapper = new CassandraAttachmentMapper(attachmentDAO, attachmentDAOV2, blobsDAO, attachmentMessageIdDAO, ownerDAO);
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void getAttachmentShouldThrowWhenAbsentFromV1AndV2() throws Exception {
+    void getAttachmentShouldThrowWhenAbsentFromV1AndV2() {
         assertThatThrownBy(() -> attachmentMapper.getAttachment(ATTACHMENT_ID_1))
             .isInstanceOf(AttachmentNotFoundException.class);
     }
 
     @Test
-    public void getAttachmentsShouldReturnEmptyWhenAbsentFromV1AndV2() throws Exception {
+    void getAttachmentsShouldReturnEmptyWhenAbsentFromV1AndV2() {
         assertThat(attachmentMapper.getAttachments(ImmutableList.of(ATTACHMENT_ID_1)))
             .isEmpty();
     }
 
     @Test
-    public void getAttachmentShouldReturnV2WhenPresentInV1AndV2() throws Exception {
+    void getAttachmentShouldReturnV2WhenPresentInV1AndV2() throws Exception {
         Attachment attachment = Attachment.builder()
             .attachmentId(ATTACHMENT_ID_1)
             .type("application/json")
@@ -127,7 +108,7 @@ public class CassandraAttachmentFallbackTest {
     }
 
     @Test
-    public void getAttachmentShouldReturnV1WhenV2Absent() throws Exception {
+    void getAttachmentShouldReturnV1WhenV2Absent() throws Exception {
         Attachment attachment = Attachment.builder()
             .attachmentId(ATTACHMENT_ID_1)
             .type("application/json")
@@ -141,7 +122,7 @@ public class CassandraAttachmentFallbackTest {
     }
 
     @Test
-    public void getAttachmentsShouldReturnV2WhenV2AndV1() throws Exception {
+    void getAttachmentsShouldReturnV2WhenV2AndV1() throws Exception {
         Attachment attachment = Attachment.builder()
             .attachmentId(ATTACHMENT_ID_1)
             .type("application/json")
@@ -162,7 +143,7 @@ public class CassandraAttachmentFallbackTest {
     }
 
     @Test
-    public void getAttachmentsShouldReturnV1WhenV2Absent() throws Exception {
+    void getAttachmentsShouldReturnV1WhenV2Absent() throws Exception {
         Attachment attachment = Attachment.builder()
             .attachmentId(ATTACHMENT_ID_1)
             .type("application/json")
@@ -176,7 +157,7 @@ public class CassandraAttachmentFallbackTest {
     }
 
     @Test
-    public void getAttachmentsShouldCombineElementsFromV1AndV2() throws Exception {
+    void getAttachmentsShouldCombineElementsFromV1AndV2() throws Exception {
         Attachment attachment = Attachment.builder()
             .attachmentId(ATTACHMENT_ID_1)
             .type("application/json")

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAOTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAOTest.java
index 0164508..f7d7b5d 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAOTest.java
@@ -24,61 +24,41 @@ import static org.assertj.core.api.Assertions.assertThat;
 import java.util.stream.IntStream;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
 import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.store.mail.model.Username;
 import org.apache.james.util.FluentFutureStream;
 import org.apache.james.util.streams.JamesCollectors;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class CassandraAttachmentOwnerDAOTest {
-    public static final AttachmentId ATTACHMENT_ID = AttachmentId.from("id1");
-    public static final Username OWNER_1 = Username.fromRawValue("owner1");
-    public static final Username OWNER_2 = Username.fromRawValue("owner2");
+class CassandraAttachmentOwnerDAOTest {
+    private static final AttachmentId ATTACHMENT_ID = AttachmentId.from("id1");
+    private static final Username OWNER_1 = Username.fromRawValue("owner1");
+    private static final Username OWNER_2 = Username.fromRawValue("owner2");
 
-    @ClassRule
-    public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-
-    private static CassandraCluster cassandra;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraAttachmentModule.MODULE);
 
     private CassandraAttachmentOwnerDAO testee;
 
-    @BeforeClass
-    public static void setUpClass() {
-        cassandra = CassandraCluster.create(CassandraAttachmentModule.MODULE, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         testee = new CassandraAttachmentOwnerDAO(cassandra.getConf(),
             CassandraUtils.WITH_DEFAULT_CONFIGURATION);
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void retrieveOwnersShouldReturnEmptyByDefault() {
+    void retrieveOwnersShouldReturnEmptyByDefault() {
         assertThat(testee.retrieveOwners(ATTACHMENT_ID).join())
             .isEmpty();
     }
 
     @Test
-    public void retrieveOwnersShouldReturnAddedOwner() {
+    void retrieveOwnersShouldReturnAddedOwner() {
         testee.addOwner(ATTACHMENT_ID, OWNER_1).join();
 
         assertThat(testee.retrieveOwners(ATTACHMENT_ID).join())
@@ -86,7 +66,7 @@ public class CassandraAttachmentOwnerDAOTest {
     }
 
     @Test
-    public void retrieveOwnersShouldReturnAddedOwners() {
+    void retrieveOwnersShouldReturnAddedOwners() {
         testee.addOwner(ATTACHMENT_ID, OWNER_1).join();
         testee.addOwner(ATTACHMENT_ID, OWNER_2).join();
 
@@ -95,7 +75,7 @@ public class CassandraAttachmentOwnerDAOTest {
     }
 
     @Test
-    public void retrieveOwnersShouldNotThrowWhenMoreReferencesThanPaging() {
+    void retrieveOwnersShouldNotThrowWhenMoreReferencesThanPaging() {
         int referenceCountExceedingPaging = 5050;
 
         IntStream.range(0, referenceCountExceedingPaging)

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraDeletedMessageDAOTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraDeletedMessageDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraDeletedMessageDAOTest.java
index 913aef7..906f9c7 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraDeletedMessageDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraDeletedMessageDAOTest.java
@@ -25,57 +25,38 @@ import java.util.List;
 import java.util.UUID;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
 import org.apache.james.mailbox.model.MessageRange;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.github.steveash.guavate.Guavate;
 
-public class CassandraDeletedMessageDAOTest {
-    
-    public static final CassandraId MAILBOX_ID = CassandraId.of(UUID.fromString("110e8400-e29b-11d4-a716-446655440000"));
-    public static final MessageUid UID_1 = MessageUid.of(1);
-    public static final MessageUid UID_2 = MessageUid.of(2);
-    public static final MessageUid UID_3 = MessageUid.of(3);
-    public static final MessageUid UID_4 = MessageUid.of(4);
-    public static final MessageUid UID_7 = MessageUid.of(7);
-    public static final MessageUid UID_8 = MessageUid.of(8);
+class CassandraDeletedMessageDAOTest {
+    private static final CassandraId MAILBOX_ID = CassandraId.of(UUID.fromString("110e8400-e29b-11d4-a716-446655440000"));
+    private static final MessageUid UID_1 = MessageUid.of(1);
+    private static final MessageUid UID_2 = MessageUid.of(2);
+    private static final MessageUid UID_3 = MessageUid.of(3);
+    private static final MessageUid UID_4 = MessageUid.of(4);
+    private static final MessageUid UID_7 = MessageUid.of(7);
+    private static final MessageUid UID_8 = MessageUid.of(8);
 
-    @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-    private static CassandraCluster cassandra;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraDeletedMessageModule.MODULE);
 
     private CassandraDeletedMessageDAO testee;
 
-    @BeforeClass
-    public static void setUpClass() {
-        cassandra = CassandraCluster.create(CassandraDeletedMessageModule.MODULE, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         testee = new CassandraDeletedMessageDAO(cassandra.getConf());
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void retrieveDeletedMessageShouldReturnEmptyByDefault() {
+    void retrieveDeletedMessageShouldReturnEmptyByDefault() {
         List<MessageUid> result = testee
             .retrieveDeletedMessage(MAILBOX_ID, MessageRange.all())
             .join()
@@ -85,7 +66,7 @@ public class CassandraDeletedMessageDAOTest {
     }
 
     @Test
-    public void addDeletedMessageShouldThenBeReportedAsDeletedMessage() {
+    void addDeletedMessageShouldThenBeReportedAsDeletedMessage() {
         testee.addDeleted(MAILBOX_ID, UID_1).join();
         testee.addDeleted(MAILBOX_ID, UID_2).join();
 
@@ -97,7 +78,7 @@ public class CassandraDeletedMessageDAOTest {
     }
 
     @Test
-    public void addDeletedMessageShouldBeIdempotent() {
+    void addDeletedMessageShouldBeIdempotent() {
         testee.addDeleted(MAILBOX_ID, UID_1).join();
         testee.addDeleted(MAILBOX_ID, UID_1).join();
 
@@ -110,7 +91,7 @@ public class CassandraDeletedMessageDAOTest {
 
 
     @Test
-    public void removeUnreadShouldReturnEmptyWhenNoData() {
+    void removeUnreadShouldReturnEmptyWhenNoData() {
         testee.removeDeleted(MAILBOX_ID, UID_1).join();
 
         List<MessageUid> result = testee
@@ -122,7 +103,7 @@ public class CassandraDeletedMessageDAOTest {
     }
 
     @Test
-    public void removeDeletedMessageShouldNotAffectOtherMessage() {
+    void removeDeletedMessageShouldNotAffectOtherMessage() {
         testee.addDeleted(MAILBOX_ID, UID_2).join();
         testee.addDeleted(MAILBOX_ID, UID_1).join();
 
@@ -137,7 +118,7 @@ public class CassandraDeletedMessageDAOTest {
     }
 
     @Test
-    public void removeDeletedShouldRemoveSpecifiedUID() {
+    void removeDeletedShouldRemoveSpecifiedUID() {
         testee.addDeleted(MAILBOX_ID, UID_2).join();
 
         testee.removeDeleted(MAILBOX_ID, UID_2).join();
@@ -160,7 +141,7 @@ public class CassandraDeletedMessageDAOTest {
     }
 
     @Test
-    public void retrieveDeletedMessageShouldReturnAllMessageForMessageRangeAll() {
+    void retrieveDeletedMessageShouldReturnAllMessageForMessageRangeAll() {
         addMessageForRetrieveTest();
 
         List<MessageUid> result = testee
@@ -172,7 +153,7 @@ public class CassandraDeletedMessageDAOTest {
     }
 
     @Test
-    public void retrieveDeletedMessageShouldReturnOneMessageForMessageRangeOneIfThisMessageIsPresent() {
+    void retrieveDeletedMessageShouldReturnOneMessageForMessageRangeOneIfThisMessageIsPresent() {
         addMessageForRetrieveTest();
 
         List<MessageUid> result = testee
@@ -184,7 +165,7 @@ public class CassandraDeletedMessageDAOTest {
     }
 
     @Test
-    public void retrieveDeletedMessageShouldReturnNoMessageForMessageRangeOneIfThisMessageIsNotPresent() {
+    void retrieveDeletedMessageShouldReturnNoMessageForMessageRangeOneIfThisMessageIsNotPresent() {
         addMessageForRetrieveTest();
 
         List<MessageUid> result = testee
@@ -196,7 +177,7 @@ public class CassandraDeletedMessageDAOTest {
     }
 
     @Test
-    public void retrieveDeletedMessageShouldReturnMessageInRangeForMessageRangeRange() {
+    void retrieveDeletedMessageShouldReturnMessageInRangeForMessageRangeRange() {
         addMessageForRetrieveTest();
 
         List<MessageUid> result = testee
@@ -208,7 +189,7 @@ public class CassandraDeletedMessageDAOTest {
     }
 
     @Test
-    public void retrieveDeletedMessageShouldReturnNoMessageForMessageRangeRangeIfNoDeletedMessageInThatRange() {
+    void retrieveDeletedMessageShouldReturnNoMessageForMessageRangeRangeIfNoDeletedMessageInThatRange() {
         addMessageForRetrieveTest();
 
         List<MessageUid> result = testee
@@ -220,7 +201,7 @@ public class CassandraDeletedMessageDAOTest {
     }
 
     @Test
-    public void retrieveDeletedMessageShouldReturnNoMessageForMessageRangeFromIfNoDeletedMessageWithIdBiggerOrSameThanFrom() {
+    void retrieveDeletedMessageShouldReturnNoMessageForMessageRangeFromIfNoDeletedMessageWithIdBiggerOrSameThanFrom() {
         addMessageForRetrieveTest();
 
         List<MessageUid> result = testee
@@ -232,7 +213,7 @@ public class CassandraDeletedMessageDAOTest {
     }
 
     @Test
-    public void retrieveDeletedMessageShouldReturnDeletedMessageWithIdBiggerOrSameThanFrom() {
+    void retrieveDeletedMessageShouldReturnDeletedMessageWithIdBiggerOrSameThanFrom() {
         addMessageForRetrieveTest();
 
         List<MessageUid> result = testee

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAOTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAOTest.java
index 6aef33f..4fae89a 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAOTest.java
@@ -22,56 +22,37 @@ package org.apache.james.mailbox.cassandra.mail;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
-
-public class CassandraFirstUnseenDAOTest {
-    
-    public static final CassandraId MAILBOX_ID = CassandraId.timeBased();
-    public static final MessageUid UID_1 = MessageUid.of(1);
-    public static final MessageUid UID_2 = MessageUid.of(2);
-
-    @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-    private static CassandraCluster cassandra;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-    private CassandraFirstUnseenDAO testee;
-
-    @BeforeClass
-    public static void setUpClass() {
-        cassandra = CassandraCluster.create(CassandraFirstUnseenModule.MODULE, cassandraServer.getHost());
-    }
+class CassandraFirstUnseenDAOTest {
+    private static final CassandraId MAILBOX_ID = CassandraId.timeBased();
+    private static final MessageUid UID_1 = MessageUid.of(1);
+    private static final MessageUid UID_2 = MessageUid.of(2);
 
-    @Before
-    public void setUp() {
-        testee = new CassandraFirstUnseenDAO(cassandra.getConf());
-    }
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraFirstUnseenModule.MODULE);
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
+    private CassandraFirstUnseenDAO testee;
 
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
+        testee = new CassandraFirstUnseenDAO(cassandra.getConf());
     }
 
     @Test
-    public void retrieveFirstUnreadShouldReturnEmptyByDefault() {
+    void retrieveFirstUnreadShouldReturnEmptyByDefault() {
         assertThat(testee.retrieveFirstUnread(MAILBOX_ID).join().isPresent())
             .isFalse();
     }
 
     @Test
-    public void addUnreadShouldThenBeReportedAsFirstUnseen() {
+    void addUnreadShouldThenBeReportedAsFirstUnseen() {
         testee.addUnread(MAILBOX_ID, UID_1).join();
 
         assertThat(testee.retrieveFirstUnread(MAILBOX_ID).join())
@@ -79,7 +60,7 @@ public class CassandraFirstUnseenDAOTest {
     }
 
     @Test
-    public void retrieveFirstUnreadShouldReturnLowestUnreadUid() {
+    void retrieveFirstUnreadShouldReturnLowestUnreadUid() {
         testee.addUnread(MAILBOX_ID, UID_1).join();
 
         testee.addUnread(MAILBOX_ID, UID_2).join();
@@ -89,7 +70,7 @@ public class CassandraFirstUnseenDAOTest {
     }
 
     @Test
-    public void retrieveFirstUnreadShouldBeOrderIndependent() {
+    void retrieveFirstUnreadShouldBeOrderIndependent() {
         testee.addUnread(MAILBOX_ID, UID_2).join();
 
         testee.addUnread(MAILBOX_ID, UID_1).join();
@@ -99,7 +80,7 @@ public class CassandraFirstUnseenDAOTest {
     }
 
     @Test
-    public void addUnreadShouldBeIdempotent() {
+    void addUnreadShouldBeIdempotent() {
         testee.addUnread(MAILBOX_ID, UID_1).join();
 
         testee.addUnread(MAILBOX_ID, UID_1).join();
@@ -108,9 +89,8 @@ public class CassandraFirstUnseenDAOTest {
             .contains(UID_1);
     }
 
-
     @Test
-    public void removeUnreadShouldReturnWhenNoData() {
+    void removeUnreadShouldReturnWhenNoData() {
         testee.removeUnread(MAILBOX_ID, UID_1).join();
 
         assertThat(testee.retrieveFirstUnread(MAILBOX_ID).join())
@@ -118,7 +98,7 @@ public class CassandraFirstUnseenDAOTest {
     }
 
     @Test
-    public void removeUnreadShouldRemoveOnlyUnread() {
+    void removeUnreadShouldRemoveOnlyUnread() {
         testee.addUnread(MAILBOX_ID, UID_1).join();
 
         testee.removeUnread(MAILBOX_ID, UID_1).join();
@@ -128,7 +108,7 @@ public class CassandraFirstUnseenDAOTest {
     }
 
     @Test
-    public void removeUnreadShouldRemoveLastUnread() {
+    void removeUnreadShouldRemoveLastUnread() {
         testee.addUnread(MAILBOX_ID, UID_1).join();
         testee.addUnread(MAILBOX_ID, UID_2).join();
 
@@ -139,7 +119,7 @@ public class CassandraFirstUnseenDAOTest {
     }
 
     @Test
-    public void removeUnreadShouldHaveNoEffectWhenNotLast() {
+    void removeUnreadShouldHaveNoEffectWhenNotLast() {
         testee.addUnread(MAILBOX_ID, UID_1).join();
         testee.addUnread(MAILBOX_ID, UID_2).join();
 


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


[08/13] james-project git commit: JAMES-2544 Propose an extension for Cassandra cluster

Posted by bt...@apache.org.
JAMES-2544 Propose an extension for Cassandra cluster


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

Branch: refs/heads/master
Commit: 7023a2919f8ab287e09bc701d8d5e539d6d68ecb
Parents: d031739
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Sep 13 15:14:25 2018 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Sep 14 10:18:33 2018 +0700

----------------------------------------------------------------------
 .../cassandra/CassandraClusterExtension.java    | 71 ++++++++++++++++++++
 .../cassandra/CassandraActiveScriptDAOTest.java | 55 +++++----------
 2 files changed, 88 insertions(+), 38 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/7023a291/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraClusterExtension.java
----------------------------------------------------------------------
diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraClusterExtension.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraClusterExtension.java
new file mode 100644
index 0000000..c5b144f
--- /dev/null
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraClusterExtension.java
@@ -0,0 +1,71 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.backends.cassandra;
+
+import org.apache.james.backends.cassandra.components.CassandraModule;
+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.ExtensionContext;
+import org.junit.jupiter.api.extension.ParameterContext;
+import org.junit.jupiter.api.extension.ParameterResolutionException;
+import org.junit.jupiter.api.extension.ParameterResolver;
+
+public class CassandraClusterExtension implements BeforeAllCallback, AfterAllCallback, AfterEachCallback, ParameterResolver {
+    private final DockerCassandraExtension cassandraExtension;
+    private final CassandraModule cassandraModule;
+    private CassandraCluster cassandraCluster;
+
+    public CassandraClusterExtension(CassandraModule cassandraModule) {
+        this.cassandraModule = cassandraModule;
+        this.cassandraExtension = new DockerCassandraExtension();
+    }
+
+    @Override
+    public void beforeAll(ExtensionContext extensionContext) {
+        cassandraExtension.beforeAll(extensionContext);
+        cassandraCluster = CassandraCluster.create(cassandraModule, cassandraExtension.getDockerCassandra().getHost());
+    }
+
+    @Override
+    public void afterEach(ExtensionContext extensionContext) {
+        cassandraCluster.clearTables();
+    }
+
+    @Override
+    public void afterAll(ExtensionContext extensionContext) {
+        cassandraCluster.close();
+        cassandraExtension.afterAll(extensionContext);
+    }
+
+    @Override
+    public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
+        return (parameterContext.getParameter().getType() == CassandraCluster.class);
+    }
+
+    @Override
+    public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
+        return cassandraCluster;
+    }
+
+    public CassandraCluster getCassandraCluster() {
+        return cassandraCluster;
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/7023a291/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraActiveScriptDAOTest.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraActiveScriptDAOTest.java b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraActiveScriptDAOTest.java
index 4b973b9..2fd0426 100644
--- a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraActiveScriptDAOTest.java
+++ b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraActiveScriptDAOTest.java
@@ -24,56 +24,37 @@ import static org.assertj.core.api.Assertions.assertThat;
 import java.util.Optional;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.core.User;
 import org.apache.james.sieve.cassandra.model.ActiveScriptInfo;
 import org.apache.james.sieverepository.api.ScriptName;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class CassandraActiveScriptDAOTest {
+class CassandraActiveScriptDAOTest {
+    private static final User USER = User.fromUsername("user");
+    private static final ScriptName SCRIPT_NAME = new ScriptName("sciptName");
+    private static final ScriptName NEW_SCRIPT_NAME = new ScriptName("newScriptName");
 
-    public static final User USER = User.fromUsername("user");
-    public static final ScriptName SCRIPT_NAME = new ScriptName("sciptName");
-    public static final ScriptName NEW_SCRIPT_NAME = new ScriptName("newScriptName");
-
-    @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-    private static CassandraCluster cassandra;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraSieveRepositoryModule.MODULE);
 
     private CassandraActiveScriptDAO activeScriptDAO;
 
-    @BeforeClass
-    public static void setUpClass() {
-        cassandra = CassandraCluster.create(CassandraSieveRepositoryModule.MODULE, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         activeScriptDAO = new CassandraActiveScriptDAO(cassandra.getConf());
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void getActiveSctiptInfoShouldReturnEmptyByDefault() {
+    void getActiveSctiptInfoShouldReturnEmptyByDefault() {
         assertThat(activeScriptDAO.getActiveSctiptInfo(USER).join().isPresent())
             .isFalse();
     }
 
     @Test
-    public void getActiveSctiptInfoShouldReturnStoredName() {
+    void getActiveSctiptInfoShouldReturnStoredName() {
         activeScriptDAO.activate(USER, SCRIPT_NAME).join();
 
         Optional<ActiveScriptInfo> actual = activeScriptDAO.getActiveSctiptInfo(USER).join();
@@ -83,7 +64,7 @@ public class CassandraActiveScriptDAOTest {
     }
 
     @Test
-    public void activateShouldAllowRename() {
+    void activateShouldAllowRename() {
         activeScriptDAO.activate(USER, SCRIPT_NAME).join();
 
         activeScriptDAO.activate(USER, NEW_SCRIPT_NAME).join();
@@ -94,7 +75,7 @@ public class CassandraActiveScriptDAOTest {
     }
 
     @Test
-    public void unactivateShouldAllowRemovingActiveScript() {
+    void unactivateShouldAllowRemovingActiveScript() {
         activeScriptDAO.activate(USER, SCRIPT_NAME).join();
 
         activeScriptDAO.unactivate(USER).join();
@@ -103,13 +84,11 @@ public class CassandraActiveScriptDAOTest {
         assertThat(actual.isPresent()).isFalse();
     }
 
-
     @Test
-    public void unactivateShouldWorkWhenNoneStore() {
+    void unactivateShouldWorkWhenNoneStore() {
         activeScriptDAO.unactivate(USER).join();
 
         Optional<ActiveScriptInfo> actual = activeScriptDAO.getActiveSctiptInfo(USER).join();
         assertThat(actual.isPresent()).isFalse();
     }
-
 }


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


[05/13] james-project git commit: JAMES-2545 implement the healthcheck on top of channelpool

Posted by bt...@apache.org.
JAMES-2545 implement the healthcheck on top of channelpool


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

Branch: refs/heads/master
Commit: b847583c455ff7586e588f1f8a529b7fd548b536
Parents: 3313b53
Author: Matthieu Baechler <ma...@apache.org>
Authored: Mon Sep 10 18:22:26 2018 +0200
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Sep 14 10:17:42 2018 +0700

----------------------------------------------------------------------
 .../backend/rabbitmq/RabbitChannelPool.java     | 16 +++++++++----
 .../backend/rabbitmq/RabbitMQHealthCheck.java   | 24 +++++++++-----------
 .../rabbitmq/RabbitMQHealthCheckTest.java       | 13 ++++++-----
 3 files changed, 29 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/b847583c/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitChannelPool.java
----------------------------------------------------------------------
diff --git a/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitChannelPool.java b/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitChannelPool.java
index c4a9fe6..f6f4154 100644
--- a/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitChannelPool.java
+++ b/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitChannelPool.java
@@ -30,6 +30,12 @@ import com.rabbitmq.client.Connection;
 
 public class RabbitChannelPool {
 
+    public static class ConnectionFailedException extends RuntimeException {
+        public ConnectionFailedException(Throwable cause) {
+            super(cause);
+        }
+    }
+
     private static class ChannelBasePooledObjectFactory extends BasePooledObjectFactory<Channel> {
         private final Connection connection;
 
@@ -65,7 +71,7 @@ public class RabbitChannelPool {
             new ChannelBasePooledObjectFactory(connection));
     }
 
-    public <T, E extends Throwable> T execute(RabbitFunction<T, E> f) throws E {
+    public <T, E extends Throwable> T execute(RabbitFunction<T, E> f) throws E, ConnectionFailedException {
         Channel channel = borrowChannel();
         try {
             return f.execute(channel);
@@ -75,7 +81,7 @@ public class RabbitChannelPool {
     }
 
 
-    public <E extends Throwable> void execute(RabbitConsumer<E> f) throws E {
+    public <E extends Throwable> void execute(RabbitConsumer<E> f) throws E, ConnectionFailedException {
         Channel channel = borrowChannel();
         try {
             f.execute(channel);
@@ -88,15 +94,15 @@ public class RabbitChannelPool {
         try {
             return pool.borrowObject();
         } catch (Exception e) {
-            throw new RuntimeException(e);
+            throw new ConnectionFailedException(e);
         }
     }
 
     private void returnChannel(Channel channel) {
         try {
             pool.returnObject(channel);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
+        } catch (Exception ignore) {
+            //ignore when return is failing
         }
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/b847583c/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitMQHealthCheck.java
----------------------------------------------------------------------
diff --git a/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitMQHealthCheck.java b/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitMQHealthCheck.java
index b850e26..fd9f757 100644
--- a/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitMQHealthCheck.java
+++ b/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitMQHealthCheck.java
@@ -31,19 +31,15 @@ import org.apache.james.core.healthcheck.Result;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.rabbitmq.client.Connection;
-import com.rabbitmq.client.ConnectionFactory;
-
 public class RabbitMQHealthCheck implements HealthCheck {
     private static final Logger LOGGER = LoggerFactory.getLogger(RabbitMQHealthCheck.class);
     private static final ComponentName COMPONENT_NAME = new ComponentName("RabbitMQ backend");
 
-    private final ConnectionFactory connectionFactory;
+    private final RabbitChannelPool rabbitChannelPool;
 
     @Inject
-    public RabbitMQHealthCheck(RabbitMQConfiguration configuration) throws NoSuchAlgorithmException, KeyManagementException, URISyntaxException {
-        this.connectionFactory = new ConnectionFactory();
-        this.connectionFactory.setUri(configuration.getUri());
+    public RabbitMQHealthCheck(RabbitChannelPool rabbitChannelPool) throws NoSuchAlgorithmException, KeyManagementException, URISyntaxException {
+        this.rabbitChannelPool = rabbitChannelPool;
     }
 
     @Override
@@ -53,12 +49,14 @@ public class RabbitMQHealthCheck implements HealthCheck {
 
     @Override
     public Result check() {
-        try (Connection connection = connectionFactory.newConnection()) {
-            if (connection.isOpen()) {
-                return Result.healthy(COMPONENT_NAME);
-            }
-            LOGGER.error("The created connection was not opened");
-            return Result.unhealthy(COMPONENT_NAME);
+        try {
+            return rabbitChannelPool.execute(channel -> {
+                    if (channel.isOpen()) {
+                        return Result.healthy(COMPONENT_NAME);
+                    }
+                    LOGGER.error("The created connection was not opened");
+                    return Result.unhealthy(COMPONENT_NAME);
+            });
         } catch (Exception e) {
             LOGGER.error("Unhealthy RabbitMQ instances: could not establish a connection", e);
             return Result.unhealthy(COMPONENT_NAME);

http://git-wip-us.apache.org/repos/asf/james-project/blob/b847583c/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQHealthCheckTest.java
----------------------------------------------------------------------
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 4ba13fe..0938688 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
@@ -25,9 +25,12 @@ import java.net.URI;
 
 import org.apache.james.core.healthcheck.Result;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 
+import com.rabbitmq.client.ConnectionFactory;
+
 @ExtendWith(DockerRabbitMQExtension.class)
 class RabbitMQHealthCheckTest {
     private RabbitMQHealthCheck healthCheck;
@@ -35,13 +38,10 @@ class RabbitMQHealthCheckTest {
     @BeforeEach
     void setUp(DockerRabbitMQ rabbitMQ) throws Exception {
         URI amqpUri = URI.create("amqp://" + rabbitMQ.getHostIp() + ":" + rabbitMQ.getPort());
-        URI managementUri = URI.create("http://" + rabbitMQ.getHostIp() + ":" + rabbitMQ.getAdminPort());
-
+        ConnectionFactory connectionFactory = new ConnectionFactory();
+        connectionFactory.setUri(amqpUri);
         healthCheck = new RabbitMQHealthCheck(
-            RabbitMQConfiguration.builder()
-                .amqpUri(amqpUri)
-                .managementUri(managementUri)
-                .build());
+            new RabbitChannelPool(connectionFactory.newConnection()));
     }
 
     @Test
@@ -61,6 +61,7 @@ class RabbitMQHealthCheckTest {
     }
 
     @Test
+    @Disabled("connection don't recover instantly, we should try several time (depending on heartbeat rabbit conf")
     void checkShouldDetectWhenRabbitMQRecovered(DockerRabbitMQ rabbitMQ) throws Exception {
         rabbitMQ.stopApp();
         healthCheck.check();


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


[07/13] james-project git commit: JAMES-2545 Add retry connection parameters in RabbitMQ configuration

Posted by bt...@apache.org.
JAMES-2545 Add retry connection parameters in RabbitMQ configuration


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

Branch: refs/heads/master
Commit: f2da55f0b56020b2fbe7dee5cc3f6261ae20d331
Parents: f02def1
Author: Antoine Duprat <ad...@linagora.com>
Authored: Wed Sep 12 15:05:14 2018 +0200
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Sep 14 10:17:43 2018 +0700

----------------------------------------------------------------------
 .../backend/rabbitmq/RabbitMQConfiguration.java | 43 +++++++++++++++--
 .../rabbitmq/RabbitMQConfigurationTest.java     | 51 ++++++++++++++++++++
 2 files changed, 90 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/f2da55f0/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitMQConfiguration.java
----------------------------------------------------------------------
diff --git a/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitMQConfiguration.java b/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitMQConfiguration.java
index 4093431..650d6fc 100644
--- a/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitMQConfiguration.java
+++ b/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitMQConfiguration.java
@@ -20,6 +20,7 @@ package org.apache.james.backend.rabbitmq;
 
 import java.net.URI;
 import java.util.Objects;
+import java.util.Optional;
 
 import org.apache.commons.configuration.PropertiesConfiguration;
 
@@ -38,18 +39,38 @@ public class RabbitMQConfiguration {
     }
 
     public static class Builder {
+        public static final int DEFAULT_MAX_RETRIES = 7;
+        public static final int DEFAULT_MIN_DELAY = 3000;
+
         private final URI amqpUri;
         private final URI managementUri;
+        private Optional<Integer> maxRetries;
+        private Optional<Integer> minDelay;
 
         private Builder(URI amqpUri, URI managementUri) {
             this.amqpUri = amqpUri;
             this.managementUri = managementUri;
+            this.maxRetries = Optional.empty();
+            this.minDelay = Optional.empty();
+        }
+
+        public Builder maxRetries(int maxRetries) {
+            this.maxRetries = Optional.of(maxRetries);
+            return this;
+        }
+
+        public Builder minDelay(int minDelay) {
+            this.minDelay = Optional.of(minDelay);
+            return this;
         }
 
         public RabbitMQConfiguration build() {
             Preconditions.checkNotNull(amqpUri, "'amqpUri' should not be null");
             Preconditions.checkNotNull(managementUri, "'managementUri' should not be null");
-            return new RabbitMQConfiguration(amqpUri, managementUri);
+            return new RabbitMQConfiguration(amqpUri, 
+                    managementUri, 
+                    maxRetries.orElse(DEFAULT_MAX_RETRIES),
+                    minDelay.orElse(DEFAULT_MIN_DELAY));
         }
     }
 
@@ -85,10 +106,14 @@ public class RabbitMQConfiguration {
 
     private final URI uri;
     private final URI managementUri;
+    private final int maxRetries;
+    private final int minDelay;
 
-    private RabbitMQConfiguration(URI uri, URI managementUri) {
+    private RabbitMQConfiguration(URI uri, URI managementUri, int maxRetries, int minDelay) {
         this.uri = uri;
         this.managementUri = managementUri;
+        this.maxRetries = maxRetries;
+        this.minDelay = minDelay;
     }
 
     public URI getUri() {
@@ -99,19 +124,29 @@ public class RabbitMQConfiguration {
         return managementUri;
     }
 
+    public int getMaxRetries() {
+        return maxRetries;
+    }
+
+    public int getMinDelay() {
+        return minDelay;
+    }
+
     @Override
     public final boolean equals(Object o) {
         if (o instanceof RabbitMQConfiguration) {
             RabbitMQConfiguration that = (RabbitMQConfiguration) o;
 
             return Objects.equals(this.uri, that.uri)
-                && Objects.equals(this.managementUri, that.managementUri);
+                && Objects.equals(this.managementUri, that.managementUri)
+                && Objects.equals(this.maxRetries, that.maxRetries)
+                && Objects.equals(this.minDelay, that.minDelay);
         }
         return false;
     }
 
     @Override
     public final int hashCode() {
-        return Objects.hash(uri, managementUri);
+        return Objects.hash(uri, managementUri, maxRetries, minDelay);
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/f2da55f0/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQConfigurationTest.java
----------------------------------------------------------------------
diff --git a/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQConfigurationTest.java b/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQConfigurationTest.java
index 3066e48..7a1a747 100644
--- a/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQConfigurationTest.java
+++ b/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQConfigurationTest.java
@@ -22,6 +22,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.net.URI;
+import java.net.URISyntaxException;
 
 import org.apache.commons.configuration.PropertiesConfiguration;
 import org.junit.jupiter.api.Test;
@@ -131,4 +132,54 @@ class RabbitMQConfigurationTest {
                 .managementUri(URI.create(managementUri))
                 .build());
     }
+
+    @Test
+    void maxRetriesShouldEqualsDefaultValueWhenNotGiven() throws URISyntaxException {
+        RabbitMQConfiguration rabbitMQConfiguration = RabbitMQConfiguration.builder()
+            .amqpUri(new URI("amqp://james:james@rabbitmq_host:5672"))
+            .managementUri(new URI("http://james:james@rabbitmq_host:15672/api/"))
+            .build();
+
+        assertThat(rabbitMQConfiguration.getMaxRetries())
+            .isEqualTo(RabbitMQConfiguration.Builder.DEFAULT_MAX_RETRIES);
+    }
+
+    @Test
+    void maxRetriesShouldEqualsCustomValueWhenGiven() throws URISyntaxException {
+        int maxRetries = 1;
+
+        RabbitMQConfiguration rabbitMQConfiguration = RabbitMQConfiguration.builder()
+            .amqpUri(new URI("amqp://james:james@rabbitmq_host:5672"))
+            .managementUri(new URI("http://james:james@rabbitmq_host:15672/api/"))
+            .maxRetries(maxRetries)
+            .build();
+
+        assertThat(rabbitMQConfiguration.getMaxRetries())
+            .isEqualTo(maxRetries);
+    }
+
+    @Test
+    void minDelayShouldEqualsDefaultValueWhenNotGiven() throws URISyntaxException {
+        RabbitMQConfiguration rabbitMQConfiguration = RabbitMQConfiguration.builder()
+            .amqpUri(new URI("amqp://james:james@rabbitmq_host:5672"))
+            .managementUri(new URI("http://james:james@rabbitmq_host:15672/api/"))
+            .build();
+
+        assertThat(rabbitMQConfiguration.getMinDelay())
+            .isEqualTo(RabbitMQConfiguration.Builder.DEFAULT_MIN_DELAY);
+    }
+
+    @Test
+    void minDelayShouldEqualsCustomValueWhenGiven() throws URISyntaxException {
+        int minDelay = 1;
+
+        RabbitMQConfiguration rabbitMQConfiguration = RabbitMQConfiguration.builder()
+            .amqpUri(new URI("amqp://james:james@rabbitmq_host:5672"))
+            .managementUri(new URI("http://james:james@rabbitmq_host:15672/api/"))
+            .minDelay(minDelay)
+            .build();
+
+        assertThat(rabbitMQConfiguration.getMinDelay())
+            .isEqualTo(minDelay);
+    }
 }


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


[04/13] james-project git commit: JAMES-2545 Move RetryExecutorUtil in the utility project

Posted by bt...@apache.org.
JAMES-2545 Move RetryExecutorUtil in the utility project


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

Branch: refs/heads/master
Commit: f02def1d12aa44001ee70bb6281cf585bcdfa974
Parents: 3b570bc
Author: Antoine Duprat <ad...@linagora.com>
Authored: Wed Sep 12 14:39:45 2018 +0200
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Sep 14 10:17:42 2018 +0700

----------------------------------------------------------------------
 server/container/guice/cassandra-guice/pom.xml  |   4 +
 .../mailbox/ElasticSearchMailboxModule.java     |   2 +-
 .../mailbox/ResilientClusterProvider.java       |   2 +-
 server/container/guice/guice-common/pom.xml     |   4 -
 .../apache/james/utils/RetryExecutorUtil.java   |  44 -------
 .../org/apache/james/utils/FaultyService.java   |  24 ----
 .../james/utils/RetryExecutorUtilTest.java      | 127 -------------------
 server/container/util/pom.xml                   |   9 ++
 .../apache/james/util/retry/FaultyService.java  |  24 ++++
 .../james/util/retry/RetryExecutorUtil.java     |  44 +++++++
 .../james/util/retry/RetryExecutorUtilTest.java | 127 +++++++++++++++++++
 11 files changed, 210 insertions(+), 201 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/f02def1d/server/container/guice/cassandra-guice/pom.xml
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/pom.xml b/server/container/guice/cassandra-guice/pom.xml
index 896c2f0..d13b33f 100644
--- a/server/container/guice/cassandra-guice/pom.xml
+++ b/server/container/guice/cassandra-guice/pom.xml
@@ -215,6 +215,10 @@
         <dependency>
             <groupId>${james.groupId}</groupId>
             <artifactId>james-server-util</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>james-server-util</artifactId>
             <type>test-jar</type>
             <scope>test</scope>
         </dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/f02def1d/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModule.java
index 5bfd220..ee6529d 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModule.java
@@ -44,8 +44,8 @@ import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.store.search.ListeningMessageSearchIndex;
 import org.apache.james.mailbox.store.search.MessageSearchIndex;
 import org.apache.james.quota.search.elasticsearch.QuotaSearchIndexCreationUtil;
+import org.apache.james.util.retry.RetryExecutorUtil;
 import org.apache.james.utils.PropertiesProvider;
-import org.apache.james.utils.RetryExecutorUtil;
 import org.elasticsearch.client.Client;
 import org.elasticsearch.client.transport.NoNodeAvailableException;
 import org.slf4j.Logger;

http://git-wip-us.apache.org/repos/asf/james-project/blob/f02def1d/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ResilientClusterProvider.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ResilientClusterProvider.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ResilientClusterProvider.java
index fa9a81e..ef2e4a8 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ResilientClusterProvider.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ResilientClusterProvider.java
@@ -30,7 +30,7 @@ import javax.inject.Singleton;
 import org.apache.james.backends.cassandra.init.ClusterBuilder;
 import org.apache.james.backends.cassandra.init.ClusterWithKeyspaceCreatedFactory;
 import org.apache.james.backends.cassandra.init.configuration.ClusterConfiguration;
-import org.apache.james.utils.RetryExecutorUtil;
+import org.apache.james.util.retry.RetryExecutorUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/f02def1d/server/container/guice/guice-common/pom.xml
----------------------------------------------------------------------
diff --git a/server/container/guice/guice-common/pom.xml b/server/container/guice/guice-common/pom.xml
index d2333e7..8e64644 100644
--- a/server/container/guice/guice-common/pom.xml
+++ b/server/container/guice/guice-common/pom.xml
@@ -171,10 +171,6 @@
             <artifactId>guice-multibindings</artifactId>
         </dependency>
         <dependency>
-            <groupId>com.nurkiewicz.asyncretry</groupId>
-            <artifactId>asyncretry</artifactId>
-        </dependency>
-        <dependency>
             <groupId>io.rest-assured</groupId>
             <artifactId>rest-assured</artifactId>
             <scope>test</scope>

http://git-wip-us.apache.org/repos/asf/james-project/blob/f02def1d/server/container/guice/guice-common/src/main/java/org/apache/james/utils/RetryExecutorUtil.java
----------------------------------------------------------------------
diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/utils/RetryExecutorUtil.java b/server/container/guice/guice-common/src/main/java/org/apache/james/utils/RetryExecutorUtil.java
deleted file mode 100644
index b4b218f..0000000
--- a/server/container/guice/guice-common/src/main/java/org/apache/james/utils/RetryExecutorUtil.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- * http://www.apache.org/licenses/LICENSE-2.0                   *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.utils;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.nurkiewicz.asyncretry.AsyncRetryExecutor;
-
-public class RetryExecutorUtil {
-    private static final Logger LOG = LoggerFactory.getLogger(RetryExecutorUtil.class);
-
-    private static final int INITIAL_DELAY_MILLIS = 500;
-    private static final int MULTIPLIER = 2;
-
-    @SafeVarargs
-    public static AsyncRetryExecutor retryOnExceptions(AsyncRetryExecutor executor, int maxRetries, int minDelay, Class<? extends Throwable>... clazz) {
-        LOG.info("The action should retry when {} and retry to {} times if needed", clazz, maxRetries);
-        return executor
-            .withExponentialBackoff(INITIAL_DELAY_MILLIS, MULTIPLIER)
-            .withProportionalJitter()
-            .retryOn(clazz)
-            .withMaxRetries(maxRetries)
-            .withMinDelay(minDelay);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/f02def1d/server/container/guice/guice-common/src/test/java/org/apache/james/utils/FaultyService.java
----------------------------------------------------------------------
diff --git a/server/container/guice/guice-common/src/test/java/org/apache/james/utils/FaultyService.java b/server/container/guice/guice-common/src/test/java/org/apache/james/utils/FaultyService.java
deleted file mode 100644
index 12d8f92..0000000
--- a/server/container/guice/guice-common/src/test/java/org/apache/james/utils/FaultyService.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- * http://www.apache.org/licenses/LICENSE-2.0                   *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.utils;
-
-public interface FaultyService {
-    String faultyService();
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/f02def1d/server/container/guice/guice-common/src/test/java/org/apache/james/utils/RetryExecutorUtilTest.java
----------------------------------------------------------------------
diff --git a/server/container/guice/guice-common/src/test/java/org/apache/james/utils/RetryExecutorUtilTest.java b/server/container/guice/guice-common/src/test/java/org/apache/james/utils/RetryExecutorUtilTest.java
deleted file mode 100644
index dac929e..0000000
--- a/server/container/guice/guice-common/src/test/java/org/apache/james/utils/RetryExecutorUtilTest.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- * http://www.apache.org/licenses/LICENSE-2.0                   *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.utils;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.mockito.BDDMockito.given;
-
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import com.nurkiewicz.asyncretry.AsyncRetryExecutor;
-import com.nurkiewicz.asyncretry.RetryExecutor;
-
-public class RetryExecutorUtilTest {
-    private static final int MAX_RETRIES = 3;
-    private static final int MIN_DELAY = 100;
-    @Mock
-    protected FaultyService serviceMock;
-
-    private RetryExecutor retryExecutor;
-    private ScheduledExecutorService scheduledExecutor;
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-        scheduledExecutor = Executors.newSingleThreadScheduledExecutor();
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        scheduledExecutor.shutdownNow();
-    }
-
-    @Test
-    public void retryOnExceptionsAndExecuteShouldRethrowWhenScheduledServiceAlwaysThrowException() throws Exception {
-        given(serviceMock.faultyService())
-                .willThrow(IllegalArgumentException.class)
-                .willThrow(IllegalArgumentException.class)
-                .willThrow(IllegalArgumentException.class)
-                .willThrow(IllegalArgumentException.class);
-
-        retryExecutor = RetryExecutorUtil.retryOnExceptions(new AsyncRetryExecutor(scheduledExecutor), MAX_RETRIES, MIN_DELAY, IllegalArgumentException.class);
-
-        assertThatThrownBy(() -> retryExecutor.getWithRetry(serviceMock::faultyService).get())
-            .isInstanceOf(ExecutionException.class)
-            .hasCauseInstanceOf(IllegalArgumentException.class);
-    }
-
-    @Test
-    public void retryOnExceptionsAndExecuteShouldRetryWhenMatchExceptionAndSuccess() throws Exception {
-        given(serviceMock.faultyService())
-                .willThrow(IllegalArgumentException.class)
-                .willReturn("Foo");
-        retryExecutor = RetryExecutorUtil.retryOnExceptions(new AsyncRetryExecutor(scheduledExecutor), MAX_RETRIES, MIN_DELAY, IllegalArgumentException.class);
-
-        final CompletableFuture<String> future = retryExecutor.getWithRetry(serviceMock::faultyService);
-
-        assertThat(future.get()).isEqualTo("Foo");
-    }
-
-    @Test
-    public void retryOnExceptionsAndExecuteShouldNotRetryWhenDoesNotMatchException() throws Exception {
-        given(serviceMock.faultyService())
-                .willThrow(IllegalStateException.class)
-                .willReturn("Foo");
-
-        retryExecutor = RetryExecutorUtil.retryOnExceptions(new AsyncRetryExecutor(scheduledExecutor), MAX_RETRIES, MIN_DELAY, IllegalArgumentException.class);
-
-        assertThatThrownBy(() -> retryExecutor.getWithRetry(serviceMock::faultyService).get())
-                .isInstanceOf(ExecutionException.class)
-                .hasCauseInstanceOf(IllegalStateException.class);
-    }
-
-    @Test
-    @SuppressWarnings("unchecked")
-    public void retryOnExceptionsAndExecuteShouldRetryWithMaxTimesAndReturnValue() throws Exception {
-        given(serviceMock.faultyService())
-                .willThrow(IllegalStateException.class, IllegalStateException.class, IllegalStateException.class)
-                .willReturn("Foo");
-
-        retryExecutor = RetryExecutorUtil.retryOnExceptions(new AsyncRetryExecutor(scheduledExecutor), MAX_RETRIES, MIN_DELAY, IllegalStateException.class);
-
-        CompletableFuture<String> future = retryExecutor.getWithRetry(serviceMock::faultyService);
-
-        assertThat(future.get()).isEqualTo("Foo");
-    }
-
-    @Test
-    @SuppressWarnings("unchecked")
-    public void retryOnExceptionsAndExecuteShouldFailIfFailMoreThanMaxRetry() throws Exception {
-        given(serviceMock.faultyService())
-            .willThrow(IllegalStateException.class, IllegalStateException.class, IllegalStateException.class, IllegalStateException.class)
-            .willReturn("Foo");
-
-        retryExecutor = RetryExecutorUtil.retryOnExceptions(new AsyncRetryExecutor(scheduledExecutor), MAX_RETRIES, MIN_DELAY, IllegalStateException.class);
-
-        assertThatThrownBy(() -> retryExecutor.getWithRetry(serviceMock::faultyService).get())
-                .isInstanceOf(ExecutionException.class)
-                .hasCauseInstanceOf(IllegalStateException.class);
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/f02def1d/server/container/util/pom.xml
----------------------------------------------------------------------
diff --git a/server/container/util/pom.xml b/server/container/util/pom.xml
index 8e367d1..939a670 100644
--- a/server/container/util/pom.xml
+++ b/server/container/util/pom.xml
@@ -59,6 +59,10 @@
             <artifactId>icu4j</artifactId>
         </dependency>
         <dependency>
+            <groupId>com.nurkiewicz.asyncretry</groupId>
+            <artifactId>asyncretry</artifactId>
+        </dependency>
+        <dependency>
             <groupId>com.sun.mail</groupId>
             <artifactId>javax.mail</artifactId>
         </dependency>
@@ -100,6 +104,11 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
         </dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/f02def1d/server/container/util/src/main/java/org/apache/james/util/retry/FaultyService.java
----------------------------------------------------------------------
diff --git a/server/container/util/src/main/java/org/apache/james/util/retry/FaultyService.java b/server/container/util/src/main/java/org/apache/james/util/retry/FaultyService.java
new file mode 100644
index 0000000..f8c85e6
--- /dev/null
+++ b/server/container/util/src/main/java/org/apache/james/util/retry/FaultyService.java
@@ -0,0 +1,24 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ * http://www.apache.org/licenses/LICENSE-2.0                   *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.util.retry;
+
+public interface FaultyService {
+    String faultyService();
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/f02def1d/server/container/util/src/main/java/org/apache/james/util/retry/RetryExecutorUtil.java
----------------------------------------------------------------------
diff --git a/server/container/util/src/main/java/org/apache/james/util/retry/RetryExecutorUtil.java b/server/container/util/src/main/java/org/apache/james/util/retry/RetryExecutorUtil.java
new file mode 100644
index 0000000..34bdcf9
--- /dev/null
+++ b/server/container/util/src/main/java/org/apache/james/util/retry/RetryExecutorUtil.java
@@ -0,0 +1,44 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ * http://www.apache.org/licenses/LICENSE-2.0                   *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.util.retry;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.nurkiewicz.asyncretry.AsyncRetryExecutor;
+
+public class RetryExecutorUtil {
+    private static final Logger LOG = LoggerFactory.getLogger(RetryExecutorUtil.class);
+
+    private static final int INITIAL_DELAY_MILLIS = 500;
+    private static final int MULTIPLIER = 2;
+
+    @SafeVarargs
+    public static AsyncRetryExecutor retryOnExceptions(AsyncRetryExecutor executor, int maxRetries, int minDelay, Class<? extends Throwable>... clazz) {
+        LOG.info("The action should retry when {} and retry to {} times if needed", clazz, maxRetries);
+        return executor
+            .withExponentialBackoff(INITIAL_DELAY_MILLIS, MULTIPLIER)
+            .withProportionalJitter()
+            .retryOn(clazz)
+            .withMaxRetries(maxRetries)
+            .withMinDelay(minDelay);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/f02def1d/server/container/util/src/test/java/org/apache/james/util/retry/RetryExecutorUtilTest.java
----------------------------------------------------------------------
diff --git a/server/container/util/src/test/java/org/apache/james/util/retry/RetryExecutorUtilTest.java b/server/container/util/src/test/java/org/apache/james/util/retry/RetryExecutorUtilTest.java
new file mode 100644
index 0000000..81c2f11
--- /dev/null
+++ b/server/container/util/src/test/java/org/apache/james/util/retry/RetryExecutorUtilTest.java
@@ -0,0 +1,127 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ * http://www.apache.org/licenses/LICENSE-2.0                   *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.util.retry;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.mockito.BDDMockito.given;
+
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import com.nurkiewicz.asyncretry.AsyncRetryExecutor;
+import com.nurkiewicz.asyncretry.RetryExecutor;
+
+public class RetryExecutorUtilTest {
+    private static final int MAX_RETRIES = 3;
+    private static final int MIN_DELAY = 100;
+    @Mock
+    protected FaultyService serviceMock;
+
+    private RetryExecutor retryExecutor;
+    private ScheduledExecutorService scheduledExecutor;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        scheduledExecutor = Executors.newSingleThreadScheduledExecutor();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        scheduledExecutor.shutdownNow();
+    }
+
+    @Test
+    public void retryOnExceptionsAndExecuteShouldRethrowWhenScheduledServiceAlwaysThrowException() throws Exception {
+        given(serviceMock.faultyService())
+                .willThrow(IllegalArgumentException.class)
+                .willThrow(IllegalArgumentException.class)
+                .willThrow(IllegalArgumentException.class)
+                .willThrow(IllegalArgumentException.class);
+
+        retryExecutor = RetryExecutorUtil.retryOnExceptions(new AsyncRetryExecutor(scheduledExecutor), MAX_RETRIES, MIN_DELAY, IllegalArgumentException.class);
+
+        assertThatThrownBy(() -> retryExecutor.getWithRetry(serviceMock::faultyService).get())
+            .isInstanceOf(ExecutionException.class)
+            .hasCauseInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    public void retryOnExceptionsAndExecuteShouldRetryWhenMatchExceptionAndSuccess() throws Exception {
+        given(serviceMock.faultyService())
+                .willThrow(IllegalArgumentException.class)
+                .willReturn("Foo");
+        retryExecutor = RetryExecutorUtil.retryOnExceptions(new AsyncRetryExecutor(scheduledExecutor), MAX_RETRIES, MIN_DELAY, IllegalArgumentException.class);
+
+        final CompletableFuture<String> future = retryExecutor.getWithRetry(serviceMock::faultyService);
+
+        assertThat(future.get()).isEqualTo("Foo");
+    }
+
+    @Test
+    public void retryOnExceptionsAndExecuteShouldNotRetryWhenDoesNotMatchException() throws Exception {
+        given(serviceMock.faultyService())
+                .willThrow(IllegalStateException.class)
+                .willReturn("Foo");
+
+        retryExecutor = RetryExecutorUtil.retryOnExceptions(new AsyncRetryExecutor(scheduledExecutor), MAX_RETRIES, MIN_DELAY, IllegalArgumentException.class);
+
+        assertThatThrownBy(() -> retryExecutor.getWithRetry(serviceMock::faultyService).get())
+                .isInstanceOf(ExecutionException.class)
+                .hasCauseInstanceOf(IllegalStateException.class);
+    }
+
+    @Test
+    @SuppressWarnings("unchecked")
+    public void retryOnExceptionsAndExecuteShouldRetryWithMaxTimesAndReturnValue() throws Exception {
+        given(serviceMock.faultyService())
+                .willThrow(IllegalStateException.class, IllegalStateException.class, IllegalStateException.class)
+                .willReturn("Foo");
+
+        retryExecutor = RetryExecutorUtil.retryOnExceptions(new AsyncRetryExecutor(scheduledExecutor), MAX_RETRIES, MIN_DELAY, IllegalStateException.class);
+
+        CompletableFuture<String> future = retryExecutor.getWithRetry(serviceMock::faultyService);
+
+        assertThat(future.get()).isEqualTo("Foo");
+    }
+
+    @Test
+    @SuppressWarnings("unchecked")
+    public void retryOnExceptionsAndExecuteShouldFailIfFailMoreThanMaxRetry() throws Exception {
+        given(serviceMock.faultyService())
+            .willThrow(IllegalStateException.class, IllegalStateException.class, IllegalStateException.class, IllegalStateException.class)
+            .willReturn("Foo");
+
+        retryExecutor = RetryExecutorUtil.retryOnExceptions(new AsyncRetryExecutor(scheduledExecutor), MAX_RETRIES, MIN_DELAY, IllegalStateException.class);
+
+        assertThatThrownBy(() -> retryExecutor.getWithRetry(serviceMock::faultyService).get())
+                .isInstanceOf(ExecutionException.class)
+                .hasCauseInstanceOf(IllegalStateException.class);
+    }
+}
\ No newline at end of file


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


[13/13] james-project git commit: JAMES-2545 Retry connection to RabbitMQ

Posted by bt...@apache.org.
JAMES-2545 Retry connection to RabbitMQ


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

Branch: refs/heads/master
Commit: d031739fde64b7234c9c806e00fdcadd0c431524
Parents: f2da55f
Author: Antoine Duprat <ad...@linagora.com>
Authored: Wed Sep 12 15:33:12 2018 +0200
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Sep 14 10:18:33 2018 +0700

----------------------------------------------------------------------
 backends-common/rabbitmq/pom.xml                |  1 -
 .../backend/rabbitmq/RabbitChannelPool.java     | 21 +++++++++++-----
 .../rabbitmq/RabbitMQConnectionFactory.java     | 25 +++++++++++++-------
 .../rabbitmq/RabbitMQConnectionFactoryTest.java | 20 +++++++++++++---
 .../rabbitmq/RabbitMQHealthCheckTest.java       | 19 ++++++++++-----
 .../queue/rabbitmq/RabbitMQMailQueueTest.java   | 21 +++++++++++++++-
 .../rabbitmq/RabbitMqMailQueueFactoryTest.java  | 21 +++++++++++++++-
 7 files changed, 101 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/d031739f/backends-common/rabbitmq/pom.xml
----------------------------------------------------------------------
diff --git a/backends-common/rabbitmq/pom.xml b/backends-common/rabbitmq/pom.xml
index 9583901..d260153 100644
--- a/backends-common/rabbitmq/pom.xml
+++ b/backends-common/rabbitmq/pom.xml
@@ -43,7 +43,6 @@
         <dependency>
             <groupId>${james.groupId}</groupId>
             <artifactId>james-server-util</artifactId>
-            <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>com.google.guava</groupId>

http://git-wip-us.apache.org/repos/asf/james-project/blob/d031739f/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitChannelPool.java
----------------------------------------------------------------------
diff --git a/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitChannelPool.java b/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitChannelPool.java
index f6f4154..9db1a19 100644
--- a/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitChannelPool.java
+++ b/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitChannelPool.java
@@ -19,12 +19,18 @@
 
 package org.apache.james.backend.rabbitmq;
 
+import java.util.function.Supplier;
+
+import javax.inject.Inject;
+
 import org.apache.commons.pool2.BasePooledObjectFactory;
 import org.apache.commons.pool2.ObjectPool;
 import org.apache.commons.pool2.PooledObject;
 import org.apache.commons.pool2.impl.DefaultPooledObject;
 import org.apache.commons.pool2.impl.GenericObjectPool;
+import org.apache.james.util.MemoizedSupplier;
 
+import com.github.fge.lambdas.Throwing;
 import com.rabbitmq.client.Channel;
 import com.rabbitmq.client.Connection;
 
@@ -37,15 +43,17 @@ public class RabbitChannelPool {
     }
 
     private static class ChannelBasePooledObjectFactory extends BasePooledObjectFactory<Channel> {
-        private final Connection connection;
+        private final Supplier<Connection> connection;
 
-        public ChannelBasePooledObjectFactory(Connection connection) {
-            this.connection = connection;
+        public ChannelBasePooledObjectFactory(RabbitMQConnectionFactory factory) {
+            this.connection = MemoizedSupplier.of(
+                    Throwing.supplier(() -> factory.create()).sneakyThrow());
         }
 
         @Override
         public Channel create() throws Exception {
-            return connection.createChannel();
+            return connection.get()
+                    .createChannel();
         }
 
         @Override
@@ -66,9 +74,10 @@ public class RabbitChannelPool {
 
     private final ObjectPool<Channel> pool;
 
-    public RabbitChannelPool(Connection connection) {
+    @Inject
+    public RabbitChannelPool(RabbitMQConnectionFactory factory) {
         pool = new GenericObjectPool<>(
-            new ChannelBasePooledObjectFactory(connection));
+            new ChannelBasePooledObjectFactory(factory));
     }
 
     public <T, E extends Throwable> T execute(RabbitFunction<T, E> f) throws E, ConnectionFailedException {

http://git-wip-us.apache.org/repos/asf/james-project/blob/d031739f/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitMQConnectionFactory.java
----------------------------------------------------------------------
diff --git a/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitMQConnectionFactory.java b/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitMQConnectionFactory.java
index b6a6ba2..2f901f4 100644
--- a/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitMQConnectionFactory.java
+++ b/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitMQConnectionFactory.java
@@ -18,23 +18,30 @@
  ****************************************************************/
 package org.apache.james.backend.rabbitmq;
 
+import java.util.concurrent.ExecutionException;
+
 import javax.inject.Inject;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.james.util.retry.RetryExecutorUtil;
 
+import com.nurkiewicz.asyncretry.AsyncRetryExecutor;
 import com.rabbitmq.client.Connection;
 import com.rabbitmq.client.ConnectionFactory;
 
 public class RabbitMQConnectionFactory {
 
-    private static final Logger LOGGER = LoggerFactory.getLogger(RabbitMQConnectionFactory.class);
-
+    private final AsyncRetryExecutor executor;
     private final ConnectionFactory connectionFactory;
 
+    private final int maxRetries;
+    private final int minDelay;
+
     @Inject
-    public RabbitMQConnectionFactory(RabbitMQConfiguration rabbitMQConfiguration) {
+    public RabbitMQConnectionFactory(RabbitMQConfiguration rabbitMQConfiguration, AsyncRetryExecutor executor) {
+        this.executor = executor;
         this.connectionFactory = from(rabbitMQConfiguration);
+        this.maxRetries = rabbitMQConfiguration.getMaxRetries();
+        this.minDelay = rabbitMQConfiguration.getMinDelay();
     }
 
     private ConnectionFactory from(RabbitMQConfiguration rabbitMQConfiguration) {
@@ -43,16 +50,16 @@ public class RabbitMQConnectionFactory {
             connectionFactory.setUri(rabbitMQConfiguration.getUri());
             return connectionFactory;
         } catch (Exception e) {
-            LOGGER.error("Fail to create the RabbitMQ connection factory.");
             throw new RuntimeException(e);
         }
     }
 
     public Connection create() {
         try {
-            return connectionFactory.newConnection();
-        } catch (Exception e) {
-            LOGGER.error("Fail to create a RabbitMQ connection.");
+            return RetryExecutorUtil.retryOnExceptions(executor, maxRetries, minDelay, Exception.class)
+                    .getWithRetry(context -> connectionFactory.newConnection())
+                    .get();
+        } catch (InterruptedException | ExecutionException e) {
             throw new RuntimeException(e);
         }
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/d031739f/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQConnectionFactoryTest.java
----------------------------------------------------------------------
diff --git a/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQConnectionFactoryTest.java b/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQConnectionFactoryTest.java
index 99cca33..3d0c13f 100644
--- a/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQConnectionFactoryTest.java
+++ b/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQConnectionFactoryTest.java
@@ -21,11 +21,23 @@ package org.apache.james.backend.rabbitmq;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.net.URI;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
 
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+import com.nurkiewicz.asyncretry.AsyncRetryExecutor;
+
 class RabbitMQConnectionFactoryTest {
 
+    private ScheduledExecutorService scheduledExecutor;
+
+    @BeforeEach
+    void setUp() throws Exception {
+        scheduledExecutor = Executors.newSingleThreadScheduledExecutor();
+    }
+
     @Test
     void creatingAFactoryShouldWorkWhenConfigurationIsValid() {
         RabbitMQConfiguration rabbitMQConfiguration = RabbitMQConfiguration.builder()
@@ -33,7 +45,7 @@ class RabbitMQConnectionFactoryTest {
             .managementUri(URI.create("http://james:james@rabbitmq_host:15672/api/"))
             .build();
 
-        new RabbitMQConnectionFactory(rabbitMQConfiguration);
+        new RabbitMQConnectionFactory(rabbitMQConfiguration, new AsyncRetryExecutor(scheduledExecutor));
     }
 
     @Test
@@ -43,7 +55,7 @@ class RabbitMQConnectionFactoryTest {
             .managementUri(URI.create("http://james:james@rabbitmq_host:15672/api/"))
             .build();
 
-        assertThatThrownBy(() -> new RabbitMQConnectionFactory(rabbitMQConfiguration))
+        assertThatThrownBy(() -> new RabbitMQConnectionFactory(rabbitMQConfiguration, new AsyncRetryExecutor(scheduledExecutor)))
             .isInstanceOf(RuntimeException.class);
     }
 
@@ -52,9 +64,11 @@ class RabbitMQConnectionFactoryTest {
         RabbitMQConfiguration rabbitMQConfiguration = RabbitMQConfiguration.builder()
                 .amqpUri(URI.create("amqp://james:james@rabbitmq_host:5672"))
                 .managementUri(URI.create("http://james:james@rabbitmq_host:15672/api/"))
+                .maxRetries(1)
+                .minDelay(1)
                 .build();
 
-        RabbitMQConnectionFactory rabbitMQConnectionFactory = new RabbitMQConnectionFactory(rabbitMQConfiguration);
+        RabbitMQConnectionFactory rabbitMQConnectionFactory = new RabbitMQConnectionFactory(rabbitMQConfiguration, new AsyncRetryExecutor(scheduledExecutor));
 
         assertThatThrownBy(() -> rabbitMQConnectionFactory.create())
             .isInstanceOf(RuntimeException.class);

http://git-wip-us.apache.org/repos/asf/james-project/blob/d031739f/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQHealthCheckTest.java
----------------------------------------------------------------------
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 0938688..ec50384 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
@@ -22,14 +22,14 @@ package org.apache.james.backend.rabbitmq;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.net.URI;
+import java.util.concurrent.Executors;
 
 import org.apache.james.core.healthcheck.Result;
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 
-import com.rabbitmq.client.ConnectionFactory;
+import com.nurkiewicz.asyncretry.AsyncRetryExecutor;
 
 @ExtendWith(DockerRabbitMQExtension.class)
 class RabbitMQHealthCheckTest {
@@ -38,10 +38,18 @@ class RabbitMQHealthCheckTest {
     @BeforeEach
     void setUp(DockerRabbitMQ rabbitMQ) throws Exception {
         URI amqpUri = URI.create("amqp://" + rabbitMQ.getHostIp() + ":" + rabbitMQ.getPort());
-        ConnectionFactory connectionFactory = new ConnectionFactory();
-        connectionFactory.setUri(amqpUri);
+        URI managementUri = URI.create("http://" + rabbitMQ.getHostIp() + ":15672/api/");
+
+        RabbitMQConfiguration rabbitMQConfiguration = RabbitMQConfiguration.builder()
+            .amqpUri(amqpUri)
+            .managementUri(managementUri)
+            .build();
+
+        RabbitMQConnectionFactory rabbitMQConnectionFactory = new RabbitMQConnectionFactory(rabbitMQConfiguration,
+                new AsyncRetryExecutor(Executors.newSingleThreadScheduledExecutor()));
+
         healthCheck = new RabbitMQHealthCheck(
-            new RabbitChannelPool(connectionFactory.newConnection()));
+            new RabbitChannelPool(rabbitMQConnectionFactory));
     }
 
     @Test
@@ -61,7 +69,6 @@ class RabbitMQHealthCheckTest {
     }
 
     @Test
-    @Disabled("connection don't recover instantly, we should try several time (depending on heartbeat rabbit conf")
     void checkShouldDetectWhenRabbitMQRecovered(DockerRabbitMQ rabbitMQ) throws Exception {
         rabbitMQ.stopApp();
         healthCheck.check();

http://git-wip-us.apache.org/repos/asf/james-project/blob/d031739f/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java
----------------------------------------------------------------------
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 c2d5c07..811c361 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
@@ -22,6 +22,7 @@ package org.apache.james.queue.rabbitmq;
 import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.concurrent.Executors;
 import java.util.concurrent.TimeoutException;
 
 import javax.mail.internet.MimeMessage;
@@ -29,6 +30,8 @@ import javax.mail.internet.MimeMessage;
 import org.apache.http.client.utils.URIBuilder;
 import org.apache.james.backend.rabbitmq.DockerRabbitMQ;
 import org.apache.james.backend.rabbitmq.RabbitChannelPool;
+import org.apache.james.backend.rabbitmq.RabbitMQConfiguration;
+import org.apache.james.backend.rabbitmq.RabbitMQConnectionFactory;
 import org.apache.james.backend.rabbitmq.ReusableDockerRabbitMQExtension;
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.DockerCassandraExtension;
@@ -47,6 +50,8 @@ import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.extension.ExtendWith;
 
+import com.nurkiewicz.asyncretry.AsyncRetryExecutor;
+
 @ExtendWith({ReusableDockerRabbitMQExtension.class, DockerCassandraExtension.class})
 public class RabbitMQMailQueueTest implements MailQueueContract {
     private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory();
@@ -65,13 +70,27 @@ public class RabbitMQMailQueueTest implements MailQueueContract {
         CassandraBlobsDAO blobsDAO = new CassandraBlobsDAO(cassandra.getConf(), CassandraConfiguration.DEFAULT_CONFIGURATION, BLOB_ID_FACTORY);
         Store<MimeMessage, MimeMessagePartsId> mimeMessageStore = MimeMessageStore.factory(blobsDAO).mimeMessageStore();
 
+        URI amqpUri = new URIBuilder()
+            .setScheme("amqp")
+            .setHost(rabbitMQ.getHostIp())
+            .setPort(rabbitMQ.getPort())
+            .build();
         URI rabbitManagementUri = new URIBuilder()
             .setScheme("http")
             .setHost(rabbitMQ.getHostIp())
             .setPort(rabbitMQ.getAdminPort())
             .build();
 
-        RabbitClient rabbitClient = new RabbitClient(new RabbitChannelPool(rabbitMQ.connectionFactory().newConnection()));
+
+        RabbitMQConfiguration rabbitMQConfiguration = RabbitMQConfiguration.builder()
+            .amqpUri(amqpUri)
+            .managementUri(rabbitManagementUri)
+            .build();
+
+        RabbitMQConnectionFactory rabbitMQConnectionFactory = new RabbitMQConnectionFactory(rabbitMQConfiguration,
+                new AsyncRetryExecutor(Executors.newSingleThreadScheduledExecutor()));
+
+        RabbitClient rabbitClient = new RabbitClient(new RabbitChannelPool(rabbitMQConnectionFactory));
         RabbitMQMailQueue.Factory factory = new RabbitMQMailQueue.Factory(rabbitClient, mimeMessageStore, BLOB_ID_FACTORY);
         RabbitMQManagementApi mqManagementApi = new RabbitMQManagementApi(rabbitManagementUri, new RabbitMQManagementCredentials("guest", "guest".toCharArray()));
         mailQueueFactory = new RabbitMQMailQueueFactory(rabbitClient, mqManagementApi, factory);

http://git-wip-us.apache.org/repos/asf/james-project/blob/d031739f/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMqMailQueueFactoryTest.java
----------------------------------------------------------------------
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 bbb4734..1df4d92 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
@@ -22,6 +22,7 @@ package org.apache.james.queue.rabbitmq;
 import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.concurrent.Executors;
 import java.util.concurrent.TimeoutException;
 
 import javax.mail.internet.MimeMessage;
@@ -29,6 +30,8 @@ import javax.mail.internet.MimeMessage;
 import org.apache.http.client.utils.URIBuilder;
 import org.apache.james.backend.rabbitmq.DockerRabbitMQ;
 import org.apache.james.backend.rabbitmq.RabbitChannelPool;
+import org.apache.james.backend.rabbitmq.RabbitMQConfiguration;
+import org.apache.james.backend.rabbitmq.RabbitMQConnectionFactory;
 import org.apache.james.backend.rabbitmq.ReusableDockerRabbitMQExtension;
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.DockerCassandraExtension;
@@ -47,6 +50,8 @@ import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.extension.ExtendWith;
 
+import com.nurkiewicz.asyncretry.AsyncRetryExecutor;
+
 @ExtendWith({ReusableDockerRabbitMQExtension.class, DockerCassandraExtension.class})
 class RabbitMqMailQueueFactoryTest implements MailQueueFactoryContract<RabbitMQMailQueue> {
     private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory();
@@ -65,13 +70,27 @@ class RabbitMqMailQueueFactoryTest implements MailQueueFactoryContract<RabbitMQM
         CassandraBlobsDAO blobsDAO = new CassandraBlobsDAO(cassandra.getConf(), CassandraConfiguration.DEFAULT_CONFIGURATION, BLOB_ID_FACTORY);
         Store<MimeMessage, MimeMessagePartsId> mimeMessageStore = MimeMessageStore.factory(blobsDAO).mimeMessageStore();
 
+        URI amqpUri = new URIBuilder()
+            .setScheme("amqp")
+            .setHost(rabbitMQ.getHostIp())
+            .setPort(rabbitMQ.getPort())
+            .build();
         URI rabbitManagementUri = new URIBuilder()
             .setScheme("http")
             .setHost(rabbitMQ.getHostIp())
             .setPort(rabbitMQ.getAdminPort())
             .build();
 
-        RabbitClient rabbitClient = new RabbitClient(new RabbitChannelPool(rabbitMQ.connectionFactory().newConnection()));
+
+        RabbitMQConfiguration rabbitMQConfiguration = RabbitMQConfiguration.builder()
+            .amqpUri(amqpUri)
+            .managementUri(rabbitManagementUri)
+            .build();
+
+        RabbitMQConnectionFactory rabbitMQConnectionFactory = new RabbitMQConnectionFactory(rabbitMQConfiguration,
+                new AsyncRetryExecutor(Executors.newSingleThreadScheduledExecutor()));
+
+        RabbitClient rabbitClient = new RabbitClient(new RabbitChannelPool(rabbitMQConnectionFactory));
         RabbitMQMailQueue.Factory factory = new RabbitMQMailQueue.Factory(rabbitClient, mimeMessageStore, BLOB_ID_FACTORY);
         RabbitMQManagementApi mqManagementApi = new RabbitMQManagementApi(rabbitManagementUri, new RabbitMQManagementCredentials("guest", "guest".toCharArray()));
         mailQueueFactory = new RabbitMQMailQueueFactory(rabbitClient, mqManagementApi, factory);


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


[09/13] james-project git commit: JAMES-2544 Use CassandraCluster extension where applicable

Posted by bt...@apache.org.
http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUserMailboxRightsDAOTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUserMailboxRightsDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUserMailboxRightsDAOTest.java
index d8a4c2d..9730bda 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUserMailboxRightsDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUserMailboxRightsDAOTest.java
@@ -21,7 +21,7 @@ package org.apache.james.mailbox.cassandra.mail;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.mailbox.acl.ACLDiff;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
@@ -31,49 +31,29 @@ import org.apache.james.mailbox.model.MailboxACL.Entry;
 import org.apache.james.mailbox.model.MailboxACL.EntryKey;
 import org.apache.james.mailbox.model.MailboxACL.Rfc4314Rights;
 import org.apache.james.mailbox.model.MailboxACL.Right;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
-
-public class CassandraUserMailboxRightsDAOTest {
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
+class CassandraUserMailboxRightsDAOTest {
     private static final String USER_NAME = "userName";
     private static final EntryKey ENTRY_KEY = EntryKey.createUserEntryKey(USER_NAME);
     private static final CassandraId MAILBOX_ID = CassandraId.timeBased();
     private static final Rfc4314Rights RIGHTS = MailboxACL.FULL_RIGHTS;
     private static final Rfc4314Rights OTHER_RIGHTS = new Rfc4314Rights(Right.Administer, Right.Read);
 
-    @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-
-    private static CassandraCluster cassandra;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraAclModule.MODULE);
 
     private CassandraUserMailboxRightsDAO testee;
 
-    @BeforeClass
-    public static void setUpClass() {
-        cassandra = CassandraCluster.create(CassandraAclModule.MODULE, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         testee = new CassandraUserMailboxRightsDAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION);
     }
 
-    @After
-    public void tearDown() throws Exception {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void saveShouldInsertNewEntry() {
+    void saveShouldInsertNewEntry() {
         testee.update(MAILBOX_ID, ACLDiff.computeDiff(
             MailboxACL.EMPTY,
             new MailboxACL(new Entry(ENTRY_KEY, RIGHTS))))
@@ -84,7 +64,7 @@ public class CassandraUserMailboxRightsDAOTest {
     }
 
     @Test
-    public void saveOnSecondShouldOverwrite() {
+    void saveOnSecondShouldOverwrite() {
         testee.update(MAILBOX_ID, ACLDiff.computeDiff(
             MailboxACL.EMPTY,
             new MailboxACL(new Entry(ENTRY_KEY, RIGHTS))))
@@ -100,13 +80,13 @@ public class CassandraUserMailboxRightsDAOTest {
     }
 
     @Test
-    public void listRightsForUserShouldReturnEmptyWhenEmptyData() {
+    void listRightsForUserShouldReturnEmptyWhenEmptyData() {
         assertThat(testee.listRightsForUser(USER_NAME).join())
             .isEmpty();
     }
 
     @Test
-    public void deleteShouldDeleteWhenExisting() {
+    void deleteShouldDeleteWhenExisting() {
         testee.update(MAILBOX_ID, ACLDiff.computeDiff(
             MailboxACL.EMPTY,
             new MailboxACL(new Entry(ENTRY_KEY, RIGHTS))))

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentMessageIdCreationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentMessageIdCreationTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentMessageIdCreationTest.java
index e1651f2..84f33e8 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentMessageIdCreationTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentMessageIdCreationTest.java
@@ -35,7 +35,7 @@ import javax.mail.Flags;
 import javax.mail.util.SharedByteArrayInputStream;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.migration.Migration;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
@@ -55,20 +55,20 @@ import org.apache.james.mailbox.model.MessageAttachment;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 
-public class AttachmentMessageIdCreationTest {
-    @ClassRule
-    public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-    private static CassandraCluster cassandra;
+class AttachmentMessageIdCreationTest {
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(
+        CassandraModule.aggregateModules(
+            CassandraMessageModule.MODULE,
+            CassandraAttachmentModule.MODULE,
+            CassandraBlobModule.MODULE));
 
     private CassandraBlobsDAO blobsDAO;
     private CassandraMessageDAO cassandraMessageDAO;
@@ -79,17 +79,8 @@ public class AttachmentMessageIdCreationTest {
     private SimpleMailboxMessage message;
     private CassandraMessageId messageId;
 
-    @BeforeClass
-    public static void setUpClass() {
-        CassandraModule modules = CassandraModule.aggregateModules(
-            CassandraMessageModule.MODULE,
-            CassandraAttachmentModule.MODULE,
-            CassandraBlobModule.MODULE);
-        cassandra = CassandraCluster.create(modules, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         CassandraMessageId.Factory messageIdFactory = new CassandraMessageId.Factory();
 
         blobsDAO = new CassandraBlobsDAO(cassandra.getConf());
@@ -104,24 +95,14 @@ public class AttachmentMessageIdCreationTest {
         messageId = messageIdFactory.generate();
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void emptyMigrationShouldSucceed() {
+    void emptyMigrationShouldSucceed() {
         assertThat(migration.run())
             .isEqualTo(Migration.Result.COMPLETED);
     }
 
     @Test
-    public void migrationShouldSucceedWhenNoAttachment() throws Exception {
+    void migrationShouldSucceedWhenNoAttachment() throws Exception {
         List<MessageAttachment> noAttachment = ImmutableList.of();
         message = createMessage(messageId, noAttachment);
 
@@ -132,7 +113,7 @@ public class AttachmentMessageIdCreationTest {
     }
 
     @Test
-    public void migrationShouldSucceedWhenAttachment() throws Exception {
+    void migrationShouldSucceedWhenAttachment() throws Exception {
         MessageAttachment attachment = createAttachment();
         message = createMessage(messageId, ImmutableList.of(attachment));
 
@@ -143,7 +124,7 @@ public class AttachmentMessageIdCreationTest {
     }
 
     @Test
-    public void migrationShouldCreateAttachmentIdOnAttachmentMessageIdTableFromMessage() throws Exception {
+    void migrationShouldCreateAttachmentIdOnAttachmentMessageIdTableFromMessage() throws Exception {
         MessageAttachment attachment = createAttachment();
         message = createMessage(messageId, ImmutableList.of(attachment));
 
@@ -156,7 +137,7 @@ public class AttachmentMessageIdCreationTest {
     }
 
     @Test
-    public void migrationShouldReturnPartialWhenRetrieveAllAttachmentIdFromMessageFail() throws Exception {
+    void migrationShouldReturnPartialWhenRetrieveAllAttachmentIdFromMessageFail() throws Exception {
         CassandraMessageDAO cassandraMessageDAO = mock(CassandraMessageDAO.class);
         CassandraAttachmentMessageIdDAO attachmentMessageIdDAO = mock(CassandraAttachmentMessageIdDAO.class);
         migration = new AttachmentMessageIdCreation(cassandraMessageDAO, attachmentMessageIdDAO);
@@ -167,7 +148,7 @@ public class AttachmentMessageIdCreationTest {
     }
 
     @Test
-    public void migrationShouldReturnPartialWhenSavingAttachmentIdForMessageIdFail() throws Exception {
+    void migrationShouldReturnPartialWhenSavingAttachmentIdForMessageIdFail() throws Exception {
         CassandraMessageDAO cassandraMessageDAO = mock(CassandraMessageDAO.class);
         CassandraAttachmentMessageIdDAO attachmentMessageIdDAO = mock(CassandraAttachmentMessageIdDAO.class);
         CassandraMessageDAO.MessageIdAttachmentIds messageIdAttachmentIds = mock(CassandraMessageDAO.MessageIdAttachmentIds.class);

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentV2MigrationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentV2MigrationTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentV2MigrationTest.java
index 131eca0..a298106 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentV2MigrationTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentV2MigrationTest.java
@@ -29,7 +29,7 @@ import java.util.concurrent.CompletableFuture;
 import java.util.stream.Stream;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.backends.cassandra.migration.Migration;
@@ -42,21 +42,20 @@ import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAOV2;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
 import org.apache.james.mailbox.model.Attachment;
 import org.apache.james.mailbox.model.AttachmentId;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
-
-public class AttachmentV2MigrationTest {
-    public static final AttachmentId ATTACHMENT_ID = AttachmentId.from("id1");
-    public static final AttachmentId ATTACHMENT_ID_2 = AttachmentId.from("id2");
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+class AttachmentV2MigrationTest {
+    private static final AttachmentId ATTACHMENT_ID = AttachmentId.from("id1");
+    private static final AttachmentId ATTACHMENT_ID_2 = AttachmentId.from("id2");
     private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory();
 
-    @ClassRule
-    public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-    private static CassandraCluster cassandra;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(
+        CassandraModule.aggregateModules(
+            CassandraAttachmentModule.MODULE,
+            CassandraBlobModule.MODULE));
 
     private CassandraAttachmentDAO attachmentDAO;
     private CassandraAttachmentDAOV2 attachmentDAOV2;
@@ -65,16 +64,8 @@ public class AttachmentV2MigrationTest {
     private Attachment attachment1;
     private Attachment attachment2;
 
-    @BeforeClass
-    public static void setUpClass() {
-        CassandraModule modules = CassandraModule.aggregateModules(
-            CassandraAttachmentModule.MODULE,
-            CassandraBlobModule.MODULE);
-        cassandra = CassandraCluster.create(modules, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         attachmentDAO = new CassandraAttachmentDAO(cassandra.getConf(),
             CassandraUtils.WITH_DEFAULT_CONFIGURATION,
             CassandraConfiguration.DEFAULT_CONFIGURATION);
@@ -94,24 +85,14 @@ public class AttachmentV2MigrationTest {
             .build();
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void emptyMigrationShouldSucceed() {
+    void emptyMigrationShouldSucceed() {
         assertThat(migration.run())
             .isEqualTo(Migration.Result.COMPLETED);
     }
 
     @Test
-    public void migrationShouldSucceed() throws Exception {
+    void migrationShouldSucceed() throws Exception {
         attachmentDAO.storeAttachment(attachment1).join();
         attachmentDAO.storeAttachment(attachment2).join();
 
@@ -120,7 +101,7 @@ public class AttachmentV2MigrationTest {
     }
 
     @Test
-    public void migrationShouldMoveAttachmentsToV2() throws Exception {
+    void migrationShouldMoveAttachmentsToV2() throws Exception {
         attachmentDAO.storeAttachment(attachment1).join();
         attachmentDAO.storeAttachment(attachment2).join();
 
@@ -137,7 +118,7 @@ public class AttachmentV2MigrationTest {
     }
 
     @Test
-    public void migrationShouldRemoveAttachmentsFromV1() throws Exception {
+    void migrationShouldRemoveAttachmentsFromV1() throws Exception {
         attachmentDAO.storeAttachment(attachment1).join();
         attachmentDAO.storeAttachment(attachment2).join();
 
@@ -150,7 +131,7 @@ public class AttachmentV2MigrationTest {
     }
 
     @Test
-    public void runShouldReturnPartialWhenInitialReadFail() throws Exception {
+    void runShouldReturnPartialWhenInitialReadFail() {
         CassandraAttachmentDAO attachmentDAO = mock(CassandraAttachmentDAO.class);
         CassandraAttachmentDAOV2 attachmentDAOV2 = mock(CassandraAttachmentDAOV2.class);
         CassandraBlobsDAO blobsDAO = mock(CassandraBlobsDAO.class);
@@ -162,7 +143,7 @@ public class AttachmentV2MigrationTest {
     }
 
     @Test
-    public void runShouldReturnPartialWhenSavingBlobsFails() throws Exception {
+    void runShouldReturnPartialWhenSavingBlobsFails() {
         CassandraAttachmentDAO attachmentDAO = mock(CassandraAttachmentDAO.class);
         CassandraAttachmentDAOV2 attachmentDAOV2 = mock(CassandraAttachmentDAOV2.class);
         CassandraBlobsDAO blobsDAO = mock(CassandraBlobsDAO.class);
@@ -177,7 +158,7 @@ public class AttachmentV2MigrationTest {
     }
 
     @Test
-    public void runShouldReturnPartialWhenSavingAttachmentV2Fail() throws Exception {
+    void runShouldReturnPartialWhenSavingAttachmentV2Fail() {
         CassandraAttachmentDAO attachmentDAO = mock(CassandraAttachmentDAO.class);
         CassandraAttachmentDAOV2 attachmentDAOV2 = mock(CassandraAttachmentDAOV2.class);
         CassandraBlobsDAO blobsDAO = mock(CassandraBlobsDAO.class);
@@ -196,7 +177,7 @@ public class AttachmentV2MigrationTest {
     }
 
     @Test
-    public void runShouldReturnPartialWhenDeleteV1AttachmentFail() throws Exception {
+    void runShouldReturnPartialWhenDeleteV1AttachmentFail() {
         CassandraAttachmentDAO attachmentDAO = mock(CassandraAttachmentDAO.class);
         CassandraAttachmentDAOV2 attachmentDAOV2 = mock(CassandraAttachmentDAOV2.class);
         CassandraBlobsDAO blobsDAO = mock(CassandraBlobsDAO.class);
@@ -216,7 +197,7 @@ public class AttachmentV2MigrationTest {
     }
 
     @Test
-    public void runShouldReturnPartialWhenAtLeastOneAttachmentMigrationFails() throws Exception {
+    void runShouldReturnPartialWhenAtLeastOneAttachmentMigrationFails() {
         CassandraAttachmentDAO attachmentDAO = mock(CassandraAttachmentDAO.class);
         CassandraAttachmentDAOV2 attachmentDAOV2 = mock(CassandraAttachmentDAOV2.class);
         CassandraBlobsDAO blobsDAO = mock(CassandraBlobsDAO.class);

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTest.java
index 92cdb5e..cf19f73 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTest.java
@@ -22,7 +22,7 @@ package org.apache.james.mailbox.cassandra.mail.migration;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
@@ -39,42 +39,36 @@ import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
 import org.assertj.core.api.SoftAssertions;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class MailboxPathV2MigrationTest {
+class MailboxPathV2MigrationTest {
 
     private static final MailboxPath MAILBOX_PATH_1 = MailboxPath.forUser("bob", "Important");
     private static final int UID_VALIDITY_1 = 452;
     private static final SimpleMailbox MAILBOX_1 = new SimpleMailbox(MAILBOX_PATH_1, UID_VALIDITY_1);
     private static final CassandraId MAILBOX_ID_1 = CassandraId.timeBased();
 
-    @ClassRule
-    public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-    private static CassandraCluster cassandra;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(
+        CassandraModule.aggregateModules(
+            CassandraMailboxModule.MODULE,
+            CassandraAclModule.MODULE));
 
     private CassandraMailboxPathDAOImpl daoV1;
     private CassandraMailboxPathV2DAO daoV2;
     private CassandraMailboxMapper mailboxMapper;
     private CassandraMailboxDAO mailboxDAO;
 
-    @BeforeClass
-    public static void setUpClass() {
+    @BeforeAll
+    static void setUpClass() {
         MAILBOX_1.setMailboxId(MAILBOX_ID_1);
-
-        cassandra = CassandraCluster.create(
-            CassandraModule.aggregateModules(
-                CassandraMailboxModule.MODULE,
-                CassandraAclModule.MODULE),
-            cassandraServer.getHost());
     }
 
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         daoV1 = new CassandraMailboxPathDAOImpl(
             cassandra.getConf(),
             cassandra.getTypesProvider(),
@@ -93,18 +87,8 @@ public class MailboxPathV2MigrationTest {
             new CassandraACLMapper(cassandra.getConf(), userMailboxRightsDAO, CassandraConfiguration.DEFAULT_CONFIGURATION));
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void newValuesShouldBeSavedInMostRecentDAO() throws Exception {
+    void newValuesShouldBeSavedInMostRecentDAO() throws Exception {
         mailboxMapper.save(MAILBOX_1);
 
         assertThat(daoV2.retrieveId(MAILBOX_PATH_1).join())
@@ -112,7 +96,7 @@ public class MailboxPathV2MigrationTest {
     }
 
     @Test
-    public void newValuesShouldNotBeSavedInOldDAO() throws Exception {
+    void newValuesShouldNotBeSavedInOldDAO() throws Exception {
         mailboxMapper.save(MAILBOX_1);
 
         assertThat(daoV1.retrieveId(MAILBOX_PATH_1).join())
@@ -120,7 +104,7 @@ public class MailboxPathV2MigrationTest {
     }
 
     @Test
-    public void readingOldValuesShouldMigrateThem() throws Exception {
+    void readingOldValuesShouldMigrateThem() throws Exception {
         daoV1.save(MAILBOX_PATH_1, MAILBOX_ID_1).join();
         mailboxDAO.save(MAILBOX_1).join();
 
@@ -134,7 +118,7 @@ public class MailboxPathV2MigrationTest {
     }
 
     @Test
-    public void migrationTaskShouldMoveDataToMostRecentDao() {
+    void migrationTaskShouldMoveDataToMostRecentDao() {
         daoV1.save(MAILBOX_PATH_1, MAILBOX_ID_1).join();
 
         new MailboxPathV2Migration(daoV1, daoV2).run();

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobsDAOTest.java
----------------------------------------------------------------------
diff --git a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobsDAOTest.java b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobsDAOTest.java
index 898d825..a37215e 100644
--- a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobsDAOTest.java
+++ b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobsDAOTest.java
@@ -21,42 +21,32 @@ package org.apache.james.blob.cassandra;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraExtension;
-import org.apache.james.backends.cassandra.DockerCassandraExtension.DockerCassandra;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.api.BlobStore;
 import org.apache.james.blob.api.BlobStoreContract;
 import org.apache.james.blob.api.HashBlobId;
-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.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.google.common.base.Strings;
 
-@ExtendWith(DockerCassandraExtension.class)
 public class CassandraBlobsDAOTest implements BlobStoreContract {
-
     private static final int CHUNK_SIZE = 10240;
     private static final int MULTIPLE_CHUNK_SIZE = 3;
 
-    private static CassandraCluster cassandra;
-    private CassandraBlobsDAO testee;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraBlobModule.MODULE);
 
-    @BeforeAll
-    static void setUpClass(DockerCassandra dockerCassandra) {
-        cassandra = CassandraCluster.create(CassandraBlobModule.MODULE, dockerCassandra.getHost());
-    }
+    private CassandraBlobsDAO testee;
 
     @BeforeEach
-    void setUp() {
+    void setUp(CassandraCluster cassandra) {
         testee = new CassandraBlobsDAO(cassandra.getConf(),
             CassandraConfiguration.builder()
                 .blobPartSize(CHUNK_SIZE)
@@ -64,16 +54,6 @@ public class CassandraBlobsDAOTest implements BlobStoreContract {
             new HashBlobId.Factory());
     }
 
-    @AfterEach
-    void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterAll
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Override
     public BlobStore testee() {
         return testee;
@@ -85,7 +65,7 @@ public class CassandraBlobsDAOTest implements BlobStoreContract {
     }
 
     @Test
-    public void readBytesShouldReturnSplitSavedDataByChunk() throws IOException {
+    void readBytesShouldReturnSplitSavedDataByChunk() {
         String longString = Strings.repeat("0123456789\n", MULTIPLE_CHUNK_SIZE);
         BlobId blobId = testee.save(longString.getBytes(StandardCharsets.UTF_8)).join();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/server/data/data-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryUrlStoreExtension.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryUrlStoreExtension.java b/server/data/data-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryUrlStoreExtension.java
index fa9818a..30df692 100644
--- a/server/data/data-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryUrlStoreExtension.java
+++ b/server/data/data-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryUrlStoreExtension.java
@@ -19,8 +19,7 @@
 
 package org.apache.james.mailrepository.cassandra;
 
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.mailrepository.api.MailRepositoryUrlStore;
 import org.junit.jupiter.api.extension.AfterAllCallback;
@@ -32,30 +31,25 @@ import org.junit.jupiter.api.extension.ParameterResolutionException;
 import org.junit.jupiter.api.extension.ParameterResolver;
 
 public class CassandraMailRepositoryUrlStoreExtension implements ParameterResolver, BeforeAllCallback, AfterAllCallback, AfterEachCallback {
-    private final DockerCassandraRule cassandra;
-    private CassandraCluster cassandraCluster;
+    private final CassandraClusterExtension cassandraCluster;
 
     public CassandraMailRepositoryUrlStoreExtension() {
-        this.cassandra = new DockerCassandraRule();
+        cassandraCluster = new CassandraClusterExtension(CassandraMailRepositoryUrlModule.MODULE);
     }
 
     @Override
     public void beforeAll(ExtensionContext context) {
-        cassandra.start();
-        cassandraCluster = CassandraCluster.create(
-            CassandraMailRepositoryUrlModule.MODULE,
-            cassandra.getHost());
+        cassandraCluster.beforeAll(context);
     }
 
     @Override
     public void afterEach(ExtensionContext context) {
-        cassandraCluster.clearTables();
+        cassandraCluster.afterEach(context);
     }
 
     @Override
     public void afterAll(ExtensionContext context) {
-        cassandraCluster.closeCluster();
-        cassandra.stop();
+        cassandraCluster.afterAll(context);
     }
 
     @Override
@@ -67,7 +61,7 @@ public class CassandraMailRepositoryUrlStoreExtension implements ParameterResolv
     public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
         return new CassandraMailRepositoryUrlStore(
             new UrlsDao(
-                cassandraCluster.getConf(),
+                cassandraCluster.getCassandraCluster().getConf(),
                 CassandraUtils.WITH_DEFAULT_CONFIGURATION));
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveDAOTest.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveDAOTest.java b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveDAOTest.java
index 4ddb6ba..5d38f61 100644
--- a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveDAOTest.java
+++ b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveDAOTest.java
@@ -25,132 +25,111 @@ import java.util.List;
 import java.util.Optional;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.core.User;
 import org.apache.james.sieve.cassandra.model.Script;
 import org.apache.james.sieverepository.api.ScriptName;
 import org.apache.james.sieverepository.api.ScriptSummary;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
-
-public class CassandraSieveDAOTest {
-
-    public static final User USER = User.fromUsername("user");
-    public static final ScriptName SCRIPT_NAME = new ScriptName("scriptName");
-    public static final ScriptName SCRIPT_NAME2 = new ScriptName("scriptName2");
-    public static final Script SCRIPT = Script.builder()
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+class CassandraSieveDAOTest {
+
+    private static final User USER = User.fromUsername("user");
+    private static final ScriptName SCRIPT_NAME = new ScriptName("scriptName");
+    private static final ScriptName SCRIPT_NAME2 = new ScriptName("scriptName2");
+    private static final Script SCRIPT = Script.builder()
         .name(SCRIPT_NAME)
         .content("content")
         .isActive(false)
         .build();
-    public static final Script SCRIPT2 = Script.builder()
+    private static final Script SCRIPT2 = Script.builder()
         .name(SCRIPT_NAME2)
         .content("alternative content")
         .isActive(true)
         .build();
-    public static final Script ACTIVE_SCRIPT = Script.builder()
+    private static final Script ACTIVE_SCRIPT = Script.builder()
         .copyOf(SCRIPT)
         .isActive(true)
         .build();
-    public static final Script SCRIPT_NEW_CONTENT = Script.builder()
+    private static final Script SCRIPT_NEW_CONTENT = Script.builder()
         .copyOf(SCRIPT)
         .content("newContent")
         .build();
 
-    @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-    private static CassandraCluster cassandra;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraSieveRepositoryModule.MODULE);
 
     private CassandraSieveDAO sieveDAO;
 
-    @BeforeClass
-    public static void setUpClass() {
-        cassandra = CassandraCluster.create(CassandraSieveRepositoryModule.MODULE, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         sieveDAO = new CassandraSieveDAO(cassandra.getConf());
     }
-
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
     
      @Test
-    public void getScriptShouldReturnEmptyByDefault() {
+    void getScriptShouldReturnEmptyByDefault() {
         assertThat(sieveDAO.getScript(USER, SCRIPT_NAME).join().isPresent())
             .isFalse();
     }
 
     @Test
-    public void getScriptShouldReturnStoredScript() {
+    void getScriptShouldReturnStoredScript() {
         sieveDAO.insertScript(USER, SCRIPT).join();
 
         Optional<Script> actual = sieveDAO.getScript(USER, SCRIPT_NAME).join();
 
-        assertThat(actual.isPresent()).isTrue();
-        assertThat(actual.get()).isEqualTo(SCRIPT);
+        assertThat(actual).contains(SCRIPT);
     }
 
     @Test
-    public void insertScriptShouldUpdateContent() {
+    void insertScriptShouldUpdateContent() {
         sieveDAO.insertScript(USER, SCRIPT).join();
 
         sieveDAO.insertScript(USER, SCRIPT_NEW_CONTENT).join();
 
         Optional<Script> actual = sieveDAO.getScript(USER, SCRIPT_NAME).join();
-        assertThat(actual.isPresent()).isTrue();
-        assertThat(actual.get()).isEqualTo(SCRIPT_NEW_CONTENT);
+        assertThat(actual).contains(SCRIPT_NEW_CONTENT);
     }
 
     @Test
-    public void insertScriptShouldUpdateActivate() {
+    void insertScriptShouldUpdateActivate() {
         sieveDAO.insertScript(USER, SCRIPT).join();
 
         sieveDAO.insertScript(USER, ACTIVE_SCRIPT).join();
 
         Optional<Script> actual = sieveDAO.getScript(USER, SCRIPT_NAME).join();
-        assertThat(actual.isPresent()).isTrue();
-        assertThat(actual.get()).isEqualTo(ACTIVE_SCRIPT);
+        assertThat(actual).contains(ACTIVE_SCRIPT);
     }
 
     @Test
-    public void deleteScriptInCassandraShouldWork() {
+    void deleteScriptInCassandraShouldWork() {
         sieveDAO.insertScript(USER, SCRIPT).join();
 
         sieveDAO.deleteScriptInCassandra(USER, SCRIPT_NAME).join();
 
         Optional<Script> actual = sieveDAO.getScript(USER, SCRIPT_NAME).join();
-        assertThat(actual.isPresent()).isFalse();
+        assertThat(actual).isEmpty();
     }
 
     @Test
-    public void deleteScriptInCassandraShouldWorkWhenNoneStore() {
+    void deleteScriptInCassandraShouldWorkWhenNoneStore() {
         sieveDAO.deleteScriptInCassandra(USER, SCRIPT_NAME).join();
 
         Optional<Script> actual = sieveDAO.getScript(USER, SCRIPT_NAME).join();
-        assertThat(actual.isPresent()).isFalse();
+        assertThat(actual).isEmpty();
     }
 
     @Test
-    public void listScriptsShouldReturnEmpty() {
+    void listScriptsShouldReturnEmpty() {
         List<ScriptSummary> scriptSummaryList = sieveDAO.listScripts(USER).join();
 
         assertThat(scriptSummaryList).isEmpty();
     }
 
     @Test
-    public void listScriptsShouldReturnSingleStoredValue() {
+    void listScriptsShouldReturnSingleStoredValue() {
         sieveDAO.insertScript(USER, SCRIPT).join();
         sieveDAO.insertScript(USER, SCRIPT2).join();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOTest.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOTest.java b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOTest.java
index 56692d2..adca5b0 100644
--- a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOTest.java
+++ b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOTest.java
@@ -22,60 +22,41 @@ package org.apache.james.sieve.cassandra;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.core.User;
 import org.apache.james.core.quota.QuotaSize;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class CassandraSieveQuotaDAOTest {
+class CassandraSieveQuotaDAOTest {
+    private static final User USER = User.fromUsername("user");
+    private static final QuotaSize QUOTA_SIZE = QuotaSize.size(15L);
 
-    public static final User USER = User.fromUsername("user");
-    public static final QuotaSize QUOTA_SIZE = QuotaSize.size(15L);
-
-    @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-    private static CassandraCluster cassandra;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraSieveRepositoryModule.MODULE);
 
     private CassandraSieveQuotaDAO sieveQuotaDAO;
 
-    @BeforeClass
-    public static void setUpClass() {
-        cassandra = CassandraCluster.create(CassandraSieveRepositoryModule.MODULE, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         sieveQuotaDAO = new CassandraSieveQuotaDAO(cassandra.getConf());
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void getQuotaShouldReturnEmptyByDefault() {
+    void getQuotaShouldReturnEmptyByDefault() {
         assertThat(sieveQuotaDAO.getQuota().join())
             .isEmpty();
     }
 
     @Test
-    public void getQuotaUserShouldReturnEmptyByDefault() {
+    void getQuotaUserShouldReturnEmptyByDefault() {
         assertThat(sieveQuotaDAO.getQuota(USER).join())
             .isEmpty();
     }
 
     @Test
-    public void getQuotaShouldReturnStoredValue() {
+    void getQuotaShouldReturnStoredValue() {
         sieveQuotaDAO.setQuota(QUOTA_SIZE).join();
 
         assertThat(sieveQuotaDAO.getQuota().join())
@@ -83,7 +64,7 @@ public class CassandraSieveQuotaDAOTest {
     }
 
     @Test
-    public void getQuotaUserShouldReturnStoredValue() {
+    void getQuotaUserShouldReturnStoredValue() {
         sieveQuotaDAO.setQuota(USER, QUOTA_SIZE).join();
 
         assertThat(sieveQuotaDAO.getQuota(USER).join())
@@ -91,7 +72,7 @@ public class CassandraSieveQuotaDAOTest {
     }
 
     @Test
-    public void removeQuotaShouldDeleteQuota() {
+    void removeQuotaShouldDeleteQuota() {
         sieveQuotaDAO.setQuota(QUOTA_SIZE).join();
 
         sieveQuotaDAO.removeQuota().join();
@@ -101,7 +82,7 @@ public class CassandraSieveQuotaDAOTest {
     }
 
     @Test
-    public void removeQuotaUserShouldDeleteQuotaUser() {
+    void removeQuotaUserShouldDeleteQuotaUser() {
         sieveQuotaDAO.setQuota(USER, QUOTA_SIZE).join();
 
         sieveQuotaDAO.removeQuota(USER).join();
@@ -111,7 +92,7 @@ public class CassandraSieveQuotaDAOTest {
     }
 
     @Test
-    public void removeQuotaShouldWorkWhenNoneStore() {
+    void removeQuotaShouldWorkWhenNoneStore() {
         sieveQuotaDAO.removeQuota().join();
 
         assertThat(sieveQuotaDAO.getQuota().join())
@@ -119,7 +100,7 @@ public class CassandraSieveQuotaDAOTest {
     }
 
     @Test
-    public void removeQuotaUserShouldWorkWhenNoneStore() {
+    void removeQuotaUserShouldWorkWhenNoneStore() {
         sieveQuotaDAO.removeQuota(USER).join();
 
         assertThat(sieveQuotaDAO.getQuota(USER).join())
@@ -127,12 +108,12 @@ public class CassandraSieveQuotaDAOTest {
     }
 
     @Test
-    public void spaceUsedByShouldReturnZeroByDefault() {
+    void spaceUsedByShouldReturnZeroByDefault() {
         assertThat(sieveQuotaDAO.spaceUsedBy(USER).join()).isEqualTo(0);
     }
 
     @Test
-    public void spaceUsedByShouldReturnStoredValue() {
+    void spaceUsedByShouldReturnStoredValue() {
         long spaceUsed = 18L;
 
         sieveQuotaDAO.updateSpaceUsed(USER, spaceUsed).join();
@@ -141,7 +122,7 @@ public class CassandraSieveQuotaDAOTest {
     }
 
     @Test
-    public void updateSpaceUsedShouldBeAdditive() {
+    void updateSpaceUsedShouldBeAdditive() {
         long spaceUsed = 18L;
 
         sieveQuotaDAO.updateSpaceUsed(USER, spaceUsed).join();
@@ -151,7 +132,7 @@ public class CassandraSieveQuotaDAOTest {
     }
 
     @Test
-    public void updateSpaceUsedShouldWorkWithNegativeValues() {
+    void updateSpaceUsedShouldWorkWithNegativeValues() {
         long spaceUsed = 18L;
 
         sieveQuotaDAO.updateSpaceUsed(USER, spaceUsed).join();

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryCountDAOTest.java
----------------------------------------------------------------------
diff --git a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryCountDAOTest.java b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryCountDAOTest.java
index f5255d0..98b6fa2 100644
--- a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryCountDAOTest.java
+++ b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryCountDAOTest.java
@@ -22,51 +22,34 @@ package org.apache.james.mailrepository.cassandra;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraExtension;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.mailrepository.api.MailRepositoryUrl;
-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.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(DockerCassandraExtension.class)
-public class CassandraMailRepositoryCountDAOTest {
+class CassandraMailRepositoryCountDAOTest {
     static final MailRepositoryUrl URL = MailRepositoryUrl.from("proto://url");
     static final MailRepositoryUrl URL2 = MailRepositoryUrl.from("proto://url2");
 
-    static CassandraCluster cassandra;
-    CassandraMailRepositoryCountDAO testee;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraMailRepositoryModule.MODULE);
 
-    @BeforeAll
-    static void setUpClass(DockerCassandraExtension.DockerCassandra dockerCassandra) {
-        cassandra = CassandraCluster.create(CassandraMailRepositoryModule.MODULE, dockerCassandra.getHost());
-    }
+    CassandraMailRepositoryCountDAO testee;
 
     @BeforeEach
-    public void setUp() {
+    void setUp(CassandraCluster cassandra) {
         testee = new CassandraMailRepositoryCountDAO(cassandra.getConf());
     }
 
-    @AfterEach
-    void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterAll
-    static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void getCountShouldReturnZeroWhenEmpty() {
+    void getCountShouldReturnZeroWhenEmpty() {
         assertThat(testee.getCount(URL).join())
             .isEqualTo(0L);
     }
 
     @Test
-    public void getCountShouldReturnOneWhenIncrementedOneTime() {
+    void getCountShouldReturnOneWhenIncrementedOneTime() {
         testee.increment(URL).join();
 
         assertThat(testee.getCount(URL).join())
@@ -74,7 +57,7 @@ public class CassandraMailRepositoryCountDAOTest {
     }
 
     @Test
-    public void incrementShouldNotAffectOtherUrls() {
+    void incrementShouldNotAffectOtherUrls() {
         testee.increment(URL).join();
 
         assertThat(testee.getCount(URL2).join())
@@ -82,7 +65,7 @@ public class CassandraMailRepositoryCountDAOTest {
     }
 
     @Test
-    public void incrementCanBeAppliedSeveralTime() {
+    void incrementCanBeAppliedSeveralTime() {
         testee.increment(URL).join();
         testee.increment(URL).join();
 
@@ -91,7 +74,7 @@ public class CassandraMailRepositoryCountDAOTest {
     }
 
     @Test
-    public void decrementShouldDecreaseCount() {
+    void decrementShouldDecreaseCount() {
         testee.increment(URL).join();
         testee.increment(URL).join();
         testee.increment(URL).join();
@@ -103,7 +86,7 @@ public class CassandraMailRepositoryCountDAOTest {
     }
 
     @Test
-    public void decrementCanLeadToNegativeCount() {
+    void decrementCanLeadToNegativeCount() {
         testee.decrement(URL).join();
 
         assertThat(testee.getCount(URL).join())

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAOTest.java
----------------------------------------------------------------------
diff --git a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAOTest.java b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAOTest.java
index 7763ae4..3c457af 100644
--- a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAOTest.java
+++ b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAOTest.java
@@ -22,49 +22,31 @@ package org.apache.james.mailrepository.cassandra;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraExtension;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.mailrepository.api.MailKey;
 import org.apache.james.mailrepository.api.MailRepositoryUrl;
-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.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(DockerCassandraExtension.class)
 class CassandraMailRepositoryKeysDAOTest {
-
     static final MailRepositoryUrl URL = MailRepositoryUrl.from("proto://url");
     static final MailRepositoryUrl URL2 = MailRepositoryUrl.from("proto://url2");
     static final MailKey KEY_1 = new MailKey("key1");
     static final MailKey KEY_2 = new MailKey("key2");
     static final MailKey KEY_3 = new MailKey("key3");
 
-    static CassandraCluster cassandra;
-    CassandraMailRepositoryKeysDAO testee;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraMailRepositoryModule.MODULE);
 
-    @BeforeAll
-    static void setUpClass(DockerCassandraExtension.DockerCassandra dockerCassandra) {
-        cassandra = CassandraCluster.create(CassandraMailRepositoryModule.MODULE, dockerCassandra.getHost());
-    }
+    CassandraMailRepositoryKeysDAO testee;
 
     @BeforeEach
-    void setUp() {
+    void setUp(CassandraCluster cassandra) {
         testee = new CassandraMailRepositoryKeysDAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION);
     }
 
-    @AfterEach
-    void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterAll
-    static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
     void listShouldBeEmptyByDefault() {
         assertThat(testee.list(URL).join())

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAOTest.java
----------------------------------------------------------------------
diff --git a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAOTest.java b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAOTest.java
index e0635bf..55aa601 100644
--- a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAOTest.java
+++ b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAOTest.java
@@ -23,7 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertAll;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraExtension;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.api.TestBlobId;
 import org.apache.james.mailrepository.api.MailKey;
@@ -32,53 +32,35 @@ import org.apache.mailet.Mail;
 import org.apache.mailet.PerRecipientHeaders;
 import org.apache.mailet.base.MailAddressFixture;
 import org.apache.mailet.base.test.FakeMail;
-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.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.google.common.collect.ImmutableList;
 
-@ExtendWith(DockerCassandraExtension.class)
-public class CassandraMailRepositoryMailDAOTest {
-
+class CassandraMailRepositoryMailDAOTest {
     static final MailRepositoryUrl URL = MailRepositoryUrl.from("proto://url");
     static final MailKey KEY_1 = new MailKey("key1");
     static final TestBlobId.Factory BLOB_ID_FACTORY = new TestBlobId.Factory();
 
-    static CassandraCluster cassandra;
-    CassandraMailRepositoryMailDAO testee;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraMailRepositoryModule.MODULE);
 
-    @BeforeAll
-    static void setUpClass(DockerCassandraExtension.DockerCassandra dockerCassandra) {
-        cassandra = CassandraCluster.create(CassandraMailRepositoryModule.MODULE, dockerCassandra.getHost());
-    }
+    CassandraMailRepositoryMailDAO testee;
 
     @BeforeEach
-    public void setUp() {
+    void setUp(CassandraCluster cassandra) {
         testee = new CassandraMailRepositoryMailDAO(cassandra.getConf(), BLOB_ID_FACTORY, cassandra.getTypesProvider());
     }
 
-    @AfterEach
-    void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterAll
-    static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void readShouldReturnEmptyWhenAbsent() {
+    void readShouldReturnEmptyWhenAbsent() {
         assertThat(testee.read(URL, KEY_1).join())
             .isEmpty();
     }
 
     @Test
-    public void readShouldReturnAllMailMetadata() throws Exception {
+    void readShouldReturnAllMailMetadata() throws Exception {
         BlobId blobIdBody = BLOB_ID_FACTORY.from("blobHeader");
         BlobId blobIdHeader = BLOB_ID_FACTORY.from("blobBody");
         String errorMessage = "error message";
@@ -127,7 +109,7 @@ public class CassandraMailRepositoryMailDAOTest {
     }
 
     @Test
-    public void storeShouldAcceptMailWithOnlyName() throws Exception {
+    void storeShouldAcceptMailWithOnlyName() throws Exception {
         BlobId blobIdBody = BLOB_ID_FACTORY.from("blobHeader");
         BlobId blobIdHeader = BLOB_ID_FACTORY.from("blobBody");
 
@@ -149,7 +131,7 @@ public class CassandraMailRepositoryMailDAOTest {
     }
 
     @Test
-    public void removeShouldDeleteMailMetaData() throws Exception {
+    void removeShouldDeleteMailMetaData() throws Exception {
         BlobId blobIdBody = BLOB_ID_FACTORY.from("blobHeader");
         BlobId blobIdHeader = BLOB_ID_FACTORY.from("blobBody");
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryTest.java
----------------------------------------------------------------------
diff --git a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryTest.java b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryTest.java
index 64fdfd5..d83677e 100644
--- a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryTest.java
+++ b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryTest.java
@@ -20,7 +20,7 @@
 package org.apache.james.mailrepository.cassandra;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraExtension;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.blob.api.HashBlobId;
@@ -30,32 +30,26 @@ import org.apache.james.blob.mail.MimeMessageStore;
 import org.apache.james.mailrepository.MailRepositoryContract;
 import org.apache.james.mailrepository.api.MailRepository;
 import org.apache.james.mailrepository.api.MailRepositoryUrl;
-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.Disabled;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(DockerCassandraExtension.class)
 class CassandraMailRepositoryTest implements MailRepositoryContract {
     static final MailRepositoryUrl URL = MailRepositoryUrl.from("proto://url");
     static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory();
 
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(
+        CassandraModule.aggregateModules(
+            CassandraMailRepositoryModule.MODULE,
+            CassandraBlobModule.MODULE));
+
     CassandraMailRepository cassandraMailRepository;
-    static CassandraCluster cassandra;
 
-    @BeforeAll
-    static void setUpClass(DockerCassandraExtension.DockerCassandra dockerCassandra) {
-        CassandraModule modules = CassandraModule.aggregateModules(
-            CassandraMailRepositoryModule.MODULE,
-            CassandraBlobModule.MODULE);
-        cassandra = CassandraCluster.create(modules, dockerCassandra.getHost());
-    }
 
     @BeforeEach
-    void setup() {
+    void setup(CassandraCluster cassandra) {
         CassandraMailRepositoryMailDAO mailDAO = new CassandraMailRepositoryMailDAO(cassandra.getConf(), BLOB_ID_FACTORY, cassandra.getTypesProvider());
         CassandraMailRepositoryKeysDAO keysDAO = new CassandraMailRepositoryKeysDAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION);
         CassandraMailRepositoryCountDAO countDAO = new CassandraMailRepositoryCountDAO(cassandra.getConf());
@@ -65,16 +59,6 @@ class CassandraMailRepositoryTest implements MailRepositoryContract {
             keysDAO, countDAO, mailDAO, MimeMessageStore.factory(blobsDAO).mimeMessageStore());
     }
 
-    @AfterEach
-    void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterAll
-    static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Override
     public MailRepository retrieveRepository() {
         return cassandraMailRepository;
@@ -83,7 +67,7 @@ class CassandraMailRepositoryTest implements MailRepositoryContract {
     @Test
     @Disabled("key is unique in Cassandra")
     @Override
-    public void sizeShouldBeIncrementedByOneWhenDuplicates() throws Exception {
+    public void sizeShouldBeIncrementedByOneWhenDuplicates() {
     }
 
 }
\ No newline at end of file


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


[02/13] james-project git commit: JAMES-2526 Bounce should not fail for "nullSender"

Posted by bt...@apache.org.
JAMES-2526 Bounce should not fail for "nullSender"


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

Branch: refs/heads/master
Commit: 01738f69cb1552f3b44b0237c52aef394f8d9fd4
Parents: 808e04a
Author: Benoit Tellier <bt...@linagora.com>
Authored: Wed Sep 12 18:24:59 2018 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Sep 14 10:17:04 2018 +0700

----------------------------------------------------------------------
 .../mailets/redirect/MailModifier.java          |  8 ++++++--
 .../mailets/redirect/ProcessRedirectNotify.java |  5 ++++-
 .../transport/util/SpecialAddressesUtils.java   |  7 ++++++-
 .../james/transport/mailets/BounceTest.java     | 21 ++++++++++++++++++++
 .../james/transport/mailets/RedirectTest.java   | 15 ++++++++------
 5 files changed, 46 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/01738f69/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/MailModifier.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/MailModifier.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/MailModifier.java
index 5345a6e..2ffc92b 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/MailModifier.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/MailModifier.java
@@ -38,6 +38,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
 
 public class MailModifier {
     private static final Logger LOGGER = LoggerFactory.getLogger(MailModifier.class);
@@ -108,7 +109,10 @@ public class MailModifier {
 
     public void setRecipients(List<MailAddress> recipients) {
         if (!recipients.isEmpty()) {
-            mail.setRecipients(recipients);
+            mail.setRecipients(recipients
+                .stream()
+                .filter(address -> !address.isNullSender())
+                .collect(ImmutableList.toImmutableList()));
             if (mailet.getInitParameters().isDebug()) {
                 if (LOGGER.isDebugEnabled()) {
                     LOGGER.debug("recipients set to: {}", (Object) recipients.toArray());
@@ -142,7 +146,7 @@ public class MailModifier {
     public void setReplyTo(Optional<MailAddress> optionalReplyTo) throws MessagingException {
         if (optionalReplyTo.isPresent()) {
             MailAddress replyTo = optionalReplyTo.get();
-            if (replyTo.equals(SpecialAddress.NULL)) {
+            if (replyTo.isNullSender() || replyTo.equals(SpecialAddress.NULL)) {
                 mail.getMessage().setReplyTo(null);
                 if (mailet.getInitParameters().isDebug()) {
                     LOGGER.debug("replyTo set to: null");

http://git-wip-us.apache.org/repos/asf/james-project/blob/01738f69/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/ProcessRedirectNotify.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/ProcessRedirectNotify.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/ProcessRedirectNotify.java
index bcec3e4..c66881f 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/ProcessRedirectNotify.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/ProcessRedirectNotify.java
@@ -72,6 +72,7 @@ public class ProcessRedirectNotify {
             // Set additional headers
 
             mailModifier.setRecipients(mailet.getRecipients(originalMail));
+
             mailModifier.setTo(mailet.getTo(originalMail));
             mailModifier.setSubjectPrefix(originalMail);
             mailModifier.setReplyTo(mailet.getReplyTo(originalMail));
@@ -86,7 +87,9 @@ public class ProcessRedirectNotify {
 
             if (senderDomainIsValid(newMail)) {
                 // Send it off...
-                mailet.getMailetContext().sendMail(newMail);
+                if (!newMail.getRecipients().isEmpty()) {
+                    mailet.getMailetContext().sendMail(newMail);
+                }
             } else {
                 throw new MessagingException(mailet.getMailetName() + " mailet cannot forward " + originalMail.getName() + ". " +
                         "Invalid sender domain for " + newMail.getSender() + ". " +

http://git-wip-us.apache.org/repos/asf/james-project/blob/01738f69/server/mailet/mailets/src/main/java/org/apache/james/transport/util/SpecialAddressesUtils.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/util/SpecialAddressesUtils.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/util/SpecialAddressesUtils.java
index 7cd8bcc..e80f8b6 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/util/SpecialAddressesUtils.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/util/SpecialAddressesUtils.java
@@ -86,6 +86,10 @@ public class SpecialAddressesUtils {
             return ImmutableSet.of(mailAddress);
         }
 
+        if (mailAddress.isNullSender()) {
+            return ImmutableList.of();
+        }
+
         SpecialAddressKind specialAddressKind = SpecialAddressKind.forValue(mailAddress.getLocalPart());
         if (specialAddressKind == null) {
             return ImmutableSet.of(mailAddress);
@@ -95,7 +99,7 @@ public class SpecialAddressesUtils {
             case FROM:
             case REVERSE_PATH:
                 return Optional.ofNullable(mail.getSender())
-                    .map(sender -> ImmutableSet.of(sender))
+                    .map(ImmutableSet::of)
                     .orElse(ImmutableSet.of());
             case REPLY_TO:
                 return getReplyTosFromMail(mail);
@@ -186,6 +190,7 @@ public class SpecialAddressesUtils {
             case SENDER:
             case REVERSE_PATH:
                 return Optional.ofNullable(mail.getSender())
+                    .filter(address -> !address.isNullSender())
                     .map(ImmutableSet::of)
                     .orElse(ImmutableSet.of());
             case FROM:

http://git-wip-us.apache.org/repos/asf/james-project/blob/01738f69/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/BounceTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/BounceTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/BounceTest.java
index cdde96b..2aa4ada 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/BounceTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/BounceTest.java
@@ -124,6 +124,27 @@ public class BounceTest {
     }
 
     @Test
+    public void bounceShouldNotSendEmailToNullSender() throws Exception {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+                .mailetName(MAILET_NAME)
+                .mailetContext(fakeMailContext)
+                .build();
+        bounce.init(mailetConfig);
+
+        FakeMail mail = FakeMail.builder()
+            .name(MAILET_NAME)
+            .sender(MailAddress.nullSender())
+            .recipient(MailAddressFixture.ANY_AT_JAMES)
+            .mimeMessage(MimeMessageBuilder.mimeMessageBuilder()
+                .setText("My content"))
+            .build();
+
+        bounce.service(mail);
+
+        assertThat(fakeMailContext.getSentMails()).isEmpty();
+    }
+
+    @Test
     public void bounceShouldChangeTheStateWhenNoSenderAndPassThroughEqualsFalse() throws Exception {
         FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
                 .mailetName(MAILET_NAME)

http://git-wip-us.apache.org/repos/asf/james-project/blob/01738f69/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RedirectTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RedirectTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RedirectTest.java
index ef490b3..4875680 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RedirectTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RedirectTest.java
@@ -385,12 +385,13 @@ public class RedirectTest {
 
 
         FakeMail mail = FakeMail.builder()
-                .name(MAILET_NAME)
-                .sender(MailAddressFixture.ANY_AT_JAMES)
-                .mimeMessage(MimeMessageBuilder.mimeMessageBuilder()
-                    .setSubject("My subject")
-                    .setText("content"))
-                .build();
+            .name(MAILET_NAME)
+            .recipient(MailAddressFixture.RECIPIENT1)
+            .sender(MailAddressFixture.ANY_AT_JAMES)
+            .mimeMessage(MimeMessageBuilder.mimeMessageBuilder()
+                .setSubject("My subject")
+                .setText("content"))
+            .build();
 
         redirect.service(mail);
 
@@ -411,6 +412,7 @@ public class RedirectTest {
         FakeMail mail = FakeMail.builder()
             .name(MAILET_NAME)
             .sender(MailAddressFixture.ANY_AT_JAMES)
+            .recipient(MailAddressFixture.RECIPIENT1)
             .mimeMessage(MimeMessageBuilder.mimeMessageBuilder()
                 .addHeader("Message-ID", messageId)
                 .setSubject("My subject")
@@ -437,6 +439,7 @@ public class RedirectTest {
         FakeMail mail = FakeMail.builder()
             .name(MAILET_NAME)
             .sender(MailAddressFixture.ANY_AT_JAMES)
+            .recipient(MailAddressFixture.RECIPIENT1)
             .mimeMessage(MimeMessageBuilder.mimeMessageBuilder()
                 .addHeader("Message-ID", messageId)
                 .setSubject("My subject")


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


[06/13] james-project git commit: JAMES-2545 implement a channel pool for rabbitmq cnx

Posted by bt...@apache.org.
JAMES-2545 implement a channel pool for rabbitmq cnx


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

Branch: refs/heads/master
Commit: 3313b53d978e5ae52cccd725258bb9804bd4aeee
Parents: 01738f6
Author: Matthieu Baechler <ma...@apache.org>
Authored: Mon Sep 10 18:11:41 2018 +0200
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Sep 14 10:17:42 2018 +0700

----------------------------------------------------------------------
 backends-common/rabbitmq/pom.xml                |   5 +
 .../backend/rabbitmq/RabbitChannelPool.java     | 103 +++++++++++++++++++
 .../james/queue/rabbitmq/RabbitClient.java      |  43 ++++----
 .../queue/rabbitmq/RabbitMQMailQueueTest.java   |   3 +-
 .../rabbitmq/RabbitMqMailQueueFactoryTest.java  |   3 +-
 5 files changed, 137 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/3313b53d/backends-common/rabbitmq/pom.xml
----------------------------------------------------------------------
diff --git a/backends-common/rabbitmq/pom.xml b/backends-common/rabbitmq/pom.xml
index d518753..9583901 100644
--- a/backends-common/rabbitmq/pom.xml
+++ b/backends-common/rabbitmq/pom.xml
@@ -63,6 +63,11 @@
             <artifactId>commons-configuration</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-pool2</artifactId>
+            <version>2.6.0</version>
+        </dependency>
+        <dependency>
             <groupId>javax.inject</groupId>
             <artifactId>javax.inject</artifactId>
         </dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/3313b53d/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitChannelPool.java
----------------------------------------------------------------------
diff --git a/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitChannelPool.java b/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitChannelPool.java
new file mode 100644
index 0000000..c4a9fe6
--- /dev/null
+++ b/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitChannelPool.java
@@ -0,0 +1,103 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.backend.rabbitmq;
+
+import org.apache.commons.pool2.BasePooledObjectFactory;
+import org.apache.commons.pool2.ObjectPool;
+import org.apache.commons.pool2.PooledObject;
+import org.apache.commons.pool2.impl.DefaultPooledObject;
+import org.apache.commons.pool2.impl.GenericObjectPool;
+
+import com.rabbitmq.client.Channel;
+import com.rabbitmq.client.Connection;
+
+public class RabbitChannelPool {
+
+    private static class ChannelBasePooledObjectFactory extends BasePooledObjectFactory<Channel> {
+        private final Connection connection;
+
+        public ChannelBasePooledObjectFactory(Connection connection) {
+            this.connection = connection;
+        }
+
+        @Override
+        public Channel create() throws Exception {
+            return connection.createChannel();
+        }
+
+        @Override
+        public PooledObject<Channel> wrap(Channel obj) {
+            return new DefaultPooledObject<>(obj);
+        }
+    }
+
+    @FunctionalInterface
+    public interface RabbitFunction<T, E extends Throwable> {
+        T execute(Channel channel) throws E;
+    }
+
+    @FunctionalInterface
+    public interface RabbitConsumer<E extends Throwable> {
+        void execute(Channel channel) throws E;
+    }
+
+    private final ObjectPool<Channel> pool;
+
+    public RabbitChannelPool(Connection connection) {
+        pool = new GenericObjectPool<>(
+            new ChannelBasePooledObjectFactory(connection));
+    }
+
+    public <T, E extends Throwable> T execute(RabbitFunction<T, E> f) throws E {
+        Channel channel = borrowChannel();
+        try {
+            return f.execute(channel);
+        } finally {
+            returnChannel(channel);
+        }
+    }
+
+
+    public <E extends Throwable> void execute(RabbitConsumer<E> f) throws E {
+        Channel channel = borrowChannel();
+        try {
+            f.execute(channel);
+        } finally {
+            returnChannel(channel);
+        }
+    }
+
+    private Channel borrowChannel() {
+        try {
+            return pool.borrowObject();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private void returnChannel(Channel channel) {
+        try {
+            pool.returnObject(channel);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/3313b53d/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitClient.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitClient.java b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitClient.java
index d5a945d..ae6b1be 100644
--- a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitClient.java
+++ b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitClient.java
@@ -22,11 +22,11 @@ package org.apache.james.queue.rabbitmq;
 import java.io.IOException;
 import java.util.Optional;
 
+import org.apache.james.backend.rabbitmq.RabbitChannelPool;
 import org.apache.james.queue.api.MailQueue;
 
 import com.google.common.collect.ImmutableMap;
 import com.rabbitmq.client.AMQP;
-import com.rabbitmq.client.Channel;
 import com.rabbitmq.client.GetResponse;
 
 class RabbitClient {
@@ -39,35 +39,42 @@ class RabbitClient {
     private static final ImmutableMap<String, Object> NO_ARGUMENTS = ImmutableMap.of();
     private static final String ROUTING_KEY = "";
 
-    private final Channel channel;
+    private final RabbitChannelPool channelPool;
 
-    RabbitClient(Channel channel) {
-        this.channel = channel;
+    RabbitClient(RabbitChannelPool channelPool) {
+        this.channelPool = channelPool;
     }
 
     void attemptQueueCreation(MailQueueName name) {
-        try {
-            channel.exchangeDeclare(name.toRabbitExchangeName().asString(), "direct", DURABLE);
-            channel.queueDeclare(name.toWorkQueueName().asString(), DURABLE, !EXCLUSIVE, !AUTO_DELETE, NO_ARGUMENTS);
-            channel.queueBind(name.toWorkQueueName().asString(), name.toRabbitExchangeName().asString(), ROUTING_KEY);
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
+        channelPool.execute(channel -> {
+            try {
+                channel.exchangeDeclare(name.toRabbitExchangeName().asString(), "direct", DURABLE);
+                channel.queueDeclare(name.toWorkQueueName().asString(), DURABLE, !EXCLUSIVE, !AUTO_DELETE, NO_ARGUMENTS);
+                channel.queueBind(name.toWorkQueueName().asString(), name.toRabbitExchangeName().asString(), ROUTING_KEY);
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+        });
     }
 
     void publish(MailQueueName name, byte[] message) throws MailQueue.MailQueueException {
-        try {
-            channel.basicPublish(name.toRabbitExchangeName().asString(), ROUTING_KEY, new AMQP.BasicProperties(), message);
-        } catch (IOException e) {
-            throw new MailQueue.MailQueueException("Unable to publish to RabbitMQ", e);
-        }
+        channelPool.execute(channel -> {
+            try {
+                channel.basicPublish(name.toRabbitExchangeName().asString(), ROUTING_KEY, new AMQP.BasicProperties(), message);
+            } catch (IOException e) {
+                throw new MailQueue.MailQueueException("Unable to publish to RabbitMQ", e);
+            }
+        });
     }
 
     void ack(long deliveryTag) throws IOException {
-        channel.basicAck(deliveryTag, !MULTIPLE);
+        RabbitChannelPool.RabbitConsumer<IOException> consumer = channel -> channel.basicAck(deliveryTag, !MULTIPLE);
+        channelPool.execute(consumer);
     }
 
     Optional<GetResponse> poll(MailQueueName name) throws IOException {
-        return Optional.ofNullable(channel.basicGet(name.toWorkQueueName().asString(), !AUTO_ACK));
+        RabbitChannelPool.RabbitFunction<Optional<GetResponse>, IOException> f = channel ->
+            Optional.ofNullable(channel.basicGet(name.toWorkQueueName().asString(), !AUTO_ACK));
+        return channelPool.execute(f);
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/3313b53d/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java
----------------------------------------------------------------------
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 aaf57f7..c2d5c07 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
@@ -28,6 +28,7 @@ import javax.mail.internet.MimeMessage;
 
 import org.apache.http.client.utils.URIBuilder;
 import org.apache.james.backend.rabbitmq.DockerRabbitMQ;
+import org.apache.james.backend.rabbitmq.RabbitChannelPool;
 import org.apache.james.backend.rabbitmq.ReusableDockerRabbitMQExtension;
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.DockerCassandraExtension;
@@ -70,7 +71,7 @@ public class RabbitMQMailQueueTest implements MailQueueContract {
             .setPort(rabbitMQ.getAdminPort())
             .build();
 
-        RabbitClient rabbitClient = new RabbitClient(rabbitMQ.connectionFactory().newConnection().createChannel());
+        RabbitClient rabbitClient = new RabbitClient(new RabbitChannelPool(rabbitMQ.connectionFactory().newConnection()));
         RabbitMQMailQueue.Factory factory = new RabbitMQMailQueue.Factory(rabbitClient, mimeMessageStore, BLOB_ID_FACTORY);
         RabbitMQManagementApi mqManagementApi = new RabbitMQManagementApi(rabbitManagementUri, new RabbitMQManagementCredentials("guest", "guest".toCharArray()));
         mailQueueFactory = new RabbitMQMailQueueFactory(rabbitClient, mqManagementApi, factory);

http://git-wip-us.apache.org/repos/asf/james-project/blob/3313b53d/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMqMailQueueFactoryTest.java
----------------------------------------------------------------------
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 cf1cb88..bbb4734 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
@@ -28,6 +28,7 @@ import javax.mail.internet.MimeMessage;
 
 import org.apache.http.client.utils.URIBuilder;
 import org.apache.james.backend.rabbitmq.DockerRabbitMQ;
+import org.apache.james.backend.rabbitmq.RabbitChannelPool;
 import org.apache.james.backend.rabbitmq.ReusableDockerRabbitMQExtension;
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.DockerCassandraExtension;
@@ -70,7 +71,7 @@ class RabbitMqMailQueueFactoryTest implements MailQueueFactoryContract<RabbitMQM
             .setPort(rabbitMQ.getAdminPort())
             .build();
 
-        RabbitClient rabbitClient = new RabbitClient(rabbitMQ.connectionFactory().newConnection().createChannel());
+        RabbitClient rabbitClient = new RabbitClient(new RabbitChannelPool(rabbitMQ.connectionFactory().newConnection()));
         RabbitMQMailQueue.Factory factory = new RabbitMQMailQueue.Factory(rabbitClient, mimeMessageStore, BLOB_ID_FACTORY);
         RabbitMQManagementApi mqManagementApi = new RabbitMQManagementApi(rabbitManagementUri, new RabbitMQManagementCredentials("guest", "guest".toCharArray()));
         mailQueueFactory = new RabbitMQMailQueueFactory(rabbitClient, mqManagementApi, factory);


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


[10/13] james-project git commit: JAMES-2544 Use CassandraCluster extension where applicable

Posted by bt...@apache.org.
http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java
index ca9f314..e504e61 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java
@@ -28,7 +28,7 @@ import java.util.Optional;
 import javax.mail.Flags;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MessageUid;
@@ -47,12 +47,9 @@ import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.github.steveash.guavate.Guavate;
 
@@ -64,8 +61,14 @@ public class CassandraIndexTableHandlerTest {
     public static final int UID_VALIDITY = 15;
     public static final long MODSEQ = 17;
 
-    @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-    private static CassandraCluster cassandra;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(
+        CassandraModule.aggregateModules(
+            CassandraMailboxCounterModule.MODULE,
+            CassandraMailboxRecentsModule.MODULE,
+            CassandraFirstUnseenModule.MODULE,
+            CassandraApplicableFlagsModule.MODULE,
+            CassandraDeletedMessageModule.MODULE));
 
     private CassandraMailboxCounterDAO mailboxCounterDAO;
     private CassandraMailboxRecentsDAO mailboxRecentsDAO;
@@ -75,19 +78,8 @@ public class CassandraIndexTableHandlerTest {
     private CassandraDeletedMessageDAO deletedMessageDAO;
     private Mailbox mailbox;
 
-    @BeforeClass
-    public static void setUpClass() {
-        CassandraModule modules = CassandraModule.aggregateModules(
-            CassandraMailboxCounterModule.MODULE,
-            CassandraMailboxRecentsModule.MODULE,
-            CassandraFirstUnseenModule.MODULE,
-            CassandraApplicableFlagsModule.MODULE,
-            CassandraDeletedMessageModule.MODULE);
-        cassandra = CassandraCluster.create(modules, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         mailboxCounterDAO = new CassandraMailboxCounterDAO(cassandra.getConf());
         mailboxRecentsDAO = new CassandraMailboxRecentsDAO(cassandra.getConf());
         firstUnseenDAO = new CassandraFirstUnseenDAO(cassandra.getConf());
@@ -105,18 +97,8 @@ public class CassandraIndexTableHandlerTest {
             MAILBOX_ID);
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void updateIndexOnAddShouldIncrementMessageCount() throws Exception {
+    void updateIndexOnAddShouldIncrementMessageCount() throws Exception {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags());
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -129,7 +111,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnAddShouldIncrementUnseenMessageCountWhenUnseen() throws Exception {
+    void updateIndexOnAddShouldIncrementUnseenMessageCountWhenUnseen() throws Exception {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags());
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -142,7 +124,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnAddShouldNotIncrementUnseenMessageCountWhenSeen() throws Exception {
+    void updateIndexOnAddShouldNotIncrementUnseenMessageCountWhenSeen() throws Exception {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags(Flags.Flag.SEEN));
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -155,7 +137,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnAddShouldNotAddRecentWhenNoRecent() throws Exception {
+    void updateIndexOnAddShouldNotAddRecentWhenNoRecent() {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags());
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -168,7 +150,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnAddShouldAddRecentWhenRecent() throws Exception {
+    void updateIndexOnAddShouldAddRecentWhenRecent() {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags(Flags.Flag.RECENT));
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -181,7 +163,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnDeleteShouldDecrementMessageCount() throws Exception {
+    void updateIndexOnDeleteShouldDecrementMessageCount() throws Exception {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags());
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -199,7 +181,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnDeleteShouldDecrementUnseenMessageCountWhenUnseen() throws Exception {
+    void updateIndexOnDeleteShouldDecrementUnseenMessageCountWhenUnseen() throws Exception {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags());
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -217,7 +199,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnDeleteShouldNotDecrementUnseenMessageCountWhenSeen() throws Exception {
+    void updateIndexOnDeleteShouldNotDecrementUnseenMessageCountWhenSeen() throws Exception {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags());
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -235,7 +217,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnDeleteShouldRemoveRecentWhenRecent() throws Exception {
+    void updateIndexOnDeleteShouldRemoveRecentWhenRecent() {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags(Flags.Flag.RECENT));
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -253,7 +235,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnDeleteShouldRemoveUidFromRecentAnyway() throws Exception {
+    void updateIndexOnDeleteShouldRemoveUidFromRecentAnyway() {
         // Clean up strategy if some flags updates missed
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags(Flags.Flag.RECENT));
@@ -272,7 +254,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnDeleteShouldDeleteMessageFromDeletedMessage() throws Exception {
+    void updateIndexOnDeleteShouldDeleteMessageFromDeletedMessage() {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.getUid()).thenReturn(MESSAGE_UID);
         deletedMessageDAO.addDeleted(MAILBOX_ID, MESSAGE_UID).join();
@@ -292,7 +274,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnFlagsUpdateShouldNotChangeMessageCount() throws Exception {
+    void updateIndexOnFlagsUpdateShouldNotChangeMessageCount() throws Exception {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags());
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -311,7 +293,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnFlagsUpdateShouldDecrementUnseenMessageCountWhenSeenIsSet() throws Exception {
+    void updateIndexOnFlagsUpdateShouldDecrementUnseenMessageCountWhenSeenIsSet() throws Exception {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags());
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -330,7 +312,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnFlagsUpdateShouldSaveMessageInDeletedMessageWhenDeletedFlagIsSet() throws Exception {
+    void updateIndexOnFlagsUpdateShouldSaveMessageInDeletedMessageWhenDeletedFlagIsSet() {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags());
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -352,7 +334,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnFlagsUpdateShouldRemoveMessageInDeletedMessageWhenDeletedFlagIsUnset() throws Exception {
+    void updateIndexOnFlagsUpdateShouldRemoveMessageInDeletedMessageWhenDeletedFlagIsUnset() {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags());
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -376,7 +358,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnFlagsUpdateShouldNotRemoveMessageInDeletedMessageWhenDeletedFlagIsNotUnset() throws Exception {
+    void updateIndexOnFlagsUpdateShouldNotRemoveMessageInDeletedMessageWhenDeletedFlagIsNotUnset() {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags());
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -400,7 +382,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnFlagsUpdateShouldNotSaveMessageInDeletedMessageWhenDeletedFlagIsNotSet() throws Exception {
+    void updateIndexOnFlagsUpdateShouldNotSaveMessageInDeletedMessageWhenDeletedFlagIsNotSet() {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags());
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -422,7 +404,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnFlagsUpdateShouldIncrementUnseenMessageCountWhenSeenIsUnset() throws Exception {
+    void updateIndexOnFlagsUpdateShouldIncrementUnseenMessageCountWhenSeenIsUnset() throws Exception {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags(Flags.Flag.SEEN));
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -441,7 +423,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnFlagsUpdateShouldNotChangeUnseenCountWhenBothSeen() throws Exception {
+    void updateIndexOnFlagsUpdateShouldNotChangeUnseenCountWhenBothSeen() throws Exception {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags(Flags.Flag.SEEN));
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -460,7 +442,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnFlagsUpdateShouldNotChangeUnseenCountWhenBothUnSeen() throws Exception {
+    void updateIndexOnFlagsUpdateShouldNotChangeUnseenCountWhenBothUnSeen() throws Exception {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags());
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -479,7 +461,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnFlagsUpdateShouldAddRecentOnSettingRecentFlag() throws Exception {
+    void updateIndexOnFlagsUpdateShouldAddRecentOnSettingRecentFlag() {
         // Clean up strategy if some flags updates missed
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags());
@@ -499,7 +481,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnFlagsUpdateShouldRemoveRecentOnUnsettingRecentFlag() throws Exception {
+    void updateIndexOnFlagsUpdateShouldRemoveRecentOnUnsettingRecentFlag() {
         // Clean up strategy if some flags updates missed
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags(Flags.Flag.RECENT));
@@ -519,7 +501,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnAddShouldUpdateFirstUnseenWhenUnseen() throws Exception {
+    void updateIndexOnAddShouldUpdateFirstUnseenWhenUnseen() {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags());
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -531,7 +513,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnAddShouldSaveMessageInDeletedWhenDeleted() throws Exception {
+    void updateIndexOnAddShouldSaveMessageInDeletedWhenDeleted() {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags(Flags.Flag.DELETED));
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -546,7 +528,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnAddShouldNotSaveMessageInDeletedWhenNotDeleted() throws Exception {
+    void updateIndexOnAddShouldNotSaveMessageInDeletedWhenNotDeleted() {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags());
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -561,7 +543,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnAddShouldNotUpdateFirstUnseenWhenSeen() throws Exception {
+    void updateIndexOnAddShouldNotUpdateFirstUnseenWhenSeen() {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags(Flags.Flag.SEEN));
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -572,7 +554,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnFlagsUpdateShouldUpdateLastUnseenWhenSetToSeen() throws Exception {
+    void updateIndexOnFlagsUpdateShouldUpdateLastUnseenWhenSetToSeen() {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags());
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -590,7 +572,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnFlagsUpdateShouldUpdateLastUnseenWhenSetToUnseen() throws Exception {
+    void updateIndexOnFlagsUpdateShouldUpdateLastUnseenWhenSetToUnseen() {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags(Flags.Flag.SEEN));
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -609,7 +591,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnFlagsUpdateShouldNotUpdateLastUnseenWhenKeepUnseen() throws Exception {
+    void updateIndexOnFlagsUpdateShouldNotUpdateLastUnseenWhenKeepUnseen() {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags());
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -628,7 +610,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnFlagsUpdateShouldNotUpdateLastUnseenWhenKeepSeen() throws Exception {
+    void updateIndexOnFlagsUpdateShouldNotUpdateLastUnseenWhenKeepSeen() {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags(Flags.Flag.SEEN));
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -646,7 +628,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnDeleteShouldUpdateFirstUnseenWhenUnseen() throws Exception {
+    void updateIndexOnDeleteShouldUpdateFirstUnseenWhenUnseen() {
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(new Flags());
         when(message.getUid()).thenReturn(MESSAGE_UID);
@@ -662,7 +644,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnAddShouldUpdateApplicableFlag() throws Exception {
+    void updateIndexOnAddShouldUpdateApplicableFlag() {
         Flags customFlags = new Flags("custom");
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(customFlags);
@@ -675,7 +657,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void updateIndexOnFlagsUpdateShouldUnionApplicableFlag() throws Exception {
+    void updateIndexOnFlagsUpdateShouldUnionApplicableFlag() {
         Flags customFlag = new Flags("custom");
         MailboxMessage message = mock(MailboxMessage.class);
         when(message.createFlags()).thenReturn(customFlag);
@@ -696,7 +678,7 @@ public class CassandraIndexTableHandlerTest {
     }
 
     @Test
-    public void applicableFlagShouldKeepAllFlagsEvenTheMessageRemovesFlag() throws Exception {
+    void applicableFlagShouldKeepAllFlagsEvenTheMessageRemovesFlag() {
         Flags messageFlags = FlagsBuilder.builder()
             .add("custom1", "custom2", "custom3")
             .build();

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java
index fb14a1e..6292f98 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java
@@ -22,81 +22,64 @@ package org.apache.james.mailbox.cassandra.mail;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;
 import org.apache.james.mailbox.model.MailboxCounters;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
-
-public class CassandraMailboxCounterDAOTest {
-    public static final int UID_VALIDITY = 15;
-    public static final CassandraId MAILBOX_ID = CassandraId.timeBased();
-
-    @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-    private static CassandraCluster cassandra;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+class CassandraMailboxCounterDAOTest {
+    private static final int UID_VALIDITY = 15;
+    private static final CassandraId MAILBOX_ID = CassandraId.timeBased();
+
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraMailboxCounterModule.MODULE);
+
     private CassandraMailboxCounterDAO testee;
     private SimpleMailbox mailbox;
 
-    @BeforeClass
-    public static void setUpClass() {
-        cassandra = CassandraCluster.create(CassandraMailboxCounterModule.MODULE, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         testee = new CassandraMailboxCounterDAO(cassandra.getConf());
 
         mailbox = new SimpleMailbox(MailboxPath.forUser("user", "name"), UID_VALIDITY, MAILBOX_ID);
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void countMessagesInMailboxShouldReturnEmptyByDefault() throws Exception {
+    void countMessagesInMailboxShouldReturnEmptyByDefault() throws Exception {
         assertThat(testee.countMessagesInMailbox(mailbox).join()).isEmpty();
     }
 
     @Test
-    public void countUnseenMessagesInMailboxShouldReturnEmptyByDefault() throws Exception {
+    void countUnseenMessagesInMailboxShouldReturnEmptyByDefault() throws Exception {
         assertThat(testee.countUnseenMessagesInMailbox(mailbox).join()).isEmpty();
     }
 
     @Test
-    public void retrieveMailboxCounterShouldReturnEmptyByDefault() throws Exception {
+    void retrieveMailboxCounterShouldReturnEmptyByDefault() throws Exception {
         assertThat(testee.retrieveMailboxCounters(mailbox).join()).isEmpty();
     }
 
     @Test
-    public void incrementCountShouldAddOneWhenAbsent() throws Exception {
+    void incrementCountShouldAddOneWhenAbsent() throws Exception {
         testee.incrementCount(MAILBOX_ID).join();
 
         assertThat(testee.countMessagesInMailbox(mailbox).join()).contains(1L);
     }
 
     @Test
-    public void incrementUnseenShouldAddOneWhenAbsent() throws Exception {
+    void incrementUnseenShouldAddOneWhenAbsent() throws Exception {
         testee.incrementUnseen(MAILBOX_ID).join();
 
         assertThat(testee.countUnseenMessagesInMailbox(mailbox).join()).contains(1L);
     }
 
     @Test
-    public void incrementUnseenShouldAddOneWhenAbsentOnMailboxCounters() throws Exception {
+    void incrementUnseenShouldAddOneWhenAbsentOnMailboxCounters() throws Exception {
         testee.incrementUnseen(MAILBOX_ID).join();
 
         assertThat(testee.retrieveMailboxCounters(mailbox).join())
@@ -107,7 +90,7 @@ public class CassandraMailboxCounterDAOTest {
     }
 
     @Test
-    public void incrementCountShouldAddOneWhenAbsentOnMailboxCounters() throws Exception {
+    void incrementCountShouldAddOneWhenAbsentOnMailboxCounters() throws Exception {
         testee.incrementCount(MAILBOX_ID).join();
 
         assertThat(testee.retrieveMailboxCounters(mailbox).join())
@@ -118,7 +101,7 @@ public class CassandraMailboxCounterDAOTest {
     }
 
     @Test
-    public void retrieveMailboxCounterShouldWorkWhenFullRow() throws Exception {
+    void retrieveMailboxCounterShouldWorkWhenFullRow() throws Exception {
         testee.incrementCount(MAILBOX_ID).join();
         testee.incrementUnseen(MAILBOX_ID).join();
 
@@ -130,7 +113,7 @@ public class CassandraMailboxCounterDAOTest {
     }
 
     @Test
-    public void decrementCountShouldRemoveOne() throws Exception {
+    void decrementCountShouldRemoveOne() throws Exception {
         testee.incrementCount(MAILBOX_ID).join();
 
         testee.decrementCount(MAILBOX_ID).join();
@@ -140,7 +123,7 @@ public class CassandraMailboxCounterDAOTest {
     }
 
     @Test
-    public void decrementUnseenShouldRemoveOne() throws Exception {
+    void decrementUnseenShouldRemoveOne() throws Exception {
         testee.incrementUnseen(MAILBOX_ID).join();
 
         testee.decrementUnseen(MAILBOX_ID).join();
@@ -150,7 +133,7 @@ public class CassandraMailboxCounterDAOTest {
     }
 
     @Test
-    public void incrementUnseenShouldHaveNoImpactOnMessageCount() throws Exception {
+    void incrementUnseenShouldHaveNoImpactOnMessageCount() throws Exception {
         testee.incrementUnseen(MAILBOX_ID).join();
 
         assertThat(testee.countMessagesInMailbox(mailbox).join())
@@ -158,7 +141,7 @@ public class CassandraMailboxCounterDAOTest {
     }
 
     @Test
-    public void incrementCountShouldHaveNoEffectOnUnseenCount() throws Exception {
+    void incrementCountShouldHaveNoEffectOnUnseenCount() throws Exception {
         testee.incrementCount(MAILBOX_ID).join();
 
         assertThat(testee.countUnseenMessagesInMailbox(mailbox).join())
@@ -166,7 +149,7 @@ public class CassandraMailboxCounterDAOTest {
     }
 
     @Test
-    public void decrementUnseenShouldHaveNoEffectOnMessageCount() throws Exception {
+    void decrementUnseenShouldHaveNoEffectOnMessageCount() throws Exception {
         testee.incrementCount(MAILBOX_ID).join();
 
         testee.decrementUnseen(MAILBOX_ID).join();
@@ -176,7 +159,7 @@ public class CassandraMailboxCounterDAOTest {
     }
 
     @Test
-    public void decrementCountShouldHaveNoEffectOnUnseenCount() throws Exception {
+    void decrementCountShouldHaveNoEffectOnUnseenCount() throws Exception {
         testee.incrementUnseen(MAILBOX_ID).join();
 
         testee.decrementCount(MAILBOX_ID).join();
@@ -186,7 +169,7 @@ public class CassandraMailboxCounterDAOTest {
     }
 
     @Test
-    public void decrementCountCanLeadToNegativeValue() throws Exception {
+    void decrementCountCanLeadToNegativeValue() throws Exception {
         testee.decrementCount(MAILBOX_ID).join();
 
         assertThat(testee.countMessagesInMailbox(mailbox).join())
@@ -194,7 +177,7 @@ public class CassandraMailboxCounterDAOTest {
     }
 
     @Test
-    public void decrementUnseenCanLeadToNegativeValue() throws Exception {
+    void decrementUnseenCanLeadToNegativeValue() throws Exception {
         testee.decrementUnseen(MAILBOX_ID).join();
 
         assertThat(testee.countUnseenMessagesInMailbox(mailbox).join())

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAOTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAOTest.java
index 6844f5e..09dc1ee 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAOTest.java
@@ -25,45 +25,39 @@ import java.util.List;
 import java.util.Optional;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.github.steveash.guavate.Guavate;
 
-public class CassandraMailboxDAOTest {
+class CassandraMailboxDAOTest {
+    private static final int UID_VALIDITY_1 = 145;
+    private static final int UID_VALIDITY_2 = 147;
+    private static final MailboxPath NEW_MAILBOX_PATH = MailboxPath.forUser("user", "xyz");
+    private static CassandraId CASSANDRA_ID_1 = CassandraId.timeBased();
+    private static CassandraId CASSANDRA_ID_2 = CassandraId.timeBased();
 
-    public static final int UID_VALIDITY_1 = 145;
-    public static final int UID_VALIDITY_2 = 147;
-    public static final MailboxPath NEW_MAILBOX_PATH = MailboxPath.forUser("user", "xyz");
-    public static CassandraId CASSANDRA_ID_1 = CassandraId.timeBased();
-    public static CassandraId CASSANDRA_ID_2 = CassandraId.timeBased();
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(
+        CassandraModule.aggregateModules(
+            CassandraMailboxModule.MODULE,
+            CassandraAclModule.MODULE));
 
-    @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-    private static CassandraCluster cassandra;
 
     private CassandraMailboxDAO testee;
     private SimpleMailbox mailbox1;
     private SimpleMailbox mailbox2;
 
-    @BeforeClass
-    public static void setUpClass() {
-        CassandraModule modules = CassandraModule.aggregateModules(CassandraMailboxModule.MODULE, CassandraAclModule.MODULE);
-        cassandra = CassandraCluster.create(modules, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         testee = new CassandraMailboxDAO(cassandra.getConf(), cassandra.getTypesProvider());
 
         mailbox1 = new SimpleMailbox(MailboxPath.forUser("user", "abcd"),
@@ -74,24 +68,14 @@ public class CassandraMailboxDAOTest {
             CASSANDRA_ID_2);
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void retrieveMailboxShouldReturnEmptyWhenNone() {
+    void retrieveMailboxShouldReturnEmptyWhenNone() {
         assertThat(testee.retrieveMailbox(CASSANDRA_ID_1).join())
             .isEmpty();
     }
 
     @Test
-    public void saveShouldAddAMailbox() {
+    void saveShouldAddAMailbox() {
         testee.save(mailbox1).join();
 
         Optional<SimpleMailbox> readMailbox = testee.retrieveMailbox(CASSANDRA_ID_1)
@@ -101,7 +85,7 @@ public class CassandraMailboxDAOTest {
     }
 
     @Test
-    public void saveShouldOverride() {
+    void saveShouldOverride() {
         testee.save(mailbox1).join();
 
         mailbox2.setMailboxId(CASSANDRA_ID_1);
@@ -115,7 +99,7 @@ public class CassandraMailboxDAOTest {
     }
 
     @Test
-    public void retrieveAllMailboxesShouldBeEmptyByDefault() {
+    void retrieveAllMailboxesShouldBeEmptyByDefault() {
         List<SimpleMailbox> mailboxes = testee.retrieveAllMailboxes()
             .join()
             .collect(Guavate.toImmutableList());
@@ -124,7 +108,7 @@ public class CassandraMailboxDAOTest {
     }
 
     @Test
-    public void retrieveAllMailboxesShouldReturnSingleMailbox() {
+    void retrieveAllMailboxesShouldReturnSingleMailbox() {
         testee.save(mailbox1).join();
 
         List<SimpleMailbox> mailboxes = testee.retrieveAllMailboxes()
@@ -135,7 +119,7 @@ public class CassandraMailboxDAOTest {
     }
 
     @Test
-    public void retrieveAllMailboxesShouldReturnMultiMailboxes() {
+    void retrieveAllMailboxesShouldReturnMultiMailboxes() {
         testee.save(mailbox1).join();
         testee.save(mailbox2).join();
 
@@ -147,12 +131,12 @@ public class CassandraMailboxDAOTest {
     }
 
     @Test
-    public void deleteShouldNotFailWhenMailboxIsAbsent() {
+    void deleteShouldNotFailWhenMailboxIsAbsent() {
         testee.delete(CASSANDRA_ID_1).join();
     }
 
     @Test
-    public void deleteShouldRemoveExistingMailbox() {
+    void deleteShouldRemoveExistingMailbox() {
         testee.save(mailbox1).join();
 
         testee.delete(CASSANDRA_ID_1).join();
@@ -162,12 +146,12 @@ public class CassandraMailboxDAOTest {
     }
 
     @Test
-    public void updateShouldNotFailWhenMailboxIsAbsent() {
+    void updateShouldNotFailWhenMailboxIsAbsent() {
         testee.updatePath(CASSANDRA_ID_1, NEW_MAILBOX_PATH).join();
     }
 
     @Test
-    public void updateShouldChangeMailboxPath() {
+    void updateShouldChangeMailboxPath() {
         testee.save(mailbox1).join();
 
         testee.updatePath(CASSANDRA_ID_1, NEW_MAILBOX_PATH).join();

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java
index ef7b1b1..b4f8090 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java
@@ -25,7 +25,7 @@ import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.mailbox.cassandra.mail.utils.GuiceUtils;
 import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
@@ -34,50 +34,33 @@ import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
 import org.apache.james.util.concurrency.ConcurrentTestRunner;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class CassandraMailboxMapperConcurrencyTest {
+class CassandraMailboxMapperConcurrencyTest {
 
     private static final int UID_VALIDITY = 52;
     private static final MailboxPath MAILBOX_PATH = MailboxPath.forUser("user", "name");
     private static final int THREAD_COUNT = 10;
     private static final int OPERATION_COUNT = 10;
 
-    @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-
-    private static CassandraCluster cassandra;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(
+        CassandraModule.aggregateModules(
+            CassandraMailboxModule.MODULE,
+            CassandraAclModule.MODULE));
 
     private CassandraMailboxMapper testee;
 
-    @BeforeClass
-    public static void setUpClass() {
-        CassandraModule modules = CassandraModule.aggregateModules(CassandraMailboxModule.MODULE, CassandraAclModule.MODULE);
-        cassandra = CassandraCluster.create(modules, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         testee = GuiceUtils.testInjector(cassandra)
             .getInstance(CassandraMailboxMapper.class);
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void saveShouldBeThreadSafe() throws Exception {
+    void saveShouldBeThreadSafe() throws Exception {
         boolean termination = ConcurrentTestRunner.builder()
             .threadCount(THREAD_COUNT)
             .operationCount(OPERATION_COUNT)
@@ -90,7 +73,7 @@ public class CassandraMailboxMapperConcurrencyTest {
     }
 
     @Test
-    public void saveWithUpdateShouldBeThreadSafe() throws Exception {
+    void saveWithUpdateShouldBeThreadSafe() throws Exception {
         SimpleMailbox mailbox = new SimpleMailbox(MAILBOX_PATH, UID_VALIDITY);
         testee.save(mailbox);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImplTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImplTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImplTest.java
index d1ab133..429b8af 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImplTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImplTest.java
@@ -21,19 +21,20 @@ package org.apache.james.mailbox.cassandra.mail;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-import org.junit.Test;
+import org.apache.james.backends.cassandra.CassandraCluster;
+import org.junit.jupiter.api.Test;
 
 import com.github.steveash.guavate.Guavate;
 
-public class CassandraMailboxPathDAOImplTest extends CassandraMailboxPathDAOTest {
+class CassandraMailboxPathDAOImplTest extends CassandraMailboxPathDAOTest {
 
     @Override
-    CassandraMailboxPathDAO testee() {
+    CassandraMailboxPathDAO testee(CassandraCluster cassandra) {
         return new CassandraMailboxPathDAOImpl(cassandra.getConf(), cassandra.getTypesProvider());
     }
 
     @Test
-    public void countAllShouldReturnEntryCount() {
+    void countAllShouldReturnEntryCount() {
         testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).join();
         testee.save(USER_OUTBOX_MAILBOXPATH, OUTBOX_ID).join();
         testee.save(OTHER_USER_MAILBOXPATH, otherMailboxId).join();
@@ -45,7 +46,7 @@ public class CassandraMailboxPathDAOImplTest extends CassandraMailboxPathDAOTest
     }
 
     @Test
-    public void countAllShouldReturnZeroByDefault() {
+    void countAllShouldReturnZeroByDefault() {
         CassandraMailboxPathDAOImpl daoV1 = (CassandraMailboxPathDAOImpl) testee;
 
         assertThat(daoV1.countAll().join())
@@ -53,7 +54,7 @@ public class CassandraMailboxPathDAOImplTest extends CassandraMailboxPathDAOTest
     }
 
     @Test
-    public void readAllShouldReturnAllStoredData() {
+    void readAllShouldReturnAllStoredData() {
         testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).join();
         testee.save(USER_OUTBOX_MAILBOXPATH, OUTBOX_ID).join();
         testee.save(OTHER_USER_MAILBOXPATH, otherMailboxId).join();
@@ -68,7 +69,7 @@ public class CassandraMailboxPathDAOImplTest extends CassandraMailboxPathDAOTest
     }
 
     @Test
-    public void readAllShouldReturnEmptyByDefault() {
+    void readAllShouldReturnEmptyByDefault() {
         CassandraMailboxPathDAOImpl daoV1 = (CassandraMailboxPathDAOImpl) testee;
 
         assertThat(daoV1.readAll().join().collect(Guavate.toImmutableList()))

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java
index db054cd..2071b0f 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java
@@ -24,16 +24,13 @@ import static org.assertj.core.api.Assertions.assertThat;
 import java.util.List;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
 import org.apache.james.mailbox.model.MailboxPath;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.github.steveash.guavate.Guavate;
 
@@ -51,41 +48,25 @@ public abstract class CassandraMailboxPathDAOTest {
     public static final MailboxPath USER_OUTBOX_MAILBOXPATH = MailboxPath.forUser(USER, "OUTBOX");
     public static final MailboxPath OTHER_USER_MAILBOXPATH = MailboxPath.forUser(OTHER_USER, "INBOX");
 
-    @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-
-    protected static CassandraCluster cassandra;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraMailboxModule.MODULE);
 
     protected CassandraMailboxPathDAO testee;
 
-    abstract CassandraMailboxPathDAO testee();
-
-    @BeforeClass
-    public static void setUpClass() {
-        cassandra = CassandraCluster.create(CassandraMailboxModule.MODULE, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() throws Exception {
-        testee = testee();
-    }
-
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
+    abstract CassandraMailboxPathDAO testee(CassandraCluster cassandra);
 
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
+        testee = testee(cassandra);
     }
 
     @Test
-    public void cassandraIdAndPathShouldRespectBeanContract() {
+    void cassandraIdAndPathShouldRespectBeanContract() {
         EqualsVerifier.forClass(CassandraIdAndPath.class).verify();
     }
 
     @Test
-    public void saveShouldInsertNewEntry() {
+    void saveShouldInsertNewEntry() {
         assertThat(testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).join()).isTrue();
 
         assertThat(testee.retrieveId(USER_INBOX_MAILBOXPATH).join())
@@ -93,20 +74,20 @@ public abstract class CassandraMailboxPathDAOTest {
     }
 
     @Test
-    public void saveOnSecondShouldBeFalse() {
+    void saveOnSecondShouldBeFalse() {
         assertThat(testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).join()).isTrue();
         assertThat(testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).join()).isFalse();
     }
 
     @Test
-    public void retrieveIdShouldReturnEmptyWhenEmptyData() {
+    void retrieveIdShouldReturnEmptyWhenEmptyData() {
         assertThat(testee.retrieveId(USER_INBOX_MAILBOXPATH).join()
             .isPresent())
             .isFalse();
     }
 
     @Test
-    public void retrieveIdShouldReturnStoredData() {
+    void retrieveIdShouldReturnStoredData() {
         testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).join();
 
         assertThat(testee.retrieveId(USER_INBOX_MAILBOXPATH).join())
@@ -114,7 +95,7 @@ public abstract class CassandraMailboxPathDAOTest {
     }
 
     @Test
-    public void getUserMailboxesShouldReturnAllMailboxesOfUser() {
+    void getUserMailboxesShouldReturnAllMailboxesOfUser() {
         testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).join();
         testee.save(USER_OUTBOX_MAILBOXPATH, OUTBOX_ID).join();
         testee.save(OTHER_USER_MAILBOXPATH, otherMailboxId).join();
@@ -130,12 +111,12 @@ public abstract class CassandraMailboxPathDAOTest {
     }
 
     @Test
-    public void deleteShouldNotThrowWhenEmpty() {
+    void deleteShouldNotThrowWhenEmpty() {
         testee.delete(USER_INBOX_MAILBOXPATH).join();
     }
 
     @Test
-    public void deleteShouldDeleteTheExistingMailboxId() {
+    void deleteShouldDeleteTheExistingMailboxId() {
         testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).join();
 
         testee.delete(USER_INBOX_MAILBOXPATH).join();

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAOTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAOTest.java
index 1840821..dc1f559 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAOTest.java
@@ -19,11 +19,12 @@
 
 package org.apache.james.mailbox.cassandra.mail;
 
+import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 
 public class CassandraMailboxPathV2DAOTest extends CassandraMailboxPathDAOTest {
     @Override
-    CassandraMailboxPathDAO testee() {
+    CassandraMailboxPathDAO testee(CassandraCluster cassandra) {
         return new CassandraMailboxPathV2DAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION);
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentDAOTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentDAOTest.java
index d5767eb..f189677 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentDAOTest.java
@@ -24,58 +24,39 @@ import static org.assertj.core.api.Assertions.assertThat;
 import java.util.stream.IntStream;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.modules.CassandraMailboxRecentsModule;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.github.steveash.guavate.Guavate;
 
-public class CassandraMailboxRecentDAOTest {
-    public static final MessageUid UID1 = MessageUid.of(36L);
-    public static final MessageUid UID2 = MessageUid.of(37L);
-    public static final CassandraId CASSANDRA_ID = CassandraId.timeBased();
+class CassandraMailboxRecentDAOTest {
+    private static final MessageUid UID1 = MessageUid.of(36L);
+    private static final MessageUid UID2 = MessageUid.of(37L);
+    private static final CassandraId CASSANDRA_ID = CassandraId.timeBased();
 
-    @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-
-    private static CassandraCluster cassandra;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraMailboxRecentsModule.MODULE);
 
     private CassandraMailboxRecentsDAO testee;
 
-    @BeforeClass
-    public static void setUpClass() {
-        cassandra = CassandraCluster.create(CassandraMailboxRecentsModule.MODULE, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         testee = new CassandraMailboxRecentsDAO(cassandra.getConf());
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void getRecentMessageUidsInMailboxShouldBeEmptyByDefault() throws Exception {
+    void getRecentMessageUidsInMailboxShouldBeEmptyByDefault() {
         assertThat(testee.getRecentMessageUidsInMailbox(CASSANDRA_ID).join()
             .collect(Guavate.toImmutableList())).isEmpty();
     }
 
     @Test
-    public void addToRecentShouldAddUidWhenEmpty() throws Exception {
+    void addToRecentShouldAddUidWhenEmpty() {
         testee.addToRecent(CASSANDRA_ID, UID1).join();
 
         assertThat(testee.getRecentMessageUidsInMailbox(CASSANDRA_ID).join()
@@ -83,7 +64,7 @@ public class CassandraMailboxRecentDAOTest {
     }
 
     @Test
-    public void removeFromRecentShouldRemoveUidWhenOnlyOneUid() throws Exception {
+    void removeFromRecentShouldRemoveUidWhenOnlyOneUid() {
         testee.addToRecent(CASSANDRA_ID, UID1).join();
 
         testee.removeFromRecent(CASSANDRA_ID, UID1).join();
@@ -93,7 +74,7 @@ public class CassandraMailboxRecentDAOTest {
     }
 
     @Test
-    public void removeFromRecentShouldNotFailIfNotExisting() throws Exception {
+    void removeFromRecentShouldNotFailIfNotExisting() {
         testee.removeFromRecent(CASSANDRA_ID, UID1).join();
 
         assertThat(testee.getRecentMessageUidsInMailbox(CASSANDRA_ID).join()
@@ -101,7 +82,7 @@ public class CassandraMailboxRecentDAOTest {
     }
 
     @Test
-    public void addToRecentShouldAddUidWhenNotEmpty() throws Exception {
+    void addToRecentShouldAddUidWhenNotEmpty() {
         testee.addToRecent(CASSANDRA_ID, UID1).join();
 
         testee.addToRecent(CASSANDRA_ID, UID2).join();
@@ -111,7 +92,7 @@ public class CassandraMailboxRecentDAOTest {
     }
 
     @Test
-    public void removeFromRecentShouldOnlyRemoveUidWhenNotEmpty() throws Exception {
+    void removeFromRecentShouldOnlyRemoveUidWhenNotEmpty() {
         testee.addToRecent(CASSANDRA_ID, UID1).join();
         testee.addToRecent(CASSANDRA_ID, UID2).join();
 
@@ -122,7 +103,7 @@ public class CassandraMailboxRecentDAOTest {
     }
 
     @Test
-    public void addToRecentShouldBeIdempotent() throws Exception {
+    void addToRecentShouldBeIdempotent() {
         testee.addToRecent(CASSANDRA_ID, UID1).join();
         testee.addToRecent(CASSANDRA_ID, UID1).join();
 
@@ -131,7 +112,7 @@ public class CassandraMailboxRecentDAOTest {
     }
 
     @Test
-    public void getRecentMessageUidsInMailboxShouldNotTimeoutWhenOverPagingLimit() throws Exception {
+    void getRecentMessageUidsInMailboxShouldNotTimeoutWhenOverPagingLimit() {
         int pageSize = 5000;
         int size = pageSize + 1000;
         IntStream.range(0, size)

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
index 2c89621..da90b78 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
@@ -35,7 +35,7 @@ import javax.mail.util.SharedByteArrayInputStream;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.blob.api.HashBlobId;
@@ -55,12 +55,9 @@ import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
 import org.apache.james.util.streams.Limit;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
@@ -68,15 +65,18 @@ import com.google.common.primitives.Bytes;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
-public class CassandraMessageDAOTest {
+class CassandraMessageDAOTest {
     private static final int BODY_START = 16;
     private static final CassandraId MAILBOX_ID = CassandraId.timeBased();
     private static final String CONTENT = "Subject: Test7 \n\nBody7\n.\n";
     private static final MessageUid messageUid = MessageUid.of(1);
     private static final List<MessageAttachment> NO_ATTACHMENT = ImmutableList.of();
 
-    @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-    private static CassandraCluster cassandra;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(
+        CassandraModule.aggregateModules(
+            CassandraMessageModule.MODULE,
+            CassandraBlobModule.MODULE));
 
     private CassandraMessageDAO testee;
     private CassandraMessageId.Factory messageIdFactory;
@@ -85,14 +85,8 @@ public class CassandraMessageDAOTest {
     private CassandraMessageId messageId;
     private List<ComposedMessageIdWithMetaData> messageIds;
 
-    @BeforeClass
-    public static void setUpClass() {
-        CassandraModule modules = CassandraModule.aggregateModules(CassandraMessageModule.MODULE, CassandraBlobModule.MODULE);
-        cassandra = CassandraCluster.create(modules, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         messageIdFactory = new CassandraMessageId.Factory();
         messageId = messageIdFactory.generate();
         CassandraBlobsDAO blobsDAO = new CassandraBlobsDAO(cassandra.getConf());
@@ -107,18 +101,8 @@ public class CassandraMessageDAOTest {
                 .build());
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void saveShouldSaveNullValueForTextualLineCountAsZero() throws Exception {
+    void saveShouldSaveNullValueForTextualLineCountAsZero() throws Exception {
         message = createMessage(messageId, CONTENT, BODY_START, new PropertyBuilder(), NO_ATTACHMENT);
 
         testee.save(message).join();
@@ -131,7 +115,7 @@ public class CassandraMessageDAOTest {
     }
 
     @Test
-    public void saveShouldSaveTextualLineCount() throws Exception {
+    void saveShouldSaveTextualLineCount() throws Exception {
         long textualLineCount = 10L;
         PropertyBuilder propertyBuilder = new PropertyBuilder();
         propertyBuilder.setTextualLineCount(textualLineCount);
@@ -146,7 +130,7 @@ public class CassandraMessageDAOTest {
     }
 
     @Test
-    public void saveShouldStoreMessageWithFullContent() throws Exception {
+    void saveShouldStoreMessageWithFullContent() throws Exception {
         message = createMessage(messageId, CONTENT, BODY_START, new PropertyBuilder(), NO_ATTACHMENT);
 
         testee.save(message).join();
@@ -159,7 +143,7 @@ public class CassandraMessageDAOTest {
     }
 
     @Test
-    public void saveShouldStoreMessageWithBodyContent() throws Exception {
+    void saveShouldStoreMessageWithBodyContent() throws Exception {
         message = createMessage(messageId, CONTENT, BODY_START, new PropertyBuilder(), NO_ATTACHMENT);
 
         testee.save(message).join();
@@ -175,7 +159,7 @@ public class CassandraMessageDAOTest {
     }
 
     @Test
-    public void saveShouldStoreMessageWithHeaderContent() throws Exception {
+    void saveShouldStoreMessageWithHeaderContent() throws Exception {
         message = createMessage(messageId, CONTENT, BODY_START, new PropertyBuilder(), NO_ATTACHMENT);
 
         testee.save(message).join();
@@ -211,14 +195,14 @@ public class CassandraMessageDAOTest {
     }
 
     @Test
-    public void retrieveAllMessageIdAttachmentIdsShouldReturnEmptyWhenNone() {
+    void retrieveAllMessageIdAttachmentIdsShouldReturnEmptyWhenNone() {
         Stream<MessageIdAttachmentIds> actual = testee.retrieveAllMessageIdAttachmentIds().join();
         
         assertThat(actual).isEmpty();
     }
 
     @Test
-    public void retrieveAllMessageIdAttachmentIdsShouldReturnOneWhenStored() throws Exception {
+    void retrieveAllMessageIdAttachmentIdsShouldReturnOneWhenStored() throws Exception {
         //Given
         MessageAttachment attachment = MessageAttachment.builder()
             .attachment(Attachment.builder()
@@ -238,7 +222,7 @@ public class CassandraMessageDAOTest {
     }
 
     @Test
-    public void retrieveAllMessageIdAttachmentIdsShouldReturnOneWhenStoredWithTwoAttachments() throws Exception {
+    void retrieveAllMessageIdAttachmentIdsShouldReturnOneWhenStoredWithTwoAttachments() throws Exception {
         //Given
         MessageAttachment attachment1 = MessageAttachment.builder()
             .attachment(Attachment.builder()
@@ -264,7 +248,7 @@ public class CassandraMessageDAOTest {
     }
     
     @Test
-    public void retrieveAllMessageIdAttachmentIdsShouldReturnAllWhenStoredWithAttachment() throws Exception {
+    void retrieveAllMessageIdAttachmentIdsShouldReturnAllWhenStoredWithAttachment() throws Exception {
         //Given
         MessageId messageId1 = messageIdFactory.generate();
         MessageId messageId2 = messageIdFactory.generate();
@@ -295,7 +279,7 @@ public class CassandraMessageDAOTest {
     }
     
     @Test
-    public void retrieveAllMessageIdAttachmentIdsShouldReturnEmtpyWhenStoredWithoutAttachment() throws Exception {
+    void retrieveAllMessageIdAttachmentIdsShouldReturnEmtpyWhenStoredWithoutAttachment() throws Exception {
         //Given
         SimpleMailboxMessage message1 = createMessage(messageId, CONTENT, BODY_START, new PropertyBuilder(), NO_ATTACHMENT);
         testee.save(message1).join();
@@ -308,7 +292,7 @@ public class CassandraMessageDAOTest {
     }
     
     @Test
-    public void retrieveAllMessageIdAttachmentIdsShouldFilterMessagesWithoutAttachment() throws Exception {
+    void retrieveAllMessageIdAttachmentIdsShouldFilterMessagesWithoutAttachment() throws Exception {
         //Given
         MessageId messageId1 = messageIdFactory.generate();
         MessageId messageId2 = messageIdFactory.generate();
@@ -341,19 +325,19 @@ public class CassandraMessageDAOTest {
     }
 
     @Test
-    public void messageIdAttachmentIdsShouldMatchBeanContract() {
+    void messageIdAttachmentIdsShouldMatchBeanContract() {
         EqualsVerifier.forClass(MessageIdAttachmentIds.class)
             .verify();
     }
 
     @Test
-    public void messageIdAttachmentIdsShouldThrowOnNullMessageId() {
+    void messageIdAttachmentIdsShouldThrowOnNullMessageId() {
         assertThatThrownBy(() -> new MessageIdAttachmentIds(null, ImmutableSet.of()))
             .isInstanceOf(NullPointerException.class);
     }
 
     @Test
-    public void messageIdAttachmentIdsShouldThrowOnNullAttachmentIds() {
+    void messageIdAttachmentIdsShouldThrowOnNullAttachmentIds() {
         assertThatThrownBy(() -> new MessageIdAttachmentIds(messageIdFactory.generate(), null))
             .isInstanceOf(NullPointerException.class);
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAOTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAOTest.java
index d4514ca..26947ab 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAOTest.java
@@ -29,7 +29,7 @@ import javax.mail.Flags;
 import javax.mail.Flags.Flag;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
@@ -37,51 +37,31 @@ import org.apache.james.mailbox.cassandra.modules.CassandraMessageModule;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
 import org.apache.james.mailbox.model.MessageRange;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class CassandraMessageIdDAOTest {
-
-    @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-
-    private static CassandraCluster cassandra;
+class CassandraMessageIdDAOTest {
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraMessageModule.MODULE);
 
     private CassandraMessageId.Factory messageIdFactory;
     private CassandraMessageIdDAO testee;
 
-    @BeforeClass
-    public static void setUpClass() {
-        cassandra = CassandraCluster.create(CassandraMessageModule.MODULE, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         messageIdFactory = new CassandraMessageId.Factory();
         testee = new CassandraMessageIdDAO(cassandra.getConf(), messageIdFactory);
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void deleteShouldNotThrowWhenRowDoesntExist() {
+    void deleteShouldNotThrowWhenRowDoesntExist() {
         testee.delete(CassandraId.timeBased(), MessageUid.of(1))
             .join();
     }
 
     @Test
-    public void deleteShouldDeleteWhenRowExists() {
+    void deleteShouldDeleteWhenRowExists() {
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
         CassandraMessageId messageId = messageIdFactory.generate();
@@ -99,7 +79,7 @@ public class CassandraMessageIdDAOTest {
     }
 
     @Test
-    public void deleteShouldDeleteOnlyConcernedRowWhenMultipleRowExists() {
+    void deleteShouldDeleteOnlyConcernedRowWhenMultipleRowExists() {
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
         MessageUid messageUid2 = MessageUid.of(2);
@@ -127,7 +107,7 @@ public class CassandraMessageIdDAOTest {
     }
 
     @Test
-    public void insertShouldWork() {
+    void insertShouldWork() {
         CassandraMessageId messageId = messageIdFactory.generate();
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -144,7 +124,7 @@ public class CassandraMessageIdDAOTest {
     }
 
     @Test
-    public void updateShouldUpdateModSeq() {
+    void updateShouldUpdateModSeq() {
         CassandraMessageId messageId = messageIdFactory.generate();
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -169,7 +149,7 @@ public class CassandraMessageIdDAOTest {
     }
 
     @Test
-    public void updateShouldUpdateAnsweredFlag() {
+    void updateShouldUpdateAnsweredFlag() {
         CassandraMessageId messageId = messageIdFactory.generate();
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -194,7 +174,7 @@ public class CassandraMessageIdDAOTest {
     }
 
     @Test
-    public void updateShouldUpdateDeletedFlag() {
+    void updateShouldUpdateDeletedFlag() {
         CassandraMessageId messageId = messageIdFactory.generate();
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -219,7 +199,7 @@ public class CassandraMessageIdDAOTest {
     }
 
     @Test
-    public void updateShouldUpdateDraftFlag() {
+    void updateShouldUpdateDraftFlag() {
         CassandraMessageId messageId = messageIdFactory.generate();
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -244,7 +224,7 @@ public class CassandraMessageIdDAOTest {
     }
 
     @Test
-    public void updateShouldUpdateFlaggedFlag() {
+    void updateShouldUpdateFlaggedFlag() {
         CassandraMessageId messageId = messageIdFactory.generate();
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -269,7 +249,7 @@ public class CassandraMessageIdDAOTest {
     }
 
     @Test
-    public void updateShouldUpdateRecentFlag() {
+    void updateShouldUpdateRecentFlag() {
         CassandraMessageId messageId = messageIdFactory.generate();
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -294,7 +274,7 @@ public class CassandraMessageIdDAOTest {
     }
 
     @Test
-    public void updateShouldUpdateSeenFlag() {
+    void updateShouldUpdateSeenFlag() {
         CassandraMessageId messageId = messageIdFactory.generate();
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -319,7 +299,7 @@ public class CassandraMessageIdDAOTest {
     }
 
     @Test
-    public void updateShouldUpdateUserFlag() {
+    void updateShouldUpdateUserFlag() {
         CassandraMessageId messageId = messageIdFactory.generate();
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -344,7 +324,7 @@ public class CassandraMessageIdDAOTest {
     }
 
     @Test
-    public void updateShouldUpdateUserFlags() {
+    void updateShouldUpdateUserFlags() {
         CassandraMessageId messageId = messageIdFactory.generate();
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -371,7 +351,7 @@ public class CassandraMessageIdDAOTest {
     }
 
     @Test
-    public void retrieveShouldRetrieveWhenKeyMatches() {
+    void retrieveShouldRetrieveWhenKeyMatches() {
         CassandraMessageId messageId = messageIdFactory.generate();
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -388,7 +368,7 @@ public class CassandraMessageIdDAOTest {
     }
 
     @Test
-    public void retrieveMessagesShouldRetrieveAllWhenRangeAll() {
+    void retrieveMessagesShouldRetrieveAllWhenRangeAll() {
         CassandraMessageId messageId = messageIdFactory.generate();
         CassandraMessageId messageId2 = messageIdFactory.generate();
         CassandraId mailboxId = CassandraId.timeBased();
@@ -416,7 +396,7 @@ public class CassandraMessageIdDAOTest {
     }
 
     @Test
-    public void retrieveMessagesShouldRetrieveSomeWhenRangeFrom() {
+    void retrieveMessagesShouldRetrieveSomeWhenRangeFrom() {
         CassandraMessageId messageId = messageIdFactory.generate();
         CassandraMessageId messageId2 = messageIdFactory.generate();
         CassandraMessageId messageId3 = messageIdFactory.generate();
@@ -452,7 +432,7 @@ public class CassandraMessageIdDAOTest {
     }
 
     @Test
-    public void retrieveMessagesShouldRetrieveSomeWhenRange() {
+    void retrieveMessagesShouldRetrieveSomeWhenRange() {
         CassandraMessageId messageId = messageIdFactory.generate();
         CassandraMessageId messageId2 = messageIdFactory.generate();
         CassandraMessageId messageId3 = messageIdFactory.generate();
@@ -497,7 +477,7 @@ public class CassandraMessageIdDAOTest {
     }
 
     @Test
-    public void retrieveMessagesShouldRetrieveOneWhenRangeOne() {
+    void retrieveMessagesShouldRetrieveOneWhenRangeOne() {
         CassandraMessageId messageId = messageIdFactory.generate();
         CassandraMessageId messageId2 = messageIdFactory.generate();
         CassandraMessageId messageId3 = messageIdFactory.generate();

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAOTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAOTest.java
index c7d6e7d..afefdcc 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAOTest.java
@@ -28,64 +28,42 @@ import javax.mail.Flags;
 import javax.mail.Flags.Flag;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
-import org.apache.james.backends.cassandra.DockerCassandraSingleton;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.modules.CassandraMessageModule;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.datastax.driver.core.utils.UUIDs;
 import com.github.steveash.guavate.Guavate;
 
-public class CassandraMessageIdToImapUidDAOTest {
-
-    @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-
-    private static CassandraCluster cassandra;
+class CassandraMessageIdToImapUidDAOTest {
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraMessageModule.MODULE);
 
     private CassandraMessageId.Factory messageIdFactory;
 
     private CassandraMessageIdToImapUidDAO testee;
 
-    @BeforeClass
-    public static void setUpClass() {
-        DockerCassandraSingleton.restart();
-        cassandra = CassandraCluster.create(CassandraMessageModule.MODULE, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         messageIdFactory = new CassandraMessageId.Factory();
         testee = new CassandraMessageIdToImapUidDAO(cassandra.getConf(), messageIdFactory);
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void deleteShouldNotThrowWhenRowDoesntExist() {
+    void deleteShouldNotThrowWhenRowDoesntExist() {
         testee.delete(messageIdFactory.of(UUIDs.timeBased()), CassandraId.timeBased())
             .join();
     }
 
     @Test
-    public void deleteShouldDeleteWhenRowExists() {
+    void deleteShouldDeleteWhenRowExists() {
         CassandraMessageId messageId = messageIdFactory.of(UUIDs.timeBased());
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -103,7 +81,7 @@ public class CassandraMessageIdToImapUidDAOTest {
     }
 
     @Test
-    public void deleteShouldDeleteOnlyConcernedRowWhenMultipleRowExists() {
+    void deleteShouldDeleteOnlyConcernedRowWhenMultipleRowExists() {
         CassandraMessageId messageId = messageIdFactory.of(UUIDs.timeBased());
         CassandraId mailboxId = CassandraId.timeBased();
         CassandraId mailboxId2 = CassandraId.timeBased();
@@ -134,7 +112,7 @@ public class CassandraMessageIdToImapUidDAOTest {
     }
 
     @Test
-    public void insertShouldWork() {
+    void insertShouldWork() {
         CassandraMessageId messageId = messageIdFactory.of(UUIDs.timeBased());
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -156,7 +134,7 @@ public class CassandraMessageIdToImapUidDAOTest {
     }
 
     @Test
-    public void updateShouldReturnTrueWhenOldModSeqMatches() {
+    void updateShouldReturnTrueWhenOldModSeqMatches() {
         CassandraMessageId messageId = messageIdFactory.of(UUIDs.timeBased());
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -174,7 +152,7 @@ public class CassandraMessageIdToImapUidDAOTest {
     }
 
     @Test
-    public void updateShouldReturnFalseWhenOldModSeqDoesntMatch() {
+    void updateShouldReturnFalseWhenOldModSeqDoesntMatch() {
         CassandraMessageId messageId = messageIdFactory.of(UUIDs.timeBased());
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -192,7 +170,7 @@ public class CassandraMessageIdToImapUidDAOTest {
     }
 
     @Test
-    public void updateShouldUpdateModSeq() {
+    void updateShouldUpdateModSeq() {
         CassandraMessageId messageId = messageIdFactory.of(UUIDs.timeBased());
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -217,7 +195,7 @@ public class CassandraMessageIdToImapUidDAOTest {
     }
 
     @Test
-    public void updateShouldUpdateAnsweredFlag() {
+    void updateShouldUpdateAnsweredFlag() {
         CassandraMessageId messageId = messageIdFactory.of(UUIDs.timeBased());
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -242,7 +220,7 @@ public class CassandraMessageIdToImapUidDAOTest {
     }
 
     @Test
-    public void updateShouldUpdateDeletedFlag() {
+    void updateShouldUpdateDeletedFlag() {
         CassandraMessageId messageId = messageIdFactory.of(UUIDs.timeBased());
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -267,7 +245,7 @@ public class CassandraMessageIdToImapUidDAOTest {
     }
 
     @Test
-    public void updateShouldUpdateDraftFlag() {
+    void updateShouldUpdateDraftFlag() {
         CassandraMessageId messageId = messageIdFactory.of(UUIDs.timeBased());
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -292,7 +270,7 @@ public class CassandraMessageIdToImapUidDAOTest {
     }
 
     @Test
-    public void updateShouldUpdateFlaggedFlag() {
+    void updateShouldUpdateFlaggedFlag() {
         CassandraMessageId messageId = messageIdFactory.of(UUIDs.timeBased());
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -317,7 +295,7 @@ public class CassandraMessageIdToImapUidDAOTest {
     }
 
     @Test
-    public void updateShouldUpdateRecentFlag() {
+    void updateShouldUpdateRecentFlag() {
         CassandraMessageId messageId = messageIdFactory.of(UUIDs.timeBased());
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -342,7 +320,7 @@ public class CassandraMessageIdToImapUidDAOTest {
     }
 
     @Test
-    public void updateShouldUpdateSeenFlag() {
+    void updateShouldUpdateSeenFlag() {
         CassandraMessageId messageId = messageIdFactory.of(UUIDs.timeBased());
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -367,7 +345,7 @@ public class CassandraMessageIdToImapUidDAOTest {
     }
 
     @Test
-    public void updateShouldUpdateUserFlag() {
+    void updateShouldUpdateUserFlag() {
         CassandraMessageId messageId = messageIdFactory.of(UUIDs.timeBased());
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -392,7 +370,7 @@ public class CassandraMessageIdToImapUidDAOTest {
     }
 
     @Test
-    public void updateShouldUpdateUserFlags() {
+    void updateShouldUpdateUserFlags() {
         CassandraMessageId messageId = messageIdFactory.of(UUIDs.timeBased());
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -419,7 +397,7 @@ public class CassandraMessageIdToImapUidDAOTest {
     }
 
     @Test
-    public void retrieveShouldReturnOneMessageWhenKeyMatches() {
+    void retrieveShouldReturnOneMessageWhenKeyMatches() {
         CassandraMessageId messageId = messageIdFactory.of(UUIDs.timeBased());
         CassandraId mailboxId = CassandraId.timeBased();
         MessageUid messageUid = MessageUid.of(1);
@@ -441,7 +419,7 @@ public class CassandraMessageIdToImapUidDAOTest {
     }
 
     @Test
-    public void retrieveShouldReturnMultipleMessagesWhenMessageIdMatches() {
+    void retrieveShouldReturnMultipleMessagesWhenMessageIdMatches() {
         CassandraMessageId messageId = messageIdFactory.of(UUIDs.timeBased());
         CassandraId mailboxId = CassandraId.timeBased();
         CassandraId mailboxId2 = CassandraId.timeBased();

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java
index 6059389..a0b691d 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java
@@ -23,55 +23,37 @@ import static org.assertj.core.api.Assertions.assertThat;
 import java.util.stream.LongStream;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.modules.CassandraModSeqModule;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.github.fge.lambdas.Throwing;
 
-public class CassandraModSeqProviderTest {
+class CassandraModSeqProviderTest {
     private static final CassandraId CASSANDRA_ID = new CassandraId.Factory().fromString("e22b3ac0-a80b-11e7-bb00-777268d65503");
 
-    @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-    
-    private static CassandraCluster cassandra;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModSeqModule.MODULE);
     
     private CassandraModSeqProvider modSeqProvider;
     private SimpleMailbox mailbox;
 
-    @BeforeClass
-    public static void setUpClass() {
-        cassandra = CassandraCluster.create(CassandraModSeqModule.MODULE, cassandraServer.getHost());
-    }
 
-    @Before
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         modSeqProvider = new CassandraModSeqProvider(cassandra.getConf());
         MailboxPath path = new MailboxPath("gsoc", "ieugen", "Trash");
         mailbox = new SimpleMailbox(path, 1234);
         mailbox.setMailboxId(CASSANDRA_ID);
     }
-    
-    @After
-    public void cleanUp() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
 
     @Test
-    public void highestModSeqShouldRetrieveValueStoredNextModSeq() throws Exception {
+    void highestModSeqShouldRetrieveValueStoredNextModSeq() throws Exception {
         int nbEntries = 100;
         long result = modSeqProvider.highestModSeq(null, mailbox);
         assertThat(result).isEqualTo(0);
@@ -84,19 +66,18 @@ public class CassandraModSeqProviderTest {
     }
 
     @Test
-    public void nextModSeqShouldIncrementValueByOne() throws Exception {
+    void nextModSeqShouldIncrementValueByOne() throws Exception {
         int nbEntries = 100;
         long lastUid = modSeqProvider.highestModSeq(null, mailbox);
         LongStream.range(lastUid + 1, lastUid + nbEntries)
             .forEach(Throwing.longConsumer(value -> {
-                        long result = modSeqProvider.nextModSeq(null, mailbox);
-                        assertThat(value).isEqualTo(result);
-                })
-            );
+                long result = modSeqProvider.nextModSeq(null, mailbox);
+                assertThat(value).isEqualTo(result);
+            }));
     }
 
     @Test
-    public void nextModSeqShouldGenerateUniqueValuesWhenParallelCalls() throws Exception {
+    void nextModSeqShouldGenerateUniqueValuesWhenParallelCalls() {
         int nbEntries = 100;
         long nbValues = LongStream.range(0, nbEntries)
             .parallel()

http://git-wip-us.apache.org/repos/asf/james-project/blob/df6fe4fb/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProviderTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProviderTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProviderTest.java
index fe0d6a1..619ced7 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProviderTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProviderTest.java
@@ -24,56 +24,37 @@ import java.util.Optional;
 import java.util.stream.LongStream;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.modules.CassandraUidModule;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.github.fge.lambdas.Throwing;
 
-public class CassandraUidProviderTest {
+class CassandraUidProviderTest {
     private static final CassandraId CASSANDRA_ID = new CassandraId.Factory().fromString("e22b3ac0-a80b-11e7-bb00-777268d65503");
 
-    @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-
-    private static CassandraCluster cassandra;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraUidModule.MODULE);
 
     private CassandraUidProvider uidProvider;
     private SimpleMailbox mailbox;
 
-    @BeforeClass
-    public static void setUpClass() {
-        cassandra = CassandraCluster.create(CassandraUidModule.MODULE, cassandraServer.getHost());
-    }
-
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         uidProvider = new CassandraUidProvider(cassandra.getConf());
         MailboxPath path = new MailboxPath("gsoc", "ieugen", "Trash");
         mailbox = new SimpleMailbox(path, 1234);
         mailbox.setMailboxId(CASSANDRA_ID);
     }
-    
-    @After
-    public void cleanUp() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
 
     @Test
-    public void lastUidShouldRetrieveValueStoredByNextUid() throws Exception {
+    void lastUidShouldRetrieveValueStoredByNextUid() throws Exception {
         int nbEntries = 100;
         Optional<MessageUid> result = uidProvider.lastUid(null, mailbox);
         assertThat(result).isEmpty();
@@ -86,18 +67,17 @@ public class CassandraUidProviderTest {
     }
 
     @Test
-    public void nextUidShouldIncrementValueByOne() throws Exception {
+    void nextUidShouldIncrementValueByOne() {
         int nbEntries = 100;
         LongStream.range(1, nbEntries)
             .forEach(Throwing.longConsumer(value -> {
-                        MessageUid result = uidProvider.nextUid(null, mailbox);
-                        assertThat(value).isEqualTo(result.asLong());
-                })
-            );
+                MessageUid result = uidProvider.nextUid(null, mailbox);
+                assertThat(value).isEqualTo(result.asLong());
+            }));
     }
 
     @Test
-    public void nextUidShouldGenerateUniqueValuesWhenParallelCalls() throws Exception {
+    void nextUidShouldGenerateUniqueValuesWhenParallelCalls() {
         int nbEntries = 100;
         long nbValues = LongStream.range(0, nbEntries)
             .parallel()


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


[03/13] james-project git commit: JAMES-2545 Introduce RabbitMQ connection factory

Posted by bt...@apache.org.
JAMES-2545 Introduce RabbitMQ connection factory


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

Branch: refs/heads/master
Commit: 3b570bc1d5c24c872527072d09ab659412ae4b68
Parents: b847583
Author: Antoine Duprat <ad...@linagora.com>
Authored: Wed Sep 12 14:03:02 2018 +0200
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Sep 14 10:17:42 2018 +0700

----------------------------------------------------------------------
 .../rabbitmq/RabbitMQConnectionFactory.java     | 59 +++++++++++++++++++
 .../rabbitmq/RabbitMQConnectionFactoryTest.java | 62 ++++++++++++++++++++
 2 files changed, 121 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/3b570bc1/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitMQConnectionFactory.java
----------------------------------------------------------------------
diff --git a/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitMQConnectionFactory.java b/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitMQConnectionFactory.java
new file mode 100644
index 0000000..b6a6ba2
--- /dev/null
+++ b/backends-common/rabbitmq/src/main/java/org/apache/james/backend/rabbitmq/RabbitMQConnectionFactory.java
@@ -0,0 +1,59 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.backend.rabbitmq;
+
+import javax.inject.Inject;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.rabbitmq.client.Connection;
+import com.rabbitmq.client.ConnectionFactory;
+
+public class RabbitMQConnectionFactory {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(RabbitMQConnectionFactory.class);
+
+    private final ConnectionFactory connectionFactory;
+
+    @Inject
+    public RabbitMQConnectionFactory(RabbitMQConfiguration rabbitMQConfiguration) {
+        this.connectionFactory = from(rabbitMQConfiguration);
+    }
+
+    private ConnectionFactory from(RabbitMQConfiguration rabbitMQConfiguration) {
+        try {
+            ConnectionFactory connectionFactory = new ConnectionFactory();
+            connectionFactory.setUri(rabbitMQConfiguration.getUri());
+            return connectionFactory;
+        } catch (Exception e) {
+            LOGGER.error("Fail to create the RabbitMQ connection factory.");
+            throw new RuntimeException(e);
+        }
+    }
+
+    public Connection create() {
+        try {
+            return connectionFactory.newConnection();
+        } catch (Exception e) {
+            LOGGER.error("Fail to create a RabbitMQ connection.");
+            throw new RuntimeException(e);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/3b570bc1/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQConnectionFactoryTest.java
----------------------------------------------------------------------
diff --git a/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQConnectionFactoryTest.java b/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQConnectionFactoryTest.java
new file mode 100644
index 0000000..99cca33
--- /dev/null
+++ b/backends-common/rabbitmq/src/test/java/org/apache/james/backend/rabbitmq/RabbitMQConnectionFactoryTest.java
@@ -0,0 +1,62 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.backend.rabbitmq;
+
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import java.net.URI;
+
+import org.junit.jupiter.api.Test;
+
+class RabbitMQConnectionFactoryTest {
+
+    @Test
+    void creatingAFactoryShouldWorkWhenConfigurationIsValid() {
+        RabbitMQConfiguration rabbitMQConfiguration = RabbitMQConfiguration.builder()
+            .amqpUri(URI.create("amqp://james:james@rabbitmq_host:5672"))
+            .managementUri(URI.create("http://james:james@rabbitmq_host:15672/api/"))
+            .build();
+
+        new RabbitMQConnectionFactory(rabbitMQConfiguration);
+    }
+
+    @Test
+    void creatingAFactoryShouldThrowWhenConfigurationIsInvalid() {
+        RabbitMQConfiguration rabbitMQConfiguration = RabbitMQConfiguration.builder()
+            .amqpUri(URI.create("badprotocol://james:james@rabbitmq_host:5672"))
+            .managementUri(URI.create("http://james:james@rabbitmq_host:15672/api/"))
+            .build();
+
+        assertThatThrownBy(() -> new RabbitMQConnectionFactory(rabbitMQConfiguration))
+            .isInstanceOf(RuntimeException.class);
+    }
+
+    @Test
+    void createShouldFailWhenConnectionCantBeDone() {
+        RabbitMQConfiguration rabbitMQConfiguration = RabbitMQConfiguration.builder()
+                .amqpUri(URI.create("amqp://james:james@rabbitmq_host:5672"))
+                .managementUri(URI.create("http://james:james@rabbitmq_host:15672/api/"))
+                .build();
+
+        RabbitMQConnectionFactory rabbitMQConnectionFactory = new RabbitMQConnectionFactory(rabbitMQConfiguration);
+
+        assertThatThrownBy(() -> rabbitMQConnectionFactory.create())
+            .isInstanceOf(RuntimeException.class);
+    }
+}


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