blob: 84178d44066af0d8262fd1e2281b33aa7f170b70 [file] [log] [blame]
/*
* 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.commons.mail;
import static org.junit.Assert.*;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import javax.activation.FileDataSource;
import javax.activation.URLDataSource;
import javax.mail.internet.MimeMultipart;
import org.apache.commons.mail.mocks.MockMultiPartEmailConcrete;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
/**
* JUnit test case for MultiPartEmail Class.
*
* @since 1.0
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest( { MockMultiPartEmailConcrete.class, URLDataSource.class })
public class MultiPartEmailTest extends AbstractEmailTest
{
/** */
private MockMultiPartEmailConcrete email;
/** File to used to test file attachments (Must be valid) */
private File testFile;
@Before
public void setUpMultiPartEmailTest() throws Exception
{
// reusable objects to be used across multiple tests
this.email = new MockMultiPartEmailConcrete();
testFile = File.createTempFile("testfile", ".txt");
}
@Test
public void testSetMsg() throws EmailException
{
// ====================================================================
// Test Success
// ====================================================================
// without charset set
for (final String validChar : testCharsValid)
{
this.email.setMsg(validChar);
assertEquals(validChar, this.email.getMsg());
}
// with charset set
this.email.setCharset(EmailConstants.US_ASCII);
for (final String validChar : testCharsValid)
{
this.email.setMsg(validChar);
assertEquals(validChar, this.email.getMsg());
}
// ====================================================================
// Test Exceptions
// ====================================================================
for (final String invalidChar : testCharsNotValid)
{
try
{
this.email.setMsg(invalidChar);
fail("Should have thrown an exception");
}
catch (final EmailException e)
{
assertTrue(true);
}
}
}
/**
* @throws EmailException when a bad address or attachment is used
* @throws IOException when sending fails
*/
@Test
public void testSend() throws EmailException, IOException
{
// ====================================================================
// Test Success
// ====================================================================
this.getMailServer();
final String strSubject = "Test Multipart Send Subject";
final EmailAttachment attachment = new EmailAttachment();
attachment.setPath(testFile.getAbsolutePath());
attachment.setDisposition(EmailAttachment.ATTACHMENT);
attachment.setName("Test_Attachment");
attachment.setDescription("Test Attachment Desc");
final MockMultiPartEmailConcrete testEmail =
new MockMultiPartEmailConcrete();
testEmail.setHostName(this.strTestMailServer);
testEmail.setSmtpPort(this.getMailServerPort());
testEmail.setFrom(this.strTestMailFrom);
testEmail.addTo(this.strTestMailTo);
testEmail.attach(attachment);
testEmail.setSubType("subType");
if (EmailUtils.isNotEmpty(this.strTestUser)
&& EmailUtils.isNotEmpty(this.strTestPasswd))
{
testEmail.setAuthentication(
this.strTestUser,
this.strTestPasswd);
}
testEmail.setSubject(strSubject);
testEmail.setMsg("Test Message");
final Map<String, String> ht = new HashMap<String, String>();
ht.put("X-Priority", "2");
ht.put("Disposition-Notification-To", this.strTestMailFrom);
ht.put("X-Mailer", "Sendmail");
testEmail.setHeaders(ht);
testEmail.send();
this.fakeMailServer.stop();
// validate message
validateSend(
this.fakeMailServer,
strSubject,
testEmail.getMsg(),
testEmail.getFromAddress(),
testEmail.getToAddresses(),
testEmail.getCcAddresses(),
testEmail.getBccAddresses(),
true);
// validate attachment
validateSend(
this.fakeMailServer,
strSubject,
attachment.getName(),
testEmail.getFromAddress(),
testEmail.getToAddresses(),
testEmail.getCcAddresses(),
testEmail.getBccAddresses(),
false);
// ====================================================================
// Test Exceptions
// ====================================================================
try
{
this.getMailServer();
this.email.send();
fail("Should have thrown an exception");
}
catch (final EmailException e)
{
this.fakeMailServer.stop();
}
}
@Test
public void testAttach() throws Exception
{
EmailAttachment attachment;
// ====================================================================
// Test Success - EmailAttachment
// ====================================================================
attachment = new EmailAttachment();
attachment.setName("Test Attachment");
attachment.setDescription("Test Attachment Desc");
attachment.setPath(testFile.getAbsolutePath());
this.email.attach(attachment);
assertTrue(this.email.isBoolHasAttachments());
// ====================================================================
// Test Success - URL
// ====================================================================
attachment = new EmailAttachment();
attachment.setName("Test Attachment");
attachment.setDescription("Test Attachment Desc");
attachment.setURL(new URL(this.strTestURL));
this.email.attach(attachment);
// ====================================================================
// Test Success - File
// ====================================================================
this.email.attach(testFile);
assertTrue(this.email.isBoolHasAttachments());
// ====================================================================
// Test Exceptions
// ====================================================================
// null attachment
try
{
this.email.attach((EmailAttachment) null);
fail("Should have thrown an exception");
}
catch (final EmailException e)
{
assertTrue(true);
}
// bad url
attachment = new EmailAttachment();
try
{
attachment.setURL(createInvalidURL());
this.email.attach(attachment);
fail("Should have thrown an exception");
}
catch (final EmailException e)
{
assertTrue(true);
}
// bad file
attachment = new EmailAttachment();
try
{
attachment.setPath("");
this.email.attach(attachment);
fail("Should have thrown an exception");
}
catch (final EmailException e)
{
assertTrue(true);
}
}
/**
* @throws MalformedURLException when a bad attachment URL is used
* @throws EmailException when a bad address or attachment is used
*/
@Test
public void testAttach2() throws MalformedURLException, EmailException
{
// ====================================================================
// Test Success - URL
// ====================================================================
this.email.attach(
new URL(this.strTestURL),
"Test Attachment",
"Test Attachment Desc");
// bad name
this.email.attach(
new URL(this.strTestURL),
null,
"Test Attachment Desc");
}
@Test
public void testAttach3() throws Exception
{
// ====================================================================
// Test Success - URL
// ====================================================================
this.email.attach(
new URLDataSource(new URL(this.strTestURL)),
"Test Attachment",
"Test Attachment Desc");
// ====================================================================
// Test Exceptions
// ====================================================================
// null datasource
try
{
final URLDataSource urlDs = null;
this.email.attach(urlDs, "Test Attachment", "Test Attachment Desc");
fail("Should have thrown an exception");
}
catch (final EmailException e)
{
assertTrue(true);
}
// invalid datasource
try
{
final URLDataSource urlDs = new URLDataSource(createInvalidURL());
this.email.attach(urlDs, "Test Attachment", "Test Attachment Desc");
fail("Should have thrown an exception");
}
catch (final EmailException e)
{
assertTrue(true);
}
}
@Test
public void testAttachFileLocking() throws Exception {
// ====================================================================
// EMAIL-120: attaching a FileDataSource may result in a locked file
// resource on windows systems
// ====================================================================
final File tmpFile = File.createTempFile("attachment", ".eml");
this.email.attach(
new FileDataSource(tmpFile),
"Test Attachment",
"Test Attachment Desc");
assertTrue(tmpFile.delete());
}
@Test
public void testAddPart() throws Exception
{
// setup
this.email = new MockMultiPartEmailConcrete();
final String strMessage = "hello";
final String strContentType = "text/plain";
// add part
this.email.addPart(strMessage, strContentType);
// validate
assertEquals(
strContentType,
this.email.getContainer().getBodyPart(0).getContentType());
assertEquals(
strMessage,
this.email.getContainer().getBodyPart(0).getDataHandler()
.getContent());
}
@Test
public void testAddPart2() throws Exception
{
// setup
this.email = new MockMultiPartEmailConcrete();
final String strSubtype = "subtype/abc123";
// add part
this.email.addPart(new MimeMultipart(strSubtype));
// validate
assertTrue(
this
.email
.getContainer()
.getBodyPart(0)
.getDataHandler()
.getContentType()
.contains(strSubtype));
}
/** TODO implement test for GetContainer */
@Test
public void testGetContainer()
{
assertTrue(true);
}
/** init called twice should fail */
@Test
public void testInit()
{
// call the init function twice to trigger the IllegalStateException
try
{
this.email.init();
this.email.init();
fail("Should have thrown an exception");
}
catch (final IllegalStateException e)
{
assertTrue(true);
}
}
/** test get/set sub type */
@Test
public void testGetSetSubType()
{
for (final String validChar : testCharsValid)
{
this.email.setSubType(validChar);
assertEquals(validChar, this.email.getSubType());
}
}
}