DataSpec: Make DataSpecTest more useful

- Replace tests specific to HTTP request headers with tests that
  more generally test constructor correctness.
- Add test specifically around the constructor that infers the
  HTTP method from postBody, since that's a non-trivial bit of
  constructor logic.

Note: In general, I'm not sure this type of test (i.e., testing a
bit of trivial copying through a constructor) is worth the cost
of writing and maintaining them. That said, checking the new
uriPositionOffset is calculated correctly is non-trivial, as is
the HTTP method inference, so keeping them for now.
PiperOrigin-RevId: 294488684
This commit is contained in:
olly 2020-02-11 19:56:36 +00:00 committed by Oliver Woodman
parent 829282fa12
commit 39c65c658e

View file

@ -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<String, String> 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<String, String> 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<String, String> httpRequestProperties = createRequestProperties(5);
DataSpec dataSpec = createDataSpecWithHeaders(httpRequestProperties);
Map<String, String> 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<String, String> httpRequestProperties = createRequestProperties(5);
DataSpec dataSpec = createDataSpecWithHeaders(httpRequestProperties);
Map<String, String> 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<String, String> httpRequestProperties = createRequestProperties(5);
DataSpec dataSpec = createDataSpecWithHeaders(httpRequestProperties);
Map<String, String> 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<String, String> httpRequestProperties = createRequestProperties(5);
DataSpec dataSpec = createDataSpecWithHeaders(httpRequestProperties);
Map<String, String> httpRequestHeaders = createHttpRequestHeaders(5);
DataSpec dataSpec = createDataSpecWithHeaders(httpRequestHeaders);
Map<String, String> newRequestHeaders = createRequestProperties(5, 10);
Map<String, String> 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<String, String> httpRequestProperties = createRequestProperties(5);
DataSpec dataSpec = createDataSpecWithHeaders(httpRequestProperties);
Map<String, String> additionalHeaders = createRequestProperties(5, 10);
Map<String, String> httpRequestHeaders = createHttpRequestHeaders(5);
DataSpec dataSpec = createDataSpecWithHeaders(httpRequestHeaders);
Map<String, String> 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<String, String> expectedHeaders = new HashMap<>(httpRequestProperties);
Map<String, String> 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<String, String> createRequestProperties(int howMany) {
return createRequestProperties(0, howMany);
private static Map<String, String> createHttpRequestHeaders(int howMany) {
return createHttpRequestHeaders(0, howMany);
}
private static Map<String, String> createRequestProperties(int from, int to) {
private static Map<String, String> createHttpRequestHeaders(int from, int to) {
assertThat(from).isLessThan(to);
Map<String, String> httpRequestParameters = new HashMap<>();
@ -169,7 +245,7 @@ public class DataSpecTest {
return httpRequestParameters;
}
private static DataSpec createDataSpecWithHeaders(Map<String, String> httpRequestProperties) {
private static DataSpec createDataSpecWithHeaders(Map<String, String> 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
}
}
}