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

[james-project] 23/28: JAMES-3350 Split Guice server tests to better leverage lifecycle benefits

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

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

commit 0d8348b5051e6d471f3bfb6175e704606103c36d
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Jul 28 14:04:43 2020 +0700

    JAMES-3350 Split Guice server tests to better leverage lifecycle benefits
    
    Note that we don't need separate static extensions
---
 ...va => WithCassandraBlobStoreImmutableTest.java} | 21 +++---
 .../apache/james/WithCassandraBlobStoreTest.java   | 16 +---
 ...eExtension.java => WithCacheImmutableTest.java} | 55 +++-----------
 ...ithCacheTest.java => WithCacheMutableTest.java} | 10 ++-
 .../org/apache/james/WithCassandraBlobStore.java   | 88 ----------------------
 .../james/WithCassandraBlobStoreImmutableTest.java | 49 ++++++++++++
 ...java => WithCassandraBlobStoreMutableTest.java} | 10 ++-
 .../apache/james/WithDefaultAwsS3Extension.java    | 71 -----------------
 ...est.java => WithDefaultAwsS3ImmutableTest.java} | 11 ++-
 ...eTest.java => WithDefaultAwsS3MutableTest.java} | 12 ++-
 .../apache/james/WithDefaultSwiftExtension.java    | 71 -----------------
 ...est.java => WithDefaultSwiftImmutableTest.java} | 11 ++-
 ...eTest.java => WithDefaultSwiftMutableTest.java} | 12 ++-
 .../apache/james/WithEncryptedAwsS3Extension.java  | 72 ------------------
 ...t.java => WithEncryptedAwsS3ImmutableTest.java} | 12 ++-
 ...est.java => WithEncryptedAwsS3MutableTest.java} | 13 +++-
 .../apache/james/WithEncryptedSwiftExtension.java  | 72 ------------------
 ...t.java => WithEncryptedSwiftImmutableTest.java} | 12 ++-
 ...est.java => WithEncryptedSwiftMutableTest.java} | 13 +++-
 ...n.java => WithScanningSearchImmutableTest.java} | 56 +++-----------
 ...est.java => WithScanningSearchMutableTest.java} | 10 ++-
 .../james/jmap/draft/JmapJamesServerContract.java  | 25 +++---
 .../memory/MemoryJwtFilterIntegrationTest.java     |  1 -
 23 files changed, 182 insertions(+), 541 deletions(-)

diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/WithCassandraBlobStoreImmutableTest.java
similarity index 57%
copy from server/container/guice/cassandra-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java
copy to server/container/guice/cassandra-guice/src/test/java/org/apache/james/WithCassandraBlobStoreImmutableTest.java
index d8f99b4..884e061 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/WithCassandraBlobStoreImmutableTest.java
@@ -24,16 +24,19 @@ import org.apache.james.jmap.draft.methods.integration.SpamAssassinModuleExtensi
 import org.apache.james.modules.TestJMAPServerModule;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-class WithCassandraBlobStoreTest implements JmapJamesServerContract, MailsShouldBeWellReceived, JamesServerContract {
-
+class WithCassandraBlobStoreImmutableTest implements JmapJamesServerContract, JamesServerContract {
     @RegisterExtension
-    static JamesServerExtension jamesServerExtension = TestingDistributedJamesServerBuilder.withSearchConfiguration(SearchConfiguration.elasticSearch())
-        .extension(new DockerElasticSearchExtension())
-        .extension(new CassandraExtension())
-        .extension(new SpamAssassinModuleExtension())
-        .server(configuration -> CassandraJamesServerMain.createServer(configuration)
-            .overrideWith(new TestJMAPServerModule())
-            .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE))
+    static JamesServerExtension jamesServerExtension = baseExtensionBuilder()
+        .lifeCycle(JamesServerExtension.Lifecycle.PER_CLASS)
         .build();
 
+    static JamesServerBuilder<CassandraJamesServerConfiguration> baseExtensionBuilder() {
+        return TestingDistributedJamesServerBuilder.withSearchConfiguration(SearchConfiguration.elasticSearch())
+            .extension(new DockerElasticSearchExtension())
+            .extension(new CassandraExtension())
+            .extension(new SpamAssassinModuleExtension())
+            .server(configuration -> CassandraJamesServerMain.createServer(configuration)
+                .overrideWith(new TestJMAPServerModule())
+                .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE));
+    }
 }
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java
index d8f99b4..2bf74d8 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java
@@ -19,21 +19,11 @@
 
 package org.apache.james;
 
