Repository: james-project Updated Branches: refs/heads/master 9a3800aca -> dff022514
MAILBOX-282 Add MessageIdMapper contract tests Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/dff02251 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/dff02251 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/dff02251 Branch: refs/heads/master Commit: dff0225146c5a04f85f96151c667d1b5aba1bbfb Parents: 15c9370 Author: Antoine Duprat <adup...@apache.org> Authored: Fri Dec 9 16:40:03 2016 +0100 Committer: Antoine Duprat <adup...@apache.org> Committed: Wed Dec 14 09:01:02 2016 +0100 ---------------------------------------------------------------------- .../cassandra/mail/CassandraMapperProvider.java | 40 +- .../mailbox/jpa/mail/JPAMapperProvider.java | 20 +- .../InMemoryMailboxSessionMapperFactory.java | 8 +- .../inmemory/mail/InMemoryMapperProvider.java | 39 +- .../mailbox/store/mail/model/MailboxAssert.java | 2 +- .../store/mail/model/MailboxMapperTest.java | 2 +- .../store/mail/model/MapperProvider.java | 11 +- .../store/mail/model/MessageIdMapperTest.java | 509 +++++++++++++++++++ .../store/mail/model/MessageMapperTest.java | 2 +- .../store/mail/model/MessageMoveTest.java | 2 +- .../store/mail/model/MessageUidProvider.java | 34 ++ .../mail/model/MessageUidProviderTest.java | 62 +++ 12 files changed, 712 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/dff02251/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java index e343f47..155800c 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java @@ -20,8 +20,11 @@ package org.apache.james.mailbox.cassandra.mail; import java.util.List; +import org.apache.commons.lang.NotImplementedException; import org.apache.james.backends.cassandra.CassandraCluster; import org.apache.james.backends.cassandra.init.CassandraModuleComposite; +import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.cassandra.CassandraId; import org.apache.james.mailbox.cassandra.CassandraMailboxSessionMapperFactory; import org.apache.james.mailbox.cassandra.modules.CassandraAclModule; @@ -38,9 +41,12 @@ import org.apache.james.mailbox.model.MessageId; import org.apache.james.mailbox.store.mail.AnnotationMapper; import org.apache.james.mailbox.store.mail.AttachmentMapper; import org.apache.james.mailbox.store.mail.MailboxMapper; +import org.apache.james.mailbox.store.mail.MessageIdMapper; import org.apache.james.mailbox.store.mail.MessageMapper; import org.apache.james.mailbox.store.mail.model.DefaultMessageId; +import org.apache.james.mailbox.store.mail.model.Mailbox; import org.apache.james.mailbox.store.mail.model.MapperProvider; +import org.apache.james.mailbox.store.mail.model.MessageUidProvider; import com.google.common.collect.ImmutableList; @@ -56,6 +62,14 @@ public class CassandraMapperProvider implements MapperProvider { new CassandraAttachmentModule(), new CassandraAnnotationModule())); + private final MessageUidProvider messageUidProvider; + private final CassandraModSeqProvider cassandraModSeqProvider; + + public CassandraMapperProvider() { + messageUidProvider = new MessageUidProvider(); + cassandraModSeqProvider = new CassandraModSeqProvider(cassandra.getConf()); + } + @Override public MessageId generateMessageId() { return new DefaultMessageId.Factory().generate(); @@ -65,7 +79,7 @@ public class CassandraMapperProvider implements MapperProvider { public MailboxMapper createMailboxMapper() throws MailboxException { return new CassandraMailboxSessionMapperFactory( new CassandraUidProvider(cassandra.getConf()), - new CassandraModSeqProvider(cassandra.getConf()), + cassandraModSeqProvider, cassandra.getConf(), cassandra.getTypesProvider(), new DefaultMessageId.Factory() @@ -76,7 +90,7 @@ public class CassandraMapperProvider implements MapperProvider { public MessageMapper createMessageMapper() throws MailboxException { return new CassandraMailboxSessionMapperFactory( new CassandraUidProvider(cassandra.getConf()), - new CassandraModSeqProvider(cassandra.getConf()), + cassandraModSeqProvider, cassandra.getConf(), cassandra.getTypesProvider(), new DefaultMessageId.Factory() @@ -84,10 +98,15 @@ public class CassandraMapperProvider implements MapperProvider { } @Override + public MessageIdMapper createMessageIdMapper() throws MailboxException { + throw new NotImplementedException(); + } + + @Override public AttachmentMapper createAttachmentMapper() throws MailboxException { return new CassandraMailboxSessionMapperFactory( new CassandraUidProvider(cassandra.getConf()), - new CassandraModSeqProvider(cassandra.getConf()), + cassandraModSeqProvider, cassandra.getConf(), cassandra.getTypesProvider(), new DefaultMessageId.Factory() @@ -118,7 +137,7 @@ public class CassandraMapperProvider implements MapperProvider { public AnnotationMapper createAnnotationMapper() throws MailboxException { return new CassandraMailboxSessionMapperFactory( new CassandraUidProvider(cassandra.getConf()), - new CassandraModSeqProvider(cassandra.getConf()), + cassandraModSeqProvider, cassandra.getConf(), cassandra.getTypesProvider(), new DefaultMessageId.Factory() @@ -127,6 +146,17 @@ public class CassandraMapperProvider implements MapperProvider { @Override public List<Capabilities> getNotImplemented() { - return ImmutableList.of(); + return ImmutableList.of(Capabilities.UNIQUE_MESSAGE_ID); + } + + @Override + public MessageUid generateMessageUid() { + return messageUidProvider.next(); + } + + @Override + public long generateModSeq(Mailbox mailbox) throws MailboxException { + MailboxSession mailboxSession = null; + return cassandraModSeqProvider.nextModSeq(mailboxSession, mailbox); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/dff02251/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java ---------------------------------------------------------------------- diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java index fcffad6..dcbdf56 100644 --- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java +++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java @@ -27,6 +27,7 @@ import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import org.apache.commons.lang.NotImplementedException; +import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.jpa.JPAId; import org.apache.james.mailbox.jpa.mail.model.JPAMailbox; @@ -41,8 +42,10 @@ import org.apache.james.mailbox.model.MessageId; import org.apache.james.mailbox.store.mail.AnnotationMapper; import org.apache.james.mailbox.store.mail.AttachmentMapper; import org.apache.james.mailbox.store.mail.MailboxMapper; +import org.apache.james.mailbox.store.mail.MessageIdMapper; import org.apache.james.mailbox.store.mail.MessageMapper; import org.apache.james.mailbox.store.mail.model.DefaultMessageId; +import org.apache.james.mailbox.store.mail.model.Mailbox; import org.apache.james.mailbox.store.mail.model.MapperProvider; import org.apache.openjpa.persistence.OpenJPAPersistence; @@ -124,6 +127,21 @@ public class JPAMapperProvider implements MapperProvider { @Override public List<Capabilities> getNotImplemented() { - return ImmutableList.of(Capabilities.MESSAGE, Capabilities.ATTACHMENT, Capabilities.MOVE); + return ImmutableList.of(Capabilities.MESSAGE, Capabilities.ATTACHMENT, Capabilities.MOVE, Capabilities.UNIQUE_MESSAGE_ID); + } + + @Override + public MessageIdMapper createMessageIdMapper() throws MailboxException { + throw new NotImplementedException(); + } + + @Override + public MessageUid generateMessageUid() { + throw new NotImplementedException(); + } + + @Override + public long generateModSeq(Mailbox mailbox) throws MailboxException { + throw new NotImplementedException(); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/dff02251/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxSessionMapperFactory.java ---------------------------------------------------------------------- diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxSessionMapperFactory.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxSessionMapperFactory.java index fc8722b..4f501d7 100644 --- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxSessionMapperFactory.java +++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxSessionMapperFactory.java @@ -33,11 +33,13 @@ import org.apache.james.mailbox.store.mail.AnnotationMapper; import org.apache.james.mailbox.store.mail.AttachmentMapper; import org.apache.james.mailbox.store.mail.MailboxMapper; import org.apache.james.mailbox.store.mail.MessageMapper; +import org.apache.james.mailbox.store.mail.ModSeqProvider; import org.apache.james.mailbox.store.user.SubscriptionMapper; public class InMemoryMailboxSessionMapperFactory extends MailboxSessionMapperFactory { private final MailboxMapper mailboxMapper; + private final InMemoryModSeqProvider modSeqProvider; private final MessageMapper messageMapper; private final SubscriptionMapper subscriptionMapper; private final AttachmentMapper attachmentMapper; @@ -45,7 +47,8 @@ public class InMemoryMailboxSessionMapperFactory extends MailboxSessionMapperFac public InMemoryMailboxSessionMapperFactory() { mailboxMapper = new InMemoryMailboxMapper(); - messageMapper = new InMemoryMessageMapper(null, new InMemoryUidProvider(), new InMemoryModSeqProvider()); + modSeqProvider = new InMemoryModSeqProvider(); + messageMapper = new InMemoryMessageMapper(null, new InMemoryUidProvider(), modSeqProvider); subscriptionMapper = new InMemorySubscriptionMapper(); attachmentMapper = new InMemoryAttachmentMapper(); annotationMapper = new InMemoryAnnotationMapper(); @@ -83,4 +86,7 @@ public class InMemoryMailboxSessionMapperFactory extends MailboxSessionMapperFac return annotationMapper; } + public ModSeqProvider getModSeqProvider() { + return modSeqProvider; + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/dff02251/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java ---------------------------------------------------------------------- diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java index 25e14e3..28b1c73 100644 --- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java +++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java @@ -3,6 +3,8 @@ package org.apache.james.mailbox.inmemory.mail; import java.util.List; import java.util.Random; +import org.apache.commons.lang.NotImplementedException; +import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.inmemory.InMemoryId; import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory; @@ -11,35 +13,47 @@ import org.apache.james.mailbox.model.MessageId; import org.apache.james.mailbox.store.mail.AnnotationMapper; import org.apache.james.mailbox.store.mail.AttachmentMapper; import org.apache.james.mailbox.store.mail.MailboxMapper; +import org.apache.james.mailbox.store.mail.MessageIdMapper; import org.apache.james.mailbox.store.mail.MessageMapper; import org.apache.james.mailbox.store.mail.model.DefaultMessageId; +import org.apache.james.mailbox.store.mail.model.Mailbox; import org.apache.james.mailbox.store.mail.model.MapperProvider; +import org.apache.james.mailbox.store.mail.model.MessageUidProvider; import com.google.common.collect.ImmutableList; public class InMemoryMapperProvider implements MapperProvider { private final Random random; - private MessageId.Factory messageIdFactory; + private final MessageId.Factory messageIdFactory; + private final MessageUidProvider messageUidProvider; + private final InMemoryMailboxSessionMapperFactory inMemoryMailboxSessionMapperFactory; public InMemoryMapperProvider() { random = new Random(); messageIdFactory = new DefaultMessageId.Factory(); + messageUidProvider = new MessageUidProvider(); + inMemoryMailboxSessionMapperFactory = new InMemoryMailboxSessionMapperFactory(); } @Override public MailboxMapper createMailboxMapper() throws MailboxException { - return new InMemoryMailboxSessionMapperFactory().createMailboxMapper(new MockMailboxSession("user")); + return inMemoryMailboxSessionMapperFactory.createMailboxMapper(new MockMailboxSession("user")); } @Override public MessageMapper createMessageMapper() throws MailboxException { - return new InMemoryMailboxSessionMapperFactory().createMessageMapper(new MockMailboxSession("user")); + return inMemoryMailboxSessionMapperFactory.createMessageMapper(new MockMailboxSession("user")); + } + + @Override + public MessageIdMapper createMessageIdMapper() throws MailboxException { + throw new NotImplementedException(); } @Override public AttachmentMapper createAttachmentMapper() throws MailboxException { - return new InMemoryMailboxSessionMapperFactory().createAttachmentMapper(new MockMailboxSession("user")); + return inMemoryMailboxSessionMapperFactory.createAttachmentMapper(new MockMailboxSession("user")); } @Override @@ -48,8 +62,13 @@ public class InMemoryMapperProvider implements MapperProvider { } @Override - public void clearMapper() throws MailboxException { + public MessageUid generateMessageUid() { + return messageUidProvider.next(); + } + @Override + public void clearMapper() throws MailboxException { + inMemoryMailboxSessionMapperFactory.deleteAll(); } @Override @@ -64,7 +83,7 @@ public class InMemoryMapperProvider implements MapperProvider { @Override public AnnotationMapper createAnnotationMapper() throws MailboxException { - return new InMemoryMailboxSessionMapperFactory().createAnnotationMapper(new MockMailboxSession("user")); + return inMemoryMailboxSessionMapperFactory.createAnnotationMapper(new MockMailboxSession("user")); } @Override @@ -74,6 +93,12 @@ public class InMemoryMapperProvider implements MapperProvider { @Override public List<Capabilities> getNotImplemented() { - return ImmutableList.of(); + return ImmutableList.of(Capabilities.UNIQUE_MESSAGE_ID); + } + + @Override + public long generateModSeq(Mailbox mailbox) throws MailboxException { + return inMemoryMailboxSessionMapperFactory.getModSeqProvider() + .nextModSeq(new MockMailboxSession("user"), mailbox); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/dff02251/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxAssert.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxAssert.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxAssert.java index 5db8837..86dcf00 100644 --- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxAssert.java +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxAssert.java @@ -45,7 +45,7 @@ public class MailboxAssert extends AbstractAssert<MailboxAssert, Mailbox> { failWithMessage("Expected Name to be <%s> but was <%s>", expected.getName(), actual.getName()); } if (!equals(actual.getACL(), expected.getACL())) { - failWithMessage("Expected UUID to be <%s> but was <%s>", expected.getACL(), actual.getACL()); + failWithMessage("Expected ACL to be <%s> but was <%s>", expected.getACL(), actual.getACL()); } if (actual.getUidValidity() != expected.getUidValidity()) { failWithMessage("Expected UID Validity to be <%s> but was <%s>", expected.getUidValidity(), actual.getUidValidity()); http://git-wip-us.apache.org/repos/asf/james-project/blob/dff02251/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java index 710bc35..c5bf105 100644 --- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java @@ -47,7 +47,7 @@ import org.xenei.junit.contract.IProducer; @Contract(MapperProvider.class) public class MailboxMapperTest<T extends MapperProvider> { - private final static char DELIMITER = ':'; + private final static char DELIMITER = '.'; private final static char WILDCARD = '%'; private final static long UID_VALIDITY = 42; http://git-wip-us.apache.org/repos/asf/james-project/blob/dff02251/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MapperProvider.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MapperProvider.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MapperProvider.java index 636c68d..0f22bae 100644 --- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MapperProvider.java +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MapperProvider.java @@ -21,12 +21,14 @@ package org.apache.james.mailbox.store.mail.model; import java.util.List; +import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MessageId; import org.apache.james.mailbox.store.mail.AnnotationMapper; import org.apache.james.mailbox.store.mail.AttachmentMapper; import org.apache.james.mailbox.store.mail.MailboxMapper; +import org.apache.james.mailbox.store.mail.MessageIdMapper; import org.apache.james.mailbox.store.mail.MessageMapper; public interface MapperProvider { @@ -35,7 +37,8 @@ public interface MapperProvider { MAILBOX, ATTACHMENT, ANNOTATION, - MOVE + MOVE, + UNIQUE_MESSAGE_ID } List<Capabilities> getNotImplemented(); @@ -44,12 +47,18 @@ public interface MapperProvider { MessageMapper createMessageMapper() throws MailboxException; + MessageIdMapper createMessageIdMapper() throws MailboxException; + AttachmentMapper createAttachmentMapper() throws MailboxException; AnnotationMapper createAnnotationMapper() throws MailboxException; MailboxId generateId(); + MessageUid generateMessageUid(); + + long generateModSeq(Mailbox mailbox) throws MailboxException; + void clearMapper() throws MailboxException; void ensureMapperPrepared() throws MailboxException; http://git-wip-us.apache.org/repos/asf/james-project/blob/dff02251/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java new file mode 100644 index 0000000..9bc1835 --- /dev/null +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java @@ -0,0 +1,509 @@ +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ****************************************************************/ + +package org.apache.james.mailbox.store.mail.model; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +import javax.mail.Flags; +import javax.mail.Flags.Flag; +import javax.mail.util.SharedByteArrayInputStream; + +import org.apache.james.mailbox.FlagsBuilder; +import org.apache.james.mailbox.MessageManager; +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.MessageId; +import org.apache.james.mailbox.model.UpdatedFlags; +import org.apache.james.mailbox.store.mail.MailboxMapper; +import org.apache.james.mailbox.store.mail.MessageIdMapper; +import org.apache.james.mailbox.store.mail.MessageMapper; +import org.apache.james.mailbox.store.mail.MessageMapper.FetchType; +import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder; +import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox; +import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage; +import org.assertj.core.data.MapEntry; +import org.junit.After; +import org.junit.Assume; +import org.junit.Rule; +import org.junit.rules.ExpectedException; +import org.xenei.junit.contract.Contract; +import org.xenei.junit.contract.ContractTest; +import org.xenei.junit.contract.IProducer; + +import com.google.common.collect.ImmutableList; + +@Contract(MapperProvider.class) +public class MessageIdMapperTest<T extends MapperProvider> { + + @Rule + public ExpectedException expectedException = ExpectedException.none(); + + private final static char DELIMITER = '.'; + private static final int BODY_START = 16; + private final static long UID_VALIDITY = 42; + + private IProducer<T> producer; + private MessageMapper messageMapper; + private MailboxMapper mailboxMapper; + private MessageIdMapper sut; + + private SimpleMailbox benwaInboxMailbox; + private SimpleMailbox benwaWorkMailbox; + + private SimpleMailboxMessage message1; + private SimpleMailboxMessage message2; + private SimpleMailboxMessage message3; + private SimpleMailboxMessage message4; + + @Rule + public ExpectedException expected = ExpectedException.none(); + private T mapperProvider; + + @Contract.Inject + public final void setProducer(IProducer<T> producer) throws MailboxException { + this.producer = producer; + this.mapperProvider = producer.newInstance(); + Assume.assumeFalse(mapperProvider.getNotImplemented().contains(MapperProvider.Capabilities.UNIQUE_MESSAGE_ID)); + + this.mapperProvider.ensureMapperPrepared(); + this.sut = mapperProvider.createMessageIdMapper(); + this.messageMapper = mapperProvider.createMessageMapper(); + this.mailboxMapper = mapperProvider.createMailboxMapper(); + + benwaInboxMailbox = createMailbox(new MailboxPath("#private", "benwa", "INBOX")); + benwaWorkMailbox = createMailbox( new MailboxPath("#private", "benwa", "INBOX"+DELIMITER+"work")); + + message1 = createMessage(benwaInboxMailbox, "Subject: Test1 \n\nBody1\n.\n", BODY_START, new PropertyBuilder()); + message2 = createMessage(benwaInboxMailbox, "Subject: Test2 \n\nBody2\n.\n", BODY_START, new PropertyBuilder()); + message3 = createMessage(benwaInboxMailbox, "Subject: Test3 \n\nBody3\n.\n", BODY_START, new PropertyBuilder()); + message4 = createMessage(benwaWorkMailbox, "Subject: Test4 \n\nBody4\n.\n", BODY_START, new PropertyBuilder()); + } + + @After + public void tearDown() throws MailboxException { + producer.cleanUp(); + } + + @ContractTest + public void findShouldReturnEmptyWhenIdListIsEmpty() throws MailboxException { + assertThat(sut.find(ImmutableList.<MessageId> of(), FetchType.Full)).isEmpty(); + } + + @ContractTest + public void findShouldReturnOneMessageWhenIdListContainsOne() throws MailboxException { + saveMessages(); + List<MailboxMessage> messages = sut.find(ImmutableList.of(message1.getMessageId()), FetchType.Full); + assertThat(messages).containsOnly(message1); + } + + @ContractTest + public void findShouldReturnMultipleMessagesWhenIdContainsMultiple() throws MailboxException { + saveMessages(); + List<MailboxMessage> messages = sut.find(ImmutableList.of(message1.getMessageId(), message2.getMessageId(), message3.getMessageId()), FetchType.Full); + assertThat(messages).containsOnly(message1, message2, message3); + } + + @ContractTest + public void findShouldReturnMultipleMessagesWhenIdContainsMultipleInDifferentMailboxes() throws MailboxException { + saveMessages(); + List<MailboxMessage> messages = sut.find(ImmutableList.of(message1.getMessageId(), message4.getMessageId(), message3.getMessageId()), FetchType.Full); + assertThat(messages).containsOnly(message1, message4, message3); + } + + @ContractTest + public void findMailboxesShouldReturnEmptyWhenMessageDoesntExist() throws MailboxException { + assertThat(sut.findMailboxes(mapperProvider.generateMessageId())).isEmpty(); + } + + @ContractTest + public void findMailboxesShouldReturnOneMailboxWhenMessageExistsInOneMailbox() throws MailboxException { + saveMessages(); + List<MailboxId> mailboxes = sut.findMailboxes(message1.getMessageId()); + assertThat(mailboxes).containsOnly(benwaInboxMailbox.getMailboxId()); + } + + @ContractTest + public void findMailboxesShouldReturnTwoMailboxesWhenMessageExistsInTwoMailboxes() throws MailboxException { + saveMessages(); + + SimpleMailboxMessage message1InOtherMailbox = SimpleMailboxMessage.copy(benwaWorkMailbox.getMailboxId(), message1); + message1InOtherMailbox.setUid(mapperProvider.generateMessageUid()); + message1InOtherMailbox.setModSeq(mapperProvider.generateModSeq(benwaWorkMailbox)); + sut.save(message1InOtherMailbox); + + List<MailboxId> mailboxes = sut.findMailboxes(message1.getMessageId()); + assertThat(mailboxes).containsOnly(benwaInboxMailbox.getMailboxId(), benwaWorkMailbox.getMailboxId()); + } + + @ContractTest + public void saveShouldSaveAMessage() throws Exception { + message1.setUid(mapperProvider.generateMessageUid()); + message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox)); + sut.save(message1); + List<MailboxMessage> messages = sut.find(ImmutableList.of(message1.getMessageId()), FetchType.Full); + assertThat(messages).containsOnly(message1); + } + + @ContractTest + public void saveShouldThrowWhenMailboxDoesntExist() throws Exception { + SimpleMailbox notPersistedMailbox = new SimpleMailbox(new MailboxPath("#private", "benwa", "mybox"), UID_VALIDITY); + notPersistedMailbox.setMailboxId(mapperProvider.generateId()); + SimpleMailboxMessage message = createMessage(notPersistedMailbox, "Subject: Test \n\nBody\n.\n", BODY_START, new PropertyBuilder()); + message.setUid(mapperProvider.generateMessageUid()); + message.setModSeq(mapperProvider.generateModSeq(notPersistedMailbox)); + + expectedException.expect(MailboxNotFoundException.class); + sut.save(message); + } + + @ContractTest + public void saveShouldSaveMessageInAnotherMailboxWhenMessageAlreadyInOneMailbox() throws Exception { + message1.setUid(mapperProvider.generateMessageUid()); + message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox)); + sut.save(message1); + + SimpleMailboxMessage message1InOtherMailbox = SimpleMailboxMessage.copy(benwaWorkMailbox.getMailboxId(), message1); + message1InOtherMailbox.setUid(mapperProvider.generateMessageUid()); + message1InOtherMailbox.setModSeq(mapperProvider.generateModSeq(benwaWorkMailbox)); + sut.save(message1InOtherMailbox); + + List<MailboxId> mailboxes = sut.findMailboxes(message1.getMessageId()); + assertThat(mailboxes).containsOnly(benwaInboxMailbox.getMailboxId(), benwaWorkMailbox.getMailboxId()); + } + + @ContractTest + public void saveShouldWorkWhenSavingTwoTimesWithSameMessageIdAndSameMailboxId() throws Exception { + message1.setUid(mapperProvider.generateMessageUid()); + message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox)); + sut.save(message1); + SimpleMailboxMessage copiedMessage = SimpleMailboxMessage.copy(message1.getMailboxId(), message1); + copiedMessage.setUid(mapperProvider.generateMessageUid()); + copiedMessage.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox)); + sut.save(copiedMessage); + + List<MailboxId> mailboxes = sut.findMailboxes(message1.getMessageId()); + assertThat(mailboxes).containsOnly(benwaInboxMailbox.getMailboxId(), benwaInboxMailbox.getMailboxId()); + } + + @ContractTest + public void deleteShouldNotThrowWhenUnknownMessage() { + sut.delete(message1.getMessageId()); + } + + @ContractTest + public void deleteShouldDeleteAMessage() throws Exception { + message1.setUid(mapperProvider.generateMessageUid()); + message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox)); + sut.save(message1); + + MessageId messageId = message1.getMessageId(); + sut.delete(messageId); + + List<MailboxMessage> messages = sut.find(ImmutableList.of(messageId), FetchType.Full); + assertThat(messages).isEmpty(); + } + + @ContractTest + public void deleteShouldDeleteMessageIndicesWhenStoredInTwoMailboxes() throws Exception { + message1.setUid(mapperProvider.generateMessageUid()); + message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox)); + sut.save(message1); + + SimpleMailboxMessage message1InOtherMailbox = SimpleMailboxMessage.copy(benwaWorkMailbox.getMailboxId(), message1); + message1InOtherMailbox.setUid(mapperProvider.generateMessageUid()); + message1InOtherMailbox.setModSeq(mapperProvider.generateModSeq(benwaWorkMailbox)); + sut.save(message1InOtherMailbox); + + MessageId messageId = message1.getMessageId(); + sut.delete(messageId); + + List<MailboxId> mailboxes = sut.findMailboxes(messageId); + assertThat(mailboxes).isEmpty(); + } + + @ContractTest + public void deleteShouldDeleteMessageIndicesWhenStoredTwoTimesInTheSameMailbox() throws Exception { + message1.setUid(mapperProvider.generateMessageUid()); + message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox)); + sut.save(message1); + SimpleMailboxMessage copiedMessage = SimpleMailboxMessage.copy(message1.getMailboxId(), message1); + copiedMessage.setUid(mapperProvider.generateMessageUid()); + copiedMessage.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox)); + sut.save(copiedMessage); + + MessageId messageId = message1.getMessageId(); + sut.delete(messageId); + + List<MailboxId> mailboxes = sut.findMailboxes(messageId); + assertThat(mailboxes).isEmpty(); + } + + @ContractTest + public void deleteWithMailboxIdsShouldNotDeleteIndicesWhenMailboxIdsIsEmpty() throws Exception { + message1.setUid(mapperProvider.generateMessageUid()); + message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox)); + sut.save(message1); + + SimpleMailboxMessage message1InOtherMailbox = SimpleMailboxMessage.copy(benwaWorkMailbox.getMailboxId(), message1); + message1InOtherMailbox.setUid(mapperProvider.generateMessageUid()); + message1InOtherMailbox.setModSeq(mapperProvider.generateModSeq(benwaWorkMailbox)); + sut.save(message1InOtherMailbox); + + MessageId messageId = message1.getMessageId(); + sut.delete(messageId, ImmutableList.<MailboxId> of()); + + List<MailboxId> mailboxes = sut.findMailboxes(messageId); + assertThat(mailboxes).containsOnly(benwaInboxMailbox.getMailboxId(), benwaWorkMailbox.getMailboxId()); + } + + @ContractTest + public void deleteWithMailboxIdsShouldDeleteOneIndexWhenMailboxIdsContainsOneElement() throws Exception { + message1.setUid(mapperProvider.generateMessageUid()); + message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox)); + sut.save(message1); + + SimpleMailboxMessage message1InOtherMailbox = SimpleMailboxMessage.copy(benwaWorkMailbox.getMailboxId(), message1); + message1InOtherMailbox.setUid(mapperProvider.generateMessageUid()); + message1InOtherMailbox.setModSeq(mapperProvider.generateModSeq(benwaWorkMailbox)); + sut.save(message1InOtherMailbox); + + MessageId messageId = message1.getMessageId(); + sut.delete(messageId, ImmutableList.of(benwaInboxMailbox.getMailboxId())); + + List<MailboxId> mailboxes = sut.findMailboxes(messageId); + assertThat(mailboxes).containsOnly(benwaWorkMailbox.getMailboxId()); + } + + @ContractTest + public void deleteWithMailboxIdsShouldDeleteIndicesWhenMailboxIdsContainsMultipleElements() throws Exception { + message1.setUid(mapperProvider.generateMessageUid()); + message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox)); + sut.save(message1); + + SimpleMailboxMessage message1InOtherMailbox = SimpleMailboxMessage.copy(benwaWorkMailbox.getMailboxId(), message1); + message1InOtherMailbox.setUid(mapperProvider.generateMessageUid()); + message1InOtherMailbox.setModSeq(mapperProvider.generateModSeq(benwaWorkMailbox)); + sut.save(message1InOtherMailbox); + + MessageId messageId = message1.getMessageId(); + sut.delete(messageId, ImmutableList.of(benwaInboxMailbox.getMailboxId(), benwaWorkMailbox.getMailboxId())); + + List<MailboxId> mailboxes = sut.findMailboxes(messageId); + assertThat(mailboxes).isEmpty(); + } + + @ContractTest + public void setFlagsShouldReturnUpdatedFlagsWhenMessageIsInOneMailbox() throws Exception { + message1.setUid(mapperProvider.generateMessageUid()); + message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox)); + sut.save(message1); + + MessageId messageId = message1.getMessageId(); + Flags newFlags = new Flags(Flag.ANSWERED); + Map<MailboxId, UpdatedFlags> flags = sut.setFlags(messageId, ImmutableList.of(message1.getMailboxId()), newFlags, MessageManager.FlagsUpdateMode.REMOVE); + + int modSeq = 1; + UpdatedFlags expectedUpdatedFlags = new UpdatedFlags(message1.getUid(), modSeq, new Flags(), newFlags); + assertThat(flags).containsOnly(MapEntry.entry(benwaInboxMailbox.getMailboxId(), expectedUpdatedFlags)); + } + + @ContractTest + public void setFlagsShouldReturnEmptyWhenMailboxIdsIsEmpty() throws Exception { + message1.setUid(mapperProvider.generateMessageUid()); + message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox)); + sut.save(message1); + + MessageId messageId = message1.getMessageId(); + Flags newFlags = new Flags(Flag.ANSWERED); + Map<MailboxId, UpdatedFlags> flags = sut.setFlags(messageId, ImmutableList.<MailboxId> of(), newFlags, MessageManager.FlagsUpdateMode.REMOVE); + + assertThat(flags).isEmpty(); + } + + @ContractTest + public void setFlagsShouldReturnEmptyWhenMessageIdDoesntExist() throws Exception { + MessageId unknownMessageId = mapperProvider.generateMessageId(); + Map<MailboxId, UpdatedFlags> flags = sut.setFlags(unknownMessageId, ImmutableList.of(message1.getMailboxId()), new Flags(Flag.RECENT), MessageManager.FlagsUpdateMode.REMOVE); + + assertThat(flags).isEmpty(); + } + + @ContractTest + public void setFlagsShouldAddFlagsWhenAddUpdateMode() throws Exception { + message1.setUid(mapperProvider.generateMessageUid()); + message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox)); + sut.save(message1); + + MessageId messageId = message1.getMessageId(); + Flags initialFlags = new Flags(Flag.RECENT); + sut.setFlags(messageId, ImmutableList.of(message1.getMailboxId()), initialFlags, MessageManager.FlagsUpdateMode.REMOVE); + + Map<MailboxId, UpdatedFlags> flags = sut.setFlags(messageId, ImmutableList.of(message1.getMailboxId()), new Flags(Flag.ANSWERED), MessageManager.FlagsUpdateMode.ADD); + + Flags newFlags = new FlagsBuilder() + .add(Flag.RECENT) + .add(Flag.ANSWERED) + .build(); + int modSeq = 2; + UpdatedFlags expectedUpdatedFlags = new UpdatedFlags(message1.getUid(), modSeq, initialFlags, newFlags); + assertThat(flags).containsOnly(MapEntry.entry(benwaInboxMailbox.getMailboxId(), expectedUpdatedFlags)); + } + + @ContractTest + public void setFlagsShouldReturnUpdatedFlagsWhenMessageIsInTwoMailboxes() throws Exception { + message1.setUid(mapperProvider.generateMessageUid()); + message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox)); + sut.save(message1); + + SimpleMailboxMessage message1InOtherMailbox = SimpleMailboxMessage.copy(benwaWorkMailbox.getMailboxId(), message1); + message1InOtherMailbox.setUid(mapperProvider.generateMessageUid()); + message1InOtherMailbox.setModSeq(mapperProvider.generateModSeq(benwaWorkMailbox)); + sut.save(message1InOtherMailbox); + + MessageId messageId = message1.getMessageId(); + Flags newFlags = new Flags(Flag.ANSWERED); + Map<MailboxId, UpdatedFlags> flags = sut.setFlags(messageId, ImmutableList.of(message1.getMailboxId()), newFlags, MessageManager.FlagsUpdateMode.REMOVE); + + int modSeq = 1; + UpdatedFlags expectedUpdatedFlags = new UpdatedFlags(message1.getUid(), modSeq, new Flags(), newFlags); + UpdatedFlags expectedUpdatedFlags2 = new UpdatedFlags(message1InOtherMailbox.getUid(), modSeq, new Flags(), newFlags); + assertThat(flags).containsOnly(MapEntry.entry(benwaInboxMailbox.getMailboxId(), expectedUpdatedFlags), + MapEntry.entry(benwaWorkMailbox.getMailboxId(), expectedUpdatedFlags2)); + } + + @ContractTest + public void setFlagsShouldUpdateFlagsWhenMessageIsInOneMailbox() throws Exception { + message1.setUid(mapperProvider.generateMessageUid()); + message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox)); + sut.save(message1); + + MessageId messageId = message1.getMessageId(); + sut.setFlags(messageId, ImmutableList.of(message1.getMailboxId()), new Flags(Flag.ANSWERED), MessageManager.FlagsUpdateMode.REMOVE); + + List<MailboxMessage> messages = sut.find(ImmutableList.of(messageId), MessageMapper.FetchType.Body); + assertThat(messages).hasSize(1); + assertThat(messages.get(0).isAnswered()).isTrue(); + } + + @ContractTest + public void setFlagsShouldNotModifyModSeqWhenMailboxIdsIsEmpty() throws Exception { + message1.setUid(mapperProvider.generateMessageUid()); + long modSeq = mapperProvider.generateModSeq(benwaInboxMailbox); + message1.setModSeq(modSeq); + sut.save(message1); + + MessageId messageId = message1.getMessageId(); + Flags newFlags = new Flags(Flag.ANSWERED); + sut.setFlags(messageId, ImmutableList.<MailboxId> of(), newFlags, MessageManager.FlagsUpdateMode.REMOVE); + + List<MailboxMessage> messages = sut.find(ImmutableList.of(messageId), MessageMapper.FetchType.Body); + assertThat(messages).hasSize(1); + assertThat(messages.get(0).getModSeq()).isEqualTo(modSeq); + } + + @ContractTest + public void setFlagsShouldUpdateModSeqWhenMessageIsInOneMailbox() throws Exception { + message1.setUid(mapperProvider.generateMessageUid()); + long modSeq = mapperProvider.generateModSeq(benwaInboxMailbox); + message1.setModSeq(modSeq); + sut.save(message1); + + MessageId messageId = message1.getMessageId(); + sut.setFlags(messageId, ImmutableList.of(message1.getMailboxId()), new Flags(Flag.ANSWERED), MessageManager.FlagsUpdateMode.REMOVE); + + List<MailboxMessage> messages = sut.find(ImmutableList.of(messageId), MessageMapper.FetchType.Body); + assertThat(messages).hasSize(1); + assertThat(messages.get(0).getModSeq()).isGreaterThan(modSeq); + } + + @ContractTest + public void setFlagsShouldNotModifyFlagsWhenMailboxIdsIsEmpty() throws Exception { + message1.setUid(mapperProvider.generateMessageUid()); + long modSeq = mapperProvider.generateModSeq(benwaInboxMailbox); + message1.setModSeq(modSeq); + Flags initialFlags = new Flags(Flags.Flag.DRAFT); + message1.setFlags(initialFlags); + sut.save(message1); + + MessageId messageId = message1.getMessageId(); + Flags newFlags = new Flags(Flag.ANSWERED); + sut.setFlags(messageId, ImmutableList.<MailboxId> of(), newFlags, MessageManager.FlagsUpdateMode.REMOVE); + + List<MailboxMessage> messages = sut.find(ImmutableList.of(messageId), MessageMapper.FetchType.Body); + assertThat(messages).hasSize(1); + assertThat(messages.get(0).createFlags()).isEqualTo(initialFlags); + } + + @ContractTest + public void setFlagsShouldUpdateFlagsWhenMessageIsInTwoMailboxes() throws Exception { + message1.setUid(mapperProvider.generateMessageUid()); + message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox)); + sut.save(message1); + + SimpleMailboxMessage message1InOtherMailbox = SimpleMailboxMessage.copy(benwaWorkMailbox.getMailboxId(), message1); + message1InOtherMailbox.setUid(mapperProvider.generateMessageUid()); + message1InOtherMailbox.setModSeq(mapperProvider.generateModSeq(benwaWorkMailbox)); + sut.save(message1InOtherMailbox); + + MessageId messageId = message1.getMessageId(); + sut.setFlags(messageId, ImmutableList.of(message1.getMailboxId(), message1InOtherMailbox.getMailboxId()), new Flags(Flag.ANSWERED), MessageManager.FlagsUpdateMode.REMOVE); + + List<MailboxMessage> messages = sut.find(ImmutableList.of(messageId), MessageMapper.FetchType.Body); + assertThat(messages).hasSize(2); + assertThat(messages.get(0).isAnswered()).isTrue(); + assertThat(messages.get(1).isAnswered()).isTrue(); + } + + private SimpleMailbox createMailbox(MailboxPath mailboxPath) throws MailboxException { + SimpleMailbox mailbox = new SimpleMailbox(mailboxPath, UID_VALIDITY); + mailbox.setMailboxId(mapperProvider.generateId()); + mailboxMapper.save(mailbox); + return mailbox; + } + + private void saveMessages() throws MailboxException { + addMessageAndSetModSeq(benwaInboxMailbox, message1); + addMessageAndSetModSeq(benwaInboxMailbox, message2); + addMessageAndSetModSeq(benwaInboxMailbox, message3); + addMessageAndSetModSeq(benwaWorkMailbox, message4); + } + + private void addMessageAndSetModSeq(Mailbox mailbox, MailboxMessage message) throws MailboxException { + messageMapper.add(mailbox, message); + message1.setModSeq(mapperProvider.generateModSeq(mailbox)); + } + + private SimpleMailboxMessage createMessage(Mailbox mailbox, String content, int bodyStart, PropertyBuilder propertyBuilder) { + return new SimpleMailboxMessage(mapperProvider.generateMessageId(), + new Date(), + content.length(), + bodyStart, + new SharedByteArrayInputStream(content.getBytes()), + new Flags(), + propertyBuilder, + mailbox.getMailboxId()); + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/dff02251/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java index 405fde4..aca5fcd 100644 --- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java @@ -58,7 +58,7 @@ import com.google.common.base.Optional; @Contract(MapperProvider.class) public class MessageMapperTest<T extends MapperProvider> { - private final static char DELIMITER = ':'; + private final static char DELIMITER = '.'; private static final int LIMIT = 10; private static final int BODY_START = 16; public static final int UID_VALIDITY = 42; http://git-wip-us.apache.org/repos/asf/james-project/blob/dff02251/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMoveTest.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMoveTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMoveTest.java index d7f583a..5a7e8ae 100644 --- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMoveTest.java +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMoveTest.java @@ -48,7 +48,7 @@ import org.xenei.junit.contract.IProducer; @Contract(MapperProvider.class) public class MessageMoveTest<T extends MapperProvider> { - private final static char DELIMITER = ':'; + private final static char DELIMITER = '.'; private static final int LIMIT = 10; private static final int BODY_START = 16; public static final int UID_VALIDITY = 42; http://git-wip-us.apache.org/repos/asf/james-project/blob/dff02251/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageUidProvider.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageUidProvider.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageUidProvider.java new file mode 100644 index 0000000..edea740 --- /dev/null +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageUidProvider.java @@ -0,0 +1,34 @@ +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ****************************************************************/ +package org.apache.james.mailbox.store.mail.model; + +import org.apache.james.mailbox.MessageUid; + +public class MessageUidProvider { + + private long nextUid; + + public MessageUidProvider() { + nextUid = 1; + } + + public MessageUid next() { + return MessageUid.of(nextUid++); + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/dff02251/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageUidProviderTest.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageUidProviderTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageUidProviderTest.java new file mode 100644 index 0000000..870a864 --- /dev/null +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageUidProviderTest.java @@ -0,0 +1,62 @@ +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ****************************************************************/ +package org.apache.james.mailbox.store.mail.model; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.apache.james.mailbox.MessageUid; +import org.junit.Before; +import org.junit.Test; + +public class MessageUidProviderTest { + + private MessageUidProvider testee; + + @Before + public void setup() { + testee = new MessageUidProvider(); + } + + @Test + public void nextShouldReturn1WhenFirstCall() { + MessageUid messageUid = testee.next(); + + MessageUid expectedMessageUid = MessageUid.of(1); + assertThat(messageUid).isEqualTo(expectedMessageUid); + } + + @Test + public void nextShouldReturn2WhenSecondCall() { + testee.next(); + MessageUid messageUid = testee.next(); + + MessageUid expectedMessageUid = MessageUid.of(2); + assertThat(messageUid).isEqualTo(expectedMessageUid); + } + + @Test + public void nextShouldReturn3WhenThirdCall() { + testee.next(); + testee.next(); + MessageUid messageUid = testee.next(); + + MessageUid expectedMessageUid = MessageUid.of(3); + assertThat(messageUid).isEqualTo(expectedMessageUid); + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org