JAMES-1888: Add more testing on MessageIdManager with different user sessions.
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/81832aed Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/81832aed Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/81832aed Branch: refs/heads/master Commit: 81832aed62b571e454f76e35fa65d7cc00a7999e Parents: cc8bac6 Author: Quynh Nguyen <qngu...@linagora.com> Authored: Mon Dec 19 16:39:51 2016 +0700 Committer: Quynh Nguyen <qngu...@linagora.com> Committed: Wed Dec 21 09:08:18 2016 +0700 ---------------------------------------------------------------------- .../CassandraMessageIdManagerTestSystem.java | 8 +- .../inmemory/InMemoryMessageIdManager.java | 142 +++++++++++++------ .../mailbox/store/StoreMailboxManager.java | 3 - .../mailbox/store/StoreMessageIdManager.java | 60 +++++++- .../mailbox/store/StoreMessageManager.java | 4 +- .../AbstractMessageIdManagerSideEffectTest.java | 3 +- .../AbstractMessageIdManagerStorageTest.java | 131 ++++++++++++++++- .../store/StoreMessageIdManagerTestSystem.java | 4 +- 8 files changed, 300 insertions(+), 55 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/81832aed/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerTestSystem.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerTestSystem.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerTestSystem.java index 41749ed..fcbdca3 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerTestSystem.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerTestSystem.java @@ -104,16 +104,18 @@ public class CassandraMessageIdManagerTestSystem extends MessageIdManagerTestSys SimpleMailbox mailbox1 = new SimpleMailbox(new MailboxPath("#private", "user", "INBOX"), UID_VALIDITY, CassandraId.timeBased()); SimpleMailbox mailbox2 = new SimpleMailbox(new MailboxPath("#private", "user", "OUTBOX"), UID_VALIDITY, CassandraId.timeBased()); SimpleMailbox mailbox3 = new SimpleMailbox(new MailboxPath("#private", "user", "SENT"), UID_VALIDITY, CassandraId.timeBased()); + SimpleMailbox mailbox4 = new SimpleMailbox(new MailboxPath("#public", "otheruser", "INBOX"), UID_VALIDITY, CassandraId.timeBased()); MockMailboxSession mailboxSession = new MockMailboxSession("user"); MailboxMapper mailboxMapper = mapperFactory.getMailboxMapper(mailboxSession); mailboxMapper.save(mailbox1); mailboxMapper.save(mailbox2); mailboxMapper.save(mailbox3); + mailboxMapper.save(mailbox4); CassandraMailboxManager cassandraMailboxManager = new CassandraMailboxManager(mapperFactory, mock(Authenticator.class), new NoMailboxPathLocker(), new MessageParser(), messageIdFactory); cassandraMailboxManager.init(); - return new CassandraMessageIdManagerTestSystem(messageIdManager, mailboxSession, mailbox1, mailbox2, mailbox3, + return new CassandraMessageIdManagerTestSystem(messageIdManager, mailboxSession, mailbox1, mailbox2, mailbox3, mailbox4, messageIdFactory, mapperFactory, mailboxSession, cassandraMailboxManager); } @@ -122,8 +124,8 @@ public class CassandraMessageIdManagerTestSystem extends MessageIdManagerTestSys private final MailboxSession mailboxSession; private final CassandraMailboxManager cassandraMailboxManager; - public CassandraMessageIdManagerTestSystem(MessageIdManager messageIdManager, MailboxSession session, Mailbox mailbox1, Mailbox mailbox2, Mailbox mailbox3, CassandraMessageId.Factory messageIdFactory, CassandraMailboxSessionMapperFactory mapperFactory, MailboxSession mailboxSession, CassandraMailboxManager cassandraMailboxManager) { - super(messageIdManager, session, mailbox1, mailbox2, mailbox3); + public CassandraMessageIdManagerTestSystem(MessageIdManager messageIdManager, MailboxSession session, Mailbox mailbox1, Mailbox mailbox2, Mailbox mailbox3, Mailbox mailbox4, CassandraMessageId.Factory messageIdFactory, CassandraMailboxSessionMapperFactory mapperFactory, MailboxSession mailboxSession, CassandraMailboxManager cassandraMailboxManager) { + super(messageIdManager, session, mailbox1, mailbox2, mailbox3, mailbox4); this.messageIdFactory = messageIdFactory; this.mapperFactory = mapperFactory; this.mailboxSession = mailboxSession; http://git-wip-us.apache.org/repos/asf/james-project/blob/81832aed/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManager.java ---------------------------------------------------------------------- diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManager.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManager.java index bbde9cc..b10b599 100644 --- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManager.java +++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManager.java @@ -27,13 +27,16 @@ import javax.mail.Flags; import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.MailboxSession.SessionType; import org.apache.james.mailbox.MessageIdManager; import org.apache.james.mailbox.MessageManager; import org.apache.james.mailbox.MessageManager.FlagsUpdateMode; import org.apache.james.mailbox.exception.MailboxException; +import org.apache.james.mailbox.exception.MailboxNotFoundException; import org.apache.james.mailbox.model.FetchGroupImpl; import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MailboxMetaData; +import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.model.MailboxQuery; import org.apache.james.mailbox.model.MessageId; import org.apache.james.mailbox.model.MessageRange; @@ -43,6 +46,7 @@ import org.apache.james.mailbox.model.MessageResult.FetchGroup; import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.base.Predicate; +import com.google.common.base.Throwables; import com.google.common.collect.FluentIterable; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; @@ -59,23 +63,6 @@ public class InMemoryMessageIdManager implements MessageIdManager { this.mailboxManager = mailboxManager; } - private Optional<MessageResult> findMessageWithId(MailboxId mailboxId, final MessageId messageId, FetchGroup fetchGroup, MailboxSession mailboxSession) throws MailboxException { - return FluentIterable.from(retrieveAllMessages(mailboxId, fetchGroup, mailboxSession)) - .filter(new Predicate<MessageResult>() { - - @Override - public boolean apply(MessageResult messageResult) { - return messageResult.getMessageId().equals(messageId); - } - }) - .first(); - } - - private ImmutableList<MessageResult> retrieveAllMessages(MailboxId mailboxId, FetchGroup fetchGroup, MailboxSession mailboxSession) throws MailboxException { - MessageManager messageManager = mailboxManager.getMailbox(mailboxId, mailboxSession); - return ImmutableList.copyOf(messageManager.getMessages(MessageRange.all(), fetchGroup, mailboxSession)); - } - @Override public void setFlags(Flags newState, FlagsUpdateMode flagsUpdateMode, MessageId messageId, List<MailboxId> mailboxIds, MailboxSession mailboxSession) throws MailboxException { for (MailboxId mailboxId: mailboxIds) { @@ -88,29 +75,11 @@ public class InMemoryMessageIdManager implements MessageIdManager { } @Override - public List<MessageResult> getMessages(List<MessageId> messages, FetchGroup fetchGroup, MailboxSession mailboxSession) throws MailboxException { - ImmutableList.Builder<MessageResult> builder = ImmutableList.builder(); - List<MailboxMetaData> userMailboxes = mailboxManager.search(userMailboxes(mailboxSession), mailboxSession); - for (MailboxMetaData mailboxMetaData: userMailboxes) { - builder.addAll(retrieveMailboxMessages(mailboxMetaData.getId(), messages, fetchGroup, mailboxSession)); - } - return builder.build(); - } - - private MailboxQuery userMailboxes(MailboxSession mailboxSession) { - return MailboxQuery.builder() - .matchesAll() - .username(mailboxSession.getUser().getUserName()) - .build(); - } - - private List<MessageResult> retrieveMailboxMessages(MailboxId mailboxId, List<MessageId> messages, FetchGroup fetchGroup, MailboxSession mailboxSession) throws MailboxException { + public List<MessageResult> getMessages(List<MessageId> messages, FetchGroup fetchGroup, final MailboxSession mailboxSession) throws MailboxException { ImmutableList.Builder<MessageResult> builder = ImmutableList.builder(); - for (MessageId messageId: messages) { - Optional<MessageResult> maybeMessage = findMessageWithId(mailboxId, messageId, fetchGroup, mailboxSession); - if (maybeMessage.isPresent()) { - builder.add(maybeMessage.get()); - } + List<MailboxId> userMailboxIds = getUsersMailboxIds(mailboxSession); + for (MailboxId mailboxId: userMailboxIds) { + builder.addAll(retrieveMailboxMessages(mailboxId, messages, fetchGroup, mailboxSession)); } return builder.build(); } @@ -131,13 +100,16 @@ public class InMemoryMessageIdManager implements MessageIdManager { @Override public void setInMailboxes(MessageId messageId, List<MailboxId> mailboxIds, MailboxSession mailboxSession) throws MailboxException { List<MessageResult> messages = getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, mailboxSession); + + filterOnMailboxSession(mailboxIds, mailboxSession); + if (!messages.isEmpty()) { ImmutableSet<MailboxId> currentMailboxes = currentMailboxes(messages).toSet(); - + HashSet<MailboxId> targetMailboxes = Sets.newHashSet(mailboxIds); List<MailboxId> mailboxesToRemove = ImmutableList.copyOf(Sets.difference(currentMailboxes, targetMailboxes)); SetView<MailboxId> mailboxesToAdd = Sets.difference(targetMailboxes, currentMailboxes); - + MessageResult referenceMessage = Iterables.getLast(messages); for (MailboxId mailboxId: mailboxesToAdd) { MessageRange messageRange = referenceMessage.getUid().toRange(); @@ -145,13 +117,82 @@ public class InMemoryMessageIdManager implements MessageIdManager { mailboxManager.getMailbox(mailboxId, mailboxSession) .setFlags(referenceMessage.getFlags(), FlagsUpdateMode.REPLACE, messageRange, mailboxSession); } - + for (MessageResult message: messages) { delete(message.getMessageId(), mailboxesToRemove, mailboxSession); } } } + private List<MailboxId> getUsersMailboxIds(final MailboxSession mailboxSession) throws MailboxException { + return FluentIterable.from(mailboxManager.search(userMailboxes(mailboxSession), mailboxSession)) + .transform(getMailboxIdFromMetadata()).toList(); + } + + private Function<MailboxMetaData, MailboxId> getMailboxIdFromMetadata() { + return new Function<MailboxMetaData, MailboxId>() { + @Override + public MailboxId apply(MailboxMetaData input) { + return input.getId(); + } + }; + } + + private Function<MailboxPath, MailboxId> getMailboxIdFromMailboxPath(final MailboxSession mailboxSession) { + return new Function<MailboxPath, MailboxId>() { + @Override + public MailboxId apply(MailboxPath input) { + try { + return mailboxManager.getMailbox(input, mailboxSession).getId(); + } catch (MailboxException e) { + throw Throwables.propagate(e); + } + } + }; + } + + private MailboxQuery userMailboxes(MailboxSession mailboxSession) { + return MailboxQuery.builder() + .matchesAll() + .username(mailboxSession.getUser().getUserName()) + .build(); + } + + private List<MessageResult> retrieveMailboxMessages(MailboxId mailboxId, List<MessageId> messages, FetchGroup fetchGroup, MailboxSession mailboxSession) throws MailboxException { + ImmutableList.Builder<MessageResult> builder = ImmutableList.builder(); + for (MessageId messageId: messages) { + Optional<MessageResult> maybeMessage = findMessageWithId(mailboxId, messageId, fetchGroup, mailboxSession); + if (maybeMessage.isPresent()) { + builder.add(maybeMessage.get()); + } + } + return builder.build(); + } + + private void filterOnMailboxSession(List<MailboxId> mailboxIds, MailboxSession mailboxSession) throws MailboxNotFoundException { + boolean isForbidden = FluentIterable.from(mailboxIds) + .firstMatch(findMailboxBelongsToAnotherSession(mailboxSession)) + .isPresent(); + + if (isForbidden) { + throw new MailboxNotFoundException("Mailbox does not belong to session"); + } + } + + private Predicate<MailboxId> findMailboxBelongsToAnotherSession(final MailboxSession mailboxSession) { + return new Predicate<MailboxId>() { + @Override + public boolean apply(MailboxId input) { + try { + MailboxPath currentMailbox = mailboxManager.getMailbox(input, mailboxSession).getMailboxPath(); + return !mailboxSession.getUser().isSameUser(currentMailbox.getUser()); + } catch (MailboxException e) { + return true; + } + } + }; + } + private FluentIterable<MailboxId> currentMailboxes(List<MessageResult> messages) { return FluentIterable.from(messages).transform(new Function<MessageResult, MailboxId>() { @Override @@ -161,4 +202,21 @@ public class InMemoryMessageIdManager implements MessageIdManager { }); } + private Optional<MessageResult> findMessageWithId(MailboxId mailboxId, final MessageId messageId, FetchGroup fetchGroup, MailboxSession mailboxSession) throws MailboxException { + return FluentIterable.from(retrieveAllMessages(mailboxId, fetchGroup, mailboxSession)) + .filter(new Predicate<MessageResult>() { + + @Override + public boolean apply(MessageResult messageResult) { + return messageResult.getMessageId().equals(messageId); + } + }) + .first(); + } + + private ImmutableList<MessageResult> retrieveAllMessages(MailboxId mailboxId, FetchGroup fetchGroup, MailboxSession mailboxSession) throws MailboxException { + MessageManager messageManager = mailboxManager.getMailbox(mailboxId, mailboxSession); + return ImmutableList.copyOf(messageManager.getMessages(MessageRange.all(), fetchGroup, mailboxSession)); + } + } http://git-wip-us.apache.org/repos/asf/james-project/blob/81832aed/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java index 760ea6c..8bee086 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java @@ -496,9 +496,6 @@ public class StoreMailboxManager implements MailboxManager { } private boolean belongsToCurrentUser(Mailbox mailbox, MailboxSession session) { - if (session.getUser() == null) { - return mailbox.getUser() == null; - } return session.getUser().isSameUser(mailbox.getUser()); } http://git-wip-us.apache.org/repos/asf/james-project/blob/81832aed/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java index 0a482c1..fcbc10a 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java @@ -31,10 +31,12 @@ import javax.mail.Flags; import javax.mail.internet.SharedInputStream; import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.MailboxSession.SessionType; import org.apache.james.mailbox.MessageIdManager; import org.apache.james.mailbox.MessageManager; import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.exception.MailboxException; +import org.apache.james.mailbox.exception.MailboxNotFoundException; import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.model.MessageAttachment; @@ -100,6 +102,10 @@ public class StoreMessageIdManager implements MessageIdManager { @Override public void setFlags(Flags newState, MessageManager.FlagsUpdateMode replace, MessageId messageId, List<MailboxId> mailboxIds, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); + MailboxMapper mailboxMapper = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession); + + allowOnMailboxSession(mailboxIds, mailboxSession, mailboxMapper); + Map<MailboxId, UpdatedFlags> updatedFlags = messageIdMapper.setFlags(messageId, mailboxIds, newState, replace); for (Map.Entry<MailboxId, UpdatedFlags> entry : updatedFlags.entrySet()) { dispatchFlagsChange(mailboxSession, entry.getKey(), entry.getValue()); @@ -107,10 +113,12 @@ public class StoreMessageIdManager implements MessageIdManager { } @Override - public List<MessageResult> getMessages(List<MessageId> messageIds, final MessageResult.FetchGroup fetchGroup, MailboxSession mailboxSession) throws MailboxException { + public List<MessageResult> getMessages(List<MessageId> messageIds, final MessageResult.FetchGroup fetchGroup, final MailboxSession mailboxSession) throws MailboxException { try { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); + final MailboxMapper mailboxMapper = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession); return FluentIterable.from(messageIdMapper.find(messageIds, MessageMapper.FetchType.Full)) + .filter(belongsToUser(mailboxSession, mailboxMapper)) .transform(messageResultConverter(fetchGroup)) .toList(); } catch (WrappedException wrappedException) { @@ -123,6 +131,8 @@ public class StoreMessageIdManager implements MessageIdManager { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); MailboxMapper mailboxMapper = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession); + allowOnMailboxSession(mailboxIds, mailboxSession, mailboxMapper); + Iterable<MetadataWithMailboxId> metadatasWithMailbox = FluentIterable .from(messageIdMapper.find(ImmutableList.of(messageId), MessageMapper.FetchType.Metadata)) .filter(inMailbox(mailboxIds)) @@ -138,8 +148,13 @@ public class StoreMessageIdManager implements MessageIdManager { @Override public void setInMailboxes(MessageId messageId, List<MailboxId> mailboxIds, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); + MailboxMapper mailboxMapper = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession); + + allowOnMailboxSession(mailboxIds, mailboxSession, mailboxMapper); - List<MailboxMessage> mailboxMessages = messageIdMapper.find(ImmutableList.of(messageId), MessageMapper.FetchType.Full); + List<MailboxMessage> mailboxMessages = FluentIterable.from(messageIdMapper.find(ImmutableList.of(messageId), MessageMapper.FetchType.Full)) + .filter(belongsToUser(mailboxSession, mailboxMapper)) + .toList(); if (!mailboxMessages.isEmpty()) { ImmutableSet<MailboxId> currentMailboxes = FluentIterable.from(mailboxMessages) @@ -244,6 +259,47 @@ public class StoreMessageIdManager implements MessageIdManager { }; } + private Predicate<MailboxMessage> belongsToUser(final MailboxSession mailboxSession, final MailboxMapper mailboxMapper) { + return new Predicate<MailboxMessage>() { + @Override + public boolean apply(MailboxMessage input) { + try { + Mailbox currentMailbox = mailboxMapper.findMailboxById(input.getMailboxId()); + return belongsToCurrentUser(currentMailbox, mailboxSession); + } catch (MailboxException e) { + return false; + } + } + }; + } + + private void allowOnMailboxSession(List<MailboxId> mailboxIds, MailboxSession mailboxSession, MailboxMapper mailboxMapper) throws MailboxNotFoundException { + boolean isForbidden = FluentIterable.from(mailboxIds) + .firstMatch(isMailboxOfOtherUser(mailboxSession, mailboxMapper)) + .isPresent(); + + if (isForbidden) { + throw new MailboxNotFoundException("Mailbox does not belong to session: "); + } + } + + private Predicate<MailboxId> isMailboxOfOtherUser(final MailboxSession mailboxSession, final MailboxMapper mailboxMapper) { + return new Predicate<MailboxId>() { + @Override + public boolean apply(MailboxId mailboxId) { + try { + return !belongsToCurrentUser(mailboxMapper.findMailboxById(mailboxId), mailboxSession); + } catch (MailboxException e) { + return true; + } + } + }; + } + + private boolean belongsToCurrentUser(Mailbox mailbox, MailboxSession session) { + return session.getUser().isSameUser(mailbox.getUser()); + } + private static class MetadataWithMailboxId { private final MessageMetaData messageMetaData; private final MailboxId mailboxId; http://git-wip-us.apache.org/repos/asf/james-project/blob/81832aed/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java index 4a394d3..452d877 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java @@ -41,6 +41,7 @@ import org.apache.commons.io.input.TeeInputStream; import org.apache.james.mailbox.MailboxListener; import org.apache.james.mailbox.MailboxPathLocker; import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.MailboxSession.SessionType; import org.apache.james.mailbox.MailboxSession.User; import org.apache.james.mailbox.MessageManager; import org.apache.james.mailbox.MessageUid; @@ -455,7 +456,8 @@ public class StoreMessageManager implements org.apache.james.mailbox.MessageMana * @throws MailboxException */ public boolean isWriteable(MailboxSession session) throws MailboxException { - return aclResolver.isReadWrite(myRights(session), getSharedPermanentFlags(session)); + return session.getType() == SessionType.System + || aclResolver.isReadWrite(myRights(session), getSharedPermanentFlags(session)); } /** http://git-wip-us.apache.org/repos/asf/james-project/blob/81832aed/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java index 9151a70..957d51d 100644 --- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java @@ -40,6 +40,7 @@ import org.apache.james.mailbox.MessageManager.FlagsUpdateMode; import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.exception.OverQuotaException; +import org.apache.james.mailbox.mock.MockMailboxSession; import org.apache.james.mailbox.model.FetchGroupImpl; import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MessageId; @@ -85,9 +86,9 @@ public abstract class AbstractMessageIdManagerSideEffectTest { @Before public void setUp() throws Exception { dispatcher = mock(MailboxEventDispatcher.class); - session = mock(MailboxSession.class); quotaManager = mock(QuotaManager.class); + session = new MockMailboxSession("user"); testingData = createTestSystem(quotaManager, dispatcher); messageIdManager = testingData.getMessageIdManager(); mailbox1 = testingData.getMailbox1(); http://git-wip-us.apache.org/repos/asf/james-project/blob/81832aed/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java index 82684f9..b8c8565 100644 --- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java @@ -28,9 +28,12 @@ import java.util.Map; import javax.mail.Flags; import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.MailboxSession.SessionType; import org.apache.james.mailbox.MessageIdManager; import org.apache.james.mailbox.MessageManager; import org.apache.james.mailbox.MessageUid; +import org.apache.james.mailbox.exception.MailboxNotFoundException; +import org.apache.james.mailbox.mock.MockMailboxSession; import org.apache.james.mailbox.model.FetchGroupImpl; import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MessageId; @@ -38,7 +41,9 @@ import org.apache.james.mailbox.model.MessageResult; import org.apache.james.mailbox.store.mail.model.Mailbox; import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; import com.google.common.base.Function; import com.google.common.base.Predicate; @@ -47,8 +52,10 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; public abstract class AbstractMessageIdManagerStorageTest { - public static final Flags FLAGS = new Flags(); + + private static final MailboxSession OTHER_USER = new MockMailboxSession("otheruser"); + private static final MailboxSession SYSTEM_USER = new MockMailboxSession("systemuser", SessionType.System); private static final MessageUid messageUid1 = MessageUid.of(111); private static final MessageUid messageUid2 = MessageUid.of(222); @@ -84,8 +91,12 @@ public abstract class AbstractMessageIdManagerStorageTest { private Mailbox mailbox1; private Mailbox mailbox2; private Mailbox mailbox3; + private Mailbox mailbox4; private MailboxSession session; + @Rule + public ExpectedException expectedException = ExpectedException.none(); + protected abstract MessageIdManagerTestSystem createTestingData() throws Exception; @Before @@ -95,8 +106,9 @@ public abstract class AbstractMessageIdManagerStorageTest { mailbox1 = testingData.getMailbox1(); mailbox2 = testingData.getMailbox2(); mailbox3 = testingData.getMailbox3(); + mailbox4 = testingData.getMailbox4(); - session = testingData.getSession(); + session = new MockMailboxSession("user"); } @After @@ -142,6 +154,22 @@ public abstract class AbstractMessageIdManagerStorageTest { } @Test + public void getMessageShouldReturnMessageBelongToUser() throws Exception { + MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS); + + assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session)).hasSize(1); + assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, OTHER_USER)).isEmpty(); + } + + @Test + public void getMessageShouldReturnAllWithSystemSession() throws Exception { + MessageId messageId = testingData.persist(mailbox4.getMailboxId(), messageUid1, FLAGS); + + assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session)).isEmpty();; + assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, SYSTEM_USER)).hasSize(1); + } + + @Test public void setInMailboxesShouldSetMessageInBothMailboxes() throws Exception { MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS); @@ -253,6 +281,43 @@ public abstract class AbstractMessageIdManagerStorageTest { } @Test + public void setInMailboxesShouldThrowExceptionWhenSetInMailboxesInAnotherSession() throws Exception { + expectedException.expect(MailboxNotFoundException.class); + + MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS); + + messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), OTHER_USER); + } + + @Test + public void setInMailboxesShouldThrowExceptionWhenOneMailboxDoesNotBelongToMailboxSession() throws Exception { + expectedException.expect(MailboxNotFoundException.class); + + MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS); + + messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox4.getMailboxId()), session); + } + + @Test + public void setInMailboxesShouldIgnoreMessagesBelongingToOtherUsers() throws Exception { + MessageId messageId = testingData.persist(mailbox4.getMailboxId(), messageUid1, FLAGS); + + messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId()), session); + + assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session)).isEmpty(); + } + + @Test + public void setInMailboxesShouldSetMessageWhenSystemSession() throws Exception { + MessageId messageId = testingData.persist(mailbox4.getMailboxId(), messageUid1, FLAGS); + + messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId()), SYSTEM_USER); + + assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session)).hasSize(1); + assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, SYSTEM_USER)).hasSize(1); + } + + @Test public void deleteMessageShouldRemoveMessageFromMailbox() throws Exception { MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS); @@ -285,6 +350,32 @@ public abstract class AbstractMessageIdManagerStorageTest { } @Test + public void deleteMessageShouldThrowExceptionWhenDeletingOnOtherSession() throws Exception { + expectedException.expect(MailboxNotFoundException.class); + + MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS); + + messageIdManager.delete(messageId, ImmutableList.of(mailbox1.getMailboxId()), OTHER_USER); + } + + @Test + public void deleteMessageShouldWorkWhenDeletingOnSystemSession() throws Exception { + MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS); + + messageIdManager.delete(messageId, ImmutableList.of(mailbox1.getMailboxId()), SYSTEM_USER); + + assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session)).isEmpty(); + } + + @Test + public void deleteMessageShouldThrowExceptionWhenOneMailboxDoesNotBelongToUser() throws Exception { + expectedException.expect(MailboxNotFoundException.class); + MessageId messageId = testingData.persist(mailbox4.getMailboxId(), messageUid1, FLAGS); + + messageIdManager.delete(messageId, ImmutableList.of(mailbox4.getMailboxId()), session); + } + + @Test public void setFlagsShouldUpdateFlags() throws Exception { Flags newFlags = new Flags(Flags.Flag.SEEN); MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS); @@ -417,6 +508,42 @@ public abstract class AbstractMessageIdManagerStorageTest { } @Test + public void setFlagsShouldThrowExceptionWhenSetFlagsOnOtherSession() throws Exception { + expectedException.expect(MailboxNotFoundException.class); + + Flags newFlags = new Flags(Flags.Flag.SEEN); + MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS); + + messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.ADD, messageId, ImmutableList.of(mailbox1.getMailboxId()), OTHER_USER); + } + + @Test + public void setFlagsShouldShouldWorkWhenSetFlagsOnSystemSession() throws Exception { + Flags newFlags = new Flags(Flags.Flag.SEEN); + MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS); + + messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.ADD, messageId, ImmutableList.of(mailbox1.getMailboxId()), SYSTEM_USER); + + List<Flags> flags = FluentIterable + .from(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session)) + .transform(getFlags()) + .toList(); + + assertThat(flags).hasSize(1); + assertThat(flags.get(0)).isEqualTo(newFlags); + } + + @Test + public void setFlagsShouldThrowExceptionWhenMailboxDoesNotBelongToMailboxSession() throws Exception { + expectedException.expect(MailboxNotFoundException.class); + Flags newFlags = new Flags(Flags.Flag.SEEN); + MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS); + + messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.ADD, messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox4.getMailboxId()), session); + + } + + @Test public void getMessageShouldBeEmptyWhenMessageHasNoMoreMailboxes() throws Exception { MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS); http://git-wip-us.apache.org/repos/asf/james-project/blob/81832aed/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMessageIdManagerTestSystem.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMessageIdManagerTestSystem.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMessageIdManagerTestSystem.java index a5cd64e..5c2d84e 100644 --- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMessageIdManagerTestSystem.java +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMessageIdManagerTestSystem.java @@ -29,9 +29,11 @@ import javax.mail.Flags; import org.apache.commons.lang.NotImplementedException; import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.MailboxSession.SessionType; import org.apache.james.mailbox.MessageIdManager; import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.exception.MailboxException; +import org.apache.james.mailbox.mock.MockMailboxSession; import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MessageId; import org.apache.james.mailbox.store.mail.model.Mailbox; @@ -40,7 +42,7 @@ import org.apache.james.mailbox.store.mail.model.MailboxMessage; import com.google.common.base.Throwables; public class StoreMessageIdManagerTestSystem extends MessageIdManagerTestSystem { - private static final MailboxSession EMPTY_MAILBOX_SESSION = null; + private static final MailboxSession EMPTY_MAILBOX_SESSION = new MockMailboxSession("user", SessionType.System); private static final long MOD_SEQ = 18; private static final ByteArrayInputStream ARRAY_INPUT_STREAM = new ByteArrayInputStream("".getBytes()); --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org