JAMES-1877 Extract RemoteDelivery configuration to an other class

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

Branch: refs/heads/master
Commit: 6fa52984020803b4d4c7de43d42e6dad3bfad6a6
Parents: 61c6309
Author: Benoit Tellier <btell...@linagora.com>
Authored: Wed Nov 30 11:09:09 2016 +0700
Committer: Benoit Tellier <btell...@linagora.com>
Committed: Tue Jan 10 15:04:27 2017 +0700

----------------------------------------------------------------------
 mailet/base/pom.xml                             |   5 +
 .../org/apache/mailet/base/GenericMailet.java   |   2 +-
 .../java/org/apache/mailet/base/MailetUtil.java |  12 +-
 .../org/apache/mailet/base/MailetUtilTest.java  |   9 +-
 .../james/transport/mailets/RemoteDelivery.java | 281 +-----
 .../RemoteDeliveryConfiguration.java            | 288 ++++++
 .../mailets/remoteDelivery/Repeat.java          |   2 +-
 .../RemoteDeliveryConfigurationTest.java        | 911 +++++++++++++++++++
 .../mailets/remoteDelivery/RepeatTest.java      |   6 +-
 9 files changed, 1267 insertions(+), 249 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/6fa52984/mailet/base/pom.xml
----------------------------------------------------------------------
diff --git a/mailet/base/pom.xml b/mailet/base/pom.xml
index d40cc5d..0c47808 100644
--- a/mailet/base/pom.xml
+++ b/mailet/base/pom.xml
@@ -76,6 +76,11 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-guava</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
         </dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/6fa52984/mailet/base/src/main/java/org/apache/mailet/base/GenericMailet.java
