blob: a795c7e6fd5648effc09fac3f8bda09c53379298 [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.fileupload;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
import org.apache.commons.fileupload.portlet.PortletFileUploadTest;
import org.apache.commons.fileupload.servlet.ServletFileUploadTest;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;
/**
* Common tests for implementations of {@link FileUpload}. This is a parameterized test.
* Tests must be valid and common to all implementations of FileUpload added as parameter
* in this class.
*
* @see ServletFileUploadTest
* @see PortletFileUploadTest
* @since 1.4
*/
@RunWith(Parameterized.class)
public class FileUploadTest {
/**
* @return {@link FileUpload} classes under test.
*/
@Parameters(name="{0}")
public static Iterable<? extends Object> data() {
return Util.fileUploadImplementations();
}
/**
* Current parameterized FileUpload.
*/
@Parameter
public FileUpload upload;
// --- Test methods common to all implementations of a FileUpload
@Test
public void testFileUpload()
throws IOException, FileUploadException {
List<FileItem> fileItems = Util.parseUpload(upload,
"-----1234\r\n" +
"Content-Disposition: form-data; name=\"file\"; filename=\"foo.tab\"\r\n" +
"Content-Type: text/whatever\r\n" +
"\r\n" +
"This is the content of the file\n" +
"\r\n" +
"-----1234\r\n" +
"Content-Disposition: form-data; name=\"field\"\r\n" +
"\r\n" +
"fieldValue\r\n" +
"-----1234\r\n" +
"Content-Disposition: form-data; name=\"multi\"\r\n" +
"\r\n" +
"value1\r\n" +
"-----1234\r\n" +
"Content-Disposition: form-data; name=\"multi\"\r\n" +
"\r\n" +
"value2\r\n" +
"-----1234--\r\n");
assertEquals(4, fileItems.size());
FileItem file = fileItems.get(0);
assertEquals("file", file.getFieldName());
assertFalse(file.isFormField());
assertEquals("This is the content of the file\n", file.getString());
assertEquals("text/whatever", file.getContentType());
assertEquals("foo.tab", file.getName());
FileItem field = fileItems.get(1);
assertEquals("field", field.getFieldName());
assertTrue(field.isFormField());
assertEquals("fieldValue", field.getString());
FileItem multi0 = fileItems.get(2);
assertEquals("multi", multi0.getFieldName());
assertTrue(multi0.isFormField());
assertEquals("value1", multi0.getString());
FileItem multi1 = fileItems.get(3);
assertEquals("multi", multi1.getFieldName());
assertTrue(multi1.isFormField());
assertEquals("value2", multi1.getString());
}
@Test
public void testFilenameCaseSensitivity()
throws IOException, FileUploadException {
List<FileItem> fileItems = Util.parseUpload(upload,
"-----1234\r\n" +
"Content-Disposition: form-data; name=\"FiLe\"; filename=\"FOO.tab\"\r\n" +
"Content-Type: text/whatever\r\n" +
"\r\n" +
"This is the content of the file\n" +
"\r\n" +
"-----1234--\r\n");
assertEquals(1, fileItems.size());
FileItem file = fileItems.get(0);
assertEquals("FiLe", file.getFieldName());
assertEquals("FOO.tab", file.getName());
}
/**
* This is what the browser does if you submit the form without choosing a file.
*/
@Test
public void testEmptyFile()
throws UnsupportedEncodingException, FileUploadException {
List<FileItem> fileItems = Util.parseUpload (upload,
"-----1234\r\n" +
"Content-Disposition: form-data; name=\"file\"; filename=\"\"\r\n" +
"\r\n" +
"\r\n" +
"-----1234--\r\n");
assertEquals(1, fileItems.size());
FileItem file = fileItems.get(0);
assertFalse(file.isFormField());
assertEquals("", file.getString());
assertEquals("", file.getName());
}
/**
* Internet Explorer 5 for the Mac has a bug where the carriage
* return is missing on any boundary line immediately preceding
* an input with type=image. (type=submit does not have the bug.)
*/
@Test
public void testIE5MacBug()
throws UnsupportedEncodingException, FileUploadException {
List<FileItem> fileItems = Util.parseUpload(upload,
"-----1234\r\n" +
"Content-Disposition: form-data; name=\"field1\"\r\n" +
"\r\n" +
"fieldValue\r\n" +
"-----1234\n" + // NOTE \r missing
"Content-Disposition: form-data; name=\"submitName.x\"\r\n" +
"\r\n" +
"42\r\n" +
"-----1234\n" + // NOTE \r missing
"Content-Disposition: form-data; name=\"submitName.y\"\r\n" +
"\r\n" +
"21\r\n" +
"-----1234\r\n" +
"Content-Disposition: form-data; name=\"field2\"\r\n" +
"\r\n" +
"fieldValue2\r\n" +
"-----1234--\r\n");
assertEquals(4, fileItems.size());
FileItem field1 = fileItems.get(0);
assertEquals("field1", field1.getFieldName());
assertTrue(field1.isFormField());
assertEquals("fieldValue", field1.getString());
FileItem submitX = fileItems.get(1);
assertEquals("submitName.x", submitX.getFieldName());
assertTrue(submitX.isFormField());
assertEquals("42", submitX.getString());
FileItem submitY = fileItems.get(2);
assertEquals("submitName.y", submitY.getFieldName());
assertTrue(submitY.isFormField());
assertEquals("21", submitY.getString());
FileItem field2 = fileItems.get(3);
assertEquals("field2", field2.getFieldName());
assertTrue(field2.isFormField());
assertEquals("fieldValue2", field2.getString());
}
/**
* Test for <a href="http://issues.apache.org/jira/browse/FILEUPLOAD-62">FILEUPLOAD-62</a>
*/
@Test
public void testFILEUPLOAD62() throws Exception {
final String contentType = "multipart/form-data; boundary=AaB03x";
final String request =
"--AaB03x\r\n" +
"content-disposition: form-data; name=\"field1\"\r\n" +
"\r\n" +
"Joe Blow\r\n" +
"--AaB03x\r\n" +
"content-disposition: form-data; name=\"pics\"\r\n" +
"Content-type: multipart/mixed; boundary=BbC04y\r\n" +
"\r\n" +
"--BbC04y\r\n" +
"Content-disposition: attachment; filename=\"file1.txt\"\r\n" +
"Content-Type: text/plain\r\n" +
"\r\n" +
"... contents of file1.txt ...\r\n" +
"--BbC04y\r\n" +
"Content-disposition: attachment; filename=\"file2.gif\"\r\n" +
"Content-type: image/gif\r\n" +
"Content-Transfer-Encoding: binary\r\n" +
"\r\n" +
"...contents of file2.gif...\r\n" +
"--BbC04y--\r\n" +
"--AaB03x--";
List<FileItem> fileItems = Util.parseUpload(upload, request.getBytes("US-ASCII"), contentType);
assertEquals(3, fileItems.size());
FileItem item0 = fileItems.get(0);
assertEquals("field1", item0.getFieldName());
assertNull(item0.getName());
assertEquals("Joe Blow", new String(item0.get()));
FileItem item1 = fileItems.get(1);
assertEquals("pics", item1.getFieldName());
assertEquals("file1.txt", item1.getName());
assertEquals("... contents of file1.txt ...", new String(item1.get()));
FileItem item2 = fileItems.get(2);
assertEquals("pics", item2.getFieldName());
assertEquals("file2.gif", item2.getName());
assertEquals("...contents of file2.gif...", new String(item2.get()));
}
/**
* Test for <a href="http://issues.apache.org/jira/browse/FILEUPLOAD-111">FILEUPLOAD-111</a>
*/
@Test
public void testFoldedHeaders()
throws IOException, FileUploadException {
List<FileItem> fileItems = Util.parseUpload(upload, "-----1234\r\n" +
"Content-Disposition: form-data; name=\"file\"; filename=\"foo.tab\"\r\n" +
"Content-Type: text/whatever\r\n" +
"\r\n" +
"This is the content of the file\n" +
"\r\n" +
"-----1234\r\n" +
"Content-Disposition: form-data; \r\n" +
"\tname=\"field\"\r\n" +
"\r\n" +
"fieldValue\r\n" +
"-----1234\r\n" +
"Content-Disposition: form-data;\r\n" +
" name=\"multi\"\r\n" +
"\r\n" +
"value1\r\n" +
"-----1234\r\n" +
"Content-Disposition: form-data; name=\"multi\"\r\n" +
"\r\n" +
"value2\r\n" +
"-----1234--\r\n");
assertEquals(4, fileItems.size());
FileItem file = fileItems.get(0);
assertEquals("file", file.getFieldName());
assertFalse(file.isFormField());
assertEquals("This is the content of the file\n", file.getString());
assertEquals("text/whatever", file.getContentType());
assertEquals("foo.tab", file.getName());
FileItem field = fileItems.get(1);
assertEquals("field", field.getFieldName());
assertTrue(field.isFormField());
assertEquals("fieldValue", field.getString());
FileItem multi0 = fileItems.get(2);
assertEquals("multi", multi0.getFieldName());
assertTrue(multi0.isFormField());
assertEquals("value1", multi0.getString());
FileItem multi1 = fileItems.get(3);
assertEquals("multi", multi1.getFieldName());
assertTrue(multi1.isFormField());
assertEquals("value2", multi1.getString());
}
/**
* Test case for <a href="http://issues.apache.org/jira/browse/FILEUPLOAD-130">
*/
@Test
public void testFileUpload130()
throws Exception {
final String[] headerNames = new String[]
{
"SomeHeader", "OtherHeader", "YetAnotherHeader", "WhatAHeader"
};
final String[] headerValues = new String[]
{
"present", "Is there", "Here", "Is That"
};
List<FileItem> fileItems = Util.parseUpload(upload,
"-----1234\r\n" +
"Content-Disposition: form-data; name=\"file\"; filename=\"foo.tab\"\r\n" +
"Content-Type: text/whatever\r\n" +
headerNames[0] + ": " + headerValues[0] + "\r\n" +
"\r\n" +
"This is the content of the file\n" +
"\r\n" +
"-----1234\r\n" +
"Content-Disposition: form-data; \r\n" +
"\tname=\"field\"\r\n" +
headerNames[1] + ": " + headerValues[1] + "\r\n" +
"\r\n" +
"fieldValue\r\n" +
"-----1234\r\n" +
"Content-Disposition: form-data;\r\n" +
" name=\"multi\"\r\n" +
headerNames[2] + ": " + headerValues[2] + "\r\n" +
"\r\n" +
"value1\r\n" +
"-----1234\r\n" +
"Content-Disposition: form-data; name=\"multi\"\r\n" +
headerNames[3] + ": " + headerValues[3] + "\r\n" +
"\r\n" +
"value2\r\n" +
"-----1234--\r\n");
assertEquals(4, fileItems.size());
FileItem file = fileItems.get(0);
assertHeaders(headerNames, headerValues, file, 0);
FileItem field = fileItems.get(1);
assertHeaders(headerNames, headerValues, field, 1);
FileItem multi0 = fileItems.get(2);
assertHeaders(headerNames, headerValues, multi0, 2);
FileItem multi1 = fileItems.get(3);
assertHeaders(headerNames, headerValues, multi1, 3);
}
/**
* Test for <a href="http://issues.apache.org/jira/browse/FILEUPLOAD-239">FILEUPLOAD-239</a>
*/
@Test
public void testContentTypeAttachment()
throws IOException, FileUploadException {
List<FileItem> fileItems = Util.parseUpload(upload,
"-----1234\r\n" +
"content-disposition: form-data; name=\"field1\"\r\n" +
"\r\n" +
"Joe Blow\r\n" +
"-----1234\r\n" +
"content-disposition: form-data; name=\"pics\"\r\n" +
"Content-type: multipart/mixed, boundary=---9876\r\n" +
"\r\n" +
"-----9876\r\n" +
"Content-disposition: attachment; filename=\"file1.txt\"\r\n" +
"Content-Type: text/plain\r\n" +
"\r\n" +
"... contents of file1.txt ...\r\n" +
"-----9876--\r\n" +
"-----1234--\r\n");
assertEquals(2, fileItems.size());
FileItem field = fileItems.get(0);
assertEquals("field1", field.getFieldName());
assertTrue(field.isFormField());
assertEquals("Joe Blow", field.getString());
FileItem file = fileItems.get(1);
assertEquals("pics", file.getFieldName());
assertFalse(file.isFormField());
assertEquals("... contents of file1.txt ...", file.getString());
assertEquals("text/plain", file.getContentType());
assertEquals("file1.txt", file.getName());
}
private void assertHeaders(String[] pHeaderNames, String[] pHeaderValues,
FileItem pItem, int pIndex) {
for (int i = 0; i < pHeaderNames.length; i++) {
final String value = pItem.getHeaders().getHeader(pHeaderNames[i]);
if (i == pIndex) {
assertEquals(pHeaderValues[i], value);
} else {
assertNull(value);
}
}
}
}