You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2020/06/24 10:57:20 UTC
[james-project] 05/07: JAMES-3177 Add tests to demonstrate
SelectedMailboxImpl is not thread safe
This is an automated email from the ASF dual-hosted git repository.
btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 819bf96bb28604a0dfca559d2aa606cdc6f31e5f
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Jun 24 09:18:29 2020 +0700
JAMES-3177 Add tests to demonstrate SelectedMailboxImpl is not thread safe
---
.../processor/base/SelectedMailboxImplTest.java | 60 ++++++++++++++++++++--
1 file changed, 56 insertions(+), 4 deletions(-)
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java
index 1e0cd54..b62b654 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java
@@ -43,6 +43,7 @@ import org.apache.james.mailbox.MailboxSessionUtil;
import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.MessageUid;
import org.apache.james.mailbox.ModSeq;
+import org.apache.james.mailbox.events.Event;
import org.apache.james.mailbox.events.EventBus;
import org.apache.james.mailbox.events.MailboxIdRegistrationKey;
import org.apache.james.mailbox.events.MailboxListener;
@@ -52,11 +53,13 @@ import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.model.MessageMetaData;
import org.apache.james.mailbox.model.SearchQuery;
import org.apache.james.mailbox.model.TestId;
+import org.apache.james.mailbox.model.UpdatedFlags;
import org.apache.james.mailbox.store.event.EventFactory;
import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
import org.apache.james.util.concurrent.NamedThreadFactory;
import org.junit.After;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.mockito.stubbing.Answer;
import org.slf4j.Logger;
@@ -71,6 +74,7 @@ public class SelectedMailboxImplTest {
private static final MessageUid EMITTED_EVENT_UID = MessageUid.of(5);
private static final ModSeq MOD_SEQ = ModSeq.of(12);
private static final int SIZE = 38;
+ private static final String CUSTOM_FLAG = "custom";
private ExecutorService executorService;
private MailboxManager mailboxManager;
@@ -129,6 +133,32 @@ public class SelectedMailboxImplTest {
assertThat(selectedMailbox.getLastUid().get()).isEqualTo(EMITTED_EVENT_UID);
}
+ @Ignore("JAMES-3177 SelectedMailboxImpl is not thread safe")
+ @Test
+ public void customFlagsEventShouldNotFailWhenConcurrentWithCreation() throws Exception {
+ AtomicInteger successCount = new AtomicInteger(0);
+ doAnswer(generateEmitCustomFlagEventAnswer(successCount))
+ .when(eventBus)
+ .register(any(MailboxListener.class), eq(mailboxIdRegistrationKey));
+
+ new SelectedMailboxImpl(mailboxManager, eventBus, imapSession, messageManager);
+
+ assertThat(successCount.get()).isEqualTo(1);
+ }
+
+ @Ignore("JAMES-3177 SelectedMailboxImpl is not thread safe")
+ @Test
+ public void applicableFlagsShouldBeWellUpdatedWhenConcurrentWithCreation() throws Exception {
+ AtomicInteger successCount = new AtomicInteger(0);
+ doAnswer(generateEmitCustomFlagEventAnswer(successCount))
+ .when(eventBus)
+ .register(any(MailboxListener.class), eq(mailboxIdRegistrationKey));
+
+ SelectedMailboxImpl selectedMailbox = new SelectedMailboxImpl(mailboxManager, eventBus, imapSession, messageManager);
+
+ assertThat(selectedMailbox.getApplicableFlags().getUserFlags()).containsOnly(CUSTOM_FLAG);
+ }
+
@Test
public void concurrentEventShouldBeProcessedSuccessfullyDuringInitialisation() throws Exception {
AtomicInteger successCount = new AtomicInteger(0);
@@ -155,12 +185,20 @@ public class SelectedMailboxImplTest {
}
private Answer<Mono<Registration>> generateEmitEventAnswer(AtomicInteger success) {
+ return generateEmitEventAnswer(event(), success);
+ }
+
+ private Answer<Mono<Registration>> generateEmitCustomFlagEventAnswer(AtomicInteger success) {
+ return generateEmitEventAnswer(customFlagEvent(), success);
+ }
+
+ private Answer<Mono<Registration>> generateEmitEventAnswer(Event event, AtomicInteger success) {
return invocation -> {
Object[] args = invocation.getArguments();
MailboxListener mailboxListener = (MailboxListener) args[0];
executorService.submit(() -> {
try {
- emitEvent(mailboxListener);
+ mailboxListener.event(event);
success.incrementAndGet();
} catch (Exception e) {
LOGGER.error("Error while processing event on a concurrent thread", e);
@@ -170,12 +208,26 @@ public class SelectedMailboxImplTest {
};
}
- private void emitEvent(MailboxListener mailboxListener) throws Exception {
- mailboxListener.event(EventFactory.added()
+ private Event event() {
+ return EventFactory.added()
.randomEventId()
.mailboxSession(MailboxSessionUtil.create(Username.of("user")))
.mailbox(mailbox)
.addMetaData(new MessageMetaData(EMITTED_EVENT_UID, MOD_SEQ, new Flags(), SIZE, new Date(), new DefaultMessageId()))
- .build());
+ .build();
+ }
+
+ private Event customFlagEvent() {
+ return EventFactory.flagsUpdated()
+ .randomEventId()
+ .mailboxSession(MailboxSessionUtil.create(Username.of("user")))
+ .mailbox(mailbox)
+ .updatedFlag(UpdatedFlags.builder()
+ .modSeq(ModSeq.of(36))
+ .newFlags(new Flags(CUSTOM_FLAG))
+ .oldFlags(new Flags())
+ .uid(MessageUid.of(12))
+ .build())
+ .build();
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org