----------------------------------------------------------------------
diff --git 
a/mailet/base/src/main/java/org/apache/mailet/base/GenericMailet.java 
b/mailet/base/src/main/java/org/apache/mailet/base/GenericMailet.java
index c56a226..741f3f7 100644
--- a/mailet/base/src/main/java/org/apache/mailet/base/GenericMailet.java
+++ b/mailet/base/src/main/java/org/apache/mailet/base/GenericMailet.java
@@ -79,7 +79,7 @@ public abstract class GenericMailet implements Mailet, 
MailetConfig {
         if (config == null) {
             throw new NullPointerException("Mailet configuration must be set 
before getInitParameter is called.");
         }
-        return MailetUtil.getInitParameter(config, name, defaultValue);
+        return MailetUtil.getInitParameter(config, name).or(defaultValue);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/james-project/blob/6fa52984/mailet/base/src/main/java/org/apache/mailet/base/MailetUtil.java
----------------------------------------------------------------------
diff --git a/mailet/base/src/main/java/org/apache/mailet/base/MailetUtil.java 
b/mailet/base/src/main/java/org/apache/mailet/base/MailetUtil.java
index 0155d5c..642f760 100644
--- a/mailet/base/src/main/java/org/apache/mailet/base/MailetUtil.java
+++ b/mailet/base/src/main/java/org/apache/mailet/base/MailetUtil.java
@@ -23,6 +23,8 @@ package org.apache.mailet.base;
 
 import org.apache.mailet.MailetConfig;
 
+import com.google.common.base.Optional;
+
 
 /**
  * Collects utility methods.
@@ -91,20 +93,18 @@ public class MailetUtil {
      * <p>Gets a boolean valued init parameter.</p>
      * @param config not null
      * @param name name of the init parameter to be queried
-     * @param defaultValue this value will be substituted when the named value
-     * cannot be parse or when the init parameter is absent
      * @return true when the init parameter is <code>true</code> (ignoring 
case);
      * false when the init parameter is <code>false</code> (ignoring case);
      * otherwise the default value
      */
-    public static boolean getInitParameter(MailetConfig config, String name, 
boolean defaultValue) {
+    public static Optional<Boolean> getInitParameter(MailetConfig config, 
String name) {
         String value = config.getInitParameter(name);
         if ("true".equalsIgnoreCase(value)) {
-            return true;
+            return Optional.of(true);
         }
         if ("false".equalsIgnoreCase(value)){
-            return false;
+            return Optional.of(false);
         }
-        return defaultValue;
+        return Optional.absent();
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/6fa52984/mailet/base/src/test/java/org/apache/mailet/base/MailetUtilTest.java
----------------------------------------------------------------------
diff --git 
a/mailet/base/src/test/java/org/apache/mailet/base/MailetUtilTest.java 
b/mailet/base/src/test/java/org/apache/mailet/base/MailetUtilTest.java
index db1f131..cb56b99 100644
--- a/mailet/base/src/test/java/org/apache/mailet/base/MailetUtilTest.java
+++ b/mailet/base/src/test/java/org/apache/mailet/base/MailetUtilTest.java
@@ -20,6 +20,7 @@
 package org.apache.mailet.base;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.guava.api.Assertions.assertThat;
 
 import org.apache.mailet.base.test.FakeMailetConfig;
 import org.junit.Test;
@@ -27,6 +28,7 @@ import org.junit.Test;
 public class MailetUtilTest {
 
     private static final String A_PARAMETER = "aParameter";
+    public static final String DEFAULT_VALUE = "default";
 
     @Test
     public void getInitParameterShouldReturnTrueWhenIsValueTrueLowerCase() {
@@ -77,17 +79,16 @@ public class MailetUtilTest {
     }
 
     @Test
-    public void getInitParameterShouldReturnDefaultValueWhenNull() {
+    public void getInitParameterShouldReturnAbsentWhenNull() {
         FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
                 .build();
-        assertThat(MailetUtil.getInitParameter(mailetConfig, A_PARAMETER, 
false)).isFalse();
-        assertThat(MailetUtil.getInitParameter(mailetConfig, A_PARAMETER, 
true)).isTrue();
+        assertThat(MailetUtil.getInitParameter(mailetConfig, 
A_PARAMETER)).isAbsent();
     }
 
     private boolean getParameterValued(String value, boolean defaultValue) {
         FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
             .setProperty(A_PARAMETER, value)
             .build();
-        return MailetUtil.getInitParameter(mailetConfig, A_PARAMETER, 
defaultValue);
+        return MailetUtil.getInitParameter(mailetConfig, 
A_PARAMETER).or(defaultValue);
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/6fa52984/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
index 88f8ea7..0067607 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
@@ -33,11 +33,9 @@ import java.util.Collection;
 import java.util.Date;
 import java.util.Hashtable;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Properties;
-import java.util.StringTokenizer;
 import java.util.Vector;
 import java.util.concurrent.TimeUnit;
 
@@ -65,8 +63,7 @@ import 
org.apache.james.queue.api.MailQueue.MailQueueException;
 import org.apache.james.queue.api.MailQueue.MailQueueItem;
 import org.apache.james.queue.api.MailQueueFactory;
 import org.apache.james.transport.mailets.remoteDelivery.Delay;
-import org.apache.james.transport.mailets.remoteDelivery.DelaysAndMaxRetry;
-import org.apache.james.transport.mailets.remoteDelivery.HeloNameProvider;
+import 
org.apache.james.transport.mailets.remoteDelivery.RemoteDeliveryConfiguration;
 import 
org.apache.james.transport.mailets.remoteDelivery.RemoteDeliverySocketFactory;
 import org.apache.mailet.HostAddress;
 import org.apache.mailet.Mail;
@@ -156,101 +153,23 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
     private final DomainList domainList;
     private final MailQueueFactory queueFactory;
     private final Metric outgoingMailsMetric;
-    private final Properties defprops; // Default properties for the JavaMail 
Session
     private final Collection<Thread> workersThreads;
 
-    /**
-     * Flag to define verbose logging messages.
-     */
-    private boolean isDebug = false;
-
-    /**
-     * List of Delay Times. Controls frequency of retry attempts.
-     */
-    private List<Long> delayTimes;
-
-    /**
-     * Maximum no. of retries (Defaults to 5).
-     */
-    private int maxRetries;
-
-    /**
-     * Default number of ms to timeout on smtp delivery
-     */
-    private long smtpTimeout = 180000;
-
-    /**
-     * If false then ANY address errors will cause the transmission to fail
-     */
-    private boolean sendPartial = false;
-
-    /**
-     * The amount of time JavaMail will wait before giving up on a socket
-     * connect()
-     */
-    private int connectionTimeout = 60000;
-
-    /**
-     * No. of threads used to process messages that should be retried.
-     */
-    private int workersThreadCount = 1;
-
-    /**
-     * The server(s) to send all email to
-     */
-    private Collection<String> gatewayServer = null;
-
-    /**
-     * Auth for gateway server
-     */
-    private String authUser = null;
-
-    /**
-     * Password for gateway server
-     */
-    private String authPass = null;
-
-    /**
-     * True, if the bind configuration parameter is supplied,
-     * RemoteDeliverySocketFactory will be used in this case.
-     */
-    private boolean isBindUsed = false;
+    private MailQueue queue;
+    private Logger logger;
+    private RemoteDeliveryConfiguration configuration;
 
     /**
      * Flag used by 'run' method to end itself.
      */
     private volatile boolean destroyed = false;
 
-    /**
-     * the processor for creating Bounces
-     */
-    private String bounceProcessor = null;
-
-
-    /**
-     * The retry count dnsProblemErrors
-     */
-    private int dnsProblemRetry = 0;
-
-    private MailQueue queue;
-
-    private Logger logger;
-
-    private boolean usePriority;
-
-    private boolean startTLS = false;
-
-    private boolean isSSLEnable = false;
-
-    private HeloNameProvider heloNameProvider;
-
     @Inject
     public RemoteDelivery(DNSService dnsServer, DomainList domainList, 
MailQueueFactory queueFactory, MetricFactory metricFactory) {
         this.dnsServer = dnsServer;
         this.domainList = domainList;
         this.queueFactory = queueFactory;
         this.outgoingMailsMetric = metricFactory.generate(OUTGOING_MAILS);
-        this.defprops = new Properties();
         this.workersThreads = new Vector<Thread>();
     }
 
@@ -261,124 +180,20 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
      * @throws MessagingException on failure to initialize attributes.
      */
     public void init() throws MessagingException {
-        // Set isDebug flag.
-        isDebug = (getInitParameter("debug") == null) ? false : 
Boolean.valueOf(getInitParameter("debug"));
-
         logger = getMailetContext().getLogger();
-
-        try {
-            int intendedMaxRetries = 
Integer.parseInt(getInitParameter("maxRetries", "5"));
-            DelaysAndMaxRetry delaysAndMaxRetry = 
DelaysAndMaxRetry.from(intendedMaxRetries, getInitParameter("delayTime"));
-            maxRetries = delaysAndMaxRetry.getMaxRetries();
-            delayTimes = delaysAndMaxRetry.getExpendedDelays();
-        } catch (Exception e) {
-            log("Invalid maxRetries setting: " + 
getInitParameter("maxRetries"));
-        }
-        // Get the path for the 'Outgoing' repository. This is the place on the
-        // file system where Mail objects will be saved during the 'delivery'
-        // processing. This can be changed to a repository on a database (e.g.
-        // db://maildb/spool/retry).
-        String outgoing = getInitParameter("outgoing");
-        if (outgoing == null) {
-            outgoing = "outgoing";
-        }
-        queue = queueFactory.getQueue(outgoing);
-
-        try {
-            if (getInitParameter("timeout") != null) {
-                smtpTimeout = Integer.parseInt(getInitParameter("timeout"));
-            }
-        } catch (Exception e) {
-            log("Invalid timeout setting: " + getInitParameter("timeout"));
-        }
-
-        try {
-            if (getInitParameter("connectiontimeout") != null) {
-                connectionTimeout = 
Integer.parseInt(getInitParameter("connectiontimeout"));
-            }
-        } catch (Exception e) {
-            log("Invalid timeout setting: " + getInitParameter("timeout"));
-        }
-
-        sendPartial = (getInitParameter("sendpartial") == null) ? false : 
Boolean.valueOf(getInitParameter("sendpartial"));
-
-        bounceProcessor = getInitParameter("bounceProcessor");
-
-        String sTLS = getInitParameter("startTLS");
-        if (sTLS != null) {
-            startTLS = Boolean.valueOf(sTLS);
-        }
-
-        isSSLEnable = (getInitParameter("sslEnable") == null) ? false : 
Boolean.valueOf(getInitParameter("sslEnable"));
-
-        String gateway = getInitParameter("gateway");
-        String gatewayPort = getInitParameter("gatewayPort");
-
-        if (gateway != null) {
-            gatewayServer = new ArrayList<String>();
-            StringTokenizer st = new StringTokenizer(gateway, ",");
-            while (st.hasMoreTokens()) {
-                String server = st.nextToken().trim();
-                if (server.indexOf(':') < 0 && gatewayPort != null) {
-                    server += ":";
-                    server += gatewayPort;
-                }
-
-                if (isDebug)
-                    log("Adding SMTP gateway: " + server);
-                gatewayServer.add(server);
-            }
-            authUser = getInitParameter("gatewayUsername");
-            // backward compatibility with 2.3.x
-            if (authUser == null) {
-                authUser = getInitParameter("gatewayusername");
-            }
-            authPass = getInitParameter("gatewayPassword");
-        }
-
-        /*
-      JavaMail delivery socket binds to this local address. If null the
-      JavaMail default will be used.
-     */
-        String bindAddress = getInitParameter("bind");
-        isBindUsed = bindAddress != null;
+        configuration = new RemoteDeliveryConfiguration(getMailetConfig(), 
domainList);
+        queue = queueFactory.getQueue(configuration.getOutGoingQueueName());
+        initDeliveryThreads();
         try {
-            if (isBindUsed)
-                RemoteDeliverySocketFactory.setBindAdress(bindAddress);
+            if (configuration.isBindUsed())
+                
RemoteDeliverySocketFactory.setBindAdress(configuration.getBindAddress());
         } catch (UnknownHostException e) {
-            log("Invalid bind setting (" + bindAddress + "): " + e.toString());
+            log("Invalid bind setting (" + configuration.getBindAddress() + 
"): " + e.toString());
         }
-
-
-        // deal with <mail.*> attributes, passing them to javamail
-        Iterator<String> i = getInitParameterNames();
-        while (i.hasNext()) {
-            String name = i.next();
-            if (name.startsWith("mail.")) {
-                defprops.put(name, getInitParameter(name));
-            }
-
-        }
-
-        String dnsRetry = getInitParameter("maxDnsProblemRetries");
-        if (dnsRetry != null && !dnsRetry.equals("")) {
-            dnsProblemRetry = Integer.parseInt(dnsRetry);
-        }
-
-        heloNameProvider = new HeloNameProvider(getInitParameter("heloName"), 
domainList);
-
-        String prio = getInitParameter("usePriority");
-        if (prio != null) {
-            usePriority = Boolean.valueOf(prio);
-        }
-
-        // Start Workers Threads.
-        workersThreadCount = 
Integer.parseInt(getInitParameter("deliveryThreads"));
-        initDeliveryThreads();
     }
 
     private void initDeliveryThreads() {
-        for (int a = 0; a < workersThreadCount; a++) {
+        for (int a = 0; a < configuration.getWorkersThreadCount(); a++) {
             String threadName = "Remote delivery thread (" + a + ")";
             Thread t = new Thread(this, threadName);
             t.start();
@@ -393,10 +208,10 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
      * @return the next delay time to use, given the retry count
      */
     private long getNextDelay(int retry_count) {
-        if (retry_count > delayTimes.size()) {
+        if (retry_count > configuration.getDelayTimes().size()) {
             return Delay.DEFAULT_DELAY_TIME;
         }
-        return delayTimes.get(retry_count - 1);
+        return configuration.getDelayTimes().get(retry_count - 1);
     }
 
     @Override
@@ -416,17 +231,17 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
     @Override
     public void service(Mail mail) throws MessagingException {
         // Do I want to give the internal key, or the message's Message ID
-        if (isDebug) {
+        if (configuration.isDebug()) {
             log("Remotely delivering mail " + mail.getName());
         }
         Collection<MailAddress> recipients = mail.getRecipients();
 
-        if (usePriority) {
+        if (configuration.isUsePriority()) {
 
             // Use highest prio for new emails. See JAMES-1311
             mail.setAttribute(MailPrioritySupport.MAIL_PRIORITY, 
MailPrioritySupport.HIGH_PRIORITY);
         }
-        if (gatewayServer == null) {
+        if (configuration.getGatewayServer() == null) {
             // Must first organize the recipients into distinct servers (name
             // made case insensitive)
             Hashtable<String, Collection<MailAddress>> targets = new 
Hashtable<String, Collection<MailAddress>>();
@@ -449,7 +264,7 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
             // outgoing mail repository
             String name = mail.getName();
             for (Map.Entry<String, Collection<MailAddress>> entry : 
targets.entrySet()) {
-                if (isDebug) {
+                if (configuration.isDebug()) {
                     String logMessageBuffer = "Sending mail to " + 
entry.getValue() + " on host " + entry.getKey();
                     log(logMessageBuffer);
                 }
@@ -464,8 +279,8 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
             }
         } else {
             // Store the mail unaltered for processing by the gateway server(s)
-            if (isDebug) {
-                String logMessageBuffer = "Sending mail to " + 
mail.getRecipients() + " via " + gatewayServer;
+            if (configuration.isDebug()) {
+                String logMessageBuffer = "Sending mail to " + 
mail.getRecipients() + " via " + configuration.getGatewayServer();
                 log(logMessageBuffer);
             }
 
@@ -521,20 +336,20 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
         // messages created by an inputstream.
         props.setProperty("mail.smtp.allow8bitmime", "true");
         // Sets timeout on going connections
-        props.put("mail.smtp.timeout", smtpTimeout + "");
+        props.put("mail.smtp.timeout", configuration.getSmtpTimeout() + "");
 
-        props.put("mail.smtp.connectiontimeout", connectionTimeout + "");
-        props.put("mail.smtp.sendpartial", String.valueOf(sendPartial));
+        props.put("mail.smtp.connectiontimeout", 
configuration.getConnectionTimeout() + "");
+        props.put("mail.smtp.sendpartial", 
String.valueOf(configuration.isSendPartial()));
 
-        props.put("mail.smtp.localhost", heloNameProvider.getHeloName());
+        props.put("mail.smtp.localhost", 
configuration.getHeloNameProvider().getHeloName());
 
         // handle starttls
-        props.put("mail.smtp.starttls.enable", String.valueOf(startTLS));
+        props.put("mail.smtp.starttls.enable", 
String.valueOf(configuration.isStartTLS()));
 
         // handle SSLEnable
-        props.put("mail.smtp.ssl.enable", String.valueOf(isSSLEnable));
+        props.put("mail.smtp.ssl.enable", 
String.valueOf(configuration.isSSLEnable()));
 
-        if (isBindUsed) {
+        if (configuration.isBindUsed()) {
             // undocumented JavaMail 1.2 feature, smtp transport will use
             // our socket factory, which will also set the local address
             props.put("mail.smtp.socketFactory.class", 
RemoteDeliverySocketFactory.class.getClass());
@@ -543,11 +358,11 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
             props.put("mail.smtp.socketFactory.fallback", "false");
         }
 
-        if (authUser != null) {
+        if (configuration.getAuthUser() != null) {
             props.put("mail.smtp.auth", "true");
         }
 
-        props.putAll(defprops);
+        props.putAll(configuration.getJavaxAdditionalProperties());
 
         final Session session = obtainSession(props);
         try {
@@ -567,7 +382,7 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
                     String key = mail.getName();
 
                     try {
-                        if (isDebug) {
+                        if (configuration.isDebug()) {
                             String message = Thread.currentThread().getName() 
+ " will process mail " + key;
                             log(message);
                         }
@@ -593,7 +408,7 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
 
                             long delay = getNextDelay(retries);
 
-                            if (usePriority) {
+                            if (configuration.isUsePriority()) {
                                 // Use lowest priority for retries. See 
JAMES-1311
                                 
mail.setAttribute(MailPrioritySupport.MAIL_PRIORITY, 
MailPrioritySupport.LOW_PRIORITY);
                             }
@@ -657,7 +472,7 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
      */
     private boolean deliver(Mail mail, Session session) {
         try {
-            if (isDebug) {
+            if (configuration.isDebug()) {
                 log("Attempting to deliver " + mail.getName());
             }
             MimeMessage message = mail.getMessage();
@@ -679,7 +494,7 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
             // Figure out which servers to try to send to. This collection
             // will hold all the possible target servers
             Iterator<HostAddress> targetServers;
-            if (gatewayServer == null) {
+            if (configuration.getGatewayServer() == null) {
                 MailAddress rcpt = recipients.iterator().next();
                 String host = rcpt.getDomain();
 
@@ -703,7 +518,7 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
                     } catch (NumberFormatException e) {
                         // Unable to parse retryCount
                     }
-                    if (retry == 0 || retry > dnsProblemRetry) {
+                    if (retry == 0 || retry > 
configuration.getDnsProblemRetry()) {
                         // The domain has no dns entry.. Return a permanent
                         // error
                         return failMessage(mail, new 
MessagingException(exceptionBuffer), true);
@@ -712,7 +527,7 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
                     }
                 }
             } else {
-                targetServers = getGatewaySMTPHostAddresses(gatewayServer);
+                targetServers = 
getGatewaySMTPHostAddresses(configuration.getGatewayServer());
             }
 
             MessagingException lastError = null;
@@ -745,10 +560,10 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
                     SMTPTransport transport = null;
                     try {
                         transport =  (SMTPTransport) 
session.getTransport(outgoingMailServer);
-                        transport.setLocalHost( 
props.getProperty("mail.smtp.localhost", heloNameProvider.getHeloName()) );
+                        transport.setLocalHost( 
props.getProperty("mail.smtp.localhost", 
configuration.getHeloNameProvider().getHeloName()) );
                         try {
-                            if (authUser != null) {
-                                
transport.connect(outgoingMailServer.getHostName(), authUser, authPass);
+                            if (configuration.getAuthUser() != null) {
+                                
transport.connect(outgoingMailServer.getHostName(), 
configuration.getAuthUser(), configuration.getAuthPass());
                             } else {
                                 transport.connect();
                             }
@@ -762,7 +577,7 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
                             // failing the message at the end of the loop.
 
                             // Also include the stacktrace if debug is 
enabled. See JAMES-1257
-                            if (isDebug) {
+                            if (configuration.isDebug()) {
                                 log(me.getMessage(), me.getCause());
                             } else {
                                 log(me.getMessage());
@@ -868,7 +683,7 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
                     }
 
                     if (sfe.getValidUnsentAddresses() != null && 
sfe.getValidUnsentAddresses().length > 0) {
-                        if (isDebug)
+                        if (configuration.isDebug())
                             log("Send failed, " + 
sfe.getValidUnsentAddresses().length + " valid addresses remain, continuing 
with any other servers");
                         lastError = sfe;
                     } else {
@@ -967,7 +782,7 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
             }
 
             // log the original set of intended recipients
-            if (isDebug)
+            if (configuration.isDebug())
                 log("Recipients: " + recipients);
 
             if (sfe.getInvalidAddresses() != null) {
@@ -987,7 +802,7 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
                     // Set the recipients for the mail
                     mail.setRecipients(recipients);
 
-                    if (isDebug)
+                    if (configuration.isDebug())
                         log("Invalid recipients: " + recipients);
                     deleteMessage = failMessage(mail, sfe, true);
                 }
@@ -1009,7 +824,7 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
                     }
                     // Set the recipients for the mail
                     mail.setRecipients(recipients);
-                    if (isDebug)
+                    if (configuration.isDebug())
                         log("Unsent recipients: " + recipients);
                     if 
(sfe.getClass().getName().endsWith(".SMTPSendFailedException")) {
                         int returnCode = (Integer) invokeGetter(sfe, 
"getReturnCode");
@@ -1141,7 +956,7 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
      * JavaMail 1.3.2.
      */
     private void logSendFailedException(SendFailedException sfe) {
-        if (isDebug) {
+        if (configuration.isDebug()) {
             MessagingException me = sfe;
             if (me.getClass().getName().endsWith(".SMTPSendFailedException")) {
                 try {
@@ -1247,7 +1062,7 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
 
         logBuffer.append(": ");
         out.print(logBuffer.toString());
-        if (isDebug)
+        if (configuration.isDebug())
             ex.printStackTrace(out);
         log(sout.toString());
         if (!permanent) {
@@ -1264,7 +1079,7 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
                 // Something strange was happen with the errorMessage..
             }
 
-            if (retries < maxRetries) {
+            if (retries < configuration.getMaxRetries()) {
                 logBuffer = new StringBuilder(128).append("Storing message 
").append(mail.getName()).append(" into outgoing after 
").append(retries).append(" retries");
                 log(logBuffer.toString());
                 ++retries;
@@ -1282,7 +1097,7 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
             return true;
         }
 
-        if (bounceProcessor != null) {
+        if (configuration.getBounceProcessor() != null) {
             // do the new DSN bounce
             // setting attributes for DSN mailet
             String cause;
@@ -1292,7 +1107,7 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
                 cause = ex.getMessage();
             }
             mail.setAttribute("delivery-error", cause);
-            mail.setState(bounceProcessor);
+            mail.setState(configuration.getBounceProcessor());
             // re-insert the mail into the spool for getting it passed to the
             // dsn-processor
             MailetContext mc = getMailetContext();
@@ -1330,7 +1145,7 @@ public class RemoteDelivery extends GenericMailet 
implements Runnable {
         PrintWriter out = new PrintWriter(sout, true);
         String machine;
         try {
-            machine = heloNameProvider.getHeloName();
+            machine = configuration.getHeloNameProvider().getHeloName();
 
         } catch (Exception e) {
             machine = "[address unknown]";

http://git-wip-us.apache.org/repos/asf/james-project/blob/6fa52984/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/RemoteDeliveryConfiguration.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/RemoteDeliveryConfiguration.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/RemoteDeliveryConfiguration.java
new file mode 100644
index 0000000..621f3fe
--- /dev/null
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/RemoteDeliveryConfiguration.java
@@ -0,0 +1,288 @@
+/****************************************************************
+ * 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.remoteDelivery;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.james.domainlist.api.DomainList;
+import org.apache.mailet.MailetConfig;
+import org.apache.mailet.base.MailetUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+
+public class RemoteDeliveryConfiguration {
+
+    private final static Logger LOGGER = 
LoggerFactory.getLogger(RemoteDeliveryConfiguration.class);
+
+    public static final String DELIVERY_THREADS = "deliveryThreads";
+    public static final String USE_PRIORITY = "usePriority";
+    public static final String MAX_DNS_PROBLEM_RETRIES = 
"maxDnsProblemRetries";
+    public static final String HELO_NAME = "heloName";
+    public static final String JAVAX_PREFIX = "mail.";
+    public static final String BIND = "bind";
+    public static final String GATEWAY_PASSWORD = "gatewayPassword";
+    public static final String GATEWAY_USERNAME_COMPATIBILITY = 
"gatewayusername";
+    public static final String GATEWAY_USERNAME = "gatewayUsername";
+    public static final String GATEWAY_PORT = "gatewayPort";
+    public static final String GATEWAY = "gateway";
+    public static final String SSL_ENABLE = "sslEnable";
+    public static final String START_TLS = "startTLS";
+    public static final String BOUNCE_PROCESSOR = "bounceProcessor";
+    public static final String SENDPARTIAL = "sendpartial";
+    public static final String TIMEOUT = "timeout";
+    public static final String CONNECTIONTIMEOUT = "connectiontimeout";
+    public static final String OUTGOING = "outgoing";
+    public static final String MAX_RETRIES = "maxRetries";
+    public static final String DELAY_TIME = "delayTime";
+    public static final String DEBUG = "debug";
+    public static final int DEFAULT_SMTP_TIMEOUT = 180000;
+    public static final String DEFAULT_OUTGOING_QUEUE_NAME = "outgoing";
+    public static final int DEFAULT_CONNECTION_TIMEOUT = 60000;
+    public static final int DEFAULT_DNS_RETRY_PROBLEM = 0;
+    public static final int DEFAULT_MAX_RETRY = 5;
+    public static final String ADDRESS_PORT_SEPARATOR = ":";
+
+    private final boolean isDebug;
+    private final boolean usePriority;
+    private final boolean startTLS;
+    private final boolean isSSLEnable;
+    private final boolean isBindUsed;
+    private final boolean sendPartial;
+    private final int maxRetries;
+    private final long smtpTimeout;
+    private final int dnsProblemRetry;
+    private final int connectionTimeout;
+    private final int workersThreadCount;
+    private final List<Long> delayTimes;
+    private final HeloNameProvider heloNameProvider;
+    private final String outGoingQueueName;
+    private final String bindAddress;
+    private final String bounceProcessor;
+    private final Collection<String> gatewayServer;
+    private final String authUser;
+    private final String authPass;
+    private final Properties javaxAdditionalProperties;
+
+    public RemoteDeliveryConfiguration(MailetConfig mailetConfig, DomainList 
domainList) {
+        isDebug = MailetUtil.getInitParameter(mailetConfig, DEBUG).or(false);
+        startTLS = MailetUtil.getInitParameter(mailetConfig, 
START_TLS).or(false);
+        isSSLEnable = MailetUtil.getInitParameter(mailetConfig, 
SSL_ENABLE).or(false);
+        usePriority = MailetUtil.getInitParameter(mailetConfig, 
USE_PRIORITY).or(false);
+        sendPartial = MailetUtil.getInitParameter(mailetConfig, 
SENDPARTIAL).or(false);
+        outGoingQueueName = 
Optional.fromNullable(mailetConfig.getInitParameter(OUTGOING)).or(DEFAULT_OUTGOING_QUEUE_NAME);
+        bounceProcessor = mailetConfig.getInitParameter(BOUNCE_PROCESSOR);
+        bindAddress = mailetConfig.getInitParameter(BIND);
+
+        DelaysAndMaxRetry delaysAndMaxRetry = 
computeDelaysAndMaxRetry(mailetConfig);
+        maxRetries = delaysAndMaxRetry.getMaxRetries();
+        delayTimes = delaysAndMaxRetry.getExpendedDelays();
+        smtpTimeout = computeSmtpTimeout(mailetConfig);
+        connectionTimeout = computeConnectionTimeout(mailetConfig);
+        dnsProblemRetry = computeDnsProblemRetry(mailetConfig);
+        heloNameProvider = new 
HeloNameProvider(mailetConfig.getInitParameter(HELO_NAME), domainList);
+        workersThreadCount = 
Integer.valueOf(mailetConfig.getInitParameter(DELIVERY_THREADS));
+
+        String gatewayPort = mailetConfig.getInitParameter(GATEWAY_PORT);
+        String gateway = mailetConfig.getInitParameter(GATEWAY);
+        gatewayServer = computeGatewayServers(gatewayPort, gateway);
+        if (gateway != null) {
+            authUser = computeGatewayUser(mailetConfig);
+            authPass = mailetConfig.getInitParameter(GATEWAY_PASSWORD);
+        } else {
+            authUser = null;
+            authPass = null;
+        }
+        isBindUsed = bindAddress != null;
+        javaxAdditionalProperties = computeJavaxProperties(mailetConfig);
+    }
+
+    private Properties computeJavaxProperties(MailetConfig mailetConfig) {
+        Properties result = new Properties();
+        // deal with <mail.*> attributes, passing them to javamail
+        for (String propertyName : 
ImmutableList.copyOf(mailetConfig.getInitParameterNames())) {
+            if (propertyName.startsWith(JAVAX_PREFIX)) {
+                result.put(propertyName, 
mailetConfig.getInitParameter(propertyName));
+            }
+        }
+        return result;
+    }
+
+    private int computeDnsProblemRetry(MailetConfig mailetConfig) {
+        String dnsRetry = 
mailetConfig.getInitParameter(MAX_DNS_PROBLEM_RETRIES);
+        if (!Strings.isNullOrEmpty(dnsRetry)) {
+            return Integer.valueOf(dnsRetry);
+        } else {
+            return DEFAULT_DNS_RETRY_PROBLEM;
+        }
+    }
+
+    private int computeConnectionTimeout(MailetConfig mailetConfig) {
+        try {
+            return Integer.valueOf(
+                
Optional.fromNullable(mailetConfig.getInitParameter(CONNECTIONTIMEOUT))
+                    .or(String.valueOf(DEFAULT_CONNECTION_TIMEOUT)));
+        } catch (Exception e) {
+            LOGGER.warn("Invalid timeout setting: " + 
mailetConfig.getInitParameter(TIMEOUT));
+            return DEFAULT_CONNECTION_TIMEOUT;
+        }
+    }
+
+    private long computeSmtpTimeout(MailetConfig mailetConfig) {
+        try {
+            if (mailetConfig.getInitParameter(TIMEOUT) != null) {
+                return Integer.valueOf(mailetConfig.getInitParameter(TIMEOUT));
+            } else {
+                return DEFAULT_SMTP_TIMEOUT;
+            }
+        } catch (Exception e) {
+            LOGGER.warn("Invalid timeout setting: " + 
mailetConfig.getInitParameter(TIMEOUT));
+            return DEFAULT_SMTP_TIMEOUT;
+        }
+    }
+
+    private DelaysAndMaxRetry computeDelaysAndMaxRetry(MailetConfig 
mailetConfig) {
+        try {
+            int intendedMaxRetries = Integer.valueOf(
+                
Optional.fromNullable(mailetConfig.getInitParameter(MAX_RETRIES))
+                    .or(String.valueOf(DEFAULT_MAX_RETRY)));
+            return DelaysAndMaxRetry.from(intendedMaxRetries, 
mailetConfig.getInitParameter(DELAY_TIME));
+        } catch (Exception e) {
+            LOGGER.warn("Invalid maxRetries setting: " + 
mailetConfig.getInitParameter(MAX_RETRIES));
+            return DelaysAndMaxRetry.defaults();
+        }
+    }
+
+    private String computeGatewayUser(MailetConfig mailetConfig) {
+        // backward compatibility with 2.3.x
+        String user = mailetConfig.getInitParameter(GATEWAY_USERNAME);
+        if (user == null) {
+            return 
mailetConfig.getInitParameter(GATEWAY_USERNAME_COMPATIBILITY);
+        }
+        return user;
+    }
+
+    private List<String> computeGatewayServers(String gatewayPort, String 
gateway) {
+        if (gateway != null) {
+            ImmutableList.Builder<String> builder = ImmutableList.builder();
+            Iterable<String> gatewayParts = Splitter.on(',').split(gateway);
+            for(String gatewayPart : gatewayParts) {
+                builder.add(parsePart(gatewayPort, gatewayPart));
+            }
+            return builder.build();
+        } else {
+            return ImmutableList.of();
+        }
+    }
+
+    private String parsePart(String gatewayPort, String gatewayPart) {
+        String address = gatewayPart.trim();
+        if (address.contains(ADDRESS_PORT_SEPARATOR) && gatewayPort != null) {
+            return address + ADDRESS_PORT_SEPARATOR + gatewayPort;
+        }
+        return address;
+    }
+
+    public boolean isDebug() {
+        return isDebug;
+    }
+
+    public List<Long> getDelayTimes() {
+        return delayTimes;
+    }
+
+    public int getMaxRetries() {
+        return maxRetries;
+    }
+
+    public long getSmtpTimeout() {
+        return smtpTimeout;
+    }
+
+    public boolean isSendPartial() {
+        return sendPartial;
+    }
+
+    public int getConnectionTimeout() {
+        return connectionTimeout;
+    }
+
+    public int getWorkersThreadCount() {
+        return workersThreadCount;
+    }
+
+    public Collection<String> getGatewayServer() {
+        return gatewayServer;
+    }
+
+    public String getAuthUser() {
+        return authUser;
+    }
+
+    public String getAuthPass() {
+        return authPass;
+    }
+
+    public boolean isBindUsed() {
+        return isBindUsed;
+    }
+
+    public String getBounceProcessor() {
+        return bounceProcessor;
+    }
+
+    public boolean isUsePriority() {
+        return usePriority;
+    }
+
+    public boolean isStartTLS() {
+        return startTLS;
+    }
+
+    public boolean isSSLEnable() {
+        return isSSLEnable;
+    }
+
+    public HeloNameProvider getHeloNameProvider() {
+        return heloNameProvider;
+    }
+
+    public String getOutGoingQueueName() {
+        return outGoingQueueName;
+    }
+
+    public Properties getJavaxAdditionalProperties() {
+        return javaxAdditionalProperties;
+    }
+
+    public int getDnsProblemRetry() {
+        return dnsProblemRetry;
+    }
+
+    public String getBindAddress() {
+        return bindAddress;
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/6fa52984/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/Repeat.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/Repeat.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/Repeat.java
index 0252214..19682b1 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/Repeat.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/Repeat.java
@@ -28,7 +28,7 @@ import com.google.common.collect.Iterables;
 public class Repeat {
 
     public static <T> List<T> repeat(T element, int times) {
-        Preconditions.checkArgument(times > 0, "Times argument should be 
strictly positive");
+        Preconditions.checkArgument(times >= 0, "Times argument should be 
strictly positive");
         return ImmutableList.copyOf(
             Iterables.limit(
                 Iterables.cycle(element), times));

http://git-wip-us.apache.org/repos/asf/james-project/blob/6fa52984/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/RemoteDeliveryConfigurationTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/RemoteDeliveryConfigurationTest.java
 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/RemoteDeliveryConfigurationTest.java
new file mode 100644
index 0000000..ec4e23f
--- /dev/null
+++ 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/RemoteDeliveryConfigurationTest.java
@@ -0,0 +1,911 @@
+/****************************************************************
+ * 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.remoteDelivery;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Properties;
+
+import org.apache.james.domainlist.api.DomainList;
+import org.apache.mailet.base.test.FakeMailetConfig;
+import org.assertj.core.data.MapEntry;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class RemoteDeliveryConfigurationTest {
+
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    @Test
+    public void isDebugShouldBeFalseByDefault() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).isDebug()).isFalse();
+    }
+
+    @Test
+    public void isDebugShouldBeTrueIfSpecified() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.DEBUG, "true")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).isDebug()).isTrue();
+    }
+
+    @Test
+    public void isDebugShouldBeFalseIfSpecified() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.DEBUG, "false")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).isDebug()).isFalse();
+    }
+
+    @Test
+    public void isDebugShouldBeFalseIfParsingException() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.DEBUG, "invalid")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).isDebug()).isFalse();
+    }
+
+    @Test
+    public void getSmtpTimeoutShouldReturnDefault() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getSmtpTimeout())
+            .isEqualTo(RemoteDeliveryConfiguration.DEFAULT_SMTP_TIMEOUT);
+    }
+
+    @Test
+    public void getSmtpTimeoutShouldReturnProvidedValue() {
+        int value = 150000;
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.TIMEOUT, 
String.valueOf(value))
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getSmtpTimeout())
+            .isEqualTo(value);
+    }
+
+    @Test
+    public void getSmtpTimeoutShouldReturnDefaultIfParsingException() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.TIMEOUT, "invalid")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getSmtpTimeout())
+            .isEqualTo(RemoteDeliveryConfiguration.DEFAULT_SMTP_TIMEOUT);
+    }
+
+    @Test
+    public void getSmtpTimeoutShouldReturnProvidedValueWhenZero() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.TIMEOUT, "0")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getSmtpTimeout())
+            .isEqualTo(0);
+    }
+
+    @Test
+    public void getSmtpTimeoutShouldReturnProvidedValueWhenNegativeNumber() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.TIMEOUT, "-1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getSmtpTimeout())
+            .isEqualTo(-1);
+    }
+
+    @Test
+    public void getOutGoingQueueNameShouldReturnDefault() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getOutGoingQueueName())
+            
.isEqualTo(RemoteDeliveryConfiguration.DEFAULT_OUTGOING_QUEUE_NAME);
+    }
+
+    @Test
+    public void getOutGoingQueueNameShouldReturnProvidedValue() {
+        String value = "value";
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.OUTGOING, value)
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getOutGoingQueueName())
+            .isEqualTo(value);
+    }
+
+    @Test
+    public void getConnectionTimeoutShouldReturnDefault() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getConnectionTimeout())
+            .isEqualTo(RemoteDeliveryConfiguration.DEFAULT_CONNECTION_TIMEOUT);
+    }
+
+    @Test
+    public void getConnectionTimeoutShouldReturnProvidedValue() {
+        int value = 150000;
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.CONNECTIONTIMEOUT, 
String.valueOf(value))
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getConnectionTimeout())
+            .isEqualTo(value);
+    }
+
+    @Test
+    public void getConnectionTimeoutShouldReturnDefaultIfParsingException() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.CONNECTIONTIMEOUT, 
"invalid")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getConnectionTimeout())
+            .isEqualTo(RemoteDeliveryConfiguration.DEFAULT_CONNECTION_TIMEOUT);
+    }
+
+    @Test
+    public void getConnectionTimeoutShouldReturnProvidedValueWhenZero() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.CONNECTIONTIMEOUT, "0")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getConnectionTimeout())
+            .isEqualTo(0);
+    }
+
+    @Test
+    public void 
getConnectionTimeoutShouldReturnProvidedValueWhenNegativeNumber() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.CONNECTIONTIMEOUT, "-1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getConnectionTimeout())
+            .isEqualTo(-1);
+    }
+
+    @Test
+    public void isSendPartialShouldBeFalseByDefault() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).isSendPartial()).isFalse();
+    }
+
+    @Test
+    public void isSendPartialShouldBeTrueIfSpecified() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.SENDPARTIAL, "true")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).isSendPartial()).isTrue();
+    }
+
+    @Test
+    public void isSendPartialShouldBeFalseIfSpecified() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.SENDPARTIAL, "false")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).isSendPartial()).isFalse();
+    }
+
+    @Test
+    public void isSendPartialShouldBeFalseIfParsingException() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.SENDPARTIAL, "invalid")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).isSendPartial()).isFalse();
+    }
+
+    @Test
+    public void getBounceProcessorShouldReturnNullByDefault() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getBounceProcessor())
+            .isNull();
+    }
+
+    @Test
+    public void getBounceProcessorShouldReturnProvidedValue() {
+        String value = "value";
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.BOUNCE_PROCESSOR, value)
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getBounceProcessor())
+            .isEqualTo(value);
+    }
+
+    @Test
+    public void isStartTLSShouldBeFalseByDefault() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).isStartTLS()).isFalse();
+    }
+
+    @Test
+    public void isStartTLSShouldBeTrueIfSpecified() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.START_TLS, "true")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).isStartTLS()).isTrue();
+    }
+
+    @Test
+    public void isStartTLSShouldBeFalseIfSpecified() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.START_TLS, "false")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).isStartTLS()).isFalse();
+    }
+
+    @Test
+    public void isStartTLSShouldBeFalseIfParsingException() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.START_TLS, "invalid")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).isStartTLS()).isFalse();
+    }
+
+    @Test
+    public void isSSLEnableShouldBeFalseByDefault() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).isSSLEnable()).isFalse();
+    }
+
+    @Test
+    public void isSSLEnableShouldBeTrueIfSpecified() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.SSL_ENABLE, "true")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).isSSLEnable()).isTrue();
+    }
+
+    @Test
+    public void isSSLEnableShouldBeFalseIfSpecified() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.SSL_ENABLE, "false")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).isSSLEnable()).isFalse();
+    }
+
+    @Test
+    public void isSSLEnableShouldBeFalseIfParsingException() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.SSL_ENABLE, "invalid")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).isSSLEnable()).isFalse();
+    }
+
+    @Test
+    public void isBindUsedShouldBeFalseByDefault() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.BIND, "127.0.0.1:25")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).isBindUsed()).isTrue();
+    }
+
+    @Test
+    public void getBindAddressShouldBeNullByDefault() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getBindAddress()).isNull();
+    }
+
+    @Test
+    public void getBindAddressShouldReturnProvidedValue() {
+        String value = "127.0.0.1:25";
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.BIND, value)
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getBindAddress()).isEqualTo(value);
+    }
+
+    @Test
+    public void getDnsProblemRetryShouldReturnDefault() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getDnsProblemRetry())
+            .isEqualTo(RemoteDeliveryConfiguration.DEFAULT_DNS_RETRY_PROBLEM);
+    }
+
+    @Test
+    public void getDnsProblemRetryShouldReturnProvidedValue() {
+        int value = 4;
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.MAX_DNS_PROBLEM_RETRIES, 
String.valueOf(value))
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getDnsProblemRetry())
+            .isEqualTo(value);
+    }
+
+    @Test
+    public void constructorShouldThrowOnInvalidDnsRetries() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.MAX_DNS_PROBLEM_RETRIES, 
"invalid")
+            .build();
+
+        expectedException.expect(NumberFormatException.class);
+
+        new RemoteDeliveryConfiguration(mailetConfig, mock(DomainList.class));
+    }
+
+    @Test
+    public void getDnsProblemRetryShouldReturnProvidedValueWhenZero() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.MAX_DNS_PROBLEM_RETRIES, 
"0")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getDnsProblemRetry())
+            .isEqualTo(0);
+    }
+
+    @Test
+    public void getDnsProblemRetryShouldReturnProvidedValueWhenEmpty() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.MAX_DNS_PROBLEM_RETRIES, 
"")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getDnsProblemRetry())
+            .isEqualTo(0);
+    }
+
+    @Test
+    public void 
getDnsProblemRetryShouldReturnProvidedValueWhenNegativeNumber() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.MAX_DNS_PROBLEM_RETRIES, 
"-1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getDnsProblemRetry())
+            .isEqualTo(-1);
+    }
+
+    @Test
+    public void constructorShouldThrowOnNonSpecifiedThreadCount() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .build();
+
+        expectedException.expect(NumberFormatException.class);
+
+        new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getWorkersThreadCount();
+    }
+
+    @Test
+    public void getWorkersThreadCountShouldReturnProvidedValue() {
+        int value = 36;
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, 
String.valueOf(value))
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getWorkersThreadCount())
+            .isEqualTo(value);
+    }
+
+    @Test
+    public void constructorShouldThrowOnInvalidThreadCount() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, 
"invalid")
+            .build();
+
+        expectedException.expect(NumberFormatException.class);
+
+        new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getWorkersThreadCount();
+    }
+
+    @Test
+    public void isUsePriorityShouldBeFalseByDefault() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).isUsePriority()).isFalse();
+    }
+
+    @Test
+    public void isUsePriorityShouldBeTrueIfSpecified() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.USE_PRIORITY, "true")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).isUsePriority()).isTrue();
+    }
+
+    @Test
+    public void isUsePriorityShouldBeFalseIfSpecified() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.USE_PRIORITY, "false")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).isUsePriority()).isFalse();
+    }
+
+    @Test
+    public void isUsePriorityShouldBeFalseIfParsingException() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.USE_PRIORITY, "invalid")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).isUsePriority()).isFalse();
+    }
+
+    @Test
+    public void getHeloNameProviderShouldCallDomainListByDefault() throws 
Exception {
+        DomainList domainList = mock(DomainList.class);
+        String value = "value";
+        when(domainList.getDefaultDomain()).thenReturn(value);
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
domainList).getHeloNameProvider().getHeloName())
+            .isEqualTo(value);
+    }
+
+    @Test
+    public void getHeloNameProviderShouldTakeCareOfProvidedValue() {
+        String value = "value";
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.HELO_NAME, value)
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getHeloNameProvider().getHeloName())
+            .isEqualTo(value);
+    }
+
+    @Test
+    public void getJavaxAdditionalPropertiesShouldBeEmptyByDefault() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getJavaxAdditionalProperties())
+            .isEmpty();
+    }
+
+    @Test
+    public void getJavaxAdditionalPropertiesShouldTakeOneEntryIntoAccount() {
+        String key1 = RemoteDeliveryConfiguration.JAVAX_PREFIX + "property1";
+        String value1 = "value1";
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(key1, value1)
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getJavaxAdditionalProperties())
+            .containsOnly(MapEntry.entry(key1, value1));
+    }
+
+    @Test
+    public void getJavaxAdditionalPropertiesShouldTakeTwoEntriesIntoAccount() {
+        String key1 = RemoteDeliveryConfiguration.JAVAX_PREFIX + "property1";
+        String value1 = "value1";
+        String key2 = RemoteDeliveryConfiguration.JAVAX_PREFIX + "property2";
+        String value2 = "value2";
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(key1, value1)
+            .setProperty(key2, value2)
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getJavaxAdditionalProperties())
+            .containsOnly(MapEntry.entry(key1, value1), MapEntry.entry(key2, 
value2));
+    }
+
+    @Test
+    public void constructorShouldThrowOnNullValueJavaxProperty() {
+        expectedException.expect(NullPointerException.class);
+
+        String key1 = RemoteDeliveryConfiguration.JAVAX_PREFIX + "property1";
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(key1, null)
+            .build();
+
+        new RemoteDeliveryConfiguration(mailetConfig, mock(DomainList.class));
+    }
+
+    @Test
+    public void 
getJavaxAdditionalPropertiesShouldTakeOneEmptyEntryIntoAccount() {
+        String key1 = RemoteDeliveryConfiguration.JAVAX_PREFIX + "property1";
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(key1, "")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getJavaxAdditionalProperties())
+            .containsOnly(MapEntry.entry(key1, ""));
+    }
+
+    @Test
+    public void getGatewayServerShouldBeNullByDefault() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getGatewayServer()).isEmpty();
+    }
+
+    @Test
+    public void getGatewayServerShouldReturnProvidedValue() {
+        String value = "127.0.0.1";
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.GATEWAY, value)
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getGatewayServer())
+            .containsOnly(value);
+    }
+
+    @Test
+    public void getGatewayServerShouldReturnProvidedValues() {
+        String value1 = "127.0.0.1";
+        String value2 = "domain";
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.GATEWAY, value1 + ',' + 
value2)
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getGatewayServer())
+            .containsOnly(value1, value2);
+    }
+
+    @Test
+    public void getAuthUserShouldBeNullByDefault() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getAuthUser()).isNull();
+    }
+
+    @Test
+    public void getAuthUserShouldBeNullWhenGatewayIsNotSpecified() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.GATEWAY_USERNAME, "name")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getAuthUser()).isNull();
+    }
+
+    @Test
+    public void getAuthUserShouldReturnSpecifiedValueWhenGatewaySpecified() {
+        String value = "name";
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.GATEWAY_USERNAME, value)
+            .setProperty(RemoteDeliveryConfiguration.GATEWAY, "127.0.0.1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getAuthUser()).isEqualTo(value);
+    }
+
+    @Test
+    public void 
getAuthUserShouldReturnSpecifiedEmptyValueWhenGatewaySpecified() {
+        String value = "";
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.GATEWAY_USERNAME, value)
+            .setProperty(RemoteDeliveryConfiguration.GATEWAY, "127.0.0.1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getAuthUser()).isEqualTo(value);
+    }
+
+    @Test
+    public void 
getAuthUserShouldReturnSpecifiedCompatibilityValueWhenGatewaySpecified() {
+        String value = "name";
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            
.setProperty(RemoteDeliveryConfiguration.GATEWAY_USERNAME_COMPATIBILITY, value)
+            .setProperty(RemoteDeliveryConfiguration.GATEWAY, "127.0.0.1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getAuthUser()).isEqualTo(value);
+    }
+
+    @Test
+    public void 
getAuthUserShouldReturnSpecifiedEmptyCompatibilityValueWhenGatewaySpecified() {
+        String value = "";
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            
.setProperty(RemoteDeliveryConfiguration.GATEWAY_USERNAME_COMPATIBILITY, value)
+            .setProperty(RemoteDeliveryConfiguration.GATEWAY, "127.0.0.1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getAuthUser()).isEqualTo(value);
+    }
+
+    @Test
+    public void 
getAuthUserShouldReturnSpecifiedValueWhenValueAndCompatibilitySpecified() {
+        String value = "name";
+        String compatibilityValue = "compatibilityValue";
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.GATEWAY_USERNAME, value)
+            
.setProperty(RemoteDeliveryConfiguration.GATEWAY_USERNAME_COMPATIBILITY, 
compatibilityValue)
+            .setProperty(RemoteDeliveryConfiguration.GATEWAY, "127.0.0.1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getAuthUser()).isEqualTo(value);
+    }
+
+    @Test
+    public void getAuthPassShouldBeNullByDefault() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getAuthPass()).isNull();
+    }
+
+    @Test
+    public void getAuthPassShouldBeNullWhenGatewayIsNotSpecified() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.GATEWAY_PASSWORD, "name")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getAuthPass()).isNull();
+    }
+
+    @Test
+    public void getAuthPassShouldReturnSpecifiedValueWhenGatewaySpecified() {
+        String value = "name";
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.GATEWAY_PASSWORD, value)
+            .setProperty(RemoteDeliveryConfiguration.GATEWAY, "127.0.0.1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getAuthPass()).isEqualTo(value);
+    }
+
+    @Test
+    public void 
getAuthPassShouldReturnSpecifiedEmptyValueWhenGatewaySpecified() {
+        String value = "";
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.GATEWAY_PASSWORD, value)
+            .setProperty(RemoteDeliveryConfiguration.GATEWAY, "127.0.0.1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getAuthPass()).isEqualTo(value);
+    }
+
+    @Test
+    public void getMaxRetriesShouldReturnProvidedValue() {
+        int value = 36;
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.MAX_RETRIES, 
String.valueOf(value))
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getMaxRetries()).isEqualTo(value);
+    }
+
+    @Test
+    public void getMaxRetriesShouldReturnOneWhenZero() {
+        int value = 0;
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.MAX_RETRIES, 
String.valueOf(value))
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getMaxRetries()).isEqualTo(1);
+    }
+
+    @Test
+    public void getMaxRetriesShouldReturnOneWhenNegativeNumber() {
+        int value = -1;
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.MAX_RETRIES, 
String.valueOf(value))
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getMaxRetries()).isEqualTo(1);
+    }
+
+    @Test
+    public void getMaxRetriesShouldReturnDefaultWhenNoySpecified() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getMaxRetries())
+            .isEqualTo(RemoteDeliveryConfiguration.DEFAULT_MAX_RETRY);
+    }
+
+    @Test
+    public void getDelayTimesShouldReturnDefault() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getDelayTimes())
+            .containsOnly(Delay.DEFAULT_DELAY_TIME, Delay.DEFAULT_DELAY_TIME, 
Delay.DEFAULT_DELAY_TIME, Delay.DEFAULT_DELAY_TIME, Delay.DEFAULT_DELAY_TIME);
+    }
+
+    @Test
+    public void getDelayTimesShouldWorkWithDefaultConfiguration() {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.DELAY_TIME, "5000, 
100000, 500000")
+            .build();
+
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).getDelayTimes())
+            .containsOnly(5000L, 100000L, 500000L);
+    }
+
+    @Test
+    public void 
createFinalJavaxPropertiesShouldProvidePropertiesWithMinimalConfiguration() {
+        String helo = "domain.com";
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.HELO_NAME, helo)
+            .build();
+
+        Properties properties = new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).createFinalJavaxProperties();
+
+
+        assertThat(properties)
+            .containsOnly(MapEntry.entry("mail.smtp.ssl.enable", "false"),
+                MapEntry.entry("mail.smtp.sendpartial", "false"),
+                MapEntry.entry("mail.smtp.allow8bitmime", "true"),
+                MapEntry.entry("mail.smtp.ehlo", "true"),
+                MapEntry.entry("mail.smtp.connectiontimeout", "60000"),
+                MapEntry.entry("mail.smtp.localhost", helo),
+                MapEntry.entry("mail.smtp.timeout", "180000"),
+                MapEntry.entry("mail.debug", "false"),
+                MapEntry.entry("mail.smtp.starttls.enable", "false"));
+    }
+
+    @Test
+    public void 
createFinalJavaxPropertiesShouldProvidePropertiesWithFullConfigurationWithoutGateway()
 {
+        String helo = "domain.com";
+        int connectionTimeout = 1856;
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.SSL_ENABLE, "true")
+            .setProperty(RemoteDeliveryConfiguration.SENDPARTIAL, "true")
+            .setProperty(RemoteDeliveryConfiguration.CONNECTIONTIMEOUT, 
String.valueOf(connectionTimeout))
+            .setProperty(RemoteDeliveryConfiguration.START_TLS, "true")
+            .setProperty(RemoteDeliveryConfiguration.HELO_NAME, helo)
+            .build();
+
+        Properties properties = new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).createFinalJavaxProperties();
+
+
+        assertThat(properties)
+            .containsOnly(MapEntry.entry("mail.smtp.ssl.enable", "true"),
+                MapEntry.entry("mail.smtp.sendpartial", "true"),
+                MapEntry.entry("mail.smtp.allow8bitmime", "true"),
+                MapEntry.entry("mail.smtp.ehlo", "true"),
+                MapEntry.entry("mail.smtp.connectiontimeout", 
String.valueOf(connectionTimeout)),
+                MapEntry.entry("mail.smtp.localhost", helo),
+                MapEntry.entry("mail.smtp.timeout", "180000"),
+                MapEntry.entry("mail.debug", "false"),
+                MapEntry.entry("mail.smtp.starttls.enable", "true"));
+    }
+
+    @Test
+    public void 
createFinalJavaxPropertiesShouldProvidePropertiesWithFullConfigurationWithGateway()
 {
+        String helo = "domain.com";
+        int connectionTimeout = 1856;
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+            .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+            .setProperty(RemoteDeliveryConfiguration.SSL_ENABLE, "true")
+            .setProperty(RemoteDeliveryConfiguration.SENDPARTIAL, "true")
+            .setProperty(RemoteDeliveryConfiguration.CONNECTIONTIMEOUT, 
String.valueOf(connectionTimeout))
+            .setProperty(RemoteDeliveryConfiguration.START_TLS, "true")
+            .setProperty(RemoteDeliveryConfiguration.HELO_NAME, helo)
+            .setProperty(RemoteDeliveryConfiguration.GATEWAY, 
"gateway.domain.com")
+            .setProperty(RemoteDeliveryConfiguration.GATEWAY_USERNAME, "user")
+            .setProperty(RemoteDeliveryConfiguration.GATEWAY_PASSWORD, 
"password")
+            .build();
+
+        Properties properties = new RemoteDeliveryConfiguration(mailetConfig, 
mock(DomainList.class)).createFinalJavaxProperties();
+
+
+        assertThat(properties)
+            .containsOnly(MapEntry.entry("mail.smtp.ssl.enable", "true"),
+                MapEntry.entry("mail.smtp.sendpartial", "true"),
+                MapEntry.entry("mail.smtp.allow8bitmime", "true"),
+                MapEntry.entry("mail.smtp.ehlo", "true"),
+                MapEntry.entry("mail.smtp.connectiontimeout", 
String.valueOf(connectionTimeout)),
+                MapEntry.entry("mail.smtp.localhost", helo),
+                MapEntry.entry("mail.smtp.timeout", "180000"),
+                MapEntry.entry("mail.debug", "false"),
+                MapEntry.entry("mail.smtp.starttls.enable", "true"),
+                MapEntry.entry("mail.smtp.auth", "true"));
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/6fa52984/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/RepeatTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/RepeatTest.java
 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/RepeatTest.java
index 13b9968..4ea1640 100644
--- 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/RepeatTest.java
+++ 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/RepeatTest.java
@@ -39,10 +39,8 @@ public class RepeatTest {
     }
 
     @Test
-    public void repeatShouldThrowOnZeroTimes() {
-        expectedException.expect(IllegalArgumentException.class);
-
-        Repeat.repeat(new Object(), 0);
+    public void repeatShouldReturnEmptyListOnZeroTimes() {
+        assertThat(Repeat.repeat(new Object(), 0)).isEmpty();
     }
 
     @Test


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

Reply via email to