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 ro...@apache.org on 2018/12/19 08:24:41 UTC

[4/8] james-project git commit: JAMES-2608 introduce CassandraMailRepositoryMailDaoAPI to introduce a v2 implementation later

JAMES-2608 introduce CassandraMailRepositoryMailDaoAPI to introduce a v2 implementation later


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

Branch: refs/heads/master
Commit: 7a2e552f3575ad56def379850c1e38637c320771
Parents: d9118f6
Author: Matthieu Baechler <ma...@apache.org>
Authored: Wed Nov 28 18:37:59 2018 +0100
Committer: Raphael Ouazana <ra...@linagora.com>
Committed: Wed Dec 19 09:24:12 2018 +0100

----------------------------------------------------------------------
 .../cassandra/CassandraMailRepository.java      |   4 +-
 .../CassandraMailRepositoryMailDAO.java         |  52 +----
 .../CassandraMailRepositoryMailDaoAPI.java      |  81 +++++++
 .../CassandraMailRepositoryProvider.java        |   4 +-
 .../CassandraMailRepositoryMailDAOTest.java     | 212 ++++++++++---------
 ...ilRepositoryWithFakeImplementationsTest.java |  33 ++-
 6 files changed, 232 insertions(+), 154 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/7a2e552f/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java
----------------------------------------------------------------------
diff --git a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java
index c62feba..6655798 100644
--- a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java
+++ b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java
@@ -43,11 +43,11 @@ public class CassandraMailRepository implements MailRepository {
     private final MailRepositoryUrl url;
     private final CassandraMailRepositoryKeysDAO keysDAO;
     private final CassandraMailRepositoryCountDAO countDAO;
-    private final CassandraMailRepositoryMailDAO mailDAO;
+    private final CassandraMailRepositoryMailDaoAPI mailDAO;
     private final Store<MimeMessage, MimeMessagePartsId> mimeMessageStore;
 
     public CassandraMailRepository(MailRepositoryUrl url, CassandraMailRepositoryKeysDAO keysDAO,
-                                   CassandraMailRepositoryCountDAO countDAO, CassandraMailRepositoryMailDAO mailDAO,
+                                   CassandraMailRepositoryCountDAO countDAO, CassandraMailRepositoryMailDaoAPI mailDAO,
                                    Store<MimeMessage, MimeMessagePartsId> mimeMessageStore) {
         this.url = url;
         this.keysDAO = keysDAO;

http://git-wip-us.apache.org/repos/asf/james-project/blob/7a2e552f/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAO.java
----------------------------------------------------------------------
diff --git a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAO.java b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAO.java
index 51bbe30..7c3596b 100644
--- a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAO.java
+++ b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAO.java
@@ -55,7 +55,6 @@ import java.util.Collection;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
 
@@ -82,10 +81,11 @@ import com.datastax.driver.core.Session;
 import com.datastax.driver.core.UDTValue;
 import com.github.fge.lambdas.Throwing;
 import com.github.steveash.guavate.Guavate;
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
-public class CassandraMailRepositoryMailDAO {
+public class CassandraMailRepositoryMailDAO implements CassandraMailRepositoryMailDaoAPI {
 
     private final CassandraAsyncExecutor executor;
     private final PreparedStatement insertMail;
@@ -95,8 +95,9 @@ public class CassandraMailRepositoryMailDAO {
     private final CassandraTypesProvider cassandraTypesProvider;
 
     @Inject
-    public CassandraMailRepositoryMailDAO(Session session, BlobId.Factory blobIdFactory,
-                                          CassandraTypesProvider cassandraTypesProvider) {
+    @VisibleForTesting
+    CassandraMailRepositoryMailDAO(Session session, BlobId.Factory blobIdFactory,
+                                   CassandraTypesProvider cassandraTypesProvider) {
         this.executor = new CassandraAsyncExecutor(session);
 
         this.insertMail = prepareInsert(session);
@@ -139,6 +140,7 @@ public class CassandraMailRepositoryMailDAO {
                 .and(eq(MAIL_KEY, bindMarker(MAIL_KEY))));
     }
 
+    @Override
     public CompletableFuture<Void> store(MailRepositoryUrl url, Mail mail, BlobId headerId, BlobId bodyId) throws MessagingException {
         return executor.executeVoid(insertMail.bind()
             .setString(REPOSITORY_NAME, url.asString())
@@ -158,12 +160,14 @@ public class CassandraMailRepositoryMailDAO {
         );
     }
 
+    @Override
     public CompletableFuture<Void> remove(MailRepositoryUrl url, MailKey key) {
         return executor.executeVoid(deleteMail.bind()
             .setString(REPOSITORY_NAME, url.asString())
             .setString(MAIL_KEY, key.asString()));
     }
 
+    @Override
     public CompletableFuture<Optional<MailDTO>> read(MailRepositoryUrl url, MailKey key) {
         return executor.executeSingleRow(selectMail.bind()
             .setString(REPOSITORY_NAME, url.asString())
@@ -277,44 +281,4 @@ public class CassandraMailRepositoryMailDAO {
         }
     }
 
-    public class MailDTO {
-        private final MailImpl.Builder mailBuilder;
-        private final BlobId headerBlobId;
-        private final BlobId bodyBlobId;
-
-        public MailDTO(MailImpl.Builder mailBuilder, BlobId headerBlobId, BlobId bodyBlobId) {
-            this.mailBuilder = mailBuilder;
-            this.headerBlobId = headerBlobId;
-            this.bodyBlobId = bodyBlobId;
-        }
-
-        public MailImpl.Builder getMailBuilder() {
-            return mailBuilder;
-        }
-
-        public BlobId getHeaderBlobId() {
-            return headerBlobId;
-        }
-
-        public BlobId getBodyBlobId() {
-            return bodyBlobId;
-        }
-
-        @Override
-        public final boolean equals(Object o) {
-            if (o instanceof MailDTO) {
-                MailDTO mailDTO = (MailDTO) o;
-
-                return Objects.equals(this.mailBuilder.build(), mailDTO.mailBuilder.build())
-                    && Objects.equals(this.headerBlobId, mailDTO.headerBlobId)
-                    && Objects.equals(this.bodyBlobId, mailDTO.bodyBlobId);
-            }
-            return false;
-        }
-
-        @Override
-        public final int hashCode() {
-            return Objects.hash(mailBuilder.build(), headerBlobId, bodyBlobId);
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/7a2e552f/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDaoAPI.java
----------------------------------------------------------------------
diff --git a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDaoAPI.java b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDaoAPI.java
new file mode 100644
index 0000000..435bcf1
--- /dev/null
+++ b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDaoAPI.java
@@ -0,0 +1,81 @@
+/****************************************************************
+ * 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.mailrepository.cassandra;
+
+import java.util.Objects;
+import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
+
+import javax.mail.MessagingException;
+
+import org.apache.james.blob.api.BlobId;
+import org.apache.james.mailrepository.api.MailKey;
+import org.apache.james.mailrepository.api.MailRepositoryUrl;
+import org.apache.james.server.core.MailImpl;
+import org.apache.mailet.Mail;
+
+public interface CassandraMailRepositoryMailDaoAPI {
+    CompletableFuture<Void> store(MailRepositoryUrl url, Mail mail, BlobId headerId, BlobId bodyId) throws MessagingException;
+
+    CompletableFuture<Void> remove(MailRepositoryUrl url, MailKey key);
+
+    CompletableFuture<Optional<MailDTO>> read(MailRepositoryUrl url, MailKey key);
+
+    class MailDTO {
+        private final MailImpl.Builder mailBuilder;
+        private final BlobId headerBlobId;
+        private final BlobId bodyBlobId;
+
+        public MailDTO(MailImpl.Builder mailBuilder, BlobId headerBlobId, BlobId bodyBlobId) {
+            this.mailBuilder = mailBuilder;
+            this.headerBlobId = headerBlobId;
+            this.bodyBlobId = bodyBlobId;
+        }
+
+        public MailImpl.Builder getMailBuilder() {
+            return mailBuilder;
+        }
+
+        public BlobId getHeaderBlobId() {
+            return headerBlobId;
+        }
+
+        public BlobId getBodyBlobId() {
+            return bodyBlobId;
+        }
+
+        @Override
+        public final boolean equals(Object o) {
+            if (o instanceof MailDTO) {
+                MailDTO mailDTO = (MailDTO) o;
+
+                return Objects.equals(this.mailBuilder.build(), mailDTO.mailBuilder.build())
+                    && Objects.equals(this.headerBlobId, mailDTO.headerBlobId)
+                    && Objects.equals(this.bodyBlobId, mailDTO.bodyBlobId);
+            }
+            return false;
+        }
+
+        @Override
+        public final int hashCode() {
+            return Objects.hash(mailBuilder.build(), headerBlobId, bodyBlobId);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/7a2e552f/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryProvider.java
----------------------------------------------------------------------
diff --git a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryProvider.java b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryProvider.java
index d5c1077..410c46b 100644
--- a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryProvider.java
+++ b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryProvider.java
@@ -29,12 +29,12 @@ import org.apache.james.mailrepository.api.MailRepositoryUrl;
 public class CassandraMailRepositoryProvider implements MailRepositoryProvider {
     private final CassandraMailRepositoryKeysDAO keysDAO;
     private final CassandraMailRepositoryCountDAO countDAO;
-    private final CassandraMailRepositoryMailDAO mailDAO;
+    private final CassandraMailRepositoryMailDaoAPI mailDAO;
     private final MimeMessageStore.Factory mimeMessageStoreFactory;
 
     @Inject
     public CassandraMailRepositoryProvider(CassandraMailRepositoryKeysDAO keysDAO, CassandraMailRepositoryCountDAO countDAO,
-                                           CassandraMailRepositoryMailDAO mailDAO, MimeMessageStore.Factory mimeMessageStoreFactory) {
+                                           CassandraMailRepositoryMailDaoAPI mailDAO, MimeMessageStore.Factory mimeMessageStoreFactory) {
         this.keysDAO = keysDAO;
         this.countDAO = countDAO;
         this.mailDAO = mailDAO;

http://git-wip-us.apache.org/repos/asf/james-project/blob/7a2e552f/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 de19dee..582a7ba 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
@@ -33,6 +33,7 @@ import org.apache.mailet.PerRecipientHeaders;
 import org.apache.mailet.base.MailAddressFixture;
 import org.apache.mailet.base.test.FakeMail;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
@@ -46,109 +47,128 @@ class CassandraMailRepositoryMailDAOTest {
     @RegisterExtension
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraMailRepositoryModule.MODULE);
 
-    CassandraMailRepositoryMailDAO testee;
 
-    @BeforeEach
-    void setUp(CassandraCluster cassandra) {
-        testee = new CassandraMailRepositoryMailDAO(cassandra.getConf(), BLOB_ID_FACTORY, cassandra.getTypesProvider());
-    }
-
-    @Test
-    void readShouldReturnEmptyWhenAbsent() {
-        assertThat(testee.read(URL, KEY_1).join())
-            .isEmpty();
-    }
-
-    @Test
-    void readShouldReturnAllMailMetadata() throws Exception {
-        BlobId blobIdBody = BLOB_ID_FACTORY.from("blobHeader");
-        BlobId blobIdHeader = BLOB_ID_FACTORY.from("blobBody");
-        String errorMessage = "error message";
-        String state = "state";
-        String remoteAddr = "remoteAddr";
-        String remoteHost = "remoteHost";
-        PerRecipientHeaders.Header header = PerRecipientHeaders.Header.builder().name("headerName").value("headerValue").build();
-        String attributeName = "att1";
-        ImmutableList<String> attributeValue = ImmutableList.of("value1", "value2");
-
-        testee.store(URL,
-            FakeMail.builder()
-                .name(KEY_1.asString())
-                .sender(MailAddressFixture.SENDER)
-                .recipients(MailAddressFixture.RECIPIENT1, MailAddressFixture.RECIPIENT2)
-                .errorMessage(errorMessage)
-                .state(state)
-                .remoteAddr(remoteAddr)
-                .remoteHost(remoteHost)
-                .addHeaderForRecipient(header, MailAddressFixture.RECIPIENT1)
-                .attribute(attributeName, attributeValue)
-                .build(),
-            blobIdHeader,
-            blobIdBody)
-            .join();
-
-        CassandraMailRepositoryMailDAO.MailDTO mailDTO = testee.read(URL, KEY_1).join().get();
-
-        Mail partialMail = mailDTO.getMailBuilder().build();
-        assertSoftly(softly -> {
-            softly.assertThat(mailDTO.getBodyBlobId()).isEqualTo(blobIdBody);
-            softly.assertThat(mailDTO.getHeaderBlobId()).isEqualTo(blobIdHeader);
-            softly.assertThat(partialMail.getName()).isEqualTo(KEY_1.asString());
-            softly.assertThat(partialMail.getErrorMessage()).isEqualTo(errorMessage);
-            softly.assertThat(partialMail.getState()).isEqualTo(state);
-            softly.assertThat(partialMail.getRemoteAddr()).isEqualTo(remoteAddr);
-            softly.assertThat(partialMail.getRemoteHost()).isEqualTo(remoteHost);
-            softly.assertThat(partialMail.getAttributeNames()).containsOnly(attributeName);
-            softly.assertThat(partialMail.getAttribute(attributeName)).isEqualTo(attributeValue);
-            softly.assertThat(partialMail.getPerRecipientSpecificHeaders().getRecipientsWithSpecificHeaders())
+    abstract class TestSuite {
+
+        abstract CassandraMailRepositoryMailDaoAPI testee();
+
+        @Test
+        void readShouldReturnAllMailMetadata() throws Exception {
+            CassandraMailRepositoryMailDaoAPI testee = testee();
+
+            BlobId blobIdBody = BLOB_ID_FACTORY.from("blobHeader");
+            BlobId blobIdHeader = BLOB_ID_FACTORY.from("blobBody");
+            String errorMessage = "error message";
+            String state = "state";
+            String remoteAddr = "remoteAddr";
+            String remoteHost = "remoteHost";
+            PerRecipientHeaders.Header header = PerRecipientHeaders.Header.builder().name("headerName").value("headerValue").build();
+            String attributeName = "att1";
+            ImmutableList<String> attributeValue = ImmutableList.of("value1", "value2");
+
+            testee.store(URL,
+                FakeMail.builder()
+                    .name(KEY_1.asString())
+                    .sender(MailAddressFixture.SENDER)
+                    .recipients(MailAddressFixture.RECIPIENT1, MailAddressFixture.RECIPIENT2)
+                    .errorMessage(errorMessage)
+                    .state(state)
+                    .remoteAddr(remoteAddr)
+                    .remoteHost(remoteHost)
+                    .addHeaderForRecipient(header, MailAddressFixture.RECIPIENT1)
+                    .attribute(attributeName, attributeValue)
+                    .build(),
+                blobIdHeader,
+                blobIdBody)
+                .join();
+
+            CassandraMailRepositoryMailDAO.MailDTO mailDTO = testee.read(URL, KEY_1).join().get();
+
+            Mail partialMail = mailDTO.getMailBuilder().build();
+            assertSoftly(softly -> {
+                softly.assertThat(mailDTO.getBodyBlobId()).isEqualTo(blobIdBody);
+                softly.assertThat(mailDTO.getHeaderBlobId()).isEqualTo(blobIdHeader);
+                softly.assertThat(partialMail.getName()).isEqualTo(KEY_1.asString());
+                softly.assertThat(partialMail.getErrorMessage()).isEqualTo(errorMessage);
+                softly.assertThat(partialMail.getState()).isEqualTo(state);
+                softly.assertThat(partialMail.getRemoteAddr()).isEqualTo(remoteAddr);
+                softly.assertThat(partialMail.getRemoteHost()).isEqualTo(remoteHost);
+                softly.assertThat(partialMail.getAttributeNames()).containsOnly(attributeName);
+                softly.assertThat(partialMail.getAttribute(attributeName)).isEqualTo(attributeValue);
+                softly.assertThat(partialMail.getPerRecipientSpecificHeaders().getRecipientsWithSpecificHeaders())
                     .containsOnly(MailAddressFixture.RECIPIENT1);
-            softly.assertThat(partialMail.getPerRecipientSpecificHeaders().getHeadersForRecipient(MailAddressFixture.RECIPIENT1))
+                softly.assertThat(partialMail.getPerRecipientSpecificHeaders().getHeadersForRecipient(MailAddressFixture.RECIPIENT1))
                     .containsOnly(header);
-            softly.assertThat(partialMail.getMaybeSender().asOptional()).contains(MailAddressFixture.SENDER);
-            softly.assertThat(partialMail.getRecipients()).containsOnly(MailAddressFixture.RECIPIENT1, MailAddressFixture.RECIPIENT2);
-        });
+                softly.assertThat(partialMail.getMaybeSender().asOptional()).contains(MailAddressFixture.SENDER);
+                softly.assertThat(partialMail.getRecipients()).containsOnly(MailAddressFixture.RECIPIENT1, MailAddressFixture.RECIPIENT2);
+            });
+        }
+
+        @Test
+        void storeShouldAcceptMailWithOnlyName() throws Exception {
+            CassandraMailRepositoryMailDaoAPI testee = testee();
+            BlobId blobIdBody = BLOB_ID_FACTORY.from("blobHeader");
+            BlobId blobIdHeader = BLOB_ID_FACTORY.from("blobBody");
+
+            testee.store(URL,
+                FakeMail.builder()
+                    .name(KEY_1.asString())
+                    .build(),
+                blobIdHeader,
+                blobIdBody)
+                .join();
+
+            CassandraMailRepositoryMailDAO.MailDTO mailDTO = testee.read(URL, KEY_1).join().get();
+
+            Mail partialMail = mailDTO.getMailBuilder().build();
+            assertSoftly(softly -> {
+                softly.assertThat(mailDTO.getBodyBlobId()).isEqualTo(blobIdBody);
+                softly.assertThat(mailDTO.getHeaderBlobId()).isEqualTo(blobIdHeader);
+                softly.assertThat(partialMail.getName()).isEqualTo(KEY_1.asString());
+            });
+        }
+
+        @Test
+        void removeShouldDeleteMailMetaData() throws Exception {
+            CassandraMailRepositoryMailDaoAPI testee = testee();
+            BlobId blobIdBody = BLOB_ID_FACTORY.from("blobHeader");
+            BlobId blobIdHeader = BLOB_ID_FACTORY.from("blobBody");
+
+            testee.store(URL,
+                FakeMail.builder()
+                    .name(KEY_1.asString())
+                    .build(),
+                blobIdHeader,
+                blobIdBody)
+                .join();
+
+            testee.remove(URL, KEY_1).join();
+
+            assertThat(testee.read(URL, KEY_1).join())
+                .isEmpty();
+        }
+
+
+        @Test
+        void readShouldReturnEmptyWhenAbsent() {
+            assertThat(testee().read(URL, KEY_1).join())
+                .isEmpty();
+        }
     }
 
-    @Test
-    void storeShouldAcceptMailWithOnlyName() throws Exception {
-        BlobId blobIdBody = BLOB_ID_FACTORY.from("blobHeader");
-        BlobId blobIdHeader = BLOB_ID_FACTORY.from("blobBody");
-
-        testee.store(URL,
-            FakeMail.builder()
-                .name(KEY_1.asString())
-                .build(),
-            blobIdHeader,
-            blobIdBody)
-            .join();
-
-        CassandraMailRepositoryMailDAO.MailDTO mailDTO = testee.read(URL, KEY_1).join().get();
-
-        Mail partialMail = mailDTO.getMailBuilder().build();
-        assertSoftly(softly -> {
-            softly.assertThat(mailDTO.getBodyBlobId()).isEqualTo(blobIdBody);
-            softly.assertThat(mailDTO.getHeaderBlobId()).isEqualTo(blobIdHeader);
-            softly.assertThat(partialMail.getName()).isEqualTo(KEY_1.asString());
-        });
-    }
-
-    @Test
-    void removeShouldDeleteMailMetaData() throws Exception {
-        BlobId blobIdBody = BLOB_ID_FACTORY.from("blobHeader");
-        BlobId blobIdHeader = BLOB_ID_FACTORY.from("blobBody");
+    @Nested
+    class v1 extends TestSuite {
 
-        testee.store(URL,
-            FakeMail.builder()
-                .name(KEY_1.asString())
-                .build(),
-            blobIdHeader,
-            blobIdBody)
-            .join();
+        private CassandraMailRepositoryMailDAO testee;
 
-        testee.remove(URL, KEY_1).join();
+        @BeforeEach
+        void setUp(CassandraCluster cassandra) {
+            testee = new CassandraMailRepositoryMailDAO(cassandra.getConf(), BLOB_ID_FACTORY, cassandra.getTypesProvider());
+        }
 
-        assertThat(testee.read(URL, KEY_1).join())
-            .isEmpty();
+        @Override
+        CassandraMailRepositoryMailDaoAPI testee() {
+            return testee;
+        }
     }
-
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/7a2e552f/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryWithFakeImplementationsTest.java
----------------------------------------------------------------------
diff --git a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryWithFakeImplementationsTest.java b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryWithFakeImplementationsTest.java
index ce56641..ca2eb2c 100644
--- a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryWithFakeImplementationsTest.java
+++ b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryWithFakeImplementationsTest.java
@@ -24,15 +24,14 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
 
-import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
-import org.apache.james.backends.cassandra.init.CassandraTypesProvider;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.api.HashBlobId;
@@ -82,7 +81,7 @@ class CassandraMailRepositoryWithFakeImplementationsTest {
 
         @BeforeEach
         void setup(CassandraCluster cassandra) {
-            CassandraMailRepositoryMailDAO mailDAO = new CassandraMailRepositoryMailDAO(cassandra.getConf(), BLOB_ID_FACTORY, cassandra.getTypesProvider());
+            CassandraMailRepositoryMailDaoAPI mailDAO = new CassandraMailRepositoryMailDAO(cassandra.getConf(), BLOB_ID_FACTORY, cassandra.getTypesProvider());
             keysDAO = new CassandraMailRepositoryKeysDAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION);
             CassandraMailRepositoryCountDAO countDAO = new CassandraMailRepositoryCountDAO(cassandra.getConf());
 
@@ -134,7 +133,7 @@ class CassandraMailRepositoryWithFakeImplementationsTest {
 
         @BeforeEach
         void setup(CassandraCluster cassandra) {
-            FailingMailDAO mailDAO = new FailingMailDAO(cassandra.getConf(), BLOB_ID_FACTORY, cassandra.getTypesProvider());
+            FailingMailDAO mailDAO = new FailingMailDAO();
             keysDAO = new CassandraMailRepositoryKeysDAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION);
             CassandraMailRepositoryCountDAO countDAO = new CassandraMailRepositoryCountDAO(cassandra.getConf());
             CassandraBlobsDAO blobsDAO = new CassandraBlobsDAO(cassandra.getConf());
@@ -143,18 +142,32 @@ class CassandraMailRepositoryWithFakeImplementationsTest {
                     keysDAO, countDAO, mailDAO, MimeMessageStore.factory(blobsDAO).mimeMessageStore());
         }
 
-        class FailingMailDAO extends CassandraMailRepositoryMailDAO {
+        class FailingMailDAO implements CassandraMailRepositoryMailDaoAPI {
 
-            public FailingMailDAO(Session session, BlobId.Factory blobIdFactory, CassandraTypesProvider cassandraTypesProvider) {
-                super(session, blobIdFactory, cassandraTypesProvider);
+            FailingMailDAO() {
             }
 
             @Override
-            public CompletableFuture<Void> store(MailRepositoryUrl url, Mail mail, BlobId headerId, BlobId bodyId) throws MessagingException {
+            public CompletableFuture<Void> store(MailRepositoryUrl url, Mail mail, BlobId headerId, BlobId bodyId) {
                 return CompletableFuture.supplyAsync(() -> {
                     throw new RuntimeException("Expected failure while storing mail parts");
                 });
             }
+
+            @Override
+            public CompletableFuture<Void> remove(MailRepositoryUrl url, MailKey key) {
+                return CompletableFuture.supplyAsync(() -> {
+                    throw new RuntimeException("Expected failure while remeving mail parts");
+                });
+
+            }
+
+            @Override
+            public CompletableFuture<Optional<CassandraMailRepositoryMailDAO.MailDTO>> read(MailRepositoryUrl url, MailKey key) {
+                return CompletableFuture.supplyAsync(() -> {
+                    throw new RuntimeException("Expected failure while reading mail parts");
+                });
+            }
         }
 
         @Test
@@ -205,7 +218,7 @@ class CassandraMailRepositoryWithFakeImplementationsTest {
 
         @BeforeEach
         void setup(CassandraCluster cassandra) {
-            CassandraMailRepositoryMailDAO mailDAO = new CassandraMailRepositoryMailDAO(cassandra.getConf(), BLOB_ID_FACTORY, cassandra.getTypesProvider());
+            CassandraMailRepositoryMailDaoAPI mailDAO = new CassandraMailRepositoryMailDAO(cassandra.getConf(), BLOB_ID_FACTORY, cassandra.getTypesProvider());
             FailingKeysDAO keysDAO = new FailingKeysDAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION);
             countDAO = new CassandraMailRepositoryCountDAO(cassandra.getConf());
             CassandraBlobsDAO blobsDAO = new CassandraBlobsDAO(cassandra.getConf());
@@ -216,7 +229,7 @@ class CassandraMailRepositoryWithFakeImplementationsTest {
 
         class FailingKeysDAO extends CassandraMailRepositoryKeysDAO {
 
-            public FailingKeysDAO(Session session, CassandraUtils cassandraUtils) {
+            FailingKeysDAO(Session session, CassandraUtils cassandraUtils) {
                 super(session, cassandraUtils);
             }
 


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