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 c31b05994f7a74d1ff2c3d334d4d690e550e15df Author: Tran Tien Duc <[email protected]> AuthorDate: Fri Feb 14 10:20:06 2020 +0700 JAMES-3056 Consistency test on failing deleting --- .../CassandraMailboxManagerConsistencyTest.java | 288 ++++++++++++++++++++- 1 file changed, 287 insertions(+), 1 deletion(-) diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerConsistencyTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerConsistencyTest.java index e2977fc..2278c2a 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerConsistencyTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerConsistencyTest.java @@ -368,7 +368,293 @@ class CassandraMailboxManagerConsistencyTest { @Nested class FailsOnDelete { - // TODO + + @Nested + class DeleteOnce { + @Disabled("JAMES-3056 allMailboxesSearchQuery returns empty list") + @Test + void deleteMailboxByPathShouldBeConsistentWhenMailboxDaoFails() throws Exception { + MailboxId inboxId = testee.createMailbox(inboxPath, mailboxSession) + .get(); + + doReturn(Mono.error(new RuntimeException("mock exception"))) + .when(mailboxDAO) + .delete(any(CassandraId.class)); + + doQuietly(() -> testee.deleteMailbox(inboxPath, mailboxSession)); + + SoftAssertions.assertSoftly(Throwing.consumer(softly -> { + softly.assertThat(testee.search(allMailboxesSearchQuery, mailboxSession)) + .hasOnlyOneElementSatisfying(mailboxMetaData -> { + softly.assertThat(mailboxMetaData.getId()).isEqualTo(inboxId); + softly.assertThat(mailboxMetaData.getPath()).isEqualTo(inboxPath); + }); + softly.assertThat(testee.list(mailboxSession)) + .containsExactly(inboxPath); + })); + } + + @Disabled("JAMES-3056 allMailboxesSearchQuery returns empty list") + @Test + void deleteMailboxByIdShouldBeConsistentWhenMailboxDaoFails() throws Exception { + MailboxId inboxId = testee.createMailbox(inboxPath, mailboxSession) + .get(); + + doReturn(Mono.error(new RuntimeException("mock exception"))) + .when(mailboxDAO) + .delete(any(CassandraId.class)); + + doQuietly(() -> testee.deleteMailbox(inboxId, mailboxSession)); + + SoftAssertions.assertSoftly(Throwing.consumer(softly -> { + softly.assertThat(testee.search(allMailboxesSearchQuery, mailboxSession)) + .hasOnlyOneElementSatisfying(mailboxMetaData -> { + softly.assertThat(mailboxMetaData.getId()).isEqualTo(inboxId); + softly.assertThat(mailboxMetaData.getPath()).isEqualTo(inboxPath); + }); + softly.assertThat(testee.list(mailboxSession)) + .containsExactly(inboxPath); + })); + } + + @Test + void deleteMailboxByPathShouldBeConsistentWhenMailboxPathDaoFails() throws Exception { + MailboxId inboxId = testee.createMailbox(inboxPath, mailboxSession) + .get(); + + doReturn(Mono.error(new RuntimeException("mock exception"))) + .when(mailboxPathV2DAO) + .delete(inboxPath); + + doQuietly(() -> testee.deleteMailbox(inboxPath, mailboxSession)); + + SoftAssertions.assertSoftly(Throwing.consumer(softly -> { + softly.assertThat(testee.search(allMailboxesSearchQuery, mailboxSession)) + .hasOnlyOneElementSatisfying(mailboxMetaData -> { + softly.assertThat(mailboxMetaData.getId()).isEqualTo(inboxId); + softly.assertThat(mailboxMetaData.getPath()).isEqualTo(inboxPath); + }); + softly.assertThat(testee.list(mailboxSession)) + .containsExactly(inboxPath); + })); + } + + @Test + void deleteMailboxByIdShouldBeConsistentWhenMailboxPathDaoFails() throws Exception { + MailboxId inboxId = testee.createMailbox(inboxPath, mailboxSession) + .get(); + + doReturn(Mono.error(new RuntimeException("mock exception"))) + .when(mailboxPathV2DAO) + .delete(inboxPath); + + doQuietly(() -> testee.deleteMailbox(inboxId, mailboxSession)); + + SoftAssertions.assertSoftly(Throwing.consumer(softly -> { + softly.assertThat(testee.search(allMailboxesSearchQuery, mailboxSession)) + .hasOnlyOneElementSatisfying(mailboxMetaData -> { + softly.assertThat(mailboxMetaData.getId()).isEqualTo(inboxId); + softly.assertThat(mailboxMetaData.getPath()).isEqualTo(inboxPath); + }); + softly.assertThat(testee.list(mailboxSession)) + .containsExactly(inboxPath); + })); + } + } + + @Nested + class DeleteTwice { + + @Disabled("JAMES-3056 list() returns one element with inboxPath") + @Test + void deleteMailboxByPathShouldDeleteWhenMailboxDaoFails() throws Exception { + testee.createMailbox(inboxPath, mailboxSession); + + doReturn(Mono.error(new RuntimeException("mock exception"))) + .doCallRealMethod() + .when(mailboxDAO) + .delete(any(CassandraId.class)); + + doQuietly(() -> testee.deleteMailbox(inboxPath, mailboxSession)); + doQuietly(() -> testee.deleteMailbox(inboxPath, mailboxSession)); + + SoftAssertions.assertSoftly(Throwing.consumer(softly -> { + softly.assertThat(testee.search(allMailboxesSearchQuery, mailboxSession)) + .isEmpty(); + softly.assertThat(testee.list(mailboxSession)) + .isEmpty(); + })); + } + + @Test + void deleteMailboxByIdShouldDeleteWhenMailboxDaoFails() throws Exception { + MailboxId inboxId = testee.createMailbox(inboxPath, mailboxSession) + .get(); + + doReturn(Mono.error(new RuntimeException("mock exception"))) + .doCallRealMethod() + .when(mailboxDAO) + .delete(any(CassandraId.class)); + + doQuietly(() -> testee.deleteMailbox(inboxId, mailboxSession)); + doQuietly(() -> testee.deleteMailbox(inboxId, mailboxSession)); + + SoftAssertions.assertSoftly(Throwing.consumer(softly -> { + softly.assertThat(testee.search(allMailboxesSearchQuery, mailboxSession)) + .isEmpty(); + softly.assertThat(testee.list(mailboxSession)) + .isEmpty(); + })); + } + + @Test + void deleteMailboxByPathShouldDeleteWhenMailboxPathDaoFails() throws Exception { + testee.createMailbox(inboxPath, mailboxSession); + + doReturn(Mono.error(new RuntimeException("mock exception"))) + .doCallRealMethod() + .when(mailboxPathV2DAO) + .delete(inboxPath); + + doQuietly(() -> testee.deleteMailbox(inboxPath, mailboxSession)); + doQuietly(() -> testee.deleteMailbox(inboxPath, mailboxSession)); + + SoftAssertions.assertSoftly(Throwing.consumer(softly -> { + softly.assertThat(testee.search(allMailboxesSearchQuery, mailboxSession)) + .isEmpty(); + softly.assertThat(testee.list(mailboxSession)) + .isEmpty(); + })); + } + + @Test + void deleteMailboxByIdShouldDeleteWhenMailboxPathDaoFails() throws Exception { + MailboxId inboxId = testee.createMailbox(inboxPath, mailboxSession) + .get(); + + doReturn(Mono.error(new RuntimeException("mock exception"))) + .doCallRealMethod() + .when(mailboxPathV2DAO) + .delete(inboxPath); + + doQuietly(() -> testee.deleteMailbox(inboxId, mailboxSession)); + doQuietly(() -> testee.deleteMailbox(inboxId, mailboxSession)); + + SoftAssertions.assertSoftly(Throwing.consumer(softly -> { + softly.assertThat(testee.search(allMailboxesSearchQuery, mailboxSession)) + .isEmpty(); + softly.assertThat(testee.list(mailboxSession)) + .isEmpty(); + })); + } + } + + @Nested + class DeleteTwiceThenCreate { + + @Disabled("JAMES-3056 list() returns two element with inboxPath being duplicated") + @Test + void createMailboxShouldCreateWhenMailboxDaoFailsOnDeleteByPath() throws Exception { + testee.createMailbox(inboxPath, mailboxSession); + + doReturn(Mono.error(new RuntimeException("mock exception"))) + .doCallRealMethod() + .when(mailboxDAO) + .delete(any(CassandraId.class)); + + doQuietly(() -> testee.deleteMailbox(inboxPath, mailboxSession)); + doQuietly(() -> testee.deleteMailbox(inboxPath, mailboxSession)); + MailboxId inboxId = testee.createMailbox(inboxPath, mailboxSession) + .get(); + + SoftAssertions.assertSoftly(Throwing.consumer(softly -> { + softly.assertThat(testee.search(allMailboxesSearchQuery, mailboxSession)) + .hasOnlyOneElementSatisfying(mailboxMetaData -> { + softly.assertThat(mailboxMetaData.getId()).isEqualTo(inboxId); + softly.assertThat(mailboxMetaData.getPath()).isEqualTo(inboxPath); + }); + softly.assertThat(testee.list(mailboxSession)) + .containsExactly(inboxPath); + })); + } + + @Test + void createMailboxShouldCreateWhenMailboxDaoFailsOnDeleteById() throws Exception { + MailboxId inboxId = testee.createMailbox(inboxPath, mailboxSession) + .get(); + + doReturn(Mono.error(new RuntimeException("mock exception"))) + .doCallRealMethod() + .when(mailboxDAO) + .delete(any(CassandraId.class)); + + doQuietly(() -> testee.deleteMailbox(inboxId, mailboxSession)); + doQuietly(() -> testee.deleteMailbox(inboxId, mailboxSession)); + MailboxId inboxNewId = testee.createMailbox(inboxPath, mailboxSession) + .get(); + + SoftAssertions.assertSoftly(Throwing.consumer(softly -> { + softly.assertThat(testee.search(allMailboxesSearchQuery, mailboxSession)) + .hasOnlyOneElementSatisfying(mailboxMetaData -> { + softly.assertThat(mailboxMetaData.getId()).isEqualTo(inboxNewId); + softly.assertThat(mailboxMetaData.getPath()).isEqualTo(inboxPath); + }); + softly.assertThat(testee.list(mailboxSession)) + .containsExactly(inboxPath); + })); + } + + @Test + void createMailboxShouldCreateWhenMailboxPathDaoFailsOnDeleteByPath() throws Exception { + testee.createMailbox(inboxPath, mailboxSession); + + doReturn(Mono.error(new RuntimeException("mock exception"))) + .doCallRealMethod() + .when(mailboxPathV2DAO) + .delete(inboxPath); + + doQuietly(() -> testee.deleteMailbox(inboxPath, mailboxSession)); + doQuietly(() -> testee.deleteMailbox(inboxPath, mailboxSession)); + MailboxId inboxNewId = testee.createMailbox(inboxPath, mailboxSession) + .get(); + + SoftAssertions.assertSoftly(Throwing.consumer(softly -> { + softly.assertThat(testee.search(allMailboxesSearchQuery, mailboxSession)) + .hasOnlyOneElementSatisfying(mailboxMetaData -> { + softly.assertThat(mailboxMetaData.getId()).isEqualTo(inboxNewId); + softly.assertThat(mailboxMetaData.getPath()).isEqualTo(inboxPath); + }); + softly.assertThat(testee.list(mailboxSession)) + .containsExactly(inboxPath); + })); + } + + @Test + void createMailboxShouldCreateWhenMailboxPathDaoFailsOnDeleteById() throws Exception { + MailboxId inboxId = testee.createMailbox(inboxPath, mailboxSession) + .get(); + + doReturn(Mono.error(new RuntimeException("mock exception"))) + .doCallRealMethod() + .when(mailboxPathV2DAO) + .delete(inboxPath); + + doQuietly(() -> testee.deleteMailbox(inboxId, mailboxSession)); + doQuietly(() -> testee.deleteMailbox(inboxId, mailboxSession)); + MailboxId inboxNewId = testee.createMailbox(inboxPath, mailboxSession) + .get(); + + SoftAssertions.assertSoftly(Throwing.consumer(softly -> { + softly.assertThat(testee.search(allMailboxesSearchQuery, mailboxSession)) + .hasOnlyOneElementSatisfying(mailboxMetaData -> { + softly.assertThat(mailboxMetaData.getId()).isEqualTo(inboxNewId); + softly.assertThat(mailboxMetaData.getPath()).isEqualTo(inboxPath); + }); + softly.assertThat(testee.list(mailboxSession)) + .containsExactly(inboxPath); + })); + } + } } private void doQuietly(ThrowingRunnable runnable) { --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
