Index: components/cronet/android/test/javatests/src/org/chromium/cronet_test_apk/urlconnection/CronetHttpURLConnectionTest.java |
diff --git a/components/cronet/android/test/javatests/src/org/chromium/cronet_test_apk/urlconnection/CronetHttpURLConnectionTest.java b/components/cronet/android/test/javatests/src/org/chromium/cronet_test_apk/urlconnection/CronetHttpURLConnectionTest.java |
deleted file mode 100644 |
index 5e436b236eb8ab3c8f30e2717779a2ca033aee9d..0000000000000000000000000000000000000000 |
--- a/components/cronet/android/test/javatests/src/org/chromium/cronet_test_apk/urlconnection/CronetHttpURLConnectionTest.java |
+++ /dev/null |
@@ -1,860 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-package org.chromium.cronet_test_apk.urlconnection; |
- |
-import android.os.Build; |
-import android.test.suitebuilder.annotation.SmallTest; |
- |
-import org.chromium.base.test.util.Feature; |
-import org.chromium.cronet_test_apk.CronetTestActivity; |
-import org.chromium.cronet_test_apk.CronetTestBase; |
-import org.chromium.cronet_test_apk.NativeTestServer; |
-import org.chromium.net.UrlRequestContextConfig; |
-import org.chromium.net.UrlRequestException; |
- |
-import java.io.ByteArrayOutputStream; |
-import java.io.FileNotFoundException; |
-import java.io.IOException; |
-import java.io.InputStream; |
-import java.net.HttpURLConnection; |
-import java.net.MalformedURLException; |
-import java.net.URL; |
-import java.util.ArrayList; |
-import java.util.Arrays; |
-import java.util.List; |
-import java.util.Map; |
-import java.util.regex.Matcher; |
-import java.util.regex.Pattern; |
- |
-/** |
- * Basic tests of Cronet's HttpURLConnection implementation. |
- * Tests annotated with {@code CompareDefaultWithCronet} will run once with the |
- * default HttpURLConnection implementation and then with Cronet's |
- * HttpURLConnection implementation. Tests annotated with |
- * {@code OnlyRunCronetHttpURLConnection} only run Cronet's implementation. |
- * See {@link CronetTestBase#runTest()} for details. |
- */ |
-public class CronetHttpURLConnectionTest extends CronetTestBase { |
- private CronetTestActivity mActivity; |
- |
- @Override |
- protected void setUp() throws Exception { |
- super.setUp(); |
- UrlRequestContextConfig config = new UrlRequestContextConfig(); |
- config.setStoragePath(prepareTestStorage()); |
- config.enableHttpCache(UrlRequestContextConfig.HttpCache.DISK, |
- 1000 * 1024); |
- String[] commandLineArgs = { |
- CronetTestActivity.CONFIG_KEY, config.toString()}; |
- mActivity = launchCronetTestAppWithUrlAndCommandLineArgs(null, |
- commandLineArgs); |
- assertTrue(NativeTestServer.startNativeTestServer( |
- getInstrumentation().getTargetContext())); |
- } |
- |
- @Override |
- protected void tearDown() throws Exception { |
- NativeTestServer.shutdownNativeTestServer(); |
- super.tearDown(); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @CompareDefaultWithCronet |
- public void testBasicGet() throws Exception { |
- URL url = new URL(NativeTestServer.getEchoMethodURL()); |
- HttpURLConnection urlConnection = |
- (HttpURLConnection) url.openConnection(); |
- assertEquals(200, urlConnection.getResponseCode()); |
- assertEquals("OK", urlConnection.getResponseMessage()); |
- assertEquals("GET", getResponseAsString(urlConnection)); |
- urlConnection.disconnect(); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @CompareDefaultWithCronet |
- public void testNotFoundURLRequest() throws Exception { |
- URL url = new URL(NativeTestServer.getFileURL("/notfound.html")); |
- HttpURLConnection urlConnection = |
- (HttpURLConnection) url.openConnection(); |
- assertEquals(404, urlConnection.getResponseCode()); |
- assertEquals("Not Found", urlConnection.getResponseMessage()); |
- try { |
- urlConnection.getInputStream(); |
- fail(); |
- } catch (FileNotFoundException e) { |
- // Expected. |
- } |
- InputStream errorStream = urlConnection.getErrorStream(); |
- ByteArrayOutputStream out = new ByteArrayOutputStream(); |
- int byteRead; |
- while ((byteRead = errorStream.read()) != -1) { |
- out.write(byteRead); |
- } |
- assertEquals("<!DOCTYPE html>\n<html>\n<head>\n" |
- + "<title>Not found</title>\n<p>Test page loaded.</p>\n" |
- + "</head>\n</html>\n", |
- out.toString()); |
- urlConnection.disconnect(); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @CompareDefaultWithCronet |
- public void testServerNotAvailable() throws Exception { |
- URL url = new URL(NativeTestServer.getFileURL("/success.txt")); |
- HttpURLConnection urlConnection = |
- (HttpURLConnection) url.openConnection(); |
- assertEquals("this is a text file\n", |
- getResponseAsString(urlConnection)); |
- // After shutting down the server, the server should not be handling |
- // new requests. |
- NativeTestServer.shutdownNativeTestServer(); |
- HttpURLConnection secondConnection = |
- (HttpURLConnection) url.openConnection(); |
- try { |
- secondConnection.connect(); |
- fail(); |
- } catch (IOException e) { |
- assertTrue(e instanceof java.net.ConnectException |
- || e instanceof UrlRequestException); |
- assertTrue((e.getMessage().contains("ECONNREFUSED") |
- || e.getMessage().contains("net::ERR_CONNECTION_REFUSED"))); |
- } |
- checkExceptionsAreThrown(secondConnection); |
- // Starts the server to avoid crashing on shutdown in tearDown(). |
- assertTrue(NativeTestServer.startNativeTestServer( |
- getInstrumentation().getTargetContext())); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @CompareDefaultWithCronet |
- public void testBadIP() throws Exception { |
- URL url = new URL("http://0.0.0.0/"); |
- HttpURLConnection urlConnection = |
- (HttpURLConnection) url.openConnection(); |
- try { |
- urlConnection.connect(); |
- fail(); |
- } catch (IOException e) { |
- assertTrue(e instanceof java.net.ConnectException |
- || e instanceof UrlRequestException); |
- assertTrue((e.getMessage().contains("ECONNREFUSED") |
- || e.getMessage().contains("net::ERR_CONNECTION_REFUSED"))); |
- } |
- checkExceptionsAreThrown(urlConnection); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @CompareDefaultWithCronet |
- public void testBadHostname() throws Exception { |
- URL url = new URL("http://this-weird-host-name-does-not-exist/"); |
- HttpURLConnection urlConnection = |
- (HttpURLConnection) url.openConnection(); |
- try { |
- urlConnection.connect(); |
- fail(); |
- } catch (java.net.UnknownHostException e) { |
- // Expected. |
- } catch (UrlRequestException e) { |
- // Expected. |
- } |
- checkExceptionsAreThrown(urlConnection); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @CompareDefaultWithCronet |
- public void testBadScheme() throws Exception { |
- try { |
- URL url = new URL("flying://goat"); |
- fail(); |
- } catch (MalformedURLException e) { |
- // Expected. |
- } |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @CompareDefaultWithCronet |
- public void testDisconnectBeforeConnectionIsMade() throws Exception { |
- URL url = new URL(NativeTestServer.getEchoMethodURL()); |
- HttpURLConnection urlConnection = |
- (HttpURLConnection) url.openConnection(); |
- // Close connection before connection is made has no effect. |
- // Default implementation passes this test. |
- urlConnection.disconnect(); |
- assertEquals(200, urlConnection.getResponseCode()); |
- assertEquals("OK", urlConnection.getResponseMessage()); |
- assertEquals("GET", getResponseAsString(urlConnection)); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- // TODO(xunjieli): Currently the wrapper does not throw an exception. |
- // Need to change the behavior. |
- // @CompareDefaultWithCronet |
- public void testDisconnectAfterConnectionIsMade() throws Exception { |
- URL url = new URL(NativeTestServer.getEchoMethodURL()); |
- HttpURLConnection urlConnection = |
- (HttpURLConnection) url.openConnection(); |
- // Close connection before connection is made has no effect. |
- urlConnection.connect(); |
- urlConnection.disconnect(); |
- try { |
- urlConnection.getResponseCode(); |
- fail(); |
- } catch (Exception e) { |
- // Ignored. |
- } |
- try { |
- InputStream in = urlConnection.getInputStream(); |
- fail(); |
- } catch (Exception e) { |
- // Ignored. |
- } |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @CompareDefaultWithCronet |
- public void testAddRequestProperty() throws Exception { |
- URL url = new URL(NativeTestServer.getEchoAllHeadersURL()); |
- HttpURLConnection connection = (HttpURLConnection) url.openConnection(); |
- connection.addRequestProperty("foo-header", "foo"); |
- connection.addRequestProperty("bar-header", "bar"); |
- |
- // Before connection is made, check request headers are set. |
- Map<String, List<String>> requestHeadersMap = |
- connection.getRequestProperties(); |
- List<String> fooValues = requestHeadersMap.get("foo-header"); |
- assertEquals(1, fooValues.size()); |
- assertEquals("foo", fooValues.get(0)); |
- assertEquals("foo", connection.getRequestProperty("foo-header")); |
- List<String> barValues = requestHeadersMap.get("bar-header"); |
- assertEquals(1, barValues.size()); |
- assertEquals("bar", barValues.get(0)); |
- assertEquals("bar", connection.getRequestProperty("bar-header")); |
- |
- // Check the request headers echoed back by the server. |
- assertEquals(200, connection.getResponseCode()); |
- assertEquals("OK", connection.getResponseMessage()); |
- String headers = getResponseAsString(connection); |
- List<String> fooHeaderValues = |
- getRequestHeaderValues(headers, "foo-header"); |
- List<String> barHeaderValues = |
- getRequestHeaderValues(headers, "bar-header"); |
- assertEquals(1, fooHeaderValues.size()); |
- assertEquals("foo", fooHeaderValues.get(0)); |
- assertEquals(1, fooHeaderValues.size()); |
- assertEquals("bar", barHeaderValues.get(0)); |
- |
- connection.disconnect(); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @OnlyRunCronetHttpURLConnection |
- public void testAddRequestPropertyWithSameKey() throws Exception { |
- URL url = new URL(NativeTestServer.getEchoAllHeadersURL()); |
- HttpURLConnection urlConnection = |
- (HttpURLConnection) url.openConnection(); |
- urlConnection.addRequestProperty("header-name", "value1"); |
- try { |
- urlConnection.addRequestProperty("header-Name", "value2"); |
- fail(); |
- } catch (UnsupportedOperationException e) { |
- assertEquals(e.getMessage(), |
- "Cannot add multiple headers of the same key. " |
- + "crbug.com/432719."); |
- } |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @CompareDefaultWithCronet |
- public void testSetRequestPropertyWithSameKey() throws Exception { |
- URL url = new URL(NativeTestServer.getEchoAllHeadersURL()); |
- HttpURLConnection conn = (HttpURLConnection) url.openConnection(); |
- // The test always sets and retrieves one header with the same |
- // capitalization, and the other header with slightly different |
- // capitalization. |
- conn.setRequestProperty("same-capitalization", "yo"); |
- conn.setRequestProperty("diFFerent-cApitalization", "foo"); |
- Map<String, List<String>> headersMap = conn.getRequestProperties(); |
- List<String> values1 = headersMap.get("same-capitalization"); |
- assertEquals(1, values1.size()); |
- assertEquals("yo", values1.get(0)); |
- assertEquals("yo", conn.getRequestProperty("same-capitalization")); |
- |
- List<String> values2 = headersMap.get("different-capitalization"); |
- assertEquals(1, values2.size()); |
- assertEquals("foo", values2.get(0)); |
- assertEquals("foo", |
- conn.getRequestProperty("Different-capitalization")); |
- |
- // Check request header is updated. |
- conn.setRequestProperty("same-capitalization", "hi"); |
- conn.setRequestProperty("different-Capitalization", "bar"); |
- Map<String, List<String>> newHeadersMap = conn.getRequestProperties(); |
- List<String> newValues1 = newHeadersMap.get("same-capitalization"); |
- assertEquals(1, newValues1.size()); |
- assertEquals("hi", newValues1.get(0)); |
- assertEquals("hi", conn.getRequestProperty("same-capitalization")); |
- |
- List<String> newValues2 = newHeadersMap.get("differENT-capitalization"); |
- assertEquals(1, newValues2.size()); |
- assertEquals("bar", newValues2.get(0)); |
- assertEquals("bar", |
- conn.getRequestProperty("different-capitalization")); |
- |
- // Check the request headers echoed back by the server. |
- assertEquals(200, conn.getResponseCode()); |
- assertEquals("OK", conn.getResponseMessage()); |
- String headers = getResponseAsString(conn); |
- List<String> actualValues1 = |
- getRequestHeaderValues(headers, "same-capitalization"); |
- assertEquals(1, actualValues1.size()); |
- assertEquals("hi", actualValues1.get(0)); |
- List<String> actualValues2 = |
- getRequestHeaderValues(headers, "different-Capitalization"); |
- assertEquals(1, actualValues2.size()); |
- assertEquals("bar", actualValues2.get(0)); |
- conn.disconnect(); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @CompareDefaultWithCronet |
- public void testAddAndSetRequestPropertyWithSameKey() throws Exception { |
- URL url = new URL(NativeTestServer.getEchoAllHeadersURL()); |
- HttpURLConnection connection = (HttpURLConnection) url.openConnection(); |
- connection.addRequestProperty("header-name", "value1"); |
- connection.setRequestProperty("Header-nAme", "value2"); |
- |
- // Before connection is made, check request headers are set. |
- assertEquals("value2", connection.getRequestProperty("header-namE")); |
- Map<String, List<String>> requestHeadersMap = |
- connection.getRequestProperties(); |
- assertEquals(1, requestHeadersMap.get("HeAder-name").size()); |
- assertEquals("value2", requestHeadersMap.get("HeAder-name").get(0)); |
- |
- // Check the request headers echoed back by the server. |
- assertEquals(200, connection.getResponseCode()); |
- assertEquals("OK", connection.getResponseMessage()); |
- String headers = getResponseAsString(connection); |
- List<String> actualValues = |
- getRequestHeaderValues(headers, "Header-nAme"); |
- assertEquals(1, actualValues.size()); |
- assertEquals("value2", actualValues.get(0)); |
- connection.disconnect(); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @CompareDefaultWithCronet |
- public void testAddSetRequestPropertyAfterConnected() throws Exception { |
- URL url = new URL(NativeTestServer.getEchoAllHeadersURL()); |
- HttpURLConnection connection = (HttpURLConnection) url.openConnection(); |
- connection.addRequestProperty("header-name", "value"); |
- assertEquals(200, connection.getResponseCode()); |
- assertEquals("OK", connection.getResponseMessage()); |
- try { |
- connection.setRequestProperty("foo", "bar"); |
- fail(); |
- } catch (IllegalStateException e) { |
- // Expected. |
- } |
- try { |
- connection.addRequestProperty("foo", "bar"); |
- fail(); |
- } catch (IllegalStateException e) { |
- // Expected. |
- } |
- connection.disconnect(); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @CompareDefaultWithCronet |
- public void testGetRequestPropertyAfterConnected() throws Exception { |
- URL url = new URL(NativeTestServer.getEchoAllHeadersURL()); |
- HttpURLConnection connection = (HttpURLConnection) url.openConnection(); |
- connection.addRequestProperty("header-name", "value"); |
- assertEquals(200, connection.getResponseCode()); |
- assertEquals("OK", connection.getResponseMessage()); |
- |
- try { |
- connection.getRequestProperties(); |
- fail(); |
- } catch (IllegalStateException e) { |
- // Expected. |
- } |
- |
- // Default implementation allows querying a particular request property. |
- try { |
- assertEquals("value", connection.getRequestProperty("header-name")); |
- } catch (IllegalStateException e) { |
- fail(); |
- } |
- connection.disconnect(); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @CompareDefaultWithCronet |
- public void testGetRequestPropertiesUnmodifiable() throws Exception { |
- URL url = new URL(NativeTestServer.getEchoAllHeadersURL()); |
- HttpURLConnection connection = (HttpURLConnection) url.openConnection(); |
- connection.addRequestProperty("header-name", "value"); |
- Map<String, List<String>> headers = connection.getRequestProperties(); |
- try { |
- headers.put("foo", Arrays.asList("v1", "v2")); |
- fail(); |
- } catch (UnsupportedOperationException e) { |
- // Expected. |
- } |
- |
- List<String> values = headers.get("header-name"); |
- try { |
- values.add("v3"); |
- fail(); |
- } catch (UnsupportedOperationException e) { |
- // Expected. |
- } |
- |
- connection.disconnect(); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @CompareDefaultWithCronet |
- public void testInputStreamReadOneByte() throws Exception { |
- String testInputString = "this is a really long header"; |
- URL url = new URL(NativeTestServer.getEchoHeaderURL("foo")); |
- HttpURLConnection urlConnection = |
- (HttpURLConnection) url.openConnection(); |
- urlConnection.addRequestProperty("foo", testInputString); |
- assertEquals(200, urlConnection.getResponseCode()); |
- assertEquals("OK", urlConnection.getResponseMessage()); |
- InputStream in = urlConnection.getInputStream(); |
- ByteArrayOutputStream out = new ByteArrayOutputStream(); |
- int b; |
- while ((b = in.read()) != -1) { |
- out.write(b); |
- } |
- urlConnection.disconnect(); |
- assertTrue(Arrays.equals( |
- testInputString.getBytes(), out.toByteArray())); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @CompareDefaultWithCronet |
- public void testInputStreamReadMoreBytesThanAvailable() throws Exception { |
- String testInputString = "this is a really long header"; |
- byte[] testInputBytes = testInputString.getBytes(); |
- URL url = new URL(NativeTestServer.getEchoHeaderURL("foo")); |
- HttpURLConnection urlConnection = |
- (HttpURLConnection) url.openConnection(); |
- urlConnection.addRequestProperty("foo", testInputString); |
- assertEquals(200, urlConnection.getResponseCode()); |
- assertEquals("OK", urlConnection.getResponseMessage()); |
- InputStream in = urlConnection.getInputStream(); |
- byte[] actualOutput = new byte[testInputBytes.length + 256]; |
- int bytesRead = in.read(actualOutput, 0, actualOutput.length); |
- byte[] readSomeMore = new byte[10]; |
- int bytesReadBeyondAvailable = in.read(readSomeMore, 0, 10); |
- urlConnection.disconnect(); |
- assertEquals(testInputBytes.length, bytesRead); |
- assertEquals(-1, bytesReadBeyondAvailable); |
- for (int i = 0; i < bytesRead; i++) { |
- assertEquals(testInputBytes[i], actualOutput[i]); |
- } |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @CompareDefaultWithCronet |
- public void testInputStreamReadExactBytesAvailable() throws Exception { |
- String testInputString = "this is a really long header"; |
- byte[] testInputBytes = testInputString.getBytes(); |
- URL url = new URL(NativeTestServer.getEchoHeaderURL("foo")); |
- HttpURLConnection urlConnection = |
- (HttpURLConnection) url.openConnection(); |
- urlConnection.addRequestProperty("foo", testInputString); |
- assertEquals(200, urlConnection.getResponseCode()); |
- assertEquals("OK", urlConnection.getResponseMessage()); |
- InputStream in = urlConnection.getInputStream(); |
- byte[] actualOutput = new byte[testInputBytes.length]; |
- int bytesRead = in.read(actualOutput, 0, actualOutput.length); |
- urlConnection.disconnect(); |
- assertEquals(testInputBytes.length, bytesRead); |
- assertTrue(Arrays.equals(testInputBytes, actualOutput)); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @CompareDefaultWithCronet |
- public void testInputStreamReadLessBytesThanAvailable() throws Exception { |
- String testInputString = "this is a really long header"; |
- byte[] testInputBytes = testInputString.getBytes(); |
- URL url = new URL(NativeTestServer.getEchoHeaderURL("foo")); |
- HttpURLConnection urlConnection = |
- (HttpURLConnection) url.openConnection(); |
- urlConnection.addRequestProperty("foo", testInputString); |
- assertEquals(200, urlConnection.getResponseCode()); |
- assertEquals("OK", urlConnection.getResponseMessage()); |
- InputStream in = urlConnection.getInputStream(); |
- byte[] firstPart = new byte[testInputBytes.length - 10]; |
- int firstBytesRead = in.read(firstPart, 0, testInputBytes.length - 10); |
- byte[] secondPart = new byte[10]; |
- int secondBytesRead = in.read(secondPart, 0, 10); |
- assertEquals(testInputBytes.length - 10, firstBytesRead); |
- assertEquals(10, secondBytesRead); |
- for (int i = 0; i < firstPart.length; i++) { |
- assertEquals(testInputBytes[i], firstPart[i]); |
- } |
- for (int i = 0; i < secondPart.length; i++) { |
- assertEquals(testInputBytes[firstPart.length + i], secondPart[i]); |
- } |
- urlConnection.disconnect(); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @CompareDefaultWithCronet |
- public void testFollowRedirects() throws Exception { |
- URL url = new URL(NativeTestServer.getFileURL("/redirect.html")); |
- HttpURLConnection connection = |
- (HttpURLConnection) url.openConnection(); |
- connection.setInstanceFollowRedirects(true); |
- assertEquals(200, connection.getResponseCode()); |
- assertEquals("OK", connection.getResponseMessage()); |
- assertEquals(NativeTestServer.getFileURL("/success.txt"), |
- connection.getURL().toString()); |
- assertEquals("this is a text file\n", getResponseAsString(connection)); |
- connection.disconnect(); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @CompareDefaultWithCronet |
- public void testDisableRedirects() throws Exception { |
- URL url = new URL(NativeTestServer.getFileURL("/redirect.html")); |
- HttpURLConnection connection = |
- (HttpURLConnection) url.openConnection(); |
- connection.setInstanceFollowRedirects(false); |
- assertEquals(302, connection.getResponseCode()); |
- assertEquals("Found", connection.getResponseMessage()); |
- assertEquals("/success.txt", connection.getHeaderField("Location")); |
- assertEquals(NativeTestServer.getFileURL("/redirect.html"), |
- connection.getURL().toString()); |
- connection.disconnect(); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @CompareDefaultWithCronet |
- public void testDisableRedirectsGlobal() throws Exception { |
- HttpURLConnection.setFollowRedirects(false); |
- URL url = new URL(NativeTestServer.getFileURL("/redirect.html")); |
- HttpURLConnection connection = |
- (HttpURLConnection) url.openConnection(); |
- assertEquals(302, connection.getResponseCode()); |
- assertEquals("Found", connection.getResponseMessage()); |
- assertEquals("/success.txt", connection.getHeaderField("Location")); |
- assertEquals(NativeTestServer.getFileURL("/redirect.html"), |
- connection.getURL().toString()); |
- connection.disconnect(); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @CompareDefaultWithCronet |
- public void testDisableRedirectsGlobalAfterConnectionIsCreated() |
- throws Exception { |
- HttpURLConnection.setFollowRedirects(true); |
- URL url = new URL(NativeTestServer.getFileURL("/redirect.html")); |
- HttpURLConnection connection = |
- (HttpURLConnection) url.openConnection(); |
- // Disabling redirects globally after creating the HttpURLConnection |
- // object should have no effect on the request. |
- HttpURLConnection.setFollowRedirects(false); |
- assertEquals(200, connection.getResponseCode()); |
- assertEquals("OK", connection.getResponseMessage()); |
- assertEquals(NativeTestServer.getFileURL("/success.txt"), |
- connection.getURL().toString()); |
- assertEquals("this is a text file\n", getResponseAsString(connection)); |
- connection.disconnect(); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @OnlyRunCronetHttpURLConnection |
- // Cronet does not support reading response body of a 302 response. |
- public void testDisableRedirectsTryReadBody() throws Exception { |
- URL url = new URL(NativeTestServer.getFileURL("/redirect.html")); |
- HttpURLConnection connection = |
- (HttpURLConnection) url.openConnection(); |
- connection.setInstanceFollowRedirects(false); |
- try { |
- connection.getInputStream(); |
- fail(); |
- } catch (IOException e) { |
- // Expected. |
- } |
- assertNull(connection.getErrorStream()); |
- connection.disconnect(); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @CompareDefaultWithCronet |
- public void testGetResponseHeadersAsMap() throws Exception { |
- URL url = new URL(NativeTestServer.getFileURL("/success.txt")); |
- HttpURLConnection connection = |
- (HttpURLConnection) url.openConnection(); |
- Map<String, List<String>> responseHeaders = |
- connection.getHeaderFields(); |
- // Make sure response header map is not modifiable. |
- try { |
- responseHeaders.put("foo", Arrays.asList("v1", "v2")); |
- fail(); |
- } catch (UnsupportedOperationException e) { |
- // Expected. |
- } |
- List<String> contentType = responseHeaders.get("Content-type"); |
- // Make sure map value is not modifiable as well. |
- try { |
- contentType.add("v3"); |
- fail(); |
- } catch (UnsupportedOperationException e) { |
- // Expected. |
- } |
- // Make sure map look up is key insensitive. |
- List<String> contentTypeWithOddCase = |
- responseHeaders.get("ContENt-tYpe"); |
- assertEquals(contentType, contentTypeWithOddCase); |
- |
- assertEquals(1, contentType.size()); |
- assertEquals("text/plain", contentType.get(0)); |
- List<String> accessControl = |
- responseHeaders.get("Access-Control-Allow-Origin"); |
- assertEquals(1, accessControl.size()); |
- assertEquals("*", accessControl.get(0)); |
- List<String> singleHeader = responseHeaders.get("header-name"); |
- assertEquals(1, singleHeader.size()); |
- assertEquals("header-value", singleHeader.get(0)); |
- List<String> multiHeader = responseHeaders.get("multi-header-name"); |
- assertEquals(2, multiHeader.size()); |
- assertEquals("header-value1", multiHeader.get(0)); |
- assertEquals("header-value2", multiHeader.get(1)); |
- connection.disconnect(); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @CompareDefaultWithCronet |
- public void testGetResponseHeaderField() throws Exception { |
- URL url = new URL(NativeTestServer.getFileURL("/success.txt")); |
- HttpURLConnection connection = |
- (HttpURLConnection) url.openConnection(); |
- assertEquals("text/plain", connection.getHeaderField("Content-Type")); |
- assertEquals("*", |
- connection.getHeaderField("Access-Control-Allow-Origin")); |
- assertEquals("header-value", connection.getHeaderField("header-name")); |
- // If there are multiple headers with the same name, the last should be |
- // returned. |
- assertEquals("header-value2", |
- connection.getHeaderField("multi-header-name")); |
- // Lastly, make sure lookup is case-insensitive. |
- assertEquals("header-value2", |
- connection.getHeaderField("MUlTi-heAder-name")); |
- connection.disconnect(); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @CompareDefaultWithCronet |
- public void testGetResponseHeaderFieldWithPos() throws Exception { |
- URL url = new URL(NativeTestServer.getFileURL("/success.txt")); |
- HttpURLConnection connection = |
- (HttpURLConnection) url.openConnection(); |
- assertEquals("Content-Type", connection.getHeaderFieldKey(0)); |
- assertEquals("text/plain", connection.getHeaderField(0)); |
- assertEquals("Access-Control-Allow-Origin", |
- connection.getHeaderFieldKey(1)); |
- assertEquals("*", connection.getHeaderField(1)); |
- assertEquals("header-name", connection.getHeaderFieldKey(2)); |
- assertEquals("header-value", connection.getHeaderField(2)); |
- assertEquals("multi-header-name", connection.getHeaderFieldKey(3)); |
- assertEquals("header-value1", connection.getHeaderField(3)); |
- assertEquals("multi-header-name", connection.getHeaderFieldKey(4)); |
- assertEquals("header-value2", connection.getHeaderField(4)); |
- // Note that the default implementation also adds additional response |
- // headers, which are not tested here. |
- connection.disconnect(); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @OnlyRunCronetHttpURLConnection |
- // The default implementation adds additional response headers, so this test |
- // only tests Cronet's implementation. |
- public void testGetResponseHeaderFieldWithPosExceed() throws Exception { |
- URL url = new URL(NativeTestServer.getFileURL("/success.txt")); |
- HttpURLConnection connection = |
- (HttpURLConnection) url.openConnection(); |
- // Expect null if we exceed the number of header entries. |
- assertEquals(null, connection.getHeaderFieldKey(5)); |
- assertEquals(null, connection.getHeaderField(5)); |
- assertEquals(null, connection.getHeaderFieldKey(6)); |
- assertEquals(null, connection.getHeaderField(6)); |
- connection.disconnect(); |
- } |
- |
- private static enum CacheSetting { USE_CACHE, DONT_USE_CACHE }; |
- |
- private static enum ExpectedOutcome { SUCCESS, FAILURE }; |
- |
- /** |
- * Helper method to make a request with cache enabled or disabled, and check |
- * whether the request is successful. |
- * @param requestUrl request url. |
- * @param cacheSetting indicates cache should be used. |
- * @param outcome indicates request is expected to be successful. |
- */ |
- private void checkRequestCaching(String requestUrl, |
- CacheSetting cacheSetting, |
- ExpectedOutcome outcome) throws Exception { |
- URL url = new URL(requestUrl); |
- HttpURLConnection connection = |
- (HttpURLConnection) url.openConnection(); |
- connection.setUseCaches(cacheSetting == CacheSetting.USE_CACHE); |
- if (outcome == ExpectedOutcome.SUCCESS) { |
- assertEquals(200, connection.getResponseCode()); |
- assertEquals("this is a cacheable file\n", |
- getResponseAsString(connection)); |
- } else { |
- try { |
- connection.getResponseCode(); |
- fail(); |
- } catch (IOException e) { |
- // Expected. |
- } |
- } |
- connection.disconnect(); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @OnlyRunCronetHttpURLConnection |
- // Strangely, the default implementation fails to return a cached response. |
- // If the server is shut down, the request just fails with a connection |
- // refused error. Therefore, this test and the next only runs Cronet. |
- public void testSetUseCaches() throws Exception { |
- String url = NativeTestServer.getFileURL("/cacheable.txt"); |
- checkRequestCaching(url, |
- CacheSetting.USE_CACHE, ExpectedOutcome.SUCCESS); |
- // Shut down the server, we should be able to receive a cached response. |
- NativeTestServer.shutdownNativeTestServer(); |
- checkRequestCaching(url, |
- CacheSetting.USE_CACHE, ExpectedOutcome.SUCCESS); |
- } |
- |
- @SmallTest |
- @Feature({"Cronet"}) |
- @OnlyRunCronetHttpURLConnection |
- public void testSetUseCachesFalse() throws Exception { |
- String url = NativeTestServer.getFileURL("/cacheable.txt"); |
- checkRequestCaching(url, |
- CacheSetting.USE_CACHE, ExpectedOutcome.SUCCESS); |
- NativeTestServer.shutdownNativeTestServer(); |
- // Disables caching. No cached response is received. |
- checkRequestCaching(url, |
- CacheSetting.DONT_USE_CACHE, ExpectedOutcome.FAILURE); |
- } |
- |
- private void checkExceptionsAreThrown(HttpURLConnection connection) |
- throws Exception { |
- try { |
- connection.connect(); |
- fail(); |
- } catch (IOException e) { |
- // Expected. |
- } |
- |
- try { |
- connection.getInputStream(); |
- fail(); |
- } catch (IOException e) { |
- // Expected. |
- } |
- |
- try { |
- connection.getResponseCode(); |
- fail(); |
- } catch (IOException e) { |
- // Expected. |
- } |
- |
- try { |
- connection.getResponseMessage(); |
- fail(); |
- } catch (IOException e) { |
- // Expected. |
- } |
- |
- // Default implementation of getHeaderFields() returns null on K, but |
- // returns an empty map on L. |
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { |
- Map<String, List<String>> headers = connection.getHeaderFields(); |
- assertNotNull(headers); |
- assertTrue(headers.isEmpty()); |
- } |
- // Skip getHeaderFields(), since it can return null or an empty map. |
- assertNull(connection.getHeaderField("foo")); |
- assertNull(connection.getHeaderFieldKey(0)); |
- assertNull(connection.getHeaderField(0)); |
- |
- // getErrorStream() does not have a throw clause, it returns null if |
- // there's an exception. |
- InputStream errorStream = connection.getErrorStream(); |
- assertNull(errorStream); |
- } |
- |
- /** |
- * Helper method to extract response body as a string for testing. |
- */ |
- private String getResponseAsString(HttpURLConnection connection) |
- throws Exception { |
- InputStream in = connection.getInputStream(); |
- ByteArrayOutputStream out = new ByteArrayOutputStream(); |
- int b; |
- while ((b = in.read()) != -1) { |
- out.write(b); |
- } |
- return out.toString(); |
- } |
- |
- /** |
- * Helper method to extract a list of header values with the give header |
- * name. |
- */ |
- private List<String> getRequestHeaderValues(String allHeaders, |
- String headerName) { |
- Pattern pattern = Pattern.compile(headerName + ":\\s(.*)\\r\\n"); |
- Matcher matcher = pattern.matcher(allHeaders); |
- List<String> headerValues = new ArrayList<String>(); |
- while (matcher.find()) { |
- headerValues.add(matcher.group(1)); |
- } |
- return headerValues; |
- } |
-} |