JAMES-1746 Mappers should be tested using junit-contracts

Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/8c089562
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/8c089562
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/8c089562

Branch: refs/heads/JAMES-1746
Commit: 8c08956229a3ae7e52edc045a1a5d75a69f7a45e
Parents: e44fba5
Author: Benoit Tellier <btell...@linagora.com>
Authored: Mon Jun 6 17:38:50 2016 +0700
Committer: Benoit Tellier <btell...@linagora.com>
Committed: Wed Jun 8 17:09:17 2016 +0700

----------------------------------------------------------------------
 mailbox/cassandra/pom.xml                       |   5 +
 .../mail/CassandraAttachmentMapperTest.java     |  30 -
 .../mail/CassandraMailboxMapperTest.java        |  27 -
 .../mail/CassandraMailboxMessageMapperTest.java |  27 -
 .../cassandra/mail/CassandraMapperProvider.java |   5 +
 .../cassandra/mail/CassandraMappersTests.java   |  60 ++
 .../mail/CassandraMessageMoveTest.java          |  29 -
 mailbox/memory/pom.xml                          |   5 +
 .../mail/InMemoryMailboxMapperTest.java         |  29 -
 .../inmemory/mail/InMemoryMapperProvider.java   |   5 +
 .../mail/InMemoryMessageMapperTest.java         |  40 -
 .../inmemory/mail/InMemoryMessageMoveTest.java  |  29 -
 .../inmemory/mail/MemoryMappersTests.java       |  60 ++
 mailbox/store/pom.xml                           |   5 +
 .../model/AbstractAttachmentMapperTest.java     |  90 ---
 .../mail/model/AbstractMailboxMapperTest.java   | 267 -------
 .../mail/model/AbstractMessageMapperTest.java   | 740 ------------------
 .../mail/model/AbstractMessageMoveTest.java     | 147 ----
 .../store/mail/model/AttachmentMapperTest.java  |  95 +++
 .../store/mail/model/MailboxMapperTest.java     | 278 +++++++
 .../store/mail/model/MapperProvider.java        |   2 +
 .../store/mail/model/MessageMapperTest.java     | 755 +++++++++++++++++++
 .../store/mail/model/MessageMoveTest.java       | 157 ++++
 23 files changed, 1432 insertions(+), 1455 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/8c089562/mailbox/cassandra/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/pom.xml b/mailbox/cassandra/pom.xml
index 7bae6c7..a05adca 100644
--- a/mailbox/cassandra/pom.xml
+++ b/mailbox/cassandra/pom.xml
@@ -147,6 +147,11 @@
             </activation>
             <dependencies>
                 <dependency>
+                    <groupId>org.xenei</groupId>
+                    <artifactId>junit-contracts</artifactId>
+                    <scope>test</scope>
+                </dependency>
+                <dependency>
                     <groupId>com.google.guava</groupId>
                     <artifactId>guava</artifactId>
                 </dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/8c089562/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapperTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapperTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapperTest.java
