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 bt...@apache.org on 2018/07/06 09:27:41 UTC

[15/21] james-project git commit: MAILBOX-342 Improve data provisioning logic in MailboxManagerTest

MAILBOX-342 Improve data provisioning logic in MailboxManagerTest

117 mailboxes were always provisioned.

Avoid this leads to cool, free test speed improvments:

 - Cassandra: 6 min 44 -> 1 min 46
 - Memory: 8s -> 1,4s
 - MailDir (x2): 11s -> 2s
 - JCR: 1 min 45 -> 14s

No stats for HBase, JPA


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

Branch: refs/heads/master
Commit: d6de40258077707cfb04615d5a0b221698ad922e
Parents: a0cab76
Author: benwa <bt...@linagora.com>
Authored: Thu Jul 5 15:20:10 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Fri Jul 6 16:25:50 2018 +0700

----------------------------------------------------------------------
 .../apache/james/mailbox/MessageManager.java    |   5 +
 .../james/mailbox/MailboxManagerTest.java       |  10 +-
 .../james/mailbox/mock/DataProvisioner.java     | 131 +++++++++++++++
 .../james/mailbox/mock/MockMailboxManager.java  | 164 -------------------
 .../cassandra/CassandraMailboxManagerTest.java  |  10 ++
 .../james/mailbox/copier/MailboxCopierTest.java |  10 +-
 6 files changed, 157 insertions(+), 173 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/d6de4025/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
index 27123b3..41e79c8 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
@@ -22,6 +22,7 @@ package org.apache.james.mailbox;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
 import java.util.Date;
 import java.util.EnumSet;
 import java.util.Iterator;
@@ -209,6 +210,10 @@ public interface MessageManager {
                 return build(new ByteArrayInputStream(msgIn));
             }
 
+            public AppendCommand build(String msgIn) {
+                return build(msgIn.getBytes(StandardCharsets.UTF_8));
+            }
+
             public AppendCommand build(Message message) throws IOException {
                 return build(DefaultMessageWriter.asBytes(message));
             }

http://git-wip-us.apache.org/repos/asf/james-project/blob/d6de4025/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 b729b64..2f42eec 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
@@ -32,7 +32,7 @@ import org.apache.james.mailbox.MailboxManager.MailboxCapabilities;
 import org.apache.james.mailbox.MessageManager.AppendCommand;
 import org.apache.james.mailbox.exception.AnnotationException;
 import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.mock.MockMailboxManager;
+import org.apache.james.mailbox.mock.DataProvisioner;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxAnnotation;
 import org.apache.james.mailbox.model.MailboxAnnotationKey;
