1   /*
2    * $Id: AbstractEmailFunctionalTestCase.java 11511 2008-03-26 03:22:01Z dirk.olmes $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
9    */
10  
11  package org.mule.transport.email.functional;
12  
13  import org.mule.api.MuleMessage;
14  import org.mule.module.client.MuleClient;
15  import org.mule.tck.FunctionalTestCase;
16  import org.mule.transport.email.GreenMailUtilities;
17  import org.mule.transport.email.ImapConnector;
18  import org.mule.transport.email.Pop3Connector;
19  
20  import com.icegreen.greenmail.util.GreenMail;
21  import com.icegreen.greenmail.util.ServerSetup;
22  
23  import java.io.IOException;
24  
25  import javax.mail.Message;
26  import javax.mail.MessagingException;
27  import javax.mail.internet.MimeMessage;
28  
29  public abstract class AbstractEmailFunctionalTestCase extends FunctionalTestCase
30  {
31  
32      protected static final String CONFIG_BASE = "-functional-test.xml";
33      protected static final long DELIVERY_DELAY_MS = 1000L;
34      protected static final boolean MIME_MESSAGE = true;
35      protected static final boolean STRING_MESSAGE = false;
36  
37      protected static final String DEFAULT_EMAIL = "bob@example.com";
38      protected static final String DEFAULT_USER = "bob";
39      protected static final String DEFAULT_MESSAGE = "Test email message";
40      protected static final String DEFAULT_PASSWORD = "password";
41  
42      private String protocol;
43      private boolean isMimeMessage;
44      private int port;
45      private String configFile;
46      private GreenMail server;
47      private String email;
48      private String user;
49      private String message;
50      private String password;
51  
52      protected AbstractEmailFunctionalTestCase(int port, boolean isMimeMessage, String protocol)
53      {
54          this(port, isMimeMessage, protocol, protocol + CONFIG_BASE);
55      }
56  
57      protected AbstractEmailFunctionalTestCase(int port, boolean isMimeMessage, String protocol, String configFile)
58      {
59          this(port, isMimeMessage, protocol, configFile,
60                  DEFAULT_EMAIL, DEFAULT_USER, DEFAULT_MESSAGE, DEFAULT_PASSWORD);
61      }
62  
63      protected AbstractEmailFunctionalTestCase(int port, boolean isMimeMessage, String protocol, String configFile,
64                                                String email, String user, String message,
65                                                String password)
66      {
67          this.isMimeMessage = isMimeMessage;
68          this.protocol = protocol;
69          this.port = port;
70          this.configFile = configFile;
71          this.email = email;
72          this.user = user;
73          this.message = message;
74          this.password = password;
75      }
76  
77      protected String getConfigResources()
78      {
79          return configFile;
80      }
81  
82      // @Override
83      protected void suitePreSetUp() throws Exception
84      {
85          startServer();
86      }
87  
88  
89      // @Override
90      protected void suitePostTearDown() throws Exception
91      {
92          stopServer();
93      }
94  
95      protected void doSend() throws Exception
96      {
97          Object msg;
98          if (isMimeMessage)
99          {
100             msg = GreenMailUtilities.toMessage(message, email);
101         }
102         else
103         {
104             msg = message;
105         }
106 
107         MuleClient client = new MuleClient();
108         client.send("vm://send", msg, null);
109 
110         server.waitForIncomingEmail(DELIVERY_DELAY_MS, 1);
111 
112         MimeMessage[] messages = server.getReceivedMessages();
113         assertNotNull("did not receive any messages", messages);
114         assertEquals("did not receive 1 mail", 1, messages.length);
115         verifyMessage(messages[0]);
116     }
117 
118     protected void verifyMessage(MimeMessage received) throws IOException, MessagingException
119     {
120         assertTrue("Did not receive a message with String contents",
121             received.getContent() instanceof String);
122         verifyMessage((String) received.getContent());
123         assertNotNull(received.getRecipients(Message.RecipientType.TO));
124         assertEquals(1, received.getRecipients(Message.RecipientType.TO).length);
125         assertEquals(received.getRecipients(Message.RecipientType.TO)[0].toString(), email);
126     }
127 
128     protected void verifyMessage(String receivedText)
129     {
130         // for some reason, something is adding a newline at the end of messages
131         // so we need to strip that out for comparison
132         assertEquals(message, receivedText.trim());
133     }
134 
135     protected void doRequest() throws Exception
136     {
137         assertEquals(1, server.getReceivedMessages().length);
138 
139         MuleClient client = new MuleClient();
140         MuleMessage message = client.request("vm://receive", 5000);
141         
142         assertNotNull(message);
143         Object payload = message.getPayload();
144         if (isMimeMessage)
145         {
146             assertTrue(payload instanceof MimeMessage);
147             verifyMessage((MimeMessage) payload);
148         }
149         else
150         {
151             assertTrue(payload instanceof String);
152             verifyMessage((String) payload);
153         }
154     }
155 
156     private void startServer() throws Exception
157     {
158         logger.debug("starting server on port " + port);
159         ServerSetup setup = new ServerSetup(port, null, protocol);
160         server = new GreenMail(setup);
161         server.start();
162         if (protocol.startsWith(Pop3Connector.POP3) || protocol.startsWith(ImapConnector.IMAP))
163         {
164             GreenMailUtilities.storeEmail(server.getManagers().getUserManager(),
165                     email, user, password,
166                     GreenMailUtilities.toMessage(message, email));
167         }
168         logger.debug("server started for protocol " + protocol);
169     }
170 
171     private void stopServer()
172     {
173         server.stop();
174     }
175 
176 }