From 691ac39fcbfc4fec4056bb93fb167316d9b6961b Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 22 Feb 2021 18:21:44 +0000 Subject: [PATCH] Read to end-of-stream for HTTP contract tests #minor-release PiperOrigin-RevId: 358847933 --- .../testutil/HttpDataSourceTestEnv.java | 1 - .../testutil/WebServerDispatcher.java | 43 +++++++++++++------ .../testutil/WebServerDispatcherTest.java | 4 +- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/HttpDataSourceTestEnv.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/HttpDataSourceTestEnv.java index fe15120260..9fbbdd3049 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/HttpDataSourceTestEnv.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/HttpDataSourceTestEnv.java @@ -147,7 +147,6 @@ public class HttpDataSourceTestEnv extends ExternalResource { .setName(name) .setUri(Uri.parse(server.url(resource.getPath()).toString())) .setExpectedBytes(resource.getData()) - .setEndOfInputExpected(!resource.resolvesToUnknownLength()) .build(); } } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/WebServerDispatcher.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/WebServerDispatcher.java index 0ba0835f6c..64b7be407b 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/WebServerDispatcher.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/WebServerDispatcher.java @@ -33,6 +33,7 @@ import com.google.common.collect.Maps; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -277,21 +278,19 @@ public class WebServerDispatcher extends Dispatcher { if (!resource.supportsRangeRequests() || rangeHeader == null) { switch (preferredContentCoding) { case "gzip": + setResponseBody( + response, Util.gzip(resourceData), /* chunked= */ resource.resolvesToUnknownLength); response - .setBody(new Buffer().write(Util.gzip(resourceData))) .setHeader("Content-Encoding", "gzip"); break; case "identity": + setResponseBody(response, resourceData, /* chunked= */ resource.resolvesToUnknownLength); response - .setBody(new Buffer().write(resourceData)) .setHeader("Content-Encoding", "identity"); break; default: throw new IllegalStateException("Unexpected content coding: " + preferredContentCoding); } - if (resource.resolvesToUnknownLength()) { - response.setHeader("Content-Length", ""); - } return response; } @@ -328,11 +327,11 @@ public class WebServerDispatcher extends Dispatcher { + "-" + (resourceData.length - 1) + "/" - + (resource.resolvesToUnknownLength() ? "*" : resourceData.length)) - .setBody(new Buffer().write(resourceData, start, resourceData.length - start)); - if (resource.resolvesToUnknownLength()) { - response.setHeader("Content-Length", ""); - } + + (resource.resolvesToUnknownLength() ? "*" : resourceData.length)); + setResponseBody( + response, + Arrays.copyOfRange(resourceData, start, resourceData.length), + /* chunked= */ resource.resolvesToUnknownLength); return response; } @@ -345,7 +344,7 @@ public class WebServerDispatcher extends Dispatcher { } int end = min(range.second + 1, resourceData.length); - return response + response .setResponseCode(206) .setHeader( "Content-Range", @@ -354,8 +353,26 @@ public class WebServerDispatcher extends Dispatcher { + "-" + (end - 1) + "/" - + (resource.resolvesToUnknownLength() ? "*" : resourceData.length)) - .setBody(new Buffer().write(resourceData, range.first, end - range.first)); + + (resource.resolvesToUnknownLength() ? "*" : resourceData.length)); + setResponseBody( + response, Arrays.copyOfRange(resourceData, range.first, end), /* chunked= */ false); + return response; + } + + /** + * Populates a response with the specified body. + * + * @param response The response whose body should be populated. + * @param body The body data. + * @param chunked Whether to use chunked transfer encoding. Note that if set to {@code true}, the + * "Content-Length" header will not be set. + */ + private static void setResponseBody(MockResponse response, byte[] body, boolean chunked) { + if (chunked) { + response.setChunkedBody(new Buffer().write(body), /* maxChunkSize= */ Integer.MAX_VALUE); + } else { + response.setBody(new Buffer().write(body)); + } } /** diff --git a/testutils/src/test/java/com/google/android/exoplayer2/testutil/WebServerDispatcherTest.java b/testutils/src/test/java/com/google/android/exoplayer2/testutil/WebServerDispatcherTest.java index 78418565b6..2def3514f8 100644 --- a/testutils/src/test/java/com/google/android/exoplayer2/testutil/WebServerDispatcherTest.java +++ b/testutils/src/test/java/com/google/android/exoplayer2/testutil/WebServerDispatcherTest.java @@ -257,7 +257,7 @@ public class WebServerDispatcherTest { try (Response response = client.newCall(request).execute()) { assertThat(response.code()).isEqualTo(200); assertThat(response.header("Accept-Ranges")).isEqualTo("bytes"); - assertThat(response.header("Content-Length")).isEmpty(); + assertThat(response.header("Content-Length")).isNull(); assertThat(response.header("Content-Range")).isNull(); assertThat(response.body().contentLength()).isEqualTo(-1); @@ -298,7 +298,7 @@ public class WebServerDispatcherTest { try (Response response = client.newCall(request).execute()) { assertThat(response.code()).isEqualTo(206); assertThat(response.header("Accept-Ranges")).isEqualTo("bytes"); - assertThat(response.header("Content-Length")).isEmpty(); + assertThat(response.header("Content-Length")).isNull(); assertThat(response.header("Content-Range")).isEqualTo("bytes 5-19/*"); assertThat(response.body().contentLength()).isEqualTo(-1);