/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.axis2.transport.mail; import java.io.OutputStream; import java.net.InetSocketAddress; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.mail.Flags; import org.apache.axis2.transport.testkit.name.Key; import org.apache.axis2.transport.testkit.name.Name; import org.apache.axis2.transport.testkit.tests.Setup; import org.apache.axis2.transport.testkit.tests.TearDown; import org.apache.axis2.transport.testkit.tests.Transient; import org.apache.axis2.transport.testkit.util.LogManager; import org.apache.axis2.transport.testkit.util.PortAllocator; import org.apache.axis2.transport.testkit.util.ServerUtil; import org.apache.axis2.transport.testkit.util.tcpmon.Tunnel; import com.icegreen.greenmail.store.FolderListener; import com.icegreen.greenmail.store.MailFolder; import com.icegreen.greenmail.store.StoredMessage; import com.icegreen.greenmail.user.GreenMailUser; import com.icegreen.greenmail.util.GreenMail; import com.icegreen.greenmail.util.ServerSetup; @Name("greenmail") public class GreenMailTestEnvironment extends MailTestEnvironment { private final String protocol; private @Transient PortAllocator portAllocator; private @Transient ServerSetup smtpServerSetup; private @Transient ServerSetup storeServerSetup; private @Transient LogManager logManager; private @Transient GreenMail greenMail; private @Transient Tunnel smtpTunnel; private int accountNumber; private @Transient List<Account> unallocatedAccounts; public GreenMailTestEnvironment(String protocol) { this.protocol = protocol; } @Setup @SuppressWarnings("unused") private void setUp(LogManager logManager, PortAllocator portAllocator) throws Exception { this.logManager = logManager; this.portAllocator = portAllocator; smtpServerSetup = new ServerSetup(portAllocator.allocatePort(), "127.0.0.1", ServerSetup.PROTOCOL_SMTP); storeServerSetup = new ServerSetup(portAllocator.allocatePort(), "127.0.0.1", protocol); greenMail = new GreenMail(new ServerSetup[] { smtpServerSetup, storeServerSetup }); greenMail.start(); smtpTunnel = new Tunnel(new InetSocketAddress("127.0.0.1", smtpServerSetup.getPort())); smtpTunnel.start(); unallocatedAccounts = new LinkedList<Account>(); ServerUtil.waitForServer(smtpServerSetup.getPort()); ServerUtil.waitForServer(storeServerSetup.getPort()); } @TearDown @SuppressWarnings("unused") private void tearDown() throws Exception { greenMail.stop(); accountNumber = 1; portAllocator.releasePort(smtpServerSetup.getPort()); portAllocator.releasePort(storeServerSetup.getPort()); } @Override @Key("protocol") public String getProtocol() { return protocol; } @Override public Account allocateAccount() throws Exception { if (unallocatedAccounts.isEmpty()) { String login = "test" + accountNumber++; GreenMailUser user = greenMail.setUser(login + "@localhost", login, "password"); final MailFolder inbox = greenMail.getManagers().getImapHostManager().getInbox(user); inbox.addListener(new FolderListener() { public void added(int msn) { StoredMessage storedMessage = (StoredMessage)inbox.getMessages().get(msn-1); try { OutputStream out = logManager.createLog("greenmail"); try { storedMessage.getMimeMessage().writeTo(out); } finally { out.close(); } } catch (Exception ex) { ex.printStackTrace(); } } public void expunged(int msn) {} public void flagsUpdated(int msn, Flags flags, Long uid) {} public void mailboxDeleted() {} }); return new Account(user.getEmail(), user.getLogin(), user.getPassword()); } else { return unallocatedAccounts.remove(0); } } @Override public void freeAccount(Account account) { unallocatedAccounts.add(account); } @Override public Map<String,String> getInProperties(Account account) { Map<String,String> props = new HashMap<String,String>(); props.put("mail." + protocol + ".host", "localhost"); props.put("mail." + protocol + ".port", String.valueOf(storeServerSetup.getPort())); props.put("mail." + protocol + ".user", account.getLogin()); props.put("mail." + protocol + ".password", account.getPassword()); return props; } @Override public Map<String,String> getOutProperties() { Map<String,String> props = new HashMap<String,String>(); props.put("mail.smtp.host", "localhost"); props.put("mail.smtp.port", String.valueOf(smtpTunnel.getPort())); return props; } }