@@ -97,7 +97,7 @@ public abstract class MailboxManagerTest {
     protected abstract MailboxManager provideMailboxManager() throws MailboxException;
 
     public void setUp() throws Exception {
-        this.mailboxManager = new MockMailboxManager(provideMailboxManager()).getMockMailboxManager();
+        this.mailboxManager = provideMailboxManager();
 
         this.message = Message.Builder.of()
             .setSubject("test")
@@ -230,8 +230,10 @@ public abstract class MailboxManagerTest {
     public void listShouldReturnMailboxes() throws MailboxException, UnsupportedEncodingException {
         session = mailboxManager.createSystemSession("manager");
         mailboxManager.startProcessingRequest(session);
-        
-        assertThat(mailboxManager.list(session)).hasSize(MockMailboxManager.EXPECTED_MAILBOXES_COUNT);
+
+        DataProvisioner.feedMailboxManager(mailboxManager);
+
+        assertThat(mailboxManager.list(session)).hasSize(DataProvisioner.EXPECTED_MAILBOXES_COUNT);
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/d6de4025/mailbox/api/src/test/java/org/apache/james/mailbox/mock/DataProvisioner.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/mock/DataProvisioner.java b/mailbox/api/src/test/java/org/apache/james/mailbox/mock/DataProvisioner.java
new file mode 100644
index 0000000..8914a6e
--- /dev/null
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/mock/DataProvisioner.java
@@ -0,0 +1,131 @@
+/****************************************************************
+ * 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.mock;
+
+import java.util.stream.IntStream;
+
+import javax.mail.Flags;
+
+import org.apache.james.mailbox.MailboxManager;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.MailboxConstants;
+import org.apache.james.mailbox.model.MailboxPath;
+
+import com.github.fge.lambdas.Throwing;
+
+public class DataProvisioner {
+    
+    /**
+     * Number of Domains to be created in the Mailbox Manager.
+     */
+    public static final int DOMAIN_COUNT = 3;
+    
+    /**
+     * Number of Users (with INBOX) to be created in the Mailbox Manager.
+     */
+    public static final int USER_COUNT = 3;
+    
+    /**
+     * Number of Sub Mailboxes (mailbox in INBOX) to be created in the Mailbox Manager.
+     */
+    public static final int SUB_MAILBOXES_COUNT = 3;
+    
+    /**
+     * Number of Sub Sub Mailboxes (mailbox in a mailbox under INBOX) to be created in the Mailbox Manager.
+     */
+    public static final int SUB_SUB_MAILBOXES_COUNT = 3;
+    
+    /**
+     * The expected Mailboxes count calculated based on the feeded mails.
+     */
+    public static final int EXPECTED_MAILBOXES_COUNT = DOMAIN_COUNT * 
+                     (USER_COUNT + // INBOX
+                      USER_COUNT * SUB_MAILBOXES_COUNT + // INBOX.SUB_FOLDER
+                      USER_COUNT * SUB_MAILBOXES_COUNT * SUB_SUB_MAILBOXES_COUNT);  // INBOX.SUB_FOLDER.SUBSUB_FOLDER
+    
+    /**
+     * Number of Messages per Mailbox to be created in the Mailbox Manager.
+     */
+    public static final int MESSAGE_PER_MAILBOX_COUNT = 3;
+    
+    /**
+     * Utility method to feed the Mailbox Manager with a number of 
+     * mailboxes and messages per mailbox.
+     */
+    public static void feedMailboxManager(MailboxManager mailboxManager) {
+        IntStream.range(0, DOMAIN_COUNT)
+            .mapToObj(i -> "localhost" + i)
+            .forEach(domain -> provisionDomain(mailboxManager, domain));
+    }
+
+    public static void provisionDomain(MailboxManager mailboxManager, String domain) {
+        IntStream.range(0, USER_COUNT)
+            .mapToObj(i -> "user" + i + "@" + domain)
+            .forEach(Throwing.consumer(user -> provisionUser(mailboxManager, user)));
+    }
+
+    private static void provisionUser(MailboxManager mailboxManager, String user) throws MailboxException {
+        MailboxSession mailboxSession = mailboxManager.createSystemSession(user);
+        mailboxManager.startProcessingRequest(mailboxSession);
+
+        createMailbox(mailboxManager, mailboxSession, MailboxPath.inbox(mailboxSession));
+
+        IntStream.range(0, SUB_MAILBOXES_COUNT)
+            .mapToObj(i -> MailboxConstants.INBOX + ".SUB_FOLDER_" + i)
+            .peek(name -> createMailbox(mailboxManager, mailboxSession, MailboxPath.forUser(user, name)))
+            .forEach(name ->  createSubSubMailboxes(mailboxManager, mailboxSession, name));
+
+        mailboxManager.endProcessingRequest(mailboxSession);
+        mailboxManager.logout(mailboxSession, true);
+    }
+
+    private static void createSubSubMailboxes(MailboxManager mailboxManager,MailboxSession mailboxSession, String subFolderName) {
+        IntStream.range(0, SUB_SUB_MAILBOXES_COUNT)
+            .mapToObj(i -> subFolderName + ".SUBSUB_FOLDER_" + i)
+            .forEach(name -> createMailbox(mailboxManager, mailboxSession, MailboxPath.forUser(mailboxSession.getUser().getUserName(), name)));
+
+    }
+
+    private static void createMailbox(MailboxManager mailboxManager, MailboxSession mailboxSession, MailboxPath mailboxPath) {
+        try {
+            mailboxManager.createMailbox(mailboxPath, mailboxSession);
+            MessageManager messageManager = mailboxManager.getMailbox(mailboxPath, mailboxSession);
+
+            IntStream.range(0, MESSAGE_PER_MAILBOX_COUNT)
+                .forEach(i -> appendMessage(messageManager, mailboxSession));
+        } catch (MailboxException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private static void appendMessage(MessageManager messageManager, MailboxSession mailboxSession) {
+        try {
+            messageManager.appendMessage(
+                MessageManager.AppendCommand.builder()
+                    .recent()
+                    .withFlags(new Flags(Flags.Flag.RECENT))
+                    .build(MockMail.MAIL_TEXT_PLAIN),
+                mailboxSession);
+        } catch (MailboxException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/d6de4025/mailbox/api/src/test/java/org/apache/james/mailbox/mock/MockMailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/mock/MockMailboxManager.java b/mailbox/api/src/test/java/org/apache/james/mailbox/mock/MockMailboxManager.java
deleted file mode 100644
index da8a360..0000000
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/mock/MockMailboxManager.java
+++ /dev/null
@@ -1,164 +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.mock;
-
-import java.io.ByteArrayInputStream;
-import java.io.UnsupportedEncodingException;
-import java.util.Calendar;
-
-import javax.mail.Flags;
-
-import org.apache.james.mailbox.MailboxManager;
-import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.MessageManager;
-import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.MailboxPath;
-
-/**
- * A mock mailbox manager.
- *
- */
-public class MockMailboxManager {
-    
-    /**
-     * The mock mailbox manager constructed based on a provided mailboxmanager.
-     */
-    private final MailboxManager mockMailboxManager;
-    
-    /**
-     * Number of Domains to be created in the Mailbox Manager.
-     */
-    public static final int DOMAIN_COUNT = 3;
-    
-    /**
-     * Number of Users (with INBOX) to be created in the Mailbox Manager.
-     */
-    public static final int USER_COUNT = 3;
-    
-    /**
-     * Number of Sub Mailboxes (mailbox in INBOX) to be created in the Mailbox Manager.
-     */
-    public static final int SUB_MAILBOXES_COUNT = 3;
-    
-    /**
-     * Number of Sub Sub Mailboxes (mailbox in a mailbox under INBOX) to be created in the Mailbox Manager.
-     */
-    public static final int SUB_SUB_MAILBOXES_COUNT = 3;
-    
-    /**
-     * The expected Mailboxes count calculated based on the feeded mails.
-     */
-    public static final int EXPECTED_MAILBOXES_COUNT = DOMAIN_COUNT * 
-                     (USER_COUNT + // INBOX
-                      USER_COUNT * SUB_MAILBOXES_COUNT + // INBOX.SUB_FOLDER
-                      USER_COUNT * SUB_MAILBOXES_COUNT * SUB_SUB_MAILBOXES_COUNT);  // INBOX.SUB_FOLDER.SUBSUB_FOLDER
-    
-    /**
-     * Number of Messages per Mailbox to be created in the Mailbox Manager.
-     */
-    public static final int MESSAGE_PER_MAILBOX_COUNT = 3;
-    
-    /**
-     * Construct a mock mailboxManager based on a valid mailboxManager.
-     * The mailboxManager will be feeded with mailboxes and mails.
-     * 
-     * @param mailboxManager
-     * @throws UnsupportedEncodingException 
-     * @throws MailboxException 
-     */
-    public MockMailboxManager(MailboxManager mailboxManager) throws MailboxException, UnsupportedEncodingException {
-        this.mockMailboxManager = mailboxManager;
-        feedMockMailboxManager();
-    }
-    
-    /**
-     * @return
-     */
-    public MailboxManager getMockMailboxManager() {
-        return mockMailboxManager;
-    }
-    
-    /**
-     * Utility method to feed the Mailbox Manager with a number of 
-     * mailboxes and messages per mailbox.
-     * 
-     * @throws MailboxException
-     * @throws UnsupportedEncodingException
-     */
-    private void feedMockMailboxManager() throws MailboxException, UnsupportedEncodingException {
-
-        MailboxPath mailboxPath = null;
-        
-        for (int i = 0; i < DOMAIN_COUNT; i++) {
-
-            for (int j = 0; j < USER_COUNT; j++) {
-                
-                String user = "user" + j + "@localhost" + i;
-                
-                String folderName = "INBOX";
-
-                MailboxSession mailboxSession = getMockMailboxManager().createSystemSession(user);
-                mailboxPath = MailboxPath.forUser(user, folderName);
-                createMailbox(mailboxSession, mailboxPath);
-                
-                for (int k = 0; k < SUB_MAILBOXES_COUNT; k++) {
-                    
-                    String subFolderName = folderName + ".SUB_FOLDER_" + k;
-                    mailboxPath = MailboxPath.forUser(user, subFolderName);
-                    createMailbox(mailboxSession, mailboxPath);
-                    
-                    for (int l = 0; l < SUB_SUB_MAILBOXES_COUNT; l++) {
-
-                        String subSubfolderName = subFolderName + ".SUBSUB_FOLDER_" + l;
-                        mailboxPath = MailboxPath.forUser(user, subSubfolderName);
-                        createMailbox(mailboxSession, mailboxPath);
-
-                    }
-                        
-                }
-
-                getMockMailboxManager().logout(mailboxSession, true);
-        
-            }
-            
-        }
-        
-    }
-    
-    /**
-     * 
-     * @param mailboxPath
-     * @throws MailboxException
-     * @throws UnsupportedEncodingException 
-     */
-    private void createMailbox(MailboxSession mailboxSession, MailboxPath mailboxPath) throws MailboxException, UnsupportedEncodingException {
-        getMockMailboxManager().startProcessingRequest(mailboxSession);
-        getMockMailboxManager().createMailbox(mailboxPath, mailboxSession);
-        MessageManager messageManager = getMockMailboxManager().getMailbox(mailboxPath, mailboxSession);
-        for (int j = 0; j < MESSAGE_PER_MAILBOX_COUNT; j++) {
-            messageManager.appendMessage(new ByteArrayInputStream(MockMail.MAIL_TEXT_PLAIN.getBytes("UTF-8")), 
-                    Calendar.getInstance().getTime(), 
-                    mailboxSession, 
-                    true, 
-                    new Flags(Flags.Flag.RECENT));
-        }
-        getMockMailboxManager().endProcessingRequest(mailboxSession);
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/d6de4025/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 4594300..795afec 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
@@ -19,6 +19,7 @@
 package org.apache.james.mailbox.cassandra;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.backends.cassandra.ContainerLifecycleConfiguration;
 import org.apache.james.backends.cassandra.DockerCassandraRule;
 import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
 import org.apache.james.blob.cassandra.CassandraBlobModule;
@@ -41,10 +42,19 @@ import org.apache.james.mailbox.cassandra.modules.CassandraUidModule;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.rules.TestRule;
 
 public class CassandraMailboxManagerTest extends MailboxManagerTest {
 
     @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
+
+    public static ContainerLifecycleConfiguration cassandraLifecycleConfiguration = ContainerLifecycleConfiguration.withDefaultIterationsBetweenRestart()
+        .container(cassandraServer.getRawContainer())
+        .build();
+
+    @Rule
+    public TestRule cassandraLifecycleTestRule = cassandraLifecycleConfiguration.asTestRule();
     
     private CassandraCluster cassandra;
     

http://git-wip-us.apache.org/repos/asf/james-project/blob/d6de4025/mailbox/tool/src/test/java/org/apache/james/mailbox/copier/MailboxCopierTest.java
----------------------------------------------------------------------
diff --git a/mailbox/tool/src/test/java/org/apache/james/mailbox/copier/MailboxCopierTest.java b/mailbox/tool/src/test/java/org/apache/james/mailbox/copier/MailboxCopierTest.java
index 126bc39..77d4c42 100644
--- a/mailbox/tool/src/test/java/org/apache/james/mailbox/copier/MailboxCopierTest.java
+++ b/mailbox/tool/src/test/java/org/apache/james/mailbox/copier/MailboxCopierTest.java
@@ -31,7 +31,7 @@ import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
 import org.apache.james.mailbox.exception.BadCredentialsException;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
-import org.apache.james.mailbox.mock.MockMailboxManager;
+import org.apache.james.mailbox.mock.DataProvisioner;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.junit.Before;
@@ -97,8 +97,8 @@ public class MailboxCopierTest {
          if (dstMemMailboxManager instanceof StoreMailboxManager) {
              ((StoreMailboxManager) dstMemMailboxManager).init();
          }
-    
-        srcMemMailboxManager = new MockMailboxManager(srcMemMailboxManager).getMockMailboxManager();
+
+        DataProvisioner.feedMailboxManager(srcMemMailboxManager);
        
         assertMailboxManagerSize(srcMemMailboxManager, 1);
         
@@ -124,13 +124,13 @@ public class MailboxCopierTest {
 
         List<MailboxPath> mailboxPathList = mailboxManager.list(mailboxSession);
         
-        assertThat(mailboxPathList).hasSize(MockMailboxManager.EXPECTED_MAILBOXES_COUNT);
+        assertThat(mailboxPathList).hasSize(DataProvisioner.EXPECTED_MAILBOXES_COUNT);
         
         for (MailboxPath mailboxPath: mailboxPathList) {
             MailboxSession userSession = mailboxManager.createSystemSession(mailboxPath.getUser());
             mailboxManager.startProcessingRequest(mailboxSession);
             MessageManager messageManager = mailboxManager.getMailbox(mailboxPath, userSession);
-            assertThat(messageManager.getMetaData(false, userSession, FetchGroup.NO_UNSEEN).getMessageCount()).isEqualTo(MockMailboxManager.MESSAGE_PER_MAILBOX_COUNT * multiplicationFactor);
+            assertThat(messageManager.getMetaData(false, userSession, FetchGroup.NO_UNSEEN).getMessageCount()).isEqualTo(DataProvisioner.MESSAGE_PER_MAILBOX_COUNT * multiplicationFactor);
         }
         
         mailboxManager.endProcessingRequest(mailboxSession);


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