mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
Add test for DefaultExtractorInput + trivial Extractor sanity checks.
This commit is contained in:
parent
7d8141e419
commit
f002e6a76e
2 changed files with 264 additions and 0 deletions
|
|
@ -0,0 +1,230 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2014 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* 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.android.exoplayer.extractor;
|
||||||
|
|
||||||
|
import com.google.android.exoplayer.C;
|
||||||
|
import com.google.android.exoplayer.testutil.FakeDataSource;
|
||||||
|
import com.google.android.exoplayer.upstream.DataSpec;
|
||||||
|
|
||||||
|
import android.net.Uri;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import java.io.EOFException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for {@link DefaultExtractorInput}.
|
||||||
|
*/
|
||||||
|
public class DefaultExtractorInputTest extends TestCase {
|
||||||
|
|
||||||
|
private static final String TEST_URI = "http://www.google.com";
|
||||||
|
private static final byte[] TEST_DATA = new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8};
|
||||||
|
|
||||||
|
public void testInitialPosition() throws IOException {
|
||||||
|
FakeDataSource testDataSource = buildDataSource();
|
||||||
|
DefaultExtractorInput input =
|
||||||
|
new DefaultExtractorInput(testDataSource, 123, C.LENGTH_UNBOUNDED);
|
||||||
|
assertEquals(123, input.getPosition());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testRead() throws IOException, InterruptedException {
|
||||||
|
FakeDataSource testDataSource = buildDataSource();
|
||||||
|
DefaultExtractorInput input = new DefaultExtractorInput(testDataSource, 0, C.LENGTH_UNBOUNDED);
|
||||||
|
byte[] target = new byte[TEST_DATA.length];
|
||||||
|
// We expect to perform three reads of three bytes, as setup in buildTestDataSource.
|
||||||
|
int bytesRead = 0;
|
||||||
|
bytesRead += input.read(target, 0, TEST_DATA.length);
|
||||||
|
assertEquals(3, bytesRead);
|
||||||
|
bytesRead += input.read(target, 3, TEST_DATA.length);
|
||||||
|
assertEquals(6, bytesRead);
|
||||||
|
bytesRead += input.read(target, 6, TEST_DATA.length);
|
||||||
|
assertEquals(9, bytesRead);
|
||||||
|
// Check the read data is correct.
|
||||||
|
assertTrue(Arrays.equals(TEST_DATA, target));
|
||||||
|
// Check we're now indicated that the end of input is reached.
|
||||||
|
int expectedEndOfInput = input.read(target, 0, TEST_DATA.length);
|
||||||
|
assertEquals(-1, expectedEndOfInput);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testReadFullyOnce() throws IOException, InterruptedException {
|
||||||
|
FakeDataSource testDataSource = buildDataSource();
|
||||||
|
DefaultExtractorInput input = new DefaultExtractorInput(testDataSource, 0, C.LENGTH_UNBOUNDED);
|
||||||
|
byte[] target = new byte[TEST_DATA.length];
|
||||||
|
input.readFully(target, 0, TEST_DATA.length);
|
||||||
|
// Check that we read the whole of TEST_DATA.
|
||||||
|
assertTrue(Arrays.equals(TEST_DATA, target));
|
||||||
|
assertEquals(TEST_DATA.length, input.getPosition());
|
||||||
|
// Check that we see end of input if we read again with allowEndOfInput set.
|
||||||
|
boolean result = input.readFully(target, 0, 1, true);
|
||||||
|
assertFalse(result);
|
||||||
|
// Check that we fail with EOFException we read again with allowEndOfInput unset.
|
||||||
|
try {
|
||||||
|
input.readFully(target, 0, 1);
|
||||||
|
fail();
|
||||||
|
} catch (EOFException e) {
|
||||||
|
// Expected.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testReadFullyTwice() throws IOException, InterruptedException {
|
||||||
|
// Read TEST_DATA in two parts.
|
||||||
|
FakeDataSource testDataSource = buildDataSource();
|
||||||
|
DefaultExtractorInput input = new DefaultExtractorInput(testDataSource, 0, C.LENGTH_UNBOUNDED);
|
||||||
|
byte[] target = new byte[5];
|
||||||
|
input.readFully(target, 0, 5);
|
||||||
|
assertTrue(Arrays.equals(Arrays.copyOf(TEST_DATA, 5), target));
|
||||||
|
assertEquals(5, input.getPosition());
|
||||||
|
target = new byte[4];
|
||||||
|
input.readFully(target, 0, 4);
|
||||||
|
assertTrue(Arrays.equals(Arrays.copyOfRange(TEST_DATA, 5, 9), target));
|
||||||
|
assertEquals(5 + 4, input.getPosition());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testReadFullyTooMuch() throws IOException, InterruptedException {
|
||||||
|
// Read more than TEST_DATA. Should fail with an EOFException. Position should not update.
|
||||||
|
FakeDataSource testDataSource = buildDataSource();
|
||||||
|
DefaultExtractorInput input = new DefaultExtractorInput(testDataSource, 0, C.LENGTH_UNBOUNDED);
|
||||||
|
try {
|
||||||
|
byte[] target = new byte[TEST_DATA.length + 1];
|
||||||
|
input.readFully(target, 0, TEST_DATA.length + 1);
|
||||||
|
fail();
|
||||||
|
} catch (EOFException e) {
|
||||||
|
// Expected.
|
||||||
|
}
|
||||||
|
assertEquals(0, input.getPosition());
|
||||||
|
|
||||||
|
// Read more than TEST_DATA with allowEndOfInput set. Should fail with an EOFException because
|
||||||
|
// the end of input isn't encountered immediately. Position should not update.
|
||||||
|
testDataSource = buildDataSource();
|
||||||
|
input = new DefaultExtractorInput(testDataSource, 0, C.LENGTH_UNBOUNDED);
|
||||||
|
try {
|
||||||
|
byte[] target = new byte[TEST_DATA.length + 1];
|
||||||
|
input.readFully(target, 0, TEST_DATA.length + 1, true);
|
||||||
|
fail();
|
||||||
|
} catch (EOFException e) {
|
||||||
|
// Expected.
|
||||||
|
}
|
||||||
|
assertEquals(0, input.getPosition());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testReadFullyWithFailingDataSource() throws IOException, InterruptedException {
|
||||||
|
FakeDataSource testDataSource = buildFailingDataSource();
|
||||||
|
DefaultExtractorInput input = new DefaultExtractorInput(testDataSource, 0, C.LENGTH_UNBOUNDED);
|
||||||
|
try {
|
||||||
|
byte[] target = new byte[TEST_DATA.length];
|
||||||
|
input.readFully(target, 0, TEST_DATA.length);
|
||||||
|
fail();
|
||||||
|
} catch (IOException e) {
|
||||||
|
// Expected.
|
||||||
|
}
|
||||||
|
// The position should not have advanced.
|
||||||
|
assertEquals(0, input.getPosition());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSkipFullyOnce() throws IOException, InterruptedException {
|
||||||
|
// Skip TEST_DATA.
|
||||||
|
FakeDataSource testDataSource = buildDataSource();
|
||||||
|
DefaultExtractorInput input = new DefaultExtractorInput(testDataSource, 0, C.LENGTH_UNBOUNDED);
|
||||||
|
input.skipFully(TEST_DATA.length);
|
||||||
|
assertEquals(TEST_DATA.length, input.getPosition());
|
||||||
|
// Check that we fail with EOFException we skip again.
|
||||||
|
try {
|
||||||
|
input.skipFully(1);
|
||||||
|
fail();
|
||||||
|
} catch (EOFException e) {
|
||||||
|
// Expected.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSkipFullyTwice() throws IOException, InterruptedException {
|
||||||
|
// Skip TEST_DATA in two parts.
|
||||||
|
FakeDataSource testDataSource = buildDataSource();
|
||||||
|
DefaultExtractorInput input = new DefaultExtractorInput(testDataSource, 0, C.LENGTH_UNBOUNDED);
|
||||||
|
input.skipFully(5);
|
||||||
|
assertEquals(5, input.getPosition());
|
||||||
|
input.skipFully(4);
|
||||||
|
assertEquals(5 + 4, input.getPosition());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSkipFullyTooMuch() throws IOException, InterruptedException {
|
||||||
|
// Skip more than TEST_DATA. Should fail with an EOFException. Position should not update.
|
||||||
|
FakeDataSource testDataSource = buildDataSource();
|
||||||
|
DefaultExtractorInput input = new DefaultExtractorInput(testDataSource, 0, C.LENGTH_UNBOUNDED);
|
||||||
|
try {
|
||||||
|
input.skipFully(TEST_DATA.length + 1);
|
||||||
|
fail();
|
||||||
|
} catch (EOFException e) {
|
||||||
|
// Expected.
|
||||||
|
}
|
||||||
|
assertEquals(0, input.getPosition());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSkipFullyWithFailingDataSource() throws IOException, InterruptedException {
|
||||||
|
FakeDataSource testDataSource = buildFailingDataSource();
|
||||||
|
DefaultExtractorInput input = new DefaultExtractorInput(testDataSource, 0, C.LENGTH_UNBOUNDED);
|
||||||
|
try {
|
||||||
|
input.skipFully(TEST_DATA.length);
|
||||||
|
fail();
|
||||||
|
} catch (IOException e) {
|
||||||
|
// Expected.
|
||||||
|
}
|
||||||
|
// The position should not have advanced.
|
||||||
|
assertEquals(0, input.getPosition());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSkipFullyLarge() throws IOException, InterruptedException {
|
||||||
|
// Tests skipping an amount of data that's larger than any internal scratch space.
|
||||||
|
int largeSkipSize = 1024 * 1024;
|
||||||
|
FakeDataSource.Builder builder = new FakeDataSource.Builder();
|
||||||
|
builder.appendReadData(new byte[largeSkipSize]);
|
||||||
|
FakeDataSource testDataSource = builder.build();
|
||||||
|
testDataSource.open(new DataSpec(Uri.parse(TEST_URI)));
|
||||||
|
|
||||||
|
DefaultExtractorInput input = new DefaultExtractorInput(testDataSource, 0, C.LENGTH_UNBOUNDED);
|
||||||
|
input.skipFully(largeSkipSize);
|
||||||
|
assertEquals(largeSkipSize, input.getPosition());
|
||||||
|
// Check that we fail with EOFException we skip again.
|
||||||
|
try {
|
||||||
|
input.skipFully(1);
|
||||||
|
fail();
|
||||||
|
} catch (EOFException e) {
|
||||||
|
// Expected.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static FakeDataSource buildDataSource() throws IOException {
|
||||||
|
FakeDataSource.Builder builder = new FakeDataSource.Builder();
|
||||||
|
builder.appendReadData(Arrays.copyOfRange(TEST_DATA, 0, 3));
|
||||||
|
builder.appendReadData(Arrays.copyOfRange(TEST_DATA, 3, 6));
|
||||||
|
builder.appendReadData(Arrays.copyOfRange(TEST_DATA, 6, 9));
|
||||||
|
FakeDataSource testDataSource = builder.build();
|
||||||
|
testDataSource.open(new DataSpec(Uri.parse(TEST_URI)));
|
||||||
|
return testDataSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static FakeDataSource buildFailingDataSource() throws IOException {
|
||||||
|
FakeDataSource.Builder builder = new FakeDataSource.Builder();
|
||||||
|
builder.appendReadData(Arrays.copyOfRange(TEST_DATA, 0, 6));
|
||||||
|
builder.appendReadError(new IOException());
|
||||||
|
builder.appendReadData(Arrays.copyOfRange(TEST_DATA, 6, 9));
|
||||||
|
FakeDataSource testDataSource = builder.build();
|
||||||
|
testDataSource.open(new DataSpec(Uri.parse(TEST_URI)));
|
||||||
|
return testDataSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2014 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* 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.android.exoplayer.extractor;
|
||||||
|
|
||||||
|
import com.google.android.exoplayer.C;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unit test for {@link Extractor}.
|
||||||
|
*/
|
||||||
|
public class ExtractorTest extends TestCase {
|
||||||
|
|
||||||
|
public static final void testContants() {
|
||||||
|
// Sanity check that constant values match those defined by {@link C}.
|
||||||
|
assertEquals(C.RESULT_END_OF_INPUT, Extractor.RESULT_END_OF_INPUT);
|
||||||
|
// Sanity check that the other constant values don't overlap.
|
||||||
|
assertTrue(C.RESULT_END_OF_INPUT != Extractor.RESULT_CONTINUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue