/* vim: set ts=2 et sw=2 cindent fo=qroca: */
package com.globant.katari.tools;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.matchers.JUnitMatchers.*;
import org.junit.Test;
import org.junit.Before;
import org.junit.After;
public class MockSmtpServerTest {
PrintStream originalOut;
ByteArrayOutputStream dataSent;
int port;
@Before
public void setUp() throws IOException {
originalOut = System.out;
dataSent = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(dataSent);
System.setOut(ps);
}
@After
public void tearDown() {
if (originalOut != null) {
System.setOut(originalOut);
}
}
@Test
public void testSend() throws Exception {
Thread smtpThread = new Thread(new Runnable() {
public void run() {
try {
MockSmtpServer.main(new String[]{"0", "1"});
} catch (Exception e) {
}
return;
}
});
smtpThread.start();
int count = 5;
port = MockSmtpServer.getPortNumber();
while( ! isOpen(port) && count > 0 && port == 0) {
count --;
Thread.sleep(10);
port = MockSmtpServer.getPortNumber();
}
// A correct initialization should leave a valid port.
assertThat(count, is(not(0)));
assertThat(port, is(not(0)));
// send a mail and verify that it is received.
Properties props = new Properties();
props.put("mail.smtp.host", "localhost");
props.put("mail.smtp.port", String.valueOf(port));
Session mailSession = Session.getInstance(props);
Message sentMessage = new MimeMessage(mailSession);
sentMessage.setFrom(new InternetAddress("from@blah"));
sentMessage.setRecipient(RecipientType.TO, new InternetAddress("to@blah"));
sentMessage.setSubject("the subject");
sentMessage.setText("the body");
Transport.send(sentMessage);
Thread.sleep(500);
assertThat(dataSent.toString(), containsString("the subject"));
assertThat(dataSent.toString(), containsString("the body"));
}
public static boolean isOpen(int port) throws IOException {
ServerSocket ssocket = null;
try {
ssocket = new ServerSocket(port);
return false;
} catch (IOException ex) {
return true;
} finally {
if (ssocket != null) {
ssocket.close();
}
}
}
}