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 rc...@apache.org on 2020/04/10 02:02:12 UTC

[james-project] 04/15: JAMES-3136 Failure tests for CassandraMessageIdMapper

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

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

commit 52d55c59941ae3a1256a088009a6c1b9477ae6ca
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Apr 7 11:34:31 2020 +0700

    JAMES-3136 Failure tests for CassandraMessageIdMapper
---
 .../cassandra/mail/CassandraMessageIdMapper.java   |   5 +-
 .../mail/CassandraMessageIdMapperTest.java         | 132 +++++++++++++++++++++
 .../store/mail/model/MessageIdMapperTest.java      |   6 +-
 3 files changed, 136 insertions(+), 7 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
index 0eeca22..4d88c9a 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
@@ -127,9 +127,8 @@ public class CassandraMessageIdMapper implements MessageIdMapper {
         mailboxMapper.findMailboxById(mailboxId);
         ComposedMessageIdWithMetaData composedMessageIdWithMetaData = createMetadataFor(mailboxMessage);
         messageDAO.save(mailboxMessage)
-            .thenMany(Flux.merge(
-                imapUidDAO.insert(composedMessageIdWithMetaData),
-                messageIdDAO.insert(composedMessageIdWithMetaData)))
+            .thenEmpty(imapUidDAO.insert(composedMessageIdWithMetaData))
+            .thenEmpty(messageIdDAO.insert(composedMessageIdWithMetaData))
             .thenEmpty(indexTableHandler.updateIndexOnAdd(mailboxMessage, mailboxId))
             .block();
     }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java
index 98ef169..582569a 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java
@@ -19,10 +19,13 @@
 
 package org.apache.james.mailbox.cassandra.mail;
 
+import static org.apache.james.backends.cassandra.Scenario.Builder.fail;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.util.List;
+import java.util.Optional;
 
+import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.core.Username;
@@ -30,13 +33,18 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.cassandra.CassandraMailboxSessionMapperFactory;
 import org.apache.james.mailbox.cassandra.TestCassandraMailboxSessionMapperFactory;
