/* * $Header: /home/data/cvs/rt/org.eclipse.ecf/tests/bundles/org.eclipse.ecf.tests.apache.httpclient.server/src/org/apache/commons/httpclient/TestStreams.java,v 1.1 2009/02/13 18:07:48 slewis Exp $ * $Revision: 1.1 $ * $Date: 2009/02/13 18:07:48 $ * ==================================================================== * * Copyright 2002-2004 The Apache Software Foundation * * Licensed 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. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * * [Additional notices, if required by prior licensing conditions] * */ package org.apache.commons.httpclient; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.util.EncodingUtil; public class TestStreams extends TestCase { private static final String CONTENT_CHARSET = "ISO-8859-1"; public TestStreams(String testName) { super(testName); } public void testChunkedInputStream() throws IOException { String correctInput = "10;key=\"value\r\nnewline\"\r\n1234567890123456\r\n5\r\n12345\r\n0\r\nFooter1: abcde\r\nFooter2: fghij\r\n"; String correctResult = "123456789012345612345"; HttpMethod method = new FakeHttpMethod(); //Test for when buffer is larger than chunk size InputStream in = new ChunkedInputStream(new ByteArrayInputStream( EncodingUtil.getBytes(correctInput, CONTENT_CHARSET)), method); byte[] buffer = new byte[300]; ByteArrayOutputStream out = new ByteArrayOutputStream(); int len; while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); } String result = EncodingUtil.getString(out.toByteArray(), CONTENT_CHARSET); assertEquals(result, correctResult); Header footer = method.getResponseFooter("footer1"); assertEquals(footer.getValue(), "abcde"); footer = method.getResponseFooter("footer2"); assertEquals(footer.getValue(), "fghij"); method = new FakeHttpMethod(); //Test for when buffer is smaller than chunk size. in = new ChunkedInputStream(new ByteArrayInputStream( EncodingUtil.getBytes(correctInput, CONTENT_CHARSET)), method); buffer = new byte[7]; out = new ByteArrayOutputStream(); while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); } result = EncodingUtil.getString(out.toByteArray(), CONTENT_CHARSET); assertEquals(result, correctResult); footer = method.getResponseFooter("footer1"); assertEquals(footer.getValue(), "abcde"); footer = method.getResponseFooter("footer2"); assertEquals(footer.getValue(), "fghij"); } public void testCorruptChunkedInputStream1() throws IOException { //missing \r\n at the end of the first chunk String corrupInput = "10;key=\"value\"\r\n123456789012345\r\n5\r\n12345\r\n0\r\nFooter1: abcde\r\nFooter2: fghij\r\n"; HttpMethod method = new FakeHttpMethod(); InputStream in = new ChunkedInputStream(new ByteArrayInputStream( EncodingUtil.getBytes(corrupInput, CONTENT_CHARSET)), method); byte[] buffer = new byte[300]; ByteArrayOutputStream out = new ByteArrayOutputStream(); int len; try { while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); } fail("Should have thrown exception"); } catch(IOException e) { /* expected exception */ } } public void testEmptyChunkedInputStream() throws IOException { String input = "0\r\n"; HttpMethod method = new FakeHttpMethod(); InputStream in = new ChunkedInputStream(new ByteArrayInputStream( EncodingUtil.getBytes(input, CONTENT_CHARSET)), method); byte[] buffer = new byte[300]; ByteArrayOutputStream out = new ByteArrayOutputStream(); int len; while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); } assertEquals(0, out.size()); } public void testContentLengthInputStream() throws IOException { String correct = "1234567890123456"; InputStream in = new ContentLengthInputStream(new ByteArrayInputStream( EncodingUtil.getBytes(correct, CONTENT_CHARSET)), 10L); byte[] buffer = new byte[50]; int len = in.read(buffer); ByteArrayOutputStream out = new ByteArrayOutputStream(); out.write(buffer, 0, len); String result = EncodingUtil.getString(out.toByteArray(), CONTENT_CHARSET); assertEquals(result, "1234567890"); } public void testContentLengthInputStreamSkip() throws IOException { InputStream in = new ContentLengthInputStream(new ByteArrayInputStream(new byte[20]), 10L); assertEquals(10, in.skip(10)); assertTrue(in.read() == -1); in = new ContentLengthInputStream(new ByteArrayInputStream(new byte[20]), 10L); in.read(); assertEquals(9, in.skip(10)); assertTrue(in.read() == -1); in = new ContentLengthInputStream(new ByteArrayInputStream(new byte[20]), 2L); in.read(); in.read(); assertTrue(in.skip(10) <= 0); assertTrue(in.read() == -1); } public void testChunkedConsitance() throws IOException { String input = "76126;27823abcd;:q38a-\nkjc\rk%1ad\tkh/asdui\r\njkh+?\\suweb"; ByteArrayOutputStream buffer = new ByteArrayOutputStream(); OutputStream out = new ChunkedOutputStream(buffer); out.write(EncodingUtil.getBytes(input, CONTENT_CHARSET)); out.close(); buffer.close(); InputStream in = new ChunkedInputStream(new ByteArrayInputStream(buffer.toByteArray()), new GetMethod()); byte[] d = new byte[10]; ByteArrayOutputStream result = new ByteArrayOutputStream(); int len = 0; while ((len = in.read(d)) > 0) { result.write(d, 0, len); } String output = EncodingUtil.getString(result.toByteArray(), CONTENT_CHARSET); assertEquals(input, output); } public void testChunkedOutputStream() throws IOException { ByteArrayOutputStream buffer = new ByteArrayOutputStream(); ChunkedOutputStream out = new ChunkedOutputStream(buffer, 2); out.write('1'); out.write('2'); out.write('3'); out.write('4'); out.finish(); out.close(); byte [] rawdata = buffer.toByteArray(); assertEquals(19, rawdata.length); assertEquals('2', rawdata[0]); assertEquals('\r', rawdata[1]); assertEquals('\n', rawdata[2]); assertEquals('1', rawdata[3]); assertEquals('2', rawdata[4]); assertEquals('\r', rawdata[5]); assertEquals('\n', rawdata[6]); assertEquals('2', rawdata[7]); assertEquals('\r', rawdata[8]); assertEquals('\n', rawdata[9]); assertEquals('3', rawdata[10]); assertEquals('4', rawdata[11]); assertEquals('\r', rawdata[12]); assertEquals('\n', rawdata[13]); assertEquals('0', rawdata[14]); assertEquals('\r', rawdata[15]); assertEquals('\n', rawdata[16]); assertEquals('\r', rawdata[17]); assertEquals('\n', rawdata[18]); } public void testChunkedOutputStreamLargeChunk() throws IOException { ByteArrayOutputStream buffer = new ByteArrayOutputStream(); ChunkedOutputStream out = new ChunkedOutputStream(buffer, 2); out.write(new byte[] {'1', '2', '3', '4'}); out.finish(); out.close(); byte [] rawdata = buffer.toByteArray(); assertEquals(14, rawdata.length); assertEquals('4', rawdata[0]); assertEquals('\r', rawdata[1]); assertEquals('\n', rawdata[2]); assertEquals('1', rawdata[3]); assertEquals('2', rawdata[4]); assertEquals('3', rawdata[5]); assertEquals('4', rawdata[6]); assertEquals('\r', rawdata[7]); assertEquals('\n', rawdata[8]); assertEquals('0', rawdata[9]); assertEquals('\r', rawdata[10]); assertEquals('\n', rawdata[11]); assertEquals('\r', rawdata[12]); assertEquals('\n', rawdata[13]); } public void testChunkedOutputStreamSmallChunk() throws IOException { ByteArrayOutputStream buffer = new ByteArrayOutputStream(); ChunkedOutputStream out = new ChunkedOutputStream(buffer, 2); out.write('1'); out.finish(); out.close(); byte [] rawdata = buffer.toByteArray(); assertEquals(11, rawdata.length); assertEquals('1', rawdata[0]); assertEquals('\r', rawdata[1]); assertEquals('\n', rawdata[2]); assertEquals('1', rawdata[3]); assertEquals('\r', rawdata[4]); assertEquals('\n', rawdata[5]); assertEquals('0', rawdata[6]); assertEquals('\r', rawdata[7]); assertEquals('\n', rawdata[8]); assertEquals('\r', rawdata[9]); assertEquals('\n', rawdata[10]); } // ------------------------------------------------------- TestCase Methods public static Test suite() { return new TestSuite(TestStreams.class); } // ------------------------------------------------------------------- Main public static void main(String args[]) { String[] testCaseName = { TestStreams.class.getName() }; junit.textui.TestRunner.main(testCaseName); } }