You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by jo...@apache.org on 2006/07/09 22:22:57 UTC

svn commit: r420345 - in /jakarta/commons/proper/fileupload/branches/streaming: ./ src/java/org/apache/commons/fileupload/ src/test/org/apache/commons/fileupload/

Author: jochen
Date: Sun Jul  9 13:22:56 2006
New Revision: 420345

URL: http://svn.apache.org/viewvc?rev=420345&view=rev
Log:
Added some test cases for proper exception handling.

Added:
    jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/StreamingTest.java
      - copied, changed from r420333, jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/SizesTest.java
Removed:
    jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/SizesTest.java
Modified:
    jakarta/commons/proper/fileupload/branches/streaming/maven.xml
    jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileUploadBase.java
    jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileUploadException.java
    jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/MockHttpServletRequest.java
    jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/TestAll.java

Modified: jakarta/commons/proper/fileupload/branches/streaming/maven.xml
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/branches/streaming/maven.xml?rev=420345&r1=420344&r2=420345&view=diff
==============================================================================
--- jakarta/commons/proper/fileupload/branches/streaming/maven.xml (original)
+++ jakarta/commons/proper/fileupload/branches/streaming/maven.xml Sun Jul  9 13:22:56 2006
@@ -14,7 +14,7 @@
    limitations under the License.
 -->
 
-<project default="java:jar"
+<project default="jar:jar"
   xmlns:ant="jelly:ant">
 
   <!-- ================================================================== -->

Modified: jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileUploadBase.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileUploadBase.java?rev=420345&r1=420344&r2=420345&view=diff
==============================================================================
--- jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileUploadBase.java (original)
+++ jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileUploadBase.java Sun Jul  9 13:22:56 2006
@@ -317,9 +317,9 @@
             } catch (FileUploadIOException e) {
                 throw (FileUploadException) e.getCause();
             } catch (IOException e) {
-                throw new FileUploadException(
+                throw new IOFileUploadException(
                     "Processing of " + MULTIPART_FORM_DATA
-                        + " request failed. " + e.getMessage());
+                        + " request failed. " + e.getMessage(), e);
             }
             items.add(fileItem);
         }
@@ -792,6 +792,25 @@
         }
     }
 
+    /**
+     * Thrown to indicate an IOException.
+     */
+    public static class IOFileUploadException extends FileUploadException {
+		private static final long serialVersionUID = 1749796615868477269L;
+		private final IOException cause;
+
+    	/**
+    	 * Creates a new instance with the given cause.
+    	 */
+    	public IOFileUploadException(String pMsg, IOException pException) {
+    		super(pMsg);
+    		cause = pException;
+    	}
+
+    	public Throwable getCause() {
+    		return cause;
+    	}
+    }
 
     /**
      * Thrown to indicate that the request size exceeds the configured maximum.

Modified: jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileUploadException.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileUploadException.java?rev=420345&r1=420344&r2=420345&view=diff
==============================================================================
--- jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileUploadException.java (original)
+++ jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileUploadException.java Sun Jul  9 13:22:56 2006
@@ -23,7 +23,7 @@
  */
 public class FileUploadException
     extends Exception {
-
+	
     /**
      * Constructs a new <code>FileUploadException</code> without message.
      */
@@ -39,4 +39,6 @@
     public FileUploadException(final String msg) {
         super(msg);
     }
+
+
 }

Modified: jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/MockHttpServletRequest.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/MockHttpServletRequest.java?rev=420345&r1=420344&r2=420345&view=diff
==============================================================================
--- jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/MockHttpServletRequest.java (original)
+++ jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/MockHttpServletRequest.java Sun Jul  9 13:22:56 2006
@@ -18,6 +18,7 @@
 import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 import java.security.Principal;
 import java.util.Enumeration;
