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 <[email protected]> Authored: Wed Jan 24 16:33:48 2018 +0700 Committer: benwa <[email protected]> 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("[email protected]", "secret"); + + smtpMessageSender.connect("127.0.0.1", 1025) + .sendMessage("[email protected]", "[email protected]") + .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="[email protected]" 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: [email protected] For additional commands, e-mail: [email protected]
