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


The following commit(s) were added to refs/heads/master by this push:
     new 793491ce57 [FIX] Strenghten DeletedMessageVault Integration Tests to 
solve flaky test issues
793491ce57 is described below

commit 793491ce57796cebf22e3273f62907e364af2820
Author: Rene Cordier <[email protected]>
AuthorDate: Wed Apr 1 12:19:36 2026 +0700

    [FIX] Strenghten DeletedMessageVault Integration Tests to solve flaky test 
issues
---
 ...RabbitMQDeletedMessageVaultIntegrationTest.java |   4 +-
 .../MemoryDeletedMessageVaultIntegrationTest.java  |   4 +-
 ...PostgresDeletedMessageVaultIntegrationTest.java |   4 +-
 ...PostgresDeletedMessageVaultIntegrationTest.java |   4 +-
 .../probe/DeletedMessageVaultProbe.java            |  47 ++++++++
 .../probe/DeletedMessageVaultProbeModule.java      |  34 ++++++
 .../vault/DeletedMessageVaultIntegrationTest.java  | 123 ++++++++++++++++-----
 7 files changed, 191 insertions(+), 29 deletions(-)

diff --git 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQDeletedMessageVaultIntegrationTest.java
 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQDeletedMessageVaultIntegrationTest.java
index 78b8216247..6a0d42b78d 100644
--- 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQDeletedMessageVaultIntegrationTest.java
+++ 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQDeletedMessageVaultIntegrationTest.java
@@ -33,6 +33,7 @@ import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
 import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.vault.VaultConfiguration;
+import 
org.apache.james.webadmin.integration.probe.DeletedMessageVaultProbeModule;
 import 
org.apache.james.webadmin.integration.vault.DeletedMessageVaultIntegrationTest;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Tag;
@@ -62,7 +63,8 @@ class RabbitMQDeletedMessageVaultIntegrationTest extends 
DeletedMessageVaultInte
         .extension(new RabbitMQExtension())
         .extension(new ClockExtension())
         .server(configuration -> 
CassandraRabbitMQJamesServerMain.createServer(configuration)
-            .overrideWith(new TestJMAPServerModule()))
+            .overrideWith(new TestJMAPServerModule())
+            .overrideWith(new DeletedMessageVaultProbeModule()))
         .build();
 
     @Override
diff --git 
a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/vault/MemoryDeletedMessageVaultIntegrationTest.java
 
b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/vault/MemoryDeletedMessageVaultIntegrationTest.java
index 701a62db7e..e75dd14e1b 100644
--- 
a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/vault/MemoryDeletedMessageVaultIntegrationTest.java
+++ 
b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/vault/MemoryDeletedMessageVaultIntegrationTest.java
@@ -27,6 +27,7 @@ import org.apache.james.MemoryJamesConfiguration;
 import org.apache.james.MemoryJamesServerMain;
 import org.apache.james.modules.TestJMAPServerModule;
 import 
org.apache.james.modules.vault.TestDeleteMessageVaultPreDeletionHookModule;
+import 
org.apache.james.webadmin.integration.probe.DeletedMessageVaultProbeModule;
 import 
org.apache.james.webadmin.integration.vault.DeletedMessageVaultIntegrationTest;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
@@ -42,7 +43,8 @@ class MemoryDeletedMessageVaultIntegrationTest extends 
DeletedMessageVaultIntegr
         .extension(new ClockExtension())
         .server(configuration -> 
MemoryJamesServerMain.createServer(configuration)
             .overrideWith(new TestJMAPServerModule())
-            .overrideWith(new TestDeleteMessageVaultPreDeletionHookModule()))
+            .overrideWith(new TestDeleteMessageVaultPreDeletionHookModule())
+            .overrideWith(new DeletedMessageVaultProbeModule()))
         .build();
 
     @Override
diff --git 
a/server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/vault/PostgresDeletedMessageVaultIntegrationTest.java
 
