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 2017/12/25 04:26:45 UTC

[01/13] james-project git commit: JAMES-2262 Add unit testing for SpamAssassin

Repository: james-project
Updated Branches:
  refs/heads/master e0ad36d00 -> dfd3f420b


JAMES-2262 Add unit testing for SpamAssassin


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

Branch: refs/heads/master
Commit: 4d9d568c2ea640740ee2c0f88c87156e4aa5d5ff
Parents: e0ad36d
Author: quynhn <qn...@linagora.com>
Authored: Thu Dec 14 16:53:53 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Mon Dec 25 11:24:08 2017 +0700

----------------------------------------------------------------------
 .../transport/mailets/SpamAssassinTest.java     | 167 ++++++++++++++
 server/mailet/mailets/pom.xml                   |  13 ++
 .../james/transport/mailets/SpamAssassin.java   |  47 ++--
 .../transport/mailets/SpamAssassinTest.java     | 215 +++++++++++++++++++
 4 files changed, 425 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/4d9d568c/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
new file mode 100644
index 0000000..34c9a36
--- /dev/null
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
@@ -0,0 +1,167 @@
+/****************************************************************
+ * 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.transport.mailets;
+
+import static net.javacrumbs.jsonunit.fluent.JsonFluentAssert.assertThatJson;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Optional;
+
+import javax.mail.internet.MimeMessage;
+
+import org.apache.james.core.MailAddress;
+import org.apache.james.jmap.mailet.VacationMailet;
+import org.apache.james.mailets.TemporaryJamesServer;
+import org.apache.james.mailets.configuration.CommonProcessors;
+import org.apache.james.mailets.configuration.MailetConfiguration;
+import org.apache.james.mailets.configuration.MailetContainer;
+import org.apache.james.mailets.configuration.ProcessorConfiguration;
+import org.apache.james.transport.mailets.amqp.AmqpRule;
+import org.apache.james.transport.matchers.All;
+import org.apache.james.transport.matchers.RecipientIsLocal;
+import org.apache.james.transport.matchers.SMTPAuthSuccessful;
+import org.apache.james.util.streams.ContainerNames;
+import org.apache.james.util.streams.SwarmGenericContainer;
+import org.apache.james.utils.DataProbeImpl;
+import org.apache.james.utils.IMAPMessageReader;
+import org.apache.james.utils.SMTPMessageSender;
+import org.apache.mailet.base.test.FakeMail;
+import org.apache.mailet.base.test.MimeMessageBuilder;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.RuleChain;
+import org.junit.rules.TemporaryFolder;
+
+import com.jayway.awaitility.Awaitility;
+import com.jayway.awaitility.Duration;
+
+public class ContactExtractorTest {
+
+    public static final String JAMES_ORG = "james.org";
+    public static final String SENDER = "sender@" + JAMES_ORG;
+    public static final String TO = "to@" + JAMES_ORG;
+    public static final String TO2 = "to2@" + JAMES_ORG;
+    public static final String CC = "cc@" + JAMES_ORG;
+    public static final String CC2 = "cc2@" + JAMES_ORG;
+    public static final String BCC = "bcc@" + JAMES_ORG;
+    public static final String BCC2 = "bcc2@" + JAMES_ORG;
+    public static final String PASSWORD = "secret";
+    public static final String EXCHANGE = "collector:email";
+    public static final String ROUTING_KEY = "";
+
+    public SwarmGenericContainer rabbit = new SwarmGenericContainer(ContainerNames.RABBITMQ);
+    public AmqpRule amqpRule = new AmqpRule(rabbit, EXCHANGE, ROUTING_KEY);
+    public TemporaryFolder folder = new TemporaryFolder();
+
+    @Rule
+    public RuleChain chain = RuleChain.outerRule(rabbit).around(amqpRule).around(folder);
+
+    private TemporaryJamesServer jamesServer;
+
+    @Before
+    public void setup() throws Exception {
+        String attribute = "ExtractedContacts";
+        MailetContainer mailets = MailetContainer
+            .builder()
+            .threads(5)
+            .postmaster(SENDER)
+            .addProcessor(CommonProcessors.root())
+            .addProcessor(CommonProcessors.error())
+            .addProcessor(
+                ProcessorConfiguration.builder()
+                    .state("transport")
+                    .addMailet(MailetConfiguration.builder()
+                        .matcher(SMTPAuthSuccessful.class)
+                        .mailet(ContactExtractor.class)
+                        .addProperty(ContactExtractor.Configuration.ATTRIBUTE, attribute)
+                        .build())
+                    .addMailet(MailetConfiguration.builder()
+                        .matcher(All.class)
+                        .mailet(AmqpForwardAttribute.class)
+                        .addProperty(AmqpForwardAttribute.URI_PARAMETER_NAME, amqpRule.getAmqpUri())
+                        .addProperty(AmqpForwardAttribute.EXCHANGE_PARAMETER_NAME, EXCHANGE)
+                        .addProperty(AmqpForwardAttribute.ATTRIBUTE_PARAMETER_NAME, attribute)
+                        .build())
+                    .addMailet(MailetConfiguration.builder()
+                        .matcher(All.class)
+                        .mailet(RemoveMimeHeader.class)
+                        .addProperty("name", "bcc")
+                        .build())
+                    .addMailet(MailetConfiguration.builder()
+                        .matcher(RecipientIsLocal.class)
+                        .mailet(VacationMailet.class)
+                        .build())
+                    .addMailet(MailetConfiguration.builder()
+                        .matcher(RecipientIsLocal.class)
+                        .mailet(LocalDelivery.class)
+                        .build())
+                    .build())
+            .build();
+        jamesServer = TemporaryJamesServer.builder().build(folder, mailets);
+        DataProbeImpl probe = jamesServer.getProbe(DataProbeImpl.class);
+        probe.addDomain(JAMES_ORG);
+        probe.addUser(SENDER, PASSWORD);
+        probe.addUser(TO, PASSWORD);
+        probe.addUser(TO2, PASSWORD);
+        probe.addUser(CC, PASSWORD);
+        probe.addUser(CC2, PASSWORD);
+        probe.addUser(BCC, PASSWORD);
+        probe.addUser(BCC2, PASSWORD);
+    }
+
+    @After
+    public void tearDown() {
+        jamesServer.shutdown();
+    }
+
+    @Test
+    public void recipientsShouldBePublishedToAmqpWhenSendingEmail() throws Exception {
+        MimeMessage message = MimeMessageBuilder.mimeMessageBuilder()
+            .setSender(SENDER)
+            .addToRecipient(TO, "John To2 <" + TO2 + ">")
+            .addCcRecipient(CC, "John Cc2 <" + CC2 + ">")
+            .addBccRecipient(BCC, "John Bcc2 <" + BCC2 + ">")
+            .setSubject("Contact collection Rocks")
+            .setText("This is my email")
+            .build();
+        FakeMail mail = FakeMail.builder()
+            .mimeMessage(message)
+            .sender(new MailAddress(SENDER))
+            .recipients(new MailAddress(TO), new MailAddress(TO2), new MailAddress(CC), new MailAddress(CC2), new MailAddress(BCC), new MailAddress(BCC2))
+            .build();
+        try (SMTPMessageSender messageSender = SMTPMessageSender.authentication("localhost", 1025, JAMES_ORG, SENDER, PASSWORD);
+                IMAPMessageReader imap = new IMAPMessageReader("localhost", 1143)) {
+
+            messageSender.sendMessage(mail);
+            Awaitility.await().pollDelay(Duration.FIVE_HUNDRED_MILLISECONDS)
+                .atMost(Duration.ONE_MINUTE)
+                .until(() -> imap.userReceivedMessage(TO, PASSWORD));
+
+            Optional<String> actual = amqpRule.readContent();
+            assertThat(actual).isNotEmpty();
+            assertThatJson(actual.get()).isEqualTo("{"
+                    + "\"userEmail\" : \"sender@james.org\", "
+                    + "\"emails\" : [ \"to@james.org\", \"John To2 <to...@james.org>\", \"cc@james.org\", \"John Cc2 <cc...@james.org>\", \"bcc@james.org\", \"John Bcc2 <bc...@james.org>\" ]"
+                    + "}");
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/4d9d568c/server/mailet/mailets/pom.xml
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/pom.xml b/server/mailet/mailets/pom.xml
index 9f81107..a8f409c 100644
--- a/server/mailet/mailets/pom.xml
+++ b/server/mailet/mailets/pom.xml
@@ -135,6 +135,19 @@
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
+            <artifactId>james-server-protocols-library</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>james-server-protocols-smtp</artifactId>
+            <version>${project.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
             <artifactId>james-server-queue-api</artifactId>
         </dependency>
         <dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/4d9d568c/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
index 970bcf1..1b3de01 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.transport.mailets;
 
+import java.util.Optional;
+
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
@@ -27,9 +29,13 @@ import org.apache.james.util.scanner.SpamAssassinInvoker;
 import org.apache.mailet.Experimental;
 import org.apache.mailet.Mail;
 import org.apache.mailet.base.GenericMailet;
+import org.apache.mailet.base.MailetUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Strings;
+
 /**
  * Sends the message through daemonized SpamAssassin (spamd), visit <a
  * href="http://spamassassin.apache.org/">spamassassin.apache.org/</a> for info
@@ -57,29 +63,26 @@ import org.slf4j.LoggerFactory;
 @Experimental
 public class SpamAssassin extends GenericMailet {
     private static final Logger LOGGER = LoggerFactory.getLogger(ManageSieveMailet.class);
+    public static final String SPAMD_HOST = "spamdHost";
+    public static final String SPAMD_PORT = "spamdPort";
+    public static final String DEFAULT_HOST = "127.0.0.1";
+    public static final int DEFAULT_PORT = 783;
+    public static final int MAX_AVAILABLE_PORT = 65535;
 
-    String spamdHost;
-    int spamdPort;
+    private String spamdHost;
+    private int spamdPort;
 
     /**
      * @see org.apache.mailet.base.GenericMailet#init()
      */
     public void init() throws MessagingException {
-        spamdHost = getInitParameter("spamdHost");
-        if (spamdHost == null || spamdHost.equals("")) {
-            spamdHost = "127.0.0.1";
-        }
+        spamdHost = Optional.ofNullable(getInitParameter(SPAMD_HOST))
+            .filter(s -> !Strings.isNullOrEmpty(s))
+            .orElse(DEFAULT_HOST);
 
-        String port = getInitParameter("spamdPort");
-        if (port == null || port.equals("")) {
-            spamdPort = 783;
-        } else {
-
-            try {
-                spamdPort = Integer.parseInt(getInitParameter("spamdPort"));
-            } catch (NumberFormatException e) {
-                throw new MessagingException("Please configure a valid port. Not valid: " + spamdPort);
-            }
+        spamdPort = MailetUtil.getInitParameterAsStrictlyPositiveInteger(getInitParameter(SPAMD_PORT), DEFAULT_PORT);
+        if (spamdPort > MAX_AVAILABLE_PORT) {
+            throw new MessagingException("Please configure a valid port. Not valid: " + spamdPort);
         }
     }
 
@@ -90,7 +93,7 @@ public class SpamAssassin extends GenericMailet {
         try {
             MimeMessage message = mail.getMessage();
 
-            // Invoke spamassian connection and scan the message
+            // Invoke SpamAssassin connection and scan the message
             SpamAssassinInvoker sa = new SpamAssassinInvoker(spamdHost, spamdPort);
             sa.scanMail(message);
 
@@ -112,4 +115,14 @@ public class SpamAssassin extends GenericMailet {
     public String getMailetInfo() {
         return "Checks message against SpamAssassin";
     }
+
+    @VisibleForTesting
+    String getSpamdHost() {
+        return spamdHost;
+    }
+
+    @VisibleForTesting
+    int getSpamdPort() {
+        return spamdPort;
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/4d9d568c/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
new file mode 100644
index 0000000..e49d981
--- /dev/null
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
@@ -0,0 +1,215 @@
+/****************************************************************
+ * 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.transport.mailets;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import javax.mail.MessagingException;
+
+import org.apache.james.protocols.lib.PortUtil;
+import org.apache.james.smtpserver.mock.util.MockSpamd;
+import org.apache.james.util.scanner.SpamAssassinInvoker;
+import org.apache.mailet.Mail;
+import org.apache.mailet.base.test.FakeMail;
+import org.apache.mailet.base.test.FakeMailetConfig;
+import org.apache.mailet.base.test.MimeMessageBuilder;
+import org.junit.Test;
+
+public class SpamAssassinTest {
+    private SpamAssassin mailet = new SpamAssassin();
+
+    @Test
+    public void initShouldSetDefaultSpamdHostWhenNone() throws Exception {
+        mailet.init(FakeMailetConfig.builder()
+            .mailetName("SpamAssassin")
+            .build());
+
+        assertThat(mailet.getSpamdHost()).isEqualTo(SpamAssassin.DEFAULT_HOST);
+    }
+
+    @Test
+    public void initShouldSetDefaultSpamdPortWhenNone() throws Exception {
+        mailet.init(FakeMailetConfig.builder()
+            .mailetName("SpamAssassin")
+            .build());
+
+        assertThat(mailet.getSpamdPort()).isEqualTo(SpamAssassin.DEFAULT_PORT);
+    }
+
+    @Test
+    public void initShouldSetSpamdHostWhenPresent() throws Exception {
+        String spamdHost = "any.host";
+        mailet.init(FakeMailetConfig.builder()
+            .mailetName("SpamAssassin")
+            .setProperty(SpamAssassin.SPAMD_HOST, spamdHost)
+            .build());
+
+        assertThat(mailet.getSpamdHost()).isEqualTo(spamdHost);
+    }
+
+    @Test
+    public void getSpamHostShouldReturnDefaultValueWhenEmpty() throws Exception {
+        mailet.init(FakeMailetConfig.builder()
+            .mailetName("SpamAssassin")
+            .setProperty(SpamAssassin.SPAMD_HOST, "")
+            .build());
+
+        assertThat(mailet.getSpamdHost()).isEqualTo(SpamAssassin.DEFAULT_HOST);
+    }
+
+    @Test
+    public void initShouldSetDefaultSpamdPortWhenDefault() throws Exception {
+        mailet.init(FakeMailetConfig.builder()
+            .mailetName("SpamAssassin")
+            .build());
+
+        assertThat(mailet.getSpamdPort()).isEqualTo(SpamAssassin.DEFAULT_PORT);
+    }
+
+    @Test
+    public void initShouldThrowWhenSpamdPortIsNotNumber() throws Exception {
+        assertThatThrownBy(() -> mailet.init(FakeMailetConfig.builder()
+            .mailetName("SpamAssassin")
+            .setProperty(SpamAssassin.SPAMD_PORT, "noNumber")
+            .build())).isInstanceOf(MessagingException.class);
+    }
+
+    @Test
+    public void initShouldThrowWhenSpamdPortIsNegative() throws Exception {
+        assertThatThrownBy(() -> mailet.init(FakeMailetConfig.builder()
+            .mailetName("SpamAssassin")
+            .setProperty(SpamAssassin.SPAMD_PORT, "-1")
+            .build())).isInstanceOf(MessagingException.class);
+    }
+
+    @Test
+    public void initShouldThrowWhenSpamdPortIsZero() throws Exception {
+        assertThatThrownBy(() -> mailet.init(FakeMailetConfig.builder()
+            .mailetName("SpamAssassin")
+            .setProperty(SpamAssassin.SPAMD_PORT, "0")
+            .build())).isInstanceOf(MessagingException.class);
+    }
+
+    @Test
+    public void initShouldThrowWhenSpamdPortTooBig() throws Exception {
+        assertThatThrownBy(() -> mailet.init(FakeMailetConfig.builder()
+            .mailetName("SpamAssassin")
+            .setProperty(SpamAssassin.SPAMD_PORT,
+                String.valueOf(SpamAssassin.MAX_AVAILABLE_PORT + 1))
+            .build())).isInstanceOf(MessagingException.class);
+    }
+
+    @Test
+    public void initShouldSetSpamPortWhenPresent() throws Exception {
+        int spamPort = 1000;
+        mailet.init(FakeMailetConfig.builder()
+            .mailetName("SpamAssassin")
+            .setProperty(SpamAssassin.SPAMD_PORT, String.valueOf(spamPort))
+            .build());
+
+        assertThat(mailet.getSpamdPort()).isEqualTo(spamPort);
+    }
+
+    @Test
+    public void serviceShouldWriteSpamAttributeOnMail() throws Exception {
+        int port = PortUtil.getNonPrivilegedPort();
+        new Thread(new MockSpamd(port)).start();
+
+        FakeMailetConfig mailetConfiguration = FakeMailetConfig.builder()
+            .mailetName("SpamAssassin")
+            .setProperty(SpamAssassin.SPAMD_HOST, "localhost")
+            .setProperty(SpamAssassin.SPAMD_PORT, String.valueOf(port))
+            .build();
+        mailet.init(mailetConfiguration);
+
+        Mail mail = FakeMail.builder()
+            .mimeMessage(MimeMessageBuilder.mimeMessageBuilder()
+                .addToRecipient("user1@exemple.com")
+                .addFrom("sender@exemple.com")
+                .setSubject("testing")
+                .setText("Please!")
+                .build())
+            .build();
+
+        mailet.service(mail);
+
+        assertThat(mail.getAttributeNames())
+            .containsOnly(SpamAssassinInvoker.FLAG_MAIL_ATTRIBUTE_NAME, SpamAssassinInvoker.STATUS_MAIL_ATTRIBUTE_NAME);
+    }
+
+    @Test
+    public void serviceShouldWriteMessageAsNotSpamWhenNotSpam() throws Exception {
+        int port = PortUtil.getNonPrivilegedPort();
+        new Thread(new MockSpamd(port)).start();
+
+        FakeMailetConfig mailetConfiguration = FakeMailetConfig.builder()
+            .mailetName("SpamAssassin")
+            .setProperty(SpamAssassin.SPAMD_HOST, "localhost")
+            .setProperty(SpamAssassin.SPAMD_PORT, String.valueOf(port))
+            .build();
+        mailet.init(mailetConfiguration);
+
+        Mail mail = FakeMail.builder()
+            .mimeMessage(MimeMessageBuilder.mimeMessageBuilder()
+                .addToRecipient("user1@exemple.com")
+                .addFrom("sender@exemple.com")
+                .setSubject("testing")
+                .setText("Please!")
+                .build())
+            .build();
+
+        mailet.service(mail);
+
+        assertThat(mail.getAttribute(SpamAssassinInvoker.FLAG_MAIL_ATTRIBUTE_NAME)).isEqualTo("NO");
+    }
+
+    @Test
+    public void serviceShouldWriteMessageAsSpamWhenSpam() throws Exception {
+        int port = PortUtil.getNonPrivilegedPort();
+        new Thread(new MockSpamd(port)).start();
+
+        FakeMailetConfig mailetConfiguration = FakeMailetConfig.builder()
+            .mailetName("SpamAssassin")
+            .setProperty(SpamAssassin.SPAMD_HOST, "localhost")
+            .setProperty(SpamAssassin.SPAMD_PORT, String.valueOf(port))
+            .build();
+        mailet.init(mailetConfiguration);
+
+        Mail mail = FakeMail.builder()
+            .mimeMessage(MimeMessageBuilder.mimeMessageBuilder()
+                .addToRecipient("user1@exemple.com")
+                .addFrom("sender@exemple.com")
+                .setSubject(MockSpamd.GTUBE + " testing")
+                .setText("Please!")
+                .build())
+            .build();
+
+        mailet.service(mail);
+
+        assertThat(mail.getAttribute(SpamAssassinInvoker.FLAG_MAIL_ATTRIBUTE_NAME)).isEqualTo("YES");
+    }
+
+    @Test
+    public void getMailetInfoShouldReturnSpamAssasinMailetInformation() throws Exception {
+        assertThat(mailet.getMailetInfo()).isEqualTo("Checks message against SpamAssassin");
+    }
+
+}
\ No newline at end of file


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


[02/13] james-project git commit: JAMES-2262 Use a Test rule for Mock SpamD test rule

Posted by bt...@apache.org.
JAMES-2262 Use a Test rule for Mock SpamD test rule


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

Branch: refs/heads/master
Commit: d11a7e406642aaaa12436ebd9c46b46c802b63af
Parents: 1ef7daf
Author: benwa <bt...@linagora.com>
Authored: Mon Dec 18 08:40:41 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Mon Dec 25 11:24:28 2017 +0700

----------------------------------------------------------------------
 .../transport/mailets/SpamAssassinTest.java     | 16 +++----
 .../smtpserver/SpamAssassinHandlerTest.java     | 14 +++---
 .../smtpserver/mock/util/MockSpamdTestRule.java | 46 ++++++++++++++++++++
 3 files changed, 57 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/d11a7e40/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
index 82279c0..71831d9 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
@@ -24,15 +24,20 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import javax.mail.MessagingException;
 
-import org.apache.james.smtpserver.mock.util.MockSpamd;
+import org.apache.james.smtpserver.mock.util.MockSpamdTestRule;
 import org.apache.james.util.scanner.SpamAssassinInvoker;
 import org.apache.mailet.Mail;
 import org.apache.mailet.base.test.FakeMail;
 import org.apache.mailet.base.test.FakeMailetConfig;
 import org.apache.mailet.base.test.MimeMessageBuilder;
+import org.junit.Rule;
 import org.junit.Test;
 
 public class SpamAssassinTest {
+
+    @Rule
+    public MockSpamdTestRule spamd = new MockSpamdTestRule();
+
     private SpamAssassin mailet = new SpamAssassin();
 
     @Test
@@ -129,9 +134,6 @@ public class SpamAssassinTest {
 
     @Test
     public void serviceShouldWriteSpamAttributeOnMail() throws Exception {
-        MockSpamd spamd = new MockSpamd();
-        new Thread(spamd).start();
-
         FakeMailetConfig mailetConfiguration = FakeMailetConfig.builder()
             .mailetName("SpamAssassin")
             .setProperty(SpamAssassin.SPAMD_HOST, "localhost")
@@ -156,9 +158,6 @@ public class SpamAssassinTest {
 
     @Test
     public void serviceShouldWriteMessageAsNotSpamWhenNotSpam() throws Exception {
-        MockSpamd spamd = new MockSpamd();
-        new Thread(spamd).start();
-
         FakeMailetConfig mailetConfiguration = FakeMailetConfig.builder()
             .mailetName("SpamAssassin")
             .setProperty(SpamAssassin.SPAMD_HOST, "localhost")
@@ -182,9 +181,6 @@ public class SpamAssassinTest {
 
     @Test
     public void serviceShouldWriteMessageAsSpamWhenSpam() throws Exception {
-        MockSpamd spamd = new MockSpamd();
-        new Thread(spamd).start();
-
         FakeMailetConfig mailetConfiguration = FakeMailetConfig.builder()
             .mailetName("SpamAssassin")
             .setProperty(SpamAssassin.SPAMD_HOST, "localhost")

http://git-wip-us.apache.org/repos/asf/james-project/blob/d11a7e40/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SpamAssassinHandlerTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SpamAssassinHandlerTest.java b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SpamAssassinHandlerTest.java
index bc94b6a..cf1b7cc 100644
--- a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SpamAssassinHandlerTest.java
+++ b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SpamAssassinHandlerTest.java
@@ -35,8 +35,10 @@ import org.apache.james.smtpserver.fastfail.SpamAssassinHandler;
 import org.apache.james.smtpserver.mock.MockMimeMessage;
 import org.apache.james.smtpserver.mock.mailet.MockMail;
 import org.apache.james.smtpserver.mock.util.MockSpamd;
+import org.apache.james.smtpserver.mock.util.MockSpamdTestRule;
 import org.apache.james.util.scanner.SpamAssassinInvoker;
 import org.apache.mailet.Mail;
+import org.junit.Rule;
 import org.junit.Test;
 
 public class SpamAssassinHandlerTest {
@@ -91,6 +93,9 @@ public class SpamAssassinHandlerTest {
 
     }
 
+    @Rule
+    public MockSpamdTestRule spamd = new MockSpamdTestRule();
+
     private Mail setupMockedMail(MimeMessage message) {
         MockMail mail = new MockMail();
         mail.setMessage(message);
@@ -107,9 +112,6 @@ public class SpamAssassinHandlerTest {
 
     @Test
     public void testNonSpam() throws IOException, MessagingException {
-        MockSpamd spamd = new MockSpamd();
-        new Thread(spamd).start();
-
         SMTPSession session = setupMockedSMTPSession(setupMockedMail(setupMockedMimeMessage("test")));
 
         SpamAssassinHandler handler = new SpamAssassinHandler();
@@ -127,9 +129,6 @@ public class SpamAssassinHandlerTest {
 
     @Test
     public void testSpam() throws IOException, MessagingException {
-        MockSpamd spamd = new MockSpamd();
-        new Thread(spamd).start();
-
         SMTPSession session = setupMockedSMTPSession(setupMockedMail(setupMockedMimeMessage(MockSpamd.GTUBE)));
 
         SpamAssassinHandler handler = new SpamAssassinHandler();
@@ -146,9 +145,6 @@ public class SpamAssassinHandlerTest {
 
     @Test
     public void testSpamReject() throws IOException, MessagingException {
-        MockSpamd spamd = new MockSpamd();
-        new Thread(spamd).start();
-
         SMTPSession session = setupMockedSMTPSession(setupMockedMail(setupMockedMimeMessage(MockSpamd.GTUBE)));
 
         SpamAssassinHandler handler = new SpamAssassinHandler();

http://git-wip-us.apache.org/repos/asf/james-project/blob/d11a7e40/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamdTestRule.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamdTestRule.java b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamdTestRule.java
new file mode 100644
index 0000000..4822b8f
--- /dev/null
+++ b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamdTestRule.java
@@ -0,0 +1,46 @@
+/****************************************************************
+ * 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.smtpserver.mock.util;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import org.junit.rules.ExternalResource;
+
+public class MockSpamdTestRule extends ExternalResource {
+
+    private ExecutorService executor = Executors.newSingleThreadExecutor();
+    private MockSpamd spamd = new MockSpamd();
+
+    @Override
+    protected void before() throws Throwable {
+        spamd.bind();
+        executor.execute(spamd);
+    }
+
+    public int getPort() {
+        return spamd.getPort();
+    }
+
+    @Override
+    protected void after() {
+        executor.shutdownNow();
+    }
+}


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


[13/13] james-project git commit: JAMES-2268 Implicitly call FakeMailetContext.Builder::build

Posted by bt...@apache.org.
JAMES-2268 Implicitly call FakeMailetContext.Builder::build


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

Branch: refs/heads/master
Commit: 02f9631de39df832b7305ea3e12f0906dc759fd3
Parents: 56b1ddc
Author: benwa <bt...@linagora.com>
Authored: Thu Dec 21 13:55:23 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Mon Dec 25 11:25:18 2017 +0700

----------------------------------------------------------------------
 .../org/apache/mailet/base/test/FakeMailetConfig.java  |  4 ++++
 .../transport/mailets/delivery/LocalDeliveryTest.java  | 13 +++----------
 2 files changed, 7 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/02f9631d/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMailetConfig.java
----------------------------------------------------------------------
diff --git a/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMailetConfig.java b/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMailetConfig.java
index f0598e5..d86f793 100644
--- a/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMailetConfig.java
+++ b/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMailetConfig.java
@@ -58,6 +58,10 @@ public class FakeMailetConfig implements MailetConfig {
             return this;
         }
 
+        public Builder mailetContext(FakeMailContext.Builder mailetContext) {
+            return mailetContext(mailetContext.build());
+        }
+
         public Builder setProperty(String key, String value) {
             this.properties.setProperty(key, value);
             return this;

http://git-wip-us.apache.org/repos/asf/james-project/blob/02f9631d/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java
index 8b59316..b9ac01d 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java
@@ -38,7 +38,6 @@ import org.apache.james.core.MailAddress;
 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;
 import org.apache.james.metrics.api.Metric;
 import org.apache.james.metrics.api.MetricFactory;
@@ -53,8 +52,6 @@ import org.junit.Before;
 import org.junit.Test;
 import org.slf4j.Logger;
 
-import com.google.common.base.Throwables;
-
 public class LocalDeliveryTest {
 
     public static final String RECEIVER_DOMAIN_COM = "receiver@domain.com";
@@ -65,7 +62,7 @@ public class LocalDeliveryTest {
     private LocalDelivery testee;
 
     @Before
-    public void setUp() {
+    public void setUp() throws Exception {
         usersRepository = mock(UsersRepository.class);
         mailboxManager = mock(MailboxManager.class);
 
@@ -76,16 +73,12 @@ public class LocalDeliveryTest {
         user = mock(MailboxSession.User.class);
         MailboxSession session = mock(MailboxSession.class);
         when(session.getPathDelimiter()).thenReturn('.');
-        try {
-            when(mailboxManager.createSystemSession(any(String.class))).thenReturn(session);
-        } catch (MailboxException e) {
-            throw Throwables.propagate(e);
-        }
+        when(mailboxManager.createSystemSession(any(String.class))).thenReturn(session);
         when(session.getUser()).thenReturn(user);
 
         config = FakeMailetConfig.builder()
             .mailetName("Local delivery")
-            .mailetContext(FakeMailContext.builder().logger(mock(Logger.class)).build())
+            .mailetContext(FakeMailContext.builder().logger(mock(Logger.class)))
             .build();
     }
 


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


[09/13] james-project git commit: JAMES-2262 Improve MockSpamD location

Posted by bt...@apache.org.
JAMES-2262 Improve MockSpamD location


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

Branch: refs/heads/master
Commit: 71f6fe24844f2662549b4d20d154d43f848cd5a3
Parents: 9c23977
Author: benwa <bt...@linagora.com>
Authored: Fri Dec 22 09:41:54 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Mon Dec 25 11:24:56 2017 +0700

----------------------------------------------------------------------
 server/mailet/mailets/pom.xml                   |  12 +-
 .../transport/mailets/SpamAssassinTest.java     |   4 +-
 server/protocols/protocols-smtp/pom.xml         |   5 +
 .../smtpserver/SpamAssassinHandlerTest.java     |   4 +-
 .../james/smtpserver/mock/util/MockSpamd.java   | 109 -------------------
 .../smtpserver/mock/util/MockSpamdTestRule.java |  46 --------
 server/testing/pom.xml                          |   1 -
 .../java/org/apache/james/utils/MockSpamd.java  | 109 +++++++++++++++++++
 .../apache/james/utils/MockSpamdTestRule.java   |  46 ++++++++
 9 files changed, 166 insertions(+), 170 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/71f6fe24/server/mailet/mailets/pom.xml
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/pom.xml b/server/mailet/mailets/pom.xml
index a8f409c..f269dfa 100644
--- a/server/mailet/mailets/pom.xml
+++ b/server/mailet/mailets/pom.xml
@@ -135,23 +135,15 @@
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
-            <artifactId>james-server-protocols-library</artifactId>
-            <type>test-jar</type>
-            <scope>test</scope>
+            <artifactId>james-server-queue-api</artifactId>
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
-            <artifactId>james-server-protocols-smtp</artifactId>
-            <version>${project.version}</version>
-            <type>test-jar</type>
+            <artifactId>james-server-testing</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
-            <artifactId>james-server-queue-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
             <artifactId>james-server-util</artifactId>
         </dependency>
         <dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/71f6fe24/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
index 875a4f9..aba82cd 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
@@ -24,10 +24,10 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import javax.mail.MessagingException;
 
-import org.apache.james.smtpserver.mock.util.MockSpamd;
-import org.apache.james.smtpserver.mock.util.MockSpamdTestRule;
 import org.apache.james.util.Port;
 import org.apache.james.util.scanner.SpamAssassinInvoker;
+import org.apache.james.utils.MockSpamd;
+import org.apache.james.utils.MockSpamdTestRule;
 import org.apache.mailet.Mail;
 import org.apache.mailet.base.test.FakeMail;
 import org.apache.mailet.base.test.FakeMailetConfig;

http://git-wip-us.apache.org/repos/asf/james-project/blob/71f6fe24/server/protocols/protocols-smtp/pom.xml
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-smtp/pom.xml b/server/protocols/protocols-smtp/pom.xml
index 2dd30c7..a18c272 100644
--- a/server/protocols/protocols-smtp/pom.xml
+++ b/server/protocols/protocols-smtp/pom.xml
@@ -123,6 +123,11 @@
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
+            <artifactId>james-server-testing</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
             <artifactId>james-server-util</artifactId>
         </dependency>
         <dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/71f6fe24/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SpamAssassinHandlerTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SpamAssassinHandlerTest.java b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SpamAssassinHandlerTest.java
index cf1b7cc..3016e44 100644
--- a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SpamAssassinHandlerTest.java
+++ b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SpamAssassinHandlerTest.java
@@ -34,9 +34,9 @@ import org.apache.james.protocols.smtp.utils.BaseFakeSMTPSession;
 import org.apache.james.smtpserver.fastfail.SpamAssassinHandler;
 import org.apache.james.smtpserver.mock.MockMimeMessage;
 import org.apache.james.smtpserver.mock.mailet.MockMail;
-import org.apache.james.smtpserver.mock.util.MockSpamd;
-import org.apache.james.smtpserver.mock.util.MockSpamdTestRule;
 import org.apache.james.util.scanner.SpamAssassinInvoker;
+import org.apache.james.utils.MockSpamd;
+import org.apache.james.utils.MockSpamdTestRule;
 import org.apache.mailet.Mail;
 import org.junit.Rule;
 import org.junit.Test;

http://git-wip-us.apache.org/repos/asf/james-project/blob/71f6fe24/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamd.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamd.java b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamd.java
deleted file mode 100644
index 45f6920..0000000
--- a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamd.java
+++ /dev/null
@@ -1,109 +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.smtpserver.mock.util;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.net.ServerSocket;
-import java.net.Socket;
-
-import org.apache.commons.io.IOUtils;
-
-import com.google.common.base.Preconditions;
-
-/**
- * This class can be used to run a mocked SPAMD daemon
- */
-public class MockSpamd implements Runnable {
-
-    /**
-     * Mailcontent which is 100% spam
-     */
-    public final static String GTUBE = "-SPAM-";
-    public final static String NOT_SPAM = "Spam: False ; 3 / 5";
-    public final static String SPAM = "Spam: True ; 1000 / 5";
-    private BufferedReader in;
-    private OutputStream out;
-    private Socket spamd;
-    private ServerSocket socket;
-    private boolean isBinded;
-
-
-    /**
-     * Init the mocked SPAMD daemon
-     *
-     * @throws IOException
-     */
-    public MockSpamd() {
-        isBinded = false;
-    }
-
-    public int getPort() {
-        Preconditions.checkState(isBinded, "SpamD mock server is not binded");
-        return socket.getLocalPort();
-    }
-
-    public void bind() throws IOException {
-        socket = new ServerSocket(0);
-        isBinded = true;
-    }
-
-    /**
-     * @see java.lang.Runnable#run()
-     */
-    @Override
-    public void run() {
-
-        try {
-            boolean spam = false;
-
-            // Accept connections
-            spamd = socket.accept();
-
-            in = new BufferedReader(new InputStreamReader(spamd.getInputStream()));
-            out = spamd.getOutputStream();
-
-            String line;
-
-            // Parse the message
-            while ((line = in.readLine()) != null) {
-                if (line.contains(GTUBE)) {
-                    spam = true;
-                }
-            }
-            if (spam) {
-                out.write(SPAM.getBytes());
-                out.flush();
-            } else {
-                out.write(NOT_SPAM.getBytes());
-                out.flush();
-            }
-        } catch (IOException e) {
-            // Should not happen
-            e.printStackTrace();
-        } finally {
-            IOUtils.closeQuietly(in);
-            IOUtils.closeQuietly(out);
-            IOUtils.closeQuietly(spamd);
-            IOUtils.closeQuietly(socket);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/71f6fe24/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamdTestRule.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamdTestRule.java b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamdTestRule.java
deleted file mode 100644
index 4822b8f..0000000
--- a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamdTestRule.java
+++ /dev/null
@@ -1,46 +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.smtpserver.mock.util;
-
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-import org.junit.rules.ExternalResource;
-
-public class MockSpamdTestRule extends ExternalResource {
-
-    private ExecutorService executor = Executors.newSingleThreadExecutor();
-    private MockSpamd spamd = new MockSpamd();
-
-    @Override
-    protected void before() throws Throwable {
-        spamd.bind();
-        executor.execute(spamd);
-    }
-
-    public int getPort() {
-        return spamd.getPort();
-    }
-
-    @Override
-    protected void after() {
-        executor.shutdownNow();
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/71f6fe24/server/testing/pom.xml
----------------------------------------------------------------------
diff --git a/server/testing/pom.xml b/server/testing/pom.xml
index 705438a..3014fc8 100644
--- a/server/testing/pom.xml
+++ b/server/testing/pom.xml
@@ -46,7 +46,6 @@
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
-            <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.assertj</groupId>

http://git-wip-us.apache.org/repos/asf/james-project/blob/71f6fe24/server/testing/src/main/java/org/apache/james/utils/MockSpamd.java
----------------------------------------------------------------------
diff --git a/server/testing/src/main/java/org/apache/james/utils/MockSpamd.java b/server/testing/src/main/java/org/apache/james/utils/MockSpamd.java
new file mode 100644
index 0000000..896df3c
--- /dev/null
+++ b/server/testing/src/main/java/org/apache/james/utils/MockSpamd.java
@@ -0,0 +1,109 @@
+/****************************************************************
+ * 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.utils;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.ServerSocket;
+import java.net.Socket;
+
+import org.apache.commons.io.IOUtils;
+
+import com.google.common.base.Preconditions;
+
+/**
+ * This class can be used to run a mocked SPAMD daemon
+ */
+public class MockSpamd implements Runnable {
+
+    /**
+     * Mailcontent which is 100% spam
+     */
+    public final static String GTUBE = "-SPAM-";
+    public final static String NOT_SPAM = "Spam: False ; 3 / 5";
+    public final static String SPAM = "Spam: True ; 1000 / 5";
+    private BufferedReader in;
+    private OutputStream out;
+    private Socket spamd;
+    private ServerSocket socket;
+    private boolean isBinded;
+
+
+    /**
+     * Init the mocked SPAMD daemon
+     *
+     * @throws IOException
+     */
+    public MockSpamd() {
+        isBinded = false;
+    }
+
+    public int getPort() {
+        Preconditions.checkState(isBinded, "SpamD mock server is not binded");
+        return socket.getLocalPort();
+    }
+
+    public void bind() throws IOException {
+        socket = new ServerSocket(0);
+        isBinded = true;
+    }
+
+    /**
+     * @see java.lang.Runnable#run()
+     */
+    @Override
+    public void run() {
+
+        try {
+            boolean spam = false;
+
+            // Accept connections
+            spamd = socket.accept();
+
+            in = new BufferedReader(new InputStreamReader(spamd.getInputStream()));
+            out = spamd.getOutputStream();
+
+            String line;
+
+            // Parse the message
+            while ((line = in.readLine()) != null) {
+                if (line.contains(GTUBE)) {
+                    spam = true;
+                }
+            }
+            if (spam) {
+                out.write(SPAM.getBytes());
+                out.flush();
+            } else {
+                out.write(NOT_SPAM.getBytes());
+                out.flush();
+            }
+        } catch (IOException e) {
+            // Should not happen
+            e.printStackTrace();
+        } finally {
+            IOUtils.closeQuietly(in);
+            IOUtils.closeQuietly(out);
+            IOUtils.closeQuietly(spamd);
+            IOUtils.closeQuietly(socket);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/71f6fe24/server/testing/src/main/java/org/apache/james/utils/MockSpamdTestRule.java
----------------------------------------------------------------------
diff --git a/server/testing/src/main/java/org/apache/james/utils/MockSpamdTestRule.java b/server/testing/src/main/java/org/apache/james/utils/MockSpamdTestRule.java
new file mode 100644
index 0000000..ea746df
--- /dev/null
+++ b/server/testing/src/main/java/org/apache/james/utils/MockSpamdTestRule.java
@@ -0,0 +1,46 @@
+/****************************************************************
+ * 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.utils;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import org.junit.rules.ExternalResource;
+
+public class MockSpamdTestRule extends ExternalResource {
+
+    private ExecutorService executor = Executors.newSingleThreadExecutor();
+    private MockSpamd spamd = new MockSpamd();
+
+    @Override
+    protected void before() throws Throwable {
+        spamd.bind();
+        executor.execute(spamd);
+    }
+
+    public int getPort() {
+        return spamd.getPort();
+    }
+
+    @Override
+    protected void after() {
+        executor.shutdownNow();
+    }
+}


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


[04/13] james-project git commit: JAMES-2262 Ensure MockSpamD binds a random port

Posted by bt...@apache.org.
JAMES-2262 Ensure MockSpamD binds a random port

Without being vulnerable to race conditions.


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

Branch: refs/heads/master
Commit: 1ef7dafcd1e17b6e64c3c8649ccb111e202eb4ef
Parents: 03b2633
Author: benwa <bt...@linagora.com>
Authored: Mon Dec 18 08:30:10 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Mon Dec 25 11:24:28 2017 +0700

----------------------------------------------------------------------
 .../transport/mailets/SpamAssassinTest.java     | 19 +++++++++---------
 .../smtpserver/SpamAssassinHandlerTest.java     | 21 ++++++++------------
 .../james/smtpserver/mock/util/MockSpamd.java   | 20 ++++++++++++++++---
 3 files changed, 34 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/1ef7dafc/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
index e49d981..82279c0 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
@@ -24,7 +24,6 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import javax.mail.MessagingException;
 
-import org.apache.james.protocols.lib.PortUtil;
 import org.apache.james.smtpserver.mock.util.MockSpamd;
 import org.apache.james.util.scanner.SpamAssassinInvoker;
 import org.apache.mailet.Mail;
@@ -130,13 +129,13 @@ public class SpamAssassinTest {
 
     @Test
     public void serviceShouldWriteSpamAttributeOnMail() throws Exception {
-        int port = PortUtil.getNonPrivilegedPort();
-        new Thread(new MockSpamd(port)).start();
+        MockSpamd spamd = new MockSpamd();
+        new Thread(spamd).start();
 
         FakeMailetConfig mailetConfiguration = FakeMailetConfig.builder()
             .mailetName("SpamAssassin")
             .setProperty(SpamAssassin.SPAMD_HOST, "localhost")
-            .setProperty(SpamAssassin.SPAMD_PORT, String.valueOf(port))
+            .setProperty(SpamAssassin.SPAMD_PORT, String.valueOf(spamd.getPort()))
             .build();
         mailet.init(mailetConfiguration);
 
@@ -157,13 +156,13 @@ public class SpamAssassinTest {
 
     @Test
     public void serviceShouldWriteMessageAsNotSpamWhenNotSpam() throws Exception {
-        int port = PortUtil.getNonPrivilegedPort();
-        new Thread(new MockSpamd(port)).start();
+        MockSpamd spamd = new MockSpamd();
+        new Thread(spamd).start();
 
         FakeMailetConfig mailetConfiguration = FakeMailetConfig.builder()
             .mailetName("SpamAssassin")
             .setProperty(SpamAssassin.SPAMD_HOST, "localhost")
-            .setProperty(SpamAssassin.SPAMD_PORT, String.valueOf(port))
+            .setProperty(SpamAssassin.SPAMD_PORT, String.valueOf(spamd.getPort()))
             .build();
         mailet.init(mailetConfiguration);
 
@@ -183,13 +182,13 @@ public class SpamAssassinTest {
 
     @Test
     public void serviceShouldWriteMessageAsSpamWhenSpam() throws Exception {
-        int port = PortUtil.getNonPrivilegedPort();
-        new Thread(new MockSpamd(port)).start();
+        MockSpamd spamd = new MockSpamd();
+        new Thread(spamd).start();
 
         FakeMailetConfig mailetConfiguration = FakeMailetConfig.builder()
             .mailetName("SpamAssassin")
             .setProperty(SpamAssassin.SPAMD_HOST, "localhost")
-            .setProperty(SpamAssassin.SPAMD_PORT, String.valueOf(port))
+            .setProperty(SpamAssassin.SPAMD_PORT, String.valueOf(spamd.getPort()))
             .build();
         mailet.init(mailetConfiguration);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/1ef7dafc/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SpamAssassinHandlerTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SpamAssassinHandlerTest.java b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SpamAssassinHandlerTest.java
index d9c7dea..bc94b6a 100644
--- a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SpamAssassinHandlerTest.java
+++ b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SpamAssassinHandlerTest.java
@@ -27,7 +27,6 @@ import java.util.HashMap;
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
-import org.apache.james.protocols.lib.PortUtil;
 import org.apache.james.protocols.smtp.SMTPSession;
 import org.apache.james.protocols.smtp.hook.HookResult;
 import org.apache.james.protocols.smtp.hook.HookReturnCode;
@@ -108,9 +107,7 @@ public class SpamAssassinHandlerTest {
 
     @Test
     public void testNonSpam() throws IOException, MessagingException {
-
-        int port = PortUtil.getNonPrivilegedPort();
-        MockSpamd spamd = new MockSpamd(port);
+        MockSpamd spamd = new MockSpamd();
         new Thread(spamd).start();
 
         SMTPSession session = setupMockedSMTPSession(setupMockedMail(setupMockedMimeMessage("test")));
@@ -118,7 +115,7 @@ public class SpamAssassinHandlerTest {
         SpamAssassinHandler handler = new SpamAssassinHandler();
 
         handler.setSpamdHost(SPAMD_HOST);
-        handler.setSpamdPort(port);
+        handler.setSpamdPort(spamd.getPort());
         handler.setSpamdRejectionHits(200.0);
         HookResult response = handler.onMessage(session, mockedMail);
 
@@ -130,16 +127,15 @@ public class SpamAssassinHandlerTest {
 
     @Test
     public void testSpam() throws IOException, MessagingException {
-
-        int port = PortUtil.getNonPrivilegedPort();
-        new Thread(new MockSpamd(port)).start();
+        MockSpamd spamd = new MockSpamd();
+        new Thread(spamd).start();
 
         SMTPSession session = setupMockedSMTPSession(setupMockedMail(setupMockedMimeMessage(MockSpamd.GTUBE)));
 
         SpamAssassinHandler handler = new SpamAssassinHandler();
 
         handler.setSpamdHost(SPAMD_HOST);
-        handler.setSpamdPort(port);
+        handler.setSpamdPort(spamd.getPort());
         handler.setSpamdRejectionHits(2000.0);
         HookResult response = handler.onMessage(session, mockedMail);
 
@@ -150,16 +146,15 @@ public class SpamAssassinHandlerTest {
 
     @Test
     public void testSpamReject() throws IOException, MessagingException {
-
-        int port = PortUtil.getNonPrivilegedPort();
-        new Thread(new MockSpamd(port)).start();
+        MockSpamd spamd = new MockSpamd();
+        new Thread(spamd).start();
 
         SMTPSession session = setupMockedSMTPSession(setupMockedMail(setupMockedMimeMessage(MockSpamd.GTUBE)));
 
         SpamAssassinHandler handler = new SpamAssassinHandler();
 
         handler.setSpamdHost(SPAMD_HOST);
-        handler.setSpamdPort(port);
+        handler.setSpamdPort(spamd.getPort());
         handler.setSpamdRejectionHits(200.0);
         HookResult response = handler.onMessage(session, mockedMail);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/1ef7dafc/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamd.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamd.java b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamd.java
index a0ff6f9..45f6920 100644
--- a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamd.java
+++ b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamd.java
@@ -27,6 +27,8 @@ import java.net.Socket;
 
 import org.apache.commons.io.IOUtils;
 
+import com.google.common.base.Preconditions;
+
 /**
  * This class can be used to run a mocked SPAMD daemon
  */
@@ -42,6 +44,7 @@ public class MockSpamd implements Runnable {
     private OutputStream out;
     private Socket spamd;
     private ServerSocket socket;
+    private boolean isBinded;
 
 
     /**
@@ -49,15 +52,26 @@ public class MockSpamd implements Runnable {
      *
      * @throws IOException
      */
-    public MockSpamd(int port) throws IOException {
-        socket = new ServerSocket(port);
+    public MockSpamd() {
+        isBinded = false;
+    }
+
+    public int getPort() {
+        Preconditions.checkState(isBinded, "SpamD mock server is not binded");
+        return socket.getLocalPort();
     }
-    
+
+    public void bind() throws IOException {
+        socket = new ServerSocket(0);
+        isBinded = true;
+    }
+
     /**
      * @see java.lang.Runnable#run()
      */
     @Override
     public void run() {
+
         try {
             boolean spam = false;
 


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


[10/13] james-project git commit: JAMES-2262 Improve MockSpamd code quality

Posted by bt...@apache.org.
JAMES-2262 Improve MockSpamd code quality


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

Branch: refs/heads/master
Commit: 56b1ddc1dade10286fec931052c66cb458b9ba67
Parents: 2bd8503
Author: benwa <bt...@linagora.com>
Authored: Fri Dec 22 16:00:19 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Mon Dec 25 11:24:56 2017 +0700

----------------------------------------------------------------------
 .../java/org/apache/james/utils/MockSpamd.java  | 75 +++++++++-----------
 1 file changed, 34 insertions(+), 41 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/56b1ddc1/server/testing/src/main/java/org/apache/james/utils/MockSpamd.java
----------------------------------------------------------------------
diff --git a/server/testing/src/main/java/org/apache/james/utils/MockSpamd.java b/server/testing/src/main/java/org/apache/james/utils/MockSpamd.java
index 896df3c..cbe7159 100644
--- a/server/testing/src/main/java/org/apache/james/utils/MockSpamd.java
+++ b/server/testing/src/main/java/org/apache/james/utils/MockSpamd.java
@@ -18,14 +18,19 @@
  ****************************************************************/
 package org.apache.james.utils;
 
+import static org.apache.commons.io.output.NullOutputStream.NULL_OUTPUT_STREAM;
+
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.net.ServerSocket;
 import java.net.Socket;
+import java.nio.charset.StandardCharsets;
 
 import org.apache.commons.io.IOUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Preconditions;
 
@@ -33,6 +38,7 @@ import com.google.common.base.Preconditions;
  * This class can be used to run a mocked SPAMD daemon
  */
 public class MockSpamd implements Runnable {
+    private static final Logger LOGGER = LoggerFactory.getLogger(MockSpamd.class);
 
     /**
      * Mailcontent which is 100% spam
@@ -40,18 +46,10 @@ public class MockSpamd implements Runnable {
     public final static String GTUBE = "-SPAM-";
     public final static String NOT_SPAM = "Spam: False ; 3 / 5";
     public final static String SPAM = "Spam: True ; 1000 / 5";
-    private BufferedReader in;
-    private OutputStream out;
-    private Socket spamd;
+
     private ServerSocket socket;
     private boolean isBinded;
 
-
-    /**
-     * Init the mocked SPAMD daemon
-     *
-     * @throws IOException
-     */
     public MockSpamd() {
         isBinded = false;
     }
@@ -66,44 +64,39 @@ public class MockSpamd implements Runnable {
         isBinded = true;
     }
 
-    /**
-     * @see java.lang.Runnable#run()
-     */
     @Override
     public void run() {
+        try (Socket spamd = socket.accept();
+             BufferedReader in = new BufferedReader(new InputStreamReader(spamd.getInputStream()));
+             OutputStream out = spamd.getOutputStream()) {
 
-        try {
-            boolean spam = false;
-
-            // Accept connections
-            spamd = socket.accept();
-
-            in = new BufferedReader(new InputStreamReader(spamd.getInputStream()));
-            out = spamd.getOutputStream();
-
-            String line;
-
-            // Parse the message
-            while ((line = in.readLine()) != null) {
-                if (line.contains(GTUBE)) {
-                    spam = true;
-                }
-            }
-            if (spam) {
-                out.write(SPAM.getBytes());
-                out.flush();
-            } else {
-                out.write(NOT_SPAM.getBytes());
-                out.flush();
-            }
+            handleRequest(in, out);
         } catch (IOException e) {
-            // Should not happen
-            e.printStackTrace();
+            LOGGER.error("Exception while handling answer", e);
         } finally {
-            IOUtils.closeQuietly(in);
-            IOUtils.closeQuietly(out);
-            IOUtils.closeQuietly(spamd);
             IOUtils.closeQuietly(socket);
         }
     }
+
+    private void handleRequest(BufferedReader in, OutputStream out) throws IOException {
+        if (isSpam(in)) {
+            out.write(SPAM.getBytes());
+        } else {
+            out.write(NOT_SPAM.getBytes());
+        }
+        out.flush();
+    }
+
+    private boolean isSpam(BufferedReader in) throws IOException {
+        try {
+            return in.lines()
+                .anyMatch(line -> line.contains(GTUBE));
+        } finally {
+            consume(in);
+        }
+    }
+
+    private void consume(BufferedReader in) throws IOException {
+        IOUtils.copy(in, NULL_OUTPUT_STREAM, StandardCharsets.UTF_8);
+    }
 }


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


[03/13] james-project git commit: JAMES-2262 Add integration testing for SpamAssassin

Posted by bt...@apache.org.
JAMES-2262 Add integration testing for SpamAssassin


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

Branch: refs/heads/master
Commit: 0be23436f7df9ac735a27f0be0dbf09c64d33b05
Parents: 4d9d568
Author: quynhn <qn...@linagora.com>
Authored: Thu Dec 14 16:54:19 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Mon Dec 25 11:24:28 2017 +0700

----------------------------------------------------------------------
 .../james/util/streams/ContainerNames.java      |   1 +
 .../transport/mailets/SpamAssassinTest.java     | 158 ++++++++++++-------
 2 files changed, 104 insertions(+), 55 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/0be23436/server/container/util-java8/src/test/java/org/apache/james/util/streams/ContainerNames.java
----------------------------------------------------------------------
diff --git a/server/container/util-java8/src/test/java/org/apache/james/util/streams/ContainerNames.java b/server/container/util-java8/src/test/java/org/apache/james/util/streams/ContainerNames.java
index 908cea2..2328431 100644
--- a/server/container/util-java8/src/test/java/org/apache/james/util/streams/ContainerNames.java
+++ b/server/container/util-java8/src/test/java/org/apache/james/util/streams/ContainerNames.java
@@ -25,4 +25,5 @@ public interface ContainerNames {
     String ELASTICSEARCH = "elasticsearch:2.2.2";
     String NGINX = "nginx:1.7.1";
     String TIKA = "logicalspark/docker-tikaserver:1.15rc2";
+    String SPAMASSASSIN = "dinkel/spamassassin:3.4.0";
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/0be23436/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
index 34c9a36..8eb6fea 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
@@ -18,24 +18,21 @@
  ****************************************************************/
 package org.apache.james.transport.mailets;
 
-import static net.javacrumbs.jsonunit.fluent.JsonFluentAssert.assertThatJson;
+import static org.apache.james.MemoryJamesServerMain.SMTP_AND_IMAP_MODULE;
+import static org.apache.james.MemoryJamesServerMain.SMTP_ONLY_MODULE;
 import static org.assertj.core.api.Assertions.assertThat;
 
-import java.util.Optional;
-
 import javax.mail.internet.MimeMessage;
 
 import org.apache.james.core.MailAddress;
-import org.apache.james.jmap.mailet.VacationMailet;
 import org.apache.james.mailets.TemporaryJamesServer;
 import org.apache.james.mailets.configuration.CommonProcessors;
 import org.apache.james.mailets.configuration.MailetConfiguration;
 import org.apache.james.mailets.configuration.MailetContainer;
 import org.apache.james.mailets.configuration.ProcessorConfiguration;
-import org.apache.james.transport.mailets.amqp.AmqpRule;
 import org.apache.james.transport.matchers.All;
 import org.apache.james.transport.matchers.RecipientIsLocal;
-import org.apache.james.transport.matchers.SMTPAuthSuccessful;
+import org.apache.james.util.scanner.SpamAssassinInvoker;
 import org.apache.james.util.streams.ContainerNames;
 import org.apache.james.util.streams.SwarmGenericContainer;
 import org.apache.james.utils.DataProbeImpl;
@@ -49,36 +46,37 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.RuleChain;
 import org.junit.rules.TemporaryFolder;
+import org.testcontainers.containers.wait.HostPortWaitStrategy;
 
 import com.jayway.awaitility.Awaitility;
 import com.jayway.awaitility.Duration;
+import com.jayway.awaitility.core.ConditionFactory;
 
-public class ContactExtractorTest {
+public class SpamAssassinTest {
+    private static final String LOCALHOST_IP = "127.0.0.1";
+    private static final int IMAP_PORT = 1143;
+    private static final int SMTP_PORT = 1025;
 
     public static final String JAMES_ORG = "james.org";
     public static final String SENDER = "sender@" + JAMES_ORG;
     public static final String TO = "to@" + JAMES_ORG;
-    public static final String TO2 = "to2@" + JAMES_ORG;
-    public static final String CC = "cc@" + JAMES_ORG;
-    public static final String CC2 = "cc2@" + JAMES_ORG;
-    public static final String BCC = "bcc@" + JAMES_ORG;
-    public static final String BCC2 = "bcc2@" + JAMES_ORG;
     public static final String PASSWORD = "secret";
-    public static final String EXCHANGE = "collector:email";
-    public static final String ROUTING_KEY = "";
 
-    public SwarmGenericContainer rabbit = new SwarmGenericContainer(ContainerNames.RABBITMQ);
-    public AmqpRule amqpRule = new AmqpRule(rabbit, EXCHANGE, ROUTING_KEY);
-    public TemporaryFolder folder = new TemporaryFolder();
+    public SwarmGenericContainer spamAssassinContainer = new SwarmGenericContainer(ContainerNames.SPAMASSASSIN)
+        .withExposedPorts(783)
+        .withAffinityToContainer()
+        .waitingFor(new HostPortWaitStrategy());
+
+    public TemporaryFolder temporaryFolder = new TemporaryFolder();
 
     @Rule
-    public RuleChain chain = RuleChain.outerRule(rabbit).around(amqpRule).around(folder);
+    public RuleChain chain = RuleChain.outerRule(temporaryFolder).around(spamAssassinContainer);
 
     private TemporaryJamesServer jamesServer;
+    private ConditionFactory calmlyAwait;
 
     @Before
     public void setup() throws Exception {
-        String attribute = "ExtractedContacts";
         MailetContainer mailets = MailetContainer
             .builder()
             .threads(5)
@@ -89,16 +87,16 @@ public class ContactExtractorTest {
                 ProcessorConfiguration.builder()
                     .state("transport")
                     .addMailet(MailetConfiguration.builder()
-                        .matcher(SMTPAuthSuccessful.class)
-                        .mailet(ContactExtractor.class)
-                        .addProperty(ContactExtractor.Configuration.ATTRIBUTE, attribute)
+                        .matcher(All.class)
+                        .mailet(SpamAssassin.class)
+                        .addProperty(SpamAssassin.SPAMD_HOST, spamAssassinContainer.getContainerIp())
                         .build())
                     .addMailet(MailetConfiguration.builder()
                         .matcher(All.class)
-                        .mailet(AmqpForwardAttribute.class)
-                        .addProperty(AmqpForwardAttribute.URI_PARAMETER_NAME, amqpRule.getAmqpUri())
-                        .addProperty(AmqpForwardAttribute.EXCHANGE_PARAMETER_NAME, EXCHANGE)
-                        .addProperty(AmqpForwardAttribute.ATTRIBUTE_PARAMETER_NAME, attribute)
+                        .mailet(MailAttributesToMimeHeaders.class)
+                        .addProperty("simplemapping",
+                            SpamAssassinInvoker.FLAG_MAIL_ATTRIBUTE_NAME + ";" + SpamAssassinInvoker.FLAG_MAIL_ATTRIBUTE_NAME + "," +
+                            SpamAssassinInvoker.STATUS_MAIL_ATTRIBUTE_NAME + ";" + SpamAssassinInvoker.STATUS_MAIL_ATTRIBUTE_NAME)
                         .build())
                     .addMailet(MailetConfiguration.builder()
                         .matcher(All.class)
@@ -107,24 +105,20 @@ public class ContactExtractorTest {
                         .build())
                     .addMailet(MailetConfiguration.builder()
                         .matcher(RecipientIsLocal.class)
-                        .mailet(VacationMailet.class)
-                        .build())
-                    .addMailet(MailetConfiguration.builder()
-                        .matcher(RecipientIsLocal.class)
                         .mailet(LocalDelivery.class)
                         .build())
                     .build())
             .build();
-        jamesServer = TemporaryJamesServer.builder().build(folder, mailets);
+        jamesServer = TemporaryJamesServer.builder()
+            .withBase(SMTP_AND_IMAP_MODULE)
+            .build(temporaryFolder, mailets);
+        Duration slowPacedPollInterval = Duration.FIVE_HUNDRED_MILLISECONDS;
+        calmlyAwait = Awaitility.with().pollInterval(slowPacedPollInterval).and().with().pollDelay(slowPacedPollInterval).await();
+
         DataProbeImpl probe = jamesServer.getProbe(DataProbeImpl.class);
         probe.addDomain(JAMES_ORG);
         probe.addUser(SENDER, PASSWORD);
         probe.addUser(TO, PASSWORD);
-        probe.addUser(TO2, PASSWORD);
-        probe.addUser(CC, PASSWORD);
-        probe.addUser(CC2, PASSWORD);
-        probe.addUser(BCC, PASSWORD);
-        probe.addUser(BCC2, PASSWORD);
     }
 
     @After
@@ -133,35 +127,89 @@ public class ContactExtractorTest {
     }
 
     @Test
-    public void recipientsShouldBePublishedToAmqpWhenSendingEmail() throws Exception {
+    public void spamAssassinShouldAppendNewHeaderOnMessage() throws Exception {
+        MimeMessage message = MimeMessageBuilder.mimeMessageBuilder()
+            .setSender(SENDER)
+            .addToRecipient(TO)
+            .setSubject("This is the subject")
+            .setText("This is -SPAM- my email")
+            .build();
+        FakeMail mail = FakeMail.builder()
+            .mimeMessage(message)
+            .sender(new MailAddress(SENDER))
+            .recipients(new MailAddress(TO))
+            .build();
+
+        try (SMTPMessageSender messageSender = SMTPMessageSender.noAuthentication(LOCALHOST_IP, SMTP_PORT, JAMES_ORG);
+             IMAPMessageReader imapMessageReader = new IMAPMessageReader(LOCALHOST_IP, IMAP_PORT)) {
+
+            messageSender.sendMessage(mail);
+
+            calmlyAwait.atMost(Duration.ONE_MINUTE).until(messageSender::messageHasBeenSent);
+            calmlyAwait.atMost(Duration.ONE_MINUTE).until(() -> imapMessageReader.userReceivedMessage(TO, PASSWORD));
+
+            String receivedHeaders = imapMessageReader.readFirstMessageHeadersInInbox(TO, PASSWORD);
+
+            assertThat(receivedHeaders).contains(SpamAssassinInvoker.FLAG_MAIL_ATTRIBUTE_NAME, SpamAssassinInvoker.STATUS_MAIL_ATTRIBUTE_NAME);
+        }
+    }
+
+    @Test
+    public void spamAssassinShouldAppendNewHeaderWhichDetectIsSpamWhenSpamMessage() throws Exception {
+        String spamContent = "XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X";
         MimeMessage message = MimeMessageBuilder.mimeMessageBuilder()
             .setSender(SENDER)
-            .addToRecipient(TO, "John To2 <" + TO2 + ">")
-            .addCcRecipient(CC, "John Cc2 <" + CC2 + ">")
-            .addBccRecipient(BCC, "John Bcc2 <" + BCC2 + ">")
-            .setSubject("Contact collection Rocks")
-            .setText("This is my email")
+            .addToRecipient(TO)
+            .setSubject("This is the subject")
+            .setText(spamContent)
             .build();
         FakeMail mail = FakeMail.builder()
             .mimeMessage(message)
             .sender(new MailAddress(SENDER))
-            .recipients(new MailAddress(TO), new MailAddress(TO2), new MailAddress(CC), new MailAddress(CC2), new MailAddress(BCC), new MailAddress(BCC2))
+            .recipients(new MailAddress(TO))
             .build();
-        try (SMTPMessageSender messageSender = SMTPMessageSender.authentication("localhost", 1025, JAMES_ORG, SENDER, PASSWORD);
-                IMAPMessageReader imap = new IMAPMessageReader("localhost", 1143)) {
+
+        try (SMTPMessageSender messageSender = SMTPMessageSender.noAuthentication(LOCALHOST_IP, SMTP_PORT, JAMES_ORG);
+             IMAPMessageReader imapMessageReader = new IMAPMessageReader(LOCALHOST_IP, IMAP_PORT)) {
 
             messageSender.sendMessage(mail);
-            Awaitility.await().pollDelay(Duration.FIVE_HUNDRED_MILLISECONDS)
-                .atMost(Duration.ONE_MINUTE)
-                .until(() -> imap.userReceivedMessage(TO, PASSWORD));
-
-            Optional<String> actual = amqpRule.readContent();
-            assertThat(actual).isNotEmpty();
-            assertThatJson(actual.get()).isEqualTo("{"
-                    + "\"userEmail\" : \"sender@james.org\", "
-                    + "\"emails\" : [ \"to@james.org\", \"John To2 <to...@james.org>\", \"cc@james.org\", \"John Cc2 <cc...@james.org>\", \"bcc@james.org\", \"John Bcc2 <bc...@james.org>\" ]"
-                    + "}");
+
+            calmlyAwait.atMost(Duration.ONE_MINUTE).until(messageSender::messageHasBeenSent);
+            calmlyAwait.atMost(Duration.ONE_MINUTE).until(() -> imapMessageReader.userReceivedMessage(TO, PASSWORD));
+
+            String receivedHeaders = imapMessageReader.readFirstMessageInInbox(TO, PASSWORD);
+
+            assertThat(receivedHeaders).contains(SpamAssassinInvoker.FLAG_MAIL_ATTRIBUTE_NAME + ": YES");
+            assertThat(receivedHeaders).contains(SpamAssassinInvoker.STATUS_MAIL_ATTRIBUTE_NAME + ": Yes");
         }
     }
 
+    @Test
+    public void spamAssassinShouldAppendNewHeaderWhichNoWhenNonSpamMessage() throws Exception {
+        MimeMessage message = MimeMessageBuilder.mimeMessageBuilder()
+            .setSender(SENDER)
+            .addToRecipient(TO)
+            .setSubject("This is the subject")
+            .setText("This is the content")
+            .build();
+        FakeMail mail = FakeMail.builder()
+            .mimeMessage(message)
+            .sender(new MailAddress(SENDER))
+            .recipients(new MailAddress(TO))
+            .build();
+
+        try (SMTPMessageSender messageSender = SMTPMessageSender.noAuthentication(LOCALHOST_IP, SMTP_PORT, JAMES_ORG);
+             IMAPMessageReader imapMessageReader = new IMAPMessageReader(LOCALHOST_IP, IMAP_PORT)) {
+
+            messageSender.sendMessage(mail);
+
+            calmlyAwait.atMost(Duration.ONE_MINUTE).until(messageSender::messageHasBeenSent);
+            calmlyAwait.atMost(Duration.ONE_MINUTE).until(() -> imapMessageReader.userReceivedMessage(TO, PASSWORD));
+
+            String receivedHeaders = imapMessageReader.readFirstMessageInInbox(TO, PASSWORD);
+
+            assertThat(receivedHeaders).contains(SpamAssassinInvoker.FLAG_MAIL_ATTRIBUTE_NAME + ": NO");
+            assertThat(receivedHeaders).contains(SpamAssassinInvoker.STATUS_MAIL_ATTRIBUTE_NAME + ": No");
+        }
+    }
 }


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


[12/13] james-project git commit: JAMES-2268 Functionnal style and tests for PostmasterAlias

Posted by bt...@apache.org.
JAMES-2268 Functionnal style and tests for PostmasterAlias

PostmasterAlias was altering directly mail recipients and thus triggered an error while modifying Immutable collection


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

Branch: refs/heads/master
Commit: dfd3f420bfe4cb6ad38150034380221d793aa6a8
Parents: 02f9631
Author: benwa <bt...@linagora.com>
Authored: Thu Dec 21 14:00:29 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Mon Dec 25 11:25:18 2017 +0700

----------------------------------------------------------------------
 .../transport/mailets/PostmasterAlias.java      |  48 ++++---
 .../transport/mailets/PostmasterAliasTest.java  | 125 +++++++++++++++++++
 2 files changed, 147 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/dfd3f420/mailet/standard/src/main/java/org/apache/james/transport/mailets/PostmasterAlias.java
----------------------------------------------------------------------
diff --git a/mailet/standard/src/main/java/org/apache/james/transport/mailets/PostmasterAlias.java b/mailet/standard/src/main/java/org/apache/james/transport/mailets/PostmasterAlias.java
index 04c8c72..3366c86 100644
--- a/mailet/standard/src/main/java/org/apache/james/transport/mailets/PostmasterAlias.java
+++ b/mailet/standard/src/main/java/org/apache/james/transport/mailets/PostmasterAlias.java
@@ -17,26 +17,24 @@
  * under the License.                                           *
  ****************************************************************/
 
-
-
 package org.apache.james.transport.mailets;
 
 import java.util.Collection;
-import java.util.Vector;
+import java.util.stream.Stream;
 
 import javax.mail.MessagingException;
 
-import org.apache.mailet.Mail;
 import org.apache.james.core.MailAddress;
-import org.apache.mailet.MailetContext;
+import org.apache.mailet.Mail;
 import org.apache.mailet.base.GenericMailet;
 
+import com.github.steveash.guavate.Guavate;
+
 /**
  * Rewrites recipient addresses to make sure email for the postmaster is
  * always handled.  This mailet is silently inserted at the top of the root
  * spool processor.  All recipients mapped to postmaster@<servernames> are
  * changed to the postmaster account as specified in the server conf.
- *
  */
 public class PostmasterAlias extends GenericMailet {
 
@@ -49,30 +47,28 @@ public class PostmasterAlias extends GenericMailet {
      * @throws MessagingException if an error is encountered while modifying the message
      */
     public void service(Mail mail) throws MessagingException {
-        Collection<MailAddress> recipients = mail.getRecipients();
-        Collection<MailAddress> recipientsToRemove = null;
-        MailetContext mailetContext = getMailetContext();
-        boolean postmasterAddressed = false;
+        Collection<MailAddress> postmasterAliases = mail.getRecipients()
+            .stream()
+            .filter(this::isPostmasterAlias)
+            .collect(Guavate.toImmutableList());
 
-        for (MailAddress addr : recipients) {
-            if (addr.getLocalPart().equalsIgnoreCase("postmaster") &&
-                    mailetContext.isLocalServer(addr.getDomain()) && !mailetContext.isLocalEmail(addr)) {
-                //Should remove this address... we want to replace it with
-                //  the server's postmaster address
-                if (recipientsToRemove == null) {
-                    recipientsToRemove = new Vector<>();
-                }
-                recipientsToRemove.add(addr);
-                //Flag this as having found the postmaster
-                postmasterAddressed = true;
-            }
-        }
-        if (postmasterAddressed) {
-            recipients.removeAll(recipientsToRemove);
-            recipients.add(getMailetContext().getPostmaster());
+        if (!postmasterAliases.isEmpty()) {
+            mail.setRecipients(
+                Stream.concat(
+                    mail.getRecipients()
+                        .stream()
+                        .filter(address -> !postmasterAliases.contains(address)),
+                    Stream.of(getMailetContext().getPostmaster()))
+                .collect(Guavate.toImmutableSet()));
         }
     }
 
+    private boolean isPostmasterAlias(MailAddress addr) {
+        return addr.getLocalPart().equalsIgnoreCase("postmaster")
+            && getMailetContext().isLocalServer(addr.getDomain())
+            && !getMailetContext().isLocalEmail(addr);
+    }
+
     /**
      * Return a string describing this mailet.
      *

http://git-wip-us.apache.org/repos/asf/james-project/blob/dfd3f420/mailet/standard/src/test/java/org/apache/james/transport/mailets/PostmasterAliasTest.java
----------------------------------------------------------------------
diff --git a/mailet/standard/src/test/java/org/apache/james/transport/mailets/PostmasterAliasTest.java b/mailet/standard/src/test/java/org/apache/james/transport/mailets/PostmasterAliasTest.java
new file mode 100644
index 0000000..f485158
--- /dev/null
+++ b/mailet/standard/src/test/java/org/apache/james/transport/mailets/PostmasterAliasTest.java
@@ -0,0 +1,125 @@
+/****************************************************************
+ * 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.transport.mailets;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.apache.james.core.MailAddress;
+import org.apache.mailet.Mail;
+import org.apache.mailet.base.MailAddressFixture;
+import org.apache.mailet.base.test.FakeMail;
+import org.apache.mailet.base.test.FakeMailContext;
+import org.apache.mailet.base.test.FakeMailetConfig;
+import org.junit.Before;
+import org.junit.Test;
+
+public class PostmasterAliasTest {
+    private PostmasterAlias testee;
+    private MailAddress postmaster;
+    private MailAddress postmasterAlias;
+
+    @Before
+    public void setUp() throws Exception {
+        postmaster = new MailAddress("admin@localhost");
+        postmasterAlias = new MailAddress("postmaster@localhost");
+        testee = new PostmasterAlias();
+        testee.init(FakeMailetConfig.builder()
+            .mailetContext(FakeMailContext.builder()
+                .postmaster(postmaster))
+            .build());
+    }
+
+    @Test
+    public void serviceShouldAcceptMailsWithNoRecipients() throws Exception {
+        Mail mail = FakeMail.builder().build();
+
+        testee.service(mail);
+
+        assertThat(mail.getRecipients()).isEmpty();
+    }
+
+    @Test
+    public void serviceShouldNotAlterMailsForPostmaster() throws Exception {
+        Mail mail = FakeMail.builder()
+            .recipient(postmaster)
+            .build();
+
+        testee.service(mail);
+
+        assertThat(mail.getRecipients()).containsOnly(postmaster);
+    }
+
+    @Test
+    public void serviceShouldNotAlterMailForOtherUsers() throws Exception {
+        Mail mail = FakeMail.builder()
+            .recipient(MailAddressFixture.ANY_AT_JAMES)
+            .build();
+
+        testee.service(mail);
+
+        assertThat(mail.getRecipients()).containsOnly(MailAddressFixture.ANY_AT_JAMES);
+    }
+
+    @Test
+    public void serviceShouldNotAlterPostmasterAliasWhenForOtherDomains() throws Exception {
+        MailAddress otherDomainPostmaster = new MailAddress("postmaster@otherDomain");
+        Mail mail = FakeMail.builder()
+            .recipient(otherDomainPostmaster)
+            .build();
+
+        testee.service(mail);
+
+        assertThat(mail.getRecipients()).containsOnly(otherDomainPostmaster);
+    }
+
+    @Test
+    public void serviceShouldRewritePostmasterAlias() throws Exception {
+        Mail mail = FakeMail.builder()
+            .recipient(postmasterAlias)
+            .build();
+
+        testee.service(mail);
+
+        assertThat(mail.getRecipients()).containsOnly(postmaster);
+    }
+
+    @Test
+    public void serviceShouldNotAlterOtherRecipientsWhenRewritingPostmaster() throws Exception {
+        Mail mail = FakeMail.builder()
+            .recipients(postmasterAlias, MailAddressFixture.ANY_AT_JAMES)
+            .build();
+
+        testee.service(mail);
+
+        assertThat(mail.getRecipients()).containsOnly(postmaster, MailAddressFixture.ANY_AT_JAMES);
+    }
+
+    @Test
+    public void serviceShouldNotDuplicatePostmaster() throws Exception {
+        Mail mail = FakeMail.builder()
+            .recipients(postmasterAlias, postmaster)
+            .build();
+
+        testee.service(mail);
+
+        assertThat(mail.getRecipients()).containsOnly(postmaster);
+    }
+
+}
\ No newline at end of file


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


[06/13] james-project git commit: JAMES-2262 SpamAssassin is no more experimental

Posted by bt...@apache.org.
JAMES-2262 SpamAssassin is no more experimental


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

Branch: refs/heads/master
Commit: 4a0c630c6fe89b4df4ba858b41c81cb77381e731
Parents: 27b8908
Author: benwa <bt...@linagora.com>
Authored: Mon Dec 18 17:10:42 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Mon Dec 25 11:24:56 2017 +0700

----------------------------------------------------------------------
 .../main/java/org/apache/james/transport/mailets/SpamAssassin.java | 2 --
 1 file changed, 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/4a0c630c/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
index 5d01cd5..e1ec544 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
@@ -27,7 +27,6 @@ import javax.mail.internet.MimeMessage;
 import org.apache.james.transport.mailets.managesieve.ManageSieveMailet;
 import org.apache.james.util.Port;
 import org.apache.james.util.scanner.SpamAssassinInvoker;
-import org.apache.mailet.Experimental;
 import org.apache.mailet.Mail;
 import org.apache.mailet.base.GenericMailet;
 import org.apache.mailet.base.MailetUtil;
@@ -61,7 +60,6 @@ import com.google.common.base.Strings;
  * &lt;spamdPort&gt;783&lt;/spamdPort&gt;
  * </pre>
  */
-@Experimental
 public class SpamAssassin extends GenericMailet {
     private static final Logger LOGGER = LoggerFactory.getLogger(ManageSieveMailet.class);
     public static final String SPAMD_HOST = "spamdHost";


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


[07/13] james-project git commit: JAMES-2262 Improve docker helpers naming

Posted by bt...@apache.org.
JAMES-2262 Improve docker helpers naming


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

Branch: refs/heads/master
Commit: 9c239771a997982e5c80fa9a392c71e54f66ad3b
Parents: 4a0c630
Author: benwa <bt...@linagora.com>
Authored: Fri Dec 22 09:37:00 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Mon Dec 25 11:24:56 2017 +0700

----------------------------------------------------------------------
 .../es/ClientProviderImplConnectionTest.java    |   2 +-
 .../james/mailbox/tika/TikaContainer.java       |   6 +-
 .../apache/james/mpt/smtp/ForwardSmtpTest.java  |   6 +-
 .../apache/james/DockerElasticSearchRule.java   |   6 +-
 .../apache/james/metric/es/ESReporterTest.java  |   6 +-
 .../org/apache/james/util/docker/Images.java    |  29 ++++
 .../util/docker/SwarmGenericContainer.java      | 158 ++++++++++++++++++
 .../james/util/streams/ContainerNames.java      |  29 ----
 .../util/streams/SwarmGenericContainer.java     | 159 -------------------
 .../james/user/ldap/LdapGenericContainer.java   |   2 +-
 .../GatewayRemoteDeliveryIntegrationTest.java   |   6 +-
 .../james/smtp/SmtpAuthorizedAddressesTest.java |   2 +-
 .../mailets/AmqpForwardAttachmentTest.java      |   6 +-
 .../transport/mailets/ContactExtractorTest.java |   6 +-
 .../transport/mailets/GroupMappingTest.java     |   6 +-
 .../mailets/ICSAttachmentWorkflowTest.java      |   6 +-
 .../transport/mailets/SpamAssassinTest.java     |   7 +-
 .../james/transport/mailets/amqp/AmqpRule.java  |   2 +-
 .../org/apache/james/jmap/ContainerTest.java    |   6 +-
 .../jmap/VacationRelayIntegrationTest.java      |   6 +-
 20 files changed, 227 insertions(+), 229 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/9c239771/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/ClientProviderImplConnectionTest.java
----------------------------------------------------------------------
diff --git a/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/ClientProviderImplConnectionTest.java b/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/ClientProviderImplConnectionTest.java
index 5b64dd4..4fbe271 100644
--- a/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/ClientProviderImplConnectionTest.java
+++ b/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/ClientProviderImplConnectionTest.java
@@ -21,7 +21,7 @@ package org.apache.james.backends.es;
 
 import java.util.concurrent.TimeUnit;
 
-import org.apache.james.util.streams.SwarmGenericContainer;
+import org.apache.james.util.docker.SwarmGenericContainer;
 import org.elasticsearch.client.Client;
 import org.elasticsearch.index.query.QueryBuilders;
 import org.junit.Ignore;

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c239771/mailbox/tika/src/test/java/org/apache/james/mailbox/tika/TikaContainer.java
----------------------------------------------------------------------
diff --git a/mailbox/tika/src/test/java/org/apache/james/mailbox/tika/TikaContainer.java b/mailbox/tika/src/test/java/org/apache/james/mailbox/tika/TikaContainer.java
index adb451b..8bb7733 100644
--- a/mailbox/tika/src/test/java/org/apache/james/mailbox/tika/TikaContainer.java
+++ b/mailbox/tika/src/test/java/org/apache/james/mailbox/tika/TikaContainer.java
@@ -21,8 +21,8 @@ package org.apache.james.mailbox.tika;
 import java.time.Duration;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.james.util.streams.ContainerNames;
-import org.apache.james.util.streams.SwarmGenericContainer;
+import org.apache.james.util.docker.Images;
+import org.apache.james.util.docker.SwarmGenericContainer;
 import org.junit.rules.ExternalResource;
 import org.testcontainers.containers.wait.Wait;
 
@@ -36,7 +36,7 @@ public class TikaContainer extends ExternalResource {
     private final SwarmGenericContainer tika;
 
     public TikaContainer() {
-        tika = new SwarmGenericContainer(ContainerNames.TIKA)
+        tika = new SwarmGenericContainer(Images.TIKA)
                 .withExposedPorts(DEFAULT_TIKA_PORT)
                 .waitingFor(Wait.forHttp("/tika"))
                 .withStartupTimeout(Duration.ofSeconds(30));

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c239771/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java
----------------------------------------------------------------------
diff --git a/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java b/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java
index 954ebd2..41f2ddf 100644
--- a/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java
+++ b/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java
@@ -27,8 +27,8 @@ import java.net.InetAddress;
 import java.util.Locale;
 
 import org.apache.james.mpt.script.SimpleScriptedTestProtocol;
-import org.apache.james.util.streams.ContainerNames;
-import org.apache.james.util.streams.SwarmGenericContainer;
+import org.apache.james.util.docker.Images;
+import org.apache.james.util.docker.SwarmGenericContainer;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -52,7 +52,7 @@ public abstract class ForwardSmtpTest {
     public static final String PASSWORD = "secret";
 
     private final TemporaryFolder folder = new TemporaryFolder();
-    private final SwarmGenericContainer fakeSmtp = new SwarmGenericContainer(ContainerNames.FAKE_SMTP)
+    private final SwarmGenericContainer fakeSmtp = new SwarmGenericContainer(Images.FAKE_SMTP)
             .withExposedPorts(25)
             .withAffinityToContainer()
             .waitingFor(new HostPortWaitStrategy());

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c239771/server/container/guice/cassandra-guice/src/test/java/org/apache/james/DockerElasticSearchRule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/DockerElasticSearchRule.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/DockerElasticSearchRule.java
index 06b5d44..c6c0679 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/DockerElasticSearchRule.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/DockerElasticSearchRule.java
@@ -22,8 +22,8 @@ package org.apache.james;
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.PropertiesConfiguration;
 import org.apache.james.modules.mailbox.ElasticSearchConfiguration;
-import org.apache.james.util.streams.ContainerNames;
-import org.apache.james.util.streams.SwarmGenericContainer;
+import org.apache.james.util.docker.Images;
+import org.apache.james.util.docker.SwarmGenericContainer;
 import org.junit.runner.Description;
 import org.junit.runners.model.Statement;
 
@@ -60,7 +60,7 @@ public class DockerElasticSearchRule implements GuiceModuleTestRule {
         }
     }
 
-    private SwarmGenericContainer elasticSearchContainer = new SwarmGenericContainer(ContainerNames.ELASTICSEARCH)
+    private SwarmGenericContainer elasticSearchContainer = new SwarmGenericContainer(Images.ELASTICSEARCH)
         .withExposedPorts(ELASTIC_SEARCH_HTTP_PORT, ELASTIC_SEARCH_PORT);
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c239771/server/container/metrics/metrics-es-reporter/src/test/java/org/apache/james/metric/es/ESReporterTest.java
----------------------------------------------------------------------
diff --git a/server/container/metrics/metrics-es-reporter/src/test/java/org/apache/james/metric/es/ESReporterTest.java b/server/container/metrics/metrics-es-reporter/src/test/java/org/apache/james/metric/es/ESReporterTest.java
index 3cd77bd..14edded 100644
--- a/server/container/metrics/metrics-es-reporter/src/test/java/org/apache/james/metric/es/ESReporterTest.java
+++ b/server/container/metrics/metrics-es-reporter/src/test/java/org/apache/james/metric/es/ESReporterTest.java
@@ -31,8 +31,8 @@ import org.apache.james.metrics.api.TimeMetric;
 import org.apache.james.metrics.dropwizard.DropWizardMetricFactory;
 import org.apache.james.metrics.es.ESMetricReporter;
 import org.apache.james.metrics.es.ESReporterConfiguration;
-import org.apache.james.util.streams.ContainerNames;
-import org.apache.james.util.streams.SwarmGenericContainer;
+import org.apache.james.util.docker.Images;
+import org.apache.james.util.docker.SwarmGenericContainer;
 import org.elasticsearch.client.Client;
 import org.elasticsearch.index.query.QueryBuilders;
 import org.junit.After;
@@ -53,7 +53,7 @@ public class ESReporterTest {
     public static final int ES_HTTP_PORT = 9200;
 
     @Rule
-    public SwarmGenericContainer esContainer = new SwarmGenericContainer(ContainerNames.ELASTICSEARCH)
+    public SwarmGenericContainer esContainer = new SwarmGenericContainer(Images.ELASTICSEARCH)
         .withAffinityToContainer()
         .withExposedPorts(ES_HTTP_PORT, ES_APPLICATIVE_PORT);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c239771/server/container/util-java8/src/test/java/org/apache/james/util/docker/Images.java
----------------------------------------------------------------------
diff --git a/server/container/util-java8/src/test/java/org/apache/james/util/docker/Images.java b/server/container/util-java8/src/test/java/org/apache/james/util/docker/Images.java
new file mode 100644
index 0000000..7b75b45
--- /dev/null
+++ b/server/container/util-java8/src/test/java/org/apache/james/util/docker/Images.java
@@ -0,0 +1,29 @@
+/****************************************************************
+ * 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.util.docker;
+
+public interface Images {
+    String FAKE_SMTP = "weave/rest-smtp-sink:latest";
+    String RABBITMQ = "rabbitmq:3";
+    String ELASTICSEARCH = "elasticsearch:2.2.2";
+    String NGINX = "nginx:1.7.1";
+    String TIKA = "logicalspark/docker-tikaserver:1.15rc2";
+    String SPAMASSASSIN = "dinkel/spamassassin:3.4.0";
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c239771/server/container/util-java8/src/test/java/org/apache/james/util/docker/SwarmGenericContainer.java
----------------------------------------------------------------------
diff --git a/server/container/util-java8/src/test/java/org/apache/james/util/docker/SwarmGenericContainer.java b/server/container/util-java8/src/test/java/org/apache/james/util/docker/SwarmGenericContainer.java
new file mode 100644
index 0000000..0114a4e
--- /dev/null
+++ b/server/container/util-java8/src/test/java/org/apache/james/util/docker/SwarmGenericContainer.java
@@ -0,0 +1,158 @@
+/****************************************************************
+ * 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.util.docker;
+
+import java.net.Socket;
+import java.time.Duration;
+import java.util.List;
+
+import javax.net.SocketFactory;
+
+import org.junit.Assume;
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testcontainers.DockerClientFactory;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.containers.wait.WaitStrategy;
+import org.testcontainers.images.builder.ImageFromDockerfile;
+import org.testcontainers.shaded.com.google.common.collect.ImmutableList;
+
+import com.github.dockerjava.api.command.InspectContainerResponse;
+import com.google.common.base.Strings;
+
+public class SwarmGenericContainer implements TestRule {
+    private static final Logger LOGGER = LoggerFactory.getLogger(SwarmGenericContainer.class);
+    private static final String DOCKER_CONTAINER = "DOCKER_CONTAINER";
+    private static final String NO_DOCKER_ENVIRONMENT = "Could not find a valid Docker environment.";
+    private static final String SKIPPING_TEST_CAUTION = "Skipping all docker tests as no Docker environment was found";
+
+    private GenericContainer<?> container;
+
+    public SwarmGenericContainer(String dockerImageName) {
+        try {
+            this.container = new GenericContainer<>(dockerImageName);
+        } catch (IllegalStateException e) {
+            logAndCheckSkipTest(e);
+        }
+    }
+
+    public SwarmGenericContainer(ImageFromDockerfile imageFromDockerfile) {
+        try {
+            this.container = new GenericContainer<>(imageFromDockerfile);
+        } catch (IllegalStateException e) {
+            logAndCheckSkipTest(e);
+        }
+    }
+    private void logAndCheckSkipTest(IllegalStateException e) {
+        LOGGER.error("Cannot initial a docker container", e);
+        if (e.getMessage().startsWith(NO_DOCKER_ENVIRONMENT)) {
+            Assume.assumeTrue(SKIPPING_TEST_CAUTION, false);
+        }
+    }
+
+    public SwarmGenericContainer withAffinityToContainer() {
+        String containerEnv = System.getenv(DOCKER_CONTAINER);
+        if (Strings.isNullOrEmpty(containerEnv)) {
+            LOGGER.warn("'DOCKER_CONTAINER' environment variable not found, dockering without affinity");
+            return this;
+        }
+        List<String> envVariables = container.getEnv();
+        envVariables.add("affinity:container==" + container);
+        container.setEnv(envVariables);
+        return this;
+    }
+
+    public SwarmGenericContainer withEnv(String key, String value) {
+        container.addEnv(key, value);
+        return this;
+    }
+
+    public SwarmGenericContainer withExposedPorts(Integer... ports) {
+        container.withExposedPorts(ports);
+        return this;
+    }
+
+    public SwarmGenericContainer portBinding(int hostPort, int dockerPort) {
+        container.setPortBindings(ImmutableList.of("0.0.0.0:" + hostPort + ":" + dockerPort));
+        return this;
+    }
+
+    public SwarmGenericContainer waitingFor(WaitStrategy waitStrategy) {
+        container.waitingFor(waitStrategy);
+        return this;
+    }
+
+    public SwarmGenericContainer withStartupTimeout(Duration startupTimeout) {
+        container.withStartupTimeout(startupTimeout);
+        return this;
+    }
+
+    public void start() {
+        container.start();
+    }
+
+    public void stop() {
+        container.stop();
+    }
+
+    public void pause() {
+        DockerClientFactory.instance().client().pauseContainerCmd(container.getContainerInfo().getId());
+    }
+
+    public void unpause() {
+        DockerClientFactory.instance().client().unpauseContainerCmd(container.getContainerInfo().getId());
+    }
+
+    public Integer getMappedPort(int originalPort) {
+        return container.getMappedPort(originalPort);
+    }
+
+    @SuppressWarnings("deprecation")
+    public String getContainerIp() {
+        return container.getContainerInfo().getNetworkSettings().getIpAddress();
+    }
+    
+    public String getHostIp() {
+        return container.getContainerIpAddress();
+    }
+
+    public InspectContainerResponse getContainerInfo() {
+        return container.getContainerInfo();
+    }
+
+    public boolean tryConnect(int port) {
+        try {
+            Socket socket = SocketFactory.getDefault().createSocket(getContainerIp(), port);
+            socket.close();
+            return true;
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    @Override
+    public Statement apply(Statement statement, Description description) {
+        return container.apply(statement, description);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c239771/server/container/util-java8/src/test/java/org/apache/james/util/streams/ContainerNames.java
----------------------------------------------------------------------
diff --git a/server/container/util-java8/src/test/java/org/apache/james/util/streams/ContainerNames.java b/server/container/util-java8/src/test/java/org/apache/james/util/streams/ContainerNames.java
deleted file mode 100644
index 2328431..0000000
--- a/server/container/util-java8/src/test/java/org/apache/james/util/streams/ContainerNames.java
+++ /dev/null
@@ -1,29 +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.util.streams;
-
-public interface ContainerNames {
-    String FAKE_SMTP = "weave/rest-smtp-sink:latest";
-    String RABBITMQ = "rabbitmq:3";
-    String ELASTICSEARCH = "elasticsearch:2.2.2";
-    String NGINX = "nginx:1.7.1";
-    String TIKA = "logicalspark/docker-tikaserver:1.15rc2";
-    String SPAMASSASSIN = "dinkel/spamassassin:3.4.0";
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c239771/server/container/util-java8/src/test/java/org/apache/james/util/streams/SwarmGenericContainer.java
----------------------------------------------------------------------
diff --git a/server/container/util-java8/src/test/java/org/apache/james/util/streams/SwarmGenericContainer.java b/server/container/util-java8/src/test/java/org/apache/james/util/streams/SwarmGenericContainer.java
deleted file mode 100644
index d0d0906..0000000
--- a/server/container/util-java8/src/test/java/org/apache/james/util/streams/SwarmGenericContainer.java
+++ /dev/null
@@ -1,159 +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.util.streams;
-
-import java.net.Socket;
-import java.time.Duration;
-import java.util.List;
-
-import javax.net.SocketFactory;
-
-import com.github.dockerjava.api.model.Bind;
-import org.junit.Assume;
-import org.junit.rules.TestRule;
-import org.junit.runner.Description;
-import org.junit.runners.model.Statement;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testcontainers.DockerClientFactory;
-import org.testcontainers.containers.GenericContainer;
-import org.testcontainers.containers.wait.WaitStrategy;
-import org.testcontainers.images.builder.ImageFromDockerfile;
-
-import com.github.dockerjava.api.command.InspectContainerResponse;
-import com.google.common.base.Strings;
-import org.testcontainers.shaded.com.google.common.collect.ImmutableList;
-
-public class SwarmGenericContainer implements TestRule {
-    private static final Logger LOGGER = LoggerFactory.getLogger(SwarmGenericContainer.class);
-    private static final String DOCKER_CONTAINER = "DOCKER_CONTAINER";
-    private static final String NO_DOCKER_ENVIRONMENT = "Could not find a valid Docker environment.";
-    private static final String SKIPPING_TEST_CAUTION = "Skipping all docker tests as no Docker environment was found";
-
-    private GenericContainer<?> container;
-
-    public SwarmGenericContainer(String dockerImageName) {
-        try {
-            this.container = new GenericContainer<>(dockerImageName);
-        } catch (IllegalStateException e) {
-            logAndCheckSkipTest(e);
-        }
-    }
-
-    public SwarmGenericContainer(ImageFromDockerfile imageFromDockerfile) {
-        try {
-            this.container = new GenericContainer<>(imageFromDockerfile);
-        } catch (IllegalStateException e) {
-            logAndCheckSkipTest(e);
-        }
-    }
-    private void logAndCheckSkipTest(IllegalStateException e) {
-        LOGGER.error("Cannot initial a docker container", e);
-        if (e.getMessage().startsWith(NO_DOCKER_ENVIRONMENT)) {
-            Assume.assumeTrue(SKIPPING_TEST_CAUTION, false);
-        }
-    }
-
-    public SwarmGenericContainer withAffinityToContainer() {
-        String containerEnv = System.getenv(DOCKER_CONTAINER);
-        if (Strings.isNullOrEmpty(containerEnv)) {
-            LOGGER.warn("'DOCKER_CONTAINER' environment variable not found, dockering without affinity");
-            return this;
-        }
-        List<String> envVariables = container.getEnv();
-        envVariables.add("affinity:container==" + container);
-        container.setEnv(envVariables);
-        return this;
-    }
-
-    public SwarmGenericContainer withEnv(String key, String value) {
-        container.addEnv(key, value);
-        return this;
-    }
-
-    public SwarmGenericContainer withExposedPorts(Integer... ports) {
-        container.withExposedPorts(ports);
-        return this;
-    }
-
-    public SwarmGenericContainer portBinding(int hostPort, int dockerPort) {
-        container.setPortBindings(ImmutableList.of("0.0.0.0:" + hostPort + ":" + dockerPort));
-        return this;
-    }
-
-    public SwarmGenericContainer waitingFor(WaitStrategy waitStrategy) {
-        container.waitingFor(waitStrategy);
-        return this;
-    }
-
-    public SwarmGenericContainer withStartupTimeout(Duration startupTimeout) {
-        container.withStartupTimeout(startupTimeout);
-        return this;
-    }
-
-    public void start() {
-        container.start();
-    }
-
-    public void stop() {
-        container.stop();
-    }
-
-    public void pause() {
-        DockerClientFactory.instance().client().pauseContainerCmd(container.getContainerInfo().getId());
-    }
-
-    public void unpause() {
-        DockerClientFactory.instance().client().unpauseContainerCmd(container.getContainerInfo().getId());
-    }
-
-    public Integer getMappedPort(int originalPort) {
-        return container.getMappedPort(originalPort);
-    }
-
-    @SuppressWarnings("deprecation")
-    public String getContainerIp() {
-        return container.getContainerInfo().getNetworkSettings().getIpAddress();
-    }
-    
-    public String getHostIp() {
-        return container.getContainerIpAddress();
-    }
-
-    public InspectContainerResponse getContainerInfo() {
-        return container.getContainerInfo();
-    }
-
-    public boolean tryConnect(int port) {
-        try {
-            Socket socket = SocketFactory.getDefault().createSocket(getContainerIp(), port);
-            socket.close();
-            return true;
-        } catch (Exception e) {
-            return false;
-        }
-    }
-
-    @Override
-    public Statement apply(Statement statement, Description description) {
-        return container.apply(statement, description);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c239771/server/data/data-ldap-integration-testing/src/test/java/org/apache/james/user/ldap/LdapGenericContainer.java
----------------------------------------------------------------------
diff --git a/server/data/data-ldap-integration-testing/src/test/java/org/apache/james/user/ldap/LdapGenericContainer.java b/server/data/data-ldap-integration-testing/src/test/java/org/apache/james/user/ldap/LdapGenericContainer.java
index 7be9d6b..4a6fb61 100644
--- a/server/data/data-ldap-integration-testing/src/test/java/org/apache/james/user/ldap/LdapGenericContainer.java
+++ b/server/data/data-ldap-integration-testing/src/test/java/org/apache/james/user/ldap/LdapGenericContainer.java
@@ -18,7 +18,7 @@
  ****************************************************************/
 package org.apache.james.user.ldap;
 
-import org.apache.james.util.streams.SwarmGenericContainer;
+import org.apache.james.util.docker.SwarmGenericContainer;
 import org.junit.rules.ExternalResource;
 import org.testcontainers.containers.wait.HostPortWaitStrategy;
 import org.testcontainers.images.builder.ImageFromDockerfile;

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c239771/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/GatewayRemoteDeliveryIntegrationTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/GatewayRemoteDeliveryIntegrationTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/GatewayRemoteDeliveryIntegrationTest.java
index 5d7d498..4bde906 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/GatewayRemoteDeliveryIntegrationTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/GatewayRemoteDeliveryIntegrationTest.java
@@ -47,8 +47,8 @@ import org.apache.james.transport.mailets.ToProcessor;
 import org.apache.james.transport.matchers.All;
 import org.apache.james.transport.matchers.RecipientIsLocal;
 import org.apache.james.transport.matchers.RelayLimit;
-import org.apache.james.util.streams.ContainerNames;
-import org.apache.james.util.streams.SwarmGenericContainer;
+import org.apache.james.util.docker.Images;
+import org.apache.james.util.docker.SwarmGenericContainer;
 import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.IMAPMessageReader;
 import org.apache.james.utils.SMTPMessageSender;
@@ -84,7 +84,7 @@ public class GatewayRemoteDeliveryIntegrationTest {
     public TemporaryFolder temporaryFolder = new TemporaryFolder();
 
     private final TemporaryFolder smtpFolder = new TemporaryFolder();
-    private final SwarmGenericContainer fakeSmtp = new SwarmGenericContainer(ContainerNames.FAKE_SMTP)
+    private final SwarmGenericContainer fakeSmtp = new SwarmGenericContainer(Images.FAKE_SMTP)
         .withExposedPorts(25)
         .withAffinityToContainer()
         .waitingFor(new HostPortWaitStrategy());

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c239771/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpAuthorizedAddressesTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpAuthorizedAddressesTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpAuthorizedAddressesTest.java
index 3c9ea9f..726c6df 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpAuthorizedAddressesTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpAuthorizedAddressesTest.java
@@ -40,7 +40,7 @@ import org.apache.james.transport.mailets.ToProcessor;
 import org.apache.james.transport.matchers.All;
 import org.apache.james.transport.matchers.RecipientIsLocal;
 import org.apache.james.transport.matchers.SMTPIsAuthNetwork;
-import org.apache.james.util.streams.SwarmGenericContainer;
+import org.apache.james.util.docker.SwarmGenericContainer;
 import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.IMAPMessageReader;
 import org.apache.james.utils.SMTPMessageSender;

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c239771/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/AmqpForwardAttachmentTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/AmqpForwardAttachmentTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/AmqpForwardAttachmentTest.java
index 0b19dd4..493d8f8 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/AmqpForwardAttachmentTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/AmqpForwardAttachmentTest.java
@@ -36,8 +36,8 @@ import org.apache.james.probe.DataProbe;
 import org.apache.james.transport.mailets.amqp.AmqpRule;
 import org.apache.james.transport.matchers.All;
 import org.apache.james.transport.matchers.RecipientIsLocal;
-import org.apache.james.util.streams.ContainerNames;
-import org.apache.james.util.streams.SwarmGenericContainer;
+import org.apache.james.util.docker.Images;
+import org.apache.james.util.docker.SwarmGenericContainer;
 import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.IMAPMessageReader;
 import org.apache.james.utils.SMTPMessageSender;
@@ -74,7 +74,7 @@ public class AmqpForwardAttachmentTest {
     
     private static final byte[] TEST_ATTACHMENT_CONTENT = "Test attachment content".getBytes(Charsets.UTF_8);
 
-    public SwarmGenericContainer rabbitMqContainer = new SwarmGenericContainer(ContainerNames.RABBITMQ)
+    public SwarmGenericContainer rabbitMqContainer = new SwarmGenericContainer(Images.RABBITMQ)
             .withAffinityToContainer();
 
     public TemporaryFolder temporaryFolder = new TemporaryFolder();

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c239771/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ContactExtractorTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ContactExtractorTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ContactExtractorTest.java
index 34c9a36..560d633 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ContactExtractorTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ContactExtractorTest.java
@@ -36,8 +36,8 @@ import org.apache.james.transport.mailets.amqp.AmqpRule;
 import org.apache.james.transport.matchers.All;
 import org.apache.james.transport.matchers.RecipientIsLocal;
 import org.apache.james.transport.matchers.SMTPAuthSuccessful;
-import org.apache.james.util.streams.ContainerNames;
-import org.apache.james.util.streams.SwarmGenericContainer;
+import org.apache.james.util.docker.Images;
+import org.apache.james.util.docker.SwarmGenericContainer;
 import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.IMAPMessageReader;
 import org.apache.james.utils.SMTPMessageSender;
@@ -67,7 +67,7 @@ public class ContactExtractorTest {
     public static final String EXCHANGE = "collector:email";
     public static final String ROUTING_KEY = "";
 
-    public SwarmGenericContainer rabbit = new SwarmGenericContainer(ContainerNames.RABBITMQ);
+    public SwarmGenericContainer rabbit = new SwarmGenericContainer(Images.RABBITMQ);
     public AmqpRule amqpRule = new AmqpRule(rabbit, EXCHANGE, ROUTING_KEY);
     public TemporaryFolder folder = new TemporaryFolder();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c239771/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingTest.java
index 4ec65fb..db5fe68 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingTest.java
@@ -44,8 +44,8 @@ import org.apache.james.transport.matchers.All;
 import org.apache.james.transport.matchers.RecipientIsLocal;
 import org.apache.james.transport.matchers.RelayLimit;
 import org.apache.james.transport.matchers.SMTPAuthSuccessful;
-import org.apache.james.util.streams.ContainerNames;
-import org.apache.james.util.streams.SwarmGenericContainer;
+import org.apache.james.util.docker.Images;
+import org.apache.james.util.docker.SwarmGenericContainer;
 import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.IMAPMessageReader;
 import org.apache.james.utils.SMTPMessageSender;
@@ -91,7 +91,7 @@ public class GroupMappingTest {
     private RequestSpecification restApiRequest;
 
     @Rule
-    public final SwarmGenericContainer fakeSmtp = new SwarmGenericContainer(ContainerNames.FAKE_SMTP)
+    public final SwarmGenericContainer fakeSmtp = new SwarmGenericContainer(Images.FAKE_SMTP)
         .withExposedPorts(25)
         .withAffinityToContainer()
         .waitingFor(new HostPortWaitStrategy());

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c239771/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java
index 56e80f3..b12595d 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java
@@ -39,8 +39,8 @@ import org.apache.james.probe.DataProbe;
 import org.apache.james.transport.mailets.amqp.AmqpRule;
 import org.apache.james.transport.matchers.All;
 import org.apache.james.transport.matchers.RecipientIsLocal;
-import org.apache.james.util.streams.ContainerNames;
-import org.apache.james.util.streams.SwarmGenericContainer;
+import org.apache.james.util.docker.Images;
+import org.apache.james.util.docker.SwarmGenericContainer;
 import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.IMAPMessageReader;
 import org.apache.james.utils.SMTPMessageSender;
@@ -435,7 +435,7 @@ public class ICSAttachmentWorkflowTest {
             "END:VCALENDAR\r\n" +
             "";
 
-    public SwarmGenericContainer rabbitMqContainer = new SwarmGenericContainer(ContainerNames.RABBITMQ)
+    public SwarmGenericContainer rabbitMqContainer = new SwarmGenericContainer(Images.RABBITMQ)
             .withAffinityToContainer();
     public TemporaryFolder temporaryFolder = new TemporaryFolder();
     public AmqpRule amqpRule = new AmqpRule(rabbitMqContainer, EXCHANGE_NAME, ROUTING_KEY);

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c239771/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
index 8eb6fea..bf1541e 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
@@ -19,7 +19,6 @@
 package org.apache.james.transport.mailets;
 
 import static org.apache.james.MemoryJamesServerMain.SMTP_AND_IMAP_MODULE;
-import static org.apache.james.MemoryJamesServerMain.SMTP_ONLY_MODULE;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import javax.mail.internet.MimeMessage;
@@ -32,9 +31,9 @@ import org.apache.james.mailets.configuration.MailetContainer;
 import org.apache.james.mailets.configuration.ProcessorConfiguration;
 import org.apache.james.transport.matchers.All;
 import org.apache.james.transport.matchers.RecipientIsLocal;
+import org.apache.james.util.docker.Images;
+import org.apache.james.util.docker.SwarmGenericContainer;
 import org.apache.james.util.scanner.SpamAssassinInvoker;
-import org.apache.james.util.streams.ContainerNames;
-import org.apache.james.util.streams.SwarmGenericContainer;
 import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.IMAPMessageReader;
 import org.apache.james.utils.SMTPMessageSender;
@@ -62,7 +61,7 @@ public class SpamAssassinTest {
     public static final String TO = "to@" + JAMES_ORG;
     public static final String PASSWORD = "secret";
 
-    public SwarmGenericContainer spamAssassinContainer = new SwarmGenericContainer(ContainerNames.SPAMASSASSIN)
+    public SwarmGenericContainer spamAssassinContainer = new SwarmGenericContainer(Images.SPAMASSASSIN)
         .withExposedPorts(783)
         .withAffinityToContainer()
         .waitingFor(new HostPortWaitStrategy());

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c239771/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/amqp/AmqpRule.java
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/amqp/AmqpRule.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/amqp/AmqpRule.java
index 06341df..3182103 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/amqp/AmqpRule.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/amqp/AmqpRule.java
@@ -24,7 +24,7 @@ import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
-import org.apache.james.util.streams.SwarmGenericContainer;
+import org.apache.james.util.docker.SwarmGenericContainer;
 import org.junit.rules.ExternalResource;
 
 import com.google.common.base.Charsets;

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c239771/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/ContainerTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/ContainerTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/ContainerTest.java
index 2bd0288..bcc8a18 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/ContainerTest.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/ContainerTest.java
@@ -26,8 +26,8 @@ import java.net.URISyntaxException;
 import org.apache.http.client.fluent.Request;
 import org.apache.http.client.fluent.Response;
 import org.apache.http.client.utils.URIBuilder;
-import org.apache.james.util.streams.ContainerNames;
-import org.apache.james.util.streams.SwarmGenericContainer;
+import org.apache.james.util.docker.Images;
+import org.apache.james.util.docker.SwarmGenericContainer;
 import org.junit.Rule;
 import org.junit.Test;
 import org.testcontainers.containers.wait.HttpWaitStrategy;
@@ -35,7 +35,7 @@ import org.testcontainers.containers.wait.HttpWaitStrategy;
 public class ContainerTest {
 
     @Rule
-    public SwarmGenericContainer container = new SwarmGenericContainer(ContainerNames.NGINX)
+    public SwarmGenericContainer container = new SwarmGenericContainer(Images.NGINX)
         .withAffinityToContainer()
         .withExposedPorts(80)
         .waitingFor(new HttpWaitStrategy().forStatusCode(200));

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c239771/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/VacationRelayIntegrationTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/VacationRelayIntegrationTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/VacationRelayIntegrationTest.java
index 1887c45..0291569 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/VacationRelayIntegrationTest.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/VacationRelayIntegrationTest.java
@@ -36,8 +36,8 @@ import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.store.probe.MailboxProbe;
 import org.apache.james.modules.MailboxProbeImpl;
 import org.apache.james.probe.DataProbe;
-import org.apache.james.util.streams.ContainerNames;
-import org.apache.james.util.streams.SwarmGenericContainer;
+import org.apache.james.util.docker.Images;
+import org.apache.james.util.docker.SwarmGenericContainer;
 import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.JmapGuiceProbe;
 import org.junit.After;
@@ -67,7 +67,7 @@ public abstract class VacationRelayIntegrationTest {
     private static final int REST_SMTP_SINK_PORT = 25;
 
     @Rule
-    public final SwarmGenericContainer fakeSmtp = new SwarmGenericContainer(ContainerNames.FAKE_SMTP)
+    public final SwarmGenericContainer fakeSmtp = new SwarmGenericContainer(Images.FAKE_SMTP)
         .withExposedPorts(REST_SMTP_SINK_PORT)
         .waitingFor(new HostPortWaitStrategy());
 


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


[05/13] james-project git commit: JAMES-2262 Finally close MockSpamD resources

Posted by bt...@apache.org.
JAMES-2262 Finally close MockSpamD resources


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

Branch: refs/heads/master
Commit: 03b2633bdfaf62eb6bf2841a8bcb10eb6a753a24
Parents: 0be2343
Author: benwa <bt...@linagora.com>
Authored: Mon Dec 18 08:23:46 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Mon Dec 25 11:24:28 2017 +0700

----------------------------------------------------------------------
 .../james/smtpserver/mock/util/MockSpamd.java   | 30 +++++++++-----------
 1 file changed, 14 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/03b2633b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamd.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamd.java b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamd.java
index 1c0e2a0..a0ff6f9 100644
--- a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamd.java
+++ b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamd.java
@@ -25,6 +25,8 @@ import java.io.OutputStream;
 import java.net.ServerSocket;
 import java.net.Socket;
 
+import org.apache.commons.io.IOUtils;
+
 /**
  * This class can be used to run a mocked SPAMD daemon
  */
@@ -36,30 +38,28 @@ public class MockSpamd implements Runnable {
     public final static String GTUBE = "-SPAM-";
     public final static String NOT_SPAM = "Spam: False ; 3 / 5";
     public final static String SPAM = "Spam: True ; 1000 / 5";
-    BufferedReader in;
-    OutputStream out;
-    Socket spamd;
-    ServerSocket socket;
+    private BufferedReader in;
+    private OutputStream out;
+    private Socket spamd;
+    private ServerSocket socket;
+
 
     /**
      * Init the mocked SPAMD daemon
      *
-     * @param port
-     *            The port on which the mocked SPAMD daemon will be bind
      * @throws IOException
      */
     public MockSpamd(int port) throws IOException {
         socket = new ServerSocket(port);
     }
-
+    
     /**
      * @see java.lang.Runnable#run()
      */
     @Override
     public void run() {
-        boolean spam = false;
-
         try {
+            boolean spam = false;
 
             // Accept connections
             spamd = socket.accept();
@@ -82,16 +82,14 @@ public class MockSpamd implements Runnable {
                 out.write(NOT_SPAM.getBytes());
                 out.flush();
             }
-
-            in.close();
-            out.close();
-            spamd.close();
-            socket.close();
-
         } catch (IOException e) {
             // Should not happen
             e.printStackTrace();
+        } finally {
+            IOUtils.closeQuietly(in);
+            IOUtils.closeQuietly(out);
+            IOUtils.closeQuietly(spamd);
+            IOUtils.closeQuietly(socket);
         }
-
     }
 }


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


[11/13] james-project git commit: JAMES-2262 Correct SpamAssassin logger

Posted by bt...@apache.org.
JAMES-2262 Correct SpamAssassin logger


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

Branch: refs/heads/master
Commit: 2bd85033f0ec45422d72e2bff06b368d5d780da2
Parents: 71f6fe2
Author: benwa <bt...@linagora.com>
Authored: Fri Dec 22 13:56:34 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Mon Dec 25 11:24:56 2017 +0700

----------------------------------------------------------------------
 .../java/org/apache/james/transport/mailets/SpamAssassin.java     | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/2bd85033/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
index e1ec544..c0221fa 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
@@ -24,7 +24,6 @@ import java.util.Optional;
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
-import org.apache.james.transport.mailets.managesieve.ManageSieveMailet;
 import org.apache.james.util.Port;
 import org.apache.james.util.scanner.SpamAssassinInvoker;
 import org.apache.mailet.Mail;
@@ -61,7 +60,7 @@ import com.google.common.base.Strings;
  * </pre>
  */
 public class SpamAssassin extends GenericMailet {
-    private static final Logger LOGGER = LoggerFactory.getLogger(ManageSieveMailet.class);
+    private static final Logger LOGGER = LoggerFactory.getLogger(SpamAssassin.class);
     public static final String SPAMD_HOST = "spamdHost";
     public static final String SPAMD_PORT = "spamdPort";
     public static final String DEFAULT_HOST = "127.0.0.1";


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


[08/13] james-project git commit: JAMES-2262 Factorize port operations

Posted by bt...@apache.org.
JAMES-2262 Factorize port operations

Many classes were doing port validation by themselves. We needed an helper centralizing this concern.

Concerning:
 - ElasticSearch ClientProviderImpl: Port checks are done in the underlying Host class, no need to keep duplicating
 - Webadmin: Previous Port class was more a PortProvider. This avoids a naming conflict.


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

Branch: refs/heads/master
Commit: 27b89085557b672cf82d9db0d042b58323b7ff75
Parents: d11a7e4
Author: benwa <bt...@linagora.com>
Authored: Mon Dec 18 10:06:16 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Mon Dec 25 11:24:56 2017 +0700

----------------------------------------------------------------------
 .../james/backends/es/ClientProviderImpl.java   |  5 --
 .../james/mailbox/tika/TikaConfiguration.java   |  3 +
 .../java/org/apache/james/cli/ServerCmd.java    | 13 +--
 .../cli/exceptions/InvalidPortException.java    | 28 ------
 .../org/apache/james/cli/ServerCmdTest.java     |  7 +-
 .../modules/server/WebAdminServerModule.java    |  4 +-
 .../apache/james/utils/WebAdminGuiceProbe.java  |  2 +-
 server/container/jetty/pom.xml                  |  4 +
 .../apache/james/http/jetty/Configuration.java  |  8 +-
 .../james/http/jetty/JettyHttpServerTest.java   | 11 +--
 .../metrics/es/ESReporterConfiguration.java     |  5 ++
 .../main/java/org/apache/james/util/Host.java   |  2 +-
 .../main/java/org/apache/james/util/Port.java   | 54 ++++++++++++
 .../java/org/apache/james/util/PortTest.java    | 92 ++++++++++++++++++++
 .../james/transport/mailets/SpamAssassin.java   |  6 +-
 .../transport/mailets/SpamAssassinTest.java     |  6 +-
 .../routes/CassandraMigrationRoutesTest.java    |  2 +-
 .../org/apache/james/webadmin/FixedPort.java    | 54 ------------
 .../james/webadmin/FixedPortSupplier.java       | 53 +++++++++++
 .../java/org/apache/james/webadmin/Port.java    | 26 ------
 .../org/apache/james/webadmin/PortSupplier.java | 28 ++++++
 .../org/apache/james/webadmin/RandomPort.java   | 50 -----------
 .../james/webadmin/RandomPortSupplier.java      | 51 +++++++++++
 .../james/webadmin/WebAdminConfiguration.java   | 12 +--
 .../apache/james/webadmin/WebAdminServer.java   |  4 +-
 .../james/webadmin/FixedPortSupplierTest.java   | 57 ++++++++++++
 .../apache/james/webadmin/FixedPortTest.java    | 57 ------------
 .../james/webadmin/RandomPortSupplierTest.java  | 34 ++++++++
 .../apache/james/webadmin/RandomPortTest.java   | 34 --------
 .../webadmin/WebAdminConfigurationTest.java     |  2 +-
 .../apache/james/webadmin/WebAdminUtils.java    |  2 +-
 .../webadmin/routes/DomainsRoutesTest.java      |  2 +-
 .../james/webadmin/routes/GroupsRoutesTest.java |  2 +-
 .../james/webadmin/routes/UsersRoutesTest.java  |  2 +-
 .../webadmin/routes/GlobalQuotaRoutesTest.java  |  2 +-
 .../routes/UserMailboxesRoutesTest.java         |  2 +-
 .../james/webadmin/swagger/SwaggerParser.java   |  4 +-
 37 files changed, 422 insertions(+), 308 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/ClientProviderImpl.java
----------------------------------------------------------------------
diff --git a/backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/ClientProviderImpl.java b/backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/ClientProviderImpl.java
index 6118739..d4d3e4b 100644
--- a/backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/ClientProviderImpl.java
+++ b/backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/ClientProviderImpl.java
@@ -33,7 +33,6 @@ import com.google.common.collect.ImmutableList;
 public class ClientProviderImpl implements ClientProvider {
 
     public static ClientProviderImpl forHost(String address, Integer port) {
-        isValidPort(port);
         return new ClientProviderImpl(ImmutableList.of(Host.from(address, port)));
     }
 
@@ -47,10 +46,6 @@ public class ClientProviderImpl implements ClientProvider {
         return new ClientProviderImpl(hosts);
     }
 
-    private static boolean isValidPort(Integer port) {
-        return port > 0 && port <= 65535;
-    }
-
     private final ImmutableList<Host> hosts;
 
     private ClientProviderImpl(ImmutableList<Host> hosts) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/mailbox/tika/src/main/java/org/apache/james/mailbox/tika/TikaConfiguration.java
----------------------------------------------------------------------
diff --git a/mailbox/tika/src/main/java/org/apache/james/mailbox/tika/TikaConfiguration.java b/mailbox/tika/src/main/java/org/apache/james/mailbox/tika/TikaConfiguration.java
index 1915fb6..633afc3 100644
--- a/mailbox/tika/src/main/java/org/apache/james/mailbox/tika/TikaConfiguration.java
+++ b/mailbox/tika/src/main/java/org/apache/james/mailbox/tika/TikaConfiguration.java
@@ -21,6 +21,8 @@ package org.apache.james.mailbox.tika;
 
 import java.util.Optional;
 
+import org.apache.james.util.Port;
+
 import com.google.common.base.Preconditions;
 
 public class TikaConfiguration {
@@ -60,6 +62,7 @@ public class TikaConfiguration {
             Preconditions.checkState(host.isPresent(), "'host' is mandatory");
             Preconditions.checkState(port.isPresent(), "'port' is mandatory");
             Preconditions.checkState(timeoutInMillis.isPresent(), "'timeoutInMillis' is mandatory");
+            Port.assertValid(port.get());
 
             return new TikaConfiguration(host.get(), port.get(), timeoutInMillis.get());
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/container/cli/src/main/java/org/apache/james/cli/ServerCmd.java
----------------------------------------------------------------------
diff --git a/server/container/cli/src/main/java/org/apache/james/cli/ServerCmd.java b/server/container/cli/src/main/java/org/apache/james/cli/ServerCmd.java
index 9a9ae83..2c4d73f 100644
--- a/server/container/cli/src/main/java/org/apache/james/cli/ServerCmd.java
+++ b/server/container/cli/src/main/java/org/apache/james/cli/ServerCmd.java
@@ -34,7 +34,6 @@ import org.apache.commons.cli.PosixParser;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.time.StopWatch;
 import org.apache.james.cli.exceptions.InvalidArgumentNumberException;
-import org.apache.james.cli.exceptions.InvalidPortException;
 import org.apache.james.cli.exceptions.JamesCliException;
 import org.apache.james.cli.exceptions.MissingCommandException;
 import org.apache.james.cli.exceptions.UnrecognizedCommandException;
@@ -52,6 +51,7 @@ import org.apache.james.mailbox.store.probe.QuotaProbe;
 import org.apache.james.mailbox.store.probe.SieveProbe;
 import org.apache.james.probe.DataProbe;
 import org.apache.james.rrt.lib.Mappings;
+import org.apache.james.util.Port;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -159,7 +159,9 @@ public class ServerCmd {
         String portNum = cmd.getOptionValue(PORT_OPT_LONG);
         if (!Strings.isNullOrEmpty(portNum)) {
             try {
-                return validatePortNumber(Integer.parseInt(portNum));
+                int portNumber = Integer.parseInt(portNum);
+                Port.assertValid(portNumber);
+                return portNumber;
             } catch (NumberFormatException e) {
                 throw new ParseException("Port must be a number");
             }
@@ -167,13 +169,6 @@ public class ServerCmd {
         return DEFAULT_PORT;
     }
 
-    private static int validatePortNumber(int portNumber) {
-        if (portNumber < 1 || portNumber > 65535) {
-            throw new InvalidPortException(portNumber);
-        }
-        return portNumber;
-    }
-
     private static void failWithMessage(String s) {
         System.err.println(s);
         printUsage();

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/container/cli/src/main/java/org/apache/james/cli/exceptions/InvalidPortException.java
----------------------------------------------------------------------
diff --git a/server/container/cli/src/main/java/org/apache/james/cli/exceptions/InvalidPortException.java b/server/container/cli/src/main/java/org/apache/james/cli/exceptions/InvalidPortException.java
deleted file mode 100644
index bd659fb..0000000
--- a/server/container/cli/src/main/java/org/apache/james/cli/exceptions/InvalidPortException.java
+++ /dev/null
@@ -1,28 +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.cli.exceptions;
-
-public class InvalidPortException extends JamesCliException {
-
-    public InvalidPortException(int invalidPortNumber) {
-        super( invalidPortNumber + " is not a valid port number. Please provide one between 1 and 65535");
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/container/cli/src/test/java/org/apache/james/cli/ServerCmdTest.java
----------------------------------------------------------------------
diff --git a/server/container/cli/src/test/java/org/apache/james/cli/ServerCmdTest.java b/server/container/cli/src/test/java/org/apache/james/cli/ServerCmdTest.java
index b797683..aa24c29 100644
--- a/server/container/cli/src/test/java/org/apache/james/cli/ServerCmdTest.java
+++ b/server/container/cli/src/test/java/org/apache/james/cli/ServerCmdTest.java
@@ -31,7 +31,6 @@ import java.util.HashMap;
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.ParseException;
 import org.apache.james.cli.exceptions.InvalidArgumentNumberException;
-import org.apache.james.cli.exceptions.InvalidPortException;
 import org.apache.james.cli.exceptions.MissingCommandException;
 import org.apache.james.cli.exceptions.UnrecognizedCommandException;
 import org.apache.james.cli.type.CmdType;
@@ -1364,7 +1363,7 @@ public class ServerCmdTest {
         CommandLine commandLine = ServerCmd.parseCommandLine(arguments);
 
         assertThatThrownBy(() -> ServerCmd.getPort(commandLine))
-            .isInstanceOf(InvalidPortException.class);
+            .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
@@ -1373,7 +1372,7 @@ public class ServerCmdTest {
         CommandLine commandLine = ServerCmd.parseCommandLine(arguments);
 
         assertThatThrownBy(() -> ServerCmd.getPort(commandLine))
-            .isInstanceOf(InvalidPortException.class);
+            .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
@@ -1382,7 +1381,7 @@ public class ServerCmdTest {
         CommandLine commandLine = ServerCmd.parseCommandLine(arguments);
 
         assertThatThrownBy(() -> ServerCmd.getPort(commandLine))
-            .isInstanceOf(InvalidPortException.class);
+            .isInstanceOf(IllegalArgumentException.class);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/WebAdminServerModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/WebAdminServerModule.java b/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/WebAdminServerModule.java
index 88c1cd6..1a140ee 100644
--- a/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/WebAdminServerModule.java
+++ b/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/WebAdminServerModule.java
@@ -34,7 +34,7 @@ import org.apache.james.utils.ConfigurationPerformer;
 import org.apache.james.utils.GuiceProbe;
 import org.apache.james.utils.PropertiesProvider;
 import org.apache.james.utils.WebAdminGuiceProbe;
-import org.apache.james.webadmin.FixedPort;
+import org.apache.james.webadmin.FixedPortSupplier;
 import org.apache.james.webadmin.TlsConfiguration;
 import org.apache.james.webadmin.WebAdminConfiguration;
 import org.apache.james.webadmin.WebAdminServer;
@@ -82,7 +82,7 @@ public class WebAdminServerModule extends AbstractModule {
             PropertiesConfiguration configurationFile = propertiesProvider.getConfiguration("webadmin");
             return WebAdminConfiguration.builder()
                 .enable(configurationFile.getBoolean("enabled", DEFAULT_DISABLED))
-                .port(new FixedPort(configurationFile.getInt("port", WebAdminServer.DEFAULT_PORT)))
+                .port(new FixedPortSupplier(configurationFile.getInt("port", WebAdminServer.DEFAULT_PORT)))
                 .tls(readHttpsConfiguration(configurationFile))
                 .enableCORS(configurationFile.getBoolean("cors.enable", DEFAULT_CORS_DISABLED))
                 .urlCORSOrigin(configurationFile.getString("cors.origin", DEFAULT_NO_CORS_ORIGIN))

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/utils/WebAdminGuiceProbe.java
----------------------------------------------------------------------
diff --git a/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/utils/WebAdminGuiceProbe.java b/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/utils/WebAdminGuiceProbe.java
index a68155c..40cde64 100644
--- a/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/utils/WebAdminGuiceProbe.java
+++ b/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/utils/WebAdminGuiceProbe.java
@@ -32,6 +32,6 @@ public class WebAdminGuiceProbe implements GuiceProbe {
     }
 
     public int getWebAdminPort() {
-        return webAdminServer.getPort().toInt();
+        return webAdminServer.getPort().get().getValue();
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/container/jetty/pom.xml
----------------------------------------------------------------------
diff --git a/server/container/jetty/pom.xml b/server/container/jetty/pom.xml
index ae4a65c..1ec9a8b 100644
--- a/server/container/jetty/pom.xml
+++ b/server/container/jetty/pom.xml
@@ -34,6 +34,10 @@
 
     <dependencies>
         <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>james-core</artifactId>
+        </dependency>
+        <dependency>
             <groupId>com.github.fge</groupId>
             <artifactId>throwing-lambdas</artifactId>
         </dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/container/jetty/src/main/java/org/apache/james/http/jetty/Configuration.java
----------------------------------------------------------------------
diff --git a/server/container/jetty/src/main/java/org/apache/james/http/jetty/Configuration.java b/server/container/jetty/src/main/java/org/apache/james/http/jetty/Configuration.java
index f638e9f..13b43af 100644
--- a/server/container/jetty/src/main/java/org/apache/james/http/jetty/Configuration.java
+++ b/server/container/jetty/src/main/java/org/apache/james/http/jetty/Configuration.java
@@ -24,11 +24,12 @@ import java.util.Optional;
 import javax.servlet.Filter;
 import javax.servlet.Servlet;
 
+import org.apache.james.util.Port;
+
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableListMultimap;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Range;
 
 public class Configuration {
 
@@ -41,8 +42,7 @@ public class Configuration {
     }
     
     public static class Builder {
-        
-        private static final Range<Integer> VALID_PORT_RANGE = Range.closed(1, 65535);
+
         private static final String TEMPLATE_LEVEL1 = "/*";
 
         private final ImmutableMap.Builder<String, Object> mappings;
@@ -130,7 +130,7 @@ public class Configuration {
         }
 
         public Builder port(int port) {
-            Preconditions.checkArgument(VALID_PORT_RANGE.contains(port));
+            Port.assertValid(port);
             this.port = Optional.of(port);
             return this;
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/container/jetty/src/test/java/org/apache/james/http/jetty/JettyHttpServerTest.java
----------------------------------------------------------------------
diff --git a/server/container/jetty/src/test/java/org/apache/james/http/jetty/JettyHttpServerTest.java b/server/container/jetty/src/test/java/org/apache/james/http/jetty/JettyHttpServerTest.java
index 07c4538..17cb1f4 100644
--- a/server/container/jetty/src/test/java/org/apache/james/http/jetty/JettyHttpServerTest.java
+++ b/server/container/jetty/src/test/java/org/apache/james/http/jetty/JettyHttpServerTest.java
@@ -23,7 +23,6 @@ import static com.jayway.restassured.RestAssured.when;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.io.IOException;
-import java.util.Random;
 
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
@@ -35,6 +34,7 @@ import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.james.util.Port;
 import org.hamcrest.Matchers;
 import org.junit.After;
 import org.junit.Before;
@@ -102,18 +102,11 @@ public class JettyHttpServerTest {
     
     @Test
     public void shouldStartOnConfiguredPort() throws Exception {
-        int port = generateValidUnprivilegedPort();
+        int port = Port.generateValidUnprivilegedPort();
         testee = JettyHttpServer.create(configurationBuilder.port(port).build()).start();
         assertThat(testee.getPort()).isEqualTo(port);
     }
     
-
-    private int generateValidUnprivilegedPort() {
-        int portBound = 65535;
-        int privilegedPortBound = 1024;
-        return new Random().nextInt(portBound - privilegedPortBound) + privilegedPortBound;
-    }
-    
     @Test
     public void shouldReturn404WhenNoServletConfigured() throws Exception {
         testee = JettyHttpServer.create(configurationBuilder.build()).start();

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/container/metrics/metrics-es-reporter/src/main/java/org/apache/james/metrics/es/ESReporterConfiguration.java
----------------------------------------------------------------------
diff --git a/server/container/metrics/metrics-es-reporter/src/main/java/org/apache/james/metrics/es/ESReporterConfiguration.java b/server/container/metrics/metrics-es-reporter/src/main/java/org/apache/james/metrics/es/ESReporterConfiguration.java
index afed836..75aa0a7 100644
--- a/server/container/metrics/metrics-es-reporter/src/main/java/org/apache/james/metrics/es/ESReporterConfiguration.java
+++ b/server/container/metrics/metrics-es-reporter/src/main/java/org/apache/james/metrics/es/ESReporterConfiguration.java
@@ -21,6 +21,8 @@ package org.apache.james.metrics.es;
 
 import java.util.Optional;
 
+import org.apache.james.util.Port;
+
 import com.google.common.base.Preconditions;
 
 public class ESReporterConfiguration {
@@ -66,6 +68,9 @@ public class ESReporterConfiguration {
             Preconditions.checkState(enabled.isPresent(), "You must specify either enabled or disabled");
             Preconditions.checkState(!enabled.get() || host.isPresent(), "You must specify host when enabled");
             Preconditions.checkState(!enabled.get() || port.isPresent(), "You must specify port when enabled");
+            if (enabled.get()) {
+                Port.assertValid(port.get());
+            }
             return new ESReporterConfiguration(host, port, enabled.get(), index, periodInSecond);
         }
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/container/util-java8/src/main/java/org/apache/james/util/Host.java
----------------------------------------------------------------------
diff --git a/server/container/util-java8/src/main/java/org/apache/james/util/Host.java b/server/container/util-java8/src/main/java/org/apache/james/util/Host.java
index 9adc41c..4337aa3 100644
--- a/server/container/util-java8/src/main/java/org/apache/james/util/Host.java
+++ b/server/container/util-java8/src/main/java/org/apache/james/util/Host.java
@@ -101,7 +101,7 @@ public class Host {
     Host(String hostName, int port) {
         Preconditions.checkNotNull(hostName, "Hostname could not be null");
         Preconditions.checkArgument(!Strings.isNullOrEmpty(hostName), "Hostname could not be empty");
-        Preconditions.checkArgument(port > 0 && port <= 65535, "Port should be between 0 and 65535");
+        Port.assertValid(port);
         this.hostName = hostName;
         this.port = port;
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/container/util-java8/src/main/java/org/apache/james/util/Port.java
----------------------------------------------------------------------
diff --git a/server/container/util-java8/src/main/java/org/apache/james/util/Port.java b/server/container/util-java8/src/main/java/org/apache/james/util/Port.java
new file mode 100644
index 0000000..2acc4b6
--- /dev/null
+++ b/server/container/util-java8/src/main/java/org/apache/james/util/Port.java
@@ -0,0 +1,54 @@
+/****************************************************************
+ * 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.util;
+
+import java.util.Random;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Range;
+
+public class Port {
+    public static final int MAX_PORT_VALUE = 65535;
+    public static final int PRIVILEGED_PORT_BOUND = 1024;
+    private static final Range<Integer> VALID_PORT_RANGE = Range.closed(1, MAX_PORT_VALUE);
+
+    public static int generateValidUnprivilegedPort() {
+        return new Random().nextInt(Port.MAX_PORT_VALUE - PRIVILEGED_PORT_BOUND) + PRIVILEGED_PORT_BOUND;
+    }
+
+    public static void assertValid(int port) {
+        Preconditions.checkArgument(isValid(port), "Port should be between 1 and 65535");
+    }
+
+    public static boolean isValid(int port) {
+        return VALID_PORT_RANGE.contains(port);
+    }
+
+    private final int value;
+
+    public Port(int value) {
+        assertValid(value);
+        this.value = value;
+    }
+
+    public int getValue() {
+        return value;
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/container/util-java8/src/test/java/org/apache/james/util/PortTest.java
----------------------------------------------------------------------
diff --git a/server/container/util-java8/src/test/java/org/apache/james/util/PortTest.java b/server/container/util-java8/src/test/java/org/apache/james/util/PortTest.java
new file mode 100644
index 0000000..2f13e60
--- /dev/null
+++ b/server/container/util-java8/src/test/java/org/apache/james/util/PortTest.java
@@ -0,0 +1,92 @@
+/****************************************************************
+ * 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.util;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import org.junit.Test;
+
+public class PortTest {
+    @Test
+    public void assertValidShouldThrowOnNegativePort() {
+        assertThatThrownBy(() -> Port.assertValid(-1))
+            .isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    public void assertValidShouldThrowOnZeroPort() {
+        assertThatThrownBy(() -> Port.assertValid(0))
+            .isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    public void assertValidShouldAcceptOne() {
+        Port.assertValid(1);
+    }
+
+    @Test
+    public void assertValidShouldAcceptMaxValue() {
+        Port.assertValid(Port.MAX_PORT_VALUE);
+    }
+
+    @Test
+    public void assertValidShouldThrowOnTooBigValue() {
+        assertThatThrownBy(() -> Port.assertValid(Port.MAX_PORT_VALUE + 1))
+            .isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    public void isValidShouldReturnFalseWhenNegative() {
+        assertThat(Port.isValid(-1))
+            .isFalse();
+    }
+
+    @Test
+    public void isValidShouldReturnFalseWhenZero() {
+        assertThat(Port.isValid(0))
+            .isFalse();
+    }
+
+    @Test
+    public void isValidShouldReturnTrueWhenOne() {
+        assertThat(Port.isValid(1))
+            .isTrue();
+    }
+
+    @Test
+    public void isValidShouldReturnTrueWhenMaxValue() {
+        assertThat(Port.isValid(Port.MAX_PORT_VALUE))
+            .isTrue();
+    }
+
+    @Test
+    public void isValidShouldReturnFalseWhenAboveMaxValue() {
+        assertThat(Port.isValid(Port.MAX_PORT_VALUE + 1))
+            .isFalse();
+    }
+
+    @Test
+    public void generateValidUnprivilegedPortShouldReturnAValidPort() {
+        assertThat(Port.generateValidUnprivilegedPort())
+            .isStrictlyBetween(Port.PRIVILEGED_PORT_BOUND, Port.MAX_PORT_VALUE);
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
index 1b3de01..5d01cd5 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
@@ -25,6 +25,7 @@ import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
 import org.apache.james.transport.mailets.managesieve.ManageSieveMailet;
+import org.apache.james.util.Port;
 import org.apache.james.util.scanner.SpamAssassinInvoker;
 import org.apache.mailet.Experimental;
 import org.apache.mailet.Mail;
@@ -67,7 +68,6 @@ public class SpamAssassin extends GenericMailet {
     public static final String SPAMD_PORT = "spamdPort";
     public static final String DEFAULT_HOST = "127.0.0.1";
     public static final int DEFAULT_PORT = 783;
-    public static final int MAX_AVAILABLE_PORT = 65535;
 
     private String spamdHost;
     private int spamdPort;
@@ -81,9 +81,7 @@ public class SpamAssassin extends GenericMailet {
             .orElse(DEFAULT_HOST);
 
         spamdPort = MailetUtil.getInitParameterAsStrictlyPositiveInteger(getInitParameter(SPAMD_PORT), DEFAULT_PORT);
-        if (spamdPort > MAX_AVAILABLE_PORT) {
-            throw new MessagingException("Please configure a valid port. Not valid: " + spamdPort);
-        }
+        Port.assertValid(spamdPort);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
index 71831d9..875a4f9 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
@@ -24,7 +24,9 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import javax.mail.MessagingException;
 
+import org.apache.james.smtpserver.mock.util.MockSpamd;
 import org.apache.james.smtpserver.mock.util.MockSpamdTestRule;
+import org.apache.james.util.Port;
 import org.apache.james.util.scanner.SpamAssassinInvoker;
 import org.apache.mailet.Mail;
 import org.apache.mailet.base.test.FakeMail;
@@ -117,8 +119,8 @@ public class SpamAssassinTest {
         assertThatThrownBy(() -> mailet.init(FakeMailetConfig.builder()
             .mailetName("SpamAssassin")
             .setProperty(SpamAssassin.SPAMD_PORT,
-                String.valueOf(SpamAssassin.MAX_AVAILABLE_PORT + 1))
-            .build())).isInstanceOf(MessagingException.class);
+                String.valueOf(Port.MAX_PORT_VALUE + 1))
+            .build())).isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/CassandraMigrationRoutesTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/CassandraMigrationRoutesTest.java b/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/CassandraMigrationRoutesTest.java
index e475373..e64fabd 100644
--- a/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/CassandraMigrationRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/CassandraMigrationRoutesTest.java
@@ -85,7 +85,7 @@ public class CassandraMigrationRoutesTest {
             .setContentType(ContentType.JSON)
             .setAccept(ContentType.JSON)
             .setBasePath(CassandraMigrationRoutes.VERSION_BASE)
-            .setPort(webAdminServer.getPort().toInt())
+            .setPort(webAdminServer.getPort().get().getValue())
             .setConfig(newConfig().encoderConfig(encoderConfig().defaultContentCharset(Charsets.UTF_8)))
             .build();
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/FixedPort.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/FixedPort.java b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/FixedPort.java
deleted file mode 100644
index 7ada8a1..0000000
--- a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/FixedPort.java
+++ /dev/null
@@ -1,54 +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.webadmin;
-
-import java.util.Objects;
-
-import com.google.common.base.Preconditions;
-
-public class FixedPort implements Port {
-
-    private final int port;
-
-    public FixedPort(int port) {
-        Preconditions.checkArgument(port > 0 && port < 65536, "Port should be strictly contained between 0 and 65536");
-        this.port = port;
-    }
-
-    @Override
-    public int toInt() {
-        return port;
-    }
-
-    @Override
-    public final boolean equals(Object o) {
-        if (o instanceof FixedPort) {
-            FixedPort that = (FixedPort) o;
-
-            return Objects.equals(this.port, that.port);
-        }
-        return false;
-    }
-
-    @Override
-    public final int hashCode() {
-        return Objects.hash(port);
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/FixedPortSupplier.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/FixedPortSupplier.java b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/FixedPortSupplier.java
new file mode 100644
index 0000000..de35bcb
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/FixedPortSupplier.java
@@ -0,0 +1,53 @@
+/****************************************************************
+ * 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.webadmin;
+
+import java.util.Objects;
+
+import org.apache.james.util.Port;
+
+public class FixedPortSupplier implements PortSupplier {
+
+    private final Port port;
+
+    public FixedPortSupplier(int port) {
+        this.port = new Port(port);
+    }
+
+    @Override
+    public Port get() {
+        return port;
+    }
+
+    @Override
+    public final boolean equals(Object o) {
+        if (o instanceof FixedPortSupplier) {
+            FixedPortSupplier that = (FixedPortSupplier) o;
+
+            return Objects.equals(this.port, that.port);
+        }
+        return false;
+    }
+
+    @Override
+    public final int hashCode() {
+        return Objects.hash(port);
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/Port.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/Port.java b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/Port.java
deleted file mode 100644
index ff7a50b..0000000
--- a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/Port.java
+++ /dev/null
@@ -1,26 +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.webadmin;
-
-public interface Port {
-
-    int toInt();
-
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/PortSupplier.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/PortSupplier.java b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/PortSupplier.java
new file mode 100644
index 0000000..b9a8afe
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/PortSupplier.java
@@ -0,0 +1,28 @@
+/****************************************************************
+ * 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.webadmin;
+
+import java.util.function.Supplier;
+
+import org.apache.james.util.Port;
+
+public interface PortSupplier extends Supplier<Port> {
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/RandomPort.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/RandomPort.java b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/RandomPort.java
deleted file mode 100644
index 2b3ab5d..0000000
--- a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/RandomPort.java
+++ /dev/null
@@ -1,50 +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.webadmin;
-
-import java.io.IOException;
-import java.net.ServerSocket;
-
-import com.google.common.base.Supplier;
-import com.google.common.base.Suppliers;
-import com.google.common.base.Throwables;
-
-public class RandomPort implements Port {
-
-    public static int findFreePort() {
-        try (ServerSocket socket = new ServerSocket(0)) {
-            return socket.getLocalPort();
-        } catch (IOException e) {
-            throw Throwables.propagate(e);
-        }
-    }
-
-    private final Supplier<Integer> portSupplier;
-
-    public RandomPort() {
-        portSupplier = Suppliers.memoize(RandomPort::findFreePort);
-    }
-
-    @Override
-    public int toInt() {
-        return portSupplier.get();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/RandomPortSupplier.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/RandomPortSupplier.java b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/RandomPortSupplier.java
new file mode 100644
index 0000000..6f21591
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/RandomPortSupplier.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.webadmin;
+
+import java.io.IOException;
+import java.net.ServerSocket;
+
+import org.apache.james.util.Port;
+
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.common.base.Throwables;
+
+public class RandomPortSupplier implements PortSupplier {
+
+    public static int findFreePort() {
+        try (ServerSocket socket = new ServerSocket(0)) {
+            return socket.getLocalPort();
+        } catch (IOException e) {
+            throw Throwables.propagate(e);
+        }
+    }
+
+    private final Supplier<Integer> portSupplier;
+
+    public RandomPortSupplier() {
+        portSupplier = Suppliers.memoize(RandomPortSupplier::findFreePort);
+    }
+
+    @Override
+    public Port get() {
+        return new Port(portSupplier.get());
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminConfiguration.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminConfiguration.java b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminConfiguration.java
index 8db2976..45d0e18 100644
--- a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminConfiguration.java
+++ b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminConfiguration.java
@@ -42,7 +42,7 @@ public class WebAdminConfiguration {
 
     public static class Builder {
         private Optional<Boolean> enabled = Optional.empty();
-        private Optional<Port> port = Optional.empty();
+        private Optional<PortSupplier> port = Optional.empty();
         private Optional<Boolean> enableCORS = Optional.empty();
         private Optional<TlsConfiguration> tlsConfiguration = Optional.empty();
         private Optional<String> urlCORSOrigin = Optional.empty();
@@ -58,8 +58,8 @@ public class WebAdminConfiguration {
             return this;
         }
 
-        public Builder port(Port port) {
-            this.port = Optional.of(port);
+        public Builder port(PortSupplier portSupplier) {
+            this.port = Optional.of(portSupplier);
             return this;
         }
 
@@ -111,14 +111,14 @@ public class WebAdminConfiguration {
     }
 
     private final boolean enabled;
-    private final Optional<Port> port;
+    private final Optional<PortSupplier> port;
     private final Optional<TlsConfiguration> tlsConfiguration;
     private final boolean enableCORS;
     private final String urlCORSOrigin;
     private final String host;
 
     @VisibleForTesting
-    WebAdminConfiguration(boolean enabled, Optional<Port> port, Optional<TlsConfiguration> tlsConfiguration,
+    WebAdminConfiguration(boolean enabled, Optional<PortSupplier> port, Optional<TlsConfiguration> tlsConfiguration,
                           boolean enableCORS, String urlCORSOrigin, String host) {
         this.enabled = enabled;
         this.port = port;
@@ -136,7 +136,7 @@ public class WebAdminConfiguration {
         return urlCORSOrigin;
     }
 
-    public Port getPort() {
+    public PortSupplier getPort() {
         return port.orElseThrow(() -> new IllegalStateException("No port was specified"));
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminServer.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminServer.java b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminServer.java
index fe5d22a..e544022 100644
--- a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminServer.java
+++ b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminServer.java
@@ -67,7 +67,7 @@ public class WebAdminServer implements Configurable {
     @Override
     public void configure(HierarchicalConfiguration config) throws ConfigurationException {
         if (configuration.isEnabled()) {
-            service.port(configuration.getPort().toInt());
+            service.port(configuration.getPort().get().getValue());
             configureHTTPS();
             configureCORS();
             configureMetrics();
@@ -123,7 +123,7 @@ public class WebAdminServer implements Configurable {
         service.awaitInitialization();
     }
 
-    public Port getPort() {
+    public PortSupplier getPort() {
         return configuration.getPort();
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/FixedPortSupplierTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/FixedPortSupplierTest.java b/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/FixedPortSupplierTest.java
new file mode 100644
index 0000000..304295d
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/FixedPortSupplierTest.java
@@ -0,0 +1,57 @@
+/****************************************************************
+ * 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.webadmin;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import org.junit.Test;
+
+import nl.jqno.equalsverifier.EqualsVerifier;
+
+public class FixedPortSupplierTest {
+
+    @Test
+    public void toIntShouldThrowOnNegativePort() {
+        assertThatThrownBy(() -> new FixedPortSupplier(-1)).isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    public void toIntShouldThrowOnNullPort() {
+        assertThatThrownBy(() -> new FixedPortSupplier(0)).isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    public void toIntShouldThrowOnTooBigNumbers() {
+        assertThatThrownBy(() -> new FixedPortSupplier(65536)).isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    public void toIntShouldReturnedDesiredPort() {
+        int expectedPort = 452;
+        assertThat(new FixedPortSupplier(expectedPort).get().getValue()).isEqualTo(expectedPort);
+    }
+
+    @Test
+    public void shouldMatchBeanContract() {
+        EqualsVerifier.forClass(FixedPortSupplier.class).verify();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/FixedPortTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/FixedPortTest.java b/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/FixedPortTest.java
deleted file mode 100644
index 2712daa..0000000
--- a/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/FixedPortTest.java
+++ /dev/null
@@ -1,57 +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.webadmin;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
-
-import org.junit.Test;
-
-import nl.jqno.equalsverifier.EqualsVerifier;
-
-public class FixedPortTest {
-
-    @Test
-    public void toIntShouldThrowOnNegativePort() {
-        assertThatThrownBy(() -> new FixedPort(-1)).isInstanceOf(IllegalArgumentException.class);
-    }
-
-    @Test
-    public void toIntShouldThrowOnNullPort() {
-        assertThatThrownBy(() -> new FixedPort(0)).isInstanceOf(IllegalArgumentException.class);
-    }
-
-    @Test
-    public void toIntShouldThrowOnTooBigNumbers() {
-        assertThatThrownBy(() -> new FixedPort(65536)).isInstanceOf(IllegalArgumentException.class);
-    }
-
-    @Test
-    public void toIntShouldReturnedDesiredPort() {
-        int expectedPort = 452;
-        assertThat(new FixedPort(expectedPort).toInt()).isEqualTo(expectedPort);
-    }
-
-    @Test
-    public void shouldMatchBeanContract() {
-        EqualsVerifier.forClass(FixedPort.class).verify();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/RandomPortSupplierTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/RandomPortSupplierTest.java b/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/RandomPortSupplierTest.java
new file mode 100644
index 0000000..de821f1
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/RandomPortSupplierTest.java
@@ -0,0 +1,34 @@
+/****************************************************************
+ * 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.webadmin;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.Test;
+
+public class RandomPortSupplierTest {
+
+    @Test
+    public void toIntShouldReturnTwoTimeTheSameResult() {
+        RandomPortSupplier testee = new RandomPortSupplier();
+        assertThat(testee.get().getValue()).isEqualTo(testee.get().getValue());
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/RandomPortTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/RandomPortTest.java b/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/RandomPortTest.java
deleted file mode 100644
index 07d1996..0000000
--- a/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/RandomPortTest.java
+++ /dev/null
@@ -1,34 +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.webadmin;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import org.junit.Test;
-
-public class RandomPortTest {
-
-    @Test
-    public void toIntShouldReturnTwoTimeTheSameResult() {
-        RandomPort testee = new RandomPort();
-        assertThat(testee.toInt()).isEqualTo(testee.toInt());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/WebAdminConfigurationTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/WebAdminConfigurationTest.java b/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/WebAdminConfigurationTest.java
index ab0649f..8fdf930 100644
--- a/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/WebAdminConfigurationTest.java
+++ b/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/WebAdminConfigurationTest.java
@@ -29,7 +29,7 @@ import nl.jqno.equalsverifier.EqualsVerifier;
 
 public class WebAdminConfigurationTest {
 
-    public static final FixedPort PORT = new FixedPort(80);
+    public static final FixedPortSupplier PORT = new FixedPortSupplier(80);
 
     @Rule
     public ExpectedException expectedException = ExpectedException.none();

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/WebAdminUtils.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/WebAdminUtils.java b/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/WebAdminUtils.java
index 3ff8c02..89a5310 100644
--- a/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/WebAdminUtils.java
+++ b/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/WebAdminUtils.java
@@ -31,7 +31,7 @@ public class WebAdminUtils {
     public static WebAdminConfiguration webAdminConfigurationForTesting() {
         return WebAdminConfiguration.builder()
             .enabled()
-            .port(new RandomPort())
+            .port(new RandomPortSupplier())
             .build();
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
index 1de056d..cfa3875 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
@@ -74,7 +74,7 @@ public class DomainsRoutesTest {
         		.setContentType(ContentType.JSON)
         		.setAccept(ContentType.JSON)
         		.setConfig(newConfig().encoderConfig(encoderConfig().defaultContentCharset(StandardCharsets.UTF_8)))
-        		.setPort(webAdminServer.getPort().toInt())
+        		.setPort(webAdminServer.getPort().get().getValue())
         		.setBasePath(DomainsRoutes.DOMAINS)
         		.build();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java
index a0eae10..ccbe64a 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java
@@ -90,7 +90,7 @@ public class GroupsRoutesTest {
             .setContentType(ContentType.JSON)
             .setAccept(ContentType.JSON)
             .setConfig(newConfig().encoderConfig(encoderConfig().defaultContentCharset(StandardCharsets.UTF_8)))
-            .setPort(webAdminServer.getPort().toInt())
+            .setPort(webAdminServer.getPort().get().getValue())
             .setBasePath(GroupsRoutes.ROOT_PATH)
             .log(LogDetail.ALL)
             .build();

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
index c2874db..bcc2d1f 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
@@ -76,7 +76,7 @@ public class UsersRoutesTest {
         		.setContentType(ContentType.JSON)
         		.setAccept(ContentType.JSON)
         		.setConfig(newConfig().encoderConfig(encoderConfig().defaultContentCharset(StandardCharsets.UTF_8)))
-        		.setPort(webAdminServer.getPort().toInt())
+        		.setPort(webAdminServer.getPort().get().getValue())
         		.setBasePath(UserRoutes.USERS)
         		.build();
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/GlobalQuotaRoutesTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/GlobalQuotaRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/GlobalQuotaRoutesTest.java
index 67e8fd5..24a84cb 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/GlobalQuotaRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/GlobalQuotaRoutesTest.java
@@ -62,7 +62,7 @@ public class GlobalQuotaRoutesTest {
             .setContentType(ContentType.JSON)
             .setAccept(ContentType.JSON)
             .setConfig(newConfig().encoderConfig(encoderConfig().defaultContentCharset(Charsets.UTF_8)))
-            .setPort(webAdminServer.getPort().toInt())
+            .setPort(webAdminServer.getPort().get().getValue())
             .build();
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
index 5d34e26..46c493f 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
@@ -92,7 +92,7 @@ public class UserMailboxesRoutesTest {
             .setContentType(ContentType.JSON)
             .setAccept(ContentType.JSON)
             .setBasePath(USERS_BASE + SEPARATOR + USERNAME + SEPARATOR + UserMailboxesRoutes.MAILBOXES)
-            .setPort(webAdminServer.getPort().toInt())
+            .setPort(webAdminServer.getPort().get().getValue())
             .setConfig(newConfig().encoderConfig(encoderConfig().defaultContentCharset(Charsets.UTF_8)))
             .build();
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/27b89085/server/protocols/webadmin/webadmin-swagger/src/main/java/org/apache/james/webadmin/swagger/SwaggerParser.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-swagger/src/main/java/org/apache/james/webadmin/swagger/SwaggerParser.java b/server/protocols/webadmin/webadmin-swagger/src/main/java/org/apache/james/webadmin/swagger/SwaggerParser.java
index 7bdec19..730caa6 100644
--- a/server/protocols/webadmin/webadmin-swagger/src/main/java/org/apache/james/webadmin/swagger/SwaggerParser.java
+++ b/server/protocols/webadmin/webadmin-swagger/src/main/java/org/apache/james/webadmin/swagger/SwaggerParser.java
@@ -22,6 +22,7 @@ package org.apache.james.webadmin.swagger;
 import javax.inject.Inject;
 
 import org.apache.james.webadmin.WebAdminConfiguration;
+import org.reflections.Reflections;
 
 import com.fasterxml.jackson.annotation.JsonInclude.Include;
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -32,7 +33,6 @@ import io.swagger.annotations.SwaggerDefinition;
 import io.swagger.jaxrs.Reader;
 import io.swagger.jaxrs.config.BeanConfig;
 import io.swagger.models.Swagger;
-import org.reflections.Reflections;
 
 @SwaggerDefinition
 public class SwaggerParser {
@@ -68,7 +68,7 @@ public class SwaggerParser {
 		beanConfig.setVersion(API_DOC_VERSION);
 		beanConfig.setTitle(API_DOC_TITLE);
 		beanConfig.setDescription(API_DOC_DESCRIPTION);
-		beanConfig.setHost(configuration.getHost() + HOST_PORT_SEPARATOR + configuration.getPort().toInt());
+		beanConfig.setHost(configuration.getHost() + HOST_PORT_SEPARATOR + configuration.getPort().get().getValue());
 		beanConfig.setSchemes(SCHEMES);
 		beanConfig.setScan(true);
 		beanConfig.scanAndRead();


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