/* This code is part of Freenet. It is distributed under the GNU General * Public License, version 2 (or at your option any later version). See * http://www.gnu.org/ for further details of the GPL. */ package freenet.support.io; import static freenet.test.Asserts.assertArrayEquals; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Arrays; import junit.framework.TestCase; public class HeaderStreamsTest extends TestCase { final public static String strHeader = "TEST"; final public static String strString = "testing testing 1 2 3"; final public static byte[] bHeader = strHeader.getBytes(); final public static byte[] bString = strString.getBytes(); final public static byte[] bJoined = (strHeader + strString).getBytes(); InputStream augStream; ByteArrayOutputStream origStream; OutputStream dimStream; protected void setUp() throws Exception { super.setUp(); InputStream testStream = new ByteArrayInputStream(bString); augStream = HeaderStreams.augInput(bHeader, testStream); origStream = new ByteArrayOutputStream(); dimStream = HeaderStreams.dimOutput(bHeader, origStream); } protected void tearDown() throws Exception { super.tearDown(); } public void testAugInputRead1() throws IOException { int size = augStream.available(); assertEquals(size, bHeader.length + bString.length); byte[] buffer = new byte[size]; for (int i=0; i<bJoined.length; i++) { int data = augStream.read(); assertEquals(size-i-1, augStream.available()); assertEquals((char)data, bJoined[i]); buffer[i] = (byte)data; } assertArrayEquals(bJoined, buffer); } public void testAugInputReadM() throws IOException { _testAugInputRead(-bHeader.length); } public void testAugInputReadI() throws IOException { _testAugInputRead(-1); } public void testAugInputRead0() throws IOException { _testAugInputRead(0); } public void testAugInputReadP() throws IOException { _testAugInputRead(1); } public void testAugInputReadZ() throws IOException { _testAugInputRead(bString.length); } public void _testAugInputRead(int m) throws IOException { int i = bHeader.length+m; int size = augStream.available(); byte[] buffer = new byte[size]; augStream.read(buffer, 0, i); assertArrayEquals( Arrays.copyOfRange(Arrays.copyOfRange(bJoined, 0, i), 0, size), buffer); augStream.read(buffer, i, size-i); assertArrayEquals(bJoined, buffer); } public void testAugInputSkipAndReadM() throws IOException { _testAugInputSkipAndRead(-bHeader.length); } public void testAugInputSkipAndReadI() throws IOException { _testAugInputSkipAndRead(-1); } public void testAugInputSkipAndRead0() throws IOException { _testAugInputSkipAndRead(0); } public void testAugInputSkipAndReadP() throws IOException { _testAugInputSkipAndRead(1); } public void testAugInputSkipAndReadZ() throws IOException { _testAugInputSkipAndRead(bString.length); } public void _testAugInputSkipAndRead(int m) throws IOException { int i = bHeader.length+m; augStream.skip(i); int size = augStream.available(); assertEquals(size, bJoined.length-i); byte[] buffer = new byte[size]; int read = augStream.read(buffer); assertEquals(read, size > 0? size: -1); assertArrayEquals( Arrays.copyOfRange(bJoined, i, bJoined.length), buffer); } public void testDimOutputWrite1() throws IOException { for (int i=0; i<bJoined.length; i++) { assertArrayEquals(origStream.toByteArray(), (i < bHeader.length)? new byte[0]: Arrays.copyOfRange(bString, 0, i-bHeader.length)); dimStream.write(bJoined[i]); } assertArrayEquals(bString, origStream.toByteArray()); } public void testDimOutputWriteM() throws IOException { _testDimOutputWrite(-bHeader.length); } public void testDimOutputWriteI() throws IOException { _testDimOutputWrite(-1); } public void testDimOutputWrite0() throws IOException { _testDimOutputWrite(0); } public void testDimOutputWriteP() throws IOException { _testDimOutputWrite(1); } public void testDimOutputWriteZ() throws IOException { _testDimOutputWrite(bString.length); } public void _testDimOutputWrite(int m) throws IOException { int i = bHeader.length+m; dimStream.write(Arrays.copyOfRange(bJoined, 0, i)); assertArrayEquals(origStream.toByteArray(), (i < bHeader.length)? new byte[0]: Arrays.copyOfRange(bString, 0, i-bHeader.length)); dimStream.write(Arrays.copyOfRange(bJoined, i, bJoined.length)); assertArrayEquals(bString, origStream.toByteArray()); } public void testDimOutputThrow0() throws IOException { assertArrayEquals(new byte[0], origStream.toByteArray()); try { dimStream.write('!'); fail("failed to throw IOException"); } catch (IOException expected) { } } public void testDimOutputThrow1() throws IOException { dimStream.write('T'); assertArrayEquals(new byte[0], origStream.toByteArray()); try { dimStream.write("!!!".getBytes()); fail("failed to throw IOException"); } catch (IOException expected) { } } }