blob: 93c6b261f25e77d142fdc078885065b6218c2322 [file] [log] [blame]
/*
* 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.input;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.RandomUtils;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
/**
* Tests functionality of {@link BufferedFileChannelInputStream}.
*
* This class was ported and adapted from Apache Spark commit 933dc6cb7b3de1d8ccaf73d124d6eb95b947ed19 where it was
* called {@code GenericFileInputStreamSuite}.
*/
public abstract class AbstractInputStreamTest {
private byte[] randomBytes;
protected File inputFile;
protected InputStream[] inputStreams;
@BeforeEach
public void setUp() throws IOException {
// Create a byte array of size 2 MB with random bytes
randomBytes = RandomUtils.nextBytes(2 * 1024 * 1024);
inputFile = File.createTempFile("temp-file", ".tmp");
FileUtils.writeByteArrayToFile(inputFile, randomBytes);
}
@AfterEach
public void tearDown() throws IOException {
inputFile.delete();
for (final InputStream is : inputStreams) {
is.close();
}
}
@Test
public void testBytesSkipped() throws IOException {
for (final InputStream inputStream : inputStreams) {
assertEquals(1024, inputStream.skip(1024));
for (int i = 1024; i < randomBytes.length; i++) {
assertEquals(randomBytes[i], (byte) inputStream.read());
}
}
}
@Test
public void testBytesSkippedAfterEOF() throws IOException {
for (final InputStream inputStream : inputStreams) {
assertEquals(randomBytes.length, inputStream.skip(randomBytes.length + 1));
assertEquals(-1, inputStream.read());
}
}
@Test
public void testBytesSkippedAfterRead() throws IOException {
for (final InputStream inputStream : inputStreams) {
for (int i = 0; i < 1024; i++) {
assertEquals(randomBytes[i], (byte) inputStream.read());
}
assertEquals(1024, inputStream.skip(1024));
for (int i = 2048; i < randomBytes.length; i++) {
assertEquals(randomBytes[i], (byte) inputStream.read());
}
}
}
@Test
public void testNegativeBytesSkippedAfterRead() throws IOException {
for (final InputStream inputStream : inputStreams) {
for (int i = 0; i < 1024; i++) {
assertEquals(randomBytes[i], (byte) inputStream.read());
}
// Skipping negative bytes should essential be a no-op
assertEquals(0, inputStream.skip(-1));
assertEquals(0, inputStream.skip(-1024));
assertEquals(0, inputStream.skip(Long.MIN_VALUE));
assertEquals(1024, inputStream.skip(1024));
for (int i = 2048; i < randomBytes.length; i++) {
assertEquals(randomBytes[i], (byte) inputStream.read());
}
}
}
@Test
public void testReadMultipleBytes() throws IOException {
for (final InputStream inputStream : inputStreams) {
final byte[] readBytes = new byte[8 * 1024];
int i = 0;
while (i < randomBytes.length) {
final int read = inputStream.read(readBytes, 0, 8 * 1024);
for (int j = 0; j < read; j++) {
assertEquals(randomBytes[i], readBytes[j]);
i++;
}
}
}
}
@Test
public void testReadOneByte() throws IOException {
for (final InputStream inputStream : inputStreams) {
for (final byte randomByte : randomBytes) {
assertEquals(randomByte, (byte) inputStream.read());
}
}
}
@Test
public void testReadPastEOF() throws IOException {
final InputStream is = inputStreams[0];
final byte[] buf = new byte[1024];
int read;
while ((read = is.read(buf, 0, buf.length)) != -1) {
}
final int readAfterEOF = is.read(buf, 0, buf.length);
assertEquals(-1, readAfterEOF);
}
@Test
public void testSkipFromFileChannel() throws IOException {
for (final InputStream inputStream : inputStreams) {
// Since the buffer is smaller than the skipped bytes, this will guarantee
// we skip from underlying file channel.
assertEquals(1024, inputStream.skip(1024));
for (int i = 1024; i < 2048; i++) {
assertEquals(randomBytes[i], (byte) inputStream.read());
}
assertEquals(256, inputStream.skip(256));
assertEquals(256, inputStream.skip(256));
assertEquals(512, inputStream.skip(512));
for (int i = 3072; i < randomBytes.length; i++) {
assertEquals(randomBytes[i], (byte) inputStream.read());
}
}
}
}