-import org.apache.james.jmap.draft.JmapJamesServerContract;
-import org.apache.james.jmap.draft.methods.integration.SpamAssassinModuleExtension;
-import org.apache.james.modules.TestJMAPServerModule;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-class WithCassandraBlobStoreTest implements JmapJamesServerContract, MailsShouldBeWellReceived, JamesServerContract {
-
+class WithCassandraBlobStoreTest implements MailsShouldBeWellReceived {
     @RegisterExtension
-    static JamesServerExtension jamesServerExtension = TestingDistributedJamesServerBuilder.withSearchConfiguration(SearchConfiguration.elasticSearch())
-        .extension(new DockerElasticSearchExtension())
-        .extension(new CassandraExtension())
-        .extension(new SpamAssassinModuleExtension())
-        .server(configuration -> CassandraJamesServerMain.createServer(configuration)
-            .overrideWith(new TestJMAPServerModule())
-            .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE))
+    static JamesServerExtension jamesServerExtension = WithCassandraBlobStoreImmutableTest.baseExtensionBuilder()
+        .lifeCycle(JamesServerExtension.Lifecycle.PER_TEST)
         .build();
-
 }
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCacheExtension.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCacheImmutableTest.java
similarity index 55%
rename from server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCacheExtension.java
rename to server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCacheImmutableTest.java
index a971e3e..5dbcf14 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCacheExtension.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCacheImmutableTest.java
@@ -24,21 +24,17 @@ import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
 import org.apache.james.modules.blobstore.BlobStoreConfiguration;
-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 org.junit.jupiter.api.extension.RegisterExtension;
 
-public class WithCacheExtension implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback, ParameterResolver {
 
-    private final JamesServerExtension jamesServerExtension;
+class WithCacheImmutableTest implements JmapJamesServerContract, JamesServerContract {
+    @RegisterExtension
+    static JamesServerExtension jamesServerExtension = baseExtensionBuilder()
+        .lifeCycle(JamesServerExtension.Lifecycle.PER_CLASS)
+        .build();
 
-    WithCacheExtension() {
-        jamesServerExtension = new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
+    static JamesServerBuilder<CassandraRabbitMQJamesConfiguration> baseExtensionBuilder() {
+        return new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
             CassandraRabbitMQJamesConfiguration.builder()
                 .workingDirectory(tmpDir)
                 .configurationFromClasspath()
@@ -54,37 +50,6 @@ public class WithCacheExtension implements BeforeAllCallback, AfterAllCallback,
             .extension(new AwsS3BlobStoreExtension())
             .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
                 .overrideWith(new TestJMAPServerModule())
-                .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE))
-            .build();
+                .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE));
     }
-
-    @Override
-    public void beforeAll(ExtensionContext context) throws Exception {
-        jamesServerExtension.beforeAll(context);
-    }
-
-    @Override
-    public void afterAll(ExtensionContext context) throws Exception {
-        jamesServerExtension.afterAll(context);
-    }
-
-    @Override
-    public void beforeEach(ExtensionContext context) throws Exception {
-        jamesServerExtension.beforeEach(context);
-    }
-
-    @Override
-    public void afterEach(ExtensionContext context) throws Exception {
-        jamesServerExtension.afterEach(context);
-    }
-
-    @Override
-    public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
-        return (parameterContext.getParameter().getType() == GuiceJamesServer.class);
-    }
-
-    @Override
-    public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
-        return jamesServerExtension.getGuiceJamesServer();
-    }
-}
+}
\ No newline at end of file
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCacheTest.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCacheMutableTest.java
similarity index 78%
rename from server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCacheTest.java
rename to server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCacheMutableTest.java
index ee5ebbc..53d8476 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCacheTest.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCacheMutableTest.java
@@ -19,9 +19,11 @@
 
 package org.apache.james;
 
