1
2
3
4
5
6
7
8
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
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
198
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 }