You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by rc...@apache.org on 2021/01/05 04:55:49 UTC

[james-project] 10/24: JAMES-3407 Disable read repairs on outdated schema verison

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 be946ffc69823fa98d8fcd4d6f7c678c0d15bcf4
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Dec 29 18:01:25 2020 +0700

    JAMES-3407 Disable read repairs on outdated schema verison
    
    Here is a flacky test output:
    
    ```
    [ERROR]   CassandraMailboxMapperTest$ConsistencyTest.createAfterPreviousDeleteOnFailedCreateShouldCreateAMailbox:617 Multiple Failures (1 failure)
    
    Expected size:<1> but was:<2> in:
    <[Mailbox{id=88fcc460-49bf-11eb-84d0-b78591c28a40, namespace=#private, user=Username{localPart=user, domainPart=Optional.empty}, name=name},
        Mailbox{id=9a2095a0-49bf-11eb-84d0-b78591c28a40, namespace=#private, user=Username{localPart=user, domainPart=Optional.empty}, name=INBOX}]>
    at CassandraMailboxMapperTest$ConsistencyTest.lambda$createAfterPreviousDeleteOnFailedCreateShouldCreateAMailbox$34(CassandraMailboxMapperTest$ConsistencyTest.java:628)
    ```
    
    What is stricking is that createAfterPreviousDeleteOnFailedCreateShouldCreateAMailbox
    do not rely on "name" mailbox, which do not appear in the test.
    
    Likely an asynchronous read repair being triggered, that violates
    test encapsulation...
---
 .../cassandra/mail/CassandraMailboxMapperTest.java | 599 +++++++++++----------
 1 file changed, 312 insertions(+), 287 deletions(-)

diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperTest.java
index 7e9fb00..d2f060b 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperTest.java
@@ -69,6 +69,7 @@ import com.github.fge.lambdas.Throwing;
 import com.github.fge.lambdas.runnable.ThrowingRunnable;
 
 import reactor.core.publisher.Mono;
+import reactor.core.scheduler.Schedulers;
 
 class CassandraMailboxMapperTest {
     private static final UidValidity UID_VALIDITY = UidValidity.of(52);
@@ -112,9 +113,14 @@ class CassandraMailboxMapperTest {
         versionDAO.truncateVersion()
             .then(versionDAO.updateVersion(new SchemaVersion(7)))
             .block();
+        setUpTestee(CassandraConfiguration.DEFAULT_CONFIGURATION);
+    }
+
+    private void setUpTestee(CassandraConfiguration cassandraConfiguration) {
+        CassandraCluster cassandra = cassandraCluster.getCassandraCluster();
         CassandraSchemaVersionManager versionManager = new CassandraSchemaVersionManager(versionDAO);
 
-        CassandraACLDAOV1 aclDAOV1 = new CassandraACLDAOV1(cassandra.getConf(), CassandraConfiguration.DEFAULT_CONFIGURATION, CassandraConsistenciesConfiguration.DEFAULT);
+        CassandraACLDAOV1 aclDAOV1 = new CassandraACLDAOV1(cassandra.getConf(), cassandraConfiguration, CassandraConsistenciesConfiguration.DEFAULT);
         CassandraACLDAOV2 aclDAOv2 = new CassandraACLDAOV2(cassandra.getConf());
         JsonEventSerializer jsonEventSerializer = JsonEventSerializer
             .forModules(ACLModule.ACL_UPDATE)
@@ -133,7 +139,7 @@ class CassandraMailboxMapperTest {
             usersRightDAO,
             aclMapper,
             versionManager,
-            CassandraConfiguration.DEFAULT_CONFIGURATION);
+            cassandraConfiguration);
     }
 
     @Nested
