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