You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ro...@apache.org on 2017/01/10 14:19:01 UTC
[46/50] [abbrv] james-project git commit: JAMES-1877 Provide tests
for DNS error handling
JAMES-1877 Provide tests for DNS error handling
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/9898e18e
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/9898e18e
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/9898e18e
Branch: refs/heads/master
Commit: 9898e18e475c7a672ba8e88c8fa4c1504d3c2531
Parents: 70ad233
Author: Benoit Tellier <bt...@linagora.com>
Authored: Wed Dec 7 10:53:01 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Tue Jan 10 18:14:27 2017 +0700
----------------------------------------------------------------------
.../mailets/remoteDelivery/MailDelivrer.java | 33 +++---
.../remoteDelivery/MailDelivrerTest.java | 109 ++++++++++++++++++-
2 files changed, 119 insertions(+), 23 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/9898e18e/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/MailDelivrer.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/MailDelivrer.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/MailDelivrer.java
index e6f1ec3..27f66aa 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/MailDelivrer.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/MailDelivrer.java
@@ -49,11 +49,16 @@ public class MailDelivrer {
private final Logger logger;
public MailDelivrer(RemoteDeliveryConfiguration configuration, MailDelivrerToHost mailDelivrerToHost, DNSService dnsServer, Bouncer bouncer, Logger logger) {
+ this(configuration, mailDelivrerToHost, new DnsHelper(dnsServer, configuration, logger), bouncer, logger);
+ }
+
+ @VisibleForTesting
+ MailDelivrer(RemoteDeliveryConfiguration configuration, MailDelivrerToHost mailDelivrerToHost, DnsHelper dnsHelper, Bouncer bouncer, Logger logger) {
this.configuration = configuration;
this.mailDelivrerToHost = mailDelivrerToHost;
- this.bouncer = bouncer;
- this.dnsHelper = new DnsHelper(dnsServer, configuration, logger);
+ this.dnsHelper = dnsHelper;
this.messageComposer = new MessageComposer(configuration);
+ this.bouncer = bouncer;
this.logger = logger;
}
@@ -116,7 +121,8 @@ public class MailDelivrer {
}
return doDeliver(mail, mail.getMessage(), InternetAddressConverter.convert(mail.getRecipients()), targetServers);
} catch (TemporaryResolutionException e) {
- return handleTemporaryResolutionException(mail, host);
+ return logAndReturn(mail, ExecutionResult.temporaryFailure(new MessagingException("Temporary problem looking " +
+ "up mail server for host: " + host + ". I cannot determine where to send this message.")));
}
}
@@ -252,28 +258,15 @@ public class MailDelivrer {
}
}
- private ExecutionResult handleTemporaryResolutionException(Mail mail, String host) {
- ExecutionResult executionResult = ExecutionResult.temporaryFailure(new MessagingException("Temporary problem looking " +
- "up mail server for host: " + host + ". I cannot determine where to send this message."));
- logger.debug(messageComposer.composeFailLogMessage(mail, executionResult));
- return executionResult;
- }
-
private ExecutionResult handleNoTargetServer(Mail mail, String host) {
logger.info("No mail server found for: " + host);
- String exceptionBuffer = "There are no DNS entries for the hostname " + host + ". I cannot determine where to send this message.";
-
- MessagingException messagingException = new MessagingException(exceptionBuffer);
+ MessagingException messagingException = new MessagingException("There are no DNS entries for the hostname " + host + ". I cannot determine where to send this message.");
int retry = DeliveryRetriesHelper.retrieveRetries(mail);
+ System.out.println("retyry " + retry);
if (retry == 0 || retry > configuration.getDnsProblemRetry()) {
- // The domain has no dns entry.. Return a permanent error
- ExecutionResult executionResult = ExecutionResult.permanentFailure(messagingException);
- logger.debug(messageComposer.composeFailLogMessage(mail, executionResult));
- return executionResult;
+ return logAndReturn(mail, ExecutionResult.permanentFailure(messagingException));
} else {
- ExecutionResult executionResult = ExecutionResult.temporaryFailure(messagingException);
- logger.debug(messageComposer.composeFailLogMessage(mail, executionResult));
- return executionResult;
+ return logAndReturn(mail, ExecutionResult.temporaryFailure(messagingException));
}
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/9898e18e/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/MailDelivrerTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/MailDelivrerTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/MailDelivrerTest.java
index 477d945..27de817 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/MailDelivrerTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/MailDelivrerTest.java
@@ -19,24 +19,31 @@
package org.apache.james.transport.mailets.remoteDelivery;
-import static org.mockito.Mockito.mock;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
import javax.mail.Address;
import javax.mail.SendFailedException;
import javax.mail.internet.InternetAddress;
-import org.apache.james.dnsservice.api.DNSService;
+import org.apache.james.dnsservice.api.TemporaryResolutionException;
+import org.apache.james.domainlist.api.DomainList;
+import org.apache.mailet.HostAddress;
import org.apache.mailet.Mail;
import org.apache.mailet.base.MailAddressFixture;
import org.apache.mailet.base.test.FakeMail;
+import org.apache.mailet.base.test.FakeMailetConfig;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.UnmodifiableIterator;
import com.sun.mail.smtp.SMTPSenderFailedException;
public class MailDelivrerTest {
@@ -44,11 +51,13 @@ public class MailDelivrerTest {
private MailDelivrer testee;
private Bouncer bouncer;
+ private DnsHelper dnsHelper;
@Before
public void setUp() {
bouncer = mock(Bouncer.class);
- testee = new MailDelivrer(mock(RemoteDeliveryConfiguration.class), mock(MailDelivrerToHost.class), mock(DNSService.class), bouncer, LOGGER);
+ dnsHelper = mock(DnsHelper.class);
+ testee = new MailDelivrer(mock(RemoteDeliveryConfiguration.class), mock(MailDelivrerToHost.class), dnsHelper, bouncer, LOGGER);
}
@Test
@@ -200,4 +209,98 @@ public class MailDelivrerTest {
verify(bouncer).bounce(mail, sfe);
verifyNoMoreInteractions(bouncer);
}
+
+ @Test
+ public void deliverShouldReturnTemporaryFailureOnTemporaryResolutionException() throws Exception {
+ Mail mail = FakeMail.builder().recipients(MailAddressFixture.ANY_AT_JAMES, MailAddressFixture.OTHER_AT_JAMES).build();
+
+ when(dnsHelper.retrieveHostAddressIterator(MailAddressFixture.JAMES_APACHE_ORG)).thenThrow(new TemporaryResolutionException());
+
+ ExecutionResult executionResult = testee.deliver(mail);
+
+ assertThat(executionResult.getExecutionState()).isEqualTo(ExecutionResult.ExecutionState.TEMPORARY_FAILURE);
+ }
+
+ @SuppressWarnings("deprecation")
+ @Test
+ @Ignore("Fails if first delivery attempt")
+ public void deliverShouldReturnTemporaryErrorWhenFirstDNSProblem() throws Exception {
+ Mail mail = FakeMail.builder().recipients(MailAddressFixture.ANY_AT_JAMES, MailAddressFixture.OTHER_AT_JAMES).build();
+ FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+ .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+ .setProperty(RemoteDeliveryConfiguration.MAX_DNS_PROBLEM_RETRIES, "3")
+ .build();
+ testee = new MailDelivrer(new RemoteDeliveryConfiguration(mailetConfig, mock(DomainList.class)), mock(MailDelivrerToHost.class), dnsHelper, bouncer, LOGGER);
+
+ UnmodifiableIterator<HostAddress> empty = ImmutableList.<HostAddress>of().iterator();
+ when(dnsHelper.retrieveHostAddressIterator(MailAddressFixture.JAMES_APACHE_ORG)).thenReturn(empty);
+
+ ExecutionResult executionResult = testee.deliver(mail);
+
+ assertThat(executionResult.getExecutionState()).isEqualTo(ExecutionResult.ExecutionState.TEMPORARY_FAILURE);
+ }
+
+ @SuppressWarnings("deprecation")
+ @Test
+ public void deliverShouldReturnTemporaryErrorWhenToleratedDNSProblem() throws Exception {
+ Mail mail = FakeMail.builder().recipients(MailAddressFixture.ANY_AT_JAMES, MailAddressFixture.OTHER_AT_JAMES).build();
+ FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+ .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+ .setProperty(RemoteDeliveryConfiguration.MAX_DNS_PROBLEM_RETRIES, "3")
+ .build();
+ DeliveryRetriesHelper.incrementRetries(mail);
+ testee = new MailDelivrer(new RemoteDeliveryConfiguration(mailetConfig, mock(DomainList.class)), mock(MailDelivrerToHost.class), dnsHelper, bouncer, LOGGER);
+
+ UnmodifiableIterator<HostAddress> empty = ImmutableList.<HostAddress>of().iterator();
+ when(dnsHelper.retrieveHostAddressIterator(MailAddressFixture.JAMES_APACHE_ORG)).thenReturn(empty);
+
+ ExecutionResult executionResult = testee.deliver(mail);
+
+ assertThat(executionResult.getExecutionState()).isEqualTo(ExecutionResult.ExecutionState.TEMPORARY_FAILURE);
+ }
+
+ @SuppressWarnings("deprecation")
+ @Test
+ @Ignore("One more failure is tolerated than specified by the configuration")
+ public void deliverShouldReturnPermanentErrorWhenLimitDNSProblemReached() throws Exception {
+ Mail mail = FakeMail.builder().recipients(MailAddressFixture.ANY_AT_JAMES, MailAddressFixture.OTHER_AT_JAMES).build();
+ FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+ .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+ .setProperty(RemoteDeliveryConfiguration.MAX_DNS_PROBLEM_RETRIES, "3")
+ .build();
+ DeliveryRetriesHelper.incrementRetries(mail);
+ DeliveryRetriesHelper.incrementRetries(mail);
+ DeliveryRetriesHelper.incrementRetries(mail);
+ testee = new MailDelivrer(new RemoteDeliveryConfiguration(mailetConfig, mock(DomainList.class)), mock(MailDelivrerToHost.class), dnsHelper, bouncer, LOGGER);
+
+ UnmodifiableIterator<HostAddress> empty = ImmutableList.<HostAddress>of().iterator();
+ when(dnsHelper.retrieveHostAddressIterator(MailAddressFixture.JAMES_APACHE_ORG)).thenReturn(empty);
+
+ ExecutionResult executionResult = testee.deliver(mail);
+
+ assertThat(executionResult.getExecutionState()).isEqualTo(ExecutionResult.ExecutionState.PERMANENT_FAILURE);
+ }
+
+ @SuppressWarnings("deprecation")
+ @Test
+ public void deliverShouldReturnPermanentErrorWhenLimitDNSProblemExceeded() throws Exception {
+ Mail mail = FakeMail.builder().recipients(MailAddressFixture.ANY_AT_JAMES, MailAddressFixture.OTHER_AT_JAMES).build();
+ FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+ .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
+ .setProperty(RemoteDeliveryConfiguration.MAX_DNS_PROBLEM_RETRIES, "3")
+ .build();
+ DeliveryRetriesHelper.incrementRetries(mail);
+ DeliveryRetriesHelper.incrementRetries(mail);
+ DeliveryRetriesHelper.incrementRetries(mail);
+ DeliveryRetriesHelper.incrementRetries(mail);
+ testee = new MailDelivrer(new RemoteDeliveryConfiguration(mailetConfig, mock(DomainList.class)), mock(MailDelivrerToHost.class), dnsHelper, bouncer, LOGGER);
+
+ UnmodifiableIterator<HostAddress> empty = ImmutableList.<HostAddress>of().iterator();
+ when(dnsHelper.retrieveHostAddressIterator(MailAddressFixture.JAMES_APACHE_ORG)).thenReturn(empty);
+
+ ExecutionResult executionResult = testee.deliver(mail);
+
+ assertThat(executionResult.getExecutionState()).isEqualTo(ExecutionResult.ExecutionState.PERMANENT_FAILURE);
+ }
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org