package com.bumptech.glide.util;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
@RunWith(RobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class MarkEnforcingInputStreamTest {
// An arbitrary number > 0.
private static final int MARK_LIMIT = 5;
// Another arbitrary number > MARK_LIMIT.
private static final int DATA_SIZE = MARK_LIMIT + 1;
@Test
public void testReturnsByte_whenReadsUpToMarkLimit_withMoreBytesAvailable() throws IOException {
MarkEnforcingInputStream is =
new MarkEnforcingInputStream(new ByteArrayInputStream(new byte[DATA_SIZE]));
is.mark(MARK_LIMIT);
for (int i = 0; i < MARK_LIMIT; i++) {
assertThat(is.read()).isAtLeast(0);
}
}
@Test
public void testReturnsByte_whenReadsUpToMarkLimit_withNoMoreBytesAvailable() throws IOException {
MarkEnforcingInputStream is =
new MarkEnforcingInputStream(new ByteArrayInputStream(new byte[MARK_LIMIT]));
for (int i = 0; i < MARK_LIMIT; i++) {
assertThat(is.read()).isAtLeast(0);
}
}
@Test
public void testReturnsEndOfStream_whenReadsSingleBytePastMarkLimit() throws IOException {
MarkEnforcingInputStream is =
new MarkEnforcingInputStream(new ByteArrayInputStream(new byte[DATA_SIZE]));
is.mark(MARK_LIMIT);
for (int i = 0; i < MARK_LIMIT; i++) {
assertThat(is.read()).isAtLeast(0);
}
assertEquals(-1, is.read());
}
@Test
public void
testOverridesByteCount_whenReadBufferLargerThanMarkLimit_withNonZeroBytesRemainingInMarkLimit()
throws IOException {
MarkEnforcingInputStream is =
new MarkEnforcingInputStream(new ByteArrayInputStream(new byte[DATA_SIZE]));
is.mark(MARK_LIMIT);
byte[] buffer = new byte[DATA_SIZE];
assertEquals(MARK_LIMIT, is.read(buffer));
}
@Test
public void
testReturnsEndOfStream_whenReadBufferLargerThanMarkLimit_withZeroBytesRemainingInMarkLimit()
throws IOException {
MarkEnforcingInputStream is =
new MarkEnforcingInputStream(new ByteArrayInputStream(new byte[DATA_SIZE]));
is.mark(MARK_LIMIT);
byte[] buffer = new byte[MARK_LIMIT];
assertEquals(MARK_LIMIT, is.read(buffer));
assertEquals(-1, is.read(buffer));
}
@Test
public void testDoesNotReadIntoBuffer_withZeroBytesRemainingInMarkLimit() throws IOException {
byte[] expected = new byte[MARK_LIMIT];
for (int i = 0; i < MARK_LIMIT; i++) {
expected[i] = (byte) (i + 1);
}
byte[] buffer = new byte[MARK_LIMIT];
System.arraycopy(expected, 0, buffer, 0, MARK_LIMIT);
// All zeros.
MarkEnforcingInputStream is =
new MarkEnforcingInputStream(new ByteArrayInputStream(new byte[DATA_SIZE]));
is.mark(MARK_LIMIT);
for (int i = 0; i < MARK_LIMIT; i++) {
assertThat(is.read()).isAtLeast(0);
}
assertEquals(-1, is.read(buffer));
assertThat(buffer).isEqualTo(expected);
}
@Test
public void testResetUnsetsLimit() throws IOException {
MarkEnforcingInputStream is =
new MarkEnforcingInputStream(new ByteArrayInputStream(new byte[DATA_SIZE]));
is.mark(MARK_LIMIT);
for (int i = 0; i < MARK_LIMIT; i++) {
assertThat(is.read()).isAtLeast(0);
}
is.reset();
for (int i = 0; i < DATA_SIZE; i++) {
assertThat(is.read()).isAtLeast(0);
}
}
@Test
public void
testOverridesByteCount_whenSkipCountLargerThanMarkLimit_withNonZeroBytesRemainingInMarkLimit()
throws IOException {
MarkEnforcingInputStream is =
new MarkEnforcingInputStream(new ByteArrayInputStream(new byte[DATA_SIZE]));
is.mark(MARK_LIMIT);
assertEquals(MARK_LIMIT, is.skip(DATA_SIZE));
}
@Test
public void testReturnsEndOfStream_whenSkipping_withZeroBytesRemainingInMarkLimit()
throws IOException {
MarkEnforcingInputStream is =
new MarkEnforcingInputStream(new ByteArrayInputStream(new byte[DATA_SIZE]));
is.mark(MARK_LIMIT);
assertEquals(MARK_LIMIT, is.skip(DATA_SIZE));
assertEquals(-1, is.skip(1));
}
@Test
public void testReturnsStreamAvailable_whenMarkIsNotSet() throws IOException {
ByteArrayInputStream wrapped = new ByteArrayInputStream(new byte[MARK_LIMIT]);
MarkEnforcingInputStream is = new MarkEnforcingInputStream(wrapped);
assertEquals(wrapped.available(), is.available());
}
@Test
public void testReturnsStreamAvailable_whenMarkIsSet_withMarkGreaterThanStreamAvailable()
throws IOException {
ByteArrayInputStream wrapped = new ByteArrayInputStream(new byte[MARK_LIMIT]);
MarkEnforcingInputStream is = new MarkEnforcingInputStream(wrapped);
is.mark(wrapped.available() + 1);
assertEquals(wrapped.available(), is.available());
}
@Test
public void testReturnsMarkLimitAsAvailable_whenMarkIsSet_withMarkLessThanStreamAvailable()
throws IOException {
ByteArrayInputStream wrapped = new ByteArrayInputStream(new byte[MARK_LIMIT]);
MarkEnforcingInputStream is = new MarkEnforcingInputStream(wrapped);
int expected = wrapped.available() - 1;
is.mark(expected);
assertEquals(expected, is.available());
}
}