b/server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/vault/PostgresDeletedMessageVaultIntegrationTest.java
index 4ea638622b..fed8d70acb 100644
--- 
a/server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/vault/PostgresDeletedMessageVaultIntegrationTest.java
+++ 
b/server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/vault/PostgresDeletedMessageVaultIntegrationTest.java
@@ -30,6 +30,7 @@ import org.apache.james.backends.postgres.PostgresExtension;
 import org.apache.james.modules.TestJMAPServerModule;
 import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.vault.VaultConfiguration;
+import 
org.apache.james.webadmin.integration.probe.DeletedMessageVaultProbeModule;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 class PostgresDeletedMessageVaultIntegrationTest extends 
DeletedMessageVaultIntegrationTest {
@@ -49,7 +50,8 @@ class PostgresDeletedMessageVaultIntegrationTest extends 
DeletedMessageVaultInte
                 .noCryptoConfig())
             .build())
         .server(configuration -> 
PostgresJamesServerMain.createServer(configuration)
-            .overrideWith(new TestJMAPServerModule()))
+            .overrideWith(new TestJMAPServerModule())
+            .overrideWith(new DeletedMessageVaultProbeModule()))
         .extension(PostgresExtension.empty())
         .extension(new ClockExtension())
         .build();
diff --git 
a/server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/vault/RabbitMQPostgresDeletedMessageVaultIntegrationTest.java
 
b/server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/vault/RabbitMQPostgresDeletedMessageVaultIntegrationTest.java
index 7bbe7dfebb..11cd50c202 100644
--- 
a/server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/vault/RabbitMQPostgresDeletedMessageVaultIntegrationTest.java
+++ 
b/server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/vault/RabbitMQPostgresDeletedMessageVaultIntegrationTest.java
@@ -31,6 +31,7 @@ import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
 import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.vault.VaultConfiguration;
+import 
org.apache.james.webadmin.integration.probe.DeletedMessageVaultProbeModule;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 class RabbitMQPostgresDeletedMessageVaultIntegrationTest extends 
DeletedMessageVaultIntegrationTest {
@@ -53,7 +54,8 @@ class RabbitMQPostgresDeletedMessageVaultIntegrationTest 
extends DeletedMessageV
                 .noCryptoConfig())
             .build())
         .server(configuration -> 
PostgresJamesServerMain.createServer(configuration)
-            .overrideWith(new TestJMAPServerModule()))
+            .overrideWith(new TestJMAPServerModule())
+            .overrideWith(new DeletedMessageVaultProbeModule()))
         .extension(PostgresExtension.empty())
         .extension(new ClockExtension())
         .extension(rabbitMQExtension)
diff --git 
a/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/probe/DeletedMessageVaultProbe.java
 
