Chromium Code Reviews| Index: components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestTest.java |
| diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestTest.java |
| index 0fce4acefe055d584b5301c797ab41b3a71f31f6..ed027add5f88b6b96554e29d1894ffc856887370 100644 |
| --- a/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestTest.java |
| +++ b/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestTest.java |
| @@ -5,15 +5,20 @@ |
| package org.chromium.net; |
| import android.os.ConditionVariable; |
| +import android.test.MoreAsserts; |
| import android.test.suitebuilder.annotation.SmallTest; |
| +import android.util.Log; |
| import org.chromium.base.test.util.Feature; |
| import org.chromium.net.TestUrlRequestCallback.FailureType; |
| import org.chromium.net.TestUrlRequestCallback.ResponseStep; |
| import org.chromium.net.test.FailurePhase; |
| +import java.net.ConnectException; |
| import java.nio.ByteBuffer; |
| +import java.util.AbstractMap; |
| import java.util.ArrayList; |
| +import java.util.Arrays; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.concurrent.ExecutorService; |
| @@ -125,16 +130,41 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| assertEquals("GET", callback.mResponseAsString); |
| assertEquals(0, callback.mRedirectCount); |
| assertEquals(callback.mResponseStep, ResponseStep.ON_SUCCEEDED); |
| - assertEquals(String.format("UrlResponseInfo[%s]: urlChain = [%s], httpStatus = 200 OK, " |
| - + "headers = [Connection=close, Content-Length=3, " |
| - + "Content-Type=text/plain], wasCached = false, " |
| - + "negotiatedProtocol = unknown, proxyServer= :0, " |
| - + "receivedBytesCount = 86", |
| - url, url), |
| - callback.mResponseInfo.toString()); |
| + UrlResponseInfo urlResponseInfo = createUrlResponseInfo(new String[] {url}, "OK", 200, 86, |
| + "Connection", "close", "Content-Length", "3", "Content-Type", "text/plain"); |
| + assertResponseEquals(urlResponseInfo, callback.mResponseInfo); |
| checkResponseInfo(callback.mResponseInfo, NativeTestServer.getEchoMethodURL(), 200, "OK"); |
| } |
| + UrlResponseInfo createUrlResponseInfo( |
| + String[] urls, String message, int statusCode, int receivedBytes, String... headers) { |
| + ArrayList<Map.Entry<String, String>> headersList = new ArrayList<>(); |
| + for (int i = 0; i < headers.length; i += 2) { |
| + headersList.add(new AbstractMap.SimpleImmutableEntry<String, String>( |
| + headers[i], headers[i + 1])); |
| + } |
| + UrlResponseInfo unknown = new UrlResponseInfo( |
| + Arrays.asList(urls), statusCode, message, headersList, false, "unknown", ":0"); |
| + unknown.setReceivedBytesCount(receivedBytes); |
| + return unknown; |
| + } |
| + |
| + void assertResponseEquals(UrlResponseInfo expected, UrlResponseInfo actual) { |
| + assertEquals(expected.getAllHeaders(), actual.getAllHeaders()); |
| + assertEquals(expected.getAllHeadersAsList(), actual.getAllHeadersAsList()); |
| + assertEquals(expected.getHttpStatusCode(), actual.getHttpStatusCode()); |
| + assertEquals(expected.getHttpStatusText(), actual.getHttpStatusText()); |
| + assertEquals(expected.getUrlChain(), actual.getUrlChain()); |
| + assertEquals(expected.getUrl(), actual.getUrl()); |
| + // Transferred bytes and proxy server are not supported in pure java |
| + if (!(mTestFramework.mCronetEngine instanceof JavaCronetEngine)) { |
| + assertEquals(expected.getReceivedBytesCount(), actual.getReceivedBytesCount()); |
| + assertEquals(expected.getProxyServer(), actual.getProxyServer()); |
| + // This is a place where behavior intentionally differs between native and java |
| + assertEquals(expected.getNegotiatedProtocol(), actual.getNegotiatedProtocol()); |
| + } |
| + } |
| + |
| /** |
| * Tests a redirect by running it step-by-step. Also tests that delaying a |
| * request works as expected. To make sure there are no unexpected pending |
| @@ -162,13 +192,10 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| checkResponseInfoHeader( |
| callback.mRedirectResponseInfoList.get(0), "redirect-header", "header-value"); |
| - assertEquals(String.format("UrlResponseInfo[%s]: urlChain = [%s], httpStatus = 302 Found, " |
| - + "headers = [Location=/success.txt, " |
| - + "redirect-header=header-value], wasCached = false, " |
| - + "negotiatedProtocol = unknown, proxyServer= :0, " |
| - + "receivedBytesCount = 74", |
| - NativeTestServer.getRedirectURL(), NativeTestServer.getRedirectURL()), |
| - callback.mRedirectResponseInfoList.get(0).toString()); |
| + UrlResponseInfo expected = |
| + createUrlResponseInfo(new String[] {NativeTestServer.getRedirectURL()}, "Found", |
| + 302, 74, "Location", "/success.txt", "redirect-header", "header-value"); |
| + assertResponseEquals(expected, callback.mRedirectResponseInfoList.get(0)); |
| // Wait for an unrelated request to finish. The request should not |
| // advance until followRedirect is invoked. |
| @@ -213,17 +240,13 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| assertEquals(ResponseStep.ON_SUCCEEDED, callback.mResponseStep); |
| assertEquals(NativeTestServer.SUCCESS_BODY, callback.mResponseAsString); |
| - assertEquals(String.format("UrlResponseInfo[%s]: urlChain = [%s, %s], httpStatus = 200 OK, " |
| - + "headers = [Content-Type=text/plain, " |
| - + "Access-Control-Allow-Origin=*, header-name=header-value, " |
| - + "multi-header-name=header-value1, " |
| - + "multi-header-name=header-value2], wasCached = false, " |
| - + "negotiatedProtocol = unknown, proxyServer= :0, " |
| - + "receivedBytesCount = 260", |
| - NativeTestServer.getSuccessURL(), NativeTestServer.getRedirectURL(), |
| - NativeTestServer.getSuccessURL()), |
| - callback.mResponseInfo.toString()); |
| + UrlResponseInfo urlResponseInfo = createUrlResponseInfo( |
| + new String[] {NativeTestServer.getRedirectURL(), NativeTestServer.getSuccessURL()}, |
| + "OK", 200, 260, "Content-Type", "text/plain", "Access-Control-Allow-Origin", "*", |
| + "header-name", "header-value", "multi-header-name", "header-value1", |
| + "multi-header-name", "header-value2"); |
| + assertResponseEquals(urlResponseInfo, callback.mResponseInfo); |
| // Make sure there are no other pending messages, which would trigger |
| // asserts in TestUrlRequestCallback. |
| testSimpleGet(); |
| @@ -247,6 +270,7 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| // See http://crbug.com/468803. |
| @SmallTest |
| @Feature({"Cronet"}) |
| + @OnlyRunNativeCronet // No canonical exception to assert on |
| public void testContentLengthMismatchFailsOnce() throws Exception { |
| String url = NativeTestServer.getFileURL( |
| "/content_length_mismatch.html"); |
| @@ -254,7 +278,7 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); |
| // The entire response body will be read before the error is returned. |
| // This is because the network stack returns data as it's read from the |
| - // socket, and the socket close message which tiggers the error will |
| + // socket, and the socket close message which triggers the error will |
| // only be passed along after all data has been read. |
| assertEquals("Response that lies about content length.", callback.mResponseAsString); |
| assertNotNull(callback.mError); |
| @@ -434,17 +458,13 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); |
| List<Map.Entry<String, String>> responseHeaders = |
| callback.mResponseInfo.getAllHeadersAsList(); |
| - assertEquals(5, responseHeaders.size()); |
| - assertEquals("Content-Type", responseHeaders.get(0).getKey()); |
| - assertEquals("text/plain", responseHeaders.get(0).getValue()); |
| - assertEquals("Access-Control-Allow-Origin", responseHeaders.get(1).getKey()); |
| - assertEquals("*", responseHeaders.get(1).getValue()); |
| - assertEquals("header-name", responseHeaders.get(2).getKey()); |
| - assertEquals("header-value", responseHeaders.get(2).getValue()); |
| - assertEquals("multi-header-name", responseHeaders.get(3).getKey()); |
| - assertEquals("header-value1", responseHeaders.get(3).getValue()); |
| - assertEquals("multi-header-name", responseHeaders.get(4).getKey()); |
| - assertEquals("header-value2", responseHeaders.get(4).getValue()); |
| + |
| + MoreAsserts.assertContentsInOrder(responseHeaders, |
| + new AbstractMap.SimpleEntry<>("Content-Type", "text/plain"), |
| + new AbstractMap.SimpleEntry<>("Access-Control-Allow-Origin", "*"), |
| + new AbstractMap.SimpleEntry<>("header-name", "header-value"), |
| + new AbstractMap.SimpleEntry<>("multi-header-name", "header-value1"), |
| + new AbstractMap.SimpleEntry<>("multi-header-name", "header-value2")); |
| } |
| @SmallTest |
| @@ -458,39 +478,24 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| assertEquals(2, callback.mRedirectResponseInfoList.size()); |
| // Check first redirect (multiredirect.html -> redirect.html) |
| + UrlResponseInfo firstExpectedResponseInfo = createUrlResponseInfo( |
| + new String[] {NativeTestServer.getMultiRedirectURL()}, "Found", 302, 77, "Location", |
| + "/redirect.html", "redirect-header0", "header-value"); |
| UrlResponseInfo firstRedirectResponseInfo = callback.mRedirectResponseInfoList.get(0); |
| - assertEquals(1, firstRedirectResponseInfo.getUrlChain().size()); |
| - assertEquals(NativeTestServer.getMultiRedirectURL(), |
| - firstRedirectResponseInfo.getUrlChain().get(0)); |
| - checkResponseInfo( |
| - firstRedirectResponseInfo, NativeTestServer.getMultiRedirectURL(), 302, "Found"); |
| - checkResponseInfoHeader(firstRedirectResponseInfo, |
| - "redirect-header0", "header-value"); |
| - assertEquals(77, firstRedirectResponseInfo.getReceivedBytesCount()); |
| + assertResponseEquals(firstExpectedResponseInfo, firstRedirectResponseInfo); |
| // Check second redirect (redirect.html -> success.txt) |
| - UrlResponseInfo secondRedirectResponseInfo = callback.mRedirectResponseInfoList.get(1); |
| - assertEquals(2, secondRedirectResponseInfo.getUrlChain().size()); |
| - assertEquals(NativeTestServer.getMultiRedirectURL(), |
| - secondRedirectResponseInfo.getUrlChain().get(0)); |
| - assertEquals( |
| - NativeTestServer.getRedirectURL(), secondRedirectResponseInfo.getUrlChain().get(1)); |
| - checkResponseInfo( |
| - secondRedirectResponseInfo, NativeTestServer.getRedirectURL(), 302, "Found"); |
| - checkResponseInfoHeader(secondRedirectResponseInfo, |
| - "redirect-header", "header-value"); |
| - assertEquals(151, secondRedirectResponseInfo.getReceivedBytesCount()); |
| - |
| - // Check final response (success.txt). |
| - assertEquals(NativeTestServer.getSuccessURL(), mResponseInfo.getUrl()); |
| - assertEquals(3, mResponseInfo.getUrlChain().size()); |
| - assertEquals(NativeTestServer.getMultiRedirectURL(), mResponseInfo.getUrlChain().get(0)); |
| - assertEquals(NativeTestServer.getRedirectURL(), mResponseInfo.getUrlChain().get(1)); |
| - assertEquals(NativeTestServer.getSuccessURL(), mResponseInfo.getUrlChain().get(2)); |
| + UrlResponseInfo secondExpectedResponseInfo = createUrlResponseInfo( |
| + new String[] {NativeTestServer.getMultiRedirectURL(), |
| + NativeTestServer.getRedirectURL(), NativeTestServer.getSuccessURL()}, |
| + "OK", 200, 337, "Content-Type", "text/plain", "Access-Control-Allow-Origin", "*", |
| + "header-name", "header-value", "multi-header-name", "header-value1", |
| + "multi-header-name", "header-value2"); |
| + |
| + assertResponseEquals(secondExpectedResponseInfo, mResponseInfo); |
| assertTrue(callback.mHttpResponseDataLength != 0); |
| assertEquals(2, callback.mRedirectCount); |
| assertEquals(callback.mResponseStep, ResponseStep.ON_SUCCEEDED); |
| - assertEquals(337, mResponseInfo.getReceivedBytesCount()); |
| } |
| @SmallTest |
| @@ -498,8 +503,9 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| public void testMockNotFound() throws Exception { |
| TestUrlRequestCallback callback = |
| startAndWaitForComplete(NativeTestServer.getNotFoundURL()); |
| - assertEquals(404, callback.mResponseInfo.getHttpStatusCode()); |
| - assertEquals(121, callback.mResponseInfo.getReceivedBytesCount()); |
| + UrlResponseInfo expected = createUrlResponseInfo( |
| + new String[] {NativeTestServer.getNotFoundURL()}, "Not Found", 404, 121); |
| + assertResponseEquals(expected, callback.mResponseInfo); |
| assertTrue(callback.mHttpResponseDataLength != 0); |
| assertEquals(0, callback.mRedirectCount); |
| assertFalse(callback.mOnErrorCalled); |
| @@ -508,6 +514,7 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| @SmallTest |
| @Feature({"Cronet"}) |
| + @OnlyRunNativeCronet // Java impl doesn't support MockUrlRequestJobFactory |
| public void testMockStartAsyncError() throws Exception { |
| final int arbitraryNetError = -3; |
| TestUrlRequestCallback callback = |
| @@ -523,6 +530,7 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| @SmallTest |
| @Feature({"Cronet"}) |
| + @OnlyRunNativeCronet // Java impl doesn't support MockUrlRequestJobFactory |
| public void testMockReadDataSyncError() throws Exception { |
| final int arbitraryNetError = -4; |
| TestUrlRequestCallback callback = |
| @@ -539,6 +547,7 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| @SmallTest |
| @Feature({"Cronet"}) |
| + @OnlyRunNativeCronet // Java impl doesn't support MockUrlRequestJobFactory |
| public void testMockReadDataAsyncError() throws Exception { |
| final int arbitraryNetError = -5; |
| TestUrlRequestCallback callback = |
| @@ -558,6 +567,7 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| */ |
| @SmallTest |
| @Feature({"Cronet"}) |
| + @OnlyRunNativeCronet |
| public void testMockClientCertificateRequested() throws Exception { |
| TestUrlRequestCallback callback = startAndWaitForComplete( |
| MockUrlRequestJobFactory.getMockUrlForClientCertificateRequest()); |
| @@ -574,6 +584,7 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| */ |
| @SmallTest |
| @Feature({"Cronet"}) |
| + @OnlyRunNativeCronet // Java impl doesn't support MockUrlRequestJobFactory |
| public void testMockSSLCertificateError() throws Exception { |
| TestUrlRequestCallback callback = startAndWaitForComplete( |
| MockUrlRequestJobFactory.getMockUrlForSSLCertificateError()); |
| @@ -818,8 +829,6 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| callback.startNextRead(urlRequest); |
| fail("Exception not thrown"); |
| } catch (IllegalStateException e) { |
| - assertEquals("Unexpected read attempt.", |
| - e.getMessage()); |
| } |
| // Verify reading right after start throws an assertion. Both must be |
| @@ -833,8 +842,6 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| callback.startNextRead(urlRequest); |
| fail("Exception not thrown"); |
| } catch (IllegalStateException e) { |
| - assertEquals("Unexpected read attempt.", |
| - e.getMessage()); |
| } |
| } |
| }; |
| @@ -847,8 +854,6 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| callback.startNextRead(urlRequest); |
| fail("Exception not thrown"); |
| } catch (IllegalStateException e) { |
| - assertEquals("Unexpected read attempt.", |
| - e.getMessage()); |
| } |
| urlRequest.followRedirect(); |
| callback.waitForNextStep(); |
| @@ -866,8 +871,6 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| callback.startNextRead(urlRequest); |
| fail("Exception not thrown"); |
| } catch (IllegalStateException e) { |
| - assertEquals("Unexpected read attempt.", |
| - e.getMessage()); |
| } |
| } |
| }; |
| @@ -883,8 +886,6 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| callback.startNextRead(urlRequest); |
| fail("Exception not thrown"); |
| } catch (IllegalStateException e) { |
| - assertEquals("Unexpected read attempt.", |
| - e.getMessage()); |
| } |
| } |
| @@ -903,8 +904,6 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| urlRequest.followRedirect(); |
| fail("Exception not thrown"); |
| } catch (IllegalStateException e) { |
| - assertEquals("No redirect to follow.", |
| - e.getMessage()); |
| } |
| // Try to follow a redirect just after starting the request. Has to be |
| @@ -917,8 +916,6 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| urlRequest.followRedirect(); |
| fail("Exception not thrown"); |
| } catch (IllegalStateException e) { |
| - assertEquals("No redirect to follow.", |
| - e.getMessage()); |
| } |
| } |
| }; |
| @@ -935,8 +932,6 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| urlRequest.followRedirect(); |
| fail("Exception not thrown"); |
| } catch (IllegalStateException e) { |
| - assertEquals("No redirect to follow.", |
| - e.getMessage()); |
| } |
| } |
| }; |
| @@ -951,8 +946,6 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| urlRequest.followRedirect(); |
| fail("Exception not thrown"); |
| } catch (IllegalStateException e) { |
| - assertEquals("No redirect to follow.", |
| - e.getMessage()); |
| } |
| callback.startNextRead(urlRequest); |
| callback.waitForNextStep(); |
| @@ -966,8 +959,6 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| urlRequest.followRedirect(); |
| fail("Exception not thrown"); |
| } catch (IllegalStateException e) { |
| - assertEquals("No redirect to follow.", |
| - e.getMessage()); |
| } |
| } |
| @@ -992,7 +983,6 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| builder.build().start(); |
| fail("Exception not thrown"); |
| } catch (IllegalArgumentException e) { |
| - assertEquals("Requests with upload data must have a Content-Type.", e.getMessage()); |
| } |
| } |
| @@ -1394,11 +1384,11 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| @Feature({"Cronet"}) |
| public void testUploadFailsWithoutInitializingStream() throws Exception { |
| TestUrlRequestCallback callback = new TestUrlRequestCallback(); |
| - UrlRequest.Builder builder = new UrlRequest.Builder(NativeTestServer.getEchoBodyURL(), |
| - callback, callback.getExecutor(), mTestFramework.mCronetEngine); |
| + UrlRequest.Builder builder = new UrlRequest.Builder("http://127.0.0.1:12345", callback, |
|
pauljensen
2016/01/07 04:33:38
why did you change this and line 1391? I admit th
Charles
2016/01/07 16:10:02
Shutting down the native test server causes getEch
|
| + callback.getExecutor(), mTestFramework.mCronetEngine); |
| // Shut down the test server, so connecting to it fails. Note that |
| // calling shutdown again during teardown is safe. |
| - NativeTestServer.shutdownNativeTestServer(); |
| + // NativeTestServer.shutdownNativeTestServer(); |
| TestUploadDataProvider dataProvider = new TestUploadDataProvider( |
| TestUploadDataProvider.SuccessCallbackMode.SYNC, callback.getExecutor()); |
| @@ -1409,12 +1399,19 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| callback.blockForDone(); |
| assertNull(callback.mResponseInfo); |
| - assertEquals("Exception in CronetUrlRequest: net::ERR_CONNECTION_REFUSED", |
| - callback.mError.getMessage()); |
| + if (testingJavaImpl()) { |
| + assertTrue(callback.mError.getCause() instanceof ConnectException); |
| + } else { |
| + assertEquals("Exception in CronetUrlRequest: net::ERR_CONNECTION_REFUSED", |
| + callback.mError.getMessage()); |
| + } |
| } |
| private void throwOrCancel(FailureType failureType, ResponseStep failureStep, |
| boolean expectResponseInfo, boolean expectError) { |
| + if (Log.isLoggable("TESTING", Log.VERBOSE)) { |
| + Log.v("TESTING", "Testing " + failureType + " during " + failureStep); |
| + } |
| TestUrlRequestCallback callback = new TestUrlRequestCallback(); |
| callback.setFailure(failureType, failureStep); |
| UrlRequest.Builder builder = new UrlRequest.Builder(NativeTestServer.getRedirectURL(), |
| @@ -1485,6 +1482,7 @@ public class CronetUrlRequestTest extends CronetTestBase { |
| @SmallTest |
| @Feature({"Cronet"}) |
| + @OnlyRunNativeCronet // No destroyed callback for tests |
| public void testExecutorShutdown() { |
| TestUrlRequestCallback callback = new TestUrlRequestCallback(); |