You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ad...@apache.org on 2017/04/26 11:51:15 UTC

[06/12] james-project git commit: JAMES-2008 Remove all JUNIT contracts usages for Mailbox manager tests

JAMES-2008 Remove all JUNIT contracts usages for Mailbox manager 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/a9fdb1c4
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/a9fdb1c4
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/a9fdb1c4

Branch: refs/heads/master
Commit: a9fdb1c481a1e22b9389ee7b26043624817c5ef2
Parents: e9a73fd
Author: benwa <bt...@linagora.com>
Authored: Wed Apr 19 15:39:59 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Wed Apr 26 13:50:10 2017 +0200

----------------------------------------------------------------------
 mailbox/api/pom.xml                             |  14 +-
 .../james/mailbox/MailboxManagerStressTest.java |  26 +--
 .../james/mailbox/MailboxManagerTest.java       |  80 +++++----
 mailbox/cassandra/pom.xml                       |   5 -
 .../CassandraMailboxManagerProvider.java        |  99 +++++++++++
 .../CassandraMailboxManagerStressTest.java      |  68 ++++++++
 .../cassandra/CassandraMailboxManagerTest.java  | 108 ++----------
 mailbox/hbase/pom.xml                           |   5 -
 .../hbase/HBaseMailboxManagerStressTest.java    | 102 ++++++++++++
 .../mailbox/hbase/HBaseMailboxManagerTest.java  |  80 ++++-----
 mailbox/jcr/pom.xml                             |   5 -
 .../mailbox/jcr/JCRMailboxManagerProvider.java  |  79 +++++++++
 .../jcr/JCRMailboxManagerStressTest.java        |  64 ++++++++
 .../mailbox/jcr/JCRMailboxManagerTest.java      | 101 +++---------
 mailbox/jpa/pom.xml                             |   5 -
 .../mailbox/jpa/JPAMailboxManagerTest.java      |  87 ++--------
 .../mailbox/jpa/JpaMailboxManagerProvider.java  |  63 +++++++
 .../jpa/JpaMailboxManagerStressTest.java        |  52 ++++++
 mailbox/maildir/pom.xml                         |   5 -
 ...mainUserMaildirMailboxManagerStressTest.java |  43 +++++
 .../DomainUserMaildirMailboxManagerTest.java    |  51 ++++++
 ...FullUserMaildirMailboxManagerStressTest.java |  43 +++++
 .../FullUserMaildirMailboxManagerTest.java      |  51 ++++++
 .../maildir/MaildirMailboxManagerProvider.java  |  54 ++++++
 .../maildir/MaildirMailboxManagerTests.java     | 163 -------------------
 .../UserMaildirMailboxManagerStressTest.java    |  43 +++++
 mailbox/memory/pom.xml                          |   5 -
 .../inmemory/InMemoryMailboxManagerTest.java    |  77 ---------
 .../inmemory/MemoryMailboxManagerProvider.java  |  58 +++++++
 .../MemoryMailboxManagerStressTest.java         |  30 ++++
 .../inmemory/MemoryMailboxManagerTest.java      |  30 ++++
 31 files changed, 1073 insertions(+), 623 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/a9fdb1c4/mailbox/api/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/api/pom.xml b/mailbox/api/pom.xml
index 6917440..35471bf 100644
--- a/mailbox/api/pom.xml
+++ b/mailbox/api/pom.xml
@@ -41,12 +41,17 @@
             <artifactId>javax.mail</artifactId>
         </dependency>
         <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+        </dependency>
+        <dependency>
             <groupId>commons-lang</groupId>
             <artifactId>commons-lang</artifactId>
         </dependency>
         <dependency>
-            <groupId>commons-codec</groupId>
-            <artifactId>commons-codec</artifactId>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
@@ -83,11 +88,6 @@
             <artifactId>mockito-core</artifactId>
             <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/a9fdb1c4/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerStressTest.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerStressTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerStressTest.java
index 9221557..f92cb11 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerStressTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerStressTest.java
@@ -37,34 +37,26 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxPath;
-import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
 import org.slf4j.LoggerFactory;
-import org.xenei.junit.contract.Contract;
-import org.xenei.junit.contract.ContractTest;
-import org.xenei.junit.contract.IProducer;
 
 import com.google.common.collect.ImmutableSet;
 
