blob: fb1fb5347f31c778a52984b50690eeac9a2e2dca [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.field;
import java.util.Date;
import junit.framework.TestCase;
import org.apache.james.mime4j.MimeException;
import org.apache.james.mime4j.dom.field.ContentDispositionField;
import org.apache.james.mime4j.stream.RawField;
import org.apache.james.mime4j.stream.RawFieldParser;
import org.apache.james.mime4j.util.ByteSequence;
import org.apache.james.mime4j.util.ContentUtil;
public class ContentDispositionFieldTest extends TestCase {
static ContentDispositionField parse(final String s) throws MimeException {
ByteSequence raw = ContentUtil.encode(s);
RawField rawField = RawFieldParser.DEFAULT.parseField(raw);
return ContentDispositionFieldImpl.PARSER.parse(rawField, null);
}
public void testDispositionTypeWithSemiColonNoParams() throws Exception {
ContentDispositionField f = parse("Content-Disposition: inline;");
assertEquals("inline", f.getDispositionType());
}
public void testGetDispositionType() throws Exception {
ContentDispositionField f = parse("Content-Disposition: attachment");
assertEquals("attachment", f.getDispositionType());
f = parse("content-disposition: InLiNe ");
assertEquals("inline", f.getDispositionType());
f = parse("CONTENT-DISPOSITION: x-yada ;" + " param = yada");
assertEquals("x-yada", f.getDispositionType());
f = parse("CONTENT-DISPOSITION: ");
assertEquals("", f.getDispositionType());
}
public void testGetParameter() throws Exception {
ContentDispositionField f = parse("CONTENT-DISPOSITION: inline ;"
+ " filename=yada yada");
assertEquals("yada", f.getParameter("filename"));
f = parse("Content-Disposition: x-yada;"
+ " fileNAme= \"ya:\\\"*da\"; " + "\tSIZE\t = 1234");
assertEquals("ya:\"*da", f.getParameter("filename"));
assertEquals("1234", f.getParameter("size"));
f = parse("Content-Disposition: x-yada; "
+ "fileNAme= \"ya \\\"\\\"\tda \\\"\"; "
+ "\tx-Yada\t = \"\\\"hepp\\\" =us\t-ascii\"");
assertEquals("ya \"\"\tda \"", f.getParameter("filename"));
assertEquals("\"hepp\" =us\t-ascii", f.getParameter("x-yada"));
}
public void testIsDispositionType() throws Exception {
ContentDispositionField f = parse("Content-Disposition:INline");
assertTrue(f.isDispositionType("InLiNe"));
assertFalse(f.isDispositionType("NiLiNe"));
assertTrue(f.isInline());
assertFalse(f.isAttachment());
f = parse("Content-Disposition: attachment");
assertTrue(f.isDispositionType("ATTACHMENT"));
assertFalse(f.isInline());
assertTrue(f.isAttachment());
f = parse("Content-Disposition: x-something");
assertTrue(f.isDispositionType("x-SomeThing"));
assertFalse(f.isInline());
assertFalse(f.isAttachment());
}
private static String getMessage(ContentDispositionField field) {
if( field.getParseException() == null) {
return "";
}
return field.getParseException().getMessage() + " when parsing " + field.getRaw();
}
public void testGetFilename() throws Exception {
ContentDispositionField f = parse("Content-Disposition: inline; filename=yada.txt");
assertEquals("yada.txt", f.getFilename());
f = parse("Content-Disposition: inline; filename=yada yada.txt");
assertEquals("yada", f.getFilename());
f = parse("Content-Disposition: inline; filename=\"yada yada.txt\"");
assertEquals("yada yada.txt", f.getFilename());
f = parse("Content-Disposition: inline");
assertNull(f.getFilename());
}
public void testNonAsciiFilename() throws MimeException {
ContentDispositionField f =
parse("Content-Disposition: attachment;"
+ "\nfilename*0=\"=?UTF-8?Q?3-2_FORPROSJEKT_2-Sheet_-_XXX_A_2_40_?="
+ "\n=?UTF-8?Q?\";"
+ "\nfilename*1=\"201_-_Fasader_nord=C3=B8st_og_nordvest.dwg?=\"");
assertEquals(getMessage(f),
"3-2 FORPROSJEKT 2-Sheet - XXX A 2 40 201 - Fasader nordøst og nordvest.dwg",
f.getFilename());
}
public void testExtendedNotation() throws MimeException {
ContentDispositionField f = parse("Content-Disposition: attachment;\n" +
" filename*=utf-8''%D8%AF%D9%8A%D9%86%D8%A7%D8%B5%D9%88%D8%B1%2E%6F%64%74");
String name = f.getFilename();
assertEquals(getMessage(f), "ديناصور.odt", name);
}
public void testExtendedNotationWithEmptyCharsetShouldNotCrash() throws MimeException {
String fileName = "''%D8%AF%D9%8A%D9%86%D8%A7%D8%B5%D9%88%D8%B1%2E%6F%64%74";
String fileNameString = String.format("\"Content-Disposition: attachment;\n" +
" \nfilename*=%s\"", fileName);
ContentDispositionField f = parse(fileNameString);
String name = f.getFilename();
assertEquals(getMessage(f), "%D8%AF%D9%8A%D9%86%D8%A7%D8%B5%D9%88%D8%B1%2E%6F%64%74", name);
}
public void testFileNameWithInitialSection() throws MimeException {
ContentDispositionField f = parse("Content-Disposition: attachment;"
+ "\nfilename*0*=filename.txt");
assertEquals(getMessage(f),"filename.txt", f.getFilename());
}
public void testFileNameWithMultipleSections() throws MimeException {
ContentDispositionField f = parse("Content-Disposition: attachment;"
+ "\nfilename*0=\"first part \"; filename*1=\"of long filename.txt\"");
f.getFilename();
assertEquals(getMessage(f),"first part of long filename.txt", f.getFilename());
}
public void testGetCreationDate() throws Exception {
ContentDispositionField f = parse("Content-Disposition: inline; "
+ "creation-date=\"Tue, 01 Jan 1970 00:00:00 +0000\"");
assertEquals(new Date(0), f.getCreationDate());
f = parse("Content-Disposition: inline; "
+ "creation-date=Tue, 01 Jan 1970 00:00:00 +0000");
assertNull(f.getCreationDate());
f = parse("Content-Disposition: attachment");
assertNull(f.getCreationDate());
}
public void testGetModificationDate() throws Exception {
ContentDispositionField f = parse("Content-Disposition: inline; "
+ "modification-date=\"Tue, 01 Jan 1970 00:00:00 +0000\"");
assertEquals(new Date(0), f.getModificationDate());
f = parse("Content-Disposition: inline; "
+ "modification-date=\"Wed, 12 Feb 1997 16:29:51 -0500\"");
assertEquals(new Date(855782991000l), f.getModificationDate());
f = parse("Content-Disposition: inline; "
+ "modification-date=yesterday");
assertNull(f.getModificationDate());
f = parse("Content-Disposition: attachment");
assertNull(f.getModificationDate());
}
public void testGetReadDate() throws Exception {
ContentDispositionField f = parse("Content-Disposition: inline; "
+ "read-date=\"Tue, 01 Jan 1970 00:00:00 +0000\"");
assertEquals(new Date(0), f.getReadDate());
f = parse("Content-Disposition: inline; read-date=");
assertNull(f.getReadDate());
f = parse("Content-Disposition: attachment");
assertNull(f.getReadDate());
}
public void testGetSize() throws Exception {
ContentDispositionField f = parse("Content-Disposition: attachment; size=0");
assertEquals(0, f.getSize());
f = parse("Content-Disposition: attachment; size=matters");
assertEquals(-1, f.getSize());
f = parse("Content-Disposition: attachment");
assertEquals(-1, f.getSize());
f = parse("Content-Disposition: attachment; size=-12");
assertEquals(-1, f.getSize());
f = parse("Content-Disposition: attachment; size=12");
assertEquals(12, f.getSize());
}
}