blob: 768e8a4ff91923bd881d319c601b9eb1cd108304 [file] [log] [blame]
/*
* Copyright 2013 Google Inc.
*
* 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 com.google.common.jimfs;
import static com.google.common.jimfs.TestUtils.bytes;
import static com.google.common.jimfs.TestUtils.regularFile;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.fail;
import com.google.common.util.concurrent.Runnables;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.io.IOException;
/**
* Tests for {@link JimfsInputStream}.
*
* @author Colin Decker
*/
@RunWith(JUnit4.class)
@SuppressWarnings("ResultOfMethodCallIgnored")
public class JimfsInputStreamTest {
@Test
public void testRead_singleByte() throws IOException {
JimfsInputStream in = newInputStream(2);
assertThat(in.read()).isEqualTo(2);
assertEmpty(in);
}
@Test
public void testRead_wholeArray() throws IOException {
JimfsInputStream in = newInputStream(1, 2, 3, 4, 5, 6, 7, 8);
byte[] bytes = new byte[8];
assertThat(in.read(bytes)).isEqualTo(8);
assertArrayEquals(bytes(1, 2, 3, 4, 5, 6, 7, 8), bytes);
assertEmpty(in);
}
@Test
public void testRead_wholeArray_arrayLarger() throws IOException {
JimfsInputStream in = newInputStream(1, 2, 3, 4, 5, 6, 7, 8);
byte[] bytes = new byte[12];
assertThat(in.read(bytes)).isEqualTo(8);
assertArrayEquals(bytes(1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0), bytes);
assertEmpty(in);
}
@Test
public void testRead_wholeArray_arraySmaller() throws IOException {
JimfsInputStream in = newInputStream(1, 2, 3, 4, 5, 6, 7, 8);
byte[] bytes = new byte[6];
assertThat(in.read(bytes)).isEqualTo(6);
assertArrayEquals(bytes(1, 2, 3, 4, 5, 6), bytes);
bytes = new byte[6];
assertThat(in.read(bytes)).isEqualTo(2);
assertArrayEquals(bytes(7, 8, 0, 0, 0, 0), bytes);
assertEmpty(in);
}
@Test
public void testRead_partialArray() throws IOException {
JimfsInputStream in = newInputStream(1, 2, 3, 4, 5, 6, 7, 8);
byte[] bytes = new byte[12];
assertThat(in.read(bytes, 0, 8)).isEqualTo(8);
assertArrayEquals(bytes(1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0), bytes);
assertEmpty(in);
}
@Test
public void testRead_partialArray_sliceLarger() throws IOException {
JimfsInputStream in = newInputStream(1, 2, 3, 4, 5, 6, 7, 8);
byte[] bytes = new byte[12];
assertThat(in.read(bytes, 0, 10)).isEqualTo(8);
assertArrayEquals(bytes(1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0), bytes);
assertEmpty(in);
}
@Test
public void testRead_partialArray_sliceSmaller() throws IOException {
JimfsInputStream in = newInputStream(1, 2, 3, 4, 5, 6, 7, 8);
byte[] bytes = new byte[12];
assertThat(in.read(bytes, 0, 6)).isEqualTo(6);
assertArrayEquals(bytes(1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0), bytes);
assertThat(in.read(bytes, 6, 6)).isEqualTo(2);
assertArrayEquals(bytes(1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0), bytes);
assertEmpty(in);
}
@Test
public void testRead_partialArray_invalidInput() throws IOException {
JimfsInputStream in = newInputStream(1, 2, 3, 4, 5);
try {
in.read(new byte[3], -1, 1);
fail();
} catch (IndexOutOfBoundsException expected) {
}
try {
in.read(new byte[3], 0, 4);
fail();
} catch (IndexOutOfBoundsException expected) {
}
try {
in.read(new byte[3], 1, 3);
fail();
} catch (IndexOutOfBoundsException expected) {
}
}
@Test
public void testAvailable() throws IOException {
JimfsInputStream in = newInputStream(1, 2, 3, 4, 5, 6, 7, 8);
assertThat(in.available()).isEqualTo(8);
assertThat(in.read()).isEqualTo(1);
assertThat(in.available()).isEqualTo(7);
assertThat(in.read(new byte[3])).isEqualTo(3);
assertThat(in.available()).isEqualTo(4);
assertThat(in.read(new byte[10], 1, 2)).isEqualTo(2);
assertThat(in.available()).isEqualTo(2);
assertThat(in.read(new byte[10])).isEqualTo(2);
assertThat(in.available()).isEqualTo(0);
}
@Test
public void testSkip() throws IOException {
JimfsInputStream in = newInputStream(1, 2, 3, 4, 5, 6, 7, 8);
assertThat(in.skip(0)).isEqualTo(0);
assertThat(in.skip(-10)).isEqualTo(0);
assertThat(in.skip(2)).isEqualTo(2);
assertThat(in.read()).isEqualTo(3);
assertThat(in.skip(3)).isEqualTo(3);
assertThat(in.read()).isEqualTo(7);
assertThat(in.skip(10)).isEqualTo(1);
assertEmpty(in);
assertThat(in.skip(10)).isEqualTo(0);
assertEmpty(in);
}
@SuppressWarnings("GuardedByChecker")
@Test
public void testFullyReadInputStream_doesNotChangeStateWhenStoreChanges() throws IOException {
JimfsInputStream in = newInputStream(1, 2, 3, 4, 5);
assertThat(in.read(new byte[5])).isEqualTo(5);
assertEmpty(in);
in.file.write(5, new byte[10], 0, 10); // append more bytes to file
assertEmpty(in);
}
@Test
public void testMark_unsupported() throws IOException {
JimfsInputStream in = newInputStream(1, 2, 3);
assertThat(in.markSupported()).isFalse();
// mark does nothing
in.mark(1);
try {
// reset throws IOException when unsupported
in.reset();
fail();
} catch (IOException expected) {
}
}
@Test
public void testClosedInputStream_throwsException() throws IOException {
JimfsInputStream in = newInputStream(1, 2, 3);
in.close();
try {
in.read();
fail();
} catch (IOException expected) {
}
try {
in.read(new byte[3]);
fail();
} catch (IOException expected) {
}
try {
in.read(new byte[10], 0, 2);
fail();
} catch (IOException expected) {
}
try {
in.skip(10);
fail();
} catch (IOException expected) {
}
try {
in.available();
fail();
} catch (IOException expected) {
}
in.close(); // does nothing
}
private static JimfsInputStream newInputStream(int... bytes) throws IOException {
byte[] b = new byte[bytes.length];
for (int i = 0; i < bytes.length; i++) {
b[i] = (byte) bytes[i];
}
RegularFile file = regularFile(0);
file.write(0, b, 0, b.length);
return new JimfsInputStream(file, new FileSystemState(Runnables.doNothing()));
}
private static void assertEmpty(JimfsInputStream in) throws IOException {
assertThat(in.read()).isEqualTo(-1);
assertThat(in.read(new byte[3])).isEqualTo(-1);
assertThat(in.read(new byte[10], 1, 5)).isEqualTo(-1);
assertThat(in.available()).isEqualTo(0);
}
}