blob: 3579fb86c70fd29c3034edf57e5eac646b791d7d [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.james.mime4j.message;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import org.apache.james.mime4j.Charsets;
import org.apache.james.mime4j.dom.BinaryBody;
import org.apache.james.mime4j.dom.Entity;
import org.apache.james.mime4j.dom.Header;
import org.apache.james.mime4j.dom.Multipart;
import org.apache.james.mime4j.dom.TextBody;
import org.apache.james.mime4j.dom.field.ContentTransferEncodingField;
import org.apache.james.mime4j.dom.field.ContentTypeField;
import org.apache.james.mime4j.stream.Field;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;
public class MultipartBuilderTest {
@Test
public void testBasis() throws Exception {
MultipartBuilder builder = MultipartBuilder.create("stuff");
builder.setPreamble("Hello");
builder.setEpilogue("Bye");
Assert.assertEquals("stuff", builder.getSubType());
Assert.assertEquals("Hello", builder.getPreamble());
Assert.assertEquals("Bye", builder.getEpilogue());
TextBody body1 = BasicBodyFactory.INSTANCE.textBody("test");
final BodyPart bodyPart1 = new BodyPart();
bodyPart1.setBody(body1);
BinaryBody body2 = BasicBodyFactory.INSTANCE.binaryBody(new byte[]{1, 2, 3});
final BodyPart bodyPart2 = new BodyPart();
bodyPart2.setBody(body2);
builder.addBodyPart(bodyPart1);
builder.addBodyPart(bodyPart2, 0);
Assert.assertEquals(2, builder.getCount());
Assert.assertEquals(Arrays.asList(bodyPart2, bodyPart1), builder.getBodyParts());
TextBody body3 = BasicBodyFactory.INSTANCE.textBody("test");
final BodyPart bodyPart3 = new BodyPart();
bodyPart3.setBody(body3);
try {
builder.addBodyPart(bodyPart3, 5);
Assert.fail("IndexOutOfBoundsException expected");
} catch (IndexOutOfBoundsException expected) {
}
try {
builder.replaceBodyPart(bodyPart3, 5);
Assert.fail("IndexOutOfBoundsException expected");
} catch (IndexOutOfBoundsException expected) {
}
builder.replaceBodyPart(bodyPart3, 1);
builder.removeBodyPart(0);
Assert.assertEquals(1, builder.getCount());
Assert.assertEquals(Arrays.asList(bodyPart3), builder.getBodyParts());
}
@Test
public void testAddCustomPart() throws Exception {
MultipartBuilder builder = MultipartBuilder.create();
BodyFactory bodyFactory = Mockito.spy(new BasicBodyFactory());
builder.use(bodyFactory);
builder.addTextPart("stuff1", Charsets.UTF_8);
builder.addTextPart("stuff2", null);
builder.addBinaryPart(new byte[]{1, 2, 3}, "some/stuff");
builder.addBinaryPart(new byte[] {1,2,3}, null);
builder.addTextPart("stuff3", Charsets.US_ASCII);
Assert.assertEquals(5, builder.getCount());
List<Entity> bodyParts = builder.getBodyParts();
Assert.assertNotNull(bodyParts);
Assert.assertEquals(5, bodyParts.size());
Entity entity1 = bodyParts.get(0);
ContentTypeField ct1 = entity1.getHeader().getField("Content-Type", ContentTypeField.class);
Assert.assertEquals("text/plain", ct1.getMimeType());
Assert.assertEquals("UTF-8", ct1.getCharset());
ContentTransferEncodingField te1 = entity1.getHeader().getField("Content-Transfer-Encoding", ContentTransferEncodingField.class);
Assert.assertEquals("quoted-printable", te1.getEncoding());
Entity entity2 = bodyParts.get(1);
ContentTypeField ct2 = entity2.getHeader().getField("Content-Type", ContentTypeField.class);
Assert.assertEquals("text/plain", ct2.getMimeType());
Assert.assertEquals("ISO-8859-1", ct2.getCharset());
ContentTransferEncodingField te2 = entity2.getHeader().getField("Content-Transfer-Encoding", ContentTransferEncodingField.class);
Assert.assertEquals("quoted-printable", te2.getEncoding());
Entity entity3 = bodyParts.get(2);
ContentTypeField ct3 = entity3.getHeader().getField("Content-Type", ContentTypeField.class);
Assert.assertEquals("some/stuff", ct3.getMimeType());
Assert.assertEquals(null, ct3.getCharset());
ContentTransferEncodingField te3 = entity3.getHeader().getField("Content-Transfer-Encoding", ContentTransferEncodingField.class);
Assert.assertEquals("base64", te3.getEncoding());
Entity entity4 = bodyParts.get(3);
ContentTypeField ct4 = entity4.getHeader().getField("Content-Type", ContentTypeField.class);
Assert.assertEquals("application/octet-stream", ct4.getMimeType());
Assert.assertEquals(null, ct4.getCharset());
ContentTransferEncodingField te4 = entity4.getHeader().getField("Content-Transfer-Encoding", ContentTransferEncodingField.class);
Assert.assertEquals("base64", te4.getEncoding());
Entity entity5 = bodyParts.get(4);
ContentTypeField ct5 = entity5.getHeader().getField("Content-Type", ContentTypeField.class);
Assert.assertEquals("text/plain", ct5.getMimeType());
Assert.assertEquals("US-ASCII", ct5.getCharset());
ContentTransferEncodingField te5 = entity5.getHeader().getField("Content-Transfer-Encoding", ContentTransferEncodingField.class);
Assert.assertEquals("7bit", te5.getEncoding());
Mockito.verify(bodyFactory, Mockito.times(1)).textBody(
Mockito.<InputStream>any(), Mockito.eq("UTF-8"));
Mockito.verify(bodyFactory, Mockito.times(1)).textBody(
Mockito.<InputStream>any(), Mockito.eq("ISO-8859-1"));
Mockito.verify(bodyFactory, Mockito.times(1)).textBody(
Mockito.<InputStream>any(), Mockito.eq("US-ASCII"));
Mockito.verify(bodyFactory, Mockito.times(2)).binaryBody(Mockito.<InputStream>any());
}
@Test
public void testCopy() throws Exception {
MultipartBuilder builder1 = MultipartBuilder.create("stuff");
builder1.setPreamble("Hello");
builder1.setEpilogue("Bye");
builder1.addTextPart("stuff1", Charsets.UTF_8);
builder1.addBinaryPart(new byte[]{1, 2, 3}, "some/stuff");
Multipart multipart = builder1.build();
MultipartBuilder builder2 = MultipartBuilder.createCopy(multipart);
Assert.assertEquals("stuff", builder2.getSubType());
Assert.assertEquals("Hello", builder2.getPreamble());
Assert.assertEquals("Bye", builder2.getEpilogue());
Assert.assertEquals(2, builder2.getCount());
List<Entity> bodyParts = builder2.getBodyParts();
Assert.assertNotNull(bodyParts);
Assert.assertEquals(2, bodyParts.size());
Entity entity1 = bodyParts.get(0);
Assert.assertNotNull(entity1);
Header header1 = entity1.getHeader();
Assert.assertNotNull(header1);
List<Field> fields1 = header1.getFields();
Assert.assertNotNull(fields1);
Assert.assertEquals(2, fields1.size());
ContentTypeField ct1 = header1.getField("Content-Type", ContentTypeField.class);
Assert.assertEquals("text/plain", ct1.getMimeType());
Assert.assertEquals("UTF-8", ct1.getCharset());
ContentTransferEncodingField te1 = header1.getField("Content-Transfer-Encoding", ContentTransferEncodingField.class);
Assert.assertEquals("quoted-printable", te1.getEncoding());
Entity entity2 = bodyParts.get(1);
Assert.assertNotNull(entity2);
Header header2 = entity2.getHeader();
Assert.assertNotNull(header2);
List<Field> fields2 = header2.getFields();
Assert.assertNotNull(fields2);
Assert.assertEquals(2, fields2.size());
ContentTypeField ct2 = header2.getField("Content-Type", ContentTypeField.class);
Assert.assertEquals("some/stuff", ct2.getMimeType());
Assert.assertEquals(null, ct2.getCharset());
ContentTransferEncodingField te2 = entity2.getHeader().getField("Content-Transfer-Encoding", ContentTransferEncodingField.class);
Assert.assertEquals("base64", te2.getEncoding());
}
}