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

Reply via email to