/**
* Copyright (c) 2009-2011 VMware, Inc. All Rights Reserved.
*
* 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.springsource.insight.plugin.mail;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.output.NullOutputStream;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.subethamail.smtp.TooMuchDataException;
import org.subethamail.smtp.helper.SimpleMessageListener;
import org.subethamail.smtp.helper.SimpleMessageListenerAdapter;
import org.subethamail.smtp.server.SMTPServer;
import com.springsource.insight.collection.test.OperationCollectionAspectTestSupport;
import com.springsource.insight.intercept.operation.Operation;
import com.springsource.insight.intercept.operation.OperationList;
import com.springsource.insight.intercept.operation.OperationMap;
import com.springsource.insight.util.system.net.NetworkAddressUtil;
/**
*
*/
public class MessageSendOperationCollectionAspectTest extends OperationCollectionAspectTestSupport {
/*
* NOTE: we use a port other than the default for SMTP (25) to avoid conflicts
* with any running services on the build environment
*/
private static final int TEST_PORT = 7365;
private static SMTPServer SERVER;
@BeforeClass
public static void startEmbeddedServer() {
assertNull("Server already initialized", SERVER);
SERVER = new SMTPServer(new SimpleMessageListenerAdapter(SmtpServerListener.INSTANCE));
SERVER.setHostName("localhost");
SERVER.setPort(TEST_PORT);
SERVER.start();
System.out.println("Started embedded server on port " + SERVER.getPort());
}
@AfterClass
public static void stopEmbeddedServer() {
if (SERVER != null) {
SERVER.stop();
System.out.println("Stopped embedded server on port " + SERVER.getPort());
SERVER = null;
}
}
// cant test this because the transport will actually use the 25 port which will raise an exception
//@Test
public void testSendMessageWithDefaultPort() {
testSendMessage(-1);
}
@Test
public void testSendMessageWithPort() {
testSendMessage(TEST_PORT);
}
private void testSendMessage(int port) {
JavaMailSenderImpl sender = new JavaMailSenderImpl();
sender.setHost(NetworkAddressUtil.LOOPBACK_ADDRESS);
sender.setProtocol(JavaMailSenderImpl.DEFAULT_PROTOCOL);
sender.setPort(port);
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom("from@com.springsource.insight.plugin.mail");
message.setTo("to@com.springsource.insight.plugin.mail");
message.setCc("cc@com.springsource.insight.plugin.mail");
message.setBcc("bcc@com.springsource.insight.plugin.mail");
Date now = new Date(System.currentTimeMillis());
message.setSentDate(now);
message.setSubject(now.toString());
message.setText("Test at " + now.toString());
sender.send(message);
Operation op = getLastEntered();
assertNotNull("No operation extracted", op);
assertEquals("Mismatched operation type", MailDefinitions.SEND_OPERATION, op.getType());
assertEquals("Mismatched protocol", sender.getProtocol(), op.get(MailDefinitions.SEND_PROTOCOL, String.class));
assertEquals("Mismatched host", sender.getHost(), op.get(MailDefinitions.SEND_HOST, String.class));
if (port == -1) {
assertEquals("Mismatched default port", 25, op.getInt(MailDefinitions.SEND_PORT, (-1)));
} else {
assertEquals("Mismatched send port", sender.getPort(), op.getInt(MailDefinitions.SEND_PORT, (-1)));
}
if (getAspect().collectExtraInformation()) {
assertAddresses(op, MailDefinitions.SEND_SENDERS, 1);
assertAddresses(op, MailDefinitions.SEND_RECIPS, 3);
OperationMap details = op.get(MailDefinitions.SEND_DETAILS, OperationMap.class);
assertNotNull("No details extracted", details);
assertEquals("Mismatched subject", message.getSubject(), details.get(MailDefinitions.SEND_SUBJECT, String.class));
}
}
private void assertAddresses(Operation op, String type, int expectedSize) {
OperationList list = op.get(type, OperationList.class);
assertNotNull("No addresses of type=" + type, list);
assertEquals("Mismatched number of " + type + " addresses", expectedSize, list.size());
for (int index = 0; index < list.size(); index++) {
OperationMap addrEntry = list.get(index, OperationMap.class);
assertNotNull("Missing " + type + " entry #" + index, addrEntry);
String typeValue = addrEntry.get("type", String.class),
addrValue = addrEntry.get("value", String.class);
assertEquals("Mismatched " + type + " type for entry #" + index, "rfc822", typeValue);
assertNotNull("No " + type + " value for entry #" + index, addrValue);
int domainIndex = addrValue.lastIndexOf('@');
String domain = addrValue.substring(domainIndex);
assertEquals("Mismatched " + type + "domain for entry #" + index,
"@com.springsource.insight.plugin.mail", domain);
}
}
@Override
public MessageSendOperationCollectionAspect getAspect() {
return MessageSendOperationCollectionAspect.aspectOf();
}
static class SmtpServerListener implements SimpleMessageListener {
static final SmtpServerListener INSTANCE = new SmtpServerListener();
private SmtpServerListener() {
super();
}
public boolean accept(String from, String recipient) {
return ((from != null) && (from.length() > 0))
|| ((recipient != null) && (recipient.length() > 0))
;
}
public void deliver(String from, String recipient, InputStream data)
throws TooMuchDataException, IOException {
assertTrue("Bad data copied", IOUtils.copy(data, NullOutputStream.NULL_OUTPUT_STREAM) > 0);
}
}
}