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 ro...@apache.org on 2018/01/25 15:36:41 UTC

[08/14] james-project git commit: JAMES-2291 Guice bindings + integration tests

JAMES-2291 Guice bindings + integration 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/39ce6d15
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/39ce6d15
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/39ce6d15

Branch: refs/heads/master
Commit: 39ce6d155efb2b4b8f056ca9b5731ddb8d63d501
Parents: dda770a
Author: benwa <bt...@linagora.com>
Authored: Wed Jan 24 16:33:48 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Thu Jan 25 16:28:45 2018 +0700

----------------------------------------------------------------------
 pom.xml                                         |  5 ++
 server/container/guice/cassandra-guice/pom.xml  | 14 ++++
 .../apache/james/CassandraJamesServerMain.java  |  2 +
 .../data/CassandraMailRepositoryModule.java     | 74 ++++++++++++++++++
 .../CassandraMailRepositoryIntegrationTest.java | 80 ++++++++++++++++++++
 .../src/test/resources/mailetcontainer.xml      | 14 ++++
 .../src/test/resources/mailrepositorystore.xml  |  5 ++
 .../CassandraMailRepositoryCountDAO.java        |  3 +
 .../CassandraMailRepositoryKeysDAO.java         |  3 +
 .../CassandraMailRepositoryMailDAO.java         |  2 +
 10 files changed, 202 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/39ce6d15/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index e8fbafc..3294ff4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1233,6 +1233,11 @@
                 <type>test-jar</type>
             </dependency>
             <dependency>
+                <groupId>org.apache.james</groupId>
+                <artifactId>james-server-mailrepository-cassandra</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
                 <groupId>${project.groupId}</groupId>
                 <artifactId>james-server-mailrepository-memory</artifactId>
                 <version>${project.version}</version>

http://git-wip-us.apache.org/repos/asf/james-project/blob/39ce6d15/server/container/guice/cassandra-guice/pom.xml
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/pom.xml b/server/container/guice/cassandra-guice/pom.xml
index 77c4239..7babc31 100644
--- a/server/container/guice/cassandra-guice/pom.xml
+++ b/server/container/guice/cassandra-guice/pom.xml
@@ -184,6 +184,15 @@
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
+            <artifactId>james-server-mailrepository-cassandra</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>james-server-testing</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
             <artifactId>james-server-util-java8</artifactId>
             <type>test-jar</type>
             <scope>test</scope>
@@ -235,6 +244,11 @@
             <version>2.1.4</version>
         </dependency>
         <dependency>
+            <groupId>org.junit.platform</groupId>
+            <artifactId>junit-platform-launcher</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-core</artifactId>
             <scope>test</scope>

http://git-wip-us.apache.org/repos/asf/james-project/blob/39ce6d15/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
index 2d4784a..063ff7c 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
@@ -22,6 +22,7 @@ package org.apache.james;
 import org.apache.james.modules.MailboxModule;
 import org.apache.james.modules.data.CassandraDomainListModule;
 import org.apache.james.modules.data.CassandraJmapModule;
+import org.apache.james.modules.data.CassandraMailRepositoryModule;
 import org.apache.james.modules.data.CassandraRecipientRewriteTableModule;
 import org.apache.james.modules.data.CassandraSieveRepositoryModule;
 import org.apache.james.modules.data.CassandraUsersRepositoryModule;