-@Contract(MailboxManager.class)
-public class MailboxManagerStressTest<T extends MailboxManager> {
+public abstract class MailboxManagerStressTest {
 
     private final static int APPEND_OPERATIONS = 200;
 
-    private IProducer<T> producer;
     private MailboxManager mailboxManager;
 
-    @Contract.Inject
-    public final void setProducer(IProducer<T> producer) throws MailboxException {
-        this.producer = producer;
-        this.mailboxManager = producer.newInstance();
-    }
+    protected abstract MailboxManager provideManager();
 
-    @After
-    public void tearDown() {
-        producer.cleanUp();
+    @Before
+    public final void setUp() throws MailboxException {
+        this.mailboxManager = provideManager();
     }
 
-    @ContractTest
+    @Test
     public void testStressTest() throws InterruptedException, MailboxException {
 
         final CountDownLatch latch = new CountDownLatch(APPEND_OPERATIONS);
@@ -123,7 +115,7 @@ public class MailboxManagerStressTest<T extends MailboxManager> {
                         }
                         mailboxManager.endProcessingRequest(session);
                         mailboxManager.logout(session, false);
-                    } catch (MailboxException e) {
+                    } catch (Exception e) {
                         e.printStackTrace();
                         fail.set(true);
                     } finally {

http://git-wip-us.apache.org/repos/asf/james-project/blob/a9fdb1c4/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
index 8024f26..2f4e808 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
@@ -41,19 +41,18 @@ import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MailboxQuery;
 import org.junit.After;
 import org.junit.Assume;
+import org.junit.Before;
 import org.junit.Rule;
+import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.slf4j.LoggerFactory;
-import org.xenei.junit.contract.Contract;
-import org.xenei.junit.contract.ContractTest;
-import org.xenei.junit.contract.IProducer;
 
 import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 
 /**
- * Test the {@link StoreMailboxManager} methods that
+ * Test the {@link MailboxManager} methods that
  * are not covered by the protocol-tester suite.
  * 
  * This class needs to be extended by the different mailbox 
@@ -61,8 +60,7 @@ import com.google.common.collect.ImmutableSet;
  * implement the test methods.
  * 
  */
-@Contract(MailboxManager.class)
-public class MailboxManagerTest<T extends MailboxManager> {
+public abstract class MailboxManagerTest {
     
     public final static String USER_1 = "USER_1";
     public final static String USER_2 = "USER_2";
@@ -83,32 +81,30 @@ public class MailboxManagerTest<T extends MailboxManager> {
     @Rule
     public ExpectedException expected = ExpectedException.none();
 
-    private IProducer<T> producer;
     private MailboxManager mailboxManager;
     private MailboxSession session;
 
-    @Contract.Inject
-    public final void setProducer(IProducer<T> producer) throws Exception {
-        this.producer = producer;
-        this.mailboxManager = new MockMailboxManager(producer.newInstance()).getMockMailboxManager();
+    protected abstract MailboxManager provideMailboxManager();
+
+    @Before
+    public final void setUp() throws Exception {
+        this.mailboxManager = new MockMailboxManager(provideMailboxManager()).getMockMailboxManager();
     }
 
     @After
     public void tearDown() throws Exception {
         mailboxManager.logout(session, false);
         mailboxManager.endProcessingRequest(session);
-
-        producer.cleanUp();
     }
     
-    @ContractTest
+    @Test
     public void createUser1SystemSessionShouldReturnValidSession() throws UnsupportedEncodingException, MailboxException {
         session = mailboxManager.createSystemSession(USER_1, LoggerFactory.getLogger("Mock"));
         
         assertThat(session.getUser().getUserName()).isEqualTo(USER_1);
     }
 
-    @ContractTest
+    @Test
     public void user1ShouldNotHaveAnInbox() throws UnsupportedEncodingException, MailboxException {
         session = mailboxManager.createSystemSession(USER_1, LoggerFactory.getLogger("Mock"));
         mailboxManager.startProcessingRequest(session);
@@ -117,7 +113,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
         assertThat(mailboxManager.mailboxExists(inbox, session)).isFalse();
     }
 
-    @ContractTest
+    @Test
     public void createMailboxShouldReturnRightId() throws MailboxException, UnsupportedEncodingException {
         session = mailboxManager.createSystemSession(USER_1, LoggerFactory.getLogger("Mock"));
         mailboxManager.startProcessingRequest(session);
@@ -130,7 +126,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
         assertThat(mailboxId.get()).isEqualTo(retrievedMailbox.getId());
     }
 
-    @ContractTest
+    @Test
     public void user1ShouldBeAbleToCreateInbox() throws MailboxException, UnsupportedEncodingException {
         session = mailboxManager.createSystemSession(USER_1, LoggerFactory.getLogger("Mock"));
         mailboxManager.startProcessingRequest(session);
@@ -141,7 +137,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
         assertThat(mailboxManager.mailboxExists(inbox, session)).isTrue();
     }
 
-    @ContractTest
+    @Test
     public void user1ShouldNotBeAbleToCreateInboxTwice() throws MailboxException, UnsupportedEncodingException {
         expected.expect(MailboxException.class);
         session = mailboxManager.createSystemSession(USER_1, LoggerFactory.getLogger("Mock"));
@@ -151,7 +147,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
         mailboxManager.createMailbox(inbox, session);
     }
 
-    @ContractTest
+    @Test
     public void user1ShouldNotHaveTestSubmailbox() throws MailboxException, UnsupportedEncodingException {
         session = mailboxManager.createSystemSession(USER_1, LoggerFactory.getLogger("Mock"));
         mailboxManager.startProcessingRequest(session);
@@ -162,7 +158,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
         assertThat(mailboxManager.mailboxExists(new MailboxPath(inbox, "INBOX.Test"), session)).isFalse();
     }
     
-    @ContractTest
+    @Test
     public void user1ShouldBeAbleToCreateTestSubmailbox() throws MailboxException, UnsupportedEncodingException {
         session = mailboxManager.createSystemSession(USER_1, LoggerFactory.getLogger("Mock"));
         mailboxManager.startProcessingRequest(session);
@@ -175,7 +171,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
         assertThat(mailboxManager.mailboxExists(inboxSubMailbox, session)).isTrue();
     }
     
-    @ContractTest
+    @Test
     public void user1ShouldBeAbleToDeleteInbox() throws MailboxException, UnsupportedEncodingException {
         session = mailboxManager.createSystemSession(USER_1, LoggerFactory.getLogger("Mock"));
         mailboxManager.startProcessingRequest(session);
@@ -191,7 +187,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
         assertThat(mailboxManager.mailboxExists(inboxSubMailbox, session)).isTrue();
     }
     
-    @ContractTest
+    @Test
     public void user1ShouldBeAbleToDeleteSubmailbox() throws MailboxException, UnsupportedEncodingException {
         session = mailboxManager.createSystemSession(USER_1, LoggerFactory.getLogger("Mock"));
         mailboxManager.startProcessingRequest(session);
@@ -207,7 +203,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
         assertThat(mailboxManager.mailboxExists(inboxSubMailbox, session)).isFalse();
     }
 
-    @ContractTest
+    @Test
     public void closingSessionShouldWork() throws BadCredentialsException, MailboxException, UnsupportedEncodingException {
         session = mailboxManager.createSystemSession(USER_1, LoggerFactory.getLogger("Mock"));
         mailboxManager.startProcessingRequest(session);
@@ -218,7 +214,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
         assertThat(session.isOpen()).isFalse();
     }
 
-    @ContractTest
+    @Test
     public void listShouldReturnMailboxes() throws MailboxException, UnsupportedEncodingException {
         session = mailboxManager.createSystemSession("manager", LoggerFactory.getLogger("testList"));
         mailboxManager.startProcessingRequest(session);
@@ -226,7 +222,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
         assertThat(mailboxManager.list(session)).hasSize(MockMailboxManager.EXPECTED_MAILBOXES_COUNT);
     }
 
-    @ContractTest
+    @Test
     public void user2ShouldBeAbleToCreateRootlessFolder() throws BadCredentialsException, MailboxException {
         session = mailboxManager.createSystemSession(USER_2, LoggerFactory.getLogger("Test"));
         MailboxPath trash = new MailboxPath(MailboxConstants.USER_NAMESPACE, USER_2, "Trash");
@@ -235,7 +231,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
         assertThat(mailboxManager.mailboxExists(trash, session)).isTrue();
     }
     
-    @ContractTest
+    @Test
     public void user2ShouldBeAbleToCreateNestedFoldersWithoutTheirParents() throws BadCredentialsException, MailboxException {
         session = mailboxManager.createSystemSession(USER_2, LoggerFactory.getLogger("Test"));
         MailboxPath nestedFolder = new MailboxPath(MailboxConstants.USER_NAMESPACE, USER_2, "INBOX.testfolder");
@@ -245,7 +241,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
         mailboxManager.getMailbox(MailboxPath.inbox(session), session).appendMessage(new ByteArrayInputStream("Subject: test\r\n\r\ntestmail".getBytes()), new Date(), session, false, new Flags());
     }
 
-    @ContractTest
+    @Test
     public void searchShouldNotReturnResultsFromOtherNamespaces() throws Exception {
         Assume.assumeTrue(mailboxManager.hasCapability(MailboxCapabilities.Namespace));
         session = mailboxManager.createSystemSession(USER_1, LoggerFactory.getLogger("Mock"));
@@ -256,7 +252,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
         assertThat(metaDatas.get(0).getPath()).isEqualTo(MailboxPath.inbox(session));
     }
 
-    @ContractTest
+    @Test
     public void searchShouldNotReturnResultsFromOtherUsers() throws Exception {
         session = mailboxManager.createSystemSession(USER_1, LoggerFactory.getLogger("Mock"));
         mailboxManager.createMailbox(new MailboxPath("#namespace", USER_2, "Other"), session);
@@ -266,7 +262,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
         assertThat(metaDatas.get(0).getPath()).isEqualTo(MailboxPath.inbox(session));
     }
 
-    @ContractTest
+    @Test
     public void updateAnnotationsShouldUpdateStoredAnnotation() throws MailboxException {
         Assume.assumeTrue(mailboxManager.hasCapability(MailboxCapabilities.Annotation));
         session = mailboxManager.createSystemSession(USER_2, LoggerFactory.getLogger("Test"));
@@ -279,7 +275,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
         assertThat(mailboxManager.getAllAnnotations(inbox, session)).containsOnly(PRIVATE_ANNOTATION_UPDATE);
     }
 
-    @ContractTest
+    @Test
     public void updateAnnotationsShouldDeleteAnnotationWithNilValue() throws BadCredentialsException, MailboxException {
         Assume.assumeTrue(mailboxManager.hasCapability(MailboxCapabilities.Annotation));
         session = mailboxManager.createSystemSession(USER_2, LoggerFactory.getLogger("Test"));
@@ -292,7 +288,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
         assertThat(mailboxManager.getAllAnnotations(inbox, session)).isEmpty();
     }
 
-    @ContractTest
+    @Test
     public void updateAnnotationsShouldThrowExceptionIfMailboxDoesNotExist() throws MailboxException {
         Assume.assumeTrue(mailboxManager.hasCapability(MailboxCapabilities.Annotation));
         expected.expect(MailboxException.class);
@@ -302,7 +298,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
         mailboxManager.updateAnnotations(inbox, session, ImmutableList.of(PRIVATE_ANNOTATION));
     }
 
-    @ContractTest
+    @Test
     public void getAnnotationsShouldReturnEmptyForNonStoredAnnotation() throws BadCredentialsException, MailboxException {
         Assume.assumeTrue(mailboxManager.hasCapability(MailboxCapabilities.Annotation));
         session = mailboxManager.createSystemSession(USER_2, LoggerFactory.getLogger("Test"));
@@ -312,7 +308,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
         assertThat(mailboxManager.getAllAnnotations(inbox, session)).isEmpty();
     }
 
-    @ContractTest
+    @Test
     public void getAllAnnotationsShouldRetrieveStoredAnnotations() throws BadCredentialsException, MailboxException {
         Assume.assumeTrue(mailboxManager.hasCapability(MailboxCapabilities.Annotation));
         session = mailboxManager.createSystemSession(USER_2, LoggerFactory.getLogger("Test"));
@@ -324,7 +320,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
         assertThat(mailboxManager.getAllAnnotations(inbox, session)).isEqualTo(ANNOTATIONS);
     }
 
-    @ContractTest
+    @Test
     public void getAllAnnotationsShouldThrowExceptionIfMailboxDoesNotExist() throws MailboxException {
         Assume.assumeTrue(mailboxManager.hasCapability(MailboxCapabilities.Annotation));
         expected.expect(MailboxException.class);
@@ -334,7 +330,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
         mailboxManager.getAllAnnotations(inbox, session);
     }
 
-    @ContractTest
+    @Test
     public void getAnnotationsByKeysShouldRetrieveStoresAnnotationsByKeys() throws BadCredentialsException, MailboxException {
         Assume.assumeTrue(mailboxManager.hasCapability(MailboxCapabilities.Annotation));
         session = mailboxManager.createSystemSession(USER_2, LoggerFactory.getLogger("Test"));
@@ -347,7 +343,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
             .containsOnly(PRIVATE_ANNOTATION);
     }
 
-    @ContractTest
+    @Test
     public void getAnnotationsByKeysShouldThrowExceptionIfMailboxDoesNotExist() throws MailboxException {
         Assume.assumeTrue(mailboxManager.hasCapability(MailboxCapabilities.Annotation));
         expected.expect(MailboxException.class);
@@ -357,7 +353,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
         mailboxManager.getAnnotationsByKeys(inbox, session, ImmutableSet.of(PRIVATE_KEY));
     }
 
-    @ContractTest
+    @Test
     public void getAnnotationsByKeysWithOneDepthShouldRetriveAnnotationsWithOneDepth() throws BadCredentialsException, MailboxException {
         Assume.assumeTrue(mailboxManager.hasCapability(MailboxCapabilities.Annotation));
         session = mailboxManager.createSystemSession(USER_2, LoggerFactory.getLogger("Test"));
@@ -370,7 +366,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
             .contains(PRIVATE_ANNOTATION, PRIVATE_CHILD_ANNOTATION);
     }
 
-    @ContractTest
+    @Test
     public void getAnnotationsByKeysWithAllDepthShouldThrowExceptionWhenMailboxDoesNotExist() throws BadCredentialsException, MailboxException {
         Assume.assumeTrue(mailboxManager.hasCapability(MailboxCapabilities.Annotation));
         expected.expect(MailboxException.class);
@@ -380,7 +376,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
         mailboxManager.getAnnotationsByKeysWithAllDepth(inbox, session, ImmutableSet.of(PRIVATE_KEY));
     }
 
-    @ContractTest
+    @Test
     public void getAnnotationsByKeysWithAllDepthShouldRetriveAnnotationsWithAllDepth() throws BadCredentialsException, MailboxException {
         Assume.assumeTrue(mailboxManager.hasCapability(MailboxCapabilities.Annotation));
         session = mailboxManager.createSystemSession(USER_2, LoggerFactory.getLogger("Test"));
@@ -393,7 +389,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
             .contains(PRIVATE_ANNOTATION, PRIVATE_CHILD_ANNOTATION, PRIVATE_GRANDCHILD_ANNOTATION);
     }
 
-    @ContractTest
+    @Test
     public void updateAnnotationsShouldThrowExceptionIfAnnotationDataIsOverLimitation() throws MailboxException {
         Assume.assumeTrue(mailboxManager.hasCapability(MailboxCapabilities.Annotation));
         expected.expect(AnnotationException.class);
@@ -404,7 +400,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
         mailboxManager.updateAnnotations(inbox, session, ImmutableList.of(MailboxAnnotation.newInstance(PRIVATE_KEY, "The limitation of data is less than 30")));
     }
 
-    @ContractTest
+    @Test
     public void shouldUpdateAnnotationWhenRequestCreatesNewAndMailboxIsNotOverLimit() throws MailboxException {
         Assume.assumeTrue(mailboxManager.hasCapability(MailboxCapabilities.Annotation));
         session = mailboxManager.createSystemSession(USER_2, LoggerFactory.getLogger("Test"));
@@ -419,7 +415,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
         mailboxManager.updateAnnotations(inbox, session, builder.build());
     }
 
-    @ContractTest
+    @Test
     public void updateAnnotationsShouldThrowExceptionIfRequestCreateNewButMailboxIsOverLimit() throws MailboxException {
         Assume.assumeTrue(mailboxManager.hasCapability(MailboxCapabilities.Annotation));
         expected.expect(MailboxException.class);

http://git-wip-us.apache.org/repos/asf/james-project/blob/a9fdb1c4/mailbox/cassandra/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/pom.xml b/mailbox/cassandra/pom.xml
index 5f3599c..ac44bb6 100644
--- a/mailbox/cassandra/pom.xml
+++ b/mailbox/cassandra/pom.xml
@@ -147,11 +147,6 @@
             </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/a9fdb1c4/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
new file mode 100644
index 0000000..41bcd4b
--- /dev/null
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
@@ -0,0 +1,99 @@
+/****************************************************************
+ * 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;
+
+import org.apache.james.backends.cassandra.init.CassandraTypesProvider;
+import org.apache.james.mailbox.acl.GroupMembershipResolver;
+import org.apache.james.mailbox.acl.MailboxACLResolver;
+import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
+import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
+import org.apache.james.mailbox.cassandra.mail.CassandraApplicableFlagDAO;
+import org.apache.james.mailbox.cassandra.mail.CassandraDeletedMessageDAO;
+import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO;
+import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO;
+import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO;
+import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathDAO;
+import org.apache.james.mailbox.cassandra.mail.CassandraMailboxRecentsDAO;
+import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
+import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
+import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO;
+import org.apache.james.mailbox.cassandra.mail.CassandraModSeqProvider;
+import org.apache.james.mailbox.cassandra.mail.CassandraUidProvider;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.Authorizator;
+import org.apache.james.mailbox.store.NoMailboxPathLocker;
+import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
+
+import com.datastax.driver.core.Session;
+import com.google.common.base.Throwables;
+
+public class CassandraMailboxManagerProvider {
+    private static final int LIMIT_ANNOTATIONS = 3;
+    private static final int LIMIT_ANNOTATION_SIZE = 30;
+    public static final int MAX_ACL_RETRY = 10;
+
+    public static CassandraMailboxManager provideMailboxManager(Session session, CassandraTypesProvider cassandraTypesProvider) {
+        CassandraUidProvider uidProvider = new CassandraUidProvider(session);
+        CassandraModSeqProvider modSeqProvider = new CassandraModSeqProvider(session);
+        CassandraMessageId.Factory messageIdFactory = new CassandraMessageId.Factory();
+        CassandraMessageIdDAO messageIdDAO = new CassandraMessageIdDAO(session, messageIdFactory);
+        CassandraMessageIdToImapUidDAO imapUidDAO = new CassandraMessageIdToImapUidDAO(session, messageIdFactory);
+        CassandraMessageDAO messageDAO = new CassandraMessageDAO(session, cassandraTypesProvider, messageIdFactory);
+        CassandraMailboxCounterDAO mailboxCounterDAO = new CassandraMailboxCounterDAO(session);
+        CassandraMailboxRecentsDAO mailboxRecentsDAO = new CassandraMailboxRecentsDAO(session);
+        CassandraMailboxDAO mailboxDAO = new CassandraMailboxDAO(session, cassandraTypesProvider, MAX_ACL_RETRY);
+        CassandraMailboxPathDAO mailboxPathDAO = new CassandraMailboxPathDAO(session, cassandraTypesProvider);
+        CassandraFirstUnseenDAO firstUnseenDAO = new CassandraFirstUnseenDAO(session);
+        CassandraApplicableFlagDAO applicableFlagDAO = new CassandraApplicableFlagDAO(session);
+        CassandraDeletedMessageDAO deletedMessageDAO = new CassandraDeletedMessageDAO(session);
+
+        CassandraMailboxSessionMapperFactory mapperFactory = new CassandraMailboxSessionMapperFactory(uidProvider,
+            modSeqProvider,
+            session,
+            messageDAO,
+            messageIdDAO,
+            imapUidDAO,
+            mailboxCounterDAO,
+            mailboxRecentsDAO,
+            mailboxDAO,
+            mailboxPathDAO,
+            firstUnseenDAO,
+            applicableFlagDAO,
+            deletedMessageDAO);
+
+        MailboxACLResolver aclResolver = new UnionMailboxACLResolver();
+        GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
+        MessageParser messageParser = new MessageParser();
+
+        Authenticator noAuthenticator = null;
+        Authorizator noAuthorizator = null;
+        CassandraMailboxManager manager = new CassandraMailboxManager(mapperFactory, noAuthenticator, noAuthorizator, new NoMailboxPathLocker(), aclResolver, groupMembershipResolver,
+            messageParser, messageIdFactory, LIMIT_ANNOTATIONS, LIMIT_ANNOTATION_SIZE);
+        try {
+            manager.init();
+        } catch (MailboxException e) {
+            throw Throwables.propagate(e);
+        }
+
+        return manager;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/a9fdb1c4/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java
new file mode 100644
index 0000000..5ba536a
--- /dev/null
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java
@@ -0,0 +1,68 @@
+/****************************************************************
+ * 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;
+
+import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
+import org.apache.james.mailbox.MailboxManager;
+import org.apache.james.mailbox.MailboxManagerStressTest;
+import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
+import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule;
+import org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
+import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
+import org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
+import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
+import org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;
+import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
+import org.apache.james.mailbox.cassandra.modules.CassandraMailboxRecentsModule;
+import org.apache.james.mailbox.cassandra.modules.CassandraMessageModule;
+import org.apache.james.mailbox.cassandra.modules.CassandraModSeqModule;
+import org.apache.james.mailbox.cassandra.modules.CassandraSubscriptionModule;
+import org.apache.james.mailbox.cassandra.modules.CassandraUidModule;
+import org.junit.After;
+import org.junit.Ignore;
+
+@Ignore("https://issues.apache.org/jira/browse/JAMES-2009")
+public class CassandraMailboxManagerStressTest extends MailboxManagerStressTest {
+    private static final CassandraCluster CASSANDRA = CassandraCluster.create(new CassandraModuleComposite(
+        new CassandraAclModule(),
+        new CassandraMailboxModule(),
+        new CassandraMessageModule(),
+        new CassandraMailboxCounterModule(),
+        new CassandraMailboxRecentsModule(),
+        new CassandraFirstUnseenModule(),
+        new CassandraUidModule(),
+        new CassandraModSeqModule(),
+        new CassandraSubscriptionModule(),
+        new CassandraAttachmentModule(),
+        new CassandraDeletedMessageModule(),
+        new CassandraAnnotationModule(),
+        new CassandraApplicableFlagsModule()));
+
+    @Override
+    protected MailboxManager provideManager() {
+        return CassandraMailboxManagerProvider.provideMailboxManager(CASSANDRA.getConf(), CASSANDRA.getTypesProvider());
+    }
+
+    @After
+    public void tearDown() {
+        CASSANDRA.clearAllTables();
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/a9fdb1c4/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
index 2c5b99b..63333e4 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
@@ -20,24 +20,11 @@ package org.apache.james.mailbox.cassandra;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
-import org.apache.james.mailbox.acl.GroupMembershipResolver;
-import org.apache.james.mailbox.acl.MailboxACLResolver;
-import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
-import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
-import org.apache.james.mailbox.cassandra.mail.CassandraDeletedMessageDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraApplicableFlagDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraMailboxRecentsDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraModSeqProvider;
-import org.apache.james.mailbox.cassandra.mail.CassandraUidProvider;
+import org.apache.james.mailbox.MailboxManager;
+import org.apache.james.mailbox.MailboxManagerTest;
 import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule;
+import org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
@@ -48,25 +35,9 @@ import org.apache.james.mailbox.cassandra.modules.CassandraMessageModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraModSeqModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraSubscriptionModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraUidModule;
-import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.store.Authenticator;
-import org.apache.james.mailbox.store.Authorizator;
-import org.apache.james.mailbox.store.NoMailboxPathLocker;
-import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
-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 org.junit.After;
 
-import com.google.common.base.Throwables;
-
-@RunWith(ContractSuite.class)
-@ContractImpl(CassandraMailboxManager.class)
-public class CassandraMailboxManagerTest {
-    private static final int LIMIT_ANNOTATIONS = 3;
-    private static final int LIMIT_ANNOTATION_SIZE = 30;
-    public static final int MAX_ACL_RETRY = 10;
+public class CassandraMailboxManagerTest extends MailboxManagerTest {
 
     private static final CassandraCluster CASSANDRA = CassandraCluster.create(new CassandraModuleComposite(
         new CassandraAclModule(),
@@ -80,67 +51,18 @@ public class CassandraMailboxManagerTest {
         new CassandraSubscriptionModule(),
         new CassandraAttachmentModule(),
         new CassandraDeletedMessageModule(),
-        new CassandraAnnotationModule()));
-
-    private IProducer<CassandraMailboxManager> producer = new IProducer<CassandraMailboxManager>() {
-
-        @Override
-        public CassandraMailboxManager newInstance() {
-            CASSANDRA.ensureAllTables();
-            CassandraUidProvider uidProvider = new CassandraUidProvider(CASSANDRA.getConf());
-            CassandraModSeqProvider modSeqProvider = new CassandraModSeqProvider(CASSANDRA.getConf());
-            CassandraMessageId.Factory messageIdFactory = new CassandraMessageId.Factory();
-            CassandraMessageIdDAO messageIdDAO = new CassandraMessageIdDAO(CASSANDRA.getConf(), messageIdFactory);
-            CassandraMessageIdToImapUidDAO imapUidDAO = new CassandraMessageIdToImapUidDAO(CASSANDRA.getConf(), messageIdFactory);
-            CassandraMessageDAO messageDAO = new CassandraMessageDAO(CASSANDRA.getConf(), CASSANDRA.getTypesProvider(), messageIdFactory);
-            CassandraMailboxCounterDAO mailboxCounterDAO = new CassandraMailboxCounterDAO(CASSANDRA.getConf());
-            CassandraMailboxRecentsDAO mailboxRecentsDAO = new CassandraMailboxRecentsDAO(CASSANDRA.getConf());
-            CassandraMailboxDAO mailboxDAO = new CassandraMailboxDAO(CASSANDRA.getConf(), CASSANDRA.getTypesProvider(), MAX_ACL_RETRY);
-            CassandraMailboxPathDAO mailboxPathDAO = new CassandraMailboxPathDAO(CASSANDRA.getConf(), CASSANDRA.getTypesProvider());
-            CassandraFirstUnseenDAO firstUnseenDAO = new CassandraFirstUnseenDAO(CASSANDRA.getConf());
-            CassandraApplicableFlagDAO applicableFlagDAO = new CassandraApplicableFlagDAO(CASSANDRA.getConf());
-            CassandraDeletedMessageDAO deletedMessageDAO = new CassandraDeletedMessageDAO(CASSANDRA.getConf());
-
-            CassandraMailboxSessionMapperFactory mapperFactory = new CassandraMailboxSessionMapperFactory(uidProvider,
-                modSeqProvider,
-                CASSANDRA.getConf(),
-                messageDAO,
-                messageIdDAO,
-                imapUidDAO,
-                mailboxCounterDAO,
-                mailboxRecentsDAO,
-                mailboxDAO,
-                mailboxPathDAO,
-                firstUnseenDAO,
-                applicableFlagDAO,
-                deletedMessageDAO);
+        new CassandraAnnotationModule(),
+        new CassandraApplicableFlagsModule()));
 
-            MailboxACLResolver aclResolver = new UnionMailboxACLResolver();
-            GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
-            MessageParser messageParser = new MessageParser();
-
-            Authenticator noAuthenticator = null;
-            Authorizator noAuthorizator = null;
-            CassandraMailboxManager manager = new CassandraMailboxManager(mapperFactory, noAuthenticator, noAuthorizator, new NoMailboxPathLocker(), aclResolver, groupMembershipResolver, 
-                    messageParser, messageIdFactory, LIMIT_ANNOTATIONS, LIMIT_ANNOTATION_SIZE);
-            try {
-                manager.init();
-            } catch (MailboxException e) {
-                throw Throwables.propagate(e);
-            }
-
-            return manager;
-        }
-
-        @Override
-        public void cleanUp() {
-            CASSANDRA.clearAllTables();
-        }
-    };
+    @Override
+    protected MailboxManager provideMailboxManager() {
+        return CassandraMailboxManagerProvider.provideMailboxManager(CASSANDRA.getConf(), CASSANDRA.getTypesProvider());
+    }
 
-    @Contract.Inject
-    public IProducer<CassandraMailboxManager> getProducer() {
-        return producer;
+    @After
+    public void tearDown() throws Exception {
+        super.tearDown();
+        CASSANDRA.clearAllTables();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/a9fdb1c4/mailbox/hbase/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/hbase/pom.xml b/mailbox/hbase/pom.xml
index b37d25d..81dff98 100644
--- a/mailbox/hbase/pom.xml
+++ b/mailbox/hbase/pom.xml
@@ -133,11 +133,6 @@
                 </exclusion>
             </exclusions>
         </dependency>
-        <dependency>
-            <groupId>org.xenei</groupId>
-            <artifactId>junit-contracts</artifactId>
-            <scope>test</scope>
-        </dependency>
     </dependencies>
 
     <profiles>

http://git-wip-us.apache.org/repos/asf/james-project/blob/a9fdb1c4/mailbox/hbase/src/test/java/org/apache/james/mailbox/hbase/HBaseMailboxManagerStressTest.java
----------------------------------------------------------------------
diff --git a/mailbox/hbase/src/test/java/org/apache/james/mailbox/hbase/HBaseMailboxManagerStressTest.java b/mailbox/hbase/src/test/java/org/apache/james/mailbox/hbase/HBaseMailboxManagerStressTest.java
new file mode 100644
index 0000000..b90ab27
--- /dev/null
+++ b/mailbox/hbase/src/test/java/org/apache/james/mailbox/hbase/HBaseMailboxManagerStressTest.java
@@ -0,0 +1,102 @@
+/****************************************************************
+ * 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.hbase;
+
+import static org.apache.james.mailbox.hbase.HBaseNames.MAILBOXES;
+import static org.apache.james.mailbox.hbase.HBaseNames.MAILBOXES_TABLE;
+import static org.apache.james.mailbox.hbase.HBaseNames.MAILBOX_CF;
+import static org.apache.james.mailbox.hbase.HBaseNames.MESSAGES;
+import static org.apache.james.mailbox.hbase.HBaseNames.MESSAGES_META_CF;
+import static org.apache.james.mailbox.hbase.HBaseNames.MESSAGES_TABLE;
+import static org.apache.james.mailbox.hbase.HBaseNames.MESSAGE_DATA_BODY_CF;
+import static org.apache.james.mailbox.hbase.HBaseNames.MESSAGE_DATA_HEADERS_CF;
+import static org.apache.james.mailbox.hbase.HBaseNames.SUBSCRIPTIONS;
+import static org.apache.james.mailbox.hbase.HBaseNames.SUBSCRIPTIONS_TABLE;
+import static org.apache.james.mailbox.hbase.HBaseNames.SUBSCRIPTION_CF;
+
+import org.apache.james.mailbox.MailboxManager;
+import org.apache.james.mailbox.MailboxManagerStressTest;
+import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
+import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.hbase.mail.HBaseModSeqProvider;
+import org.apache.james.mailbox.hbase.mail.HBaseUidProvider;
+import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.Authorizator;
+import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
+import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
+import org.junit.After;
+import org.junit.Ignore;
+
+import com.google.common.base.Throwables;
+
+@Ignore("https://issues.apache.org/jira/browse/MAILBOX-293")
+public class HBaseMailboxManagerStressTest extends MailboxManagerStressTest {
+
+    private static final HBaseClusterSingleton CLUSTER = HBaseClusterSingleton.build();
+
+    @Override
+    protected MailboxManager provideManager() {
+        ensureTables();
+
+        HBaseUidProvider uidProvider = new HBaseUidProvider(CLUSTER.getConf());
+        HBaseModSeqProvider modSeqProvider = new HBaseModSeqProvider(CLUSTER.getConf());
+        MessageId.Factory messageIdFactory = new DefaultMessageId.Factory();
+        HBaseMailboxSessionMapperFactory mapperFactory = new HBaseMailboxSessionMapperFactory(CLUSTER.getConf(),
+            uidProvider, modSeqProvider, messageIdFactory);
+
+        Authenticator noAuthenticator = null;
+        Authorizator noAuthorizator = null;
+        HBaseMailboxManager manager = new HBaseMailboxManager(mapperFactory,
+            noAuthenticator,
+            noAuthorizator,
+            new UnionMailboxACLResolver(),
+            new SimpleGroupMembershipResolver(),
+            new MessageParser(),
+            messageIdFactory
+        );
+
+        try {
+            manager.init();
+        } catch (MailboxException e) {
+            throw Throwables.propagate(e);
+        }
+
+        return manager;
+    }
+
+    @After
+    public void tearDown() {
+        CLUSTER.clearTable(MAILBOXES);
+        CLUSTER.clearTable(MESSAGES);
+        CLUSTER.clearTable(SUBSCRIPTIONS);
+    }
+
+    private void ensureTables() {
+        try {
+            CLUSTER.ensureTable(MAILBOXES_TABLE, new byte[][]{MAILBOX_CF});
+            CLUSTER.ensureTable(MESSAGES_TABLE,
+                new byte[][]{MESSAGES_META_CF, MESSAGE_DATA_HEADERS_CF, MESSAGE_DATA_BODY_CF});
+            CLUSTER.ensureTable(SUBSCRIPTIONS_TABLE, new byte[][]{SUBSCRIPTION_CF});
+        } catch (Exception e) {
+            throw Throwables.propagate(e);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/a9fdb1c4/mailbox/hbase/src/test/java/org/apache/james/mailbox/hbase/HBaseMailboxManagerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/hbase/src/test/java/org/apache/james/mailbox/hbase/HBaseMailboxManagerTest.java b/mailbox/hbase/src/test/java/org/apache/james/mailbox/hbase/HBaseMailboxManagerTest.java
index f0d76ce..2bbaac5 100644
--- a/mailbox/hbase/src/test/java/org/apache/james/mailbox/hbase/HBaseMailboxManagerTest.java
+++ b/mailbox/hbase/src/test/java/org/apache/james/mailbox/hbase/HBaseMailboxManagerTest.java
@@ -30,6 +30,8 @@ import static org.apache.james.mailbox.hbase.HBaseNames.SUBSCRIPTIONS;
 import static org.apache.james.mailbox.hbase.HBaseNames.SUBSCRIPTIONS_TABLE;
 import static org.apache.james.mailbox.hbase.HBaseNames.SUBSCRIPTION_CF;
 
+import org.apache.james.mailbox.MailboxManager;
+import org.apache.james.mailbox.MailboxManagerTest;
 import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
 import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -40,63 +42,51 @@ import org.apache.james.mailbox.store.Authenticator;
 import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
-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 org.junit.After;
+import org.junit.Ignore;
 
 import com.google.common.base.Throwables;
 
-@RunWith(ContractSuite.class)
-@ContractImpl(HBaseMailboxManager.class)
-public class HBaseMailboxManagerTest {
+@Ignore("https://issues.apache.org/jira/browse/MAILBOX-293")
+public class HBaseMailboxManagerTest extends MailboxManagerTest {
 
     private static final HBaseClusterSingleton CLUSTER = HBaseClusterSingleton.build();
 
-    private IProducer<HBaseMailboxManager> producer = new IProducer<HBaseMailboxManager>() {
+    @Override
+    protected MailboxManager provideMailboxManager() {
+        ensureTables();
 
-        @Override
-        public HBaseMailboxManager newInstance() {
-            ensureTables();
+        HBaseUidProvider uidProvider = new HBaseUidProvider(CLUSTER.getConf());
+        HBaseModSeqProvider modSeqProvider = new HBaseModSeqProvider(CLUSTER.getConf());
+        MessageId.Factory messageIdFactory = new DefaultMessageId.Factory();
+        HBaseMailboxSessionMapperFactory mapperFactory = new HBaseMailboxSessionMapperFactory(CLUSTER.getConf(),
+            uidProvider, modSeqProvider, messageIdFactory);
 
-            HBaseUidProvider uidProvider = new HBaseUidProvider(CLUSTER.getConf());
-            HBaseModSeqProvider modSeqProvider = new HBaseModSeqProvider(CLUSTER.getConf());
-            MessageId.Factory messageIdFactory = new DefaultMessageId.Factory();
-            HBaseMailboxSessionMapperFactory mapperFactory = new HBaseMailboxSessionMapperFactory(CLUSTER.getConf(),
-                uidProvider, modSeqProvider, messageIdFactory);
+        Authenticator noAuthenticator = null;
+        Authorizator noAuthorizator = null;
+        HBaseMailboxManager manager = new HBaseMailboxManager(mapperFactory,
+            noAuthenticator,
+            noAuthorizator,
+            new UnionMailboxACLResolver(),
+            new SimpleGroupMembershipResolver(),
+            new MessageParser(),
+            messageIdFactory
+        );
 
-            Authenticator noAuthenticator = null;
-            Authorizator noAuthorizator = null;
-            HBaseMailboxManager manager = new HBaseMailboxManager(mapperFactory,
-                noAuthenticator,
-                noAuthorizator,
-                new UnionMailboxACLResolver(),
-                new SimpleGroupMembershipResolver(),
-                new MessageParser(),
-                messageIdFactory
-                );
-
-            try {
-                manager.init();
-            } catch (MailboxException e) {
-                throw Throwables.propagate(e);
-            }
-
-            return manager;
+        try {
+            manager.init();
+        } catch (MailboxException e) {
+            throw Throwables.propagate(e);
         }
 
-        @Override
-        public void cleanUp() {
-            CLUSTER.clearTable(MAILBOXES);
-            CLUSTER.clearTable(MESSAGES);
-            CLUSTER.clearTable(SUBSCRIPTIONS);
-        }
-    };
+        return manager;
+    }
 
-    @Contract.Inject
-    public IProducer<HBaseMailboxManager> getProducer() {
-        return producer;
+    @After
+    public void tearDown() {
+        CLUSTER.clearTable(MAILBOXES);
+        CLUSTER.clearTable(MESSAGES);
+        CLUSTER.clearTable(SUBSCRIPTIONS);
     }
 
     private void ensureTables() {

http://git-wip-us.apache.org/repos/asf/james-project/blob/a9fdb1c4/mailbox/jcr/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/jcr/pom.xml b/mailbox/jcr/pom.xml
index 80b14ad..003ff8c 100644
--- a/mailbox/jcr/pom.xml
+++ b/mailbox/jcr/pom.xml
@@ -109,10 +109,5 @@
             <artifactId>mockito-core</artifactId>
             <scope>test</scope>
         </dependency>
-        <dependency>
-            <groupId>org.xenei</groupId>
-            <artifactId>junit-contracts</artifactId>
-            <scope>test</scope>
-        </dependency>
     </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/james-project/blob/a9fdb1c4/mailbox/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRMailboxManagerProvider.java
----------------------------------------------------------------------
diff --git a/mailbox/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRMailboxManagerProvider.java b/mailbox/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRMailboxManagerProvider.java
new file mode 100644
index 0000000..e043676
--- /dev/null
+++ b/mailbox/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRMailboxManagerProvider.java
@@ -0,0 +1,79 @@
+/****************************************************************
+ * 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.jcr;
+
+import org.apache.jackrabbit.core.RepositoryImpl;
+import org.apache.jackrabbit.core.config.RepositoryConfig;
+import org.apache.james.mailbox.acl.GroupMembershipResolver;
+import org.apache.james.mailbox.acl.MailboxACLResolver;
+import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
+import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.jcr.mail.JCRModSeqProvider;
+import org.apache.james.mailbox.jcr.mail.JCRUidProvider;
+import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.Authorizator;
+import org.apache.james.mailbox.store.JVMMailboxPathLocker;
+import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
+import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
+import org.xml.sax.InputSource;
+
+import com.google.common.base.Throwables;
+
+public class JCRMailboxManagerProvider {
+    public static final String JACKRABBIT_HOME = "target/jackrabbit";
+
+    public static RepositoryImpl createRepository() {
+        RepositoryConfig config;
+        try {
+            config = RepositoryConfig.create(new InputSource(JCRMailboxManagerTest.class.getClassLoader().getResourceAsStream("test-repository.xml")), JACKRABBIT_HOME);
+            return RepositoryImpl.create(config);
+        } catch (Exception e) {
+            throw Throwables.propagate(e);
+        }
+    }
+
+    public static JCRMailboxManager provideMailboxManager(String user, String pass, String workspace, RepositoryImpl repository) {
+        JCRUtils.registerCnd(repository, workspace, user, pass);
+        MailboxSessionJCRRepository sessionRepos = new GlobalMailboxSessionJCRRepository(repository, workspace, user, pass);
+        JVMMailboxPathLocker locker = new JVMMailboxPathLocker();
+        JCRUidProvider uidProvider = new JCRUidProvider(locker, sessionRepos);
+        JCRModSeqProvider modSeqProvider = new JCRModSeqProvider(locker, sessionRepos);
+        JCRMailboxSessionMapperFactory mf = new JCRMailboxSessionMapperFactory(sessionRepos, uidProvider, modSeqProvider);
+
+        MailboxACLResolver aclResolver = new UnionMailboxACLResolver();
+        GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
+        MessageParser messageParser = new MessageParser();
+
+        Authenticator noAuthenticator = null;
+        Authorizator noAuthorizator = null;
+        JCRMailboxManager manager = new JCRMailboxManager(mf, noAuthenticator, noAuthorizator, locker, aclResolver, groupMembershipResolver,
+            messageParser, new DefaultMessageId.Factory());
+
+        try {
+            manager.init();
+        } catch (MailboxException e) {
+            throw Throwables.propagate(e);
+        }
+
+        return manager;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/a9fdb1c4/mailbox/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRMailboxManagerStressTest.java
----------------------------------------------------------------------
diff --git a/mailbox/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRMailboxManagerStressTest.java b/mailbox/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRMailboxManagerStressTest.java
new file mode 100644
index 0000000..cf7ade7
--- /dev/null
+++ b/mailbox/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRMailboxManagerStressTest.java
@@ -0,0 +1,64 @@
+/****************************************************************
+ * 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.jcr;
+
+import static org.apache.james.mailbox.jcr.JCRMailboxManagerProvider.JACKRABBIT_HOME;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.jackrabbit.core.RepositoryImpl;
+import org.apache.james.mailbox.MailboxManager;
+import org.apache.james.mailbox.MailboxManagerStressTest;
+import org.junit.After;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Throwables;
+
+public class JCRMailboxManagerStressTest extends MailboxManagerStressTest {
+
+    private Optional<RepositoryImpl> repository = Optional.absent();
+
+    @Override
+    protected MailboxManager provideManager() {
+        String user = "user";
+        String pass = "pass";
+        String workspace = null;
+
+        if (!repository.isPresent()) {
+            repository = Optional.of(JCRMailboxManagerProvider.createRepository());
+        }
+
+        return JCRMailboxManagerProvider.provideMailboxManager(user, pass, workspace, repository.get());
+    }
+
+    @After
+    public void tearDown() {
+        if (repository.isPresent()) {
+            repository.get().shutdown();
+            try {
+                FileUtils.forceDelete(new File(JACKRABBIT_HOME));
+            } catch (IOException e) {
+                throw Throwables.propagate(e);
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/a9fdb1c4/mailbox/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRMailboxManagerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRMailboxManagerTest.java b/mailbox/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRMailboxManagerTest.java
index 7fda2a6..64852a7 100644
--- a/mailbox/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRMailboxManagerTest.java
+++ b/mailbox/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRMailboxManagerTest.java
@@ -18,106 +18,47 @@
  ****************************************************************/
 package org.apache.james.mailbox.jcr;
 
-import static org.junit.Assert.fail;
+import static org.apache.james.mailbox.jcr.JCRMailboxManagerProvider.JACKRABBIT_HOME;
 
 import java.io.File;
 import java.io.IOException;
 
-import javax.jcr.RepositoryException;
-
 import org.apache.commons.io.FileUtils;
 import org.apache.jackrabbit.core.RepositoryImpl;
-import org.apache.jackrabbit.core.config.ConfigurationException;
-import org.apache.jackrabbit.core.config.RepositoryConfig;
+import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxManagerTest;
-import org.apache.james.mailbox.acl.GroupMembershipResolver;
-import org.apache.james.mailbox.acl.MailboxACLResolver;
-import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
-import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
-import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.jcr.mail.JCRModSeqProvider;
-import org.apache.james.mailbox.jcr.mail.JCRUidProvider;
-import org.apache.james.mailbox.store.Authenticator;
-import org.apache.james.mailbox.store.Authorizator;
-import org.apache.james.mailbox.store.JVMMailboxPathLocker;
-import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
-import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
-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 org.xml.sax.InputSource;
+import org.junit.After;
 
+import com.google.common.base.Optional;
 import com.google.common.base.Throwables;
 
-@RunWith(ContractSuite.class)
-@ContractImpl(JCRMailboxManager.class)
-public class JCRMailboxManagerTest extends MailboxManagerTest<JCRMailboxManager> {
-
-    private static final String JACKRABBIT_HOME = "target/jackrabbit";
-
-    private static RepositoryImpl repository;
-
-    private IProducer<JCRMailboxManager> producer = new IProducer<JCRMailboxManager>() {
-
-        @Override
-        public JCRMailboxManager newInstance() {
-            String user = "user";
-            String pass = "pass";
-            String workspace = null;
-            RepositoryConfig config;
-            try {
-                config = RepositoryConfig.create(new InputSource(JCRMailboxManagerTest.class.getClassLoader().getResourceAsStream("test-repository.xml")), JACKRABBIT_HOME);
-                repository = RepositoryImpl.create(config);
-            } catch (ConfigurationException e) {
-                e.printStackTrace();
-                fail();
-            } catch (RepositoryException e) {
-                e.printStackTrace();
-                fail();
-            }
-
-            // Register imap cnd file
-            JCRUtils.registerCnd(repository, workspace, user, pass);
-            MailboxSessionJCRRepository sessionRepos = new GlobalMailboxSessionJCRRepository(repository, workspace, user, pass);
-            JVMMailboxPathLocker locker = new JVMMailboxPathLocker();
-            JCRUidProvider uidProvider = new JCRUidProvider(locker, sessionRepos);
-            JCRModSeqProvider modSeqProvider = new JCRModSeqProvider(locker, sessionRepos);
-            JCRMailboxSessionMapperFactory mf = new JCRMailboxSessionMapperFactory(sessionRepos, uidProvider, modSeqProvider);
+public class JCRMailboxManagerTest extends MailboxManagerTest {
 
-            MailboxACLResolver aclResolver = new UnionMailboxACLResolver();
-            GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
-            MessageParser messageParser = new MessageParser();
+    private Optional<RepositoryImpl> repository = Optional.absent();
 
-            Authenticator noAuthenticator = null;
-            Authorizator noAuthorizator = null;
-            JCRMailboxManager manager = new JCRMailboxManager(mf, noAuthenticator, noAuthorizator, locker, aclResolver, groupMembershipResolver, 
-                    messageParser, new DefaultMessageId.Factory());
+    @Override
+    protected MailboxManager provideMailboxManager() {
+        String user = "user";
+        String pass = "pass";
+        String workspace = null;
 
-            try {
-                manager.init();
-            } catch (MailboxException e) {
-                throw Throwables.propagate(e);
-            }
-
-            return manager;
+        if (!repository.isPresent()) {
+            repository = Optional.of(JCRMailboxManagerProvider.createRepository());
         }
 
-        @Override
-        public void cleanUp() {
-            repository.shutdown();
+        return JCRMailboxManagerProvider.provideMailboxManager(user, pass, workspace, repository.get());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        super.tearDown();
+        if (repository.isPresent()) {
+            repository.get().shutdown();
             try {
                 FileUtils.forceDelete(new File(JACKRABBIT_HOME));
             } catch (IOException e) {
                 throw Throwables.propagate(e);
             }
         }
-    };
-
-    @Contract.Inject
-    public IProducer<JCRMailboxManager> getProducer() {
-        return producer;
     }
-
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/a9fdb1c4/mailbox/jpa/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/jpa/pom.xml b/mailbox/jpa/pom.xml
index 790b5a1..f5b7111 100644
--- a/mailbox/jpa/pom.xml
+++ b/mailbox/jpa/pom.xml
@@ -106,11 +106,6 @@
             <artifactId>slf4j-simple</artifactId>
             <scope>test</scope>
         </dependency>
-        <dependency>
-            <groupId>org.xenei</groupId>
-            <artifactId>junit-contracts</artifactId>
-            <scope>test</scope>
-        </dependency>
     </dependencies>
     <build>
         <plugins>

http://git-wip-us.apache.org/repos/asf/james-project/blob/a9fdb1c4/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java
index 64e7ecb..037dd86 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java
@@ -18,86 +18,35 @@
  ****************************************************************/
 package org.apache.james.mailbox.jpa;
 
-import javax.persistence.EntityManagerFactory;
-
 import org.apache.james.backends.jpa.JpaTestCluster;
-import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.acl.GroupMembershipResolver;
-import org.apache.james.mailbox.acl.MailboxACLResolver;
-import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
-import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
+import org.apache.james.mailbox.MailboxManager;
+import org.apache.james.mailbox.MailboxManagerTest;
 import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.jpa.mail.JPAModSeqProvider;
-import org.apache.james.mailbox.jpa.mail.JPAUidProvider;
 import org.apache.james.mailbox.jpa.openjpa.OpenJPAMailboxManager;
-import org.apache.james.mailbox.store.Authenticator;
-import org.apache.james.mailbox.store.Authorizator;
-import org.apache.james.mailbox.store.JVMMailboxPathLocker;
-import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
-import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
-import org.junit.runner.RunWith;
-import org.slf4j.LoggerFactory;
-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 org.apache.james.mailbox.mock.MockMailboxSession;
+import org.junit.After;
 
-import com.google.common.base.Throwables;
+import com.google.common.base.Optional;
 
-@RunWith(ContractSuite.class)
-@ContractImpl(OpenJPAMailboxManager.class)
-public class JPAMailboxManagerTest {
+public class JPAMailboxManagerTest extends MailboxManagerTest {
 
     private static final JpaTestCluster JPA_TEST_CLUSTER = JpaTestCluster.create(JPAMailboxFixture.MAILBOX_PERSISTANCE_CLASSES);
+    private Optional<OpenJPAMailboxManager> openJPAMailboxManager = Optional.absent();
 
-    /**
-     * The entity manager factory.
-     */
-    private static EntityManagerFactory entityManagerFactory;
-
-    private IProducer<OpenJPAMailboxManager> producer = new IProducer<OpenJPAMailboxManager>() {
-
-        private OpenJPAMailboxManager openJPAMailboxManager;
-
-        @Override
-        public OpenJPAMailboxManager newInstance() {
-            entityManagerFactory = JPA_TEST_CLUSTER.getEntityManagerFactory();
-            JVMMailboxPathLocker locker = new JVMMailboxPathLocker();
-            JPAMailboxSessionMapperFactory mf = new JPAMailboxSessionMapperFactory(entityManagerFactory, new JPAUidProvider(locker, entityManagerFactory), new JPAModSeqProvider(locker, entityManagerFactory));
-
-            MailboxACLResolver aclResolver = new UnionMailboxACLResolver();
-            GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
-            MessageParser messageParser = new MessageParser();
-
-            Authenticator noAuthenticator = null;
-            Authorizator noAuthorizator = null;
-            openJPAMailboxManager = new OpenJPAMailboxManager(mf, noAuthenticator, noAuthorizator, aclResolver, groupMembershipResolver, messageParser, new DefaultMessageId.Factory());
-
-            try {
-                openJPAMailboxManager.init();
-            } catch (MailboxException e) {
-                throw Throwables.propagate(e);
-            }
-
-            return openJPAMailboxManager;
+    @Override
+    protected MailboxManager provideMailboxManager() {
+        if (!openJPAMailboxManager.isPresent()) {
+            openJPAMailboxManager = Optional.of(JpaMailboxManagerProvider.provideMailboxManager(JPA_TEST_CLUSTER));
         }
+        return openJPAMailboxManager.get();
+    }
 
-        @Override
-        public void cleanUp() {
-            MailboxSession session = openJPAMailboxManager.createSystemSession("test", LoggerFactory.getLogger("Test"));
-            try {
-                openJPAMailboxManager.deleteEverything(session);
-            } catch (MailboxException e) {
-                e.printStackTrace();
-            }
-            session.close();
-            entityManagerFactory.close();
+    @After
+    public void tearDown() throws MailboxException {
+        if (openJPAMailboxManager.isPresent()) {
+            openJPAMailboxManager.get()
+                .deleteEverything(new MockMailboxSession("Any name"));
         }
-    };
-
-    @Contract.Inject
-    public IProducer<OpenJPAMailboxManager> getProducer() {
-        return producer;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/a9fdb1c4/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerProvider.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerProvider.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerProvider.java
new file mode 100644
index 0000000..1f3c605
--- /dev/null
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerProvider.java
@@ -0,0 +1,63 @@
+/****************************************************************
+ * 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.jpa;
+
+import javax.persistence.EntityManagerFactory;
+
+import org.apache.james.backends.jpa.JpaTestCluster;
+import org.apache.james.mailbox.acl.GroupMembershipResolver;
+import org.apache.james.mailbox.acl.MailboxACLResolver;
+import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
+import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.jpa.mail.JPAModSeqProvider;
+import org.apache.james.mailbox.jpa.mail.JPAUidProvider;
+import org.apache.james.mailbox.jpa.openjpa.OpenJPAMailboxManager;
+import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.Authorizator;
+import org.apache.james.mailbox.store.JVMMailboxPathLocker;
+import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
+import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
+
+import com.google.common.base.Throwables;
+
+public class JpaMailboxManagerProvider {
+    public static OpenJPAMailboxManager provideMailboxManager(JpaTestCluster jpaTestCluster) {
+        EntityManagerFactory entityManagerFactory = jpaTestCluster.getEntityManagerFactory();
+        JVMMailboxPathLocker locker = new JVMMailboxPathLocker();
+        JPAMailboxSessionMapperFactory mf = new JPAMailboxSessionMapperFactory(entityManagerFactory, new JPAUidProvider(locker, entityManagerFactory), new JPAModSeqProvider(locker, entityManagerFactory));
+
+        MailboxACLResolver aclResolver = new UnionMailboxACLResolver();
+        GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
+        MessageParser messageParser = new MessageParser();
+
+        Authenticator noAuthenticator = null;
+        Authorizator noAuthorizator = null;
+        OpenJPAMailboxManager openJPAMailboxManager = new OpenJPAMailboxManager(mf, noAuthenticator, noAuthorizator, aclResolver, groupMembershipResolver, messageParser, new DefaultMessageId.Factory());
+
+        try {
+            openJPAMailboxManager.init();
+        } catch (MailboxException e) {
+            throw Throwables.propagate(e);
+        }
+
+        return openJPAMailboxManager;
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/a9fdb1c4/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerStressTest.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerStressTest.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerStressTest.java
new file mode 100644
index 0000000..8bd3475
--- /dev/null
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerStressTest.java
@@ -0,0 +1,52 @@
+/****************************************************************
+ * 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.jpa;
+
+import org.apache.james.backends.jpa.JpaTestCluster;
+import org.apache.james.mailbox.MailboxManager;
+import org.apache.james.mailbox.MailboxManagerStressTest;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.jpa.openjpa.OpenJPAMailboxManager;
+import org.apache.james.mailbox.mock.MockMailboxSession;
+import org.junit.After;
+
+import com.google.common.base.Optional;
+
+public class JpaMailboxManagerStressTest extends MailboxManagerStressTest {
+
+    private static final JpaTestCluster JPA_TEST_CLUSTER = JpaTestCluster.create(JPAMailboxFixture.MAILBOX_PERSISTANCE_CLASSES);
+    private Optional<OpenJPAMailboxManager> openJPAMailboxManager = Optional.absent();
+
+    @Override
+    protected MailboxManager provideManager() {
+        if (!openJPAMailboxManager.isPresent()) {
+            openJPAMailboxManager = Optional.of(JpaMailboxManagerProvider.provideMailboxManager(JPA_TEST_CLUSTER));
+        }
+        return openJPAMailboxManager.get();
+    }
+
+    @After
+    public void tearDown() throws MailboxException {
+        if (openJPAMailboxManager.isPresent()) {
+            openJPAMailboxManager.get()
+                .deleteEverything(new MockMailboxSession("Any name"));
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/a9fdb1c4/mailbox/maildir/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/maildir/pom.xml b/mailbox/maildir/pom.xml
index 396bee3..18ff696 100644
--- a/mailbox/maildir/pom.xml
+++ b/mailbox/maildir/pom.xml
@@ -97,10 +97,5 @@
             <artifactId>mockito-core</artifactId>
             <scope>test</scope>
         </dependency>
-        <dependency>
-            <groupId>org.xenei</groupId>
-            <artifactId>junit-contracts</artifactId>
-            <scope>test</scope>
-        </dependency>
     </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/james-project/blob/a9fdb1c4/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/DomainUserMaildirMailboxManagerStressTest.java
----------------------------------------------------------------------
diff --git a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/DomainUserMaildirMailboxManagerStressTest.java b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/DomainUserMaildirMailboxManagerStressTest.java
new file mode 100644
index 0000000..58d8fe9
--- /dev/null
+++ b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/DomainUserMaildirMailboxManagerStressTest.java
@@ -0,0 +1,43 @@
+/****************************************************************
+ * 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.maildir;
+
+import org.apache.james.mailbox.MailboxManager;
+import org.apache.james.mailbox.MailboxManagerStressTest;
+import org.junit.Rule;
+import org.junit.rules.TemporaryFolder;
+
+import com.google.common.base.Throwables;
+
+public class DomainUserMaildirMailboxManagerStressTest extends MailboxManagerStressTest {
+    @Rule
+    public TemporaryFolder tmpFolder = new TemporaryFolder();
+    
+    @Override
+    protected MailboxManager provideManager() {
+        try {
+            return MaildirMailboxManagerProvider.createMailboxManager("/%domain/%user", tmpFolder);
+        } catch (Exception e) {
+            throw Throwables.propagate(e);
+        }
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/a9fdb1c4/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/DomainUserMaildirMailboxManagerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/DomainUserMaildirMailboxManagerTest.java b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/DomainUserMaildirMailboxManagerTest.java
new file mode 100644
index 0000000..ab27808
--- /dev/null
+++ b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/DomainUserMaildirMailboxManagerTest.java
@@ -0,0 +1,51 @@
+/****************************************************************
+ * 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.maildir;
+
+import java.io.UnsupportedEncodingException;
+
+import org.apache.james.mailbox.MailboxManager;
+import org.apache.james.mailbox.MailboxManagerTest;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.rules.TemporaryFolder;
+
+import com.google.common.base.Throwables;
+
+public class DomainUserMaildirMailboxManagerTest extends MailboxManagerTest {
+
+    @Rule
+    public TemporaryFolder tmpFolder = new TemporaryFolder();
+
+    @Override
+    protected MailboxManager provideMailboxManager() {
+        try {
+            return MaildirMailboxManagerProvider.createMailboxManager("/%domain/%user", tmpFolder);
+        } catch (Exception e) {
+            throw Throwables.propagate(e);
+        }
+    }
+
+    @Ignore("https://issues.apache.org/jira/browse/MAILBOX-292")
+    @Override
+    public void createMailboxShouldReturnRightId() throws MailboxException, UnsupportedEncodingException {
+
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org