This is an automated email from the ASF dual-hosted git repository. matthieu pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit d02ec4b2beb630e14454c0a452f790d437eeb661 Author: Jean Helou <[email protected]> AuthorDate: Fri Dec 11 18:01:42 2020 +0100 JAMES-3225 tags more unstable tests --- ...RabbitMQEventBusDeadLetterQueueUpgradeTest.java | 9 + .../CassandraMailboxManagerConsistencyTest.java | 4 + .../mail/CassandraMailboxMapperAclTest.java | 9 + .../cassandra/mail/CassandraMailboxMapperTest.java | 722 +++++++++++---------- .../mail/CassandraMessageIdMapperTest.java | 10 + .../SolveMessageInconsistenciesServiceTest.java | 11 + .../store/mail/model/MailboxMapperACLTest.java | 2 +- .../metrics/tests/RecordingMetricFactoryTest.java | 4 + .../apache/james/MailsShouldBeWellReceived.java | 6 + .../memory/MemorySpamAssassinContractTest.java | 46 ++ .../pom.xml | 3 +- .../RabbitMQAwsS3JmapAuthenticationTest.java | 3 + .../RabbitMQAwsS3SetMailboxesMethodTest.java | 3 + .../awss3/RabbitMQDownloadCucumberTest.java | 3 +- .../awss3/RabbitMQGetMessagesMethodTest.java | 3 +- .../cucumber/awss3/RabbitMQMailboxSharingTest.java | 3 +- .../cucumber/awss3/RabbitMQMessageSharingTest.java | 5 +- .../RabbitMQSetMailboxesMethodCucumberTest.java | 3 +- .../RabbitMQSetMessagesMethodCucumberTest.java | 3 +- .../cucumber/awss3/RabbitMQUploadCucumberTest.java | 3 +- .../memory/MemoryEmailQueryMethodNoViewTest.java | 16 + .../rfc8621/memory/MemoryEmailQueryMethodTest.java | 15 + .../rabbitmq/FixingGhostMailboxTest.java | 10 + .../apache/james/junit/categories/Unstable.java | 0 .../spamassassin/SpamAssassinInvokerTest.java | 3 + 25 files changed, 532 insertions(+), 367 deletions(-) diff --git a/event-bus/distributed/src/test/java/org/apache/james/events/RabbitMQEventBusDeadLetterQueueUpgradeTest.java b/event-bus/distributed/src/test/java/org/apache/james/events/RabbitMQEventBusDeadLetterQueueUpgradeTest.java index ea73049..936e6dc 100644 --- a/event-bus/distributed/src/test/java/org/apache/james/events/RabbitMQEventBusDeadLetterQueueUpgradeTest.java +++ b/event-bus/distributed/src/test/java/org/apache/james/events/RabbitMQEventBusDeadLetterQueueUpgradeTest.java @@ -30,9 +30,11 @@ import org.apache.james.events.EventBusTestFixture.GroupA; import org.apache.james.events.EventBusTestFixture.TestEventSerializer; import org.apache.james.events.EventBusTestFixture.TestRegistrationKeyFactory; import org.apache.james.events.GroupRegistration.WorkQueueName; +import org.apache.james.junit.categories.Unstable; import org.apache.james.metrics.tests.RecordingMetricFactory; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -70,6 +72,13 @@ class RabbitMQEventBusDeadLetterQueueUpgradeTest { } @Test + @Tag(Unstable.TAG) + /* + Error + channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'x-dead-letter-exchange' for queue 'mailboxEvent-workQueue-org.apache.james.mailbox.events.EventBusTestFixture$GroupA' in vhost '/': received none but current is the value 'mailboxEvent-dead-letter-exchange' of ty..., class-id=50, method-id=10) + Stacktrace + com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'x-dead-letter-exchange' for queue 'mailboxEvent-workQueue-org.apache.james.mailbox.events.EventBusTestFixture$GroupA' in vhost '/': received none but current is the value 'mailboxEvent-dead-letter-exchange' of ty..., class-id=50, method-id=10) + */ void eventBusShouldStartWhenDeadLetterUpgradeWasNotPerformed() { rabbitMQExtension.getSender().delete(QueueSpecification.queue().name(WORK_QUEUE_NAME.asString())).block(); rabbitMQExtension.getSender() diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerConsistencyTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerConsistencyTest.java index 66b93f7..767a82f 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerConsistencyTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerConsistencyTest.java @@ -26,6 +26,7 @@ import org.apache.james.backends.cassandra.CassandraCluster; import org.apache.james.backends.cassandra.CassandraClusterExtension; import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration; import org.apache.james.core.Username; +import org.apache.james.junit.categories.Unstable; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule; import org.apache.james.mailbox.model.MailboxId; @@ -37,6 +38,7 @@ import org.assertj.core.api.SoftAssertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -422,6 +424,8 @@ class CassandraMailboxManagerConsistencyTest { } @Test + @Tag(Unstable.TAG) + //see https://builds.apache.org/blue/organizations/jenkins/james%2FApacheJames/detail/PR-268/32/tests void deleteMailboxByPathShouldBeConsistentWhenMailboxPathDaoFails(CassandraCluster cassandra) throws Exception { MailboxId inboxId = testee.createMailbox(inboxPath, mailboxSession) .get(); diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperAclTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperAclTest.java index 245205e..19ddedc 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperAclTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperAclTest.java @@ -24,11 +24,14 @@ import org.apache.james.backends.cassandra.components.CassandraModule; import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule; import org.apache.james.blob.cassandra.CassandraBlobModule; import org.apache.james.eventsourcing.eventstore.cassandra.CassandraEventStoreModule; +import org.apache.james.junit.categories.Unstable; import org.apache.james.mailbox.cassandra.mail.utils.GuiceUtils; import org.apache.james.mailbox.cassandra.modules.CassandraAclModule; import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule; import org.apache.james.mailbox.store.mail.MailboxMapper; import org.apache.james.mailbox.store.mail.model.MailboxMapperACLTest; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; class CassandraMailboxMapperAclTest extends MailboxMapperACLTest { @@ -48,4 +51,10 @@ class CassandraMailboxMapperAclTest extends MailboxMapperACLTest { return GuiceUtils.testInjector(cassandraCluster.getCassandraCluster()) .getInstance(CassandraMailboxMapper.class); } + @Test + @Override + @Tag(Unstable.TAG) + protected void updateAclShouldCombineStoredAclWhenAdd() { + super.updateAclShouldCombineStoredAclWhenAdd(); + } } 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 8fe8fac..78a2b58 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 @@ -19,14 +19,8 @@ package org.apache.james.mailbox.cassandra.mail; -import static org.apache.james.backends.cassandra.Scenario.Builder.fail; -import static org.apache.james.mailbox.model.MailboxAssertingTool.softly; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import java.util.List; -import java.util.stream.IntStream; - +import com.github.fge.lambdas.Throwing; +import com.github.fge.lambdas.runnable.ThrowingRunnable; import org.apache.commons.lang3.StringUtils; import org.apache.james.backends.cassandra.CassandraCluster; import org.apache.james.backends.cassandra.CassandraClusterExtension; @@ -44,6 +38,7 @@ import org.apache.james.eventsourcing.eventstore.cassandra.CassandraEventStore; import org.apache.james.eventsourcing.eventstore.cassandra.CassandraEventStoreModule; import org.apache.james.eventsourcing.eventstore.cassandra.EventStoreDao; import org.apache.james.eventsourcing.eventstore.cassandra.JsonEventSerializer; +import org.apache.james.junit.categories.Unstable; import org.apache.james.mailbox.cassandra.ids.CassandraId; import org.apache.james.mailbox.cassandra.mail.eventsourcing.acl.ACLModule; import org.apache.james.mailbox.cassandra.modules.CassandraAclModule; @@ -62,13 +57,18 @@ import org.assertj.core.api.SoftAssertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import reactor.core.publisher.Mono; -import com.github.fge.lambdas.Throwing; -import com.github.fge.lambdas.runnable.ThrowingRunnable; +import java.util.List; +import java.util.stream.IntStream; -import reactor.core.publisher.Mono; +import static org.apache.james.backends.cassandra.Scenario.Builder.fail; +import static org.apache.james.mailbox.model.MailboxAssertingTool.softly; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; class CassandraMailboxMapperTest { private static final UidValidity UID_VALIDITY = UidValidity.of(52); @@ -84,10 +84,10 @@ class CassandraMailboxMapperTest { private static final Mailbox MAILBOX_BIS = new Mailbox(MAILBOX_PATH, UID_VALIDITY, MAILBOX_ID_2); private static final CassandraModule MODULES = CassandraModule.aggregateModules( - CassandraAclModule.MODULE, - CassandraEventStoreModule.MODULE(), - CassandraMailboxModule.MODULE, - CassandraSchemaVersionModule.MODULE); + CassandraAclModule.MODULE, + CassandraEventStoreModule.MODULE(), + CassandraMailboxModule.MODULE, + CassandraSchemaVersionModule.MODULE); private static final int TRY_COUNT_BEFORE_FAILURE = 6; @RegisterExtension @@ -110,8 +110,8 @@ class CassandraMailboxMapperTest { versionDAO = new CassandraSchemaVersionDAO(cassandra.getConf()); versionDAO.truncateVersion() - .then(versionDAO.updateVersion(new SchemaVersion(7))) - .block(); + .then(versionDAO.updateVersion(new SchemaVersion(7))) + .block(); setUpTestee(CassandraConfiguration.DEFAULT_CONFIGURATION); } @@ -122,23 +122,23 @@ class CassandraMailboxMapperTest { CassandraACLDAOV1 aclDAOV1 = new CassandraACLDAOV1(cassandra.getConf(), cassandraConfiguration, CassandraConsistenciesConfiguration.DEFAULT); CassandraACLDAOV2 aclDAOv2 = new CassandraACLDAOV2(cassandra.getConf()); JsonEventSerializer jsonEventSerializer = JsonEventSerializer - .forModules(ACLModule.ACL_UPDATE) - .withoutNestedType(); + .forModules(ACLModule.ACL_UPDATE) + .withoutNestedType(); CassandraUserMailboxRightsDAO usersRightDAO = new CassandraUserMailboxRightsDAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION); CassandraEventStore eventStore = new CassandraEventStore(new EventStoreDao(cassandra.getConf(), jsonEventSerializer, CassandraConsistenciesConfiguration.DEFAULT)); CassandraACLMapper aclMapper = new CassandraACLMapper( - new CassandraACLMapper.StoreV1(usersRightDAO, aclDAOV1), - new CassandraACLMapper.StoreV2(usersRightDAO, aclDAOv2, eventStore), - versionManager); + new CassandraACLMapper.StoreV1(usersRightDAO, aclDAOV1), + new CassandraACLMapper.StoreV2(usersRightDAO, aclDAOv2, eventStore), + versionManager); testee = new CassandraMailboxMapper( - mailboxDAO, - mailboxPathDAO, - mailboxPathV2DAO, - mailboxPathV3DAO, - usersRightDAO, - aclMapper, - versionManager, - cassandraConfiguration); + mailboxDAO, + mailboxPathDAO, + mailboxPathV2DAO, + mailboxPathV3DAO, + usersRightDAO, + aclMapper, + versionManager, + cassandraConfiguration); } @Nested @@ -155,20 +155,20 @@ class CassandraMailboxMapperTest { inboxPath = MailboxPath.forUser(USER, INBOX); inboxPathRenamed = MailboxPath.forUser(USER, INBOX_RENAMED); allMailboxesSearchQuery = MailboxQuery.builder() - .userAndNamespaceFrom(inboxPath) - .expression(Wildcard.INSTANCE) - .build() - .asUserBound(); + .userAndNamespaceFrom(inboxPath) + .expression(Wildcard.INSTANCE) + .build() + .asUserBound(); inboxSearchQuery = MailboxQuery.builder() - .userAndNamespaceFrom(inboxPath) - .expression(new ExactName(INBOX)) - .build() - .asUserBound(); + .userAndNamespaceFrom(inboxPath) + .expression(new ExactName(INBOX)) + .build() + .asUserBound(); inboxRenamedSearchQuery = MailboxQuery.builder() - .userAndNamespaceFrom(inboxPathRenamed) - .expression(new ExactName(INBOX_RENAMED)) - .build() - .asUserBound(); + .userAndNamespaceFrom(inboxPathRenamed) + .expression(new ExactName(INBOX_RENAMED)) + .build() + .asUserBound(); } @Nested @@ -180,24 +180,24 @@ class CassandraMailboxMapperTest { Mailbox inboxRenamed = createInboxRenamedMailbox(inboxId); cassandra.getConf() - .registerScenario(fail() - .times(1) - .whenQueryStartsWith("DELETE FROM mailboxPathV2 WHERE namespace=:namespace AND user=:user AND mailboxName=:mailboxName IF EXISTS;")); + .registerScenario(fail() + .times(1) + .whenQueryStartsWith("DELETE FROM mailboxPathV2 WHERE namespace=:namespace AND user=:user AND mailboxName=:mailboxName IF EXISTS;")); testee.rename(inboxRenamed).block(); SoftAssertions.assertSoftly(Throwing.consumer(softly -> { softly(softly) - .assertThat(testee.findMailboxById(inboxId).block()) - .isEqualTo(inboxRenamed); + .assertThat(testee.findMailboxById(inboxId).block()) + .isEqualTo(inboxRenamed); softly(softly) - .assertThat(testee.findMailboxByPath(inboxPathRenamed).block()) - .isEqualTo(inboxRenamed); + .assertThat(testee.findMailboxByPath(inboxPathRenamed).block()) + .isEqualTo(inboxRenamed); softly.assertThat(testee.findMailboxWithPathLike(allMailboxesSearchQuery) - .collectList().block()) - .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) - .assertThat(searchMailbox) - .isEqualTo(inboxRenamed)); + .collectList().block()) + .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) + .assertThat(searchMailbox) + .isEqualTo(inboxRenamed)); })); } @@ -208,48 +208,48 @@ class CassandraMailboxMapperTest { Mailbox inboxRenamed = createInboxRenamedMailbox(inboxId); cassandra.getConf() - .registerScenario(fail() - .times(1) - .whenQueryStartsWith("INSERT INTO mailbox (id,name,uidvalidity,mailboxbase) VALUES (:id,:name,:uidvalidity,:mailboxbase);")); + .registerScenario(fail() + .times(1) + .whenQueryStartsWith("INSERT INTO mailbox (id,name,uidvalidity,mailboxbase) VALUES (:id,:name,:uidvalidity,:mailboxbase);")); testee.rename(inboxRenamed).block(); SoftAssertions.assertSoftly(Throwing.consumer(softly -> { softly(softly) - .assertThat(testee.findMailboxById(inboxId).block()) - .isEqualTo(inboxRenamed); + .assertThat(testee.findMailboxById(inboxId).block()) + .isEqualTo(inboxRenamed); softly(softly) - .assertThat(testee.findMailboxByPath(inboxPathRenamed).block()) - .isEqualTo(inboxRenamed); + .assertThat(testee.findMailboxByPath(inboxPathRenamed).block()) + .isEqualTo(inboxRenamed); softly.assertThat(testee.findMailboxWithPathLike(allMailboxesSearchQuery) - .collectList().block()) - .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) - .assertThat(searchMailbox) - .isEqualTo(inboxRenamed)); + .collectList().block()) + .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) + .assertThat(searchMailbox) + .isEqualTo(inboxRenamed)); })); } @Test void createShouldRetryFailedMailboxSaving(CassandraCluster cassandra) { cassandra.getConf() - .registerScenario(fail() - .times(1) - .whenQueryStartsWith("INSERT INTO mailbox (id,name,uidvalidity,mailboxbase) VALUES (:id,:name,:uidvalidity,:mailboxbase);")); + .registerScenario(fail() + .times(1) + .whenQueryStartsWith("INSERT INTO mailbox (id,name,uidvalidity,mailboxbase) VALUES (:id,:name,:uidvalidity,:mailboxbase);")); Mailbox inbox = testee.create(inboxPath, UID_VALIDITY).block(); SoftAssertions.assertSoftly(Throwing.consumer(softly -> { softly(softly) - .assertThat(testee.findMailboxById(inbox.getMailboxId()).block()) - .isEqualTo(inbox); + .assertThat(testee.findMailboxById(inbox.getMailboxId()).block()) + .isEqualTo(inbox); softly(softly) - .assertThat(testee.findMailboxByPath(inboxPath).block()) - .isEqualTo(inbox); + .assertThat(testee.findMailboxByPath(inboxPath).block()) + .isEqualTo(inbox); softly.assertThat(testee.findMailboxWithPathLike(allMailboxesSearchQuery) - .collectList().block()) - .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) - .assertThat(searchMailbox) - .isEqualTo(inbox)); + .collectList().block()) + .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) + .assertThat(searchMailbox) + .isEqualTo(inbox)); })); } @@ -258,20 +258,20 @@ class CassandraMailboxMapperTest { Mailbox inbox = testee.create(inboxPath, UID_VALIDITY).block(); cassandra.getConf() - .registerScenario(fail() - .times(1) - .whenQueryStartsWith("DELETE FROM mailbox WHERE id=:id;")); + .registerScenario(fail() + .times(1) + .whenQueryStartsWith("DELETE FROM mailbox WHERE id=:id;")); testee.delete(inbox).block(); SoftAssertions.assertSoftly(Throwing.consumer(softly -> { softly.assertThatThrownBy(() -> testee.findMailboxById(inbox.getMailboxId()).block()) - .hasCauseInstanceOf(MailboxNotFoundException.class); + .hasCauseInstanceOf(MailboxNotFoundException.class); softly.assertThat(testee.findMailboxByPath(inboxPath).blockOptional()) - .isEmpty(); + .isEmpty(); softly.assertThat(testee.findMailboxWithPathLike(allMailboxesSearchQuery) - .collectList().block()) - .isEmpty(); + .collectList().block()) + .isEmpty(); })); } } @@ -282,108 +282,108 @@ class CassandraMailboxMapperTest { void setVersion() { // Read repairs should not be performed with an outdated data representation versionDAO.truncateVersion() - .then(versionDAO.updateVersion(new SchemaVersion(8))) - .block(); + .then(versionDAO.updateVersion(new SchemaVersion(8))) + .block(); } @Test void findMailboxByIdShouldEventuallyFixInconsistencyWhenMailboxIsNotInPath() { mailboxDAO.save(MAILBOX) - .block(); + .block(); IntStream.range(0, 100).forEach(i -> - testee.findMailboxById(MAILBOX_ID) - .onErrorResume(e -> Mono.empty()) - .block()); + testee.findMailboxById(MAILBOX_ID) + .onErrorResume(e -> Mono.empty()) + .block()); SoftAssertions.assertSoftly(Throwing.consumer(softly -> { softly(softly) - .assertThat(testee.findMailboxById(MAILBOX_ID).block()) - .isEqualTo(MAILBOX); + .assertThat(testee.findMailboxById(MAILBOX_ID).block()) + .isEqualTo(MAILBOX); softly(softly) - .assertThat(testee.findMailboxByPath(MAILBOX_PATH).block()) - .isEqualTo(MAILBOX); + .assertThat(testee.findMailboxByPath(MAILBOX_PATH).block()) + .isEqualTo(MAILBOX); })); } @Test void orphanMailboxIdEntriesCanNotBeReadRepaired() { mailboxDAO.save(MAILBOX) - .block(); + .block(); IntStream.range(0, 100).forEach(i -> - testee.findMailboxByPath(MAILBOX_PATH) - .onErrorResume(e -> Mono.empty()) - .block()); + testee.findMailboxByPath(MAILBOX_PATH) + .onErrorResume(e -> Mono.empty()) + .block()); SoftAssertions.assertSoftly(Throwing.consumer(softly -> { softly.assertThat(MailboxReactorUtils.blockOptional(testee.findMailboxByPath(MAILBOX_PATH))) - .isEmpty(); + .isEmpty(); softly(softly) - .assertThat(testee.findMailboxById(MAILBOX_ID).block()) - .isEqualTo(MAILBOX); + .assertThat(testee.findMailboxById(MAILBOX_ID).block()) + .isEqualTo(MAILBOX); })); } @Test void orphanPathEntriesCanNotBeRepairedByIdReads() { mailboxPathV3DAO.save(MAILBOX) - .block(); + .block(); IntStream.range(0, 100).forEach(i -> - testee.findMailboxById(MAILBOX_ID) - .onErrorResume(e -> Mono.empty()) - .block()); + testee.findMailboxById(MAILBOX_ID) + .onErrorResume(e -> Mono.empty()) + .block()); SoftAssertions.assertSoftly(Throwing.consumer(softly -> { softly.assertThatThrownBy(() -> MailboxReactorUtils.blockOptional(testee.findMailboxById(MAILBOX_ID))) - .isInstanceOf(MailboxNotFoundException.class); + .isInstanceOf(MailboxNotFoundException.class); softly(softly) - .assertThat(testee.findMailboxByPath(MAILBOX_PATH).block()) - .isEqualTo(MAILBOX); + .assertThat(testee.findMailboxByPath(MAILBOX_PATH).block()) + .isEqualTo(MAILBOX); })); } @Test void findMailboxByPathShouldFixInconsistencyWhenMailboxIsNotReferencedById() { mailboxPathV3DAO.save(MAILBOX) - .block(); + .block(); IntStream.range(0, 100).forEach(i -> - testee.findMailboxByPath(MAILBOX_PATH) - .onErrorResume(e -> Mono.empty()) - .block()); + testee.findMailboxByPath(MAILBOX_PATH) + .onErrorResume(e -> Mono.empty()) + .block()); SoftAssertions.assertSoftly(Throwing.consumer(softly -> { softly.assertThatThrownBy(() -> MailboxReactorUtils.blockOptional(testee.findMailboxById(MAILBOX_ID))) - .isInstanceOf(MailboxNotFoundException.class); + .isInstanceOf(MailboxNotFoundException.class); softly.assertThat(MailboxReactorUtils.blockOptional(testee.findMailboxByPath(MAILBOX_PATH))) - .isEmpty(); + .isEmpty(); })); } } @Disabled("In order to be more performant mailboxPath V3 table includes the UID_VALIDITY." + - "Reading paths no longer requires reading the mailbox by id but this of course has a " + - "consistency cost.") + "Reading paths no longer requires reading the mailbox by id but this of course has a " + + "consistency cost.") @Test void createShouldBeConsistentWhenFailToPersistMailbox(CassandraCluster cassandra) { cassandra.getConf() - .registerScenario(fail() - .times(10) - .whenQueryStartsWith("INSERT INTO mailbox (id,name,uidvalidity,mailboxbase) VALUES (:id,:name,:uidvalidity,:mailboxbase);")); + .registerScenario(fail() + .times(10) + .whenQueryStartsWith("INSERT INTO mailbox (id,name,uidvalidity,mailboxbase) VALUES (:id,:name,:uidvalidity,:mailboxbase);")); doQuietly(() -> testee.create(inboxPath, UID_VALIDITY).block()); SoftAssertions.assertSoftly(softly -> { softly.assertThat(testee.findMailboxByPath(inboxPath).blockOptional()) - .isEmpty(); + .isEmpty(); softly.assertThat(testee.findMailboxWithPathLike(inboxSearchQuery) - .collectList().block()) - .isEmpty(); + .collectList().block()) + .isEmpty(); softly.assertThat(testee.findMailboxWithPathLike(allMailboxesSearchQuery) - .collectList().block()) - .isEmpty(); + .collectList().block()) + .isEmpty(); }); } @@ -394,9 +394,9 @@ class CassandraMailboxMapperTest { Mailbox inboxRenamed = createInboxRenamedMailbox(inboxId); cassandra.getConf() - .registerScenario(fail() - .times(TRY_COUNT_BEFORE_FAILURE) - .whenQueryStartsWith("SELECT id,mailboxbase,uidvalidity,name FROM mailbox WHERE id=:id;")); + .registerScenario(fail() + .times(TRY_COUNT_BEFORE_FAILURE) + .whenQueryStartsWith("SELECT id,mailboxbase,uidvalidity,name FROM mailbox WHERE id=:id;")); doQuietly(() -> testee.rename(inboxRenamed)); @@ -404,16 +404,16 @@ class CassandraMailboxMapperTest { SoftAssertions.assertSoftly(Throwing.consumer(softly -> { softly(softly) - .assertThat(testee.findMailboxById(inboxId).block()) - .isEqualTo(inbox); + .assertThat(testee.findMailboxById(inboxId).block()) + .isEqualTo(inbox); softly(softly) - .assertThat(testee.findMailboxByPath(inboxPath).block()) - .isEqualTo(inbox); + .assertThat(testee.findMailboxByPath(inboxPath).block()) + .isEqualTo(inbox); softly.assertThat(testee.findMailboxWithPathLike(inboxSearchQuery) - .collectList().block()) - .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) - .assertThat(searchMailbox) - .isEqualTo(inbox)); + .collectList().block()) + .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) + .assertThat(searchMailbox) + .isEqualTo(inbox)); })); } @@ -425,18 +425,18 @@ class CassandraMailboxMapperTest { Mailbox inboxRenamed = createInboxRenamedMailbox(inboxId); cassandra.getConf() - .registerScenario(fail() - .times(TRY_COUNT_BEFORE_FAILURE) - .whenQueryStartsWith("SELECT id,mailboxbase,uidvalidity,name FROM mailbox WHERE id=:id;")); + .registerScenario(fail() + .times(TRY_COUNT_BEFORE_FAILURE) + .whenQueryStartsWith("SELECT id,mailboxbase,uidvalidity,name FROM mailbox WHERE id=:id;")); doQuietly(() -> testee.rename(inboxRenamed).block()); SoftAssertions.assertSoftly(Throwing.consumer(softly -> - softly.assertThat(testee.findMailboxWithPathLike(allMailboxesSearchQuery) - .collectList().block()) - .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) - .assertThat(searchMailbox) - .isEqualTo(inbox)) + softly.assertThat(testee.findMailboxWithPathLike(allMailboxesSearchQuery) + .collectList().block()) + .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) + .assertThat(searchMailbox) + .isEqualTo(inbox)) )); } @@ -448,18 +448,18 @@ class CassandraMailboxMapperTest { Mailbox inboxRenamed = createInboxRenamedMailbox(inboxId); cassandra.getConf() - .registerScenario(fail() - .times(TRY_COUNT_BEFORE_FAILURE) - .whenQueryStartsWith("SELECT id,mailboxbase,uidvalidity,name FROM mailbox WHERE id=:id;")); + .registerScenario(fail() + .times(TRY_COUNT_BEFORE_FAILURE) + .whenQueryStartsWith("SELECT id,mailboxbase,uidvalidity,name FROM mailbox WHERE id=:id;")); doQuietly(() -> testee.rename(inboxRenamed).block()); SoftAssertions.assertSoftly(Throwing.consumer(softly -> { softly.assertThatThrownBy(() -> testee.findMailboxByPath(inboxPathRenamed).block()) - .isInstanceOf(MailboxNotFoundException.class); + .isInstanceOf(MailboxNotFoundException.class); softly.assertThat(testee.findMailboxWithPathLike(inboxRenamedSearchQuery) - .collectList().block()) - .isEmpty(); + .collectList().block()) + .isEmpty(); })); } @@ -470,24 +470,24 @@ class CassandraMailboxMapperTest { Mailbox inboxRenamed = createInboxRenamedMailbox(inboxId); cassandra.getConf() - .registerScenario(fail() - .times(TRY_COUNT_BEFORE_FAILURE) - .whenQueryStartsWith("DELETE FROM mailboxPathV3 WHERE namespace=:namespace AND user=:user AND mailboxName=:mailboxName IF EXISTS;")); + .registerScenario(fail() + .times(TRY_COUNT_BEFORE_FAILURE) + .whenQueryStartsWith("DELETE FROM mailboxPathV3 WHERE namespace=:namespace AND user=:user AND mailboxName=:mailboxName IF EXISTS;")); doQuietly(() -> testee.rename(inboxRenamed).block()); SoftAssertions.assertSoftly(Throwing.consumer(softly -> { softly(softly) - .assertThat(testee.findMailboxById(inboxId).block()) - .isEqualTo(inbox); + .assertThat(testee.findMailboxById(inboxId).block()) + .isEqualTo(inbox); softly(softly) - .assertThat(testee.findMailboxByPath(inboxPath).block()) - .isEqualTo(inbox); + .assertThat(testee.findMailboxByPath(inboxPath).block()) + .isEqualTo(inbox); softly.assertThat(testee.findMailboxWithPathLike(inboxSearchQuery) - .collectList().block()) - .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) - .assertThat(searchMailbox) - .isEqualTo(inbox)); + .collectList().block()) + .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) + .assertThat(searchMailbox) + .isEqualTo(inbox)); })); } @@ -499,18 +499,18 @@ class CassandraMailboxMapperTest { Mailbox inboxRenamed = createInboxRenamedMailbox(inboxId); cassandra.getConf() - .registerScenario(fail() - .times(TRY_COUNT_BEFORE_FAILURE) - .whenQueryStartsWith("DELETE FROM mailboxPathV3 WHERE namespace=:namespace AND user=:user AND mailboxName=:mailboxName IF EXISTS;")); + .registerScenario(fail() + .times(TRY_COUNT_BEFORE_FAILURE) + .whenQueryStartsWith("DELETE FROM mailboxPathV3 WHERE namespace=:namespace AND user=:user AND mailboxName=:mailboxName IF EXISTS;")); doQuietly(() -> testee.rename(inboxRenamed).block()); SoftAssertions.assertSoftly(Throwing.consumer(softly -> - softly.assertThat(testee.findMailboxWithPathLike(allMailboxesSearchQuery) - .collectList().block()) - .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) - .assertThat(searchMailbox) - .isEqualTo(inbox)))); + softly.assertThat(testee.findMailboxWithPathLike(allMailboxesSearchQuery) + .collectList().block()) + .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) + .assertThat(searchMailbox) + .isEqualTo(inbox)))); } @Disabled("JAMES-3056 find by renamed name returns unexpected results") @@ -521,18 +521,18 @@ class CassandraMailboxMapperTest { Mailbox inboxRenamed = createInboxRenamedMailbox(inboxId); cassandra.getConf() - .registerScenario(fail() - .times(TRY_COUNT_BEFORE_FAILURE) - .whenQueryStartsWith("DELETE FROM mailboxPathV3 WHERE namespace=:namespace AND user=:user AND mailboxName=:mailboxName IF EXISTS;")); + .registerScenario(fail() + .times(TRY_COUNT_BEFORE_FAILURE) + .whenQueryStartsWith("DELETE FROM mailboxPathV3 WHERE namespace=:namespace AND user=:user AND mailboxName=:mailboxName IF EXISTS;")); doQuietly(() -> testee.rename(inboxRenamed).block()); SoftAssertions.assertSoftly(Throwing.consumer(softly -> { softly.assertThatThrownBy(() -> testee.findMailboxByPath(inboxPathRenamed).block()) - .isInstanceOf(MailboxNotFoundException.class); + .isInstanceOf(MailboxNotFoundException.class); softly.assertThat(testee.findMailboxWithPathLike(inboxRenamedSearchQuery) - .collectList().block()) - .isEmpty(); + .collectList().block()) + .isEmpty(); })); } @@ -543,27 +543,27 @@ class CassandraMailboxMapperTest { CassandraId inboxId = (CassandraId) inbox.getMailboxId(); cassandra.getConf() - .registerScenario(fail() - .times(TRY_COUNT_BEFORE_FAILURE) - .whenQueryStartsWith("DELETE FROM mailbox WHERE id=:id;")); + .registerScenario(fail() + .times(TRY_COUNT_BEFORE_FAILURE) + .whenQueryStartsWith("DELETE FROM mailbox WHERE id=:id;")); doQuietly(() -> testee.delete(inbox).block()); SoftAssertions.assertSoftly(Throwing.consumer(softly -> { softly.assertThatCode(() -> testee.findMailboxById(inboxId).block()) - .doesNotThrowAnyException(); + .doesNotThrowAnyException(); softly.assertThatCode(() -> testee.findMailboxByPath(inboxPath).block()) - .doesNotThrowAnyException(); + .doesNotThrowAnyException(); softly.assertThat(testee.findMailboxWithPathLike(inboxSearchQuery) - .collectList().block()) - .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) - .assertThat(searchMailbox) - .isEqualTo(inbox)); + .collectList().block()) + .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) + .assertThat(searchMailbox) + .isEqualTo(inbox)); softly.assertThat(testee.findMailboxWithPathLike(allMailboxesSearchQuery) - .collectList().block()) - .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) - .assertThat(searchMailbox) - .isEqualTo(inbox)); + .collectList().block()) + .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) + .assertThat(searchMailbox) + .isEqualTo(inbox)); })); } @@ -583,16 +583,16 @@ class CassandraMailboxMapperTest { testee.rename(mailboxHasSameNameWithInbox).block(); assertThat(testee.findMailboxById(newId).block().getName()) - .isNotEqualTo(testee.findMailboxById(inboxId).block().getName()); + .isNotEqualTo(testee.findMailboxById(inboxId).block().getName()); } @Disabled("JAMES-3056 org.apache.james.mailbox.exception.MailboxNotFoundException: 'mailboxId' can not be found") @Test void createAfterPreviousFailedCreateShouldCreateAMailbox(CassandraCluster cassandra) { cassandra.getConf() - .registerScenario(fail() - .times(TRY_COUNT_BEFORE_FAILURE) - .whenQueryStartsWith("INSERT INTO mailbox (id,name,uidvalidity,mailboxbase) VALUES (:id,:name,:uidvalidity,:mailboxbase);")); + .registerScenario(fail() + .times(TRY_COUNT_BEFORE_FAILURE) + .whenQueryStartsWith("INSERT INTO mailbox (id,name,uidvalidity,mailboxbase) VALUES (:id,:name,:uidvalidity,:mailboxbase);")); doQuietly(() -> testee.create(inboxPath, UID_VALIDITY).block()); @@ -600,27 +600,35 @@ class CassandraMailboxMapperTest { SoftAssertions.assertSoftly(Throwing.consumer(softly -> { softly(softly) - .assertThat(testee.findMailboxByPath(inboxPath).block()) - .isEqualTo(inbox); + .assertThat(testee.findMailboxByPath(inboxPath).block()) + .isEqualTo(inbox); softly.assertThat(testee.findMailboxWithPathLike(inboxSearchQuery) - .collectList().block()) - .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) - .assertThat(searchMailbox) - .isEqualTo(inbox)); + .collectList().block()) + .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) + .assertThat(searchMailbox) + .isEqualTo(inbox)); softly.assertThat(testee.findMailboxWithPathLike(allMailboxesSearchQuery) - .collectList().block()) - .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) - .assertThat(searchMailbox) - .isEqualTo(inbox)); + .collectList().block()) + .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) + .assertThat(searchMailbox) + .isEqualTo(inbox)); })); } @Test + /* + https://builds.apache.org/blue/organizations/jenkins/james%2FApacheJames/detail/PR-268/38/tests + Expected size:<1> but was:<2> in: + <[Mailbox{id=44ec7c50-405c-11eb-bd9e-f9735674a69e, namespace=#private, user=Username{localPart=user, domainPart=Optional.empty}, name=INBOX}, + Mailbox{id=4282f660-405c-11eb-bd9e-f9735674a69e, namespace=#private, user=Username{localPart=user, domainPart=Optional.empty}, name=name}]> + at CassandraMailboxMapperTest$ConsistencyTest.lambda$createAfterPreviousDeleteOnFailedCreateShouldCreateAMailbox$34(CassandraMailboxMapperTest$ConsistencyTest.java:628) + */ + @Tag(Unstable.TAG) void createAfterPreviousDeleteOnFailedCreateShouldCreateAMailbox(CassandraCluster cassandra) { cassandra.getConf() - .registerScenario(fail() - .times(TRY_COUNT_BEFORE_FAILURE) - .whenQueryStartsWith("INSERT INTO mailbox (id,name,uidvalidity,mailboxbase) VALUES (:id,:name,:uidvalidity,:mailboxbase);")); + .registerScenario(fail() + .times(TRY_COUNT_BEFORE_FAILURE) + .whenQueryStartsWith("INSERT INTO mailbox (id,name,uidvalidity,mailboxbase) VALUES (:id,:name,:uidvalidity,:mailboxbase);")); doQuietly(() -> testee.create(inboxPath, UID_VALIDITY).block()); doQuietly(() -> testee.delete(new Mailbox(inboxPath, UID_VALIDITY, CassandraId.timeBased())).block()); @@ -629,18 +637,18 @@ class CassandraMailboxMapperTest { SoftAssertions.assertSoftly(Throwing.consumer(softly -> { softly(softly) - .assertThat(testee.findMailboxByPath(inboxPath).block()) - .isEqualTo(inbox); + .assertThat(testee.findMailboxByPath(inboxPath).block()) + .isEqualTo(inbox); softly.assertThat(testee.findMailboxWithPathLike(inboxSearchQuery) - .collectList().block()) - .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) - .assertThat(searchMailbox) - .isEqualTo(inbox)); + .collectList().block()) + .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) + .assertThat(searchMailbox) + .isEqualTo(inbox)); softly.assertThat(testee.findMailboxWithPathLike(allMailboxesSearchQuery) - .collectList().block()) - .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) - .assertThat(searchMailbox) - .isEqualTo(inbox)); + .collectList().block()) + .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) + .assertThat(searchMailbox) + .isEqualTo(inbox)); })); } @@ -650,9 +658,9 @@ class CassandraMailboxMapperTest { CassandraId inboxId = (CassandraId) inbox.getMailboxId(); cassandra.getConf() - .registerScenario(fail() - .times(TRY_COUNT_BEFORE_FAILURE) - .whenQueryStartsWith("DELETE FROM mailbox WHERE id=:id;")); + .registerScenario(fail() + .times(TRY_COUNT_BEFORE_FAILURE) + .whenQueryStartsWith("DELETE FROM mailbox WHERE id=:id;")); doQuietly(() -> testee.delete(inbox).block()); @@ -660,20 +668,20 @@ class CassandraMailboxMapperTest { SoftAssertions.assertSoftly(Throwing.consumer(softly -> { softly.assertThatThrownBy(() -> testee.findMailboxById(inboxId).block()) - .hasCauseInstanceOf(MailboxNotFoundException.class); - softly.assertThat(testee.findMailboxByPath(inboxPath).blockOptional()) + .hasCauseInstanceOf(MailboxNotFoundException.class); + softly.assertThat(testee.findMailboxByPath(inboxPath).blockOptional()) .isEmpty(); softly.assertThat(testee.findMailboxWithPathLike(inboxSearchQuery) - .collectList().block()) - .isEmpty(); + .collectList().block()) + .isEmpty(); softly.assertThat(testee.findMailboxWithPathLike(allMailboxesSearchQuery) - .collectList().block()) - .isEmpty(); + .collectList().block()) + .isEmpty(); })); } @Disabled("JAMES-3056 mailbox name is not updated to INBOX_RENAMED).isEqualTo(" + - "findMailboxWithPathLike() returns a list with two same mailboxes") + "findMailboxWithPathLike() returns a list with two same mailboxes") @Test void renameAfterRenameFailOnRetrieveMailboxShouldRenameTheMailbox(CassandraCluster cassandra) { Mailbox inbox = testee.create(inboxPath, UID_VALIDITY).block(); @@ -681,9 +689,9 @@ class CassandraMailboxMapperTest { Mailbox inboxRenamed = createInboxRenamedMailbox(inboxId); cassandra.getConf() - .registerScenario(fail() - .times(TRY_COUNT_BEFORE_FAILURE) - .whenQueryStartsWith("SELECT id,mailboxbase,uidvalidity,name FROM mailbox WHERE id=:id;")); + .registerScenario(fail() + .times(TRY_COUNT_BEFORE_FAILURE) + .whenQueryStartsWith("SELECT id,mailboxbase,uidvalidity,name FROM mailbox WHERE id=:id;")); doQuietly(() -> testee.rename(inboxRenamed).block()); @@ -691,24 +699,24 @@ class CassandraMailboxMapperTest { SoftAssertions.assertSoftly(Throwing.consumer(softly -> { softly(softly) - .assertThat(testee.findMailboxById(inboxId).block()) - .isEqualTo(inboxRenamed); + .assertThat(testee.findMailboxById(inboxId).block()) + .isEqualTo(inboxRenamed); softly(softly) - .assertThat(testee.findMailboxByPath(inboxPathRenamed).block()) - .isEqualTo(inboxRenamed); + .assertThat(testee.findMailboxByPath(inboxPathRenamed).block()) + .isEqualTo(inboxRenamed); softly.assertThat(testee.findMailboxWithPathLike(inboxSearchQuery) - .collectList().block()) - .isEmpty(); + .collectList().block()) + .isEmpty(); softly.assertThat(testee.findMailboxWithPathLike(inboxRenamedSearchQuery) - .collectList().block()) - .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) - .assertThat(searchMailbox) - .isEqualTo(inboxRenamed)); + .collectList().block()) + .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) + .assertThat(searchMailbox) + .isEqualTo(inboxRenamed)); softly.assertThat(testee.findMailboxWithPathLike(allMailboxesSearchQuery) - .collectList().block()) - .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) - .assertThat(searchMailbox) - .isEqualTo(inboxRenamed)); + .collectList().block()) + .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) + .assertThat(searchMailbox) + .isEqualTo(inboxRenamed)); })); } @@ -720,9 +728,9 @@ class CassandraMailboxMapperTest { Mailbox inboxRenamed = createInboxRenamedMailbox(inboxId); cassandra.getConf() - .registerScenario(fail() - .times(TRY_COUNT_BEFORE_FAILURE) - .whenQueryStartsWith("DELETE FROM mailboxPathV3 WHERE namespace=:namespace AND user=:user AND mailboxName=:mailboxName IF EXISTS;")); + .registerScenario(fail() + .times(TRY_COUNT_BEFORE_FAILURE) + .whenQueryStartsWith("DELETE FROM mailboxPathV3 WHERE namespace=:namespace AND user=:user AND mailboxName=:mailboxName IF EXISTS;")); doQuietly(() -> testee.rename(inboxRenamed).block()); @@ -730,25 +738,25 @@ class CassandraMailboxMapperTest { SoftAssertions.assertSoftly(Throwing.consumer(softly -> { softly(softly) - .assertThat(testee.findMailboxById(inboxId).block()) - .isEqualTo(inboxRenamed); + .assertThat(testee.findMailboxById(inboxId).block()) + .isEqualTo(inboxRenamed); softly(softly) - .assertThat(testee.findMailboxByPath(inboxPathRenamed).block()) - .isEqualTo(inboxRenamed); + .assertThat(testee.findMailboxByPath(inboxPathRenamed).block()) + .isEqualTo(inboxRenamed); softly.assertThat(testee.findMailboxWithPathLike(inboxSearchQuery) - .collectList().block()) - .isEmpty(); + .collectList().block()) + .isEmpty(); softly.assertThat(testee.findMailboxWithPathLike(inboxRenamedSearchQuery) - .collectList().block()) - .hasOnlyOneElementSatisfying(searchMailbox -> - softly(softly) - .assertThat(searchMailbox) - .isEqualTo(inboxRenamed)); + .collectList().block()) + .hasOnlyOneElementSatisfying(searchMailbox -> + softly(softly) + .assertThat(searchMailbox) + .isEqualTo(inboxRenamed)); softly.assertThat(testee.findMailboxWithPathLike(allMailboxesSearchQuery) - .collectList().block()) - .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) - .assertThat(searchMailbox) - .isEqualTo(inboxRenamed)); + .collectList().block()) + .hasOnlyOneElementSatisfying(searchMailbox -> softly(softly) + .assertThat(searchMailbox) + .isEqualTo(inboxRenamed)); })); } @@ -773,10 +781,10 @@ class CassandraMailboxMapperTest { Mailbox newMailbox = new Mailbox(tooLongMailboxPath(mailbox.generateAssociatedPath()), UID_VALIDITY, mailbox.getMailboxId()); assertThatThrownBy(() -> testee.rename(newMailbox).block()) - .isInstanceOf(TooLongMailboxNameException.class); + .isInstanceOf(TooLongMailboxNameException.class); assertThat(mailboxPathV3DAO.retrieve(MAILBOX_PATH).blockOptional()) - .isPresent(); + .isPresent(); } private MailboxPath tooLongMailboxPath(MailboxPath fromMailboxPath) { @@ -789,72 +797,72 @@ class CassandraMailboxMapperTest { void setUp() { // Read repairs are not supported accross schema versions... setUpTestee(CassandraConfiguration.builder() - .mailboxReadRepair(0f) - .build()); + .mailboxReadRepair(0f) + .build()); } @Test void deleteShouldDeleteMailboxAndMailboxPathFromV1Table() { mailboxDAO.save(MAILBOX) - .block(); + .block(); mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID) - .block(); + .block(); testee.delete(MAILBOX).block(); assertThat(testee.findMailboxByPath(MAILBOX_PATH).blockOptional()) - .isEmpty(); + .isEmpty(); } @Test void deleteShouldDeleteMailboxAndMailboxPathFromV2Table() { mailboxDAO.save(MAILBOX) - .block(); + .block(); mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID) - .block(); + .block(); testee.delete(MAILBOX).block(); assertThat(testee.findMailboxByPath(MAILBOX_PATH).blockOptional()) - .isEmpty(); + .isEmpty(); } @Test void deleteShouldDeleteMailboxAndMailboxPathFromV3Table() { mailboxDAO.save(MAILBOX) - .block(); + .block(); mailboxPathV3DAO.save(MAILBOX) - .block(); + .block(); testee.delete(MAILBOX).block(); assertThat(testee.findMailboxByPath(MAILBOX_PATH).blockOptional()) - .isEmpty(); + .isEmpty(); } @Test void deleteShouldDeleteMailboxAndMailboxPathFromAllTables() { mailboxDAO.save(MAILBOX) - .block(); + .block(); mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID) - .block(); + .block(); mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID) - .block(); + .block(); mailboxPathV3DAO.save(MAILBOX) - .block(); + .block(); testee.delete(MAILBOX).block(); assertThat(testee.findMailboxByPath(MAILBOX_PATH).blockOptional()) - .isEmpty(); + .isEmpty(); } @Test void findMailboxByPathShouldReturnMailboxWhenExistsInV1Table() { mailboxDAO.save(MAILBOX) - .block(); + .block(); mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID) - .block(); + .block(); Mailbox mailbox = testee.findMailboxByPath(MAILBOX_PATH).block(); @@ -864,9 +872,9 @@ class CassandraMailboxMapperTest { @Test void findMailboxByPathShouldReturnMailboxWhenExistsInV2Table() { mailboxDAO.save(MAILBOX) - .block(); + .block(); mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID) - .block(); + .block(); Mailbox mailbox = testee.findMailboxByPath(MAILBOX_PATH).block(); @@ -876,9 +884,9 @@ class CassandraMailboxMapperTest { @Test void findMailboxByPathShouldReturnMailboxWhenExistsInV3Table() { mailboxDAO.save(MAILBOX) - .block(); + .block(); mailboxPathV3DAO.save(MAILBOX) - .block(); + .block(); Mailbox mailbox = testee.findMailboxByPath(MAILBOX_PATH).block(); @@ -888,13 +896,13 @@ class CassandraMailboxMapperTest { @Test void findMailboxByPathShouldReturnMailboxWhenExistsInAllTables() { mailboxDAO.save(MAILBOX) - .block(); + .block(); mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID) - .block(); + .block(); mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID) - .block(); + .block(); mailboxPathV3DAO.save(MAILBOX) - .block(); + .block(); Mailbox mailbox = testee.findMailboxByPath(MAILBOX_PATH).block(); @@ -904,69 +912,69 @@ class CassandraMailboxMapperTest { @Test void deleteShouldRemoveMailboxWhenInAllTables() { mailboxDAO.save(MAILBOX) - .block(); + .block(); mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID) - .block(); + .block(); mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID) - .block(); + .block(); mailboxPathV3DAO.save(MAILBOX) - .block(); + .block(); testee.delete(MAILBOX).block(); assertThat(testee.findMailboxByPath(MAILBOX_PATH).blockOptional()) - .isEmpty(); + .isEmpty(); } @Test void deleteShouldRemoveMailboxWhenInV1Tables() { mailboxDAO.save(MAILBOX) - .block(); + .block(); mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID) - .block(); + .block(); testee.delete(MAILBOX).block(); assertThat(testee.findMailboxByPath(MAILBOX_PATH).blockOptional()) - .isEmpty(); + .isEmpty(); } @Test void deleteShouldRemoveMailboxWhenInV2Table() { mailboxDAO.save(MAILBOX) - .block(); + .block(); mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID) - .block(); + .block(); testee.delete(MAILBOX).block(); assertThat(testee.findMailboxByPath(MAILBOX_PATH).blockOptional()) - .isEmpty(); + .isEmpty(); } @Test void findMailboxByPathShouldThrowWhenDoesntExistInBothTables() { mailboxDAO.save(MAILBOX) - .block(); + .block(); assertThat(testee.findMailboxByPath(MAILBOX_PATH).blockOptional()) - .isEmpty(); + .isEmpty(); } @Test void findMailboxWithPathLikeShouldReturnMailboxesWhenExistsInV1Table() { mailboxDAO.save(MAILBOX) - .block(); + .block(); mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID) - .block(); + .block(); List<Mailbox> mailboxes = testee.findMailboxWithPathLike(MailboxQuery.builder() - .privateNamespace() - .username(USER) - .expression(Wildcard.INSTANCE) - .build() - .asUserBound()) - .collectList().block(); + .privateNamespace() + .username(USER) + .expression(Wildcard.INSTANCE) + .build() + .asUserBound()) + .collectList().block(); assertThat(mailboxes).containsOnly(MAILBOX); } @@ -974,19 +982,19 @@ class CassandraMailboxMapperTest { @Test void findMailboxWithPathLikeShouldReturnMailboxesWhenExistsInBothTables() { mailboxDAO.save(MAILBOX) - .block(); + .block(); mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID) - .block(); + .block(); mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID) - .block(); + .block(); List<Mailbox> mailboxes = testee.findMailboxWithPathLike(MailboxQuery.builder() - .privateNamespace() - .username(USER) - .expression(Wildcard.INSTANCE) - .build() - .asUserBound()) - .collectList().block(); + .privateNamespace() + .username(USER) + .expression(Wildcard.INSTANCE) + .build() + .asUserBound()) + .collectList().block(); assertThat(mailboxes).containsOnly(MAILBOX); } @@ -994,17 +1002,17 @@ class CassandraMailboxMapperTest { @Test void findMailboxWithPathLikeShouldReturnMailboxesWhenExistsInV2Table() { mailboxDAO.save(MAILBOX) - .block(); + .block(); mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID) - .block(); + .block(); List<Mailbox> mailboxes = testee.findMailboxWithPathLike(MailboxQuery.builder() - .privateNamespace() - .username(USER) - .expression(Wildcard.INSTANCE) - .build() - .asUserBound()) - .collectList().block(); + .privateNamespace() + .username(USER) + .expression(Wildcard.INSTANCE) + .build() + .asUserBound()) + .collectList().block(); assertThat(mailboxes).containsOnly(MAILBOX); } @@ -1012,18 +1020,18 @@ class CassandraMailboxMapperTest { @Test void findMailboxWithPathLikeShouldReturnMailboxesWhenExistsInV3Table() { mailboxDAO.save(MAILBOX) - .block(); + .block(); mailboxPathV3DAO.save(MAILBOX) - .block(); + .block(); List<Mailbox> mailboxes = testee.findMailboxWithPathLike(MailboxQuery.builder() - .privateNamespace() - .username(USER) - .expression(Wildcard.INSTANCE) - .build() - .asUserBound()) - .collectList() - .block(); + .privateNamespace() + .username(USER) + .expression(Wildcard.INSTANCE) + .build() + .asUserBound()) + .collectList() + .block(); assertThat(mailboxes).containsOnly(MAILBOX); } @@ -1031,16 +1039,16 @@ class CassandraMailboxMapperTest { @Test void hasChildrenShouldReturnChildWhenExistsInV1Table() { mailboxDAO.save(MAILBOX) - .block(); + .block(); mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID) - .block(); + .block(); CassandraId childMailboxId = CassandraId.timeBased(); MailboxPath childMailboxPath = MailboxPath.forUser(USER, "name.child"); Mailbox childMailbox = new Mailbox(childMailboxPath, UID_VALIDITY, childMailboxId); mailboxDAO.save(childMailbox) - .block(); + .block(); mailboxPathDAO.save(childMailboxPath, childMailboxId) - .block(); + .block(); boolean hasChildren = testee.hasChildren(MAILBOX, '.').block(); @@ -1050,18 +1058,18 @@ class CassandraMailboxMapperTest { @Test void hasChildrenShouldReturnChildWhenExistsInBothTables() { mailboxDAO.save(MAILBOX) - .block(); + .block(); mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID) - .block(); + .block(); mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID) - .block(); + .block(); CassandraId childMailboxId = CassandraId.timeBased(); MailboxPath childMailboxPath = MailboxPath.forUser(USER, "name.child"); Mailbox childMailbox = new Mailbox(childMailboxPath, UID_VALIDITY, childMailboxId); mailboxDAO.save(childMailbox) - .block(); + .block(); mailboxPathDAO.save(childMailboxPath, childMailboxId) - .block(); + .block(); boolean hasChildren = testee.hasChildren(MAILBOX, '.').block(); @@ -1071,16 +1079,16 @@ class CassandraMailboxMapperTest { @Test void hasChildrenShouldReturnChildWhenExistsInV2Table() { mailboxDAO.save(MAILBOX) - .block(); + .block(); mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID) - .block(); + .block(); CassandraId childMailboxId = CassandraId.timeBased(); MailboxPath childMailboxPath = MailboxPath.forUser(USER, "name.child"); Mailbox childMailbox = new Mailbox(childMailboxPath, UID_VALIDITY, childMailboxId); mailboxDAO.save(childMailbox) - .block(); + .block(); mailboxPathV2DAO.save(childMailboxPath, childMailboxId) - .block(); + .block(); boolean hasChildren = testee.hasChildren(MAILBOX, '.').block(); @@ -1090,16 +1098,16 @@ class CassandraMailboxMapperTest { @Test void hasChildrenShouldReturnChildWhenExistsInV3Table() { mailboxDAO.save(MAILBOX) - .block(); + .block(); mailboxPathV3DAO.save(MAILBOX) - .block(); + .block(); CassandraId childMailboxId = CassandraId.timeBased(); MailboxPath childMailboxPath = MailboxPath.forUser(USER, "name.child"); Mailbox childMailbox = new Mailbox(childMailboxPath, UID_VALIDITY, childMailboxId); mailboxDAO.save(childMailbox) - .block(); + .block(); mailboxPathV3DAO.save(childMailbox) - .block(); + .block(); boolean hasChildren = testee.hasChildren(MAILBOX, '.').block(); @@ -1115,14 +1123,14 @@ class CassandraMailboxMapperTest { 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); + MailboxQuery.builder() + .privateNamespace() + .username(USER) + .expression(Wildcard.INSTANCE) + .build() + .asUserBound()) + .collectList().block()) + .containsOnly(MAILBOX); } } } diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java index d031a38..48d2a66 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java @@ -32,6 +32,7 @@ import org.apache.james.backends.cassandra.CassandraClusterExtension; import org.apache.james.backends.cassandra.StatementRecorder; import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration; import org.apache.james.core.Username; +import org.apache.james.junit.categories.Unstable; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.MailboxSessionUtil; import org.apache.james.mailbox.MessageManager; @@ -46,6 +47,7 @@ import org.apache.james.mailbox.store.mail.model.MessageIdMapperTest; import org.apache.james.util.streams.Limit; import org.assertj.core.api.SoftAssertions; import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -90,6 +92,14 @@ class CassandraMessageIdMapperTest extends MessageIdMapperTest { } @Test + @Tag(Unstable.TAG) + /* + https://builds.apache.org/blue/organizations/jenkins/james%2FApacheJames/detail/PR-264/5/tests + Error + Could not send request, session is closed + Stacktrace + java.lang.IllegalStateException: Could not send request, session is closed + */ void setFlagsShouldMinimizeMessageReads(CassandraCluster cassandra) throws Exception { CassandraMessageId.Factory messageIdFactory = new CassandraMessageId.Factory(); CassandraMailboxSessionMapperFactory mapperFactory = TestCassandraMailboxSessionMapperFactory.forTests( diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesServiceTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesServiceTest.java index 4282efa..881822f 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesServiceTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesServiceTest.java @@ -32,6 +32,7 @@ import org.apache.james.backends.cassandra.CassandraClusterExtension; import org.apache.james.backends.cassandra.Scenario; import org.apache.james.backends.cassandra.components.CassandraModule; import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule; +import org.apache.james.junit.categories.Unstable; import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.ModSeq; import org.apache.james.mailbox.cassandra.ids.CassandraId; @@ -47,6 +48,7 @@ import org.apache.james.task.Task; import org.assertj.core.api.SoftAssertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -638,7 +640,16 @@ public class SolveMessageInconsistenciesServiceTest { .build()); } + /* + Error + Cassandra timeout during SIMPLE write query at consistency QUORUM (1 replica were required but only 0 acknowledged the write) + Stacktrace + com.datastax.driver.core.exceptions.WriteTimeoutException: Cassandra timeout during SIMPLE write query at consistency QUORUM (1 replica were required but only 0 acknowledged the write) + Caused by: com.datastax.driver.core.exceptions.WriteTimeoutException: Cassandra timeout during SIMPLE write query at consistency QUORUM (1 replica were required but only 0 acknowledged the write) + https://builds.apache.org/blue/organizations/jenkins/james%2FApacheJames/detail/PR-268/39/tests + */ @Test + @Tag(Unstable.TAG) void fixMailboxInconsistenciesShouldUpdateContextWhenDeleteError(CassandraCluster cassandra) { Context context = new Context(); diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperACLTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperACLTest.java index 2725022..f3e1382 100644 --- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperACLTest.java +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperACLTest.java @@ -156,7 +156,7 @@ public abstract class MailboxMapperACLTest { } @Test - void updateAclShouldCombineStoredAclWhenAdd() { + protected void updateAclShouldCombineStoredAclWhenAdd() { EntryKey key = EntryKey.createUserEntryKey(USER); Rfc4314Rights rights = new Rfc4314Rights(Right.Administer, Right.PerformExpunge, Right.Write, Right.WriteSeenFlag); Rfc4314Rights newRights = new Rfc4314Rights(Right.WriteSeenFlag, Right.CreateMailbox, Right.Administer, Right.PerformExpunge, Right.DeleteMessages); diff --git a/metrics/metrics-tests/src/test/java/org/apache/james/metrics/tests/RecordingMetricFactoryTest.java b/metrics/metrics-tests/src/test/java/org/apache/james/metrics/tests/RecordingMetricFactoryTest.java index b8d001f..0afd5be 100644 --- a/metrics/metrics-tests/src/test/java/org/apache/james/metrics/tests/RecordingMetricFactoryTest.java +++ b/metrics/metrics-tests/src/test/java/org/apache/james/metrics/tests/RecordingMetricFactoryTest.java @@ -25,6 +25,7 @@ import java.time.Duration; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; +import org.apache.james.junit.categories.Unstable; import org.apache.james.metrics.api.Metric; import org.apache.james.metrics.api.MetricFactory; import org.apache.james.metrics.api.MetricFactoryContract; @@ -33,6 +34,7 @@ import org.apache.james.util.concurrency.ConcurrentTestRunner; import org.awaitility.Awaitility; import org.awaitility.core.ConditionFactory; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import reactor.core.publisher.Mono; @@ -126,6 +128,7 @@ class RecordingMetricFactoryTest implements MetricFactoryContract { } @Test + @Tag(Unstable.TAG) void decoratePublisherWithTimerMetricShouldRecordANewValueForEachRetry() { Duration duration = Duration.ofMillis(100); Mono.from(testee.decoratePublisherWithTimerMetric("any", Mono.delay(duration))) @@ -139,6 +142,7 @@ class RecordingMetricFactoryTest implements MetricFactoryContract { } @Test + @Tag(Unstable.TAG) void decoratePublisherWithTimerMetricLogP99ShouldRecordANewValueForEachRetry() { Duration duration = Duration.ofMillis(100); Mono.from(testee.decoratePublisherWithTimerMetricLogP99("any", Mono.delay(duration))) diff --git a/server/container/guice/guice-common/src/test/java/org/apache/james/MailsShouldBeWellReceived.java b/server/container/guice/guice-common/src/test/java/org/apache/james/MailsShouldBeWellReceived.java index 98c910a..4834cc9 100644 --- a/server/container/guice/guice-common/src/test/java/org/apache/james/MailsShouldBeWellReceived.java +++ b/server/container/guice/guice-common/src/test/java/org/apache/james/MailsShouldBeWellReceived.java @@ -36,6 +36,7 @@ import javax.mail.internet.MimeMessage; import javax.mail.search.FlagTerm; import org.apache.james.core.Domain; +import org.apache.james.junit.categories.Unstable; import org.apache.james.mailbox.DefaultMailboxes; import org.apache.james.modules.MailboxProbeImpl; import org.apache.james.modules.protocols.ImapGuiceProbe; @@ -49,6 +50,7 @@ import org.apache.james.utils.TestIMAPClient; import org.apache.mailet.base.test.FakeMail; import org.awaitility.Awaitility; import org.awaitility.core.ConditionFactory; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import com.github.fge.lambdas.Throwing; @@ -82,6 +84,10 @@ interface MailsShouldBeWellReceived { } @Test + @Tag(Unstable.TAG) + /* + Condition with lambda expression in org.apache.james.MailsShouldBeWellReceived that uses org.apache.james.GuiceJamesServer was not fulfilled within 10 seconds. + */ default void mailsContentWithUnicodeCharactersShouldBeKeptUnChanged(GuiceJamesServer server) throws Exception { server.getProbe(DataProbeImpl.class).fluent() .addDomain(DOMAIN) diff --git a/server/protocols/jmap-draft-integration-testing/memory-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/memory/MemorySpamAssassinContractTest.java b/server/protocols/jmap-draft-integration-testing/memory-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/memory/MemorySpamAssassinContractTest.java index 7298fcf..a0f3afe 100644 --- a/server/protocols/jmap-draft-integration-testing/memory-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/memory/MemorySpamAssassinContractTest.java +++ b/server/protocols/jmap-draft-integration-testing/memory-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/memory/MemorySpamAssassinContractTest.java @@ -18,12 +18,16 @@ ****************************************************************/ package org.apache.james.jmap.memory; +import org.apache.james.GuiceJamesServer; import org.apache.james.JamesServerBuilder; import org.apache.james.JamesServerExtension; import org.apache.james.MemoryJamesServerMain; import org.apache.james.jmap.draft.methods.integration.SpamAssassinContract; import org.apache.james.jmap.draft.methods.integration.SpamAssassinModuleExtension; +import org.apache.james.junit.categories.Unstable; import org.apache.james.modules.TestJMAPServerModule; +import org.apache.james.spamassassin.SpamAssassinExtension; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.extension.RegisterExtension; class MemorySpamAssassinContractTest implements SpamAssassinContract { @@ -33,4 +37,46 @@ class MemorySpamAssassinContractTest implements SpamAssassinContract { .server(configuration -> MemoryJamesServerMain.createServer(configuration) .overrideWith(new TestJMAPServerModule())) .build(); + + @Override + @Tag(Unstable.TAG) + public void spamShouldBeDeliveredInSpamMailboxWhenSameMessageHasAlreadyBeenMovedToSpam(GuiceJamesServer jamesServer, SpamAssassinExtension.SpamAssassin spamAssassin) throws Exception { + SpamAssassinContract.super.spamShouldBeDeliveredInSpamMailboxWhenSameMessageHasAlreadyBeenMovedToSpam(jamesServer, spamAssassin); + } + + @Override + @Tag(Unstable.TAG) + public void spamShouldBeDeliveredInSpamMailboxOrInboxWhenMultipleRecipientsConfigurations(GuiceJamesServer jamesServer, SpamAssassinExtension.SpamAssassin spamAssassin) throws Exception { + SpamAssassinContract.super.spamShouldBeDeliveredInSpamMailboxOrInboxWhenMultipleRecipientsConfigurations(jamesServer, spamAssassin); + } + + @Override + @Tag(Unstable.TAG) + public void movingAMailToTrashShouldNotImpactSpamassassinLearning(GuiceJamesServer jamesServer, SpamAssassinExtension.SpamAssassin spamAssassin) throws Exception { + SpamAssassinContract.super.movingAMailToTrashShouldNotImpactSpamassassinLearning(jamesServer, spamAssassin); + } + + @Override + @Tag(Unstable.TAG) + public void expungingSpamMessageShouldNotImpactSpamAssassinState(GuiceJamesServer jamesServer, SpamAssassinExtension.SpamAssassin spamAssassin) throws Exception { + SpamAssassinContract.super.expungingSpamMessageShouldNotImpactSpamAssassinState(jamesServer, spamAssassin); + } + + @Override + @Tag(Unstable.TAG) + public void imapMovesToSpamMailboxShouldBeConsideredAsSpam(GuiceJamesServer jamesServer, SpamAssassinExtension.SpamAssassin spamAssassin) throws Exception { + SpamAssassinContract.super.imapMovesToSpamMailboxShouldBeConsideredAsSpam(jamesServer, spamAssassin); + } + + @Override + @Tag(Unstable.TAG) + public void imapCopiesToSpamMailboxShouldBeConsideredAsSpam(GuiceJamesServer jamesServer, SpamAssassinExtension.SpamAssassin spamAssassin) throws Exception { + SpamAssassinContract.super.imapCopiesToSpamMailboxShouldBeConsideredAsSpam(jamesServer, spamAssassin); + } + + @Override + @Tag(Unstable.TAG) + public void deletingSpamMessageShouldNotImpactSpamAssassinState(GuiceJamesServer jamesServer, SpamAssassinExtension.SpamAssassin spamAssassin) throws Exception { + SpamAssassinContract.super.deletingSpamMessageShouldNotImpactSpamAssassinState(jamesServer, spamAssassin); + } } diff --git a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/pom.xml b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/pom.xml index 7cdd223..29e4ec5 100644 --- a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/pom.xml +++ b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/pom.xml @@ -165,6 +165,7 @@ <!-- Fail tests longer than 20 minutes, prevent form random locking tests --> <forkedProcessTimeoutInSeconds>1200</forkedProcessTimeoutInSeconds> <groups combine.self="override">org.apache.james.junit.categories.BasicFeature,org.apache.james.jmap.categories.EnableCucumber</groups> + <excludedGroups>org.apache.james.junit.categories.Unstable</excludedGroups> </configuration> </plugin> </plugins> @@ -181,7 +182,7 @@ <version>2.22.2</version> <configuration> <excludedGroups></excludedGroups> - <groups combine.self="override">unstable</groups> + <groups combine.self="override">org.apache.james.junit.categories.Unstable</groups> </configuration> </plugin> </plugins> diff --git a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3JmapAuthenticationTest.java b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3JmapAuthenticationTest.java index 86857c8..8bfbfea 100644 --- a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3JmapAuthenticationTest.java +++ b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3JmapAuthenticationTest.java @@ -25,9 +25,12 @@ import org.apache.james.DockerCassandraRule; import org.apache.james.GuiceJamesServer; import org.apache.james.jmap.FixedDateZonedDateTimeProvider; import org.apache.james.jmap.JMAPAuthenticationTest; +import org.apache.james.junit.categories.Unstable; import org.apache.james.util.date.ZonedDateTimeProvider; import org.junit.Rule; +import org.junit.experimental.categories.Category; +@Category(Unstable.class) public class RabbitMQAwsS3JmapAuthenticationTest extends JMAPAuthenticationTest { @Rule diff --git a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SetMailboxesMethodTest.java b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SetMailboxesMethodTest.java index 7450656..4392b89 100644 --- a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SetMailboxesMethodTest.java +++ b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SetMailboxesMethodTest.java @@ -25,8 +25,11 @@ import org.apache.james.CassandraRabbitMQAwsS3JmapTestRule; import org.apache.james.DockerCassandraRule; import org.apache.james.GuiceJamesServer; import org.apache.james.jmap.draft.methods.integration.SetMailboxesMethodTest; +import org.apache.james.junit.categories.Unstable; import org.junit.Rule; +import org.junit.experimental.categories.Category; +@Category(Unstable.class) public class RabbitMQAwsS3SetMailboxesMethodTest extends SetMailboxesMethodTest { @Rule public DockerCassandraRule cassandra = new DockerCassandraRule(); diff --git a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQDownloadCucumberTest.java b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQDownloadCucumberTest.java index edc3842..cbab08f 100644 --- a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQDownloadCucumberTest.java +++ b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQDownloadCucumberTest.java @@ -20,6 +20,7 @@ package org.apache.james.jmap.rabbitmq.cucumber.awss3; import org.apache.james.jmap.categories.EnableCucumber; +import org.apache.james.junit.categories.Unstable; import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; @@ -31,6 +32,6 @@ import cucumber.api.junit.Cucumber; glue = {"org.apache.james.jmap.draft.methods.integration", "org.apache.james.jmap.rabbitmq.cucumber.awss3"}, tags = {"not @Ignore", "@BasicFeature"}, strict = true) -@Category(EnableCucumber.class) +@Category({EnableCucumber.class, Unstable.class}) public class RabbitMQDownloadCucumberTest { } diff --git a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQGetMessagesMethodTest.java b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQGetMessagesMethodTest.java index faf7374..9ecab7d 100644 --- a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQGetMessagesMethodTest.java +++ b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQGetMessagesMethodTest.java @@ -20,6 +20,7 @@ package org.apache.james.jmap.rabbitmq.cucumber.awss3; import org.apache.james.jmap.categories.EnableCucumber; +import org.apache.james.junit.categories.Unstable; import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; @@ -31,6 +32,6 @@ import cucumber.api.junit.Cucumber; glue = {"org.apache.james.jmap.draft.methods.integration", "org.apache.james.jmap.rabbitmq.cucumber.awss3"}, tags = {"not @Ignore", "@BasicFeature"}, strict = true) -@Category(EnableCucumber.class) +@Category({EnableCucumber.class, Unstable.class}) public class RabbitMQGetMessagesMethodTest { } diff --git a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQMailboxSharingTest.java b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQMailboxSharingTest.java index 4fce27a..46efe3f 100644 --- a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQMailboxSharingTest.java +++ b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQMailboxSharingTest.java @@ -20,6 +20,7 @@ package org.apache.james.jmap.rabbitmq.cucumber.awss3; import org.apache.james.jmap.categories.EnableCucumber; +import org.apache.james.junit.categories.Unstable; import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; @@ -38,6 +39,6 @@ import cucumber.api.junit.Cucumber; glue = { "org.apache.james.jmap.draft.methods.integration", "org.apache.james.jmap.rabbitmq.cucumber.awss3" }, tags = {"not @Ignore", "@BasicFeature"}, strict = true) -@Category(EnableCucumber.class) +@Category({EnableCucumber.class, Unstable.class}) public class RabbitMQMailboxSharingTest { } diff --git a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQMessageSharingTest.java b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQMessageSharingTest.java index 9dc7fb2..e169391 100644 --- a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQMessageSharingTest.java +++ b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQMessageSharingTest.java @@ -20,6 +20,7 @@ package org.apache.james.jmap.rabbitmq.cucumber.awss3; import org.apache.james.jmap.categories.EnableCucumber; +import org.apache.james.junit.categories.Unstable; import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; @@ -39,6 +40,6 @@ import cucumber.api.junit.Cucumber; glue = { "org.apache.james.jmap.draft.methods.integration", "org.apache.james.jmap.rabbitmq.cucumber.awss3" }, tags = {"not @Ignore", "@BasicFeature"}, strict = true) -@Category(EnableCucumber.class) +@Category({EnableCucumber.class, Unstable.class}) public class RabbitMQMessageSharingTest { -} +} \ No newline at end of file diff --git a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQSetMailboxesMethodCucumberTest.java b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQSetMailboxesMethodCucumberTest.java index 8afa80b..32191e6 100644 --- a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQSetMailboxesMethodCucumberTest.java +++ b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQSetMailboxesMethodCucumberTest.java @@ -20,6 +20,7 @@ package org.apache.james.jmap.rabbitmq.cucumber.awss3; import org.apache.james.jmap.categories.EnableCucumber; +import org.apache.james.junit.categories.Unstable; import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; @@ -31,6 +32,6 @@ import cucumber.api.junit.Cucumber; glue = { "org.apache.james.jmap.draft.methods.integration", "org.apache.james.jmap.rabbitmq.cucumber.awss3" }, tags = {"not @Ignore", "@BasicFeature"}, strict = true) -@Category(EnableCucumber.class) +@Category({EnableCucumber.class, Unstable.class}) public class RabbitMQSetMailboxesMethodCucumberTest { } diff --git a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQSetMessagesMethodCucumberTest.java b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQSetMessagesMethodCucumberTest.java index 481f1b8..774957a 100644 --- a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQSetMessagesMethodCucumberTest.java +++ b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQSetMessagesMethodCucumberTest.java @@ -20,6 +20,7 @@ package org.apache.james.jmap.rabbitmq.cucumber.awss3; import org.apache.james.jmap.categories.EnableCucumber; +import org.apache.james.junit.categories.Unstable; import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; @@ -31,6 +32,6 @@ import cucumber.api.junit.Cucumber; glue = {"org.apache.james.jmap.draft.methods.integration", "org.apache.james.jmap.rabbitmq.cucumber.awss3"}, tags = {"not @Ignore", "@BasicFeature"}, strict = true) -@Category(EnableCucumber.class) +@Category({EnableCucumber.class, Unstable.class}) public class RabbitMQSetMessagesMethodCucumberTest { } diff --git a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQUploadCucumberTest.java b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQUploadCucumberTest.java index 8324ef4..73d780f 100644 --- a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQUploadCucumberTest.java +++ b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQUploadCucumberTest.java @@ -20,6 +20,7 @@ package org.apache.james.jmap.rabbitmq.cucumber.awss3; import org.apache.james.jmap.categories.EnableCucumber; +import org.apache.james.junit.categories.Unstable; import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; @@ -31,6 +32,6 @@ import cucumber.api.junit.Cucumber; glue = {"org.apache.james.jmap.draft.methods.integration", "org.apache.james.jmap.rabbitmq.cucumber.awss3"}, tags = {"not @Ignore", "@BasicFeature"}, strict = true) -@Category(EnableCucumber.class) +@Category({EnableCucumber.class, Unstable.class}) public class RabbitMQUploadCucumberTest { } diff --git a/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEmailQueryMethodNoViewTest.java b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEmailQueryMethodNoViewTest.java index 8cbe04a..6e9ed34 100644 --- a/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEmailQueryMethodNoViewTest.java +++ b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEmailQueryMethodNoViewTest.java @@ -26,8 +26,10 @@ import org.apache.james.JamesServerBuilder; import org.apache.james.JamesServerExtension; import org.apache.james.jmap.JMAPConfiguration; import org.apache.james.jmap.rfc8621.contract.EmailQueryMethodContract; +import org.apache.james.junit.categories.Unstable; import org.apache.james.modules.TestJMAPServerModule; import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -55,4 +57,18 @@ public class MemoryEmailQueryMethodNoViewTest implements EmailQueryMethodContrac @Disabled("JAMES-3377 Not supported for in-memory test" + "In memory do not attempt message parsing a performs a full match on the raw message content") public void emailQueryFilterByTextShouldIgnoreAttachmentContent(GuiceJamesServer server) {} + + @Override + @Tag(Unstable.TAG) + public void shouldListMailsReceivedBeforeADate(GuiceJamesServer server) { + EmailQueryMethodContract.super.shouldListMailsReceivedBeforeADate(server); + } + + @Override + @Tag(Unstable.TAG) + public void shouldListMailsReceivedAfterADate(GuiceJamesServer server) { + EmailQueryMethodContract.super.shouldListMailsReceivedAfterADate(server); + } + + } diff --git a/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEmailQueryMethodTest.java b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEmailQueryMethodTest.java index 9782f60..99116a9 100644 --- a/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEmailQueryMethodTest.java +++ b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEmailQueryMethodTest.java @@ -25,8 +25,10 @@ import org.apache.james.GuiceJamesServer; import org.apache.james.JamesServerBuilder; import org.apache.james.JamesServerExtension; import org.apache.james.jmap.rfc8621.contract.EmailQueryMethodContract; +import org.apache.james.junit.categories.Unstable; import org.apache.james.modules.TestJMAPServerModule; import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -48,4 +50,17 @@ public class MemoryEmailQueryMethodTest implements EmailQueryMethodContract { @Disabled("JAMES-3377 Not supported for in-memory test" + "In memory do not attempt message parsing a performs a full match on the raw message content") public void emailQueryFilterByTextShouldIgnoreAttachmentContent(GuiceJamesServer server) {} + + @Override + @Tag(Unstable.TAG) + public void shouldListMailsReceivedBeforeADate(GuiceJamesServer server) { + EmailQueryMethodContract.super.shouldListMailsReceivedBeforeADate(server); + } + + @Override + @Tag(Unstable.TAG) + public void shouldListMailsReceivedAfterADate(GuiceJamesServer server) { + EmailQueryMethodContract.super.shouldListMailsReceivedAfterADate(server); + } + } diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/FixingGhostMailboxTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/FixingGhostMailboxTest.java index 83ed90a..fce1e7d 100644 --- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/FixingGhostMailboxTest.java +++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/FixingGhostMailboxTest.java @@ -58,6 +58,7 @@ import org.apache.james.core.Username; import org.apache.james.jmap.AccessToken; import org.apache.james.jmap.draft.JmapGuiceProbe; import org.apache.james.junit.categories.BasicFeature; +import org.apache.james.junit.categories.Unstable; import org.apache.james.mailbox.MessageManager.AppendCommand; import org.apache.james.mailbox.cassandra.mail.task.MailboxMergingTask; import org.apache.james.mailbox.cassandra.table.CassandraMailboxPathV3Table; @@ -241,7 +242,16 @@ class FixingGhostMailboxTest { .body(ARGUMENTS + ".messageIds", contains(message2.getMessageId().serialize()))); } + + /* + * 1 expectation failed. + * JSON path [0][1].messageIds doesn't match. + * Expected: a collection with size <2> + * Actual: [95b42310-47b7-11eb-90b1-f5389ace5056] + * https://builds.apache.org/blue/organizations/jenkins/james%2FApacheJames/detail/PR-268/44/tests + */ @Test + @Tag(Unstable.TAG) void webadminCanMergeTwoMailboxes() { MailboxId newAliceInbox = mailboxProbe.getMailboxId(MailboxConstants.USER_NAMESPACE, ALICE, MailboxConstants.INBOX); diff --git a/server/testing/src/main/java/org/apache/james/junit/categories/Unstable.java b/testing/base/src/main/java/org/apache/james/junit/categories/Unstable.java similarity index 100% rename from server/testing/src/main/java/org/apache/james/junit/categories/Unstable.java rename to testing/base/src/main/java/org/apache/james/junit/categories/Unstable.java diff --git a/third-party/spamassassin/src/test/java/org/apache/james/spamassassin/SpamAssassinInvokerTest.java b/third-party/spamassassin/src/test/java/org/apache/james/spamassassin/SpamAssassinInvokerTest.java index eee554c..caad9a7 100644 --- a/third-party/spamassassin/src/test/java/org/apache/james/spamassassin/SpamAssassinInvokerTest.java +++ b/third-party/spamassassin/src/test/java/org/apache/james/spamassassin/SpamAssassinInvokerTest.java @@ -26,6 +26,7 @@ import java.nio.charset.StandardCharsets; import javax.mail.internet.MimeMessage; import org.apache.james.core.Username; +import org.apache.james.junit.categories.Unstable; import org.apache.james.metrics.tests.RecordingMetricFactory; import org.apache.james.spamassassin.SpamAssassinExtension.SpamAssassin; import org.apache.james.util.MimeMessageUtil; @@ -33,10 +34,12 @@ import org.apache.mailet.Attribute; import org.apache.mailet.AttributeValue; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @ExtendWith(SpamAssassinExtension.class) +@Tag(Unstable.TAG) public class SpamAssassinInvokerTest { public static final Username USERNAME = Username.of("any@james"); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