+import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
+import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.MessageIdMapperTest;
+import org.assertj.core.api.SoftAssertions;
+import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
+import com.github.fge.lambdas.Throwing;
 import com.google.common.collect.ImmutableList;
 
 class CassandraMessageIdMapperTest extends MessageIdMapperTest {
@@ -73,4 +81,128 @@ class CassandraMessageIdMapperTest extends MessageIdMapperTest {
         assertThat(messages)
             .containsOnly(message1, message2, message3, message4);
     }
+
+    @Nested
+    class FailureTest {
+        @Test
+        void retrieveMessagesShouldNotReturnMessagesWhenFailToPersistInMessageDAO(CassandraCluster cassandra) {
+            cassandra.getConf()
+                .registerScenario(fail()
+                    .forever()
+                    .whenQueryStartsWith("INSERT INTO messageV2 (messageId,internalDate,bodyStartOctet,fullContentOctets,bodyOctets,bodyContent,headerContent,properties,textualLineCount,attachments)"));
+
+            try {
+                message1.setUid(mapperProvider.generateMessageUid());
+                message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
+                sut.save(message1);
+            } catch (Exception e) {
+                // ignoring expected error
+            }
+
+            CassandraMessageIdDAO messageIdDAO = new CassandraMessageIdDAO(cassandra.getConf(), new CassandraMessageId.Factory());
+            SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
+                softly.assertThat(sut.find(ImmutableList.of(message1.getMessageId()), MessageMapper.FetchType.Metadata))
+                    .isEmpty();
+                softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all()).collectList().block())
+                    .isEmpty();
+            }));
+        }
+
+        @Test
+        void retrieveMessagesShouldNotReturnMessagesWhenFailsToPersistBlobParts(CassandraCluster cassandra) {
+            cassandra.getConf()
+                .registerScenario(fail()
+                    .forever()
+                    .whenQueryStartsWith("INSERT INTO blobParts (id,chunkNumber,data) VALUES (:id,:chunkNumber,:data);"));
+
+            try {
+                message1.setUid(mapperProvider.generateMessageUid());
+                message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
+                sut.save(message1);
+            } catch (Exception e) {
+                // ignoring expected error
+            }
+
+            CassandraMessageIdDAO messageIdDAO = new CassandraMessageIdDAO(cassandra.getConf(), new CassandraMessageId.Factory());
+            SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
+                softly.assertThat(sut.find(ImmutableList.of(message1.getMessageId()), MessageMapper.FetchType.Metadata))
+                    .isEmpty();
+                softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all()).collectList().block())
+                    .isEmpty();
+            }));
+        }
+
+        @Test
+        void retrieveMessagesShouldNotReturnMessagesWhenFailsToPersistBlobs(CassandraCluster cassandra) {
+            cassandra.getConf()
+                .registerScenario(fail()
+                    .forever()
+                    .whenQueryStartsWith("INSERT INTO blobs (id,position) VALUES (:id,:position);"));
+
+            try {
+                message1.setUid(mapperProvider.generateMessageUid());
+                message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
+                sut.save(message1);
+            } catch (Exception e) {
+                // ignoring expected error
+            }
+
+            CassandraMessageIdDAO messageIdDAO = new CassandraMessageIdDAO(cassandra.getConf(), new CassandraMessageId.Factory());
+            SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
+                softly.assertThat(sut.find(ImmutableList.of(message1.getMessageId()), MessageMapper.FetchType.Metadata))
+                    .isEmpty();
+                softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all()).collectList().block())
+                    .isEmpty();
+            }));
+        }
+
+        @Test
+        void retrieveMessagesShouldNotReturnMessagesWhenFailsToPersistInImapUidTable(CassandraCluster cassandra) {
+            cassandra.getConf()
+                .registerScenario(fail()
+                    .forever()
+                    .whenQueryStartsWith("INSERT INTO imapUidTable (messageId,mailboxId,uid,modSeq,flagAnswered,flagDeleted,flagDraft,flagFlagged,flagRecent,flagSeen,flagUser,userFlags)"));
+
+            try {
+                message1.setUid(mapperProvider.generateMessageUid());
+                message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
+                sut.save(message1);
+            } catch (Exception e) {
+                // ignoring expected error
+            }
+
+            CassandraMessageIdDAO messageIdDAO = new CassandraMessageIdDAO(cassandra.getConf(), new CassandraMessageId.Factory());
+            SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
+                softly.assertThat(sut.find(ImmutableList.of(message1.getMessageId()), MessageMapper.FetchType.Metadata))
+                    .isEmpty();
+                softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all()).collectList().block())
+                    .isEmpty();
+            }));
+        }
+
+        @Test
+        void addShouldPersistInTableOfTruthWhenMessageIdTableWritesFails(CassandraCluster cassandra) {
+            cassandra.getConf()
+                .registerScenario(fail()
+                    .forever()
+                    .whenQueryStartsWith("INSERT INTO messageIdTable (mailboxId,uid,modSeq,messageId,flagAnswered,flagDeleted,flagDraft,flagFlagged,flagRecent,flagSeen,flagUser,userFlags)"));
+
+            try {
+                message1.setUid(mapperProvider.generateMessageUid());
+                message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
+                sut.save(message1);
+            } catch (Exception e) {
+                // ignoring expected error
+            }
+
+            CassandraMessageIdToImapUidDAO imapUidDAO = new CassandraMessageIdToImapUidDAO(cassandra.getConf(), new CassandraMessageId.Factory());
+
+            SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
+                softly.assertThat(sut.find(ImmutableList.of(message1.getMessageId()), MessageMapper.FetchType.Metadata))
+                    .hasSize(1);
+                softly.assertThat(imapUidDAO.retrieve((CassandraMessageId) message1.getMessageId(), Optional.empty()).collectList().block())
+                    .hasSize(1);
+            }));
+        }
+    }
 }
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
index 0c9fc61..57b90f9 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
@@ -25,7 +25,6 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import java.time.Duration;
 import java.util.Date;
 import java.util.List;
-import java.util.Map;
 
 import javax.mail.Flags;
 import javax.mail.Flags.Flag;
@@ -42,7 +41,6 @@ import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
-import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.UidValidity;
 import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
@@ -71,7 +69,7 @@ public abstract class MessageIdMapperTest {
 
     private MessageMapper messageMapper;
     private MailboxMapper mailboxMapper;
-    private MessageIdMapper sut;
+    protected MessageIdMapper sut;
 
     protected Mailbox benwaInboxMailbox;
     private Mailbox benwaWorkMailbox;
@@ -81,7 +79,7 @@ public abstract class MessageIdMapperTest {
     protected SimpleMailboxMessage message3;
     protected SimpleMailboxMessage message4;
 
-    private MapperProvider mapperProvider;
+    protected MapperProvider mapperProvider;
 
     protected abstract MapperProvider provideMapper();
 


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