@@ -41,15 +42,34 @@
 class MockHttpServletRequest implements HttpServletRequest
 {
 
-	private byte[] m_requestData;
+	private final InputStream m_requestData;
+	private final int length;
 	private String m_strContentType;
 	private Map m_headers = new java.util.HashMap();
 
+	/**
+	 * Creates a new instance with the given request data
+	 * and content type.
+	 */
 	public MockHttpServletRequest(
 			final byte[] requestData,
 			final String strContentType)
 	{
+		this(new ByteArrayInputStream(requestData),
+				requestData.length, strContentType);
+	}
+
+	/**
+	 * Creates a new instance with the given request data
+	 * and content type.
+	 */
+	public MockHttpServletRequest(
+			final InputStream requestData,
+			final int requestLength,
+			final String strContentType)
+	{
 		m_requestData = requestData;
+		length = requestLength;
 		m_strContentType = strContentType;
 		m_headers.put(FileUploadBase.CONTENT_TYPE, strContentType);
 	}
@@ -302,7 +322,7 @@
 		}
 		else
 		{
-			iLength = m_requestData.length;
+			iLength = length;
 		}
 		return iLength;
 	}
@@ -476,16 +496,20 @@
 	private static class MyServletInputStream
 		extends javax.servlet.ServletInputStream
 	{
-		private ByteArrayInputStream m_bais;
+		private final InputStream in;
 
-		public MyServletInputStream(byte[] data)
+		/**
+		 * Creates a new instance, which returns the given
+		 * streams data.
+		 */
+		public MyServletInputStream(InputStream pStream)
 		{
-			m_bais = new ByteArrayInputStream(data);
+			in = pStream;
 		}
 
-		public int read()
+		public int read() throws IOException
 		{
-			return m_bais.read();
+			return in.read();
 		}
 	}
 }

Copied: jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/StreamingTest.java (from r420333, jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/SizesTest.java)
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/StreamingTest.java?p2=jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/StreamingTest.java&p1=jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/SizesTest.java&r1=420333&r2=420345&rev=420345&view=diff
==============================================================================
--- jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/SizesTest.java (original)
+++ jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/StreamingTest.java Sun Jul  9 13:22:56 2006
@@ -15,48 +15,44 @@
  */
 package org.apache.commons.fileupload;
 
+import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.FilterInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.Iterator;
 import java.util.List;
 import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.fileupload.FileUploadBase.FileUploadIOException;
+import org.apache.commons.fileupload.FileUploadBase.IOFileUploadException;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.fileupload.servlet.ServletFileUpload;
+import org.apache.commons.fileupload.servlet.ServletRequestContext;
+
 import junit.framework.TestCase;
 
 
 /**
  * Unit test for items with varying sizes.
  */