@@ -273,6 +279,14 @@ class CassandraMailboxMapperTest {
 
         @Nested
         class ReadRepairs {
+            @BeforeEach
+            void setVersion() {
+                // Read repairs should not be performed with an outdated data representation
+                versionDAO.truncateVersion()
+                    .then(versionDAO.updateVersion(new SchemaVersion(8)))
+                    .block();
+            }
+
             @Test
             void findMailboxByIdShouldEventuallyFixInconsistencyWhenMailboxIsNotInPath() {
                 mailboxDAO.save(MAILBOX)
@@ -770,335 +784,346 @@ class CassandraMailboxMapperTest {
         return new MailboxPath(fromMailboxPath, StringUtils.repeat("b", 65537));
     }
 
-    @Test
-    void deleteShouldDeleteMailboxAndMailboxPathFromV1Table() {
-        mailboxDAO.save(MAILBOX)
-            .block();
-        mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
-            .block();
-
-        testee.delete(MAILBOX).block();
-
-        assertThat(testee.findMailboxByPath(MAILBOX_PATH).blockOptional())
-            .isEmpty();
-    }
-
-    @Test
-    void deleteShouldDeleteMailboxAndMailboxPathFromV2Table() {
-        mailboxDAO.save(MAILBOX)
-            .block();
-        mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
-            .block();
-
-        testee.delete(MAILBOX).block();
-
-        assertThat(testee.findMailboxByPath(MAILBOX_PATH).blockOptional())
-            .isEmpty();
-    }
-
-    @Test
-    void deleteShouldDeleteMailboxAndMailboxPathFromV3Table() {
-        mailboxDAO.save(MAILBOX)
-            .block();
-        mailboxPathV3DAO.save(MAILBOX)
-            .block();
-
-        testee.delete(MAILBOX).block();
-
-        assertThat(testee.findMailboxByPath(MAILBOX_PATH).blockOptional())
-            .isEmpty();
-    }
-
-    @Test
-    void deleteShouldDeleteMailboxAndMailboxPathFromAllTables() {
-        mailboxDAO.save(MAILBOX)
-            .block();
-        mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
-            .block();
-        mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
-            .block();
-        mailboxPathV3DAO.save(MAILBOX)
-            .block();
-
-        testee.delete(MAILBOX).block();
-
-        assertThat(testee.findMailboxByPath(MAILBOX_PATH).blockOptional())
-            .isEmpty();
-    }
-
-    @Test
-    void findMailboxByPathShouldReturnMailboxWhenExistsInV1Table() {
-        mailboxDAO.save(MAILBOX)
-            .block();
-        mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
-            .block();
-
-        Mailbox mailbox = testee.findMailboxByPath(MAILBOX_PATH).block();
+    @Nested
+    class ReadFallbackToPreviousTables {
+        @BeforeEach
+        void setUp() {
+            // Read repairs are not supported accross schema versions...
+            setUpTestee(CassandraConfiguration.builder()
+                .mailboxReadRepair(0f)
+                .build());
+        }
 
-        assertThat(mailbox.generateAssociatedPath()).isEqualTo(MAILBOX_PATH);
-    }
+        @Test
+        void deleteShouldDeleteMailboxAndMailboxPathFromV1Table() {
+            mailboxDAO.save(MAILBOX)
+                .block();
+            mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
+                .block();
 
-    @Test
-    void findMailboxByPathShouldReturnMailboxWhenExistsInV2Table() {
-        mailboxDAO.save(MAILBOX)
-            .block();
-        mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
-            .block();
+            testee.delete(MAILBOX).block();
 
-        Mailbox mailbox = testee.findMailboxByPath(MAILBOX_PATH).block();
+            assertThat(testee.findMailboxByPath(MAILBOX_PATH).blockOptional())
+                .isEmpty();
+        }
 
-        assertThat(mailbox.generateAssociatedPath()).isEqualTo(MAILBOX_PATH);
-    }
+        @Test
+        void deleteShouldDeleteMailboxAndMailboxPathFromV2Table() {
+            mailboxDAO.save(MAILBOX)
+                .block();
+            mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
+                .block();
 
-    @Test
-    void findMailboxByPathShouldReturnMailboxWhenExistsInV3Table() {
-        mailboxDAO.save(MAILBOX)
-            .block();
-        mailboxPathV3DAO.save(MAILBOX)
-            .block();
+            testee.delete(MAILBOX).block();
 
-        Mailbox mailbox = testee.findMailboxByPath(MAILBOX_PATH).block();
+            assertThat(testee.findMailboxByPath(MAILBOX_PATH).blockOptional())
+                .isEmpty();
+        }
 
-        assertThat(mailbox.generateAssociatedPath()).isEqualTo(MAILBOX_PATH);
-    }
+        @Test
+        void deleteShouldDeleteMailboxAndMailboxPathFromV3Table() {
+            mailboxDAO.save(MAILBOX)
+                .block();
+            mailboxPathV3DAO.save(MAILBOX)
+                .block();
 
-    @Test
-    void findMailboxByPathShouldReturnMailboxWhenExistsInAllTables() {
-        mailboxDAO.save(MAILBOX)
-            .block();
-        mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
-            .block();
-        mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
-            .block();
-        mailboxPathV3DAO.save(MAILBOX)
-            .block();
+            testee.delete(MAILBOX).block();
 
-        Mailbox mailbox = testee.findMailboxByPath(MAILBOX_PATH).block();
+            assertThat(testee.findMailboxByPath(MAILBOX_PATH).blockOptional())
+                .isEmpty();
+        }
 
-        assertThat(mailbox.generateAssociatedPath()).isEqualTo(MAILBOX_PATH);
-    }
+        @Test
+        void deleteShouldDeleteMailboxAndMailboxPathFromAllTables() {
+            mailboxDAO.save(MAILBOX)
+                .block();
+            mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
+                .block();
+            mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
+                .block();
+            mailboxPathV3DAO.save(MAILBOX)
+                .block();
+
+            testee.delete(MAILBOX).block();
+
+            assertThat(testee.findMailboxByPath(MAILBOX_PATH).blockOptional())
+                .isEmpty();
+        }
 
-    @Test
-    void deleteShouldRemoveMailboxWhenInAllTables() {
-        mailboxDAO.save(MAILBOX)
-            .block();
-        mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
-            .block();
-        mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
-            .block();
-        mailboxPathV3DAO.save(MAILBOX)
-            .block();
+        @Test
+        void findMailboxByPathShouldReturnMailboxWhenExistsInV1Table() {
+            mailboxDAO.save(MAILBOX)
+                .block();
+            mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
+                .block();
 
-        testee.delete(MAILBOX).block();
+            Mailbox mailbox = testee.findMailboxByPath(MAILBOX_PATH).block();
 
-        assertThat(testee.findMailboxByPath(MAILBOX_PATH).blockOptional())
-            .isEmpty();
-    }
+            assertThat(mailbox.generateAssociatedPath()).isEqualTo(MAILBOX_PATH);
+        }
 
-    @Test
-    void deleteShouldRemoveMailboxWhenInV1Tables() {
-        mailboxDAO.save(MAILBOX)
-            .block();
-        mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
-            .block();
+        @Test
+        void findMailboxByPathShouldReturnMailboxWhenExistsInV2Table() {
+            mailboxDAO.save(MAILBOX)
+                .block();
+            mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
+                .block();
 
-        testee.delete(MAILBOX).block();
+            Mailbox mailbox = testee.findMailboxByPath(MAILBOX_PATH).block();
 
-        assertThat(testee.findMailboxByPath(MAILBOX_PATH).blockOptional())
-            .isEmpty();
-    }
+            assertThat(mailbox.generateAssociatedPath()).isEqualTo(MAILBOX_PATH);
+        }
 
-    @Test
-    void deleteShouldRemoveMailboxWhenInV2Table() {
-        mailboxDAO.save(MAILBOX)
-            .block();
-        mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
-            .block();
+        @Test
+        void findMailboxByPathShouldReturnMailboxWhenExistsInV3Table() {
+            mailboxDAO.save(MAILBOX)
+                .block();
+            mailboxPathV3DAO.save(MAILBOX)
+                .block();
 
-        testee.delete(MAILBOX).block();
+            Mailbox mailbox = testee.findMailboxByPath(MAILBOX_PATH).block();
 
-        assertThat(testee.findMailboxByPath(MAILBOX_PATH).blockOptional())
-            .isEmpty();
-    }
+            assertThat(mailbox.generateAssociatedPath()).isEqualTo(MAILBOX_PATH);
+        }
 
-    @Test
-    void findMailboxByPathShouldThrowWhenDoesntExistInBothTables() {
-        mailboxDAO.save(MAILBOX)
-            .block();
+        @Test
+        void findMailboxByPathShouldReturnMailboxWhenExistsInAllTables() {
+            mailboxDAO.save(MAILBOX)
+                .block();
+            mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
+                .block();
+            mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
+                .block();
+            mailboxPathV3DAO.save(MAILBOX)
+                .block();
+
+            Mailbox mailbox = testee.findMailboxByPath(MAILBOX_PATH).block();
+
+            assertThat(mailbox.generateAssociatedPath()).isEqualTo(MAILBOX_PATH);
+        }
 
-        assertThat(testee.findMailboxByPath(MAILBOX_PATH).blockOptional())
-            .isEmpty();
-    }
+        @Test
+        void deleteShouldRemoveMailboxWhenInAllTables() {
+            mailboxDAO.save(MAILBOX)
+                .block();
+            mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
+                .block();
+            mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
+                .block();
+            mailboxPathV3DAO.save(MAILBOX)
+                .block();
+
+            testee.delete(MAILBOX).block();
+
+            assertThat(testee.findMailboxByPath(MAILBOX_PATH).blockOptional())
+                .isEmpty();
+        }
 
-    @Test
-    void findMailboxWithPathLikeShouldReturnMailboxesWhenExistsInV1Table() {
-        mailboxDAO.save(MAILBOX)
-            .block();
-        mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
-            .block();
+        @Test
+        void deleteShouldRemoveMailboxWhenInV1Tables() {
+            mailboxDAO.save(MAILBOX)
+                .block();
+            mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
+                .block();
 
-        List<Mailbox> mailboxes = testee.findMailboxWithPathLike(MailboxQuery.builder()
-            .privateNamespace()
-            .username(USER)
-            .expression(Wildcard.INSTANCE)
-            .build()
-            .asUserBound())
-            .collectList().block();
+            testee.delete(MAILBOX).block();
 
-        assertThat(mailboxes).containsOnly(MAILBOX);
-    }
+            assertThat(testee.findMailboxByPath(MAILBOX_PATH).blockOptional())
+                .isEmpty();
+        }
 
-    @Test
-    void findMailboxWithPathLikeShouldReturnMailboxesWhenExistsInBothTables() {
-        mailboxDAO.save(MAILBOX)
-            .block();
-        mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
-            .block();
-        mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
-            .block();
+        @Test
+        void deleteShouldRemoveMailboxWhenInV2Table() {
+            mailboxDAO.save(MAILBOX)
+                .block();
+            mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
+                .block();
 
-        List<Mailbox> mailboxes = testee.findMailboxWithPathLike(MailboxQuery.builder()
-            .privateNamespace()
-            .username(USER)
-            .expression(Wildcard.INSTANCE)
-            .build()
-            .asUserBound())
-            .collectList().block();
+            testee.delete(MAILBOX).block();
 
-        assertThat(mailboxes).containsOnly(MAILBOX);
-    }
+            assertThat(testee.findMailboxByPath(MAILBOX_PATH).blockOptional())
+                .isEmpty();
+        }
 
-    @Test
-    void findMailboxWithPathLikeShouldReturnMailboxesWhenExistsInV2Table() {
-        mailboxDAO.save(MAILBOX)
-            .block();
-        mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
-            .block();
+        @Test
+        void findMailboxByPathShouldThrowWhenDoesntExistInBothTables() {
+            mailboxDAO.save(MAILBOX)
+                .block();
 
-        List<Mailbox> mailboxes = testee.findMailboxWithPathLike(MailboxQuery.builder()
-            .privateNamespace()
-            .username(USER)
-            .expression(Wildcard.INSTANCE)
-            .build()
-            .asUserBound())
-            .collectList().block();
+            assertThat(testee.findMailboxByPath(MAILBOX_PATH).blockOptional())
+                .isEmpty();
+        }
 
-        assertThat(mailboxes).containsOnly(MAILBOX);
-    }
+        @Test
+        void findMailboxWithPathLikeShouldReturnMailboxesWhenExistsInV1Table() {
+            mailboxDAO.save(MAILBOX)
+                .block();
+            mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
+                .block();
 
-    @Test
-    void findMailboxWithPathLikeShouldReturnMailboxesWhenExistsInV3Table() {
-        mailboxDAO.save(MAILBOX)
-            .block();
-        mailboxPathV3DAO.save(MAILBOX)
-            .block();
+            List<Mailbox> mailboxes = testee.findMailboxWithPathLike(MailboxQuery.builder()
+                .privateNamespace()
+                .username(USER)
+                .expression(Wildcard.INSTANCE)
+                .build()
+                .asUserBound())
+                .collectList().block();
 
-        List<Mailbox> mailboxes = testee.findMailboxWithPathLike(MailboxQuery.builder()
-            .privateNamespace()
-            .username(USER)
-            .expression(Wildcard.INSTANCE)
-            .build()
-            .asUserBound())
-            .collectList()
-            .block();
+            assertThat(mailboxes).containsOnly(MAILBOX);
+        }
 
-        assertThat(mailboxes).containsOnly(MAILBOX);
-    }
+        @Test
+        void findMailboxWithPathLikeShouldReturnMailboxesWhenExistsInBothTables() {
+            mailboxDAO.save(MAILBOX)
+                .block();
+            mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
+                .block();
+            mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
+                .block();
+
+            List<Mailbox> mailboxes = testee.findMailboxWithPathLike(MailboxQuery.builder()
+                .privateNamespace()
+                .username(USER)
+                .expression(Wildcard.INSTANCE)
+                .build()
+                .asUserBound())
+                .collectList().block();
 
-    @Test
-    void hasChildrenShouldReturnChildWhenExistsInV1Table() {
-        mailboxDAO.save(MAILBOX)
-            .block();
-        mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
-            .block();
-        CassandraId childMailboxId = CassandraId.timeBased();
-        MailboxPath childMailboxPath = MailboxPath.forUser(USER, "name.child");
-        Mailbox childMailbox = new Mailbox(childMailboxPath, UID_VALIDITY, childMailboxId);
-        mailboxDAO.save(childMailbox)
-            .block();
-        mailboxPathDAO.save(childMailboxPath, childMailboxId)
-            .block();
-    
-        boolean hasChildren = testee.hasChildren(MAILBOX, '.').block();
+            assertThat(mailboxes).containsOnly(MAILBOX);
+        }
 
-        assertThat(hasChildren).isTrue();
-    }
+        @Test
+        void findMailboxWithPathLikeShouldReturnMailboxesWhenExistsInV2Table() {
+            mailboxDAO.save(MAILBOX)
+                .block();
+            mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
+                .block();
 
-    @Test
-    void hasChildrenShouldReturnChildWhenExistsInBothTables() {
-        mailboxDAO.save(MAILBOX)
-            .block();
-        mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
-            .block();
-        mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
-            .block();
-        CassandraId childMailboxId = CassandraId.timeBased();
-        MailboxPath childMailboxPath = MailboxPath.forUser(USER, "name.child");
-        Mailbox childMailbox = new Mailbox(childMailboxPath, UID_VALIDITY, childMailboxId);
-        mailboxDAO.save(childMailbox)
-            .block();
-        mailboxPathDAO.save(childMailboxPath, childMailboxId)
-            .block();
+            List<Mailbox> mailboxes = testee.findMailboxWithPathLike(MailboxQuery.builder()
+                .privateNamespace()
+                .username(USER)
+                .expression(Wildcard.INSTANCE)
+                .build()
+                .asUserBound())
+                .collectList().block();
 
-        boolean hasChildren = testee.hasChildren(MAILBOX, '.').block();
+            assertThat(mailboxes).containsOnly(MAILBOX);
+        }
 
-        assertThat(hasChildren).isTrue();
-    }
+        @Test
+        void findMailboxWithPathLikeShouldReturnMailboxesWhenExistsInV3Table() {
+            mailboxDAO.save(MAILBOX)
+                .block();
+            mailboxPathV3DAO.save(MAILBOX)
+                .block();
 
-    @Test
-    void hasChildrenShouldReturnChildWhenExistsInV2Table() {
-        mailboxDAO.save(MAILBOX)
-            .block();
-        mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
-            .block();
-        CassandraId childMailboxId = CassandraId.timeBased();
-        MailboxPath childMailboxPath = MailboxPath.forUser(USER, "name.child");
-        Mailbox childMailbox = new Mailbox(childMailboxPath, UID_VALIDITY, childMailboxId);
-        mailboxDAO.save(childMailbox)
-            .block();
-        mailboxPathV2DAO.save(childMailboxPath, childMailboxId)
-            .block();
-    
-        boolean hasChildren = testee.hasChildren(MAILBOX, '.').block();
-    
-        assertThat(hasChildren).isTrue();
-    }
+            List<Mailbox> mailboxes = testee.findMailboxWithPathLike(MailboxQuery.builder()
+                .privateNamespace()
+                .username(USER)
+                .expression(Wildcard.INSTANCE)
+                .build()
+                .asUserBound())
+                .collectList()
+                .block();
 
-    @Test
-    void hasChildrenShouldReturnChildWhenExistsInV3Table() {
-        mailboxDAO.save(MAILBOX)
-            .block();
-        mailboxPathV3DAO.save(MAILBOX)
-            .block();
-        CassandraId childMailboxId = CassandraId.timeBased();
-        MailboxPath childMailboxPath = MailboxPath.forUser(USER, "name.child");
-        Mailbox childMailbox = new Mailbox(childMailboxPath, UID_VALIDITY, childMailboxId);
-        mailboxDAO.save(childMailbox)
-            .block();
-        mailboxPathV3DAO.save(childMailbox)
-            .block();
+            assertThat(mailboxes).containsOnly(MAILBOX);
+        }
 
-        boolean hasChildren = testee.hasChildren(MAILBOX, '.').block();
+        @Test
+        void hasChildrenShouldReturnChildWhenExistsInV1Table() {
+            mailboxDAO.save(MAILBOX)
+                .block();
+            mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
+                .block();
+            CassandraId childMailboxId = CassandraId.timeBased();
+            MailboxPath childMailboxPath = MailboxPath.forUser(USER, "name.child");
+            Mailbox childMailbox = new Mailbox(childMailboxPath, UID_VALIDITY, childMailboxId);
+            mailboxDAO.save(childMailbox)
+                .block();
+            mailboxPathDAO.save(childMailboxPath, childMailboxId)
+                .block();
+
+            boolean hasChildren = testee.hasChildren(MAILBOX, '.').block();
+
+            assertThat(hasChildren).isTrue();
+        }
 
-        assertThat(hasChildren).isTrue();
-    }
+        @Test
+        void hasChildrenShouldReturnChildWhenExistsInBothTables() {
+            mailboxDAO.save(MAILBOX)
+                .block();
+            mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
+                .block();
+            mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
+                .block();
+            CassandraId childMailboxId = CassandraId.timeBased();
+            MailboxPath childMailboxPath = MailboxPath.forUser(USER, "name.child");
+            Mailbox childMailbox = new Mailbox(childMailboxPath, UID_VALIDITY, childMailboxId);
+            mailboxDAO.save(childMailbox)
+                .block();
+            mailboxPathDAO.save(childMailboxPath, childMailboxId)
+                .block();
+
+            boolean hasChildren = testee.hasChildren(MAILBOX, '.').block();
+
+            assertThat(hasChildren).isTrue();
+        }
 
-    @Test
-    void findMailboxWithPathLikeShouldRemoveDuplicatesAndKeepV3() {
-        mailboxDAO.save(MAILBOX).block();
-        mailboxPathV3DAO.save(MAILBOX).block();
+        @Test
+        void hasChildrenShouldReturnChildWhenExistsInV2Table() {
+            mailboxDAO.save(MAILBOX)
+                .block();
+            mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
+                .block();
+            CassandraId childMailboxId = CassandraId.timeBased();
+            MailboxPath childMailboxPath = MailboxPath.forUser(USER, "name.child");
+            Mailbox childMailbox = new Mailbox(childMailboxPath, UID_VALIDITY, childMailboxId);
+            mailboxDAO.save(childMailbox)
+                .block();
+            mailboxPathV2DAO.save(childMailboxPath, childMailboxId)
+                .block();
+
+            boolean hasChildren = testee.hasChildren(MAILBOX, '.').block();
+
+            assertThat(hasChildren).isTrue();
+        }
 
-        mailboxDAO.save(MAILBOX_BIS).block();
-        mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID_2).block();
+        @Test
+        void hasChildrenShouldReturnChildWhenExistsInV3Table() {
+            mailboxDAO.save(MAILBOX)
+                .block();
+            mailboxPathV3DAO.save(MAILBOX)
+                .block();
+            CassandraId childMailboxId = CassandraId.timeBased();
+            MailboxPath childMailboxPath = MailboxPath.forUser(USER, "name.child");
+            Mailbox childMailbox = new Mailbox(childMailboxPath, UID_VALIDITY, childMailboxId);
+            mailboxDAO.save(childMailbox)
+                .block();
+            mailboxPathV3DAO.save(childMailbox)
+                .block();
+
+            boolean hasChildren = testee.hasChildren(MAILBOX, '.').block();
+
+            assertThat(hasChildren).isTrue();
+        }
 
-        assertThat(testee.findMailboxWithPathLike(
-            MailboxQuery.builder()
-                .privateNamespace()
-                .username(USER)
-                .expression(Wildcard.INSTANCE)
-                .build()
-                .asUserBound())
-            .collectList().block())
-            .containsOnly(MAILBOX);
+        @Test
+        void findMailboxWithPathLikeShouldRemoveDuplicatesAndKeepV3() {
+            mailboxDAO.save(MAILBOX).block();
+            mailboxPathV3DAO.save(MAILBOX).block();
+
+            mailboxDAO.save(MAILBOX_BIS).block();
+            mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID_2).block();
+
+            assertThat(testee.findMailboxWithPathLike(
+                MailboxQuery.builder()
+                    .privateNamespace()
+                    .username(USER)
+                    .expression(Wildcard.INSTANCE)
+                    .build()
+                    .asUserBound())
+                .collectList().block())
+                .containsOnly(MAILBOX);
+        }
     }
 }


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