View Javadoc

1   /*
2    * $Id: AbstractEmailFunctionalTestCase.java 20799 2010-12-19 05:56:37Z dirk.olmes $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.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.DefaultMuleMessage;
14  import org.mule.api.MuleMessage;
15  import org.mule.config.i18n.LocaleMessageHandler;
16  import org.mule.module.client.MuleClient;
17  import org.mule.tck.DynamicPortTestCase;
18  import org.mule.transport.email.GreenMailUtilities;
19  import org.mule.transport.email.ImapConnector;
20  import org.mule.transport.email.MailProperties;
21  import org.mule.transport.email.Pop3Connector;
22  import org.mule.util.SystemUtils;
23  
24  import com.icegreen.greenmail.util.GreenMail;
25  import com.icegreen.greenmail.util.ServerSetup;
26  
27  import java.util.HashMap;
28  import java.util.Locale;
29  import java.util.Map;
30  
31  import javax.activation.CommandMap;
32  import javax.activation.MailcapCommandMap;
33  import javax.mail.Address;
34  import javax.mail.Message;
35  import javax.mail.internet.MimeMessage;
36  import javax.mail.internet.MimeMultipart;
37  
38  public abstract class AbstractEmailFunctionalTestCase extends DynamicPortTestCase
39  {
40      public static final long DELIVERY_DELAY_MS = 10000;
41  
42      protected static final String CONFIG_BASE = "-functional-test.xml";
43      protected static final boolean MIME_MESSAGE = true;
44      protected static final boolean STRING_MESSAGE = false;
45  
46      protected static final String DEFAULT_EMAIL = "bob@example.com";
47      protected static final String DEFAULT_USER = "bob";
48      protected static final String DEFAULT_MESSAGE = "Test email message";
49      protected static final String DEFAULT_PASSWORD = "password";
50  
51      private String protocol;
52      private boolean isMimeMessage;
53      private int port;
54      private String configFile;
55      protected GreenMail server;
56      private String email;
57      private String user;
58      private String message;
59      private String password;
60      private String charset;
61      private boolean addAttachments;
62  
63      protected AbstractEmailFunctionalTestCase(boolean isMimeMessage, String protocol)
64      {
65          this(isMimeMessage, protocol, protocol + CONFIG_BASE, null, null);
66      }
67  
68      protected AbstractEmailFunctionalTestCase(boolean isMimeMessage, String protocol, Locale locale, String charset)
69      {
70          this(isMimeMessage, protocol, protocol + CONFIG_BASE, locale, charset);
71      }
72  
73      protected AbstractEmailFunctionalTestCase(boolean isMimeMessage, String protocol, String configFile)
74      {
75          this(isMimeMessage, protocol, configFile, null, null);
76      }
77  
78      protected AbstractEmailFunctionalTestCase(boolean isMimeMessage, String protocol, String configFile, Locale locale, String charset)
79      {
80          this(isMimeMessage, protocol, configFile,
81                  DEFAULT_EMAIL, DEFAULT_USER, (locale == null ? DEFAULT_MESSAGE : getMessage(locale)), DEFAULT_PASSWORD, charset);
82      }
83  
84      protected AbstractEmailFunctionalTestCase(boolean isMimeMessage, String protocol,
85          String configFile, String email, String user, String message, String password, String charset)
86      {
87          this.isMimeMessage = isMimeMessage;
88          this.protocol = protocol;
89          this.configFile = configFile;
90          this.email = email;
91          this.user = user;
92          this.message = message;
93          this.password = password;
94          this.charset = charset;
95      }
96  
97      @Override
98      protected String getConfigResources()
99      {
100         return configFile;
101     }
102 
103     @Override
104     protected void suitePreSetUp() throws Exception
105     {
106         this.port = getPorts().get(0);
107         startServer();
108         initDefaultCommandMap();
109     }
110 
111     /**
112      * This is required to make all tests work on JDK5.
113      */
114     private void initDefaultCommandMap()
115     {
116         if (SystemUtils.JAVA_VERSION_FLOAT < 1.6f)
117         {
118             MailcapCommandMap commandMap = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
119             commandMap.addMailcap("application/xml;;  x-java-content-handler=com.sun.mail.handlers.text_plain");
120             commandMap.addMailcap("application/text;; x-java-content-handler=com.sun.mail.handlers.text_plain");
121             CommandMap.setDefaultCommandMap(commandMap);
122         }
123     }
124 
125     @Override
126     protected void suitePostTearDown() throws Exception
127     {
128         stopServer();
129     }
130 
131     protected void doSend() throws Exception
132     {
133         Object msg;
134         if (isMimeMessage)
135         {
136             msg = GreenMailUtilities.toMessage(message, email, charset);
137         }
138         else
139         {
140             msg = message;
141         }
142 
143         MuleClient client = new MuleClient(muleContext);
144         Map<String, Object> props = null;
145         if (charset != null)
146         {
147             props = new HashMap<String, Object>();
148             props.put(MailProperties.CONTENT_TYPE_PROPERTY, "text/plain; charset=" + charset);
149         }
150         if (addAttachments)
151         {
152             MuleMessage muleMessage = new DefaultMuleMessage(msg, props, muleContext);
153             createOutboundAttachments(muleMessage);
154             client.dispatch("vm://send", muleMessage);
155         }
156         else
157         {
158             client.dispatch("vm://send", msg, props);
159         }
160 
161         server.waitForIncomingEmail(DELIVERY_DELAY_MS, 1);
162 
163         MimeMessage[] messages = server.getReceivedMessages();
164         assertNotNull("did not receive any messages", messages);
165         assertEquals("did not receive 1 mail", 1, messages.length);
166         verifyMessage(messages[0]);
167     }
168 
169     protected void verifyMessage(MimeMessage received) throws Exception
170     {
171         if (addAttachments)
172         {
173             assertTrue("Did not receive a multipart message",
174                 received.getContent() instanceof MimeMultipart);
175             verifyMessage((MimeMultipart) received.getContent());
176         }
177         else
178         {
179             assertTrue("Did not receive a message with String contents",
180                 received.getContent() instanceof String);
181             verifyMessage((String) received.getContent());
182         }
183 
184         Address[] recipients = received.getRecipients(Message.RecipientType.TO);
185         assertNotNull(recipients);
186         assertEquals("number of recipients", 1, recipients.length);
187         assertEquals("recipient", email, recipients[0].toString());
188     }
189 
190     protected void verifyMessage(MimeMultipart mimeMultipart) throws Exception
191     {
192         fail("multipart message was not expected");
193     }
194 
195     protected void verifyMessage(String receivedText)
196     {
197         // for some reason, something is adding a newline at the end of messages
198         // so we need to strip that out for comparison
199         assertEquals(message, receivedText.trim());
200     }
201 
202     protected void doRequest() throws Exception
203     {
204         assertEquals(1, server.getReceivedMessages().length);
205 
206         MuleClient client = new MuleClient(muleContext);
207         MuleMessage reply = client.request("vm://receive", RECEIVE_TIMEOUT);
208 
209         assertNotNull(reply);
210         Object payload = reply.getPayload();
211         if (isMimeMessage)
212         {
213             assertTrue("payload is " + payload.getClass().getName(), payload instanceof MimeMessage);
214             verifyMessage((MimeMessage) payload);
215         }
216         else
217         {
218             assertTrue(payload instanceof String);
219             verifyMessage((String) payload);
220         }
221     }
222 
223     private void startServer() throws Exception
224     {
225         logger.debug("starting server on port " + port);
226         ServerSetup setup = new ServerSetup(port, null, protocol);
227         server = new GreenMail(setup);
228         server.start();
229         if (protocol.startsWith(Pop3Connector.POP3) || protocol.startsWith(ImapConnector.IMAP))
230         {
231             GreenMailUtilities.storeEmail(server.getManagers().getUserManager(),
232                     email, user, password,
233                     GreenMailUtilities.toMessage(message, email, charset));
234         }
235         logger.debug("server started for protocol " + protocol);
236     }
237 
238     private void stopServer()
239     {
240         server.stop();
241     }
242 
243     private static String getMessage(Locale locale)
244     {
245         return LocaleMessageHandler.getString("test-data", locale, "AbstractEmailFunctionalTestCase.getMessage", new Object[] {});
246     }
247 
248     @Override
249     protected int getNumPortsToFind()
250     {
251         return 1;
252     }
253 
254     public void setAddAttachments(boolean addAttachments)
255     {
256         this.addAttachments = addAttachments;
257     }
258 
259     private void createOutboundAttachments(MuleMessage msg) throws Exception
260     {
261         msg.addOutboundAttachment("hello", "hello", "text/plain");
262         msg.addOutboundAttachment("goodbye", "<a/>", "text/xml");
263     }
264 }