/*
* Copyright 2002-2016 the original author or authors.
*
* 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.
*/
package org.springframework.util;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Test suite for {@link FastByteArrayOutputStream}
* @author Craig Andrews
*/
public class FastByteArrayOutputStreamTests {
private static final int INITIAL_CAPACITY = 256;
private FastByteArrayOutputStream os;
private byte[] helloBytes;
@Before
public void setUp() throws Exception {
this.os = new FastByteArrayOutputStream(INITIAL_CAPACITY);
this.helloBytes = "Hello World".getBytes("UTF-8");
}
@Test
public void size() throws Exception {
this.os.write(this.helloBytes);
assertEquals(this.os.size(), this.helloBytes.length);
}
@Test
public void resize() throws Exception {
this.os.write(this.helloBytes);
int sizeBefore = this.os.size();
this.os.resize(64);
assertByteArrayEqualsString(this.os);
assertEquals(sizeBefore, this.os.size());
}
@Test
public void autoGrow() throws IOException {
this.os.resize(1);
for (int i = 0; i < 10; i++) {
this.os.write(1);
}
assertEquals(10, this.os.size());
assertArrayEquals(this.os.toByteArray(), new byte[] {1, 1, 1, 1, 1, 1, 1, 1, 1, 1});
}
@Test
public void write() throws Exception {
this.os.write(this.helloBytes);
assertByteArrayEqualsString(this.os);
}
@Test
public void reset() throws Exception {
this.os.write(this.helloBytes);
assertByteArrayEqualsString(this.os);
this.os.reset();
assertEquals(0, this.os.size());
this.os.write(this.helloBytes);
assertByteArrayEqualsString(this.os);
}
@Test(expected = IOException.class)
public void close() throws Exception {
this.os.close();
this.os.write(this.helloBytes);
}
@Test
public void toByteArrayUnsafe() throws Exception {
this.os.write(this.helloBytes);
assertByteArrayEqualsString(this.os);
assertSame(this.os.toByteArrayUnsafe(), this.os.toByteArrayUnsafe());
assertArrayEquals(this.os.toByteArray(), this.helloBytes);
}
@Test
public void writeTo() throws Exception {
this.os.write(this.helloBytes);
assertByteArrayEqualsString(this.os);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
this.os.writeTo(baos);
assertArrayEquals(baos.toByteArray(), this.helloBytes);
}
@Test(expected = IllegalArgumentException.class)
public void failResize() throws Exception {
this.os.write(this.helloBytes);
this.os.resize(5);
}
@Test
public void getInputStream() throws Exception {
this.os.write(this.helloBytes);
assertNotNull(this.os.getInputStream());
}
@Test
public void getInputStreamAvailable() throws Exception {
this.os.write(this.helloBytes);
assertEquals(this.os.getInputStream().available(), this.helloBytes.length);
}
@Test
public void getInputStreamRead() throws Exception {
this.os.write(this.helloBytes);
InputStream inputStream = this.os.getInputStream();
assertEquals(inputStream.read(), this.helloBytes[0]);
assertEquals(inputStream.read(), this.helloBytes[1]);
assertEquals(inputStream.read(), this.helloBytes[2]);
assertEquals(inputStream.read(), this.helloBytes[3]);
}
@Test
public void getInputStreamReadAll() throws Exception {
this.os.write(this.helloBytes);
InputStream inputStream = this.os.getInputStream();
byte[] actual = new byte[inputStream.available()];
int bytesRead = inputStream.read(actual);
assertEquals(this.helloBytes.length, bytesRead);
assertArrayEquals(this.helloBytes, actual);
assertEquals(0, inputStream.available());
}
@Test
public void getInputStreamReadBeyondEndOfStream() throws Exception {
this.os.write(this.helloBytes);
InputStream inputStream = os.getInputStream();
byte[] actual = new byte[inputStream.available() + 1];
int bytesRead = inputStream.read(actual);
assertEquals(this.helloBytes.length, bytesRead);
for (int i = 0; i < bytesRead; i++) {
assertEquals(this.helloBytes[i], actual[i]);
}
assertEquals(0, actual[this.helloBytes.length]);
assertEquals(0, inputStream.available());
}
@Test
public void getInputStreamSkip() throws Exception {
this.os.write(this.helloBytes);
InputStream inputStream = this.os.getInputStream();
assertEquals(inputStream.read(), this.helloBytes[0]);
assertEquals(inputStream.skip(1), 1);
assertEquals(inputStream.read(), this.helloBytes[2]);
assertEquals(this.helloBytes.length - 3, inputStream.available());
}
@Test
public void getInputStreamSkipAll() throws Exception {
this.os.write(this.helloBytes);
InputStream inputStream = this.os.getInputStream();
assertEquals(inputStream.skip(1000), this.helloBytes.length);
assertEquals(0, inputStream.available());
}
@Test
public void updateMessageDigest() throws Exception {
StringBuilder builder = new StringBuilder("\"0");
this.os.write(this.helloBytes);
InputStream inputStream = this.os.getInputStream();
DigestUtils.appendMd5DigestAsHex(inputStream, builder);
builder.append("\"");
String actual = builder.toString();
assertEquals("\"0b10a8db164e0754105b7a99be72e3fe5\"", actual);
}
@Test
public void updateMessageDigestManyBuffers() throws Exception {
StringBuilder builder = new StringBuilder("\"0");
// filling at least one 256 buffer
for ( int i = 0; i < 30; i++) {
this.os.write(this.helloBytes);
}
InputStream inputStream = this.os.getInputStream();
DigestUtils.appendMd5DigestAsHex(inputStream, builder);
builder.append("\"");
String actual = builder.toString();
assertEquals("\"06225ca1e4533354c516e74512065331d\"", actual);
}
private void assertByteArrayEqualsString(FastByteArrayOutputStream actual) {
assertArrayEquals(this.helloBytes, actual.toByteArray());
}
}