/* * Licensed 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 com.ok2c.lightmtp.impl.agent; import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Queue; import java.util.concurrent.Future; import org.junit.Assert; import org.junit.Test; import org.apache.http.concurrent.BasicFuture; import org.apache.http.concurrent.FutureCallback; import org.apache.http.nio.reactor.IOReactorStatus; import org.apache.http.nio.reactor.ListenerEndpoint; import org.apache.http.nio.reactor.SessionRequest; import com.ok2c.lightmtp.SMTPCode; import com.ok2c.lightmtp.SMTPCodes; import com.ok2c.lightmtp.SMTPReply; import com.ok2c.lightmtp.agent.SessionEndpoint; import com.ok2c.lightmtp.impl.BaseTransportTest; import com.ok2c.lightmtp.impl.protocol.LocalClientSessionFactory; import com.ok2c.lightmtp.impl.protocol.LocalServerSessionFactory; import com.ok2c.lightmtp.impl.protocol.ServerSessionFactory; import com.ok2c.lightmtp.impl.protocol.ServerState; import com.ok2c.lightmtp.impl.protocol.cmd.DefaultProtocolHandler; import com.ok2c.lightmtp.message.content.ByteArraySource; import com.ok2c.lightmtp.protocol.BasicDeliveryRequest; import com.ok2c.lightmtp.protocol.DeliveryHandler; import com.ok2c.lightmtp.protocol.DeliveryRequest; import com.ok2c.lightmtp.protocol.DeliveryResult; import com.ok2c.lightmtp.protocol.EnvelopValidator; import com.ok2c.lightmtp.protocol.ProtocolHandler; import com.ok2c.lightmtp.protocol.RcptResult; import com.ok2c.lightmtp.protocol.UniqueIdGenerator; public class TestMailDelivery extends BaseTransportTest { static String TEXT1 = "From: root\r\n" + "To: testuser1\r\n" + "Subject: test message 1\r\n" + "\r\n" + "This is a short test message 1\r\n"; static String TEXT2 = "From: root\r\n" + "To: testuser1, testuser2\r\n" + "Subject: test message 2\r\n" + "\r\n" + "This is a short test message 2\r\n"; static String TEXT3 = "From: root\r\n" + "To: testuser1, testuser2, testuser3\r\n" + "Subject: test message 3\r\n" + "\r\n" + "This is a short test message 3\r\n" + ". Period.\r\n"; @Test public void testBasicPipelinedDelivery() throws Exception { List<DeliveryRequest> requests = new ArrayList<DeliveryRequest>(); requests.add(new BasicDeliveryRequest( "root", Arrays.asList("testuser1"), new ByteArraySource(TEXT1.getBytes("US-ASCII")))); requests.add(new BasicDeliveryRequest( "root", Arrays.asList("testuser1", "testuser2"), new ByteArraySource(TEXT2.getBytes("US-ASCII")))); requests.add(new BasicDeliveryRequest( "root", Arrays.asList("testuser1", "testuser2", "testuser3"), new ByteArraySource(TEXT3.getBytes("US-ASCII")))); SimpleTestJob testJob = new SimpleTestJob(requests); SimpleTestDeliveryHandler deliveryHandler = new SimpleTestDeliveryHandler(); SimpleEnvelopValidator envelopValidator = new SimpleEnvelopValidator(); SimpleIdGenerator idgenerator = new SimpleIdGenerator(); this.mta.start(idgenerator, envelopValidator, deliveryHandler); ListenerEndpoint endpoint = this.mta.listen(new InetSocketAddress("localhost", 0)); endpoint.waitFor(); SocketAddress address = endpoint.getAddress(); Assert.assertNotNull(address); Assert.assertNull(endpoint.getException()); Assert.assertEquals(IOReactorStatus.ACTIVE, this.mta.getStatus()); SimpleTestDeliveryRequestHandler deliveryRequestHandler = new SimpleTestDeliveryRequestHandler(); this.mua.start(deliveryRequestHandler); SessionEndpoint sessEndpoint = new SessionEndpoint(address); SessionRequest sessionRequest = this.mua.connect(sessEndpoint, testJob, null); sessionRequest.waitFor(); Assert.assertNotNull(sessionRequest.getSession()); Assert.assertNull(sessionRequest.getException()); List<DeliveryResult> results = testJob.waitForResults(); Assert.assertNotNull(results); Assert.assertEquals(3, results.size()); DeliveryResult res1 = results.get(0); Assert.assertTrue(res1.getFailures().isEmpty()); Assert.assertEquals(250, res1.getReply().getCode()); Assert.assertEquals(new SMTPCode(2, 6, 0), res1.getReply().getEnhancedCode()); DeliveryResult res2 = results.get(1); Assert.assertTrue(res2.getFailures().isEmpty()); Assert.assertEquals(250, res2.getReply().getCode()); Assert.assertEquals(new SMTPCode(2, 6, 0), res2.getReply().getEnhancedCode()); DeliveryResult res3 = results.get(2); Assert.assertTrue(res3.getFailures().isEmpty()); Assert.assertEquals(250, res3.getReply().getCode()); Assert.assertEquals(new SMTPCode(2, 6, 0), res3.getReply().getEnhancedCode()); Queue<SimpleTestDelivery> deliveries = deliveryHandler.getDeliveries(); Assert.assertNotNull(deliveries); SimpleTestDelivery delivery1 = deliveries.poll(); Assert.assertNotNull(delivery1); Assert.assertEquals("root", delivery1.getSender()); Assert.assertEquals(1, delivery1.getRecipients().size()); Assert.assertEquals("testuser1", delivery1.getRecipients().get(0)); Assert.assertEquals(TEXT1, delivery1.getContent()); SimpleTestDelivery delivery2 = deliveries.poll(); Assert.assertNotNull(delivery2); Assert.assertEquals("root", delivery2.getSender()); Assert.assertEquals(2, delivery2.getRecipients().size()); Assert.assertEquals("testuser1", delivery2.getRecipients().get(0)); Assert.assertEquals("testuser2", delivery2.getRecipients().get(1)); Assert.assertEquals(TEXT2, delivery2.getContent()); SimpleTestDelivery delivery3 = deliveries.poll(); Assert.assertNotNull(delivery3); Assert.assertEquals("root", delivery3.getSender()); Assert.assertEquals(3, delivery3.getRecipients().size()); Assert.assertEquals("testuser1", delivery3.getRecipients().get(0)); Assert.assertEquals("testuser2", delivery3.getRecipients().get(1)); Assert.assertEquals("testuser3", delivery3.getRecipients().get(2)); Assert.assertEquals(TEXT3, delivery3.getContent()); Assert.assertNull(deliveries.poll()); } @Test public void testDelayedDelivery() throws Exception { List<DeliveryRequest> requests = new ArrayList<DeliveryRequest>(); requests.add(new BasicDeliveryRequest( "root", Arrays.asList("testuser1"), new ByteArraySource(TEXT1.getBytes("US-ASCII")))); requests.add(new BasicDeliveryRequest( "root", Arrays.asList("testuser1", "testuser2"), new ByteArraySource(TEXT2.getBytes("US-ASCII")))); requests.add(new BasicDeliveryRequest( "root", Arrays.asList("testuser1", "testuser2", "testuser3"), new ByteArraySource(TEXT3.getBytes("US-ASCII")))); SimpleTestJob testJob = new SimpleTestJob(requests); DelayedTestDeliveryHandler deliveryHandler = new DelayedTestDeliveryHandler(); SimpleEnvelopValidator envelopValidator = new SimpleEnvelopValidator(); SimpleIdGenerator idgenerator = new SimpleIdGenerator(); this.mta.start(idgenerator, envelopValidator, deliveryHandler); ListenerEndpoint endpoint = this.mta.listen(new InetSocketAddress("localhost", 0)); endpoint.waitFor(); SocketAddress address = endpoint.getAddress(); Assert.assertNotNull(address); Assert.assertNull(endpoint.getException()); Assert.assertEquals(IOReactorStatus.ACTIVE, this.mta.getStatus()); SimpleTestDeliveryRequestHandler deliveryRequestHandler = new SimpleTestDeliveryRequestHandler(); this.mua.start(deliveryRequestHandler); SessionEndpoint sessEndpoint = new SessionEndpoint(address); SessionRequest sessionRequest = this.mua.connect(sessEndpoint, testJob, null); sessionRequest.waitFor(); Assert.assertNotNull(sessionRequest.getSession()); Assert.assertNull(sessionRequest.getException()); List<DeliveryResult> results = testJob.waitForResults(); Assert.assertNotNull(results); Assert.assertEquals(3, results.size()); DeliveryResult res1 = results.get(0); Assert.assertTrue(res1.getFailures().isEmpty()); Assert.assertEquals(250, res1.getReply().getCode()); Assert.assertEquals(new SMTPCode(2, 6, 0), res1.getReply().getEnhancedCode()); DeliveryResult res2 = results.get(1); Assert.assertTrue(res2.getFailures().isEmpty()); Assert.assertEquals(250, res2.getReply().getCode()); Assert.assertEquals(new SMTPCode(2, 6, 0), res2.getReply().getEnhancedCode()); DeliveryResult res3 = results.get(2); Assert.assertTrue(res3.getFailures().isEmpty()); Assert.assertEquals(250, res3.getReply().getCode()); Assert.assertEquals(new SMTPCode(2, 6, 0), res3.getReply().getEnhancedCode()); Queue<SimpleTestDelivery> deliveries = deliveryHandler.getDeliveries(); Assert.assertNotNull(deliveries); SimpleTestDelivery delivery1 = deliveries.poll(); Assert.assertNotNull(delivery1); Assert.assertEquals("root", delivery1.getSender()); Assert.assertEquals(1, delivery1.getRecipients().size()); Assert.assertEquals("testuser1", delivery1.getRecipients().get(0)); Assert.assertEquals(TEXT1, delivery1.getContent()); SimpleTestDelivery delivery2 = deliveries.poll(); Assert.assertNotNull(delivery2); Assert.assertEquals("root", delivery2.getSender()); Assert.assertEquals(2, delivery2.getRecipients().size()); Assert.assertEquals("testuser1", delivery2.getRecipients().get(0)); Assert.assertEquals("testuser2", delivery2.getRecipients().get(1)); Assert.assertEquals(TEXT2, delivery2.getContent()); SimpleTestDelivery delivery3 = deliveries.poll(); Assert.assertNotNull(delivery3); Assert.assertEquals("root", delivery3.getSender()); Assert.assertEquals(3, delivery3.getRecipients().size()); Assert.assertEquals("testuser1", delivery3.getRecipients().get(0)); Assert.assertEquals("testuser2", delivery3.getRecipients().get(1)); Assert.assertEquals("testuser3", delivery3.getRecipients().get(2)); Assert.assertEquals(TEXT3, delivery3.getContent()); Assert.assertNull(deliveries.poll()); } static class OldServerSessionFactory extends ServerSessionFactory { public OldServerSessionFactory( final UniqueIdGenerator idgenerator, final EnvelopValidator validator, final DeliveryHandler deliveryHandler) { super(TMP_DIR, idgenerator, null, validator, deliveryHandler); } @Override protected ProtocolHandler<ServerState> createProtocolHandler( final UniqueIdGenerator idgenerator, final EnvelopValidator validator) { DefaultProtocolHandler handler = (DefaultProtocolHandler) super.createProtocolHandler( idgenerator, validator); handler.unregister("EHLO"); return handler; } } @Test public void testBasicNonPipelinedDelivery() throws Exception { List<DeliveryRequest> requests = new ArrayList<DeliveryRequest>(); requests.add(new BasicDeliveryRequest( "root", Arrays.asList("testuser1"), new ByteArraySource(TEXT1.getBytes("US-ASCII")))); requests.add(new BasicDeliveryRequest( "root", Arrays.asList("testuser1", "testuser2"), new ByteArraySource(TEXT2.getBytes("US-ASCII")))); requests.add(new BasicDeliveryRequest( "root", Arrays.asList("testuser1", "testuser2", "testuser3"), new ByteArraySource(TEXT3.getBytes("US-ASCII")))); SimpleTestJob testJob = new SimpleTestJob(requests); SimpleTestDeliveryHandler deliveryHandler = new SimpleTestDeliveryHandler(); SimpleEnvelopValidator envelopValidator = new SimpleEnvelopValidator(); SimpleIdGenerator idgenerator = new SimpleIdGenerator(); this.mta.start(new OldServerSessionFactory(idgenerator, envelopValidator, deliveryHandler)); ListenerEndpoint endpoint = this.mta.listen(new InetSocketAddress("localhost", 0)); endpoint.waitFor(); SocketAddress address = endpoint.getAddress(); Assert.assertNotNull(address); Assert.assertNull(endpoint.getException()); Assert.assertEquals(IOReactorStatus.ACTIVE, this.mta.getStatus()); SimpleTestDeliveryRequestHandler deliveryRequestHandler = new SimpleTestDeliveryRequestHandler(); this.mua.start(deliveryRequestHandler); SessionEndpoint sessEndpoint = new SessionEndpoint(address); SessionRequest sessionRequest = this.mua.connect(sessEndpoint, testJob, null); sessionRequest.waitFor(); Assert.assertNotNull(sessionRequest.getSession()); Assert.assertNull(sessionRequest.getException()); List<DeliveryResult> results = testJob.waitForResults(); Assert.assertNotNull(results); Assert.assertEquals(3, results.size()); DeliveryResult res1 = results.get(0); Assert.assertTrue(res1.getFailures().isEmpty()); Assert.assertEquals(250, res1.getReply().getCode()); Assert.assertNull(res1.getReply().getEnhancedCode()); DeliveryResult res2 = results.get(1); Assert.assertTrue(res2.getFailures().isEmpty()); Assert.assertEquals(250, res2.getReply().getCode()); Assert.assertNull(res2.getReply().getEnhancedCode()); DeliveryResult res3 = results.get(2); Assert.assertTrue(res3.getFailures().isEmpty()); Assert.assertEquals(250, res3.getReply().getCode()); Assert.assertNull(res3.getReply().getEnhancedCode()); Queue<SimpleTestDelivery> deliveries = deliveryHandler.getDeliveries(); Assert.assertNotNull(deliveries); SimpleTestDelivery delivery1 = deliveries.poll(); Assert.assertNotNull(delivery1); Assert.assertEquals("root", delivery1.getSender()); Assert.assertEquals(1, delivery1.getRecipients().size()); Assert.assertEquals("testuser1", delivery1.getRecipients().get(0)); Assert.assertEquals(TEXT1, delivery1.getContent()); SimpleTestDelivery delivery2 = deliveries.poll(); Assert.assertNotNull(delivery2); Assert.assertEquals("root", delivery2.getSender()); Assert.assertEquals(2, delivery2.getRecipients().size()); Assert.assertEquals("testuser1", delivery2.getRecipients().get(0)); Assert.assertEquals("testuser2", delivery2.getRecipients().get(1)); Assert.assertEquals(TEXT2, delivery2.getContent()); SimpleTestDelivery delivery3 = deliveries.poll(); Assert.assertNotNull(delivery3); Assert.assertEquals("root", delivery3.getSender()); Assert.assertEquals(3, delivery3.getRecipients().size()); Assert.assertEquals("testuser1", delivery3.getRecipients().get(0)); Assert.assertEquals("testuser2", delivery3.getRecipients().get(1)); Assert.assertEquals("testuser3", delivery3.getRecipients().get(2)); Assert.assertEquals(TEXT3, delivery3.getContent()); Assert.assertNull(deliveries.poll()); } @Test public void testRecipientRejectionPipelinedDelivery() throws Exception { List<DeliveryRequest> requests = new ArrayList<DeliveryRequest>(); requests.add(new BasicDeliveryRequest( "root", Arrays.asList("testuser1"), new ByteArraySource(TEXT1.getBytes("US-ASCII")))); requests.add(new BasicDeliveryRequest( "root", Arrays.asList("testuser1", "testuser2"), new ByteArraySource(TEXT2.getBytes("US-ASCII")))); SimpleTestJob testJob = new SimpleTestJob(requests); SimpleIdGenerator idgenerator = new SimpleIdGenerator(); EnvelopValidator envelopValidator = new SimpleEnvelopValidator() { @Override public Future<SMTPReply> validateRecipient( final InetAddress client, final String recipient, final FutureCallback<SMTPReply> callback) { if (recipient.equals("testuser1")) { BasicFuture<SMTPReply> future = new BasicFuture<SMTPReply>(callback); SMTPReply reply = new SMTPReply(SMTPCodes.ERR_PERM_MAILBOX_UNAVAILABLE, new SMTPCode(5, 1, 1), "requested action not taken: mailbox unavailable"); future.completed(reply); return future; } return super.validateRecipient(client, recipient, callback); } }; SimpleTestDeliveryHandler deliveryHandler = new SimpleTestDeliveryHandler(); this.mta.start(idgenerator, envelopValidator, deliveryHandler); ListenerEndpoint endpoint = this.mta.listen(new InetSocketAddress("localhost", 0)); endpoint.waitFor(); SocketAddress address = endpoint.getAddress(); Assert.assertNotNull(address); Assert.assertNull(endpoint.getException()); Assert.assertEquals(IOReactorStatus.ACTIVE, this.mta.getStatus()); SimpleTestDeliveryRequestHandler deliveryRequestHandler = new SimpleTestDeliveryRequestHandler(); this.mua.start(deliveryRequestHandler); SessionEndpoint sessEndpoint = new SessionEndpoint(address); SessionRequest sessionRequest = this.mua.connect(sessEndpoint, testJob, null); sessionRequest.waitFor(); Assert.assertNotNull(sessionRequest.getSession()); Assert.assertNull(sessionRequest.getException()); List<DeliveryResult> results = testJob.waitForResults(); Assert.assertNotNull(results); Assert.assertEquals(2, results.size()); DeliveryResult res1 = results.get(0); Assert.assertEquals(1, res1.getFailures().size()); RcptResult rcres1 = res1.getFailures().get(0); Assert.assertEquals("testuser1", rcres1.getRecipient()); Assert.assertEquals(550, rcres1.getReply().getCode()); Assert.assertEquals(new SMTPCode(5, 1, 1), rcres1.getReply().getEnhancedCode()); Assert.assertEquals(503, res1.getReply().getCode()); Assert.assertEquals(new SMTPCode(5, 5, 1), res1.getReply().getEnhancedCode()); DeliveryResult res2 = results.get(1); Assert.assertEquals(1, res2.getFailures().size()); RcptResult rcres2 = res2.getFailures().get(0); Assert.assertEquals("testuser1", rcres2.getRecipient()); Assert.assertEquals(550, rcres2.getReply().getCode()); Assert.assertEquals(new SMTPCode(5, 1, 1), rcres2.getReply().getEnhancedCode()); Assert.assertEquals(250, res2.getReply().getCode()); Assert.assertEquals(new SMTPCode(2, 6, 0), res2.getReply().getEnhancedCode()); Queue<SimpleTestDelivery> deliveries = deliveryHandler.getDeliveries(); Assert.assertNotNull(deliveries); SimpleTestDelivery delivery1 = deliveries.poll(); Assert.assertNotNull(delivery1); Assert.assertEquals("root", delivery1.getSender()); Assert.assertEquals(1, delivery1.getRecipients().size()); Assert.assertEquals("testuser2", delivery1.getRecipients().get(0)); Assert.assertEquals(TEXT2, delivery1.getContent()); Assert.assertNull(deliveries.poll()); } @Test public void testRecipientRejectionNonPipelinedDelivery() throws Exception { List<DeliveryRequest> requests = new ArrayList<DeliveryRequest>(); requests.add(new BasicDeliveryRequest( "root", Arrays.asList("testuser1"), new ByteArraySource(TEXT1.getBytes("US-ASCII")))); requests.add(new BasicDeliveryRequest( "root", Arrays.asList("testuser1", "testuser2"), new ByteArraySource(TEXT2.getBytes("US-ASCII")))); SimpleTestJob testJob = new SimpleTestJob(requests); SimpleIdGenerator idgenerator = new SimpleIdGenerator(); EnvelopValidator envelopValidator = new SimpleEnvelopValidator() { @Override public Future<SMTPReply> validateRecipient( final InetAddress client, final String recipient, final FutureCallback<SMTPReply> callback) { if (recipient.equals("testuser1")) { BasicFuture<SMTPReply> future = new BasicFuture<SMTPReply>(callback); SMTPReply reply = new SMTPReply(SMTPCodes.ERR_PERM_MAILBOX_UNAVAILABLE, new SMTPCode(5, 1, 1), "requested action not taken: mailbox unavailable"); future.completed(reply); return future; } return super.validateRecipient(client, recipient, callback); } }; SimpleTestDeliveryHandler deliveryHandler = new SimpleTestDeliveryHandler(); this.mta.start(new OldServerSessionFactory(idgenerator, envelopValidator, deliveryHandler)); ListenerEndpoint endpoint = this.mta.listen(new InetSocketAddress("localhost", 0)); endpoint.waitFor(); SocketAddress address = endpoint.getAddress(); Assert.assertNotNull(address); Assert.assertNull(endpoint.getException()); Assert.assertEquals(IOReactorStatus.ACTIVE, this.mta.getStatus()); SimpleTestDeliveryRequestHandler deliveryRequestHandler = new SimpleTestDeliveryRequestHandler(); this.mua.start(deliveryRequestHandler); SessionEndpoint sessEndpoint = new SessionEndpoint(address); SessionRequest sessionRequest = this.mua.connect(sessEndpoint, testJob, null); sessionRequest.waitFor(); Assert.assertNotNull(sessionRequest.getSession()); Assert.assertNull(sessionRequest.getException()); List<DeliveryResult> results = testJob.waitForResults(); Assert.assertNotNull(results); Assert.assertEquals(2, results.size()); DeliveryResult res1 = results.get(0); Assert.assertEquals(1, res1.getFailures().size()); RcptResult rcres1 = res1.getFailures().get(0); Assert.assertEquals("testuser1", rcres1.getRecipient()); Assert.assertEquals(550, rcres1.getReply().getCode()); Assert.assertNull(rcres1.getReply().getEnhancedCode()); Assert.assertEquals(550, res1.getReply().getCode()); Assert.assertNull(res1.getReply().getEnhancedCode()); DeliveryResult res2 = results.get(1); Assert.assertEquals(1, res2.getFailures().size()); RcptResult rcres2 = res2.getFailures().get(0); Assert.assertEquals("testuser1", rcres2.getRecipient()); Assert.assertEquals(550, rcres2.getReply().getCode()); Assert.assertNull(rcres2.getReply().getEnhancedCode()); Assert.assertEquals(250, res2.getReply().getCode()); Assert.assertNull(res2.getReply().getEnhancedCode()); Queue<SimpleTestDelivery> deliveries = deliveryHandler.getDeliveries(); Assert.assertNotNull(deliveries); SimpleTestDelivery delivery1 = deliveries.poll(); Assert.assertNotNull(delivery1); Assert.assertEquals("root", delivery1.getSender()); Assert.assertEquals(1, delivery1.getRecipients().size()); Assert.assertEquals("testuser2", delivery1.getRecipients().get(0)); Assert.assertEquals(TEXT2, delivery1.getContent()); Assert.assertNull(deliveries.poll()); } @Test public void testSenderRejectionPipelinedDelivery() throws Exception { List<DeliveryRequest> requests = new ArrayList<DeliveryRequest>(); requests.add(new BasicDeliveryRequest( "root@somewhere.com", Arrays.asList("testuser1"), new ByteArraySource(TEXT1.getBytes("US-ASCII")))); requests.add(new BasicDeliveryRequest( "root@somewhere.com", Arrays.asList("testuser1", "testuser2"), new ByteArraySource(TEXT2.getBytes("US-ASCII")))); SimpleTestJob testJob = new SimpleTestJob(requests); SimpleIdGenerator idgenerator = new SimpleIdGenerator(); EnvelopValidator envelopValidator = new SimpleEnvelopValidator() { @Override public Future<SMTPReply> validateSender( final InetAddress client, final String sender, final FutureCallback<SMTPReply> callback) { if (sender.equals("root@somewhere.com")) { BasicFuture<SMTPReply> future = new BasicFuture<SMTPReply>(callback); SMTPReply reply = new SMTPReply(SMTPCodes.ERR_PERM_MAILBOX_NOT_ALLOWED, new SMTPCode(5, 1, 8), "bad sender's system address"); future.completed(reply); return future; } return super.validateSender(client, sender, callback); } }; SimpleTestDeliveryHandler deliveryHandler = new SimpleTestDeliveryHandler(); this.mta.start(idgenerator, envelopValidator, deliveryHandler); ListenerEndpoint endpoint = this.mta.listen(new InetSocketAddress("localhost", 0)); endpoint.waitFor(); SocketAddress address = endpoint.getAddress(); Assert.assertNotNull(address); Assert.assertNull(endpoint.getException()); Assert.assertEquals(IOReactorStatus.ACTIVE, this.mta.getStatus()); SimpleTestDeliveryRequestHandler deliveryRequestHandler = new SimpleTestDeliveryRequestHandler(); this.mua.start(deliveryRequestHandler); SessionEndpoint sessEndpoint = new SessionEndpoint(address); SessionRequest sessionRequest = this.mua.connect(sessEndpoint, testJob, null); sessionRequest.waitFor(); Assert.assertNotNull(sessionRequest.getSession()); Assert.assertNull(sessionRequest.getException()); List<DeliveryResult> results = testJob.waitForResults(); Assert.assertNotNull(results); Assert.assertEquals(2, results.size()); DeliveryResult res1 = results.get(0); Assert.assertEquals(1, res1.getFailures().size()); RcptResult rcres1 = res1.getFailures().get(0); Assert.assertEquals("testuser1", rcres1.getRecipient()); Assert.assertEquals(503, rcres1.getReply().getCode()); Assert.assertEquals(503, res1.getReply().getCode()); Assert.assertEquals(new SMTPCode(5, 5, 1), res1.getReply().getEnhancedCode()); DeliveryResult res2 = results.get(1); Assert.assertEquals(2, res2.getFailures().size()); RcptResult rcres2 = res2.getFailures().get(0); Assert.assertEquals("testuser1", rcres2.getRecipient()); Assert.assertEquals(503, rcres2.getReply().getCode()); RcptResult rcres3 = res2.getFailures().get(1); Assert.assertEquals("testuser2", rcres3.getRecipient()); Assert.assertEquals(503, rcres3.getReply().getCode()); Assert.assertEquals(503, res2.getReply().getCode()); Assert.assertEquals(new SMTPCode(5, 5, 1), res2.getReply().getEnhancedCode()); Queue<SimpleTestDelivery> deliveries = deliveryHandler.getDeliveries(); Assert.assertNull(deliveries.poll()); } @Test public void testSenderRejectionNonPipelinedDelivery() throws Exception { List<DeliveryRequest> requests = new ArrayList<DeliveryRequest>(); requests.add(new BasicDeliveryRequest( "root@somewhere.com", Arrays.asList("testuser1"), new ByteArraySource(TEXT1.getBytes("US-ASCII")))); requests.add(new BasicDeliveryRequest( "root@somewhere.com", Arrays.asList("testuser1", "testuser2"), new ByteArraySource(TEXT2.getBytes("US-ASCII")))); SimpleTestJob testJob = new SimpleTestJob(requests); SimpleIdGenerator idgenerator = new SimpleIdGenerator(); EnvelopValidator envelopValidator = new SimpleEnvelopValidator() { @Override public Future<SMTPReply> validateSender( final InetAddress client, final String sender, final FutureCallback<SMTPReply> callback) { if (sender.equals("root@somewhere.com")) { BasicFuture<SMTPReply> future = new BasicFuture<SMTPReply>(callback); SMTPReply reply = new SMTPReply(SMTPCodes.ERR_PERM_MAILBOX_NOT_ALLOWED, new SMTPCode(5, 1, 8), "bad sender's system address"); future.completed(reply); return future; } return super.validateSender(client, sender, callback); } }; SimpleTestDeliveryHandler deliveryHandler = new SimpleTestDeliveryHandler(); this.mta.start(new OldServerSessionFactory(idgenerator, envelopValidator, deliveryHandler)); ListenerEndpoint endpoint = this.mta.listen(new InetSocketAddress("localhost", 0)); endpoint.waitFor(); SocketAddress address = endpoint.getAddress(); Assert.assertNotNull(address); Assert.assertNull(endpoint.getException()); Assert.assertEquals(IOReactorStatus.ACTIVE, this.mta.getStatus()); SimpleTestDeliveryRequestHandler deliveryRequestHandler = new SimpleTestDeliveryRequestHandler(); this.mua.start(deliveryRequestHandler); SessionEndpoint sessEndpoint = new SessionEndpoint(address); SessionRequest sessionRequest = this.mua.connect(sessEndpoint, testJob, null); sessionRequest.waitFor(); Assert.assertNotNull(sessionRequest.getSession()); Assert.assertNull(sessionRequest.getException()); List<DeliveryResult> results = testJob.waitForResults(); Assert.assertNotNull(results); Assert.assertEquals(2, results.size()); DeliveryResult res1 = results.get(0); Assert.assertTrue(res1.getFailures().isEmpty()); DeliveryResult res2 = results.get(1); Assert.assertTrue(res2.getFailures().isEmpty()); Queue<SimpleTestDelivery> deliveries = deliveryHandler.getDeliveries(); Assert.assertNull(deliveries.poll()); } @Test public void testDelayedValidationPipelinedDelivery() throws Exception { List<DeliveryRequest> requests = new ArrayList<DeliveryRequest>(); requests.add(new BasicDeliveryRequest( "root@somewhere.com", Arrays.asList("testuser1"), new ByteArraySource(TEXT1.getBytes("US-ASCII")))); requests.add(new BasicDeliveryRequest( "root@somewhere.com", Arrays.asList("testuser1", "testuser2"), new ByteArraySource(TEXT2.getBytes("US-ASCII")))); SimpleTestJob testJob = new SimpleTestJob(requests); SimpleIdGenerator idgenerator = new SimpleIdGenerator(); DelayedEnvelopValidator envelopValidator = new DelayedEnvelopValidator(); SimpleTestDeliveryHandler deliveryHandler = new SimpleTestDeliveryHandler(); this.mta.start(idgenerator, envelopValidator, deliveryHandler); ListenerEndpoint endpoint = this.mta.listen(new InetSocketAddress("localhost", 0)); endpoint.waitFor(); SocketAddress address = endpoint.getAddress(); Assert.assertNotNull(address); Assert.assertNull(endpoint.getException()); Assert.assertEquals(IOReactorStatus.ACTIVE, this.mta.getStatus()); SimpleTestDeliveryRequestHandler deliveryRequestHandler = new SimpleTestDeliveryRequestHandler(); this.mua.start(deliveryRequestHandler); SessionEndpoint sessEndpoint = new SessionEndpoint(address); SessionRequest sessionRequest = this.mua.connect(sessEndpoint, testJob, null); sessionRequest.waitFor(); Assert.assertNotNull(sessionRequest.getSession()); Assert.assertNull(sessionRequest.getException()); List<DeliveryResult> results = testJob.waitForResults(); Assert.assertNotNull(results); Assert.assertEquals(2, results.size()); DeliveryResult res1 = results.get(0); Assert.assertTrue(res1.getFailures().isEmpty()); Assert.assertEquals(250, res1.getReply().getCode()); Assert.assertEquals(new SMTPCode(2, 6, 0), res1.getReply().getEnhancedCode()); DeliveryResult res2 = results.get(1); Assert.assertTrue(res2.getFailures().isEmpty()); Assert.assertEquals(250, res2.getReply().getCode()); Assert.assertEquals(new SMTPCode(2, 6, 0), res2.getReply().getEnhancedCode()); } @Test public void testDelayedValidationNonPipelinedDelivery() throws Exception { List<DeliveryRequest> requests = new ArrayList<DeliveryRequest>(); requests.add(new BasicDeliveryRequest( "root@somewhere.com", Arrays.asList("testuser1"), new ByteArraySource(TEXT1.getBytes("US-ASCII")))); requests.add(new BasicDeliveryRequest( "root@somewhere.com", Arrays.asList("testuser1", "testuser2"), new ByteArraySource(TEXT2.getBytes("US-ASCII")))); SimpleTestJob testJob = new SimpleTestJob(requests); SimpleIdGenerator idgenerator = new SimpleIdGenerator(); DelayedEnvelopValidator envelopValidator = new DelayedEnvelopValidator(); SimpleTestDeliveryHandler deliveryHandler = new SimpleTestDeliveryHandler(); this.mta.start(new OldServerSessionFactory(idgenerator, envelopValidator, deliveryHandler)); ListenerEndpoint endpoint = this.mta.listen(new InetSocketAddress("localhost", 0)); endpoint.waitFor(); SocketAddress address = endpoint.getAddress(); Assert.assertNotNull(address); Assert.assertNull(endpoint.getException()); Assert.assertEquals(IOReactorStatus.ACTIVE, this.mta.getStatus()); SimpleTestDeliveryRequestHandler deliveryRequestHandler = new SimpleTestDeliveryRequestHandler(); this.mua.start(deliveryRequestHandler); SessionEndpoint sessEndpoint = new SessionEndpoint(address); SessionRequest sessionRequest = this.mua.connect(sessEndpoint, testJob, null); sessionRequest.waitFor(); Assert.assertNotNull(sessionRequest.getSession()); Assert.assertNull(sessionRequest.getException()); List<DeliveryResult> results = testJob.waitForResults(); Assert.assertNotNull(results); Assert.assertEquals(2, results.size()); DeliveryResult res1 = results.get(0); Assert.assertTrue(res1.getFailures().isEmpty()); Assert.assertEquals(250, res1.getReply().getCode()); Assert.assertNull(res1.getReply().getEnhancedCode()); DeliveryResult res2 = results.get(1); Assert.assertTrue(res2.getFailures().isEmpty()); Assert.assertEquals(250, res2.getReply().getCode()); Assert.assertNull(res2.getReply().getEnhancedCode()); } @Test public void testDeliveryFailure() throws Exception { List<DeliveryRequest> requests = new ArrayList<DeliveryRequest>(); requests.add(new BasicDeliveryRequest( "root@somewhere.com", Arrays.asList("testuser1"), new ByteArraySource(TEXT1.getBytes("US-ASCII")))); requests.add(new BasicDeliveryRequest( "root@somewhere.com", Arrays.asList("testuser1", "testuser2"), new ByteArraySource(TEXT2.getBytes("US-ASCII")))); SimpleTestJob testJob = new SimpleTestJob(requests); SimpleIdGenerator idgenerator = new SimpleIdGenerator(); SimpleEnvelopValidator envelopValidator = new SimpleEnvelopValidator(); DeliveryHandler deliveryHandler = new DeliveryHandler() { @Override public Future<DeliveryResult> handle( final String messageId, final DeliveryRequest request, final FutureCallback<DeliveryResult> callback) { BasicFuture<DeliveryResult> future = new BasicFuture<DeliveryResult>(callback); future.failed(new IOException("Oooopsie")); return future; } }; this.mta.start(idgenerator, envelopValidator, deliveryHandler); ListenerEndpoint endpoint = this.mta.listen(new InetSocketAddress("localhost", 0)); endpoint.waitFor(); SocketAddress address = endpoint.getAddress(); Assert.assertNotNull(address); Assert.assertNull(endpoint.getException()); Assert.assertEquals(IOReactorStatus.ACTIVE, this.mta.getStatus()); SimpleTestDeliveryRequestHandler deliveryRequestHandler = new SimpleTestDeliveryRequestHandler(); this.mua.start(deliveryRequestHandler); SessionEndpoint sessEndpoint = new SessionEndpoint(address); SessionRequest sessionRequest = this.mua.connect(sessEndpoint, testJob, null); sessionRequest.waitFor(); Assert.assertNotNull(sessionRequest.getSession()); Assert.assertNull(sessionRequest.getException()); List<DeliveryResult> results = testJob.waitForResults(); Assert.assertNotNull(results); Assert.assertEquals(2, results.size()); DeliveryResult res1 = results.get(0); Assert.assertTrue(res1.getFailures().isEmpty()); Assert.assertEquals(451, res1.getReply().getCode()); Assert.assertEquals(new SMTPCode(4, 2, 0), res1.getReply().getEnhancedCode()); DeliveryResult res2 = results.get(1); Assert.assertTrue(res2.getFailures().isEmpty()); Assert.assertEquals(451, res2.getReply().getCode()); Assert.assertEquals(new SMTPCode(4, 2, 0), res2.getReply().getEnhancedCode()); } @Test public void testBasicLocalDelivery() throws Exception { List<DeliveryRequest> requests = new ArrayList<DeliveryRequest>(); requests.add(new BasicDeliveryRequest( "root", Arrays.asList("testuser1"), new ByteArraySource(TEXT1.getBytes("US-ASCII")))); requests.add(new BasicDeliveryRequest( "root", Arrays.asList("testuser1", "testuser2"), new ByteArraySource(TEXT2.getBytes("US-ASCII")))); requests.add(new BasicDeliveryRequest( "root", Arrays.asList("testuser1", "testuser2", "testuser3"), new ByteArraySource(TEXT3.getBytes("US-ASCII")))); SimpleTestJob testJob = new SimpleTestJob(requests); SimpleTestDeliveryHandler deliveryHandler = new SimpleTestDeliveryHandler(); this.mta.start(new LocalServerSessionFactory( TMP_DIR, new SimpleIdGenerator(), null, new SimpleEnvelopValidator(), deliveryHandler)); ListenerEndpoint endpoint = this.mta.listen(new InetSocketAddress("localhost", 0)); endpoint.waitFor(); SocketAddress address = endpoint.getAddress(); Assert.assertNotNull(address); Assert.assertNull(endpoint.getException()); Assert.assertEquals(IOReactorStatus.ACTIVE, this.mta.getStatus()); SimpleTestDeliveryRequestHandler deliveryRequestHandler = new SimpleTestDeliveryRequestHandler(); this.mua.start(new LocalClientSessionFactory(deliveryRequestHandler)); SessionEndpoint sessEndpoint = new SessionEndpoint(address); SessionRequest sessionRequest = this.mua.connect(sessEndpoint, testJob, null); sessionRequest.waitFor(); Assert.assertNotNull(sessionRequest.getSession()); Assert.assertNull(sessionRequest.getException()); List<DeliveryResult> results = testJob.waitForResults(); Assert.assertNotNull(results); Assert.assertEquals(3, results.size()); DeliveryResult res1 = results.get(0); Assert.assertTrue(res1.getFailures().isEmpty()); Assert.assertEquals(250, res1.getReply().getCode()); Assert.assertEquals(new SMTPCode(2, 6, 0), res1.getReply().getEnhancedCode()); DeliveryResult res2 = results.get(1); Assert.assertTrue(res2.getFailures().isEmpty()); Assert.assertEquals(250, res2.getReply().getCode()); Assert.assertEquals(new SMTPCode(2, 6, 0), res2.getReply().getEnhancedCode()); DeliveryResult res3 = results.get(2); Assert.assertTrue(res3.getFailures().isEmpty()); Assert.assertEquals(250, res3.getReply().getCode()); Assert.assertEquals(new SMTPCode(2, 6, 0), res3.getReply().getEnhancedCode()); Queue<SimpleTestDelivery> deliveries = deliveryHandler.getDeliveries(); Assert.assertNotNull(deliveries); SimpleTestDelivery delivery1 = deliveries.poll(); Assert.assertNotNull(delivery1); Assert.assertEquals("root", delivery1.getSender()); Assert.assertEquals(1, delivery1.getRecipients().size()); Assert.assertEquals("testuser1", delivery1.getRecipients().get(0)); Assert.assertEquals(TEXT1, delivery1.getContent()); SimpleTestDelivery delivery2 = deliveries.poll(); Assert.assertNotNull(delivery2); Assert.assertEquals("root", delivery2.getSender()); Assert.assertEquals(2, delivery2.getRecipients().size()); Assert.assertEquals("testuser1", delivery2.getRecipients().get(0)); Assert.assertEquals("testuser2", delivery2.getRecipients().get(1)); Assert.assertEquals(TEXT2, delivery2.getContent()); SimpleTestDelivery delivery3 = deliveries.poll(); Assert.assertNotNull(delivery3); Assert.assertEquals("root", delivery3.getSender()); Assert.assertEquals(3, delivery3.getRecipients().size()); Assert.assertEquals("testuser1", delivery3.getRecipients().get(0)); Assert.assertEquals("testuser2", delivery3.getRecipients().get(1)); Assert.assertEquals("testuser3", delivery3.getRecipients().get(2)); Assert.assertEquals(TEXT3, delivery3.getContent()); Assert.assertNull(deliveries.poll()); } @Test public void testLocalDeliveryFailure() throws Exception { List<DeliveryRequest> requests = new ArrayList<DeliveryRequest>(); requests.add(new BasicDeliveryRequest( "root", Arrays.asList("testuser1", "testuser2", "testuser3"), new ByteArraySource(TEXT3.getBytes("US-ASCII")))); SimpleTestJob testJob = new SimpleTestJob(requests); SimpleIdGenerator idgenerator = new SimpleIdGenerator(); SimpleEnvelopValidator envelopValidator = new SimpleEnvelopValidator(); DeliveryHandler deliveryHandler = new DeliveryHandler() { @Override public Future<DeliveryResult> handle( final String messageId, final DeliveryRequest request, final FutureCallback<DeliveryResult> callback) { BasicFuture<DeliveryResult> future = new BasicFuture<DeliveryResult>(callback); future.failed(new IOException("Oooopsie")); return future; } }; this.mta.start(new LocalServerSessionFactory( TMP_DIR, idgenerator, null, envelopValidator, deliveryHandler)); ListenerEndpoint endpoint = this.mta.listen(new InetSocketAddress("localhost", 0)); endpoint.waitFor(); SocketAddress address = endpoint.getAddress(); Assert.assertNotNull(address); Assert.assertNull(endpoint.getException()); Assert.assertEquals(IOReactorStatus.ACTIVE, this.mta.getStatus()); SimpleTestDeliveryRequestHandler deliveryRequestHandler = new SimpleTestDeliveryRequestHandler(); this.mua.start(new LocalClientSessionFactory(deliveryRequestHandler)); SessionEndpoint sessEndpoint = new SessionEndpoint(address); SessionRequest sessionRequest = this.mua.connect(sessEndpoint, testJob, null); sessionRequest.waitFor(); Assert.assertNotNull(sessionRequest.getSession()); Assert.assertNull(sessionRequest.getException()); List<DeliveryResult> results = testJob.waitForResults(); Assert.assertNotNull(results); Assert.assertEquals(1, results.size()); DeliveryResult res1 = results.get(0); Assert.assertEquals(3, res1.getFailures().size()); RcptResult rcres1 = res1.getFailures().get(0); Assert.assertEquals("testuser1", rcres1.getRecipient()); Assert.assertEquals(451, rcres1.getReply().getCode()); Assert.assertEquals(new SMTPCode(4, 2, 0), rcres1.getReply().getEnhancedCode()); RcptResult rcres2 = res1.getFailures().get(1); Assert.assertEquals("testuser2", rcres2.getRecipient()); Assert.assertEquals(451, rcres2.getReply().getCode()); Assert.assertEquals(new SMTPCode(4, 2, 0), rcres2.getReply().getEnhancedCode()); RcptResult rcres3 = res1.getFailures().get(2); Assert.assertEquals("testuser3", rcres3.getRecipient()); Assert.assertEquals(451, rcres3.getReply().getCode()); Assert.assertEquals(new SMTPCode(4, 2, 0), rcres3.getReply().getEnhancedCode()); Assert.assertEquals(451, res1.getReply().getCode()); Assert.assertEquals(new SMTPCode(4, 2, 0), res1.getReply().getEnhancedCode()); } }