/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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. */ package org.apache.commons.io.output; import org.apache.commons.io.IOUtils; import org.junit.Test; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; import static org.junit.Assert.fail; /** * Basic unit tests for the alternative ByteArrayOutputStream implementation. */ public class ByteArrayOutputStreamTestCase { private static final byte[] DATA; static { DATA = new byte[64]; for (byte i = 0; i < 64; i++) { DATA[i] = i; } } private int writeData(final ByteArrayOutputStream baout, final java.io.ByteArrayOutputStream ref, final int count) { if (count > DATA.length) { throw new IllegalArgumentException("Requesting too many bytes"); } if (count == 0) { baout.write(100); ref.write(100); return 1; } else { baout.write(DATA, 0, count); ref.write(DATA, 0, count); return count; } } private int writeData(final ByteArrayOutputStream baout, final java.io.ByteArrayOutputStream ref, final int[] instructions) { int written = 0; for (final int instruction : instructions) { written += writeData(baout, ref, instruction); } return written; } private static boolean byteCmp(final byte[] src, final byte[] cmp) { for (int i = 0; i < cmp.length; i++) { if (src[i] != cmp[i]) { return false; } } return true; } private void checkByteArrays(final byte[] expected, final byte[] actual) { if (expected.length != actual.length) { fail("Resulting byte arrays are not equally long"); } if (!byteCmp(expected, actual)) { fail("Resulting byte arrays are not equal"); } } private void checkStreams( final ByteArrayOutputStream actual, final java.io.ByteArrayOutputStream expected) { assertEquals("Sizes are not equal", expected.size(), actual.size()); final byte[] buf = actual.toByteArray(); final byte[] refbuf = expected.toByteArray(); checkByteArrays(buf, refbuf); } @Test public void testToInputStream() throws IOException { ByteArrayOutputStream baout = new ByteArrayOutputStream(); java.io.ByteArrayOutputStream ref = new java.io.ByteArrayOutputStream(); //Write 8224 bytes writeData(baout, ref, 32); for(int i=0;i<128;i++) { writeData(baout, ref, 64); } //Get data before more writes InputStream in = baout.toInputStream(); byte refData[] = ref.toByteArray(); //Write some more data writeData(baout, ref, new int[] { 2, 4, 8, 16 }); //Check original data byte baoutData[] = IOUtils.toByteArray(in); assertEquals(8224, baoutData.length); checkByteArrays(refData, baoutData); //Check all data written baoutData = IOUtils.toByteArray(baout.toInputStream()); refData = ref.toByteArray(); assertEquals(8254, baoutData.length); checkByteArrays(refData, baoutData); baout.close(); in.close(); } @Test public void testToInputStreamWithReset() throws IOException { //Make sure reset() do not destroy InputStream returned from toInputStream() ByteArrayOutputStream baout = new ByteArrayOutputStream(); java.io.ByteArrayOutputStream ref = new java.io.ByteArrayOutputStream(); //Write 8224 bytes writeData(baout, ref, 32); for(int i=0;i<128;i++) { writeData(baout, ref, 64); } //Get data before reset InputStream in = baout.toInputStream(); byte refData[] = ref.toByteArray(); //Reset and write some new data baout.reset(); ref.reset(); writeData(baout, ref, new int[] { 2, 4, 8, 16 }); //Check original data byte baoutData[] = IOUtils.toByteArray(in); assertEquals(8224, baoutData.length); checkByteArrays(refData, baoutData); //Check new data written after reset baoutData = IOUtils.toByteArray(baout.toInputStream()); refData = ref.toByteArray(); assertEquals(30, baoutData.length); checkByteArrays(refData, baoutData); baout.close(); in.close(); } @Test public void testStream() throws Exception { int written; //The ByteArrayOutputStream is initialized with 32 bytes to match //the original more closely for this test. final ByteArrayOutputStream baout = new ByteArrayOutputStream(32); final java.io.ByteArrayOutputStream ref = new java.io.ByteArrayOutputStream(); //First three writes written = writeData(baout, ref, new int[] {4, 10, 22}); assertEquals(36, written); checkStreams(baout, ref); //Another two writes to see if there are any bad effects after toByteArray() written = writeData(baout, ref, new int[] {20, 12}); assertEquals(32, written); checkStreams(baout, ref); //Now reset the streams baout.reset(); ref.reset(); //Test again to see if reset() had any bad effects written = writeData(baout, ref, new int[] {5, 47, 33, 60, 1, 0, 8}); assertEquals(155, written); checkStreams(baout, ref); //Test the readFrom(InputStream) method baout.reset(); written = baout.write(new ByteArrayInputStream(ref.toByteArray())); assertEquals(155, written); checkStreams(baout, ref); //Write the commons Byte[]OutputStream to a java.io.Byte[]OutputStream //and vice-versa to test the writeTo() method. final ByteArrayOutputStream baout1 = new ByteArrayOutputStream(32); ref.writeTo(baout1); final java.io.ByteArrayOutputStream ref1 = new java.io.ByteArrayOutputStream(); baout.writeTo(ref1); checkStreams(baout1, ref1); //Testing toString(String) final String baoutString = baout.toString("ASCII"); final String refString = ref.toString("ASCII"); assertEquals("ASCII decoded String must be equal", refString, baoutString); //Make sure that empty ByteArrayOutputStreams really don't create garbage //on toByteArray() final ByteArrayOutputStream baos1 = new ByteArrayOutputStream(); final ByteArrayOutputStream baos2 = new ByteArrayOutputStream(); assertSame(baos1.toByteArray(), baos2.toByteArray()); baos1.close(); baos2.close(); baout.close(); baout1.close(); } }