-public class SizesTest extends TestCase
+public class StreamingTest extends TestCase
 {
+    /**
+     * Tests a file upload with varying file sizes.
+     */
     public void testFileUpload()
             throws IOException, FileUploadException
     {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    	byte[] request = newRequest();
+        List fileItems = parseUpload(request);
+        Iterator fileIter = fileItems.iterator();
         int add = 16;
         int num = 0;
         for (int i = 0;  i < 16384;  i += add) {
             if (++add == 32) {
                 add = 16;
             }
-            String header = "-----1234\r\n"
-                + "Content-Disposition: form-data; name=\"field" + (num++) + "\"\r\n"
-                + "\r\n";
-            baos.write(header.getBytes("US-ASCII"));
-            for (int j = 0;  j < i;  j++) {
-                baos.write((byte) j);
-            }
-            baos.write("\r\n".getBytes("US-ASCII"));
-        }
-        baos.write("-----1234--\r\n".getBytes("US-ASCII"));
-
-        List fileItems = parseUpload(baos.toByteArray());
-        Iterator fileIter = fileItems.iterator();
-        add = 16;
-        num = 0;
-        for (int i = 0;  i < 16384;  i += add) {
-            if (++add == 32) {
-                add = 16;
-            }
             FileItem item = (FileItem) fileIter.next();
             assertEquals("field" + (num++), item.getFieldName());
             byte[] bytes = item.get();
@@ -68,14 +64,93 @@
         assertTrue(!fileIter.hasNext());
     }
 
+
+    /**
+     * Tests, whether an invalid request throws a proper
+     * exception.
+     */
+    public void testFileUploadException()
+    		throws IOException, FileUploadException {
+    	byte[] request = newRequest();
+    	byte[] invalidRequest = new byte[request.length-11];
+    	System.arraycopy(request, 0, invalidRequest, 0, request.length-11);
+    	try {
+    		parseUpload(invalidRequest);
+	        fail("Expected EndOfStreamException");
+    	} catch (IOFileUploadException e) {
+    		assertTrue(e.getCause() instanceof MultipartStream.MalformedStreamException);
+    	}
+    }
+
+    /**
+     * Tests, whether an IOException is properly delegated.
+     */
+    public void testIOException()
+    		throws IOException, FileUploadException {
+    	byte[] request = newRequest();
+    	InputStream stream = new FilterInputStream(new ByteArrayInputStream(request)){
+    		private int num;
+    		public int read() throws IOException {
+    			if (++num > 123) {
+    				throw new IOException("123");
+    			}
+    			return super.read();
+    		}
+			public int read(byte[] pB, int pOff, int pLen)
+					throws IOException {
+				for (int i = 0;  i < pLen;  i++) {
+					int res = read();
+					if (res == -1) {
+						return i == 0 ? -1 : i;
+					}
+					pB[pOff+i] = (byte) res;
+				}
+				return pLen;
+			}
+    	};
+    	try {
+    		parseUpload(stream, request.length);
+    	} catch (IOFileUploadException e) {
+    		assertTrue(e.getCause() instanceof IOException);
+    		assertEquals("123", e.getCause().getMessage());
+    	}
+    }
+
     private List parseUpload(byte[] bytes) throws FileUploadException {
+    	return parseUpload(new ByteArrayInputStream(bytes), bytes.length);
+    }
+
+    private List parseUpload(InputStream pStream, int pLength)
+    		throws FileUploadException {
         String contentType = "multipart/form-data; boundary=---1234";
 
-        FileUploadBase upload = new DiskFileUpload();
-        HttpServletRequest request = new MockHttpServletRequest(bytes, contentType);
+        FileUploadBase upload = new ServletFileUpload();
+        upload.setFileItemFactory(new DiskFileItemFactory());
+        HttpServletRequest request = new MockHttpServletRequest(pStream,
+        		pLength, contentType);
 
-        List fileItems = upload.parseRequest(request);
+        List fileItems = upload.parseRequest(new ServletRequestContext(request));
         return fileItems;
     }
 
+    private byte[] newRequest() throws IOException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        int add = 16;
+        int num = 0;
+        for (int i = 0;  i < 16384;  i += add) {
+            if (++add == 32) {
+                add = 16;
+            }
+            String header = "-----1234\r\n"
+                + "Content-Disposition: form-data; name=\"field" + (num++) + "\"\r\n"
+                + "\r\n";
+            baos.write(header.getBytes("US-ASCII"));
+            for (int j = 0;  j < i;  j++) {
+                baos.write((byte) j);
+            }
+            baos.write("\r\n".getBytes("US-ASCII"));
+        }
+        baos.write("-----1234--\r\n".getBytes("US-ASCII"));
+        return baos.toByteArray();
+    }
 }

Modified: jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/TestAll.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/TestAll.java?rev=420345&r1=420344&r2=420345&view=diff
==============================================================================
--- jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/TestAll.java (original)
+++ jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/TestAll.java Sun Jul  9 13:22:56 2006
@@ -23,20 +23,30 @@
  *
  */
 public class TestAll extends TestCase {
-
+	/**
+	 * Creates a new instance.
+	 */
     public TestAll(String testName) {
         super(testName);
     }
 
+    /**
+     * Runs the test suite (all other test cases).
+     */
     public static Test suite() {
         TestSuite suite = new TestSuite();
+        suite.addTest(new TestSuite(DefaultFileItemTest.class));
+        suite.addTest(new TestSuite(DiskFileItemSerializeTest.class));
         suite.addTest(new TestSuite(ParameterParserTest.class));
         suite.addTest(new TestSuite(MultipartStreamTest.class));
         suite.addTest(new TestSuite(ServletFileUploadTest.class));
-        suite.addTest(new TestSuite(DefaultFileItemTest.class));
+        suite.addTest(new TestSuite(StreamingTest.class));
         return suite;
     }
 
+    /**
+     * Command line interface, which invokes all tests.
+     */
     public static void main(String args[]) {
         String[] testCaseName = { TestAll.class.getName() };
         junit.textui.TestRunner.main(testCaseName);



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org