-import org.apache.james.jmap.draft.JmapJamesServerContract;
-import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(WithCacheExtension.class)
-class WithCacheTest implements JmapJamesServerContract, MailsShouldBeWellReceived, JamesServerContract {
+class WithCacheMutableTest implements MailsShouldBeWellReceived {
+    @RegisterExtension
+    static JamesServerExtension jamesServerExtension = WithCacheImmutableTest.baseExtensionBuilder()
+        .lifeCycle(JamesServerExtension.Lifecycle.PER_TEST)
+        .build();
 }
\ No newline at end of file
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStore.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStore.java
deleted file mode 100644
index 98dd3a6..0000000
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStore.java
+++ /dev/null
@@ -1,88 +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;
-
-import org.apache.james.jmap.draft.JmapJamesServerContract;
-import org.apache.james.modules.RabbitMQExtension;
-import org.apache.james.modules.TestJMAPServerModule;
-import org.apache.james.modules.blobstore.BlobStoreConfiguration;
-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 WithCassandraBlobStore implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback, ParameterResolver {
-
-    private final JamesServerExtension jamesServerExtension;
-
-    WithCassandraBlobStore() {
-        jamesServerExtension = new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
-            CassandraRabbitMQJamesConfiguration.builder()
-                .workingDirectory(tmpDir)
-                .configurationFromClasspath()
-                .blobStore(BlobStoreConfiguration.builder()
-                        .cassandra()
-                        .disableCache()
-                        .passthrough())
-                .searchConfiguration(SearchConfiguration.elasticSearch())
-                .build())
-            .extension(new DockerElasticSearchExtension())
-            .extension(new CassandraExtension())
-            .extension(new RabbitMQExtension())
-            .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
-                .overrideWith(new TestJMAPServerModule())
-                .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE))
-            .build();
-    }
-
-    @Override
-    public void beforeAll(ExtensionContext context) throws Exception {
-        jamesServerExtension.beforeAll(context);
-    }
-
-    @Override
-    public void afterAll(ExtensionContext context) throws Exception {
-        jamesServerExtension.afterAll(context);
-    }
-
-    @Override
-    public void beforeEach(ExtensionContext context) throws Exception {
-        jamesServerExtension.beforeEach(context);
-    }
-
-    @Override
-    public void afterEach(ExtensionContext context) throws Exception {
-        jamesServerExtension.afterEach(context);
-    }
-
-    @Override
-    public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
-        return (parameterContext.getParameter().getType() == GuiceJamesServer.class);
-    }
-
-    @Override
-    public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
-        return jamesServerExtension.getGuiceJamesServer();
-    }
-}
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStoreImmutableTest.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStoreImmutableTest.java
new file mode 100644
index 0000000..f6d1ed6
--- /dev/null
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStoreImmutableTest.java
@@ -0,0 +1,49 @@
+/*
+ * 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;
+
+import org.apache.james.jmap.draft.JmapJamesServerContract;
+import org.apache.james.modules.RabbitMQExtension;
+import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+public class WithCassandraBlobStoreImmutableTest implements JmapJamesServerContract, JamesServerContract {
+    @RegisterExtension
+    static JamesServerExtension jamesServerExtension = baseExtensionBuilder()
+        .lifeCycle(JamesServerExtension.Lifecycle.PER_CLASS)
+        .build();
+
+    static JamesServerBuilder<CassandraRabbitMQJamesConfiguration> baseExtensionBuilder() {
+        return new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
+            CassandraRabbitMQJamesConfiguration.builder()
+                .workingDirectory(tmpDir)
+                .configurationFromClasspath()
+                .blobStore(BlobStoreConfiguration.cassandra())
+                .searchConfiguration(SearchConfiguration.elasticSearch())
+                .build())
+            .extension(new DockerElasticSearchExtension())
+            .extension(new CassandraExtension())
+            .extension(new RabbitMQExtension())
+            .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
+                .overrideWith(new TestJMAPServerModule())
+                .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE));
+    }
+}
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStoreMutableTest.java
similarity index 70%
copy from server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java
copy to server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStoreMutableTest.java
index 33219bb..cbc908f 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStoreMutableTest.java
@@ -19,9 +19,11 @@
 
 package org.apache.james;
 
-import org.apache.james.jmap.draft.JmapJamesServerContract;
-import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(WithCassandraBlobStore.class)
-public class WithCassandraBlobStoreTest implements JmapJamesServerContract, MailsShouldBeWellReceived, JamesServerContract {
+public class WithCassandraBlobStoreMutableTest implements MailsShouldBeWellReceived {
+    @RegisterExtension
+    static JamesServerExtension jamesServerExtension = WithCassandraBlobStoreImmutableTest.baseExtensionBuilder()
+        .lifeCycle(JamesServerExtension.Lifecycle.PER_TEST)
+        .build();
 }
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithDefaultAwsS3Extension.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithDefaultAwsS3Extension.java
deleted file mode 100644
index 03a035e..0000000
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithDefaultAwsS3Extension.java
+++ /dev/null
@@ -1,71 +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;
-
-import org.apache.james.modules.AwsS3BlobStoreExtension;
-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 WithDefaultAwsS3Extension implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback, ParameterResolver {
-
-    private final JamesServerExtension jamesServerExtension;
-
-    WithDefaultAwsS3Extension() {
-        jamesServerExtension = CassandraRabbitMQJamesServerFixture.baseExtensionBuilder()
-            .extension(new AwsS3BlobStoreExtension())
-            .build();
-    }
-
-    @Override
-    public void beforeAll(ExtensionContext context) throws Exception {
-        jamesServerExtension.beforeAll(context);
-    }
-
-    @Override
-    public void afterAll(ExtensionContext context) throws Exception {
-        jamesServerExtension.afterAll(context);
-    }
-
-    @Override
-    public void beforeEach(ExtensionContext context) throws Exception {
-        jamesServerExtension.beforeEach(context);
-    }
-
-    @Override
-    public void afterEach(ExtensionContext context) throws Exception {
-        jamesServerExtension.afterEach(context);
-    }
-
-    @Override
-    public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
-        return (parameterContext.getParameter().getType() == GuiceJamesServer.class);
-    }
-
-    @Override
-    public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
-        return jamesServerExtension.getGuiceJamesServer();
-    }
-}
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithDefaultAwsS3Test.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithDefaultAwsS3ImmutableTest.java
similarity index 75%
rename from server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithDefaultAwsS3Test.java
rename to server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithDefaultAwsS3ImmutableTest.java
index 7a3dfce..207f3cc 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithDefaultAwsS3Test.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithDefaultAwsS3ImmutableTest.java
@@ -24,12 +24,17 @@ import static org.assertj.core.api.Assertions.assertThat;
 import org.apache.james.blob.objectstorage.DefaultPayloadCodec;
 import org.apache.james.blob.objectstorage.PayloadCodec;
 import org.apache.james.jmap.draft.JmapJamesServerContract;
+import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.objectstorage.aws.s3.DockerAwsS3TestRule;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(WithDefaultAwsS3Extension.class)
-public class WithDefaultAwsS3Test implements JmapJamesServerContract, MailsShouldBeWellReceived, JamesServerContract {
+public class WithDefaultAwsS3ImmutableTest implements JmapJamesServerContract, JamesServerContract {
+    @RegisterExtension
+    static JamesServerExtension jamesServerExtension = CassandraRabbitMQJamesServerFixture.baseExtensionBuilder()
+        .extension(new AwsS3BlobStoreExtension())
+        .lifeCycle(JamesServerExtension.Lifecycle.PER_CLASS)
+        .build();
 
     @Test
     void defaultPayloadShouldBeByDefault(GuiceJamesServer jamesServer) {
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithDefaultAwsS3MutableTest.java
similarity index 64%
copy from server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java
copy to server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithDefaultAwsS3MutableTest.java
index 33219bb..8e284d1 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithDefaultAwsS3MutableTest.java
@@ -19,9 +19,13 @@
 
 package org.apache.james;
 
-import org.apache.james.jmap.draft.JmapJamesServerContract;
-import org.junit.jupiter.api.extension.ExtendWith;
+import org.apache.james.modules.AwsS3BlobStoreExtension;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(WithCassandraBlobStore.class)
-public class WithCassandraBlobStoreTest implements JmapJamesServerContract, MailsShouldBeWellReceived, JamesServerContract {
+public class WithDefaultAwsS3MutableTest implements MailsShouldBeWellReceived {
+    @RegisterExtension
+    static JamesServerExtension jamesServerExtension = CassandraRabbitMQJamesServerFixture.baseExtensionBuilder()
+        .extension(new AwsS3BlobStoreExtension())
+        .lifeCycle(JamesServerExtension.Lifecycle.PER_TEST)
+        .build();
 }
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithDefaultSwiftExtension.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithDefaultSwiftExtension.java
deleted file mode 100644
index 3e867aa..0000000
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithDefaultSwiftExtension.java
+++ /dev/null
@@ -1,71 +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;
-
-import org.apache.james.modules.SwiftBlobStoreExtension;
-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 WithDefaultSwiftExtension implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback, ParameterResolver  {
-
-    private final JamesServerExtension jamesServerExtension;
-
-    WithDefaultSwiftExtension() {
-        jamesServerExtension = CassandraRabbitMQJamesServerFixture.baseExtensionBuilder()
-            .extension(new SwiftBlobStoreExtension())
-            .build();
-    }
-
-    @Override
-    public void beforeAll(ExtensionContext context) throws Exception {
-        jamesServerExtension.beforeAll(context);
-    }
-
-    @Override
-    public void afterAll(ExtensionContext context) throws Exception {
-        jamesServerExtension.afterAll(context);
-    }
-
-    @Override
-    public void beforeEach(ExtensionContext context) throws Exception {
-        jamesServerExtension.beforeEach(context);
-    }
-
-    @Override
-    public void afterEach(ExtensionContext context) throws Exception {
-        jamesServerExtension.afterEach(context);
-    }
-
-    @Override
-    public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
-        return (parameterContext.getParameter().getType() == GuiceJamesServer.class);
-    }
-
-    @Override
-    public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
-        return jamesServerExtension.getGuiceJamesServer();
-    }
-}
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithDefaultSwiftTest.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithDefaultSwiftImmutableTest.java
similarity index 75%
rename from server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithDefaultSwiftTest.java
rename to server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithDefaultSwiftImmutableTest.java
index 0459647..f46a3c3 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithDefaultSwiftTest.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithDefaultSwiftImmutableTest.java
@@ -24,12 +24,17 @@ import static org.assertj.core.api.Assertions.assertThat;
 import org.apache.james.blob.objectstorage.DefaultPayloadCodec;
 import org.apache.james.blob.objectstorage.PayloadCodec;
 import org.apache.james.jmap.draft.JmapJamesServerContract;
+import org.apache.james.modules.SwiftBlobStoreExtension;
 import org.apache.james.modules.objectstorage.swift.DockerSwiftTestRule;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(WithDefaultSwiftExtension.class)
-public class WithDefaultSwiftTest implements JmapJamesServerContract, MailsShouldBeWellReceived, JamesServerContract {
+public class WithDefaultSwiftImmutableTest implements JmapJamesServerContract, JamesServerContract {
+    @RegisterExtension
+    static JamesServerExtension jamesServerExtension = CassandraRabbitMQJamesServerFixture.baseExtensionBuilder()
+        .extension(new SwiftBlobStoreExtension())
+        .lifeCycle(JamesServerExtension.Lifecycle.PER_CLASS)
+        .build();
 
     @Test
     void defaultPayloadShouldBeByDefault(GuiceJamesServer jamesServer) {
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithDefaultSwiftMutableTest.java
similarity index 64%
copy from server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java
copy to server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithDefaultSwiftMutableTest.java
index 33219bb..fe4ae75 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithDefaultSwiftMutableTest.java
@@ -19,9 +19,13 @@
 
 package org.apache.james;
 
-import org.apache.james.jmap.draft.JmapJamesServerContract;
-import org.junit.jupiter.api.extension.ExtendWith;
+import org.apache.james.modules.SwiftBlobStoreExtension;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(WithCassandraBlobStore.class)
-public class WithCassandraBlobStoreTest implements JmapJamesServerContract, MailsShouldBeWellReceived, JamesServerContract {
+public class WithDefaultSwiftMutableTest implements MailsShouldBeWellReceived {
+    @RegisterExtension
+    static JamesServerExtension jamesServerExtension = CassandraRabbitMQJamesServerFixture.baseExtensionBuilder()
+        .extension(new SwiftBlobStoreExtension())
+        .lifeCycle(JamesServerExtension.Lifecycle.PER_TEST)
+        .build();
 }
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithEncryptedAwsS3Extension.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithEncryptedAwsS3Extension.java
deleted file mode 100644
index c4927a2..0000000
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithEncryptedAwsS3Extension.java
+++ /dev/null
@@ -1,72 +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;
-
-import org.apache.james.modules.AwsS3BlobStoreExtension;
-import org.apache.james.modules.objectstorage.PayloadCodecFactory;
-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 WithEncryptedAwsS3Extension implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback, ParameterResolver {
-
-    private final JamesServerExtension jamesServerExtension;
-
-    WithEncryptedAwsS3Extension() {
-        jamesServerExtension = CassandraRabbitMQJamesServerFixture.baseExtensionBuilder()
-            .extension(new AwsS3BlobStoreExtension(PayloadCodecFactory.AES256))
-            .build();
-    }
-
-    @Override
-    public void beforeAll(ExtensionContext context) throws Exception {
-        jamesServerExtension.beforeAll(context);
-    }
-
-    @Override
-    public void afterAll(ExtensionContext context) throws Exception {
-        jamesServerExtension.afterAll(context);
-    }
-
-    @Override
-    public void beforeEach(ExtensionContext context) throws Exception {
-        jamesServerExtension.beforeEach(context);
-    }
-
-    @Override
-    public void afterEach(ExtensionContext context) throws Exception {
-        jamesServerExtension.afterEach(context);
-    }
-
-    @Override
-    public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
-        return (parameterContext.getParameter().getType() == GuiceJamesServer.class);
-    }
-
-    @Override
-    public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
-        return jamesServerExtension.getGuiceJamesServer();
-    }
-}
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithEncryptedAwsS3Test.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithEncryptedAwsS3ImmutableTest.java
similarity index 72%
rename from server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithEncryptedAwsS3Test.java
rename to server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithEncryptedAwsS3ImmutableTest.java
index aa500c6..c4172b7 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithEncryptedAwsS3Test.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithEncryptedAwsS3ImmutableTest.java
@@ -24,12 +24,18 @@ import static org.assertj.core.api.Assertions.assertThat;
 import org.apache.james.blob.objectstorage.AESPayloadCodec;
 import org.apache.james.blob.objectstorage.PayloadCodec;
 import org.apache.james.jmap.draft.JmapJamesServerContract;
+import org.apache.james.modules.AwsS3BlobStoreExtension;
+import org.apache.james.modules.objectstorage.PayloadCodecFactory;
 import org.apache.james.modules.objectstorage.aws.s3.DockerAwsS3TestRule;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(WithEncryptedAwsS3Extension.class)
-public class WithEncryptedAwsS3Test implements JmapJamesServerContract, MailsShouldBeWellReceived, JamesServerContract {
+public class WithEncryptedAwsS3ImmutableTest implements JmapJamesServerContract, JamesServerContract {
+    @RegisterExtension
+    static JamesServerExtension jamesServerExtension = CassandraRabbitMQJamesServerFixture.baseExtensionBuilder()
+        .extension(new AwsS3BlobStoreExtension(PayloadCodecFactory.AES256))
+        .lifeCycle(JamesServerExtension.Lifecycle.PER_CLASS)
+        .build();
 
     @Test
     void encryptedPayloadShouldBeConfiguredWhenProvidingEncryptedPayloadConfiguration(GuiceJamesServer jamesServer) {
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithEncryptedAwsS3MutableTest.java
similarity index 60%
copy from server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java
copy to server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithEncryptedAwsS3MutableTest.java
index 33219bb..361e575 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithEncryptedAwsS3MutableTest.java
@@ -19,9 +19,14 @@
 
 package org.apache.james;
 
-import org.apache.james.jmap.draft.JmapJamesServerContract;
-import org.junit.jupiter.api.extension.ExtendWith;
+import org.apache.james.modules.AwsS3BlobStoreExtension;
+import org.apache.james.modules.objectstorage.PayloadCodecFactory;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(WithCassandraBlobStore.class)
-public class WithCassandraBlobStoreTest implements JmapJamesServerContract, MailsShouldBeWellReceived, JamesServerContract {
+public class WithEncryptedAwsS3MutableTest implements MailsShouldBeWellReceived {
+    @RegisterExtension
+    static JamesServerExtension jamesServerExtension = CassandraRabbitMQJamesServerFixture.baseExtensionBuilder()
+        .extension(new AwsS3BlobStoreExtension(PayloadCodecFactory.AES256))
+        .lifeCycle(JamesServerExtension.Lifecycle.PER_TEST)
+        .build();
 }
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithEncryptedSwiftExtension.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithEncryptedSwiftExtension.java
deleted file mode 100644
index 422a281..0000000
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithEncryptedSwiftExtension.java
+++ /dev/null
@@ -1,72 +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;
-
-import org.apache.james.modules.SwiftBlobStoreExtension;
-import org.apache.james.modules.objectstorage.PayloadCodecFactory;
-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 WithEncryptedSwiftExtension implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback, ParameterResolver {
-
-    private final JamesServerExtension jamesServerExtension;
-
-    WithEncryptedSwiftExtension() {
-        jamesServerExtension = CassandraRabbitMQJamesServerFixture.baseExtensionBuilder()
-            .extension(new SwiftBlobStoreExtension(PayloadCodecFactory.AES256))
-            .build();
-    }
-
-    @Override
-    public void beforeAll(ExtensionContext context) throws Exception {
-        jamesServerExtension.beforeAll(context);
-    }
-
-    @Override
-    public void afterAll(ExtensionContext context) throws Exception {
-        jamesServerExtension.afterAll(context);
-    }
-
-    @Override
-    public void beforeEach(ExtensionContext context) throws Exception {
-        jamesServerExtension.beforeEach(context);
-    }
-
-    @Override
-    public void afterEach(ExtensionContext context) throws Exception {
-        jamesServerExtension.afterEach(context);
-    }
-
-    @Override
-    public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
-        return (parameterContext.getParameter().getType() == GuiceJamesServer.class);
-    }
-
-    @Override
-    public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
-        return jamesServerExtension.getGuiceJamesServer();
-    }
-}
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithEncryptedSwiftTest.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithEncryptedSwiftImmutableTest.java
similarity index 72%
rename from server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithEncryptedSwiftTest.java
rename to server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithEncryptedSwiftImmutableTest.java
index 0f998bc..aeb59d8 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithEncryptedSwiftTest.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithEncryptedSwiftImmutableTest.java
@@ -24,12 +24,18 @@ import static org.assertj.core.api.Assertions.assertThat;
 import org.apache.james.blob.objectstorage.AESPayloadCodec;
 import org.apache.james.blob.objectstorage.PayloadCodec;
 import org.apache.james.jmap.draft.JmapJamesServerContract;
+import org.apache.james.modules.SwiftBlobStoreExtension;
+import org.apache.james.modules.objectstorage.PayloadCodecFactory;
 import org.apache.james.modules.objectstorage.swift.DockerSwiftTestRule;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(WithEncryptedSwiftExtension.class)
-public class WithEncryptedSwiftTest implements JmapJamesServerContract, MailsShouldBeWellReceived, JamesServerContract {
+public class WithEncryptedSwiftImmutableTest implements JmapJamesServerContract, JamesServerContract {
+    @RegisterExtension
+    static JamesServerExtension jamesServerExtension = CassandraRabbitMQJamesServerFixture.baseExtensionBuilder()
+        .extension(new SwiftBlobStoreExtension(PayloadCodecFactory.AES256))
+        .lifeCycle(JamesServerExtension.Lifecycle.PER_CLASS)
+        .build();
 
     @Test
     void encryptedPayloadShouldBeConfiguredWhenProvidingEncryptedPayloadConfiguration(GuiceJamesServer jamesServer) {
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithEncryptedSwiftMutableTest.java
similarity index 60%
rename from server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java
rename to server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithEncryptedSwiftMutableTest.java
index 33219bb..7f45b8e 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithEncryptedSwiftMutableTest.java
@@ -19,9 +19,14 @@
 
 package org.apache.james;
 
-import org.apache.james.jmap.draft.JmapJamesServerContract;
-import org.junit.jupiter.api.extension.ExtendWith;
+import org.apache.james.modules.SwiftBlobStoreExtension;
+import org.apache.james.modules.objectstorage.PayloadCodecFactory;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(WithCassandraBlobStore.class)
-public class WithCassandraBlobStoreTest implements JmapJamesServerContract, MailsShouldBeWellReceived, JamesServerContract {
+public class WithEncryptedSwiftMutableTest implements MailsShouldBeWellReceived {
+    @RegisterExtension
+    static JamesServerExtension jamesServerExtension = CassandraRabbitMQJamesServerFixture.baseExtensionBuilder()
+        .extension(new SwiftBlobStoreExtension(PayloadCodecFactory.AES256))
+        .lifeCycle(JamesServerExtension.Lifecycle.PER_TEST)
+        .build();
 }
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithScanningSearchExtension.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithScanningSearchImmutableTest.java
similarity index 54%
rename from server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithScanningSearchExtension.java
rename to server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithScanningSearchImmutableTest.java
index ddeaabe..90fddc6 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithScanningSearchExtension.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithScanningSearchImmutableTest.java
@@ -24,21 +24,11 @@ import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
 import org.apache.james.modules.blobstore.BlobStoreConfiguration;
-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 org.junit.jupiter.api.extension.RegisterExtension;
 
-public class WithScanningSearchExtension implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback, ParameterResolver {
-
-    private final JamesServerExtension jamesServerExtension;
-
-    WithScanningSearchExtension() {
-        jamesServerExtension = new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
+class WithScanningSearchImmutableTest implements JmapJamesServerContract, JamesServerContract {
+    static JamesServerBuilder<CassandraRabbitMQJamesConfiguration> baseExtension() {
+        return new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
             CassandraRabbitMQJamesConfiguration.builder()
                 .workingDirectory(tmpDir)
                 .configurationFromClasspath()
@@ -53,37 +43,11 @@ public class WithScanningSearchExtension implements BeforeAllCallback, AfterAllC
             .extension(new AwsS3BlobStoreExtension())
             .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
                 .overrideWith(new TestJMAPServerModule())
-                .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE))
-            .build();
-    }
-
-    @Override
-    public void beforeAll(ExtensionContext context) throws Exception {
-        jamesServerExtension.beforeAll(context);
+                .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE));
     }
 
-    @Override
-    public void afterAll(ExtensionContext context) throws Exception {
-        jamesServerExtension.afterAll(context);
-    }
-
-    @Override
-    public void beforeEach(ExtensionContext context) throws Exception {
-        jamesServerExtension.beforeEach(context);
-    }
-
-    @Override
-    public void afterEach(ExtensionContext context) throws Exception {
-        jamesServerExtension.afterEach(context);
-    }
-
-    @Override
-    public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
-        return (parameterContext.getParameter().getType() == GuiceJamesServer.class);
-    }
-
-    @Override
-    public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
-        return jamesServerExtension.getGuiceJamesServer();
-    }
-}
+    @RegisterExtension
+    static JamesServerExtension jamesServerExtension = baseExtension()
+        .lifeCycle(JamesServerExtension.Lifecycle.PER_CLASS)
+        .build();
+}
\ No newline at end of file
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithScanningSearchTest.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithScanningSearchMutableTest.java
similarity index 78%
rename from server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithScanningSearchTest.java
rename to server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithScanningSearchMutableTest.java
index ec30cc9..2a9ea35 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithScanningSearchTest.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithScanningSearchMutableTest.java
@@ -19,9 +19,11 @@
 
 package org.apache.james;
 
-import org.apache.james.jmap.draft.JmapJamesServerContract;
-import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(WithScanningSearchExtension.class)
-class WithScanningSearchTest implements JmapJamesServerContract, MailsShouldBeWellReceived, JamesServerContract {
+class WithScanningSearchMutableTest implements MailsShouldBeWellReceived {
+    @RegisterExtension
+    JamesServerExtension jamesServerExtension = WithScanningSearchImmutableTest.baseExtension()
+        .lifeCycle(JamesServerExtension.Lifecycle.PER_TEST)
+        .build();
 }
\ No newline at end of file
diff --git a/server/container/guice/protocols/jmap/src/test/java/org/apache/james/jmap/draft/JmapJamesServerContract.java b/server/container/guice/protocols/jmap/src/test/java/org/apache/james/jmap/draft/JmapJamesServerContract.java
index 461b0af..f9d7301 100644
--- a/server/container/guice/protocols/jmap/src/test/java/org/apache/james/jmap/draft/JmapJamesServerContract.java
+++ b/server/container/guice/protocols/jmap/src/test/java/org/apache/james/jmap/draft/JmapJamesServerContract.java
@@ -26,7 +26,6 @@ import java.nio.charset.StandardCharsets;
 
 import org.apache.james.GuiceJamesServer;
 import org.apache.james.domainlist.lib.DomainListConfiguration;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 import com.google.inject.Module;
@@ -34,6 +33,7 @@ import com.google.inject.Module;
 import io.restassured.RestAssured;
 import io.restassured.builder.RequestSpecBuilder;
 import io.restassured.http.ContentType;
+import io.restassured.specification.RequestSpecification;
 
 public interface JmapJamesServerContract {
     Module DOMAIN_LIST_CONFIGURATION_MODULE = binder -> binder.bind(DomainListConfiguration.class)
@@ -43,19 +43,9 @@ public interface JmapJamesServerContract {
             .build());
     String JAMES_SERVER_HOST = "127.0.0.1";
 
-    @BeforeEach
-    default void setup(GuiceJamesServer server) throws Exception {
-
-        RestAssured.requestSpecification = new RequestSpecBuilder()
-            .setContentType(ContentType.JSON)
-            .setAccept(ContentType.JSON)
-            .setConfig(newConfig().encoderConfig(encoderConfig().defaultContentCharset(StandardCharsets.UTF_8)))
-            .setPort(server.getProbe(JmapGuiceProbe.class).getJmapPort().getValue())
-            .build();
-    }
-
     @Test
-    default void connectJMAPServerShouldRespondBadRequest() {
+    default void connectJMAPServerShouldRespondBadRequest(GuiceJamesServer server) {
+        RestAssured.requestSpecification = requestSpec(server);
         given()
             .body("{\"badAttributeName\": \"value\"}")
         .when()
@@ -63,4 +53,13 @@ public interface JmapJamesServerContract {
         .then()
             .statusCode(400);
     }
+
+    static RequestSpecification requestSpec(GuiceJamesServer server) {
+        return new RequestSpecBuilder()
+            .setContentType(ContentType.JSON)
+            .setAccept(ContentType.JSON)
+            .setConfig(newConfig().encoderConfig(encoderConfig().defaultContentCharset(StandardCharsets.UTF_8)))
+            .setPort(server.getProbe(JmapGuiceProbe.class).getJmapPort().getValue())
+            .build();
+    }
 }
diff --git a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryJwtFilterIntegrationTest.java b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryJwtFilterIntegrationTest.java
index f724152..c1aeca7 100644
--- a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryJwtFilterIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryJwtFilterIntegrationTest.java
@@ -37,6 +37,5 @@ class MemoryJwtFilterIntegrationTest extends JwtFilterIntegrationTest {
             .overrideWith(new WebadminIntegrationTestModule())
             .overrideWith(binder -> binder.bind(AuthenticationFilter.class).to(JwtFilter.class))
             .overrideWith(binder -> binder.bind(JwtConfiguration.class).toInstance(jwtConfiguration())))
-        .lifeCycle(JamesServerExtension.Lifecycle.PER_CLASS)
         .build();
 }


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