package mireka;
import static org.junit.Assert.*;
import java.io.IOException;
import java.net.UnknownHostException;
import java.util.Properties;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.URLName;
import mireka.destination.DestinationProcessorFilter;
import mireka.filter.local.LookupDestinationFilter;
import mireka.filterchain.Filters;
import mireka.login.GlobalUser;
import mireka.login.GlobalUsers;
import mireka.login.GlobalUsersLoginSpecification;
import mireka.login.GlobalUsersMaildropDestinationMapper;
import mireka.login.GlobalUsersPrincipalMaildropTable;
import mireka.login.Username;
import mireka.pop.PopServer;
import mireka.pop.store.MaildropRepository;
import mireka.smtp.server.MessageHandlerFactoryImpl;
import mireka.smtp.server.SMTPServer;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.subethamail.smtp.client.SMTPException;
import org.subethamail.smtp.client.SmartClient;
public class MxPopTest extends TempDirectory {
private static final int PORT_SMTP = 8025;
private static final int PORT_POP = 8026;
private GlobalUsers users;
private MaildropRepository maildropRepository;
private PopServer popServer;
private SMTPServer smtpServer;
@Test
public void testReceiveRetrieve() throws IOException, SMTPException,
MessagingException {
sendMail();
retrieveMail();
}
private void sendMail() throws UnknownHostException, IOException,
SMTPException {
SmartClient client =
new SmartClient("localhost", PORT_SMTP, "SmartClient");
client.from("jane@example.com");
client.to("john@example.com");
client.dataStart();
byte[] exampleMail = ExampleMailData.simple().bytes;
client.dataWrite(exampleMail, exampleMail.length);
client.dataEnd();
client.quit();
}
private void retrieveMail() throws NoSuchProviderException,
MessagingException, IOException {
Properties properties = new Properties();
Session session = Session.getInstance(properties);
Store store =
session.getStore(new URLName("pop3://john:secret@localhost:"
+ PORT_POP + "/INBOX"));
store.connect();
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
Message[] messages = folder.getMessages();
assertEquals(1, messages.length);
Message message = messages[0];
assertEquals("Hello World!\r\n", message.getContent());
message.setFlag(Flags.Flag.DELETED, true);
folder.close(true);
store.close();
}
@Before
public void setup() {
initCommonConfiguration();
smtpServer = createSmtpServer();
smtpServer.start();
popServer = createPopServer();
popServer.start();
}
private void initCommonConfiguration() {
users = new GlobalUsers();
GlobalUser user = new GlobalUser();
user.setUsername(new Username("john"));
user.setPassword("secret");
users.addUser(user);
maildropRepository = new MaildropRepository();
maildropRepository.setDir(directory);
}
private SMTPServer createSmtpServer() {
GlobalUsersMaildropDestinationMapper recipientDestinationMapper =
new GlobalUsersMaildropDestinationMapper();
recipientDestinationMapper.setUsers(users);
recipientDestinationMapper.setMaildropRepository(maildropRepository);
LookupDestinationFilter lookupDestinationFilter =
new LookupDestinationFilter();
lookupDestinationFilter
.setRecipientDestinationMapper(recipientDestinationMapper);
Filters filters = new Filters();
filters.addFilter(lookupDestinationFilter);
filters.addFilter(new DestinationProcessorFilter());
MessageHandlerFactoryImpl handlerFactory =
new MessageHandlerFactoryImpl();
handlerFactory.setFilters(filters);
SMTPServer smtpServer = new SMTPServer(handlerFactory);
smtpServer.setPort(PORT_SMTP);
return smtpServer;
}
private PopServer createPopServer() {
GlobalUsersLoginSpecification loginSpecification =
new GlobalUsersLoginSpecification();
loginSpecification.setUsers(users);
GlobalUsersPrincipalMaildropTable principalMaildropTable =
new GlobalUsersPrincipalMaildropTable();
PopServer popServer = new PopServer();
popServer.setMaildropRepository(maildropRepository);
popServer.setLoginSpecification(loginSpecification);
popServer.setPrincipalMaildropTable(principalMaildropTable);
popServer.setPort(PORT_POP);
return popServer;
}
@After
public void tearDown() {
popServer.shutdown();
smtpServer.stop();
}
}