mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
Add DataSource
contract tests to verify offset and position
These tests addresses two identified gaps in the contract: - Ensures that the output buffer offset passed to the `DataSource.read` method is correctly applied. - Verifies that the position within the input stream is properly incremented when reading in two parts. PiperOrigin-RevId: 656358935
This commit is contained in:
parent
ccf704b30b
commit
32c9d62d39
@ -95,6 +95,9 @@
|
|||||||
* Leanback extension:
|
* Leanback extension:
|
||||||
* Cast Extension:
|
* Cast Extension:
|
||||||
* Test Utilities:
|
* Test Utilities:
|
||||||
|
* `DataSourceContractTest` now includes tests to verify:
|
||||||
|
* Input stream `read position` is updated.
|
||||||
|
* Output buffer `offset` is applied correctly.
|
||||||
* Demo app:
|
* Demo app:
|
||||||
* Remove deprecated symbols:
|
* Remove deprecated symbols:
|
||||||
* Remove deprecated `Player.hasPrevious`, `Player.hasPreviousWindow()`.
|
* Remove deprecated `Player.hasPrevious`, `Player.hasPreviousWindow()`.
|
||||||
|
@ -83,6 +83,11 @@ public class UdpDataSourceContractTest extends DataSourceContractTest {
|
|||||||
@Override
|
@Override
|
||||||
public void dataSpecWithLength_readExpectedRange() {}
|
public void dataSpecWithLength_readExpectedRange() {}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Ignore("UdpDataSource doesn't support DataSpec's position or length [internal: b/175856954]")
|
||||||
|
@Override
|
||||||
|
public void dataSpecWithLength_readUntilEndInTwoParts() {}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Ignore("UdpDataSource doesn't support DataSpec's position or length [internal: b/175856954]")
|
@Ignore("UdpDataSource doesn't support DataSpec's position or length [internal: b/175856954]")
|
||||||
@Override
|
@Override
|
||||||
|
@ -151,6 +151,41 @@ public abstract class DataSourceContractTest {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void unboundedDataSpec_readExpectedBytesWithOffset() throws Exception {
|
||||||
|
forAllTestResourcesAndDataSources(
|
||||||
|
(resource, dataSource) -> {
|
||||||
|
try {
|
||||||
|
dataSource.open(new DataSpec.Builder().setUri(resource.getUri()).build());
|
||||||
|
int offset = 2;
|
||||||
|
byte[] data = new byte[resource.getExpectedBytes().length + offset];
|
||||||
|
// Initialize the first two bytes with non-zero values.
|
||||||
|
data[0] = (byte) 0xA5;
|
||||||
|
data[1] = (byte) 0x5A;
|
||||||
|
|
||||||
|
while (offset != data.length) {
|
||||||
|
int bytesRead = dataSource.read(data, offset, resource.getExpectedBytes().length);
|
||||||
|
|
||||||
|
if (bytesRead == C.RESULT_END_OF_INPUT) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
offset += bytesRead;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assert that the first two bytes have not been modified.
|
||||||
|
assertThat(data[0]).isEqualTo((byte) 0xA5);
|
||||||
|
assertThat(data[1]).isEqualTo((byte) 0x5A);
|
||||||
|
|
||||||
|
assertThat(offset).isEqualTo(data.length);
|
||||||
|
byte[] actualData = Arrays.copyOfRange(data, 2, data.length);
|
||||||
|
assertThat(actualData).isEqualTo(resource.getExpectedBytes());
|
||||||
|
} finally {
|
||||||
|
dataSource.close();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void dataSpecWithPosition_readUntilEnd() throws Exception {
|
public void dataSpecWithPosition_readUntilEnd() throws Exception {
|
||||||
forAllTestResourcesAndDataSources(
|
forAllTestResourcesAndDataSources(
|
||||||
@ -196,6 +231,29 @@ public abstract class DataSourceContractTest {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void dataSpecWithLength_readUntilEndInTwoParts() throws Exception {
|
||||||
|
forAllTestResourcesAndDataSources(
|
||||||
|
(resource, dataSource) -> {
|
||||||
|
try {
|
||||||
|
int length = resource.getExpectedBytes().length;
|
||||||
|
dataSource.open(
|
||||||
|
new DataSpec.Builder().setUri(resource.getUri()).setLength(length).build());
|
||||||
|
|
||||||
|
byte[] firstPartData = DataSourceUtil.readExactly(dataSource, length / 2);
|
||||||
|
byte[] secondPartData = DataSourceUtil.readToEnd(dataSource);
|
||||||
|
|
||||||
|
byte[] expectedFirstPartData = Arrays.copyOf(resource.getExpectedBytes(), length / 2);
|
||||||
|
byte[] expectedSecondPartData =
|
||||||
|
Arrays.copyOfRange(resource.getExpectedBytes(), length / 2, length);
|
||||||
|
assertThat(firstPartData).isEqualTo(expectedFirstPartData);
|
||||||
|
assertThat(secondPartData).isEqualTo(expectedSecondPartData);
|
||||||
|
} finally {
|
||||||
|
dataSource.close();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void dataSpecWithPositionAndLength_readExpectedRange() throws Exception {
|
public void dataSpecWithPositionAndLength_readExpectedRange() throws Exception {
|
||||||
forAllTestResourcesAndDataSources(
|
forAllTestResourcesAndDataSources(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user