@@ -75,6 +76,7 @@ public class CassandraJamesServerMain {
         new CassandraDomainListModule(),
         new CassandraJmapModule(),
         new CassandraMailboxModule(),
+        new CassandraMailRepositoryModule(),
         new CassandraMetricsModule(),
         new CassandraRecipientRewriteTableModule(),
         new CassandraSessionModule(),

http://git-wip-us.apache.org/repos/asf/james-project/blob/39ce6d15/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraMailRepositoryModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraMailRepositoryModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraMailRepositoryModule.java
new file mode 100644
index 0000000..f307440
--- /dev/null
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraMailRepositoryModule.java
@@ -0,0 +1,74 @@
+/****************************************************************
+ * 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.modules.data;
+
+import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.blob.api.ObjectStore;
+import org.apache.james.mailrepository.api.MailRepository;
+import org.apache.james.mailrepository.cassandra.CassandraMailRepository;
+import org.apache.james.mailrepository.cassandra.CassandraMailRepositoryCountDAO;
+import org.apache.james.mailrepository.cassandra.CassandraMailRepositoryKeysDAO;
+import org.apache.james.mailrepository.cassandra.CassandraMailRepositoryMailDAO;
+import org.apache.james.utils.MailRepositoryProvider;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Scopes;
+import com.google.inject.multibindings.Multibinder;
+
+public class CassandraMailRepositoryModule extends AbstractModule {
+    @Override
+    protected void configure() {
+        bind(CassandraMailRepositoryKeysDAO.class).in(Scopes.SINGLETON);
+        bind(CassandraMailRepositoryCountDAO.class).in(Scopes.SINGLETON);
+        bind(CassandraMailRepositoryMailDAO.class).in(Scopes.SINGLETON);
+
+        Multibinder<MailRepositoryProvider> multibinder = Multibinder.newSetBinder(binder(), MailRepositoryProvider.class);
+        multibinder.addBinding().to(CassandraMailRepositoryProvider.class);
+
+        Multibinder.newSetBinder(binder(), CassandraModule.class).addBinding()
+            .to(org.apache.james.mailrepository.cassandra.CassandraMailRepositoryModule.class);
+    }
+
+    public static class CassandraMailRepositoryProvider implements MailRepositoryProvider {
+        private final CassandraMailRepositoryKeysDAO keysDAO;
+        private final CassandraMailRepositoryCountDAO countDAO;
+        private final CassandraMailRepositoryMailDAO mailDAO;
+        private final ObjectStore objectStore;
+
+        @Inject
+        public CassandraMailRepositoryProvider(CassandraMailRepositoryKeysDAO keysDAO, CassandraMailRepositoryCountDAO countDAO, CassandraMailRepositoryMailDAO mailDAO, ObjectStore objectStore) {
+            this.keysDAO = keysDAO;
+            this.countDAO = countDAO;
+            this.mailDAO = mailDAO;
+            this.objectStore = objectStore;
+        }
+
+        @Override
+        public String canonicalName() {
+            return CassandraMailRepository.class.getCanonicalName();
+        }
+
+        @Override
+        public MailRepository provide(String url) {
+            return new CassandraMailRepository(url, keysDAO, countDAO, mailDAO, objectStore);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/39ce6d15/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMailRepositoryIntegrationTest.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMailRepositoryIntegrationTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMailRepositoryIntegrationTest.java
new file mode 100644
index 0000000..81972d1
--- /dev/null
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMailRepositoryIntegrationTest.java
@@ -0,0 +1,80 @@
+/****************************************************************
+ * 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;
+
+import static com.jayway.awaitility.Duration.FIVE_HUNDRED_MILLISECONDS;
+
+import org.apache.james.utils.DataProbeImpl;
+import org.apache.james.utils.MailRepositoryProbeImpl;
+import org.apache.james.utils.SMTPMessageSender;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.Test;
+
+import com.jayway.awaitility.Awaitility;
+import com.jayway.awaitility.core.ConditionFactory;
+
+public class CassandraMailRepositoryIntegrationTest {
+
+    @ClassRule
+    public static DockerCassandraRule cassandra = new DockerCassandraRule();
+    
+    @Rule
+    public CassandraJmapTestRule cassandraJmap = CassandraJmapTestRule.defaultTestRule();
+    @Rule
+    public SMTPMessageSender smtpMessageSender = new SMTPMessageSender("other.com");
+
+    private GuiceJamesServer server;
+    private ConditionFactory await;
+
+    @Before
+    public void setup() throws Exception {
+        server = cassandraJmap.jmapServer(cassandra.getModule());
+        server.start();
+        await = Awaitility.with()
+            .pollInterval(FIVE_HUNDRED_MILLISECONDS)
+            .and()
+            .with()
+            .pollDelay(FIVE_HUNDRED_MILLISECONDS)
+            .await();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        server.stop();
+    }
+
+    @Test
+    public void deniedSenderMailShouldBeStoredInCassandraMailRepositoryWhenConfigured() throws Exception {
+        server.getProbe(DataProbeImpl.class).addDomain("domain.com");
+        server.getProbe(DataProbeImpl.class).addUser("user@domain.com", "secret");
+
+        smtpMessageSender.connect("127.0.0.1", 1025)
+            .sendMessage("denied@other.com", "user@domain.com")
+            .awaitSent(await);
+
+        MailRepositoryProbeImpl repositoryProbe = server.getProbe(MailRepositoryProbeImpl.class);
+        await.until(() -> repositoryProbe.getRepositoryMailCount("cassandra://var/mail/sender-denied/") == 1);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/39ce6d15/server/container/guice/cassandra-guice/src/test/resources/mailetcontainer.xml
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/resources/mailetcontainer.xml b/server/container/guice/cassandra-guice/src/test/resources/mailetcontainer.xml
index b265f93..3d8e823 100644
--- a/server/container/guice/cassandra-guice/src/test/resources/mailetcontainer.xml
+++ b/server/container/guice/cassandra-guice/src/test/resources/mailetcontainer.xml
@@ -47,6 +47,9 @@
 
 
         <processor state="transport" enableJmx="false">
+            <mailet match="SenderIs=denied@other.com" class="ToProcessor">
+                <processor>sender-denied</processor>
+            </mailet>
             <mailet match="SMTPAuthSuccessful" class="SetMimeHeader">
                 <name>X-UserIsAuth</name>
                 <value>true</value>
@@ -100,6 +103,17 @@
             </mailet>
         </processor>
 
+        <processor state="sender-denied" enableJmx="false">
+            <mailet match="All" class="Bounce">
+                <attachment>none</attachment>
+                <passThrough>true</passThrough>
+            </mailet>
+            <mailet match="All" class="ToRepository">
+                <repositoryPath>cassandra://var/mail/sender-denied/</repositoryPath>
+                <notice>Error: You are sending an e-mail by a forbidden sender.</notice>
+            </mailet>
+        </processor>
+
         <processor state="bounces" enableJmx="false">
             <mailet match="All" class="DSNBounce">
                 <passThrough>false</passThrough>

http://git-wip-us.apache.org/repos/asf/james-project/blob/39ce6d15/server/container/guice/cassandra-guice/src/test/resources/mailrepositorystore.xml
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/resources/mailrepositorystore.xml b/server/container/guice/cassandra-guice/src/test/resources/mailrepositorystore.xml
index 3ca4a1d..3386c33 100644
--- a/server/container/guice/cassandra-guice/src/test/resources/mailrepositorystore.xml
+++ b/server/container/guice/cassandra-guice/src/test/resources/mailrepositorystore.xml
@@ -27,5 +27,10 @@
             </protocols>
             <config FIFO="false" CACHEKEYS="true"/>
         </mailrepository>
+        <mailrepository class="org.apache.james.mailrepository.cassandra.CassandraMailRepository">
+            <protocols>
+                <protocol>cassandra</protocol>
+            </protocols>
+        </mailrepository>
     </mailrepositories>
 </mailrepositorystore>

http://git-wip-us.apache.org/repos/asf/james-project/blob/39ce6d15/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryCountDAO.java
----------------------------------------------------------------------
diff --git a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryCountDAO.java b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryCountDAO.java
index 6954097..eab17cf 100644
--- a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryCountDAO.java
+++ b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryCountDAO.java
@@ -32,6 +32,8 @@ import static org.apache.james.mailrepository.cassandra.MailRepositoryTable.REPO
 import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
 
+import javax.inject.Inject;
+
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 
 import com.datastax.driver.core.PreparedStatement;
@@ -45,6 +47,7 @@ public class CassandraMailRepositoryCountDAO {
     private final PreparedStatement decrement;
     private final PreparedStatement select;
 
+    @Inject
     public CassandraMailRepositoryCountDAO(Session session) {
         this.executor = new CassandraAsyncExecutor(session);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/39ce6d15/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAO.java
----------------------------------------------------------------------
diff --git a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAO.java b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAO.java
index 0dd8d4b..9d8a8f4 100644
--- a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAO.java
+++ b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAO.java
@@ -31,6 +31,8 @@ import static org.apache.james.mailrepository.cassandra.MailRepositoryTable.REPO
 import java.util.concurrent.CompletableFuture;
 import java.util.stream.Stream;
 
+import javax.inject.Inject;
+
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 
@@ -45,6 +47,7 @@ public class CassandraMailRepositoryKeysDAO {
     private final PreparedStatement deleteKey;
     private final PreparedStatement listKeys;
 
+    @Inject
     public CassandraMailRepositoryKeysDAO(Session session, CassandraUtils cassandraUtils) {
         this.executor = new CassandraAsyncExecutor(session);
         this.cassandraUtils = cassandraUtils;

http://git-wip-us.apache.org/repos/asf/james-project/blob/39ce6d15/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAO.java
----------------------------------------------------------------------
diff --git a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAO.java b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAO.java
index 2415ff9..a6fca3c 100644
--- a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAO.java
+++ b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAO.java
@@ -59,6 +59,7 @@ import java.util.Objects;
 import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
 
+import javax.inject.Inject;
 import javax.mail.MessagingException;
 import javax.mail.internet.AddressException;
 
@@ -91,6 +92,7 @@ public class CassandraMailRepositoryMailDAO {
     private final BlobId.Factory blobIdFactory;
     private final CassandraTypesProvider cassandraTypesProvider;
 
+    @Inject
     public CassandraMailRepositoryMailDAO(Session session, BlobId.Factory blobIdFactory,
                                           CassandraTypesProvider cassandraTypesProvider) {
         this.executor = new CassandraAsyncExecutor(session);


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