Fix peeking the end of the stream then reading it.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=133240502
This commit is contained in:
andrewlewis 2016-09-15 03:21:00 -07:00 committed by Oliver Woodman
parent ab49425e43
commit b1f9798b89
2 changed files with 45 additions and 30 deletions

View file

@ -33,14 +33,14 @@ public class DefaultExtractorInputTest extends TestCase {
private static final byte[] TEST_DATA = new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8};
private static final int LARGE_TEST_DATA_LENGTH = 8192;
public void testInitialPosition() throws IOException {
public void testInitialPosition() throws Exception {
FakeDataSource testDataSource = buildDataSource();
DefaultExtractorInput input =
new DefaultExtractorInput(testDataSource, 123, C.LENGTH_UNSET);
assertEquals(123, input.getPosition());
}
public void testRead() throws IOException, InterruptedException {
public void testRead() throws Exception {
DefaultExtractorInput input = createDefaultExtractorInput();
byte[] target = new byte[TEST_DATA.length];
// We expect to perform three reads of three bytes, as setup in buildTestDataSource.
@ -58,7 +58,7 @@ public class DefaultExtractorInputTest extends TestCase {
assertEquals(C.RESULT_END_OF_INPUT, expectedEndOfInput);
}
public void testReadPeeked() throws IOException, InterruptedException {
public void testReadPeeked() throws Exception {
DefaultExtractorInput input = createDefaultExtractorInput();
byte[] target = new byte[TEST_DATA.length];
@ -71,7 +71,7 @@ public class DefaultExtractorInputTest extends TestCase {
assertTrue(Arrays.equals(TEST_DATA, target));
}
public void testReadMoreDataPeeked() throws IOException, InterruptedException {
public void testReadMoreDataPeeked() throws Exception {
DefaultExtractorInput input = createDefaultExtractorInput();
byte[] target = new byte[TEST_DATA.length];
@ -84,7 +84,7 @@ public class DefaultExtractorInputTest extends TestCase {
assertTrue(Arrays.equals(TEST_DATA, target));
}
public void testReadFullyOnce() throws IOException, InterruptedException {
public void testReadFullyOnce() throws Exception {
DefaultExtractorInput input = createDefaultExtractorInput();
byte[] target = new byte[TEST_DATA.length];
input.readFully(target, 0, TEST_DATA.length);
@ -103,7 +103,7 @@ public class DefaultExtractorInputTest extends TestCase {
}
}
public void testReadFullyTwice() throws IOException, InterruptedException {
public void testReadFullyTwice() throws Exception {
// Read TEST_DATA in two parts.
DefaultExtractorInput input = createDefaultExtractorInput();
byte[] target = new byte[5];
@ -116,7 +116,7 @@ public class DefaultExtractorInputTest extends TestCase {
assertEquals(5 + 4, input.getPosition());
}
public void testReadFullyTooMuch() throws IOException, InterruptedException {
public void testReadFullyTooMuch() throws Exception {
// Read more than TEST_DATA. Should fail with an EOFException. Position should not update.
DefaultExtractorInput input = createDefaultExtractorInput();
try {
@ -141,7 +141,7 @@ public class DefaultExtractorInputTest extends TestCase {
assertEquals(0, input.getPosition());
}
public void testReadFullyWithFailingDataSource() throws IOException, InterruptedException {
public void testReadFullyWithFailingDataSource() throws Exception {
FakeDataSource testDataSource = buildFailingDataSource();
DefaultExtractorInput input = new DefaultExtractorInput(testDataSource, 0, C.LENGTH_UNSET);
try {
@ -155,7 +155,7 @@ public class DefaultExtractorInputTest extends TestCase {
assertEquals(0, input.getPosition());
}
public void testReadFullyHalfPeeked() throws IOException, InterruptedException {
public void testReadFullyHalfPeeked() throws Exception {
DefaultExtractorInput input = createDefaultExtractorInput();
byte[] target = new byte[TEST_DATA.length];
@ -168,7 +168,7 @@ public class DefaultExtractorInputTest extends TestCase {
assertEquals(TEST_DATA.length, input.getPosition());
}
public void testSkip() throws IOException, InterruptedException {
public void testSkip() throws Exception {
FakeDataSource testDataSource = buildDataSource();
DefaultExtractorInput input = new DefaultExtractorInput(testDataSource, 0, C.LENGTH_UNSET);
// We expect to perform three skips of three bytes, as setup in buildTestDataSource.
@ -180,7 +180,7 @@ public class DefaultExtractorInputTest extends TestCase {
assertEquals(C.RESULT_END_OF_INPUT, expectedEndOfInput);
}
public void testLargeSkip() throws IOException, InterruptedException {
public void testLargeSkip() throws Exception {
FakeDataSource testDataSource = buildLargeDataSource();
DefaultExtractorInput input = new DefaultExtractorInput(testDataSource, 0, C.LENGTH_UNSET);
// Check that skipping the entire data source succeeds.
@ -190,7 +190,7 @@ public class DefaultExtractorInputTest extends TestCase {
}
}
public void testSkipFullyOnce() throws IOException, InterruptedException {
public void testSkipFullyOnce() throws Exception {
// Skip TEST_DATA.
DefaultExtractorInput input = createDefaultExtractorInput();
input.skipFully(TEST_DATA.length);
@ -207,7 +207,7 @@ public class DefaultExtractorInputTest extends TestCase {
}
}
public void testSkipFullyTwice() throws IOException, InterruptedException {
public void testSkipFullyTwice() throws Exception {
// Skip TEST_DATA in two parts.
DefaultExtractorInput input = createDefaultExtractorInput();
input.skipFully(5);
@ -216,7 +216,7 @@ public class DefaultExtractorInputTest extends TestCase {
assertEquals(5 + 4, input.getPosition());
}
public void testSkipFullyTwicePeeked() throws IOException, InterruptedException {
public void testSkipFullyTwicePeeked() throws Exception {
// Skip TEST_DATA.
DefaultExtractorInput input = createDefaultExtractorInput();
@ -230,7 +230,7 @@ public class DefaultExtractorInputTest extends TestCase {
assertEquals(TEST_DATA.length, input.getPosition());
}
public void testSkipFullyTooMuch() throws IOException, InterruptedException {
public void testSkipFullyTooMuch() throws Exception {
// Skip more than TEST_DATA. Should fail with an EOFException. Position should not update.
DefaultExtractorInput input = createDefaultExtractorInput();
try {
@ -253,7 +253,7 @@ public class DefaultExtractorInputTest extends TestCase {
assertEquals(0, input.getPosition());
}
public void testSkipFullyWithFailingDataSource() throws IOException, InterruptedException {
public void testSkipFullyWithFailingDataSource() throws Exception {
FakeDataSource testDataSource = buildFailingDataSource();
DefaultExtractorInput input = new DefaultExtractorInput(testDataSource, 0, C.LENGTH_UNSET);
try {
@ -266,7 +266,7 @@ public class DefaultExtractorInputTest extends TestCase {
assertEquals(0, input.getPosition());
}
public void testSkipFullyLarge() throws IOException, InterruptedException {
public void testSkipFullyLarge() throws Exception {
// Tests skipping an amount of data that's larger than any internal scratch space.
int largeSkipSize = 1024 * 1024;
FakeDataSource.Builder builder = new FakeDataSource.Builder();
@ -286,7 +286,7 @@ public class DefaultExtractorInputTest extends TestCase {
}
}
public void testPeekFully() throws IOException, InterruptedException {
public void testPeekFully() throws Exception {
DefaultExtractorInput input = createDefaultExtractorInput();
byte[] target = new byte[TEST_DATA.length];
input.peekFully(target, 0, TEST_DATA.length);
@ -312,7 +312,7 @@ public class DefaultExtractorInputTest extends TestCase {
}
}
public void testResetPeekPosition() throws IOException, InterruptedException {
public void testResetPeekPosition() throws Exception {
DefaultExtractorInput input = createDefaultExtractorInput();
byte[] target = new byte[TEST_DATA.length];
input.peekFully(target, 0, TEST_DATA.length);
@ -336,8 +336,7 @@ public class DefaultExtractorInputTest extends TestCase {
}
}
public void testPeekFullyAtEndOfStreamWithAllowEndOfInputSucceeds()
throws IOException, InterruptedException {
public void testPeekFullyAtEndOfStreamWithAllowEndOfInputSucceeds() throws Exception {
DefaultExtractorInput input = createDefaultExtractorInput();
byte[] target = new byte[TEST_DATA.length];
@ -348,8 +347,24 @@ public class DefaultExtractorInputTest extends TestCase {
assertFalse(input.peekFully(target, 0, 1, true));
}
public void testPeekFullyAcrossEndOfInputWithAllowEndOfInputFails()
throws IOException, InterruptedException {
public void testPeekFullyAtEndThenReadEndOfInput() throws Exception {
DefaultExtractorInput input = createDefaultExtractorInput();
byte[] target = new byte[TEST_DATA.length];
// Peek up to the end of the input.
assertTrue(input.peekFully(target, 0, TEST_DATA.length, false));
// Peek the end of the input.
assertFalse(input.peekFully(target, 0, 1, true));
// Read up to the end of the input.
assertTrue(input.readFully(target, 0, TEST_DATA.length, false));
// Read the end of the input.
assertFalse(input.readFully(target, 0, 1, true));
}
public void testPeekFullyAcrossEndOfInputWithAllowEndOfInputFails() throws Exception {
DefaultExtractorInput input = createDefaultExtractorInput();
byte[] target = new byte[TEST_DATA.length];
@ -365,8 +380,7 @@ public class DefaultExtractorInputTest extends TestCase {
}
}
public void testResetAndPeekFullyPastEndOfStreamWithAllowEndOfInputFails()
throws IOException, InterruptedException {
public void testResetAndPeekFullyPastEndOfStreamWithAllowEndOfInputFails() throws Exception {
DefaultExtractorInput input = createDefaultExtractorInput();
byte[] target = new byte[TEST_DATA.length];
@ -382,7 +396,7 @@ public class DefaultExtractorInputTest extends TestCase {
}
}
private static FakeDataSource buildDataSource() throws IOException {
private static FakeDataSource buildDataSource() throws Exception {
FakeDataSource.Builder builder = new FakeDataSource.Builder();
builder.appendReadData(Arrays.copyOfRange(TEST_DATA, 0, 3));
builder.appendReadData(Arrays.copyOfRange(TEST_DATA, 3, 6));
@ -392,7 +406,7 @@ public class DefaultExtractorInputTest extends TestCase {
return testDataSource;
}
private static FakeDataSource buildFailingDataSource() throws IOException {
private static FakeDataSource buildFailingDataSource() throws Exception {
FakeDataSource.Builder builder = new FakeDataSource.Builder();
builder.appendReadData(Arrays.copyOfRange(TEST_DATA, 0, 6));
builder.appendReadError(new IOException());
@ -402,7 +416,7 @@ public class DefaultExtractorInputTest extends TestCase {
return testDataSource;
}
private static FakeDataSource buildLargeDataSource() throws IOException {
private static FakeDataSource buildLargeDataSource() throws Exception {
FakeDataSource.Builder builder = new FakeDataSource.Builder();
builder.appendReadData(new byte[LARGE_TEST_DATA_LENGTH]);
FakeDataSource testDataSource = builder.build();
@ -410,8 +424,9 @@ public class DefaultExtractorInputTest extends TestCase {
return testDataSource;
}
private static DefaultExtractorInput createDefaultExtractorInput() throws IOException {
private static DefaultExtractorInput createDefaultExtractorInput() throws Exception {
FakeDataSource testDataSource = buildDataSource();
return new DefaultExtractorInput(testDataSource, 0, C.LENGTH_UNSET);
}
}

View file

@ -125,7 +125,6 @@ public final class DefaultExtractorInput implements ExtractorInput {
throws IOException, InterruptedException {
ensureSpaceForPeek(length);
int bytesPeeked = Math.min(peekBufferLength - peekBufferPosition, length);
peekBufferLength += length - bytesPeeked;
while (bytesPeeked < length) {
bytesPeeked = readFromDataSource(peekBuffer, peekBufferPosition, length, bytesPeeked,
allowEndOfInput);
@ -134,6 +133,7 @@ public final class DefaultExtractorInput implements ExtractorInput {
}
}
peekBufferPosition += length;
peekBufferLength = Math.max(peekBufferLength, peekBufferPosition);
return true;
}