From 74bbd7727d30fbad1510e346a08ae1ce91bfefdd Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 21 Oct 2024 04:03:19 -0700 Subject: [PATCH] `DataSourceContractTest`: Add tests for resolved vs original URI PiperOrigin-RevId: 688076205 --- RELEASENOTES.md | 4 ++ .../ResolvingDataSourceContractTest.java | 1 + .../test/utils/DataSourceContractTest.java | 48 ++++++++++++++++--- .../test/utils/HttpDataSourceTestEnv.java | 16 +++---- 4 files changed, 54 insertions(+), 15 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 8282dfdc9e..271641431b 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -6,6 +6,10 @@ * ExoPlayer: * Transformer: * DataSource: + * `DataSourceContractTest`: Assert that `DataSource.getUri()` returns the + resolved URI (as documented). Where this is different to the requested + URI, tests can indicate this using the new + `DataSourceContractTest.TestResource.Builder.setResolvedUri()` method. * Audio: * Video: * Text: diff --git a/libraries/datasource/src/test/java/androidx/media3/datasource/ResolvingDataSourceContractTest.java b/libraries/datasource/src/test/java/androidx/media3/datasource/ResolvingDataSourceContractTest.java index 228c792b84..081496c4c6 100644 --- a/libraries/datasource/src/test/java/androidx/media3/datasource/ResolvingDataSourceContractTest.java +++ b/libraries/datasource/src/test/java/androidx/media3/datasource/ResolvingDataSourceContractTest.java @@ -51,6 +51,7 @@ public class ResolvingDataSourceContractTest extends DataSourceContractTest { new TestResource.Builder() .setName("simple") .setUri(URI) + .setResolvedUri(RESOLVED_URI) .setExpectedBytes(simpleData) .build()); } diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/DataSourceContractTest.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/DataSourceContractTest.java index 77eae89a4a..7a5175cbab 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/DataSourceContractTest.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/DataSourceContractTest.java @@ -540,7 +540,7 @@ public abstract class DataSourceContractTest { } @Test - public void getUri_returnsNonNullValueOnlyWhileOpen() throws Exception { + public void getUri_returnsExpectedValueOnlyWhileOpen() throws Exception { forAllTestResourcesAndDataSources( (resource, dataSource) -> { try { @@ -548,7 +548,7 @@ public abstract class DataSourceContractTest { dataSource.open(new DataSpec(resource.getUri())); - assertThat(dataSource.getUri()).isNotNull(); + assertThat(dataSource.getUri()).isEqualTo(resource.getResolvedUri()); } finally { dataSource.close(); } @@ -740,11 +740,13 @@ public abstract class DataSourceContractTest { @Nullable private final String name; private final Uri uri; + private final Uri resolvedUri; private final byte[] expectedBytes; - private TestResource(@Nullable String name, Uri uri, byte[] expectedBytes) { + private TestResource(@Nullable String name, Uri uri, Uri resolvedUri, byte[] expectedBytes) { this.name = name; this.uri = uri; + this.resolvedUri = resolvedUri; this.expectedBytes = expectedBytes; } @@ -754,11 +756,19 @@ public abstract class DataSourceContractTest { return name; } - /** Returns the URI where the resource is available. */ + /** Returns the URI where the resource should be requested from. */ public Uri getUri() { return uri; } + /** + * Returns the URI where the resource is served from. This is equal to {@link #getUri()} unless + * redirection occurred when opening the resource. + */ + public Uri getResolvedUri() { + return resolvedUri; + } + /** Returns the expected contents of this resource. */ public byte[] getExpectedBytes() { return expectedBytes; @@ -768,6 +778,7 @@ public abstract class DataSourceContractTest { public static final class Builder { private @MonotonicNonNull String name; private @MonotonicNonNull Uri uri; + private @MonotonicNonNull Uri resolvedUri; private byte @MonotonicNonNull [] expectedBytes; /** @@ -779,19 +790,38 @@ public abstract class DataSourceContractTest { return this; } - /** Sets the URI where this resource is located. */ + /** Sets the URI where this resource should be requested from. */ @CanIgnoreReturnValue public Builder setUri(String uri) { return setUri(Uri.parse(uri)); } - /** Sets the URI where this resource is located. */ + /** Sets the URI where this resource should be requested from. */ @CanIgnoreReturnValue public Builder setUri(Uri uri) { this.uri = uri; return this; } + /** + * Sets the URI where this resource is served from. This only needs to be explicitly set if + * it's different to {@link #setUri(Uri)}. See {@link #getResolvedUri()}. + */ + @CanIgnoreReturnValue + public Builder setResolvedUri(String uri) { + return setResolvedUri(Uri.parse(uri)); + } + + /** + * Sets the URI where this resource is served from. This only needs to be explicitly set if + * it's different to {@link #setUri(Uri)}. See {@link #getResolvedUri()}. + */ + @CanIgnoreReturnValue + public Builder setResolvedUri(Uri uri) { + this.resolvedUri = uri; + return this; + } + /** * Sets the expected contents of this resource. * @@ -805,7 +835,11 @@ public abstract class DataSourceContractTest { } public TestResource build() { - return new TestResource(name, checkNotNull(uri), checkNotNull(expectedBytes)); + return new TestResource( + name, + checkNotNull(uri), + resolvedUri != null ? resolvedUri : uri, + checkNotNull(expectedBytes)); } } } diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/HttpDataSourceTestEnv.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/HttpDataSourceTestEnv.java index dad7531277..68d5e8b864 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/HttpDataSourceTestEnv.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/HttpDataSourceTestEnv.java @@ -93,8 +93,13 @@ public class HttpDataSourceTestEnv extends ExternalResource { "range not supported, length unknown", RANGE_NOT_SUPPORTED_LENGTH_UNKNOWN), createTestResource("gzip enabled", GZIP_ENABLED), createTestResource("gzip forced", GZIP_FORCED), - createTestResource( - "302 redirect", REDIRECTS_TO_RANGE_SUPPORTED, /* server= */ redirectionServer)); + new DataSourceContractTest.TestResource.Builder() + .setName("302 redirect") + .setUri( + Uri.parse(redirectionServer.url(REDIRECTS_TO_RANGE_SUPPORTED.getPath()).toString())) + .setResolvedUri(originServer.url(RANGE_SUPPORTED.getPath()).toString()) + .setExpectedBytes(REDIRECTS_TO_RANGE_SUPPORTED.getData()) + .build()); } public String getNonexistentUrl() { @@ -142,14 +147,9 @@ public class HttpDataSourceTestEnv extends ExternalResource { private DataSourceContractTest.TestResource createTestResource( String name, WebServerDispatcher.Resource resource) { - return createTestResource(name, resource, originServer); - } - - private static DataSourceContractTest.TestResource createTestResource( - String name, WebServerDispatcher.Resource resource, MockWebServer server) { return new DataSourceContractTest.TestResource.Builder() .setName(name) - .setUri(Uri.parse(server.url(resource.getPath()).toString())) + .setUri(Uri.parse(originServer.url(resource.getPath()).toString())) .setExpectedBytes(resource.getData()) .build(); }