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]