b/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/probe/DeletedMessageVaultProbe.java
new file mode 100644
index 0000000000..2bf95cd58d
--- /dev/null
+++ 
b/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/probe/DeletedMessageVaultProbe.java
@@ -0,0 +1,47 @@
+/****************************************************************
+ * 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.webadmin.integration.probe;
+
+import java.util.List;
+
+import jakarta.inject.Inject;
+
+import org.apache.james.core.Username;
+import org.apache.james.utils.GuiceProbe;
+import org.apache.james.vault.DeletedMessage;
+import org.apache.james.vault.DeletedMessageVault;
+import org.apache.james.vault.search.Query;
+
+import reactor.core.publisher.Flux;
+
+public class DeletedMessageVaultProbe implements GuiceProbe {
+    private final DeletedMessageVault vault;
+
+    @Inject
+    public DeletedMessageVaultProbe(DeletedMessageVault vault) {
+        this.vault = vault;
+    }
+
+    public List<DeletedMessage> search(Username username, Query query) {
+        return Flux.from(vault.search(username, query))
+            .collectList()
+            .block();
+    }
+}
diff --git 
a/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/probe/DeletedMessageVaultProbeModule.java
 
b/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/probe/DeletedMessageVaultProbeModule.java
new file mode 100644
index 0000000000..5afe748fa0
--- /dev/null
+++ 
b/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/probe/DeletedMessageVaultProbeModule.java
@@ -0,0 +1,34 @@
+/****************************************************************
+ * 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.webadmin.integration.probe;
+
+import org.apache.james.utils.GuiceProbe;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.multibindings.Multibinder;
+
+public class DeletedMessageVaultProbeModule extends AbstractModule {
+    @Override
+    public void configure() {
+        Multibinder.newSetBinder(binder(), GuiceProbe.class)
+            .addBinding()
+            .to(DeletedMessageVaultProbe.class);
+    }
+}
diff --git 
a/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/vault/DeletedMessageVaultIntegrationTest.java
 
b/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/vault/DeletedMessageVaultIntegrationTest.java
index 23dd752243..373e566524 100644
--- 
a/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/vault/DeletedMessageVaultIntegrationTest.java
+++ 
b/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/vault/DeletedMessageVaultIntegrationTest.java
@@ -74,7 +74,10 @@ import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.TestIMAPClient;
 import org.apache.james.utils.UpdatableTickingClock;
 import org.apache.james.utils.WebAdminGuiceProbe;
+import org.apache.james.vault.DeletedMessage;
+import org.apache.james.vault.search.Query;
 import org.apache.james.webadmin.WebAdminUtils;
+import org.apache.james.webadmin.integration.probe.DeletedMessageVaultProbe;
 import org.awaitility.Awaitility;
 import org.awaitility.core.ConditionFactory;
 import org.hamcrest.Matchers;
@@ -197,13 +200,15 @@ public abstract class DeletedMessageVaultIntegrationTest {
 
     @Tag(BasicFeature.TAG)
     @Test
-    void vaultEndpointShouldRestoreJmapDeletedEmail() {
+    void vaultEndpointShouldRestoreJmapDeletedEmail(GuiceJamesServer 
jmapServer) {
         bartSendMessageToHomer();
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
 
         homerDeletesMessages(listMessageIdsForAccount(homerCredential));
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(1));
+
         restoreAllMessagesOfHomer();
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
 
@@ -226,6 +231,8 @@ public abstract class DeletedMessageVaultIntegrationTest {
 
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(1));
+
         restoreAllMessagesOfHomer();
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
 
@@ -250,7 +257,8 @@ public abstract class DeletedMessageVaultIntegrationTest {
         testIMAPClient.delete(MAILBOX_NAME);
 
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
-        Thread.sleep(1000); // Wait for messages to be moved to the vault
+
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(1));
 
         restoreAllMessagesOfHomer();
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
@@ -261,13 +269,15 @@ public abstract class DeletedMessageVaultIntegrationTest {
     }
 
     @Test
-    void restoreShouldCreateRestoreMessagesMailbox() {
+    void restoreShouldCreateRestoreMessagesMailbox(GuiceJamesServer 
jmapServer) {
         bartSendMessageToHomer();
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
 
         homerDeletesMessages(listMessageIdsForAccount(homerCredential));
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(1));
+
         restoreAllMessagesOfHomer();
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
 
@@ -275,7 +285,7 @@ public abstract class DeletedMessageVaultIntegrationTest {
     }
 
     @Test
-    void postShouldRestoreMatchingMessages() {
+    void postShouldRestoreMatchingMessages(GuiceJamesServer jmapServer) {
         bartSendMessageToHomerWithSubject("aaaaa");
         bartSendMessageToHomerWithSubject("bbbbb");
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(2));
@@ -284,6 +294,8 @@ public abstract class DeletedMessageVaultIntegrationTest {
 
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(2));
+
         String query = "{" +
             "  \"combinator\": \"and\"," +
             "  \"criteria\": [" +
@@ -304,7 +316,7 @@ public abstract class DeletedMessageVaultIntegrationTest {
     }
 
     @Test
-    void postShouldNotRestoreWhenNoMatchingMessages() throws Exception {
+    void postShouldNotRestoreWhenNoMatchingMessages(GuiceJamesServer 
jmapServer) throws Exception {
         bartSendMessageToHomerWithSubject("aaaaa");
         bartSendMessageToHomerWithSubject("bbbbb");
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(2));
@@ -313,6 +325,8 @@ public abstract class DeletedMessageVaultIntegrationTest {
 
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(2));
+
         String query = "{" +
             "  \"combinator\": \"and\"," +
             "  \"criteria\": [" +
@@ -334,7 +348,7 @@ public abstract class DeletedMessageVaultIntegrationTest {
     }
 
     @Test
-    void postShouldRestoreMatchingMessagesWhenQueryLimit() {
+    void postShouldRestoreMatchingMessagesWhenQueryLimit(GuiceJamesServer 
jmapServer) {
         bartSendMessageToHomerWithSubject("aaaa");
         bartSendMessageToHomerWithSubject("aaaa");
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(2));
@@ -343,6 +357,8 @@ public abstract class DeletedMessageVaultIntegrationTest {
 
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(2));
+
         String query = "{" +
             "  \"combinator\": \"and\"," +
             "  \"limit\": 1," +
@@ -397,16 +413,20 @@ public abstract class DeletedMessageVaultIntegrationTest {
     }
 
     @Test
-    void restoreShouldNotImpactOtherUsers() {
+    void restoreShouldNotImpactOtherUsers(GuiceJamesServer jmapServer) {
         bartSendMessageToHomer();
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
 
         homerDeletesMessages(listMessageIdsForAccount(homerCredential));
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(1));
+
         bartDeletesMessages(listMessageIdsForAccount(bartCredential));
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(bartCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfUserFromVault(jmapServer, 
Username.of(BART))).hasSize(1));
+
         restoreAllMessagesOfHomer();
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
 
@@ -415,13 +435,15 @@ public abstract class DeletedMessageVaultIntegrationTest {
     }
 
     @Test
-    void restoredMessagesShouldNotBeRemovedFromTheVault() {
+    void restoredMessagesShouldNotBeRemovedFromTheVault(GuiceJamesServer 
jmapServer) {
         bartSendMessageToHomer();
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
 
         homerDeletesMessages(listMessageIdsForAccount(homerCredential));
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(1));
+
         restoreAllMessagesOfHomer();
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
 
@@ -443,7 +465,7 @@ public abstract class DeletedMessageVaultIntegrationTest {
     }
 
     @Test
-    void vaultEndpointShouldNotRestoreMessageForSharee() {
+    void vaultEndpointShouldNotRestoreMessageForSharee(GuiceJamesServer 
jmapServer) {
         // GIVEN a message in Homer's mailbox shared with Bart
         bartSendMessageToHomer();
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
@@ -458,6 +480,8 @@ public abstract class DeletedMessageVaultIntegrationTest {
         bartDeletesMessages(ImmutableList.of(messageId));
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(1));
+
         // THEN Bart should not restore anything from his own DMV
         restoreMessagesFor(BART);
         awaitSearchUpToDate();
@@ -468,7 +492,7 @@ public abstract class DeletedMessageVaultIntegrationTest {
     }
 
     @Test
-    void vaultEndpointShouldRestoreMessageForSharer() {
+    void vaultEndpointShouldRestoreMessageForSharer(GuiceJamesServer 
jmapServer) {
         // GIVEN a message in Homer's mailbox shared with Bart
         bartSendMessageToHomer();
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
@@ -482,6 +506,8 @@ public abstract class DeletedMessageVaultIntegrationTest {
         bartDeletesMessages(ImmutableList.of(messageId));
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(1));
+
         // THEN Homer should be able to restore it from his DMV
         restoreAllMessagesOfHomer();
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
@@ -493,7 +519,7 @@ public abstract class DeletedMessageVaultIntegrationTest {
     }
 
     @Test
-    void 
vaultEndpointShouldRestoreMessageForOwnerWhenShareeCopiedSharedMessageToOwnMailbox()
 {
+    void 
vaultEndpointShouldRestoreMessageForOwnerWhenShareeCopiedSharedMessageToOwnMailbox(GuiceJamesServer
 jmapServer) {
         // GIVEN a message in Homer's mailbox shared with Bart
         bartSendMessageToHomer();
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
@@ -508,6 +534,8 @@ public abstract class DeletedMessageVaultIntegrationTest {
         homerDeletesMessages(ImmutableList.of(messageId));
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(1));
+
         // THEN Homer should still get a DMV entry for the message he lost 
access to
         restoreAllMessagesOfHomer();
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
@@ -557,6 +585,8 @@ public abstract class DeletedMessageVaultIntegrationTest {
         homerDeletesMailbox(jmapServer);
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(1));
+
         // THEN Homer should be able to restore the message, but Bart should 
not
         restoreAllMessagesOfHomer();
         restoreMessagesFor(BART);
@@ -585,6 +615,8 @@ public abstract class DeletedMessageVaultIntegrationTest {
         homerDeletesMailbox(jmapServer);
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(1));
+
         // THEN Homer should be able to restore the message, but Bart should 
not
         restoreAllMessagesOfHomer();
         restoreMessagesFor(BART);
@@ -600,7 +632,7 @@ public abstract class DeletedMessageVaultIntegrationTest {
 
     @Tag(BasicFeature.TAG)
     @Test
-    void 
vaultExportShouldExportZipContainsVaultMessagesToShareeWhenJmapDeleteMessage() 
throws Exception {
+    void 
vaultExportShouldExportZipContainsVaultMessagesToShareeWhenJmapDeleteMessage(GuiceJamesServer
 jmapServer) throws Exception {
         bartSendMessageToHomer();
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
         String messageIdOfHomer = 
listMessageIdsForAccount(homerCredential).get(0);
@@ -608,6 +640,8 @@ public abstract class DeletedMessageVaultIntegrationTest {
         homerDeletesMessages(listMessageIdsForAccount(homerCredential));
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(1));
+
         String fileLocation = 
exportAndGetFileLocationFromLastMail(EXPORT_ALL_HOMER_MESSAGES_TO_BART, 
bartCredential);
 
         try (ZipAssert zipAssert = assertThatZip(new 
FileInputStream(fileLocation))) {
@@ -631,6 +665,8 @@ public abstract class DeletedMessageVaultIntegrationTest {
 
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(1));
+
         String fileLocation = 
exportAndGetFileLocationFromLastMail(EXPORT_ALL_HOMER_MESSAGES_TO_BART, 
bartCredential);
 
         try (ZipAssert zipAssert = assertThatZip(new 
FileInputStream(fileLocation))) {
@@ -656,6 +692,8 @@ public abstract class DeletedMessageVaultIntegrationTest {
 
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(1));
+
         String fileLocation = 
exportAndGetFileLocationFromLastMail(EXPORT_ALL_HOMER_MESSAGES_TO_BART, 
bartCredential);
 
         try (ZipAssert zipAssert = assertThatZip(new 
FileInputStream(fileLocation))) {
@@ -665,7 +703,7 @@ public abstract class DeletedMessageVaultIntegrationTest {
     }
 
     @Test
-    void vaultExportShouldExportZipContainsOnlyMatchedMessages() throws 
Exception {
+    void 
vaultExportShouldExportZipContainsOnlyMatchedMessages(GuiceJamesServer 
jmapServer) throws Exception {
         bartSendMessageToHomerWithSubject(FIRST_SUBJECT);
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
         String firstMessageIdOfHomer = 
listMessageIdsForAccount(homerCredential).get(0);
@@ -676,6 +714,8 @@ public abstract class DeletedMessageVaultIntegrationTest {
         homerDeletesMessages(listMessageIdsForAccount(homerCredential));
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(2));
+
         ExportRequest exportRequest = ExportRequest
             .userExportFrom(HOMER)
             .exportTo(BART)
@@ -694,7 +734,7 @@ public abstract class DeletedMessageVaultIntegrationTest {
     }
 
     @Test
-    void vaultExportShouldExportEmptyZipWhenQueryDoesntMatch() throws 
Exception {
+    void vaultExportShouldExportEmptyZipWhenQueryDoesntMatch(GuiceJamesServer 
jmapServer) throws Exception {
         bartSendMessageToHomerWithSubject(FIRST_SUBJECT);
         bartSendMessageToHomerWithSubject(SECOND_SUBJECT);
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(2));
@@ -702,6 +742,8 @@ public abstract class DeletedMessageVaultIntegrationTest {
         homerDeletesMessages(listMessageIdsForAccount(homerCredential));
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(2));
+
         ExportRequest exportRequest = ExportRequest
             .userExportFrom(HOMER)
             .exportTo(BART)
@@ -727,13 +769,15 @@ public abstract class DeletedMessageVaultIntegrationTest {
     }
 
     @Test
-    void vaultExportShouldResponseIdempotentSideEffect() throws Exception {
+    void vaultExportShouldResponseIdempotentSideEffect(GuiceJamesServer 
jmapServer) throws Exception {
         bartSendMessageToHomer();
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
 
         homerDeletesMessages(listMessageIdsForAccount(homerCredential));
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(1));
+
         String fileLocationFirstExport = 
exportAndGetFileLocationFromLastMail(EXPORT_ALL_HOMER_MESSAGES_TO_BART, 
bartCredential);
         String fileLocationSecondExport = 
exportAndGetFileLocationFromLastMail(EXPORT_ALL_HOMER_MESSAGES_TO_BART, 
bartCredential);
 
@@ -743,7 +787,7 @@ public abstract class DeletedMessageVaultIntegrationTest {
     }
 
     @Test
-    void 
vaultPurgeShouldMakeExportProduceEmptyZipWhenAllMessagesAreExpired(UpdatableTickingClock
 clock) throws Exception {
+    void 
vaultPurgeShouldMakeExportProduceEmptyZipWhenAllMessagesAreExpired(GuiceJamesServer
 jmapServer, UpdatableTickingClock clock) throws Exception {
         bartSendMessageToHomer();
         bartSendMessageToHomer();
         bartSendMessageToHomer();
@@ -752,6 +796,8 @@ public abstract class DeletedMessageVaultIntegrationTest {
         homerDeletesMessages(listMessageIdsForAccount(homerCredential));
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(3));
+
         clock.setInstant(TWO_MONTH_AFTER_ONE_YEAR_EXPIRATION.toInstant());
         purgeVault(webAdminApi);
 
@@ -762,7 +808,7 @@ public abstract class DeletedMessageVaultIntegrationTest {
     }
 
     @Test
-    void 
vaultPurgeShouldMakeExportProduceAZipWhenOneMessageIsNotExpired(UpdatableTickingClock
 clock) throws Exception {
+    void 
vaultPurgeShouldMakeExportProduceAZipWhenOneMessageIsNotExpired(GuiceJamesServer
 jmapServer, UpdatableTickingClock clock) throws Exception {
         bartSendMessageToHomer();
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
 
@@ -778,6 +824,8 @@ public abstract class DeletedMessageVaultIntegrationTest {
         homerDeletesMessages(listMessageIdsForAccount(homerCredential));
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(2));
+
         purgeVault(webAdminApi);
 
         String fileLocation = 
exportAndGetFileLocationFromLastMail(EXPORT_ALL_HOMER_MESSAGES_TO_BART, 
bartCredential);
@@ -788,7 +836,7 @@ public abstract class DeletedMessageVaultIntegrationTest {
     }
 
     @Test
-    void vaultPurgeShouldMakeExportProduceZipWhenAllMessagesAreNotExpired() 
throws Exception {
+    void 
vaultPurgeShouldMakeExportProduceZipWhenAllMessagesAreNotExpired(GuiceJamesServer
 jmapServer) throws Exception {
         bartSendMessageToHomer();
         bartSendMessageToHomer();
         bartSendMessageToHomer();
@@ -797,6 +845,8 @@ public abstract class DeletedMessageVaultIntegrationTest {
         homerDeletesMessages(listMessageIdsForAccount(homerCredential));
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(3));
+
         purgeVault(webAdminApi);
 
         String fileLocation = 
exportAndGetFileLocationFromLastMail(EXPORT_ALL_HOMER_MESSAGES_TO_BART, 
bartCredential);
@@ -806,13 +856,15 @@ public abstract class DeletedMessageVaultIntegrationTest {
     }
 
     @Test
-    void 
vaultPurgeShouldNotAppendMessageToTheUserMailbox(UpdatableTickingClock clock) {
+    void vaultPurgeShouldNotAppendMessageToTheUserMailbox(GuiceJamesServer 
jmapServer, UpdatableTickingClock clock) {
         bartSendMessageToHomer();
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
 
         homerDeletesMessages(listMessageIdsForAccount(homerCredential));
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(1));
+
         clock.setInstant(TWO_MONTH_AFTER_ONE_YEAR_EXPIRATION.toInstant());
         purgeVault(webAdminApi);
 
@@ -821,7 +873,7 @@ public abstract class DeletedMessageVaultIntegrationTest {
     }
 
     @Test
-    void vaultDeleteShouldDeleteMessageThenExportWithNoEntry() throws 
Exception {
+    void vaultDeleteShouldDeleteMessageThenExportWithNoEntry(GuiceJamesServer 
jmapServer) throws Exception {
         bartSendMessageToHomer();
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
 
@@ -830,6 +882,8 @@ public abstract class DeletedMessageVaultIntegrationTest {
         homerDeletesMessages(listMessageIdsForAccount(homerCredential));
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(1));
+
         deleteFromVault(webAdminApi, HOMER, messageIdOfHomer);
 
         String fileLocation = 
exportAndGetFileLocationFromLastMail(EXPORT_ALL_HOMER_MESSAGES_TO_BART, 
bartCredential);
@@ -854,7 +908,7 @@ public abstract class DeletedMessageVaultIntegrationTest {
     }
 
     @Test
-    void vaultDeleteShouldNotDeleteNotMatchedMessageInVaultThenExportAnEntry() 
throws Exception {
+    void 
vaultDeleteShouldNotDeleteNotMatchedMessageInVaultThenExportAnEntry(GuiceJamesServer
 jmapServer) throws Exception {
         bartSendMessageToHomer();
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
         String messageIdOfHomer = 
listMessageIdsForAccount(homerCredential).get(0);
@@ -865,6 +919,8 @@ public abstract class DeletedMessageVaultIntegrationTest {
         homerDeletesMessages(listMessageIdsForAccount(homerCredential));
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(1));
+
         deleteFromVault(webAdminApi, HOMER, messageIdOfBart);
 
         String fileLocation = 
exportAndGetFileLocationFromLastMail(EXPORT_ALL_HOMER_MESSAGES_TO_BART, 
bartCredential);
@@ -875,7 +931,7 @@ public abstract class DeletedMessageVaultIntegrationTest {
     }
 
     @Test
-    void vaultDeleteShouldNotAppendMessageToTheUserMailbox() {
+    void vaultDeleteShouldNotAppendMessageToTheUserMailbox(GuiceJamesServer 
jmapServer) {
         bartSendMessageToHomer();
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
 
@@ -884,6 +940,8 @@ public abstract class DeletedMessageVaultIntegrationTest {
         homerDeletesMessages(listMessageIdsForAccount(homerCredential));
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(1));
+
         deleteFromVault(webAdminApi, HOMER, messageIdOfHomer);
 
         assertThat(listMessageIdsForAccount(homerCredential))
@@ -891,7 +949,7 @@ public abstract class DeletedMessageVaultIntegrationTest {
     }
 
     @Test
-    public void vaultDeleteShouldDeleteAllMessagesHavingSameBlobContent() 
throws Exception {
+    public void 
vaultDeleteShouldDeleteAllMessagesHavingSameBlobContent(GuiceJamesServer 
jmapServer) throws Exception {
         bartSendMessageToHomerAndJack();
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
 
@@ -899,11 +957,15 @@ public abstract class DeletedMessageVaultIntegrationTest {
         homerDeletesMessages(ImmutableList.of(homerInboxMessageId));
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(1));
+
         // the message same with homer's one in inbox
         String jackInboxMessageId = 
listMessageIdsForAccount(jackCredential).get(0);
         jackDeletesMessages(ImmutableList.of(jackInboxMessageId));
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(jackCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfUserFromVault(jmapServer, 
Username.of(JACK))).hasSize(1));
+
         // delete from homer's vault, expecting the message contains the same 
blob in jack's vault will be deleted
         deleteFromVault(webAdminApi, HOMER, homerInboxMessageId);
 
@@ -914,7 +976,7 @@ public abstract class DeletedMessageVaultIntegrationTest {
     }
 
     @Test
-    void 
vaultDeleteShouldNotDeleteAllMessagesHavingSameBlobContentWhenMessageNotDeletedWithinTheSameMonth(UpdatableTickingClock
 clock) throws Exception {
+    void 
vaultDeleteShouldNotDeleteAllMessagesHavingSameBlobContentWhenMessageNotDeletedWithinTheSameMonth(GuiceJamesServer
 jmapServer, UpdatableTickingClock clock) throws Exception {
         bartSendMessageToHomerAndJack();
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(1));
 
@@ -922,6 +984,8 @@ public abstract class DeletedMessageVaultIntegrationTest {
         homerDeletesMessages(ImmutableList.of(homerInboxMessageId));
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(homerCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfHomerFromVault(jmapServer)).hasSize(1));
+
         // one year later, delete jack's message
         clock.setInstant(NOW.plusYears(1).toInstant());
         // the message same with homer's one in inbox
@@ -929,6 +993,8 @@ public abstract class DeletedMessageVaultIntegrationTest {
         jackDeletesMessages(ImmutableList.of(jackInboxMessageId));
         WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessageIdsForAccount(jackCredential)).hasSize(0));
 
+        WAIT_TWO_MINUTES.untilAsserted(() -> 
assertThat(listMessagesOfUserFromVault(jmapServer, 
Username.of(JACK))).hasSize(1));
+
         // delete from homer's vault, expecting jack's vault still be intact
         deleteFromVault(webAdminApi, HOMER, homerInboxMessageId);
 
@@ -1230,11 +1296,18 @@ public abstract class 
DeletedMessageVaultIntegrationTest {
         testIMAPClient.delete(MAILBOX_NAME);
     }
 
-
     private boolean homerHasMailboxWithRole(Role role) {
         return getAllMailboxesIds(homerCredential).stream()
             .filter(mailbox -> mailbox.get("role") != null)
             .anyMatch(mailbox -> mailbox.get("role").equals(role.serialize())
                 && mailbox.get("name").equals(role.getDefaultMailbox()));
     }
+
+    private List<DeletedMessage> listMessagesOfHomerFromVault(GuiceJamesServer 
jmapServer) {
+        return listMessagesOfUserFromVault(jmapServer, Username.of(HOMER));
+    }
+
+    private List<DeletedMessage> listMessagesOfUserFromVault(GuiceJamesServer 
jmapServer, Username username) {
+        return 
jmapServer.getProbe(DeletedMessageVaultProbe.class).search(username, Query.ALL);
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


Reply via email to