deleted file mode 100644
index d4162bb..0000000
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapperTest.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/****************************************************************
- * 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.cassandra.mail;
-
-import org.apache.james.mailbox.store.mail.model.AbstractAttachmentMapperTest;
-
-public class CassandraAttachmentMapperTest extends 
AbstractAttachmentMapperTest {
-
-    public CassandraAttachmentMapperTest() {
-        super(new CassandraMapperProvider());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/8c089562/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperTest.java
deleted file mode 100644
index a6b1291..0000000
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/****************************************************************
- * 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.cassandra.mail;
-
-import org.apache.james.mailbox.store.mail.model.AbstractMailboxMapperTest;
-
-public class CassandraMailboxMapperTest extends AbstractMailboxMapperTest {
-    public CassandraMailboxMapperTest() {
-        super(new CassandraMapperProvider());
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/8c089562/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMessageMapperTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMessageMapperTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMessageMapperTest.java
deleted file mode 100644
index a656d28..0000000
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMessageMapperTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/****************************************************************
- * 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.cassandra.mail;
-
-import org.apache.james.mailbox.store.mail.model.AbstractMessageMapperTest;
-
-public class CassandraMailboxMessageMapperTest extends 
AbstractMessageMapperTest {
-    public CassandraMailboxMessageMapperTest() {
-        super(new CassandraMapperProvider());
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/8c089562/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 1aa82dc..0bb915b 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
@@ -91,4 +91,9 @@ public class CassandraMapperProvider implements 
MapperProvider {
     public void ensureMapperPrepared() throws MailboxException {
         cassandra.ensureAllTables();
     }
+
+    @Override
+    public boolean supportPartialAttachmentFetch() {
+        return true;
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/8c089562/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMappersTests.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMappersTests.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMappersTests.java
new file mode 100644
index 0000000..205c886
--- /dev/null
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMappersTests.java
@@ -0,0 +1,60 @@
+/****************************************************************
+ * 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.cassandra.mail;
+
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.store.mail.model.MapperProvider;
+import org.junit.runner.RunWith;
+import org.xenei.junit.contract.Contract;
+import org.xenei.junit.contract.ContractImpl;
+import org.xenei.junit.contract.ContractSuite;
+import org.xenei.junit.contract.IProducer;
+
+import com.google.common.base.Throwables;
+
+@RunWith(ContractSuite.class)
+@ContractImpl(CassandraMapperProvider.class)
+public class CassandraMappersTests {
+
+    private IProducer<MapperProvider> producer = new 
IProducer<MapperProvider>() {
+
+        private final CassandraMapperProvider cassandraMapperProvider = new 
CassandraMapperProvider();
+
+        @Override
+        public CassandraMapperProvider newInstance() {
+            return cassandraMapperProvider;
+        }
+
+        @Override
+        public void cleanUp() {
+            try {
+                cassandraMapperProvider.clearMapper();
+            } catch (MailboxException e) {
+                throw Throwables.propagate(e);
+            }
+        }
+    };
+
+    @Contract.Inject
+    public IProducer<MapperProvider> getProducer() {
+        return producer;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/8c089562/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMoveTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMoveTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMoveTest.java
deleted file mode 100644
index fbf7804..0000000
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMoveTest.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/****************************************************************
- * 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.cassandra.mail;
-
-import org.apache.james.mailbox.store.mail.model.AbstractMessageMoveTest;
-
-public class CassandraMessageMoveTest extends AbstractMessageMoveTest {
-
-    public CassandraMessageMoveTest() {
-        super(new CassandraMapperProvider());
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/8c089562/mailbox/memory/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/memory/pom.xml b/mailbox/memory/pom.xml
index a08a5d1..0667a91 100644
--- a/mailbox/memory/pom.xml
+++ b/mailbox/memory/pom.xml
@@ -80,6 +80,11 @@
             <version>${assertj-1.version}</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.xenei</groupId>
+            <artifactId>junit-contracts</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>

http://git-wip-us.apache.org/repos/asf/james-project/blob/8c089562/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapperTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapperTest.java
 
b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapperTest.java
deleted file mode 100644
index 8abdae8..0000000
--- 
a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapperTest.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/****************************************************************
- * 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.inmemory.mail;
-
-import org.apache.james.mailbox.store.mail.model.AbstractMailboxMapperTest;
-
-public class InMemoryMailboxMapperTest extends AbstractMailboxMapperTest {
-
-    public InMemoryMailboxMapperTest() {
-        super(new InMemoryMapperProvider());
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/8c089562/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 3fa98da..39a3623 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
@@ -48,4 +48,9 @@ public class InMemoryMapperProvider implements MapperProvider 
{
     public void ensureMapperPrepared() throws MailboxException {
 
     }
+
+    @Override
+    public boolean supportPartialAttachmentFetch() {
+        return false;
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/8c089562/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapperTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapperTest.java
 
b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapperTest.java
deleted file mode 100644
index ad61d5e..0000000
--- 
a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapperTest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/****************************************************************
- * 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.inmemory.mail;
-
-import org.apache.james.mailbox.store.mail.model.AbstractMessageMapperTest;
-import org.junit.Ignore;
-
-public class InMemoryMessageMapperTest extends AbstractMessageMapperTest {
-
-    public InMemoryMessageMapperTest() {
-        super(new InMemoryMapperProvider());
-    }
-
-    @Ignore("Partial fetch not supported by InMemory backend")
-    @Override
-    public void 
messagesRetrievedUsingFetchTypeHeadersShouldHaveAttachmentsIdsEmptyWhenOneAttachment()
 {
-    }
-
-    @Ignore("Partial fetch not supported by InMemory backend")
-    @Override
-    public void 
messagesRetrievedUsingFetchTypeMetadataShouldHaveAttachmentsIdsEmptyWhenOneAttachment()
 {
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/8c089562/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMoveTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMoveTest.java
 
b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMoveTest.java
deleted file mode 100644
index 8244bcb..0000000
--- 
a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMoveTest.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/****************************************************************
- * 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.inmemory.mail;
-
-import org.apache.james.mailbox.store.mail.model.AbstractMessageMoveTest;
-
-public class InMemoryMessageMoveTest extends AbstractMessageMoveTest {
-
-    public InMemoryMessageMoveTest() {
-        super(new InMemoryMapperProvider());
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/8c089562/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMappersTests.java
----------------------------------------------------------------------
diff --git 
a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMappersTests.java
 
b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMappersTests.java
new file mode 100644
index 0000000..ca3af9a
--- /dev/null
+++ 
b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMappersTests.java
@@ -0,0 +1,60 @@
+/****************************************************************
+ * 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.inmemory.mail;
+
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.store.mail.model.MapperProvider;
+import org.junit.runner.RunWith;
+import org.xenei.junit.contract.Contract;
+import org.xenei.junit.contract.ContractImpl;
+import org.xenei.junit.contract.ContractSuite;
+import org.xenei.junit.contract.IProducer;
+
+import com.google.common.base.Throwables;
+
+@RunWith(ContractSuite.class)
+@ContractImpl(InMemoryMapperProvider.class)
+public class MemoryMappersTests {
+
+    private IProducer<MapperProvider> producer = new 
IProducer<MapperProvider>() {
+
+        private final InMemoryMapperProvider mapperProvider = new 
InMemoryMapperProvider();
+
+        @Override
+        public InMemoryMapperProvider newInstance() {
+            return mapperProvider;
+        }
+
+        @Override
+        public void cleanUp() {
+            try {
+                mapperProvider.clearMapper();
+            } catch (MailboxException e) {
+                throw Throwables.propagate(e);
+            }
+        }
+    };
+
+    @Contract.Inject
+    public IProducer<MapperProvider> getProducer() {
+        return producer;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/8c089562/mailbox/store/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/store/pom.xml b/mailbox/store/pom.xml
index 3add150..599e1bc 100644
--- a/mailbox/store/pom.xml
+++ b/mailbox/store/pom.xml
@@ -118,6 +118,11 @@
             <version>0.7.0-p9</version>
         </dependency>
         <dependency>
+            <groupId>org.xenei</groupId>
+            <artifactId>junit-contracts</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.apache.james</groupId>
             <artifactId>apache-james-mailbox-api</artifactId>
             <type>test-jar</type>

http://git-wip-us.apache.org/repos/asf/james-project/blob/8c089562/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractAttachmentMapperTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractAttachmentMapperTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractAttachmentMapperTest.java
deleted file mode 100644
index 2030cfb..0000000
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractAttachmentMapperTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/****************************************************************
- * 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.exception.AttachmentNotFoundException;
-import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.store.mail.AttachmentMapper;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.google.common.collect.ImmutableList;
-
-public abstract class AbstractAttachmentMapperTest {
-
-    private MapperProvider mapperProvider;
-    private AttachmentMapper attachmentMapper;
-
-    public AbstractAttachmentMapperTest(MapperProvider mapperProvider) {
-        this.mapperProvider = mapperProvider;
-    }
-
-    @Before
-    public void setUp() throws MailboxException {
-        mapperProvider.ensureMapperPrepared();
-        attachmentMapper = mapperProvider.createAttachmentMapper();
-    }
-
-    @After
-    public void tearDown() throws MailboxException {
-        mapperProvider.clearMapper();
-    }
-
-    @Test (expected = IllegalArgumentException.class)
-    public void getAttachmentShouldThrowWhenNullAttachmentId() throws 
Exception {
-        attachmentMapper.getAttachment(null);
-    }
-
-    @Test (expected = AttachmentNotFoundException.class)
-    public void getAttachmentShouldThrowWhenNonReferencedAttachmentId() throws 
Exception {
-        
attachmentMapper.getAttachment(AttachmentId.forPayload("unknown".getBytes()));
-    }
-
-    @Test
-    public void getAttachmentShouldReturnTheAttachmentWhenReferenced() throws 
Exception {
-        //Given
-        Attachment expected = Attachment.from("payload".getBytes(), "content");
-        AttachmentId attachmentId = expected.getAttachmentId();
-        attachmentMapper.storeAttachment(expected);
-        //When
-        Attachment attachment = attachmentMapper.getAttachment(attachmentId);
-        //Then
-        assertThat(attachment).isEqualTo(expected);
-    }
-
-    @Test
-    public void getAttachmentShouldReturnTheAttachmentsWhenMultipleStored() 
throws Exception {
-        //Given
-        Attachment expected1 = Attachment.from("payload1".getBytes(), 
"content1");
-        Attachment expected2 = Attachment.from("payload2".getBytes(), 
"content2");
-        AttachmentId attachmentId1 = expected1.getAttachmentId();
-        AttachmentId attachmentId2 = expected2.getAttachmentId();
-        //When
-        attachmentMapper.storeAttachments(ImmutableList.of(expected1, 
expected2));
-        //Then
-        Attachment attachment1 = attachmentMapper.getAttachment(attachmentId1);
-        Attachment attachment2 = attachmentMapper.getAttachment(attachmentId2);
-        assertThat(attachment1).isEqualTo(expected1);
-        assertThat(attachment2).isEqualTo(expected2);
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/8c089562/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMailboxMapperTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMailboxMapperTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMailboxMapperTest.java
deleted file mode 100644
index bd3884a..0000000
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMailboxMapperTest.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/****************************************************************
- * 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 static org.assertj.core.api.Assertions.fail;
-
-import java.util.List;
-
-import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.exception.MailboxNotFoundException;
-import org.apache.james.mailbox.model.MailboxPath;
-import org.apache.james.mailbox.store.mail.MailboxMapper;
-import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Generic purpose tests for your implementation MailboxMapper.
- * 
- * You then just need to instantiate your mailbox mapper and an IdGenerator.
- */
-public abstract class AbstractMailboxMapperTest {
-    
-    private final static char DELIMITER = ':';
-    private final static char WILDCARD = '%';
-    private final static long UID_VALIDITY = 42;
-
-    private MapperProvider mapperProvider;
-    
-    private MailboxMapper mailboxMapper;
-
-    private MailboxPath benwaInboxPath;
-    private SimpleMailbox benwaInboxMailbox;
-    private MailboxPath benwaWorkPath;
-    private SimpleMailbox benwaWorkMailbox;
-    private MailboxPath benwaWorkTodoPath;
-    private SimpleMailbox benwaWorkTodoMailbox;
-    private MailboxPath benwaPersoPath;
-    private SimpleMailbox benwaPersoMailbox;
-    private MailboxPath benwaWorkDonePath;
-    private SimpleMailbox benwaWorkDoneMailbox;
-    private MailboxPath bobInboxPath;
-    private SimpleMailbox bobyMailbox;
-    private MailboxPath bobyMailboxPath;
-    private SimpleMailbox bobInboxMailbox;
-    private MailboxPath esnDevGroupInboxPath;
-    private SimpleMailbox esnDevGroupInboxMailbox;
-    private MailboxPath esnDevGroupHublinPath;
-    private SimpleMailbox esnDevGroupHublinMailbox;
-    private MailboxPath esnDevGroupJamesPath;
-    private SimpleMailbox esnDevGroupJamesMailbox;
-    private MailboxPath obmTeamGroupInboxPath;
-    private SimpleMailbox obmTeamGroupInboxMailbox;
-    private MailboxPath obmTeamGroupOPushPath;
-    private SimpleMailbox obmTeamGroupOPushMailbox;
-    private MailboxPath obmTeamGroupRoundCubePath;
-    private SimpleMailbox obmTeamGroupRoundCubeMailbox;
-    private MailboxPath bobDifferentNamespacePath;
-    private SimpleMailbox bobDifferentNamespaceMailbox;
-
-    public AbstractMailboxMapperTest(MapperProvider mapperProvider) {
-        this.mapperProvider = mapperProvider;
-
-        benwaInboxPath = new MailboxPath("#private", "benwa", "INBOX");
-        benwaWorkPath = new MailboxPath("#private", "benwa", 
"INBOX"+DELIMITER+"work");
-        benwaWorkTodoPath = new MailboxPath("#private", "benwa", 
"INBOX"+DELIMITER+"work"+DELIMITER+"todo");
-        benwaPersoPath = new MailboxPath("#private", "benwa", 
"INBOX"+DELIMITER+"perso");
-        benwaWorkDonePath = new MailboxPath("#private", "benwa", 
"INBOX"+DELIMITER+"work"+DELIMITER+"done");
-        bobInboxPath = new MailboxPath("#private", "bob", "INBOX");
-        bobyMailboxPath = new MailboxPath("#private", "boby", 
"INBOX.that.is.a.trick");
-        bobDifferentNamespacePath = new MailboxPath("#private_bob", "bob", 
"INBOX.bob");
-        esnDevGroupInboxPath = new MailboxPath("#community_ESN_DEV", null, 
"INBOX");
-        esnDevGroupHublinPath = new MailboxPath("#community_ESN_DEV", null, 
"INBOX"+DELIMITER+"hublin");
-        esnDevGroupJamesPath = new MailboxPath("#community_ESN_DEV", null, 
"INBOX"+DELIMITER+"james");
-        obmTeamGroupInboxPath = new MailboxPath("#community_OBM_Core_Team", 
null, "INBOX");
-        obmTeamGroupOPushPath = new MailboxPath("#community_OBM_Core_Team", 
null, "INBOX"+DELIMITER+"OPush");
-        obmTeamGroupRoundCubePath = new 
MailboxPath("#community_OBM_Core_Team", null, "INBOX"+DELIMITER+"roundCube");
-
-        benwaInboxMailbox = createMailbox(benwaInboxPath);
-        benwaWorkMailbox = createMailbox(benwaWorkPath);
-        benwaWorkTodoMailbox = createMailbox(benwaWorkTodoPath);
-        benwaPersoMailbox = createMailbox(benwaPersoPath);
-        benwaWorkDoneMailbox = createMailbox(benwaWorkDonePath);
-        bobInboxMailbox = createMailbox(bobInboxPath);
-        esnDevGroupInboxMailbox = createMailbox(esnDevGroupInboxPath);
-        esnDevGroupHublinMailbox = createMailbox(esnDevGroupHublinPath);
-        esnDevGroupJamesMailbox = createMailbox(esnDevGroupJamesPath);
-        obmTeamGroupInboxMailbox = createMailbox(obmTeamGroupInboxPath);
-        obmTeamGroupOPushMailbox = createMailbox(obmTeamGroupOPushPath);
-        obmTeamGroupRoundCubeMailbox = 
createMailbox(obmTeamGroupRoundCubePath);
-        bobyMailbox = createMailbox(bobyMailboxPath);
-        bobDifferentNamespaceMailbox = 
createMailbox(bobDifferentNamespacePath);
-    }
-
-    @Before
-    public void setUp() throws MailboxException {
-        mapperProvider.ensureMapperPrepared();
-        mailboxMapper = mapperProvider.createMailboxMapper();
-    }
-
-    @After
-    public void tearDown() throws MailboxException {
-        mapperProvider.clearMapper();
-    }
-
-    @Test(expected=MailboxNotFoundException.class)
-    public void findMailboxByPathWhenAbsentShouldFail() throws 
MailboxException {
-        mailboxMapper.findMailboxByPath(new MailboxPath("#private", "benwa", 
"INBOX"));
-    }
-    
-    @Test
-    public void saveShouldPersistTheMailbox() throws MailboxException{
-        mailboxMapper.save(benwaInboxMailbox);
-        
MailboxAssert.assertThat(mailboxMapper.findMailboxByPath(benwaInboxPath)).isEqualTo(benwaInboxMailbox);
-    }
-
-    @Test
-    public void saveWithNullUserShouldPersistTheMailbox() throws 
MailboxException{
-        mailboxMapper.save(esnDevGroupInboxMailbox);
-        
MailboxAssert.assertThat(mailboxMapper.findMailboxByPath(esnDevGroupInboxPath)).isEqualTo(esnDevGroupInboxMailbox);
-    }
-    
-    @Test
-    public void listShouldRetrieveAllMailbox() throws MailboxException {
-        saveAll();
-        List<Mailbox> mailboxes = mailboxMapper.list();
-        assertThat(mailboxes).contains(benwaInboxMailbox, benwaWorkMailbox, 
benwaWorkTodoMailbox, benwaPersoMailbox, benwaWorkDoneMailbox, bobInboxMailbox, 
esnDevGroupInboxMailbox, esnDevGroupHublinMailbox,
-            esnDevGroupJamesMailbox, obmTeamGroupInboxMailbox, 
obmTeamGroupOPushMailbox, obmTeamGroupRoundCubeMailbox);
-    }
-    
-    @Test
-    public void hasChildrenShouldReturnFalseWhenNoChildrenExists() throws 
MailboxException {
-        saveAll();
-        assertThat(mailboxMapper.hasChildren(benwaWorkTodoMailbox, 
DELIMITER)).isFalse();
-    }
-
-    @Test
-    public void hasChildrenShouldReturnTrueWhenChildrenExists() throws 
MailboxException {
-        saveAll();
-        assertThat(mailboxMapper.hasChildren(benwaInboxMailbox, 
DELIMITER)).isTrue();
-    }
-
-    @Test
-    public void hasChildrenWithNullUserShouldReturnFalseWhenNoChildrenExists() 
throws MailboxException {
-        saveAll();
-        assertThat(mailboxMapper.hasChildren(esnDevGroupHublinMailbox, 
DELIMITER)).isFalse();
-    }
-
-    @Test
-    public void hasChildrenWithNullUserShouldReturnTrueWhenChildrenExists() 
throws MailboxException {
-        saveAll();
-        assertThat(mailboxMapper.hasChildren(esnDevGroupInboxMailbox, 
DELIMITER)).isTrue();
-    }
-
-    @Test
-    public void hasChildrenShouldNotBeAcrossUsersAndNamespace() throws 
MailboxException {
-        saveAll();
-        assertThat(mailboxMapper.hasChildren(bobInboxMailbox, '.')).isFalse();
-    }
-
-    @Test
-    public void findMailboxWithPathLikeShouldBeLimitedToUserAndNamespace() 
throws MailboxException {
-        saveAll();
-        MailboxPath mailboxPathQuery = new 
MailboxPath(bobInboxMailbox.getNamespace(), bobInboxMailbox.getUser(), "IN" + 
WILDCARD);
-        
assertThat(mailboxMapper.findMailboxWithPathLike(mailboxPathQuery)).containsOnly(bobInboxMailbox);
-    }
-
-    @Test(expected=MailboxNotFoundException.class)
-    public void deleteShouldEraseTheGivenMailbox() throws MailboxException {
-        try {
-            saveAll();
-            mailboxMapper.delete(benwaInboxMailbox);
-        } catch(MailboxException exception) {
-            fail("Error was not thrown by the appropriate method", exception);
-        }
-        mailboxMapper.findMailboxByPath(benwaInboxPath);
-    }
-
-    @Test(expected=MailboxNotFoundException.class)
-    public void deleteWithNullUserShouldEraseTheGivenMailbox() throws 
MailboxException {
-        try {
-            saveAll();
-            mailboxMapper.delete(esnDevGroupJamesMailbox);
-        } catch(MailboxException exception) {
-            fail("Error was not thrown by the appropriate method", exception);
-        }
-        mailboxMapper.findMailboxByPath(esnDevGroupJamesPath);
-    }
-
-    @Test
-    public void findMailboxWithPathLikeWithChildRegexShouldRetrieveChildren() 
throws MailboxException {
-        saveAll();
-        MailboxPath regexPath = new MailboxPath(benwaWorkPath.getNamespace(), 
benwaWorkPath.getUser(), benwaWorkPath.getName() + WILDCARD);
-        
assertThat(mailboxMapper.findMailboxWithPathLike(regexPath)).containsOnly(benwaWorkMailbox,
 benwaWorkTodoMailbox, benwaWorkDoneMailbox);
-    }
-
-    @Test
-    public void 
findMailboxWithPathLikeWithNullUserWithChildRegexShouldRetrieveChildren() 
throws MailboxException {
-        saveAll();
-        MailboxPath regexPath = new 
MailboxPath(obmTeamGroupInboxPath.getNamespace(), 
obmTeamGroupInboxPath.getUser(), obmTeamGroupInboxPath.getName() + WILDCARD);
-        
assertThat(mailboxMapper.findMailboxWithPathLike(regexPath)).contains(obmTeamGroupInboxMailbox,
 obmTeamGroupOPushMailbox, obmTeamGroupRoundCubeMailbox);
-    }
-
-    @Test
-    public void 
findMailboxWithPathLikeWithRegexShouldRetrieveCorrespondingMailbox() throws 
MailboxException {
-        saveAll();
-        MailboxPath regexPath = new MailboxPath(benwaInboxPath.getNamespace(), 
benwaInboxPath.getUser(), WILDCARD + "X");
-        
assertThat(mailboxMapper.findMailboxWithPathLike(regexPath)).containsOnly(benwaInboxMailbox);
-    }
-
-    @Test
-    public void 
findMailboxWithPathLikeWithNullUserWithRegexShouldRetrieveCorrespondingMailbox()
 throws MailboxException {
-        saveAll();
-        MailboxPath regexPath = new 
MailboxPath(esnDevGroupInboxPath.getNamespace(), 
esnDevGroupInboxPath.getUser(), WILDCARD + "X");
-        
assertThat(mailboxMapper.findMailboxWithPathLike(regexPath)).contains(esnDevGroupInboxMailbox);
-    }
-
-    @Test
-    public void findMailboxWithPathLikeShouldEscapeMailboxName() throws 
MailboxException {
-        saveAll();
-        MailboxPath regexPath = new MailboxPath(benwaInboxPath.getNamespace(), 
benwaInboxPath.getUser(), "INB?X");
-        assertThat(mailboxMapper.findMailboxWithPathLike(regexPath)).isEmpty();
-    }
-    
-    private void saveAll() throws MailboxException{
-        mailboxMapper.save(benwaInboxMailbox);
-        mailboxMapper.save(benwaWorkMailbox);
-        mailboxMapper.save(benwaWorkTodoMailbox);
-        mailboxMapper.save(benwaPersoMailbox);
-        mailboxMapper.save(benwaWorkDoneMailbox);
-        mailboxMapper.save(esnDevGroupInboxMailbox);
-        mailboxMapper.save(esnDevGroupHublinMailbox);
-        mailboxMapper.save(esnDevGroupJamesMailbox);
-        mailboxMapper.save(obmTeamGroupInboxMailbox);
-        mailboxMapper.save(obmTeamGroupOPushMailbox);
-        mailboxMapper.save(obmTeamGroupRoundCubeMailbox);
-        mailboxMapper.save(bobyMailbox);
-        mailboxMapper.save(bobDifferentNamespaceMailbox);
-        mailboxMapper.save(bobInboxMailbox);
-    }
-
-    private SimpleMailbox createMailbox(MailboxPath mailboxPath) {
-        SimpleMailbox mailbox = new SimpleMailbox(mailboxPath, UID_VALIDITY);
-        mailbox.setMailboxId(mapperProvider.generateId());
-        return mailbox;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/8c089562/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMessageMapperTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMessageMapperTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMessageMapperTest.java
deleted file mode 100644
index 7641a52..0000000
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMessageMapperTest.java
+++ /dev/null
@@ -1,740 +0,0 @@
-/****************************************************************
- * 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.io.IOException;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import javax.mail.Flags;
-import javax.mail.util.SharedByteArrayInputStream;
-
-import org.apache.james.mailbox.FlagsBuilder;
-import org.apache.james.mailbox.MessageManager.FlagsUpdateMode;
-import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.MailboxPath;
-import org.apache.james.mailbox.model.MessageMetaData;
-import org.apache.james.mailbox.model.MessageRange;
-import org.apache.james.mailbox.model.UpdatedFlags;
-import org.apache.james.mailbox.store.FlagsUpdateCalculator;
-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.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.google.common.collect.ImmutableList;
-
-public abstract class AbstractMessageMapperTest {
-
-    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;
-    public static final String USER_FLAG = "userFlag";
-
-    private MapperProvider mapperProvider;
-    private MessageMapper messageMapper;
-
-    private SimpleMailbox benwaInboxMailbox;
-    private SimpleMailbox benwaWorkMailbox;
-    private SimpleMailbox attachmentsMailbox;
-    
-    private SimpleMailboxMessage message1;
-    private SimpleMailboxMessage message2;
-    private SimpleMailboxMessage message3;
-    private SimpleMailboxMessage message4;
-    private SimpleMailboxMessage message5;
-    private SimpleMailboxMessage message6;
-    private SimpleMailboxMessage message7With1Attachment;
-    private SimpleMailboxMessage message8With2Attachments;
-
-    public AbstractMessageMapperTest(MapperProvider mapperProvider) {
-        this.mapperProvider = mapperProvider;
-    }
-
-    @Before
-    public void setUp() throws MailboxException {
-        mapperProvider.ensureMapperPrepared();
-        messageMapper = mapperProvider.createMessageMapper();
-        benwaInboxMailbox = createMailbox(new MailboxPath("#private", "benwa", 
"INBOX"));
-        benwaWorkMailbox = createMailbox( new MailboxPath("#private", "benwa", 
"INBOX"+DELIMITER+"work"));
-        attachmentsMailbox = createMailbox( new MailboxPath("#private", 
"benwa", "Attachments"));
-        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(benwaInboxMailbox, "Subject: Test4 
\n\nBody4\n.\n", BODY_START, new PropertyBuilder());
-        message5 = createMessage(benwaInboxMailbox, "Subject: Test5 
\n\nBody5\n.\n", BODY_START, new PropertyBuilder());
-        message6 = createMessage(benwaWorkMailbox, "Subject: Test6 
\n\nBody6\n.\n", BODY_START, new PropertyBuilder());
-        message7With1Attachment = createMessage(attachmentsMailbox, "Subject: 
Test7 \n\nBody7\n.\n", BODY_START, new PropertyBuilder(), 
ImmutableList.of(AttachmentId.from("123")));
-        message8With2Attachments = createMessage(attachmentsMailbox, "Subject: 
Test8 \n\nBody8\n.\n", BODY_START, new PropertyBuilder(), 
ImmutableList.of(AttachmentId.from("123"), AttachmentId.from("456")));
-    }
-
-    @After
-    public void tearDown() throws MailboxException {
-        mapperProvider.clearMapper();
-    }
-    
-    @Test
-    public void emptyMailboxShouldHaveZeroMessageCount() throws 
MailboxException {
-        
assertThat(messageMapper.countMessagesInMailbox(benwaInboxMailbox)).isEqualTo(0);
-    }
-    
-    @Test
-    public void mailboxContainingMessagesShouldHaveTheGoodMessageCount() 
throws MailboxException {
-        saveMessages();
-        
assertThat(messageMapper.countMessagesInMailbox(benwaInboxMailbox)).isEqualTo(5);
-    }
-
-    @Test
-    public void mailboxCountShouldBeDecrementedAfterAMessageDelete() throws 
MailboxException {
-        saveMessages();
-        messageMapper.delete(benwaInboxMailbox, message1);
-        
assertThat(messageMapper.countMessagesInMailbox(benwaInboxMailbox)).isEqualTo(4);
-    }
-    
-    @Test
-    public void emptyMailboxShouldNotHaveUnseenMessages() throws 
MailboxException {
-        
assertThat(messageMapper.countUnseenMessagesInMailbox(benwaInboxMailbox)).isEqualTo(0);
-    }
-    
-    @Test
-    public void mailboxContainingMessagesShouldHaveTheGoodUnseenMessageCount() 
throws MailboxException {
-        saveMessages();
-        
assertThat(messageMapper.countUnseenMessagesInMailbox(benwaInboxMailbox)).isEqualTo(5);
-    }
-
-    @Test
-    public void 
mailboxUnSeenCountShouldBeDecrementedAfterAMessageIsMarkedSeen() throws 
MailboxException {
-        saveMessages();
-        messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REPLACE), 
MessageRange.one(message1.getUid())).hasNext();
-        
assertThat(messageMapper.countUnseenMessagesInMailbox(benwaInboxMailbox)).isEqualTo(4);
-    }
-
-    @Test
-    public void 
mailboxUnSeenCountShouldBeDecrementedAfterAMessageIsMarkedUnSeen() throws 
MailboxException {
-        saveMessages();
-        messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REPLACE), 
MessageRange.one(message1.getUid()));
-        messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new Flags(), FlagsUpdateMode.REPLACE), 
MessageRange.one(message1.getUid()));
-        
assertThat(messageMapper.countUnseenMessagesInMailbox(benwaInboxMailbox)).isEqualTo(5);
-    }
-    
-    @Test
-    public void mailboxUnSeenCountShouldBeDecrementedAfterAMessageDelete() 
throws MailboxException {
-        saveMessages();
-        messageMapper.delete(benwaInboxMailbox, message1);
-        
assertThat(messageMapper.countUnseenMessagesInMailbox(benwaInboxMailbox)).isEqualTo(4);
-    }
-
-    @Test
-    public void deletedMessagesShouldBeRemovedFromStorage() throws 
MailboxException {
-        saveMessages();
-        messageMapper.delete(benwaInboxMailbox, message1);
-        assertThat(messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.one(message1.getUid()), MessageMapper.FetchType.Metadata, 
LIMIT)).isEmpty();
-    }
-
-    @Test
-    public void deletingUnExistingMessageShouldHaveNoSideEffect() throws 
MailboxException, IOException {
-        saveMessages();
-        message6.setUid(messageMapper.getLastUid(benwaInboxMailbox) + 1);
-        messageMapper.delete(benwaInboxMailbox, message6);
-        assertThat(messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.all(), MessageMapper.FetchType.Full, LIMIT))
-            .containsOnly(message1, message2, message3, message4, message5);
-    }
-
-    @Test
-    public void noMessageShouldBeRetrievedInEmptyMailbox() throws 
MailboxException {
-        assertThat(messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.one(message1.getUid()), MessageMapper.FetchType.Metadata, 
LIMIT)).isEmpty();
-    }
-
-    @Test
-    public void messagesCanBeRetrievedInMailboxWithRangeTypeOne() throws 
MailboxException, IOException{
-        saveMessages();
-        MessageMapper.FetchType fetchType = MessageMapper.FetchType.Full;
-        int limit =10;
-        
MessageAssert.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.one(message1.getUid()), fetchType, limit).next())
-            .isEqualTo(message1, fetchType);
-    }
-
-    @Test
-    public void messagesCanBeRetrievedInMailboxWithRangeTypeRange() throws 
MailboxException, IOException{
-        saveMessages();
-        Iterator<MailboxMessage> retrievedMessageIterator = messageMapper
-                .findInMailbox(benwaInboxMailbox, 
MessageRange.range(message1.getUid(), message4.getUid()), 
MessageMapper.FetchType.Full, LIMIT);
-        assertThat(retrievedMessageIterator).containsOnly(message1, message2, 
message3, message4);
-    }
-
-    @Test
-    public void 
messagesCanBeRetrievedInMailboxWithRangeTypeRangeContainingAHole() throws 
MailboxException, IOException {
-        saveMessages();
-        messageMapper.delete(benwaInboxMailbox, message3);
-        Iterator<MailboxMessage> retrievedMessageIterator = messageMapper
-            .findInMailbox(benwaInboxMailbox, 
MessageRange.range(message1.getUid(), message4.getUid()), 
MessageMapper.FetchType.Full, LIMIT);
-        assertThat(retrievedMessageIterator).containsOnly(message1, message2, 
message4);
-    }
-
-    @Test
-    public void messagesCanBeRetrievedInMailboxWithRangeTypeFrom() throws 
MailboxException, IOException {
-        saveMessages();
-        Iterator<MailboxMessage> retrievedMessageIterator = messageMapper
-                .findInMailbox(benwaInboxMailbox, 
MessageRange.from(message3.getUid()), MessageMapper.FetchType.Full, LIMIT);
-        assertThat(retrievedMessageIterator).containsOnly(message3, message4, 
message5);
-    }
-
-    @Test
-    public void 
messagesCanBeRetrievedInMailboxWithRangeTypeFromContainingAHole() throws 
MailboxException, IOException {
-        saveMessages();
-        messageMapper.delete(benwaInboxMailbox, message4);
-        Iterator<MailboxMessage> retrievedMessageIterator = messageMapper
-                .findInMailbox(benwaInboxMailbox, 
MessageRange.from(message3.getUid()), MessageMapper.FetchType.Full, LIMIT);
-        assertThat(retrievedMessageIterator).containsOnly(message3, message5);
-    }
-
-    @Test
-    public void messagesCanBeRetrievedInMailboxWithRangeTypeAll() throws 
MailboxException, IOException {
-        saveMessages();
-        assertThat(messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.all(), MessageMapper.FetchType.Full, LIMIT))
-            .containsOnly(message1, message2, message3, message4, message5);
-    }
-
-    @Test
-    public void 
messagesCanBeRetrievedInMailboxWithRangeTypeAllContainingHole() throws 
MailboxException, IOException {
-        saveMessages();
-        messageMapper.delete(benwaInboxMailbox, message1);
-        Iterator<MailboxMessage> retrievedMessageIterator = messageMapper
-                .findInMailbox(benwaInboxMailbox, MessageRange.all(), 
MessageMapper.FetchType.Full, LIMIT);
-        assertThat(retrievedMessageIterator).containsOnly(message2, message3, 
message4, message5);
-    }
-    
-    @Test
-    public void 
messagesRetrievedUsingFetchTypeMetadataShouldHaveAtLastMetadataDataLoaded() 
throws MailboxException, IOException{
-        saveMessages();
-        MessageMapper.FetchType fetchType = MessageMapper.FetchType.Metadata;
-        Iterator<MailboxMessage> retrievedMessageIterator = 
messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.one(message1.getUid()), fetchType, LIMIT);
-        
MessageAssert.assertThat(retrievedMessageIterator.next()).isEqualTo(message1, 
fetchType);
-        assertThat(retrievedMessageIterator).isEmpty();
-    }
-
-    @Test
-    public void 
messagesRetrievedUsingFetchTypeHeaderShouldHaveHeaderDataLoaded() throws 
MailboxException, IOException{
-        saveMessages();
-        MessageMapper.FetchType fetchType = MessageMapper.FetchType.Headers;
-        Iterator<MailboxMessage> retrievedMessageIterator = 
messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.one(message1.getUid()), fetchType, LIMIT);
-        
MessageAssert.assertThat(retrievedMessageIterator.next()).isEqualTo(message1, 
fetchType);
-        assertThat(retrievedMessageIterator).isEmpty();
-    }
-
-    @Test
-    public void messagesRetrievedUsingFetchTypeBodyShouldHaveBodyDataLoaded() 
throws MailboxException, IOException{
-        saveMessages();
-        MessageMapper.FetchType fetchType = MessageMapper.FetchType.Body;
-        Iterator<MailboxMessage> retrievedMessageIterator = 
messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.one(message1.getUid()), fetchType, LIMIT);
-        
MessageAssert.assertThat(retrievedMessageIterator.next()).isEqualTo(message1, 
fetchType);
-        assertThat(retrievedMessageIterator).isEmpty();
-    }
-
-    @Test
-    public void 
messagesRetrievedUsingFetchTypeFullShouldHaveAttachmentsIdsEmptyWhenNoAttachment()
 throws MailboxException, IOException{
-        saveMessages();
-        MessageMapper.FetchType fetchType = MessageMapper.FetchType.Full;
-        Iterator<MailboxMessage> retrievedMessageIterator = 
messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.one(message1.getUid()), fetchType, LIMIT);
-        
assertThat(retrievedMessageIterator.next().getAttachmentsIds()).isEmpty();
-    }
-
-    @Test
-    public void 
messagesRetrievedUsingFetchTypeFullShouldHaveAttachmentsIdsLoadedWhenOneAttachment()
 throws MailboxException, IOException{
-        saveMessages();
-        MessageMapper.FetchType fetchType = MessageMapper.FetchType.Full;
-        Iterator<MailboxMessage> retrievedMessageIterator = 
messageMapper.findInMailbox(attachmentsMailbox, 
MessageRange.one(message7With1Attachment.getUid()), fetchType, LIMIT);
-        
assertThat(retrievedMessageIterator.next().getAttachmentsIds()).isEqualTo(message7With1Attachment.getAttachmentsIds());
-    }
-
-    @Test
-    public void 
messagesRetrievedUsingFetchTypeFullShouldHaveAttachmentsIdsLoadedWhenTwoAttachments()
 throws MailboxException, IOException{
-        saveMessages();
-        MessageMapper.FetchType fetchType = MessageMapper.FetchType.Full;
-        Iterator<MailboxMessage> retrievedMessageIterator = 
messageMapper.findInMailbox(attachmentsMailbox, 
MessageRange.one(message8With2Attachments.getUid()), fetchType, LIMIT);
-        
assertThat(retrievedMessageIterator.next().getAttachmentsIds()).isEqualTo(message8With2Attachments.getAttachmentsIds());
-    }
-
-    @Test
-    public void 
messagesRetrievedUsingFetchTypeBodyShouldHaveAttachmentsIdsLoadedWhenOneAttachment()
 throws MailboxException, IOException{
-        saveMessages();
-        MessageMapper.FetchType fetchType = MessageMapper.FetchType.Body;
-        Iterator<MailboxMessage> retrievedMessageIterator = 
messageMapper.findInMailbox(attachmentsMailbox, 
MessageRange.one(message7With1Attachment.getUid()), fetchType, LIMIT);
-        
assertThat(retrievedMessageIterator.next().getAttachmentsIds()).isEqualTo(message7With1Attachment.getAttachmentsIds());
-    }
-
-    @Test
-    public void 
messagesRetrievedUsingFetchTypeHeadersShouldHaveAttachmentsIdsEmptyWhenOneAttachment()
 throws MailboxException, IOException{
-        saveMessages();
-        MessageMapper.FetchType fetchType = MessageMapper.FetchType.Headers;
-        Iterator<MailboxMessage> retrievedMessageIterator = 
messageMapper.findInMailbox(attachmentsMailbox, 
MessageRange.one(message7With1Attachment.getUid()), fetchType, LIMIT);
-        
assertThat(retrievedMessageIterator.next().getAttachmentsIds()).isEmpty();
-    }
-
-    @Test
-    public void 
messagesRetrievedUsingFetchTypeMetadataShouldHaveAttachmentsIdsEmptyWhenOneAttachment()
 throws MailboxException, IOException{
-        saveMessages();
-        MessageMapper.FetchType fetchType = MessageMapper.FetchType.Metadata;
-        Iterator<MailboxMessage> retrievedMessageIterator = 
messageMapper.findInMailbox(attachmentsMailbox, 
MessageRange.one(message7With1Attachment.getUid()), fetchType, LIMIT);
-        
assertThat(retrievedMessageIterator.next().getAttachmentsIds()).isEmpty();
-    }
-
-    @Test
-    public void retrievingMessagesWithALimitShouldLimitTheNumberOfMessages() 
throws MailboxException {
-        int limit = 2;
-        saveMessages();
-        assertThat(messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.all(), MessageMapper.FetchType.Full, limit)).hasSize(2);
-    }
-    
-    @Test
-    public void 
findRecentUidsInMailboxShouldReturnEmptyListWhenNoMessagesMarkedAsRecentArePresentInMailbox()
 throws MailboxException {
-        
assertThat(messageMapper.findRecentMessageUidsInMailbox(benwaInboxMailbox)).isEmpty();
-    }
-
-    @Test
-    public void 
findRecentUidsInMailboxShouldReturnListOfMessagesHoldingFlagsRecent() throws 
MailboxException {
-        saveMessages();
-        messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new Flags(Flags.Flag.RECENT), FlagsUpdateMode.REPLACE), 
MessageRange.one(message2.getUid()));
-        messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new Flags(Flags.Flag.RECENT), FlagsUpdateMode.REPLACE), 
MessageRange.one(message4.getUid()));
-        messageMapper.updateFlags(benwaWorkMailbox, new 
FlagsUpdateCalculator(new Flags(Flags.Flag.RECENT), FlagsUpdateMode.REPLACE), 
MessageRange.one(message6.getUid()));
-        
assertThat(messageMapper.findRecentMessageUidsInMailbox(benwaInboxMailbox)).containsOnly(message2.getUid(),
 message4.getUid());
-    }
-    
-    @Test
-    public void 
findFirstUnseenMessageUidShouldReturnNullWhenNoUnseenMessagesCanBeFound() 
throws MailboxException {
-        
assertThat(messageMapper.findFirstUnseenMessageUid(benwaInboxMailbox)).isNull();
-    }
-
-    @Test
-    public void findFirstUnseenMessageUidShouldReturnUid1WhenUid1isNotSeen() 
throws MailboxException {
-        saveMessages();
-        
assertThat(messageMapper.findFirstUnseenMessageUid(benwaInboxMailbox)).isEqualTo(message1.getUid());
-    }
-
-    @Test
-    public void findFirstUnseenMessageUidShouldReturnUid2WhenUid2isSeen() 
throws MailboxException {
-        saveMessages();
-        messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REPLACE), 
MessageRange.one(message1.getUid()));
-        messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REPLACE), 
MessageRange.one(message3.getUid()));
-        messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REPLACE), 
MessageRange.one(message5.getUid()));
-        
assertThat(messageMapper.findFirstUnseenMessageUid(benwaInboxMailbox)).isEqualTo(message2.getUid());
-    }
-    
-    @Test
-    public void 
expungeMarkedForDeletionInMailboxShouldReturnEmptyResultOnEmptyMailbox() throws 
MailboxException, IOException {
-        
assertThat(messageMapper.expungeMarkedForDeletionInMailbox(benwaInboxMailbox, 
MessageRange.all())).isEmpty();
-    }
-
-    @Test
-    public void 
expungeMarkedForDeletionInMailboxShouldReturnEmptyResultWhenNoMessageInMailboxIsDeleted()
 throws MailboxException, IOException {
-        saveMessages();
-        
assertThat(messageMapper.expungeMarkedForDeletionInMailbox(benwaInboxMailbox, 
MessageRange.all())).isEmpty();
-        assertThat(messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.all(), MessageMapper.FetchType.Full, LIMIT))
-            .containsOnly(message1, message2, message3, message4, message5);
-    }
-
-    @Test
-    public void expungeShouldReturnCorrectMetadataWithRangeAll() throws 
MailboxException, IOException {
-        saveMessages();
-        
MetadataMapAssert.assertThat(markThenPerformExpunge(MessageRange.all()))
-            .hasSize(2)
-            .containsMetadataForMessages(message1, message4);
-    }
-
-    @Test
-    public void expungeShouldModifyUnderlyingStorageWithRangeAll() throws 
MailboxException, IOException {
-        saveMessages();
-        markThenPerformExpunge(MessageRange.all());
-        assertThat(messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.all(), MessageMapper.FetchType.Full, LIMIT))
-            .containsOnly(message2, message3, message5);
-    }
-
-    @Test
-    public void expungeShouldReturnCorrectMetadataWithRangeOne() throws 
MailboxException, IOException {
-        saveMessages();
-        
MetadataMapAssert.assertThat(markThenPerformExpunge(MessageRange.one(message1.getUid())))
-            .hasSize(1)
-            .containsMetadataForMessages(message1);
-    }
-
-    @Test
-    public void expungeShouldModifyUnderlyingStorageWithRangeOne() throws 
MailboxException, IOException {
-        saveMessages();
-        markThenPerformExpunge(MessageRange.one(message1.getUid()));
-        assertThat(messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.all(), MessageMapper.FetchType.Full, LIMIT))
-            .containsOnly(message4, message2, message3, message5);
-    }
-
-    @Test
-    public void expungeShouldReturnCorrectMetadataWithRangeFrom() throws 
MailboxException, IOException {
-        saveMessages();
-        
MetadataMapAssert.assertThat(markThenPerformExpunge(MessageRange.from(message3.getUid())))
-            .hasSize(1)
-            .containsMetadataForMessages(message4);
-    }
-
-    @Test
-    public void expungeShouldModifyUnderlyingStorageWithRangeFrom() throws 
MailboxException, IOException {
-        saveMessages();
-        markThenPerformExpunge(MessageRange.from(message3.getUid()));
-        assertThat(messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.all(), MessageMapper.FetchType.Full, LIMIT))
-            .containsOnly(message1, message2, message3, message5);
-    }
-
-    @Test
-    public void expungeShouldReturnCorrectMetadataWithRange() throws 
MailboxException, IOException {
-        saveMessages();
-        
MetadataMapAssert.assertThat(markThenPerformExpunge(MessageRange.range(message3.getUid(),
 message5.getUid())))
-            .hasSize(1)
-            .containsMetadataForMessages(message4);
-    }
-
-    @Test
-    public void expungeShouldModifyUnderlyingStorageWithRange() throws 
MailboxException, IOException {
-        saveMessages();
-        markThenPerformExpunge(MessageRange.range(message3.getUid(), 
message5.getUid()));
-        assertThat(messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.all(), MessageMapper.FetchType.Full, LIMIT))
-            .containsOnly(message1, message2, message3, message5);
-    }
-
-    @Test
-    public void getHighestMoseqShouldBeEqualToZeroOnEmptyMailbox() throws 
MailboxException {
-        
assertThat(messageMapper.getHighestModSeq(benwaInboxMailbox)).isEqualTo(0);
-    }
-
-    @Test
-    public void insertingAMessageShouldIncrementModSeq() throws 
MailboxException {
-        messageMapper.add(benwaInboxMailbox, message1);
-        long modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox);
-        assertThat(modSeq).isGreaterThan(0);
-        messageMapper.add(benwaInboxMailbox, message2);
-        
assertThat(messageMapper.getHighestModSeq(benwaInboxMailbox)).isGreaterThan(modSeq);
-    }
-
-    @Test
-    public void getLastUidShouldReturn0OnEmptyMailbox() throws 
MailboxException {
-        assertThat(messageMapper.getLastUid(benwaInboxMailbox)).isEqualTo(0);
-    }
-
-    @Test
-    public void insertingAMessageShouldIncrementLastUid() throws 
MailboxException {
-        messageMapper.add(benwaInboxMailbox, message1);
-        long uid = messageMapper.getLastUid(benwaInboxMailbox);
-        assertThat(uid).isGreaterThan(0);
-        messageMapper.add(benwaInboxMailbox, message2);
-        
assertThat(messageMapper.getLastUid(benwaInboxMailbox)).isGreaterThan(uid);
-    }
-
-    @Test
-    public void copyShouldIncrementUid() throws MailboxException, IOException {
-        saveMessages();
-        long uid = messageMapper.getLastUid(benwaInboxMailbox);
-        messageMapper.copy(benwaInboxMailbox, 
SimpleMailboxMessage.copy(benwaInboxMailbox.getMailboxId(), message6));
-        
assertThat(messageMapper.getLastUid(benwaInboxMailbox)).isGreaterThan(uid);
-    }
-
-    @Test
-    public void copyShouldIncrementMessageCount() throws MailboxException, 
IOException {
-        saveMessages();
-        messageMapper.copy(benwaInboxMailbox, 
SimpleMailboxMessage.copy(benwaInboxMailbox.getMailboxId(), message6));
-        
assertThat(messageMapper.countMessagesInMailbox(benwaInboxMailbox)).isEqualTo(6);
-    }
-
-    @Test
-    public void copyOfUnSeenMessageShouldIncrementUnSeenMessageCount() throws 
MailboxException, IOException {
-        saveMessages();
-        messageMapper.copy(benwaInboxMailbox, 
SimpleMailboxMessage.copy(benwaInboxMailbox.getMailboxId(), message6));
-        
assertThat(messageMapper.countUnseenMessagesInMailbox(benwaInboxMailbox)).isEqualTo(6);
-    }
-
-    @Test
-    public void copyShouldIncrementModSeq() throws MailboxException, 
IOException {
-        saveMessages();
-        long modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox);
-        messageMapper.copy(benwaInboxMailbox, 
SimpleMailboxMessage.copy(benwaInboxMailbox.getMailboxId(), message6));
-        
assertThat(messageMapper.getHighestModSeq(benwaInboxMailbox)).isGreaterThan(modSeq);
-    }
-
-    @Test
-    public void copyShouldCreateAMessageInDestination() throws 
MailboxException, IOException {
-        saveMessages();
-        MailboxMessage message7 = 
SimpleMailboxMessage.copy(benwaInboxMailbox.getMailboxId(), message6);
-        messageMapper.copy(benwaInboxMailbox, message7);
-        message7.setModSeq(messageMapper.getHighestModSeq(benwaInboxMailbox));
-        
assertThat(messageMapper.getLastUid(benwaInboxMailbox)).isGreaterThan(message6.getUid());
-
-        MailboxMessage result = messageMapper.findInMailbox(benwaInboxMailbox,
-            MessageRange.one(messageMapper.getLastUid(benwaInboxMailbox)),
-            MessageMapper.FetchType.Full,
-            LIMIT)
-            .next();
-
-        MessageAssert.assertThat(result).isEqualToWithoutUid(message7, 
MessageMapper.FetchType.Full);
-        
assertThat(result.getUid()).isEqualTo(messageMapper.getLastUid(benwaInboxMailbox));
-    }
-    
-    @Test
-    public void copyOfSeenMessageShouldNotIncrementUnSeenMessageCount() throws 
MailboxException {
-        message6.setFlags(new Flags(Flags.Flag.SEEN));
-        messageMapper.copy(benwaInboxMailbox, 
SimpleMailboxMessage.copy(benwaInboxMailbox.getMailboxId(), message6));
-        
assertThat(messageMapper.countUnseenMessagesInMailbox(benwaInboxMailbox)).isEqualTo(0);
-    }
-
-    @Test
-    public void copiedMessageShouldBeMarkedAsRecent() throws MailboxException {
-        MessageMetaData metaData = messageMapper.copy(benwaInboxMailbox, 
SimpleMailboxMessage.copy(benwaInboxMailbox.getMailboxId(), message6));
-        assertThat(
-            messageMapper.findInMailbox(benwaInboxMailbox,
-                MessageRange.one(metaData.getUid()),
-                MessageMapper.FetchType.Metadata,
-                LIMIT
-            ).next()
-            .isRecent()
-        ).isTrue();
-    }
-
-    @Test
-    public void copiedRecentMessageShouldBeMarkedAsRecent() throws 
MailboxException {
-        message6.setFlags(new Flags(Flags.Flag.RECENT));
-        MessageMetaData metaData = messageMapper.copy(benwaInboxMailbox, 
SimpleMailboxMessage.copy(benwaInboxMailbox.getMailboxId(), message6));
-        assertThat(
-            messageMapper.findInMailbox(benwaInboxMailbox,
-                MessageRange.one(metaData.getUid()),
-                MessageMapper.FetchType.Metadata,
-                LIMIT
-            ).next()
-                .isRecent()
-        ).isTrue();
-    }
-
-    @Test
-    public void flagsReplacementShouldReplaceStoredMessageFlags() throws 
MailboxException {
-        saveMessages();
-        messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new Flags(Flags.Flag.FLAGGED), FlagsUpdateMode.REPLACE), 
MessageRange.one(message1.getUid()));
-        
MessageAssert.assertThat(retrieveMessageFromStorage(message1)).hasFlags(new 
Flags(Flags.Flag.FLAGGED));
-    }
-
-    @Test
-    public void 
flagsReplacementShouldReturnAnUpdatedFlagHighlightingTheReplacement() throws 
MailboxException {
-        saveMessages();
-        long modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox);
-        assertThat(messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new Flags(Flags.Flag.FLAGGED), FlagsUpdateMode.REPLACE), 
MessageRange.one(message1.getUid())))
-            .containsOnly(new UpdatedFlags(message1.getUid(), modSeq + 1, new 
Flags(), new Flags(Flags.Flag.FLAGGED)));
-    }
-
-    @Test
-    public void 
flagsAdditionShouldReturnAnUpdatedFlagHighlightingTheAddition() throws 
MailboxException {
-        saveMessages();
-        messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new Flags(Flags.Flag.FLAGGED), FlagsUpdateMode.REPLACE), 
MessageRange.one(message1.getUid()));
-        long modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox);
-        assertThat(messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.ADD), 
MessageRange.one(message1.getUid())))
-            .containsOnly(new UpdatedFlags(message1.getUid(), modSeq + 1, new 
Flags(Flags.Flag.FLAGGED), new FlagsBuilder().add(Flags.Flag.SEEN, 
Flags.Flag.FLAGGED).build()));
-    }
-
-    @Test
-    public void flagsAdditionShouldUpdateStoredMessageFlags() throws 
MailboxException {
-        saveMessages();
-        messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new Flags(Flags.Flag.FLAGGED), FlagsUpdateMode.REPLACE), 
MessageRange.one(message1.getUid()));
-        messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.ADD), 
MessageRange.one(message1.getUid()));
-        
MessageAssert.assertThat(retrieveMessageFromStorage(message1)).hasFlags(new 
FlagsBuilder().add(Flags.Flag.SEEN, Flags.Flag.FLAGGED).build());
-    }
-
-    @Test
-    public void flagsRemovalShouldReturnAnUpdatedFlagHighlightingTheRemoval() 
throws MailboxException {
-        saveMessages();
-        messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new FlagsBuilder().add(Flags.Flag.FLAGGED, 
Flags.Flag.SEEN).build(), FlagsUpdateMode.REPLACE), 
MessageRange.one(message1.getUid()));
-        long modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox);
-        assertThat(messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REMOVE), 
MessageRange.one(message1.getUid())))
-            .containsOnly(new UpdatedFlags(message1.getUid(), modSeq + 1, new 
FlagsBuilder().add(Flags.Flag.SEEN, Flags.Flag.FLAGGED).build(), new 
Flags(Flags.Flag.FLAGGED)));
-    }
-
-    @Test
-    public void flagsRemovalShouldUpdateStoredMessageFlags() throws 
MailboxException {
-        saveMessages();
-        messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new FlagsBuilder().add(Flags.Flag.FLAGGED, 
Flags.Flag.SEEN).build(), FlagsUpdateMode.REPLACE), 
MessageRange.one(message1.getUid()));
-        messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REMOVE), 
MessageRange.one(message1.getUid()));
-        
MessageAssert.assertThat(retrieveMessageFromStorage(message1)).hasFlags(new 
Flags(Flags.Flag.FLAGGED));
-    }
-
-    @Test
-    public void updateFlagsOnRangeShouldAffectMessagesContainedInThisRange() 
throws MailboxException {
-        saveMessages();
-        assertThat(messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REPLACE), 
MessageRange.range(message1.getUid(), message3.getUid())))
-            .hasSize(3);
-    }
-
-    @Test
-    public void 
updateFlagsWithRangeFromShouldAffectMessagesContainedInThisRange() throws 
MailboxException {
-        saveMessages();
-        assertThat(messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REPLACE), 
MessageRange.from(message3.getUid()))).hasSize(3);
-    }
-
-    @Test
-    public void updateFlagsWithRangeAllRangeShouldAffectAllMessages() throws 
MailboxException {
-        saveMessages();
-        assertThat(messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REPLACE), 
MessageRange.all())).hasSize(5);
-    }
-        
-    @Test
-    public void messagePropertiesShouldBeStored() throws Exception {
-        PropertyBuilder propBuilder = new PropertyBuilder();
-        propBuilder.setMediaType("text");
-        propBuilder.setSubType("html");
-        propBuilder.setTextualLineCount(2L);
-        propBuilder.setProperty(StandardNames.NAMESPACE_RFC_2045, 
StandardNames.MIME_CONTENT_TRANSFER_ENCODING_NAME, "7bit");
-        
propBuilder.setProperty(StandardNames.MIME_CONTENT_TYPE_PARAMETER_SPACE, 
StandardNames.MIME_CONTENT_TYPE_PARAMETER_CHARSET_NAME, "US-ASCII");
-
-        SimpleMailboxMessage messageWithProperties = 
createMessage(benwaWorkMailbox, "Subject: messagePropertiesShouldBeStored 
\n\nBody\n.\n", BODY_START, propBuilder);
-        MessageMetaData messageMetaData = messageMapper.add(benwaInboxMailbox, 
messageWithProperties);
-        MailboxMessage message = 
messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.one(messageMetaData.getUid()), FetchType.Body, 1).next();
-        
assertThat(message.getProperties()).containsOnlyElementsOf(propBuilder.toProperties());
-    }
-
-    @Test
-    public void messagePropertiesShouldBeStoredWhenDuplicateEntries() throws 
Exception {
-        PropertyBuilder propBuilder = new PropertyBuilder();
-        propBuilder.setProperty(StandardNames.MIME_CONTENT_LANGUAGE_SPACE, 
StandardNames.MIME_CONTENT_LANGUAGE_NAME, "us");
-        propBuilder.setProperty(StandardNames.MIME_CONTENT_LANGUAGE_SPACE, 
StandardNames.MIME_CONTENT_LANGUAGE_NAME, "fr");
-
-        SimpleMailboxMessage messageWithProperties = 
createMessage(benwaWorkMailbox, "Subject: 
messagePropertiesShouldBeStoredWhenDuplicateEntries \n\nBody\n.\n", BODY_START, 
propBuilder);
-        MessageMetaData messageMetaData = messageMapper.add(benwaInboxMailbox, 
messageWithProperties);
-        MailboxMessage message = 
messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.one(messageMetaData.getUid()), FetchType.Body, 1).next();
-        
assertThat(message.getProperties()).containsOnlyElementsOf(propBuilder.toProperties());
-    }
-
-    @Test
-    public void messagePropertiesShouldBeStoredWhenNoProperty() throws 
Exception {
-        SimpleMailboxMessage messageWithProperties = 
createMessage(benwaWorkMailbox, "Subject: 
messagePropertiesShouldBeStoredWhenNoProperty \n\nBody\n.\n", BODY_START, new 
PropertyBuilder());
-        MessageMetaData messageMetaData = messageMapper.add(benwaInboxMailbox, 
messageWithProperties);
-        MailboxMessage message = 
messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.one(messageMetaData.getUid()), FetchType.Body, 1).next();
-        assertThat(message.getProperties()).isEmpty();
-    }
-
-    @Test
-    public void textualLineCountShouldBeWellStored() throws Exception {
-        long textualLineCount = 48L;
-        PropertyBuilder propBuilder = new PropertyBuilder();
-        propBuilder.setTextualLineCount(textualLineCount);
-
-        SimpleMailboxMessage messageWithProperties = 
createMessage(benwaWorkMailbox, "Subject: 
messagePropertiesShouldBeStoredWhenDuplicateEntries \n\nBody\n.\n", BODY_START, 
propBuilder);
-        MessageMetaData messageMetaData = messageMapper.add(benwaInboxMailbox, 
messageWithProperties);
-        MailboxMessage message = 
messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.one(messageMetaData.getUid()), FetchType.Body, 1).next();
-        assertThat(message.getTextualLineCount()).isEqualTo(textualLineCount);
-    }
-
-    @Test
-    public void mediaTypeShouldBeWellStored() throws Exception {
-        String mediaType = "plain";
-        PropertyBuilder propBuilder = new PropertyBuilder();
-        propBuilder.setMediaType(mediaType);
-
-        SimpleMailboxMessage messageWithProperties = 
createMessage(benwaWorkMailbox, "Subject: 
messagePropertiesShouldBeStoredWhenDuplicateEntries \n\nBody\n.\n", BODY_START, 
propBuilder);
-        MessageMetaData messageMetaData = messageMapper.add(benwaInboxMailbox, 
messageWithProperties);
-        MailboxMessage message = 
messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.one(messageMetaData.getUid()), FetchType.Body, 1).next();
-        assertThat(message.getMediaType()).isEqualTo(mediaType);
-    }
-
-    @Test
-    public void subTypeShouldBeWellStored() throws Exception {
-        String subType = "text";
-        PropertyBuilder propBuilder = new PropertyBuilder();
-        propBuilder.setSubType(subType);
-
-        SimpleMailboxMessage messageWithProperties = 
createMessage(benwaWorkMailbox, "Subject: 
messagePropertiesShouldBeStoredWhenDuplicateEntries \n\nBody\n.\n", BODY_START, 
propBuilder);
-        MessageMetaData messageMetaData = messageMapper.add(benwaInboxMailbox, 
messageWithProperties);
-        MailboxMessage message = 
messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.one(messageMetaData.getUid()), FetchType.Body, 1).next();
-        assertThat(message.getSubType()).isEqualTo(subType);
-    }
-
-    @Test
-    public void userFlagsShouldBeSupported() throws Exception {
-        saveMessages();
-        messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new Flags(USER_FLAG), FlagsUpdateMode.ADD), 
MessageRange.one(message1.getUid()));
-        
MessageAssert.assertThat(retrieveMessageFromStorage(message1)).hasFlags(new 
Flags(USER_FLAG));
-    }
-
-    @Test
-    public void userFlagsUpdateShouldReturnCorrectUpdatedFlags() throws 
Exception {
-        saveMessages();
-        long modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox);
-        assertThat(messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new Flags(USER_FLAG), FlagsUpdateMode.ADD), 
MessageRange.one(message1.getUid())))
-            .containsOnly(new UpdatedFlags(message1.getUid(), modSeq + 1, new 
Flags(), new Flags(USER_FLAG)));
-    }
-
-    @Test
-    public void messagesShouldBeSavedWithTheirUserFlags() throws Exception {
-        MailboxMessage message = 
SimpleMailboxMessage.copy(benwaInboxMailbox.getMailboxId(), message1);
-        messageMapper.add(benwaInboxMailbox, message);
-        
MessageAssert.assertThat(retrieveMessageFromStorage(message)).hasFlags(new 
Flags(USER_FLAG));
-    }
-
-    private Map<Long, MessageMetaData> markThenPerformExpunge(MessageRange 
range) throws MailboxException {
-        messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new Flags(Flags.Flag.DELETED), FlagsUpdateMode.REPLACE), 
MessageRange.one(message1.getUid()));
-        messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new Flags(Flags.Flag.DELETED), FlagsUpdateMode.REPLACE), 
MessageRange.one(message4.getUid()));
-        return 
messageMapper.expungeMarkedForDeletionInMailbox(benwaInboxMailbox, range);
-    }
-
-    private SimpleMailbox createMailbox(MailboxPath mailboxPath) {
-        SimpleMailbox mailbox = new SimpleMailbox(mailboxPath, UID_VALIDITY);
-        MailboxId id = mapperProvider.generateId();
-        mailbox.setMailboxId(id);
-        return mailbox;
-    }
-    
-    private void saveMessages() throws MailboxException {
-        messageMapper.add(benwaInboxMailbox, message1);
-        message1.setModSeq(messageMapper.getHighestModSeq(benwaInboxMailbox));
-        messageMapper.add(benwaInboxMailbox, message2);
-        message2.setModSeq(messageMapper.getHighestModSeq(benwaInboxMailbox));
-        messageMapper.add(benwaInboxMailbox, message3);
-        message3.setModSeq(messageMapper.getHighestModSeq(benwaInboxMailbox));
-        messageMapper.add(benwaInboxMailbox, message4);
-        message4.setModSeq(messageMapper.getHighestModSeq(benwaInboxMailbox));
-        messageMapper.add(benwaInboxMailbox, message5);
-        message5.setModSeq(messageMapper.getHighestModSeq(benwaInboxMailbox));
-        messageMapper.add(benwaWorkMailbox, message6);
-        message6.setModSeq(messageMapper.getHighestModSeq(benwaWorkMailbox));
-        messageMapper.add(attachmentsMailbox, message7With1Attachment);
-        
message7With1Attachment.setModSeq(messageMapper.getHighestModSeq(attachmentsMailbox));
-        messageMapper.add(attachmentsMailbox, message8With2Attachments);
-        
message8With2Attachments.setModSeq(messageMapper.getHighestModSeq(attachmentsMailbox));
-    }
-
-    private MailboxMessage retrieveMessageFromStorage(MailboxMessage message) 
throws MailboxException {
-        return messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.one(message.getUid()), MessageMapper.FetchType.Metadata, 
LIMIT).next();
-    }
-    
-    private SimpleMailboxMessage createMessage(Mailbox mailbox, String 
content, int bodyStart, PropertyBuilder propertyBuilder, List<AttachmentId> 
attachmentsIds) {
-        return new SimpleMailboxMessage(new Date(), content.length(), 
bodyStart, new SharedByteArrayInputStream(content.getBytes()), new Flags(), 
propertyBuilder, mailbox.getMailboxId(), attachmentsIds);
-    }
-    
-    private SimpleMailboxMessage createMessage(Mailbox mailbox, String 
content, int bodyStart, PropertyBuilder propertyBuilder) {
-        return new SimpleMailboxMessage(new Date(), content.length(), 
bodyStart, new SharedByteArrayInputStream(content.getBytes()), new Flags(), 
propertyBuilder, mailbox.getMailboxId());
-    }
-}


---------------------------------------------------------------------
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