/**
* JUnitTest case
*
* Copyright (c) 2002
* Marty Phelan, All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.taursys.servlet.test;
import junit.framework.TestCase;
import com.taursys.servlet.HttpMultiPartServletRequest;
import com.taursys.servlet.MultiPartRequestSizeException;
import com.taursys.servlet.MultiPartRequestContentException;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
/* JUnitTest case for class: httppostparser.HttpMultiPartServletRequest */
public class HttpMultiPartServletRequestTest extends TestCase {
public static final String TEST_BOUNDARY =
"---------------------------14693480941749698586855636226";
public static final String TEST_START_BOUNDARY = "--" + TEST_BOUNDARY;
public static final String TEST_CONTENT_TYPE = "multipart/form-data; boundary=" +
TEST_BOUNDARY;
public HttpMultiPartServletRequestTest(String _name) {
super(_name);
}
/* setUp method for test case */
protected void setUp() {
}
/* tearDown method for test case */
protected void tearDown() {
}
/**
* Test for boundary detection and setup with a clean request
*/
public void testSetupBoundaryGoodContentType() throws Exception {
TestHttpServletRequest request = new TestHttpServletRequest();
request.setContentType(TEST_CONTENT_TYPE);
HttpMultiPartServletRequest parser = new HttpMultiPartServletRequest(request);
parser.setupBoundary();
assertEquals(TEST_BOUNDARY, parser.getBoundary());
}
/**
* Test for boundary detection and setup with a request with extra spacing
*/
public void testSetupBoundaryExtraSpaceContentType() throws Exception {
TestHttpServletRequest request = new TestHttpServletRequest();
request.setContentType(
" multipart/form-data ; boundary = " + TEST_BOUNDARY);
HttpMultiPartServletRequest parser = new HttpMultiPartServletRequest(request);
parser.setupBoundary();
assertEquals(TEST_BOUNDARY, parser.getBoundary());
}
/**
* Test for boundary detection and setup with a bad content type
*/
public void testSetupBoundaryBadContentType() throws Exception {
TestHttpServletRequest request = new TestHttpServletRequest();
request.setContentType("multipart/x-www-form-urlencoded; boundary=" + TEST_BOUNDARY);
HttpMultiPartServletRequest parser = new HttpMultiPartServletRequest(request);
try {
parser.setupBoundary();
fail("Expected Servlet Exception");
} catch (MultiPartRequestContentException ex) {
assertEquals("Content type is not multipart/form-data", ex.getMessage());
}
}
/**
* Test for boundary detection and setup with no boundary
*/
public void testSetupBoundaryNoBoundary() throws Exception {
TestHttpServletRequest request = new TestHttpServletRequest();
request.setContentType("multipart/form-data");
HttpMultiPartServletRequest parser = new HttpMultiPartServletRequest(request);
try {
parser.setupBoundary();
fail("Expected Servlet Exception");
} catch (MultiPartRequestContentException ex) {
assertEquals("Content type or boundary attribute is missing", ex.getMessage());
}
}
/**
* Test for boundary detection and setup with different attribute
*/
public void testSetupBoundaryDifferentAttribute() throws Exception {
TestHttpServletRequest request = new TestHttpServletRequest();
request.setContentType("multipart/form-data; something=xxx");
HttpMultiPartServletRequest parser = new HttpMultiPartServletRequest(request);
try {
parser.setupBoundary();
fail("Expected Servlet Exception");
} catch (MultiPartRequestContentException ex) {
assertEquals("Content type is missing boundary attribute", ex.getMessage());
}
}
/**
* Test for boundary detection and setup with Empty content type
*/
public void testSetupBoundaryEmpty() throws Exception {
TestHttpServletRequest request = new TestHttpServletRequest();
request.setContentType("");
HttpMultiPartServletRequest parser = new HttpMultiPartServletRequest(request);
try {
parser.setupBoundary();
fail("Expected Servlet Exception");
} catch (MultiPartRequestContentException ex) {
assertEquals("Content type or boundary attribute is missing", ex.getMessage());
}
}
/**
* Test for boundary detection and setup with NULL content type or boundary
*/
public void testSetupBoundaryNull() throws Exception {
TestHttpServletRequest request = new TestHttpServletRequest();
request.setContentType(null);
HttpMultiPartServletRequest parser = new HttpMultiPartServletRequest(request);
try {
parser.setupBoundary();
fail("Expected Servlet Exception");
} catch (MultiPartRequestContentException ex) {
assertEquals("Unknown Content Type", ex.getMessage());
}
}
/**
* Test for processing block (not last) checking for Bad/NULL Parameter
*/
public void testProcessBlockBadParameter() throws Exception {
String testRequest =
"Content-Disposition: form-data; name=\"email\"\r\n" +
"\r\n" +
"anyone@anywhere.com\r\n" +
TEST_START_BOUNDARY + "\r\n";
TestHttpServletRequest request = new TestHttpServletRequest();
TestServletInputStream stream = new TestServletInputStream();
request.setContentType(TEST_CONTENT_TYPE);
stream.setData(testRequest.getBytes());
request.setInputStream(stream);
HttpMultiPartServletRequest parser = new HttpMultiPartServletRequest(request);
parser.setupBoundary();
parser.processBlock();
assertTrue("Expected NOT end of data", !parser.isEndOfData());
assertNull("Retrieving invalid parameter", parser.getParameter("bad"));
assertNull("Retrieving invalid parameter String array", parser.getParameterValues("bad"));
assertNull("Retrieving invalid parameter Object array", parser.getParameterByteArrays("bad"));
}
/**
* Test for processing block (not last) checking for Parameter
*/
public void testProcessBlockNotLastParameter() throws Exception {
String testRequest =
"Content-Disposition: form-data; name=\"email\"\r\n" +
"\r\n" +
"anyone@anywhere.com\r\n" +
TEST_START_BOUNDARY + "\r\n";
TestHttpServletRequest request = new TestHttpServletRequest();
TestServletInputStream stream = new TestServletInputStream();
request.setContentType(TEST_CONTENT_TYPE);
stream.setData(testRequest.getBytes());
request.setInputStream(stream);
HttpMultiPartServletRequest parser = new HttpMultiPartServletRequest(request);
parser.setupBoundary();
parser.processBlock();
assertTrue("Expected NOT end of data", !parser.isEndOfData());
Enumeration enum1 = parser.getParameterNames();
while (enum1.hasMoreElements()) {
if (((String)enum1.nextElement()).equals("email"))
return; //found
}
fail("Email parameter is not present");
}
/**
* Test for processing block (not last) checking for Content
*/
public void testProcessBlockNotLastContent() throws Exception {
String testRequest =
"Content-Disposition: form-data; name=\"email\"\r\n" +
"\r\n" +
"anyone@anywhere.com\r\n" +
TEST_START_BOUNDARY + "\r\n";
TestHttpServletRequest request = new TestHttpServletRequest();
TestServletInputStream stream = new TestServletInputStream();
request.setContentType(TEST_CONTENT_TYPE);
stream.setData(testRequest.getBytes());
request.setInputStream(stream);
HttpMultiPartServletRequest parser = new HttpMultiPartServletRequest(request);
parser.setupBoundary();
// Do test
parser.processBlock();
assertEquals("anyone@anywhere.com", parser.getParameter("email"));
assertTrue("Expected NOT end of data", !parser.isEndOfData());
}
/**
* Test for processing block (last) checking for Content
*/
public void testProcessBlockLastContent() throws Exception {
String testRequest =
"Content-Disposition: form-data; name=\"email\"\r\n" +
"\r\n" +
"anyone@anywhere.com\r\n" +
TEST_START_BOUNDARY + "--\r\n";
TestHttpServletRequest request = new TestHttpServletRequest();
TestServletInputStream stream = new TestServletInputStream();
request.setContentType(TEST_CONTENT_TYPE);
stream.setData(testRequest.getBytes());
request.setInputStream(stream);
HttpMultiPartServletRequest parser = new HttpMultiPartServletRequest(request);
parser.setupBoundary();
// Do test
parser.processBlock();
assertEquals("anyone@anywhere.com", parser.getParameter("email"));
assertTrue("Expected IS end of data", parser.isEndOfData());
}
/**
* Test for processing block with an Empty file
*/
public void testProcessBlockEmptyFile() throws Exception {
byte[] byteData = new byte[] {};
ByteArrayOutputStream bos = new ByteArrayOutputStream();
String testRequest =
"Content-Disposition: form-data; name=\"theFile\"; filename=\"\"\r\n" +
"Content-Type: application/octet-stream\r\n" +
"\r\n";
bos.write(testRequest.getBytes());
bos.write(byteData);
bos.write('\r');
bos.write('\n');
bos.write(TEST_START_BOUNDARY.getBytes());
bos.write('\r');
bos.write('\n');
TestHttpServletRequest request = new TestHttpServletRequest();
TestServletInputStream stream = new TestServletInputStream();
request.setContentType(TEST_CONTENT_TYPE);
stream.setData(bos.toByteArray());
request.setInputStream(stream);
HttpMultiPartServletRequest parser = new HttpMultiPartServletRequest(request);
parser.setupBoundary();
// run test
parser.processBlock();
// measure
assertEquals("", parser.getParameter("theFile_FileName"));
assertEquals("application/octet-stream", parser.getParameter("theFile_ContentType"));
assertEquals("", parser.getParameter("theFile"));
assertTrue("Expected NOT end of data", !parser.isEndOfData());
byte[] byteResult = parser.getParameterByteArray("theFile_ByteArray");
assertEquals("Byte Array Size", byteData.length, byteResult.length);
for (int i = 0; i < byteData.length; i++) {
assertEquals("Byte @" + i, byteData[i], byteResult[i]);
}
}
/**
* Test for processing block with an Filename containing special
* characters: " :;=".
*/
public void testProcessBlockFilenameSpecialChars() throws Exception {
byte[] byteData = new byte[] {};
ByteArrayOutputStream bos = new ByteArrayOutputStream();
String fileName = "My: File; =Name.xls";
String testRequest =
"Content-Disposition: form-data; name=\"theFile\"; filename=\"" + fileName + "\"\r\n" +
"Content-Type: application/octet-stream\r\n" +
"\r\n";
bos.write(testRequest.getBytes());
bos.write(byteData);
bos.write('\r');
bos.write('\n');
bos.write(TEST_START_BOUNDARY.getBytes());
bos.write('\r');
bos.write('\n');
TestHttpServletRequest request = new TestHttpServletRequest();
TestServletInputStream stream = new TestServletInputStream();
request.setContentType(TEST_CONTENT_TYPE);
stream.setData(bos.toByteArray());
request.setInputStream(stream);
HttpMultiPartServletRequest parser = new HttpMultiPartServletRequest(request);
parser.setupBoundary();
// run test
parser.processBlock();
// measure
assertEquals(fileName, parser.getParameter("theFile_FileName"));
}
/**
* Test for processing block with a small Binary file
*/
public void testProcessBlockSmallBinaryFile() throws Exception {
byte[] byteData = new byte[] {
20,0,55,-127,115,22,15,12,10,-102,26,-98,82,-126,-127,0,0,10,10,0
};
ByteArrayOutputStream bos = new ByteArrayOutputStream();
String testRequest =
"Content-Disposition: form-data; name=\"theFile\"; filename=\"\"\r\n" +
"Content-Type: application/octet-stream\r\n" +
"\r\n";
bos.write(testRequest.getBytes());
bos.write(byteData);
bos.write('\r');
bos.write('\n');
bos.write(TEST_START_BOUNDARY.getBytes());
bos.write('\r');
bos.write('\n');
TestHttpServletRequest request = new TestHttpServletRequest();
TestServletInputStream stream = new TestServletInputStream();
request.setContentType(TEST_CONTENT_TYPE);
stream.setData(bos.toByteArray());
request.setInputStream(stream);
HttpMultiPartServletRequest parser = new HttpMultiPartServletRequest(request);
parser.setupBoundary();
// run test
parser.processBlock();
// measure
assertEquals("", parser.getParameter("theFile_FileName"));
assertEquals("application/octet-stream", parser.getParameter("theFile_ContentType"));
assertEquals("", parser.getParameter("theFile"));
assertTrue("Expected NOT end of data", !parser.isEndOfData());
byte[] byteResult = parser.getParameterByteArray("theFile_ByteArray");
assertEquals("Byte Array Size", byteData.length, byteResult.length);
for (int i = 0; i < byteData.length; i++) {
assertEquals("Byte @" + i, byteData[i], byteResult[i]);
}
}
/**
* Test for processing block with a large Binary file
*/
public void testProcessBlockLargeBinaryFile() throws Exception {
byte[] byteData = new byte[250000];
Random random = new Random(6995);
random.nextBytes(byteData);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
String testRequest =
"Content-Disposition: form-data; name=\"theFile\"; filename=\"\"\r\n" +
"Content-Type: application/octet-stream\r\n" +
"\r\n";
bos.write(testRequest.getBytes());
bos.write(byteData);
bos.write('\r');
bos.write('\n');
bos.write(TEST_START_BOUNDARY.getBytes());
bos.write('\r');
bos.write('\n');
TestHttpServletRequest request = new TestHttpServletRequest();
TestServletInputStream stream = new TestServletInputStream();
request.setContentType(TEST_CONTENT_TYPE);
stream.setData(bos.toByteArray());
request.setInputStream(stream);
HttpMultiPartServletRequest parser = new HttpMultiPartServletRequest(request);
parser.setupBoundary();
// run test
parser.processBlock();
// measure
assertEquals("", parser.getParameter("theFile_FileName"));
assertEquals("application/octet-stream", parser.getParameter("theFile_ContentType"));
assertEquals("", parser.getParameter("theFile"));
assertTrue("Expected NOT end of data", !parser.isEndOfData());
byte[] byteResult = parser.getParameterByteArray("theFile_ByteArray");
assertEquals("Byte Array Size", byteData.length, byteResult.length);
for (int i = 0; i < byteData.length; i++) {
assertEquals("Byte @" + i, byteData[i], byteResult[i]);
}
}
/**
* Test for processing block with small text/plain file
*/
public void testProcessBlockNotLastFilename() throws Exception {
String testValue =
"R & B Project\r\n" +
"-------------\r\n" +
"\r\n" +
"History of project\r\n" +
" Development of SRS TO-02-0259 $34K\r\n" +
" System Design & Mentoring TO-02-0440 $40K\r\n" +
" Implementation & Mentoring Phase I TO-02-0491 $51K\r\n" +
" Implementation & Mentoring Phase II TO-02-0513 $55K\r\n" +
" Future of Project\r\n" +
" Implementation & Mentoring Phase III TO-02-0000 $50K (estimate)\r\n" +
"\r\n";
String testRequest =
"Content-Disposition: form-data; name=\"theFile\"; filename=\"RBProjectPresentation.txt\"\r\n" +
"Content-Type: text/plain\r\n" +
"\r\n" +
testValue + "\r\n" +
TEST_START_BOUNDARY + "\r\n";
TestHttpServletRequest request = new TestHttpServletRequest();
TestServletInputStream stream = new TestServletInputStream();
request.setContentType(TEST_CONTENT_TYPE);
stream.setData(testRequest.getBytes());
request.setInputStream(stream);
HttpMultiPartServletRequest parser = new HttpMultiPartServletRequest(request);
parser.setupBoundary();
parser.processBlock();
assertEquals("RBProjectPresentation.txt", parser.getParameter("theFile_FileName"));
assertEquals("text/plain", parser.getParameter("theFile_ContentType"));
assertEquals(testValue, parser.getParameter("theFile"));
assertTrue("Expected NOT end of data", !parser.isEndOfData());
}
/**
* Test for processing block with small text/html file
*/
public void testProcessBlockSmallHtmlFile() throws Exception {
String testValue =
"<html>\r\n" +
"<head><title>Retirement and Benefits SBS Project</title></head>\r\n" +
"<body>\r\n" +
" <h1>History of project</h1>\r\n" +
" <ul>\r\n" +
" <li>Development of SRS TO-02-0259 $34K</li>\r\n" +
" <li>System Design & Mentoring TO-02-0440 $40K</li>\r\n" +
" <li>Implementation & Mentoring Phase I TO-02-0491 $51K</li>\r\n" +
" <li>Implementation & Mentoring Phase II TO-02-0513 $55K</li>\r\n" +
" </ul>\r\n" +
" <h1>Future of Project</h1>\r\n" +
" <ul>\r\n" +
" <li>Implementation & Mentoring Phase III TO-02-0000 $50K (estimate)</li>\r\n" +
" </ul>\r\n" +
"</body>\r\n" +
"</html>\r\n" +
"\r\n";
String testRequest =
"Content-Disposition: form-data; name=\"theFile\"; filename=\"RBProjectPresentation.html\"\r\n" +
"Content-Type: text/html\r\n" +
"\r\n" +
testValue + "\r\n" +
TEST_START_BOUNDARY + "\r\n";
TestHttpServletRequest request = new TestHttpServletRequest();
TestServletInputStream stream = new TestServletInputStream();
request.setContentType(TEST_CONTENT_TYPE);
stream.setData(testRequest.getBytes());
request.setInputStream(stream);
HttpMultiPartServletRequest parser = new HttpMultiPartServletRequest(request);
parser.setupBoundary();
parser.processBlock();
assertEquals("RBProjectPresentation.html", parser.getParameter("theFile_FileName"));
assertEquals("text/html", parser.getParameter("theFile_ContentType"));
assertEquals(testValue, parser.getParameter("theFile"));
assertTrue("Expected NOT end of data", !parser.isEndOfData());
}
/**
* Test for ParseRequest for multiple items with Text File
*/
public void testParseRequest() throws Exception {
String testValue =
"R & B Project\r\n" +
"-------------\r\n" +
"\r\n" +
"History of project\r\n" +
" Development of SRS TO-02-0259 $34K\r\n" +
" System Design & Mentoring TO-02-0440 $40K\r\n" +
" Implementation & Mentoring Phase I TO-02-0491 $51K\r\n" +
" Implementation & Mentoring Phase II TO-02-0513 $55K\r\n" +
" Future of Project\r\n" +
" Implementation & Mentoring Phase III TO-02-0000 $50K (estimate)\r\n" +
"\r\n";
String testRequest =
TEST_START_BOUNDARY + "\r\n" +
"Content-Disposition: form-data; name=\"email\"\r\n" +
"\r\n" +
"anyone@anywhere.com\r\n" +
TEST_START_BOUNDARY + "\r\n" +
"Content-Disposition: form-data; name=\"theFile\"; filename=\"RBProjectPresentation.txt\"\r\n" +
"Content-Type: text/plain\r\n" +
"\r\n" +
testValue + "\r\n" +
TEST_START_BOUNDARY + "\r\n" +
"Content-Disposition: form-data; name=\"action\"\r\n" +
"\r\n" +
"Send\r\n" +
TEST_START_BOUNDARY + "--\r\n";
TestHttpServletRequest request = new TestHttpServletRequest();
TestServletInputStream stream = new TestServletInputStream();
request.setContentType(TEST_CONTENT_TYPE);
stream.setData(testRequest.getBytes());
request.setInputStream(stream);
HttpMultiPartServletRequest parser = new HttpMultiPartServletRequest(request);
parser.setupBoundary();
parser.parseRequest();
assertEquals("anyone@anywhere.com", parser.getParameter("email"));
assertEquals("RBProjectPresentation.txt", parser.getParameter("theFile_FileName"));
assertEquals("text/plain", parser.getParameter("theFile_ContentType"));
assertEquals(testValue, parser.getParameter("theFile"));
assertEquals("Send", parser.getParameter("action"));
assertTrue("Expected end of data", parser.isEndOfData());
}
/**
* Test for ParseRequest and exceed maximum line length
*/
public void testParseRequestExceedMaxLineLength() throws Exception {
char[] longLine = new char[4099];
Arrays.fill(longLine, 'x');
longLine[4097] = '\r';
longLine[4098] = '\n';
String testValue = String.valueOf(longLine);
testValue += testValue + testValue + testValue + testValue + "\r\n";
String testRequest =
TEST_START_BOUNDARY + "\r\n" +
"Content-Disposition: form-data; name=\"theFile\"; filename=\"LongLines.txt\"\r\n" +
"Content-Type: text/plain\r\n" +
"\r\n" +
testValue + "\r\n" +
TEST_START_BOUNDARY + "--\r\n";
TestHttpServletRequest request = new TestHttpServletRequest();
TestServletInputStream stream = new TestServletInputStream();
request.setContentType(TEST_CONTENT_TYPE);
stream.setData(testRequest.getBytes());
request.setInputStream(stream);
HttpMultiPartServletRequest parser = new HttpMultiPartServletRequest(request);
try {
parser.parseRequest();
fail("Expected to exceed max line length");
} catch (MultiPartRequestSizeException ex) {
assertEquals("Exception message",
"Maximum line length exceeded for value named: theFile",
ex.getMessage());
}
}
/**
* Test for ParseRequest exceeding maximum binary file size.
*/
public void testParseRequestExceedMaxFileSize() throws Exception {
byte[] byteData = new byte[64000];
Random random = new Random(6995);
random.nextBytes(byteData);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
String testRequest =
TEST_START_BOUNDARY + "\r\n";
bos.write(testRequest.getBytes());
testRequest =
"Content-Disposition: form-data; name=\"theFile\"; filename=\"data.dat\"\r\n" +
"Content-Type: application/octet-stream\r\n" +
"\r\n";
bos.write(testRequest.getBytes());
bos.write(byteData);
bos.write('\r');
bos.write('\n');
testRequest =
TEST_START_BOUNDARY + "\r\n" +
"Content-Disposition: form-data; name=\"action\"\r\n" +
"\r\n" +
"Send\r\n" +
TEST_START_BOUNDARY + "--\r\n";
bos.write(testRequest.getBytes());
TestHttpServletRequest request = new TestHttpServletRequest();
TestServletInputStream stream = new TestServletInputStream();
request.setContentType(TEST_CONTENT_TYPE);
stream.setData(bos.toByteArray());
request.setInputStream(stream);
HttpMultiPartServletRequest parser = new HttpMultiPartServletRequest(request);
// reduce max file size
parser.setMaxFileSize(63999);
try {
parser.parseRequest();
fail("Expected to exceed max file size");
} catch (MultiPartRequestSizeException ex) {
assertEquals("Exception message",
"Maximum file size exceeded for value named: theFile",
ex.getMessage());
}
}
/**
* Test for ParseRequest for multiple items with Binary File
*/
public void testParseRequestBinaryFile() throws Exception {
byte[] byteData = new byte[64000];
Random random = new Random(6995);
random.nextBytes(byteData);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
String testRequest =
TEST_START_BOUNDARY + "\r\n" +
"Content-Disposition: form-data; name=\"email\"\r\n" +
"\r\n" +
"anyone@anywhere.com\r\n" +
TEST_START_BOUNDARY + "\r\n";
bos.write(testRequest.getBytes());
testRequest =
"Content-Disposition: form-data; name=\"theFile\"; filename=\"data.dat\"\r\n" +
"Content-Type: application/octet-stream\r\n" +
"\r\n";
bos.write(testRequest.getBytes());
bos.write(byteData);
bos.write('\r');
bos.write('\n');
testRequest =
TEST_START_BOUNDARY + "\r\n" +
"Content-Disposition: form-data; name=\"action\"\r\n" +
"\r\n" +
"Send\r\n" +
TEST_START_BOUNDARY + "--\r\n";
bos.write(testRequest.getBytes());
TestHttpServletRequest request = new TestHttpServletRequest();
TestServletInputStream stream = new TestServletInputStream();
request.setContentType(TEST_CONTENT_TYPE);
stream.setData(bos.toByteArray());
request.setInputStream(stream);
HttpMultiPartServletRequest parser = new HttpMultiPartServletRequest(request);
parser.parseRequest();
assertEquals("anyone@anywhere.com", parser.getParameter("email"));
assertEquals("data.dat", parser.getParameter("theFile_FileName"));
assertEquals("application/octet-stream", parser.getParameter("theFile_ContentType"));
assertEquals("", parser.getParameter("theFile"));
assertEquals("Send", parser.getParameter("action"));
byte[] byteResult = parser.getParameterByteArray("theFile_ByteArray");
assertEquals("Byte Array Size", byteData.length, byteResult.length);
for (int i = 0; i < byteData.length; i++) {
assertEquals("Byte @" + i, byteData[i], byteResult[i]);
}
assertTrue("Expected end of data", parser.isEndOfData());
}
/**
* Test for ParseRequest for multiple items with multi-value parameters
*/
public void testParseRequestMultiValue() throws Exception {
String testValue =
"R & B Project\r\n" +
"-------------\r\n" +
"\r\n" +
"History of project\r\n" +
" Development of SRS TO-02-0259 $34K\r\n" +
" System Design & Mentoring TO-02-0440 $40K\r\n" +
" Implementation & Mentoring Phase I TO-02-0491 $51K\r\n" +
" Implementation & Mentoring Phase II TO-02-0513 $55K\r\n" +
" Future of Project\r\n" +
" Implementation & Mentoring Phase III TO-02-0000 $50K (estimate)\r\n" +
"\r\n";
String testValue2 =
"Another File\r\n" +
"-------------\r\n" +
"\r\n" +
"Present for project\r\n" +
" Implementation & Mentoring Phase III TO-02-0563 $55K\r\n" +
"\r\n";
String[] expectedColors = new String[] {"red","green","blue"};
String[] expectedFileNames = new String[] {
"RBProjectPresentation.txt","AnotherPresentation.txt"};
String[] expectedFileContents = new String[] {testValue, testValue2};
String testRequest =
TEST_START_BOUNDARY + "\r\n" +
"Content-Disposition: form-data; name=\"email\"\r\n" +
"\r\n" +
"anyone@anywhere.com\r\n";
for (int i = 0; i < expectedColors.length; i++) {
testRequest += TEST_START_BOUNDARY + "\r\n" +
"Content-Disposition: form-data; name=\"color\"\r\n" +
"\r\n" +
expectedColors[i] + "\r\n";
}
for (int i = 0; i < expectedFileNames.length; i++) {
testRequest += TEST_START_BOUNDARY + "\r\n" +
"Content-Disposition: form-data; name=\"theFile\"; filename=\"" +
expectedFileNames[i] + "\"\r\n" +
"Content-Type: text/plain\r\n" +
"\r\n" +
expectedFileContents[i] + "\r\n";
}
testRequest += TEST_START_BOUNDARY + "\r\n" +
"Content-Disposition: form-data; name=\"action\"\r\n" +
"\r\n" +
"Send\r\n" +
TEST_START_BOUNDARY + "--\r\n";
TestHttpServletRequest request = new TestHttpServletRequest();
TestServletInputStream stream = new TestServletInputStream();
request.setContentType(TEST_CONTENT_TYPE);
stream.setData(testRequest.getBytes());
request.setInputStream(stream);
HttpMultiPartServletRequest parser = new HttpMultiPartServletRequest(request);
parser.parseRequest();
assertEquals("anyone@anywhere.com", parser.getParameter("email"));
assertEquals("RBProjectPresentation.txt", parser.getParameter("theFile_FileName"));
assertEquals("text/plain", parser.getParameter("theFile_ContentType"));
assertEquals(testValue, parser.getParameter("theFile"));
assertEquals("Send", parser.getParameter("action"));
assertEquals("single color", "red", parser.getParameter("color"));
String[] colors = parser.getParameterValues("color");
assertEquals("Number of colors", expectedColors.length, colors.length);
for (int i = 0; i < colors.length; i++) {
assertEquals("array color", expectedColors[i], colors[i]);
}
String[] filenames = parser.getParameterValues("theFile_FileName");
assertEquals("Number of file names", expectedFileNames.length, filenames.length);
for (int i = 0; i < filenames.length; i++) {
assertEquals("filename", expectedFileNames[i], filenames[i]);
}
String[] fileContents = parser.getParameterValues("theFile");
assertEquals("Number of file contents", expectedFileContents.length, fileContents.length);
for (int i = 0; i < fileContents.length; i++) {
assertEquals("fileContents", expectedFileContents[i], fileContents[i]);
}
assertTrue("Expected end of data", parser.isEndOfData());
}
/* Executes the test case */
public static void main(String[] argv) {
String[] testCaseList = {HttpMultiPartServletRequestTest.class.getName()};
junit.swingui.TestRunner.main(testCaseList);
}
}