diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/DataSpecTest.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/DataSpecTest.java index 2323dfe965..851d76e736 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/upstream/DataSpecTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/upstream/DataSpecTest.java @@ -21,6 +21,7 @@ import static junit.framework.TestCase.fail; import android.net.Uri; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.C; import java.util.HashMap; import java.util.Map; import org.junit.Test; @@ -31,108 +32,183 @@ import org.junit.runner.RunWith; public class DataSpecTest { @Test - public void createDataSpec_withDefaultValues_setsEmptyHttpRequestParameters() { + public void createDataSpec_withDefaultValues() { Uri uri = Uri.parse("www.google.com"); + DataSpec dataSpec = new DataSpec(uri); + assertDefaultDataSpec(dataSpec, uri); - assertThat(dataSpec.httpRequestHeaders.isEmpty()).isTrue(); + dataSpec = new DataSpec(uri, /* flags= */ 0); + assertDefaultDataSpec(dataSpec, uri); - dataSpec = new DataSpec(uri, /*flags= */ 0); - assertThat(dataSpec.httpRequestHeaders.isEmpty()).isTrue(); + dataSpec = new DataSpec(uri, /* position= */ 0, C.LENGTH_UNSET, /* key= */ null); + assertDefaultDataSpec(dataSpec, uri); + + dataSpec = + new DataSpec(uri, /* position= */ 0, C.LENGTH_UNSET, /* key= */ null, /* flags= */ 0); + assertDefaultDataSpec(dataSpec, uri); + + dataSpec = + new DataSpec( + uri, + /* position= */ 0, + /* length= */ C.LENGTH_UNSET, + /* key= */ null, + /* flags= */ 0, + new HashMap<>()); + assertDefaultDataSpec(dataSpec, uri); dataSpec = new DataSpec( uri, - /* httpMethod= */ 0, - /* httpBody= */ new byte[] {0, 0, 0, 0}, /* absoluteStreamPosition= */ 0, /* position= */ 0, - /* length= */ 1, - /* key= */ "key", + /* length= */ C.LENGTH_UNSET, + null, /* flags= */ 0); - assertThat(dataSpec.httpRequestHeaders.isEmpty()).isTrue(); + assertDefaultDataSpec(dataSpec, uri); + + dataSpec = + new DataSpec( + uri, + DataSpec.HTTP_METHOD_GET, + /* httpBody= */ null, + /* absoluteStreamPosition= */ 0, + /* position= */ 0, + /* length= */ C.LENGTH_UNSET, + /* key= */ null, + /* flags= */ 0); + assertDefaultDataSpec(dataSpec, uri); + + dataSpec = + new DataSpec( + uri, + DataSpec.HTTP_METHOD_GET, + /* httpBody= */ null, + /* absoluteStreamPosition= */ 0, + /* position= */ 0, + /* length= */ C.LENGTH_UNSET, + /* key= */ null, + /* flags= */ 0, + new HashMap<>()); + assertDefaultDataSpec(dataSpec, uri); } + @SuppressWarnings("deprecation") @Test - public void createDataSpec_setsHttpRequestParameters() { - Map httpRequestParameters = new HashMap<>(); - httpRequestParameters.put("key1", "value1"); - httpRequestParameters.put("key2", "value2"); - httpRequestParameters.put("key3", "value3"); + public void createDataSpec_setsCustomValues() { + Uri uri = Uri.parse("www.google.com"); + + Map httpRequestHeaders = createHttpRequestHeaders(3); + + byte[] httpBody = new byte[] {0, 1, 2, 3}; DataSpec dataSpec = new DataSpec( - Uri.parse("www.google.com"), - /* httpMethod= */ 0, - /* httpBody= */ new byte[] {0, 0, 0, 0}, - /* absoluteStreamPosition= */ 0, - /* position= */ 0, - /* length= */ 1, + uri, + DataSpec.HTTP_METHOD_POST, + httpBody, + /* absoluteStreamPosition= */ 200, + /* position= */ 150, + /* length= */ 5, /* key= */ "key", - /* flags= */ 0, - httpRequestParameters); + /* flags= */ DataSpec.FLAG_ALLOW_GZIP, + httpRequestHeaders); - assertThat(dataSpec.httpRequestHeaders).isEqualTo(httpRequestParameters); + assertThat(dataSpec.uri).isEqualTo(uri); + // uriPositionOffset = absoluteStreamPosition - position + assertThat(dataSpec.uriPositionOffset).isEqualTo(50); + assertThat(dataSpec.httpMethod).isEqualTo(DataSpec.HTTP_METHOD_POST); + assertThat(dataSpec.httpBody).isEqualTo(httpBody); + assertThat(dataSpec.httpRequestHeaders).isEqualTo(httpRequestHeaders); + assertThat(dataSpec.absoluteStreamPosition).isEqualTo(200); + assertThat(dataSpec.position).isEqualTo(150); + assertThat(dataSpec.length).isEqualTo(5); + assertThat(dataSpec.key).isEqualTo("key"); + assertThat(dataSpec.flags).isEqualTo(DataSpec.FLAG_ALLOW_GZIP); + assertHttpRequestHeadersReadOnly(dataSpec); } @Test - public void httpRequestParameters_areReadOnly() { + public void createDataSpec_setsHttpMethodAndPostBody() { + Uri uri = Uri.parse("www.google.com"); + + byte[] postBody = new byte[] {0, 1, 2, 3}; DataSpec dataSpec = new DataSpec( - Uri.parse("www.google.com"), - /* httpMethod= */ 0, - /* httpBody= */ new byte[] {0, 0, 0, 0}, + uri, + postBody, /* absoluteStreamPosition= */ 0, /* position= */ 0, - /* length= */ 1, - /* key= */ "key", - /* flags= */ 0, - /* httpRequestHeaders= */ new HashMap<>()); + /* length= */ C.LENGTH_UNSET, + /* key= */ null, + /* flags= */ 0); + assertThat(dataSpec.httpMethod).isEqualTo(DataSpec.HTTP_METHOD_POST); + assertThat(dataSpec.httpBody).isEqualTo(postBody); - try { - dataSpec.httpRequestHeaders.put("key", "value"); - fail(); - } catch (UnsupportedOperationException expected) { - // Expected - } + postBody = new byte[0]; + dataSpec = + new DataSpec( + uri, + postBody, + /* absoluteStreamPosition= */ 0, + /* position= */ 0, + /* length= */ C.LENGTH_UNSET, + /* key= */ null, + /* flags= */ 0); + assertThat(dataSpec.httpMethod).isEqualTo(DataSpec.HTTP_METHOD_POST); + assertThat(dataSpec.httpBody).isNull(); + + postBody = null; + dataSpec = + new DataSpec( + uri, + postBody, + /* absoluteStreamPosition= */ 0, + /* position= */ 0, + /* length= */ C.LENGTH_UNSET, + /* key= */ null, + /* flags= */ 0); + assertThat(dataSpec.httpMethod).isEqualTo(DataSpec.HTTP_METHOD_GET); + assertThat(dataSpec.httpBody).isNull(); } @Test public void withUri_copiesHttpRequestHeaders() { - Map httpRequestProperties = createRequestProperties(5); - DataSpec dataSpec = createDataSpecWithHeaders(httpRequestProperties); + Map httpRequestHeaders = createHttpRequestHeaders(5); + DataSpec dataSpec = createDataSpecWithHeaders(httpRequestHeaders); DataSpec dataSpecCopy = dataSpec.withUri(Uri.parse("www.new-uri.com")); - assertThat(dataSpecCopy.httpRequestHeaders).isEqualTo(httpRequestProperties); + assertThat(dataSpecCopy.httpRequestHeaders).isEqualTo(httpRequestHeaders); } @Test public void subrange_copiesHttpRequestHeaders() { - Map httpRequestProperties = createRequestProperties(5); - DataSpec dataSpec = createDataSpecWithHeaders(httpRequestProperties); + Map httpRequestHeaders = createHttpRequestHeaders(5); + DataSpec dataSpec = createDataSpecWithHeaders(httpRequestHeaders); DataSpec dataSpecCopy = dataSpec.subrange(2); - assertThat(dataSpecCopy.httpRequestHeaders).isEqualTo(httpRequestProperties); + assertThat(dataSpecCopy.httpRequestHeaders).isEqualTo(httpRequestHeaders); } @Test public void subrange_withOffsetAndLength_copiesHttpRequestHeaders() { - Map httpRequestProperties = createRequestProperties(5); - DataSpec dataSpec = createDataSpecWithHeaders(httpRequestProperties); + Map httpRequestHeaders = createHttpRequestHeaders(5); + DataSpec dataSpec = createDataSpecWithHeaders(httpRequestHeaders); DataSpec dataSpecCopy = dataSpec.subrange(2, 2); - assertThat(dataSpecCopy.httpRequestHeaders).isEqualTo(httpRequestProperties); + assertThat(dataSpecCopy.httpRequestHeaders).isEqualTo(httpRequestHeaders); } @Test public void withRequestHeaders_setsCorrectHeaders() { - Map httpRequestProperties = createRequestProperties(5); - DataSpec dataSpec = createDataSpecWithHeaders(httpRequestProperties); + Map httpRequestHeaders = createHttpRequestHeaders(5); + DataSpec dataSpec = createDataSpecWithHeaders(httpRequestHeaders); - Map newRequestHeaders = createRequestProperties(5, 10); + Map newRequestHeaders = createHttpRequestHeaders(5, 10); DataSpec dataSpecCopy = dataSpec.withRequestHeaders(newRequestHeaders); assertThat(dataSpecCopy.httpRequestHeaders).isEqualTo(newRequestHeaders); @@ -140,13 +216,13 @@ public class DataSpecTest { @Test public void withAdditionalHeaders_setsCorrectHeaders() { - Map httpRequestProperties = createRequestProperties(5); - DataSpec dataSpec = createDataSpecWithHeaders(httpRequestProperties); - Map additionalHeaders = createRequestProperties(5, 10); + Map httpRequestHeaders = createHttpRequestHeaders(5); + DataSpec dataSpec = createDataSpecWithHeaders(httpRequestHeaders); + Map additionalHeaders = createHttpRequestHeaders(5, 10); // additionalHeaders may overwrite a header key - String existingKey = httpRequestProperties.keySet().iterator().next(); + String existingKey = httpRequestHeaders.keySet().iterator().next(); additionalHeaders.put(existingKey, "overwritten"); - Map expectedHeaders = new HashMap<>(httpRequestProperties); + Map expectedHeaders = new HashMap<>(httpRequestHeaders); expectedHeaders.putAll(additionalHeaders); DataSpec dataSpecCopy = dataSpec.withAdditionalHeaders(additionalHeaders); @@ -154,11 +230,11 @@ public class DataSpecTest { assertThat(dataSpecCopy.httpRequestHeaders).isEqualTo(expectedHeaders); } - private static Map createRequestProperties(int howMany) { - return createRequestProperties(0, howMany); + private static Map createHttpRequestHeaders(int howMany) { + return createHttpRequestHeaders(0, howMany); } - private static Map createRequestProperties(int from, int to) { + private static Map createHttpRequestHeaders(int from, int to) { assertThat(from).isLessThan(to); Map httpRequestParameters = new HashMap<>(); @@ -169,7 +245,7 @@ public class DataSpecTest { return httpRequestParameters; } - private static DataSpec createDataSpecWithHeaders(Map httpRequestProperties) { + private static DataSpec createDataSpecWithHeaders(Map httpRequestHeaders) { return new DataSpec( Uri.parse("www.google.com"), /* httpMethod= */ 0, @@ -179,6 +255,30 @@ public class DataSpecTest { /* length= */ 1, /* key= */ "key", /* flags= */ 0, - httpRequestProperties); + httpRequestHeaders); + } + + @SuppressWarnings("deprecation") + private static void assertDefaultDataSpec(DataSpec dataSpec, Uri uri) { + assertThat(dataSpec.uri).isEqualTo(uri); + assertThat(dataSpec.uriPositionOffset).isEqualTo(0); + assertThat(dataSpec.httpMethod).isEqualTo(DataSpec.HTTP_METHOD_GET); + assertThat(dataSpec.httpBody).isNull(); + assertThat(dataSpec.httpRequestHeaders).isEmpty(); + assertThat(dataSpec.absoluteStreamPosition).isEqualTo(0); + assertThat(dataSpec.position).isEqualTo(0); + assertThat(dataSpec.length).isEqualTo(C.LENGTH_UNSET); + assertThat(dataSpec.key).isNull(); + assertThat(dataSpec.flags).isEqualTo(0); + assertHttpRequestHeadersReadOnly(dataSpec); + } + + private static void assertHttpRequestHeadersReadOnly(DataSpec dataSpec) { + try { + dataSpec.httpRequestHeaders.put("key", "value"); + fail(); + } catch (UnsupportedOperationException expected) { + // Expected + } } }