001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.commons.fileupload;
018
019 import java.io.ByteArrayOutputStream;
020 import java.io.IOException;
021 import java.io.InputStream;
022
023 import org.apache.commons.fileupload.ProgressListener;
024 import org.apache.commons.fileupload.servlet.ServletFileUpload;
025
026
027 /** Tests the progress listener.
028 */
029 public class ProgressListenerTest extends FileUploadTestCase {
030 private class ProgressListenerImpl implements ProgressListener {
031 private final long expectedContentLength;
032 private final int expectedItems;
033 private Long bytesRead;
034 private Integer items;
035 ProgressListenerImpl(long pContentLength, int pItems) {
036 expectedContentLength = pContentLength;
037 expectedItems = pItems;
038 }
039 public void update(long pBytesRead, long pContentLength, int pItems) {
040 assertTrue(pBytesRead >= 0 && pBytesRead <= expectedContentLength);
041 assertTrue(pContentLength == -1 || pContentLength == expectedContentLength);
042 assertTrue(pItems >= 0 && pItems <= expectedItems);
043
044 assertTrue(bytesRead == null || pBytesRead >= bytesRead.longValue());
045 bytesRead = new Long(pBytesRead);
046 assertTrue(items == null || pItems >= items.intValue());
047 items = new Integer(pItems);
048 }
049 void checkFinished(){
050 assertEquals(expectedContentLength, bytesRead.longValue());
051 assertEquals(expectedItems, items.intValue());
052 }
053 }
054
055 /**
056 * Parse a very long file upload by using a progress listener.
057 */
058 public void testProgressListener() throws Exception {
059 final int NUM_ITEMS = 512;
060 ByteArrayOutputStream baos = new ByteArrayOutputStream();
061 for (int i = 0; i < NUM_ITEMS; i++) {
062 String header = "-----1234\r\n"
063 + "Content-Disposition: form-data; name=\"field" + (i+1) + "\"\r\n"
064 + "\r\n";
065 baos.write(header.getBytes("US-ASCII"));
066 for (int j = 0; j < 16384+i; j++) {
067 baos.write((byte) j);
068 }
069 baos.write("\r\n".getBytes("US-ASCII"));
070 }
071 baos.write("-----1234--\r\n".getBytes("US-ASCII"));
072 byte[] contents = baos.toByteArray();
073
074 MockHttpServletRequest request = new MockHttpServletRequest(contents, "multipart/form-data; boundary=---1234");
075 runTest(NUM_ITEMS, contents.length, request);
076 request = new MockHttpServletRequest(contents, "multipart/form-data; boundary=---1234"){
077 public int getContentLength() {
078 return -1;
079 }
080 };
081 runTest(NUM_ITEMS, contents.length, request);
082 }
083
084 private void runTest(final int NUM_ITEMS, long pContentLength, MockHttpServletRequest request) throws FileUploadException, IOException {
085 ServletFileUpload upload = new ServletFileUpload();
086 ProgressListenerImpl listener = new ProgressListenerImpl(pContentLength, NUM_ITEMS);
087 upload.setProgressListener(listener);
088 FileItemIterator iter = upload.getItemIterator(request);
089 for (int i = 0; i < NUM_ITEMS; i++) {
090 FileItemStream stream = iter.next();
091 InputStream istream = stream.openStream();
092 for (int j = 0; j < 16384+i; j++) {
093 /**
094 * This used to be
095 * assertEquals((byte) j, (byte) istream.read());
096 * but this seems to trigger a bug in JRockit, so
097 * we express the same like this:
098 */
099 byte b1 = (byte) j;
100 byte b2 = (byte) istream.read();
101 if (b1 != b2) {
102 fail("Expected " + b1 + ", got " + b2);
103 }
104 }
105 assertEquals(-1, istream.read());
106 }
107 assertTrue(!iter.hasNext());
108 listener.checkFinished();
109 }
110 }