diff options
| author | xunjieli <xunjieli@chromium.org> | 2015-05-07 09:48:14 -0700 | 
|---|---|---|
| committer | Commit bot <commit-bot@chromium.org> | 2015-05-07 16:48:53 +0000 | 
| commit | d26defc009990bc77a193d9c8cbd827cb87c6dc7 (patch) | |
| tree | cf8b88f28c208745dc8ea287fda5f0c423426f3e | |
| parent | d2668bf5bd2bcebb73e37c127386b619d4907fcc (diff) | |
| download | chromium_src-d26defc009990bc77a193d9c8cbd827cb87c6dc7.zip chromium_src-d26defc009990bc77a193d9c8cbd827cb87c6dc7.tar.gz chromium_src-d26defc009990bc77a193d9c8cbd827cb87c6dc7.tar.bz2 | |
[Cronet] Refactor and remove dependency on url_request_mock_http_job.cc/h
Since our native test server already supports serving
responses from files, it makes sense for us to not
depend on url_request_mock_http_job.cc which introduced
unwanted dependencies on file support (Cronet disables
file support by default).
This CL separates out the part about failure phase in
url_request_mock_http_job.cc to a different file, which
Cronet can use.
This CL also renames MockUrlRequestJobTest to
ChromiumUrlRequestTest, since a subset of the tests in
that file are now using NativeTestServer. All tests in that
file uses the old API, so I thought ChromiumUrlRequestTest
for the name would be more appropriate.
BUG=482606
Review URL: https://codereview.chromium.org/1112953002
Cr-Commit-Position: refs/heads/master@{#328778}
18 files changed, 320 insertions, 350 deletions
| diff --git a/chrome/browser/net/certificate_error_reporter_unittest.cc b/chrome/browser/net/certificate_error_reporter_unittest.cc index f9054cd..d1e4480 100644 --- a/chrome/browser/net/certificate_error_reporter_unittest.cc +++ b/chrome/browser/net/certificate_error_reporter_unittest.cc @@ -29,7 +29,6 @@  #include "net/test/cert_test_util.h"  #include "net/test/url_request/url_request_failed_job.h"  #include "net/test/url_request/url_request_mock_data_job.h" -#include "net/test/url_request/url_request_mock_http_job.h"  #include "net/url_request/url_request_filter.h"  #include "net/url_request/url_request_test_util.h"  #include "testing/gtest/include/gtest/gtest.h" @@ -72,11 +71,7 @@ void EnableUrlRequestMocks(bool enable) {    if (!enable)      return; -  base::FilePath root_http;    net::URLRequestFailedJob::AddUrlHandler(); -  PathService::Get(chrome::DIR_TEST_DATA, &root_http); -  net::URLRequestMockHTTPJob::AddUrlHandlers(root_http, -                                             BrowserThread::GetBlockingPool());    net::URLRequestMockDataJob::AddUrlHandler();  } @@ -336,9 +331,8 @@ TEST_F(CertificateErrorReporterTest, PendingRequestGetsDeleted) {    network_delegate()->set_url_request_destroyed_callback(        run_loop.QuitClosure()); -  GURL url = net::URLRequestMockHTTPJob::GetMockUrlWithFailure( -      base::FilePath(FILE_PATH_LITERAL("empty.html")), -      net::URLRequestMockHTTPJob::START, net::ERR_IO_PENDING); +  GURL url = net::URLRequestFailedJob::GetMockHttpUrlWithFailurePhase( +      net::URLRequestFailedJob::START, net::ERR_IO_PENDING);    network_delegate()->set_expect_url(url);    network_delegate()->ExpectHostname(kHostname); diff --git a/chrome/test/data/captive_portal/iframe_timeout.html b/chrome/test/data/captive_portal/iframe_timeout.html index 36286ca..18278e4 100644 --- a/chrome/test/data/captive_portal/iframe_timeout.html +++ b/chrome/test/data/captive_portal/iframe_timeout.html @@ -7,6 +7,6 @@  This iframe will fail to load with an HTTPS connection timeout.  "mock.failed.request" is the magic hostname used by URLRequestFailedJob,  and -118 is CONNECTION_TIMED_OUT. -<iframe src="https://mock.failed.request/-118"></iframe> +<iframe src="https://mock.failed.request/error?start=-118"></iframe>  </body>  </html> diff --git a/chrome/test/data/iframe_dns_error.html b/chrome/test/data/iframe_dns_error.html index 2bf6e25..3f105da 100644 --- a/chrome/test/data/iframe_dns_error.html +++ b/chrome/test/data/iframe_dns_error.html @@ -5,6 +5,6 @@  <body>  This frame will fail to load with a DNS error.  "mock.failed.request" is the  magic hostname used by URLRequestFailedJob, and -105 is ERR_NAME_NOT_RESOLVED. -<iframe src="http://mock.failed.request/-105"></iframe> +<iframe src="http://mock.failed.request/error?start=-105"></iframe>  </body>  </html> diff --git a/components/cronet.gypi b/components/cronet.gypi index 19cd8b3..e5812e6 100644 --- a/components/cronet.gypi +++ b/components/cronet.gypi @@ -301,30 +301,13 @@              '../third_party/icu/icu.gyp:icui18n',              '../third_party/icu/icu.gyp:icuuc',            ], -          'conditions': [ -            # If file support is disabled, add the following sources since -            # url_request_mock_http_job depends on them. -            ['disable_file_support==1', -              { -                'sources': [ -                  '../net/base/directory_lister.cc', -                  '../net/base/directory_lister.h', -                  '../net/url_request/test_url_request_interceptor.cc', -                  '../net/url_request/test_url_request_interceptor.h', -                  '../net/url_request/url_request_file_job.cc', -                  '../net/url_request/url_request_file_job.h', -                  '../net/test/url_request/url_request_mock_http_job.cc', -                  '../net/test/url_request/url_request_mock_http_job.h', -                ] -              } -            ], -          ],          },          {            'target_name': 'cronet_test_apk',            'type': 'none',            'dependencies': [              'cronet_java', +            '../net/net.gyp:net_java_test_support',            ],            'variables': {              'apk_name': 'CronetTest', diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/MockUrlRequestJobTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/ChromiumUrlRequestTest.java index a08bfa63..2c2219b 100644 --- a/components/cronet/android/test/javatests/src/org/chromium/net/MockUrlRequestJobTest.java +++ b/components/cronet/android/test/javatests/src/org/chromium/net/ChromiumUrlRequestTest.java @@ -9,6 +9,7 @@ import android.test.suitebuilder.annotation.SmallTest;  import org.chromium.base.annotations.SuppressFBWarnings;  import org.chromium.base.test.util.Feature; +import org.chromium.net.test.FailurePhase;  import java.io.IOException;  import java.nio.ByteBuffer; @@ -17,16 +18,28 @@ import java.util.List;  import java.util.concurrent.Executors;  /** - * Tests that use mock URLRequestJobs to simulate URL requests. + * Tests making requests using {@link ChromiumUrlRequest}.   */ -public class MockUrlRequestJobTest extends CronetTestBase { -    private static final String TAG = "MockURLRequestJobTest"; - +public class ChromiumUrlRequestTest extends CronetTestBase {      private CronetTestActivity mActivity; -    private MockUrlRequestJobFactory mMockUrlRequestJobFactory;      private TestHttpUrlRequestListener mListener;      private HttpUrlRequest mRequest; +    @Override +    protected void setUp() throws Exception { +        super.setUp(); +        mActivity = launchCronetTestApp(); +        assertTrue(NativeTestServer.startNativeTestServer( +                getInstrumentation().getTargetContext())); +        MockUrlRequestJobFactory.setUp(); +    } + +    @Override +    protected void tearDown() throws Exception { +        NativeTestServer.shutdownNativeTestServer(); +        super.tearDown(); +    } +      // Helper function to create a HttpUrlRequest with the specified url.      private void createRequestAndWaitForComplete(              String url, boolean disableRedirects) { @@ -69,20 +82,12 @@ public class MockUrlRequestJobTest extends CronetTestBase {          }      } -    @Override -    protected void setUp() throws Exception { -        super.setUp(); -        mActivity = launchCronetTestApp(); -        mMockUrlRequestJobFactory = new MockUrlRequestJobFactory( -                getInstrumentation().getTargetContext()); -    } -      @SmallTest      @Feature({"Cronet"})      public void testSuccessURLRequest() throws Exception {          createRequestAndWaitForComplete( -                MockUrlRequestJobFactory.SUCCESS_URL, false); -        assertEquals(MockUrlRequestJobFactory.SUCCESS_URL, mListener.mUrl); +                NativeTestServer.getSuccessURL(), false); +        assertEquals(NativeTestServer.getSuccessURL(), mListener.mUrl);          assertEquals(200, mListener.mHttpStatusCode);          assertEquals("OK", mListener.mHttpStatusText);          assertEquals("this is a text file\n", @@ -99,9 +104,9 @@ public class MockUrlRequestJobTest extends CronetTestBase {      @Feature({"Cronet"})      public void testRedirectURLRequest() throws Exception {          createRequestAndWaitForComplete( -                MockUrlRequestJobFactory.REDIRECT_URL, false); +                NativeTestServer.getRedirectURL(), false);          // ChromiumUrlRequest does not expose the url after redirect. -        assertEquals(MockUrlRequestJobFactory.REDIRECT_URL, mListener.mUrl); +        assertEquals(NativeTestServer.getRedirectURL(), mListener.mUrl);          assertEquals(200, mListener.mHttpStatusCode);          assertEquals("OK", mListener.mHttpStatusText);          // Expect that the request is redirected to success.txt. @@ -119,8 +124,8 @@ public class MockUrlRequestJobTest extends CronetTestBase {      @Feature({"Cronet"})      public void testNotFoundURLRequest() throws Exception {          createRequestAndWaitForComplete( -                MockUrlRequestJobFactory.NOTFOUND_URL, false); -        assertEquals(MockUrlRequestJobFactory.NOTFOUND_URL, mListener.mUrl); +                NativeTestServer.getNotFoundURL(), false); +        assertEquals(NativeTestServer.getNotFoundURL(), mListener.mUrl);          assertEquals(404, mListener.mHttpStatusCode);          assertEquals("Not Found", mListener.mHttpStatusText);          assertEquals( @@ -138,9 +143,12 @@ public class MockUrlRequestJobTest extends CronetTestBase {      @SmallTest      @Feature({"Cronet"})      public void testFailedURLRequest() throws Exception { -        createRequestAndWaitForComplete( -                MockUrlRequestJobFactory.FAILED_URL, false); -        assertEquals(MockUrlRequestJobFactory.FAILED_URL, mListener.mUrl); +        // -2 is the net error code for FAILED. See net_error_list.h. +        int errorFailed = -2; +        String failedUrl = MockUrlRequestJobFactory.getMockUrlWithFailure( +                FailurePhase.START, errorFailed); +        createRequestAndWaitForComplete(failedUrl, false); +        assertEquals(failedUrl, mListener.mUrl);          assertEquals("", mListener.mHttpStatusText);          assertEquals(0, mListener.mHttpStatusCode);          // Test that ChromiumUrlRequest caches information which is available @@ -157,11 +165,11 @@ public class MockUrlRequestJobTest extends CronetTestBase {      // Test that redirect can be disabled for a request.      public void testDisableRedirects() throws Exception {          createRequestAndWaitForComplete( -                MockUrlRequestJobFactory.REDIRECT_URL, true); +                NativeTestServer.getRedirectURL(), true);          // Currently Cronet does not expose the url after redirect. -        assertEquals(MockUrlRequestJobFactory.REDIRECT_URL, mListener.mUrl); +        assertEquals(NativeTestServer.getRedirectURL(), mListener.mUrl);          assertEquals(302, mListener.mHttpStatusCode); -        // MockUrlRequestJob somehow does not populate status text as "Found". +        // url_request_adapter.cc does not populate status text when redirects are disabled.          assertEquals("", mListener.mHttpStatusText);          // Expect that the request is not redirected to success.txt.          assertNotNull(mListener.mResponseHeaders); @@ -177,7 +185,7 @@ public class MockUrlRequestJobTest extends CronetTestBase {          // Test that ChromiumUrlRequest caches information which is available          // after the native request adapter has been destroyed.          assertEquals(302, mRequest.getHttpStatusCode()); -        // MockUrlRequestJob somehow does not populate status text as "Found". +        // url_request_adapter.cc does not populate status text when redirects are disabled.          assertEquals("", mRequest.getHttpStatusText());          assertEquals("Request failed because there were too many redirects "                  + "or redirects have been disabled", @@ -233,7 +241,7 @@ public class MockUrlRequestJobTest extends CronetTestBase {              // Create request.              final HttpUrlRequest request =                      mActivity.mRequestFactory.createRequest( -                            MockUrlRequestJobFactory.SUCCESS_URL, +                            NativeTestServer.getSuccessURL(),                              HttpUrlRequest.REQUEST_PRIORITY_LOW, headers,                              channel, listener);              request.start(); @@ -264,7 +272,7 @@ public class MockUrlRequestJobTest extends CronetTestBase {          String data = "MyBigFunkyData";          int dataLength = data.length();          int repeatCount = 10000; -        String mockUrl = mMockUrlRequestJobFactory.getMockUrlForData(data, +        String mockUrl = MockUrlRequestJobFactory.getMockUrlForData(data,                  repeatCount);          // Create request. @@ -295,7 +303,7 @@ public class MockUrlRequestJobTest extends CronetTestBase {          String data = "MyBigFunkyData";          int dataLength = data.length();          int repeatCount = 100000; -        String mockUrl = mMockUrlRequestJobFactory.getMockUrlForData(data, +        String mockUrl = MockUrlRequestJobFactory.getMockUrlForData(data,                  repeatCount);          createRequestAndWaitForComplete(mockUrl, false);          assertEquals(mockUrl, mListener.mUrl); 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 e9aa721..d7d324a 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 @@ -10,6 +10,7 @@ import android.util.Pair;  import org.chromium.base.test.util.Feature;  import org.chromium.net.TestUrlRequestListener.FailureType;  import org.chromium.net.TestUrlRequestListener.ResponseStep; +import org.chromium.net.test.FailurePhase;  import java.nio.ByteBuffer;  import java.util.ArrayList; @@ -24,10 +25,8 @@ import java.util.regex.Pattern;  public class CronetUrlRequestTest extends CronetTestBase {      // URL used for base tests.      private static final String TEST_URL = "http://127.0.0.1:8000"; -    private static final String MOCK_SUCCESS_PATH = "success.txt";      private CronetTestActivity mActivity; -    private MockUrlRequestJobFactory mMockUrlRequestJobFactory;      @Override      protected void setUp() throws Exception { @@ -36,8 +35,7 @@ public class CronetUrlRequestTest extends CronetTestBase {          assertTrue(NativeTestServer.startNativeTestServer(                  getInstrumentation().getTargetContext()));          // Add url interceptors after native application context is initialized. -        mMockUrlRequestJobFactory = new MockUrlRequestJobFactory( -                getInstrumentation().getTargetContext()); +        MockUrlRequestJobFactory.setUp();      }      @Override @@ -106,8 +104,7 @@ public class CronetUrlRequestTest extends CronetTestBase {          TestUrlRequestListener listener = new TestUrlRequestListener();          listener.setAutoAdvance(false);          UrlRequest urlRequest = mActivity.mUrlRequestContext.createRequest( -                MockUrlRequestJobFactory.REDIRECT_URL, -                listener, listener.getExecutor()); +                NativeTestServer.getRedirectURL(), listener, listener.getExecutor());          urlRequest.start();          listener.waitForNextStep(); @@ -115,12 +112,10 @@ public class CronetUrlRequestTest extends CronetTestBase {          assertEquals(ResponseStep.ON_RECEIVED_REDIRECT, listener.mResponseStep);          assertEquals(1, listener.mRedirectResponseInfoList.size());          checkResponseInfo(listener.mRedirectResponseInfoList.get(0), -                MockUrlRequestJobFactory.REDIRECT_URL, -                302, "Found"); +                NativeTestServer.getRedirectURL(), 302, "Found");          assertEquals(1,                  listener.mRedirectResponseInfoList.get(0).getUrlChain().length); -        assertEquals(MockUrlRequestJobFactory.SUCCESS_URL, -                listener.mRedirectUrlList.get(0)); +        assertEquals(NativeTestServer.getSuccessURL(), listener.mRedirectUrlList.get(0));          checkResponseInfoHeader(listener.mRedirectResponseInfoList.get(0),                  "redirect-header", "header-value"); @@ -137,13 +132,10 @@ public class CronetUrlRequestTest extends CronetTestBase {          assertEquals(ResponseStep.ON_RESPONSE_STARTED, listener.mResponseStep);          assertEquals(1, listener.mRedirectResponseInfoList.size());          assertEquals(200, listener.mResponseInfo.getHttpStatusCode()); -        checkResponseInfo(listener.mResponseInfo, -                MockUrlRequestJobFactory.SUCCESS_URL, 200, "OK"); +        checkResponseInfo(listener.mResponseInfo, NativeTestServer.getSuccessURL(), 200, "OK");          assertEquals(2, listener.mResponseInfo.getUrlChain().length); -        assertEquals(MockUrlRequestJobFactory.REDIRECT_URL, -                listener.mResponseInfo.getUrlChain()[0]); -        assertEquals(MockUrlRequestJobFactory.SUCCESS_URL, -                listener.mResponseInfo.getUrlChain()[1]); +        assertEquals(NativeTestServer.getRedirectURL(), listener.mResponseInfo.getUrlChain()[0]); +        assertEquals(NativeTestServer.getSuccessURL(), listener.mResponseInfo.getUrlChain()[1]);          // Wait for an unrelated request to finish. The request should not          // advance until read is invoked. @@ -167,8 +159,7 @@ public class CronetUrlRequestTest extends CronetTestBase {              assertEquals(step, listener.mResponseStep);          }          assertEquals(ResponseStep.ON_SUCCEEDED, listener.mResponseStep); -        assertEquals(MockUrlRequestJobFactory.SUCCESS_BODY, -                listener.mResponseAsString); +        assertEquals(NativeTestServer.SUCCESS_BODY, listener.mResponseAsString);          // Make sure there are no other pending messages, which would trigger          // asserts in TestURLRequestListener. @@ -379,8 +370,7 @@ public class CronetUrlRequestTest extends CronetTestBase {      @SmallTest      @Feature({"Cronet"})      public void testMockSuccess() throws Exception { -        TestUrlRequestListener listener = startAndWaitForComplete( -                MockUrlRequestJobFactory.SUCCESS_URL); +        TestUrlRequestListener listener = startAndWaitForComplete(NativeTestServer.getSuccessURL());          assertEquals(200, listener.mResponseInfo.getHttpStatusCode());          assertEquals(0, listener.mRedirectResponseInfoList.size());          assertTrue(listener.mHttpResponseDataLength != 0); @@ -397,8 +387,7 @@ public class CronetUrlRequestTest extends CronetTestBase {      @SmallTest      @Feature({"Cronet"})      public void testResponseHeadersList() throws Exception { -        TestUrlRequestListener listener = startAndWaitForComplete( -                MockUrlRequestJobFactory.SUCCESS_URL); +        TestUrlRequestListener listener = startAndWaitForComplete(NativeTestServer.getSuccessURL());          assertEquals(200, listener.mResponseInfo.getHttpStatusCode());          List<Pair<String, String>> responseHeaders =                  listener.mResponseInfo.getAllHeadersAsList(); @@ -419,8 +408,8 @@ public class CronetUrlRequestTest extends CronetTestBase {      @SmallTest      @Feature({"Cronet"})      public void testMockMultiRedirect() throws Exception { -        TestUrlRequestListener listener = startAndWaitForComplete( -                MockUrlRequestJobFactory.MULTI_REDIRECT_URL); +        TestUrlRequestListener listener = +                startAndWaitForComplete(NativeTestServer.getMultiRedirectURL());          ResponseInfo mResponseInfo = listener.mResponseInfo;          assertEquals(2, listener.mRedirectCount);          assertEquals(200, mResponseInfo.getHttpStatusCode()); @@ -430,11 +419,10 @@ public class CronetUrlRequestTest extends CronetTestBase {          ResponseInfo firstRedirectResponseInfo =                  listener.mRedirectResponseInfoList.get(0);          assertEquals(1, firstRedirectResponseInfo.getUrlChain().length); -        assertEquals(MockUrlRequestJobFactory.MULTI_REDIRECT_URL, -                firstRedirectResponseInfo.getUrlChain()[0]); -        checkResponseInfo(firstRedirectResponseInfo, -                MockUrlRequestJobFactory.MULTI_REDIRECT_URL, -                302, "Found"); +        assertEquals( +                NativeTestServer.getMultiRedirectURL(), firstRedirectResponseInfo.getUrlChain()[0]); +        checkResponseInfo( +                firstRedirectResponseInfo, NativeTestServer.getMultiRedirectURL(), 302, "Found");          checkResponseInfoHeader(firstRedirectResponseInfo,                  "redirect-header0", "header-value"); @@ -442,25 +430,21 @@ public class CronetUrlRequestTest extends CronetTestBase {          ResponseInfo secondRedirectResponseInfo =                  listener.mRedirectResponseInfoList.get(1);          assertEquals(2, secondRedirectResponseInfo.getUrlChain().length); -        assertEquals(MockUrlRequestJobFactory.MULTI_REDIRECT_URL, +        assertEquals(NativeTestServer.getMultiRedirectURL(),                  secondRedirectResponseInfo.getUrlChain()[0]); -        assertEquals(MockUrlRequestJobFactory.REDIRECT_URL, -                secondRedirectResponseInfo.getUrlChain()[1]); -        checkResponseInfo(secondRedirectResponseInfo, -                MockUrlRequestJobFactory.REDIRECT_URL, 302, "Found"); +        assertEquals( +                NativeTestServer.getRedirectURL(), secondRedirectResponseInfo.getUrlChain()[1]); +        checkResponseInfo( +                secondRedirectResponseInfo, NativeTestServer.getRedirectURL(), 302, "Found");          checkResponseInfoHeader(secondRedirectResponseInfo,                  "redirect-header", "header-value");          // Check final response (success.txt). -        assertEquals(MockUrlRequestJobFactory.SUCCESS_URL, -                mResponseInfo.getUrl()); +        assertEquals(NativeTestServer.getSuccessURL(), mResponseInfo.getUrl());          assertEquals(3, mResponseInfo.getUrlChain().length); -        assertEquals(MockUrlRequestJobFactory.MULTI_REDIRECT_URL, -                mResponseInfo.getUrlChain()[0]); -        assertEquals(MockUrlRequestJobFactory.REDIRECT_URL, -                mResponseInfo.getUrlChain()[1]); -        assertEquals(MockUrlRequestJobFactory.SUCCESS_URL, -                mResponseInfo.getUrlChain()[2]); +        assertEquals(NativeTestServer.getMultiRedirectURL(), mResponseInfo.getUrlChain()[0]); +        assertEquals(NativeTestServer.getRedirectURL(), mResponseInfo.getUrlChain()[1]); +        assertEquals(NativeTestServer.getSuccessURL(), mResponseInfo.getUrlChain()[2]);          assertTrue(listener.mHttpResponseDataLength != 0);          assertEquals(2, listener.mRedirectCount);          assertEquals(listener.mResponseStep, ResponseStep.ON_SUCCEEDED); @@ -469,8 +453,8 @@ public class CronetUrlRequestTest extends CronetTestBase {      @SmallTest      @Feature({"Cronet"})      public void testMockNotFound() throws Exception { -        TestUrlRequestListener listener = startAndWaitForComplete( -                MockUrlRequestJobFactory.NOTFOUND_URL); +        TestUrlRequestListener listener = +                startAndWaitForComplete(NativeTestServer.getNotFoundURL());          assertEquals(404, listener.mResponseInfo.getHttpStatusCode());          assertTrue(listener.mHttpResponseDataLength != 0);          assertEquals(0, listener.mRedirectCount); @@ -482,11 +466,9 @@ public class CronetUrlRequestTest extends CronetTestBase {      @Feature({"Cronet"})      public void testMockStartAsyncError() throws Exception {          final int arbitraryNetError = -3; -        TestUrlRequestListener listener = startAndWaitForComplete( -                mMockUrlRequestJobFactory.getMockUrlWithFailure( -                        MOCK_SUCCESS_PATH, -                        MockUrlRequestJobFactory.FailurePhase.START, -                        arbitraryNetError)); +        TestUrlRequestListener listener = +                startAndWaitForComplete(MockUrlRequestJobFactory.getMockUrlWithFailure( +                        FailurePhase.START, arbitraryNetError));          assertNull(listener.mResponseInfo);          assertNotNull(listener.mError);          assertEquals(arbitraryNetError, listener.mError.netError()); @@ -499,11 +481,9 @@ public class CronetUrlRequestTest extends CronetTestBase {      @Feature({"Cronet"})      public void testMockReadDataSyncError() throws Exception {          final int arbitraryNetError = -4; -        TestUrlRequestListener listener = startAndWaitForComplete( -                mMockUrlRequestJobFactory.getMockUrlWithFailure( -                        MOCK_SUCCESS_PATH, -                        MockUrlRequestJobFactory.FailurePhase.READ_SYNC, -                        arbitraryNetError)); +        TestUrlRequestListener listener = +                startAndWaitForComplete(MockUrlRequestJobFactory.getMockUrlWithFailure( +                        FailurePhase.READ_SYNC, arbitraryNetError));          assertEquals(200, listener.mResponseInfo.getHttpStatusCode());          assertNotNull(listener.mError);          assertEquals(arbitraryNetError, listener.mError.netError()); @@ -516,11 +496,9 @@ public class CronetUrlRequestTest extends CronetTestBase {      @Feature({"Cronet"})      public void testMockReadDataAsyncError() throws Exception {          final int arbitraryNetError = -5; -        TestUrlRequestListener listener = startAndWaitForComplete( -                mMockUrlRequestJobFactory.getMockUrlWithFailure( -                        MOCK_SUCCESS_PATH, -                        MockUrlRequestJobFactory.FailurePhase.READ_ASYNC, -                        arbitraryNetError)); +        TestUrlRequestListener listener = +                startAndWaitForComplete(MockUrlRequestJobFactory.getMockUrlWithFailure( +                        FailurePhase.READ_ASYNC, arbitraryNetError));          assertEquals(200, listener.mResponseInfo.getHttpStatusCode());          assertNotNull(listener.mError);          assertEquals(arbitraryNetError, listener.mError.netError()); @@ -662,10 +640,8 @@ public class CronetUrlRequestTest extends CronetTestBase {      public void testUnexpectedReads() throws Exception {          final TestUrlRequestListener listener = new TestUrlRequestListener();          listener.setAutoAdvance(false); -        final UrlRequest urlRequest = -                mActivity.mUrlRequestContext.createRequest( -                        MockUrlRequestJobFactory.REDIRECT_URL, listener, -                        listener.getExecutor()); +        final UrlRequest urlRequest = mActivity.mUrlRequestContext.createRequest( +                NativeTestServer.getRedirectURL(), listener, listener.getExecutor());          // Try to read before starting request.          try { @@ -730,8 +706,7 @@ public class CronetUrlRequestTest extends CronetTestBase {          }          assertEquals(listener.mResponseStep, ResponseStep.ON_SUCCEEDED); -        assertEquals(MockUrlRequestJobFactory.SUCCESS_BODY, -                listener.mResponseAsString); +        assertEquals(NativeTestServer.SUCCESS_BODY, listener.mResponseAsString);          // Try to read after request is complete.          try { @@ -748,10 +723,8 @@ public class CronetUrlRequestTest extends CronetTestBase {      public void testUnexpectedFollowRedirects() throws Exception {          final TestUrlRequestListener listener = new TestUrlRequestListener();          listener.setAutoAdvance(false); -        final UrlRequest urlRequest = -                mActivity.mUrlRequestContext.createRequest( -                        MockUrlRequestJobFactory.REDIRECT_URL, listener, -                        listener.getExecutor()); +        final UrlRequest urlRequest = mActivity.mUrlRequestContext.createRequest( +                NativeTestServer.getRedirectURL(), listener, listener.getExecutor());          // Try to follow a redirect before starting the request.          try { @@ -814,8 +787,7 @@ public class CronetUrlRequestTest extends CronetTestBase {          }          assertEquals(listener.mResponseStep, ResponseStep.ON_SUCCEEDED); -        assertEquals(MockUrlRequestJobFactory.SUCCESS_BODY, -                listener.mResponseAsString); +        assertEquals(NativeTestServer.SUCCESS_BODY, listener.mResponseAsString);          // Try to follow redirect after request is complete.          try { @@ -1269,8 +1241,7 @@ public class CronetUrlRequestTest extends CronetTestBase {          TestUrlRequestListener listener = new TestUrlRequestListener();          listener.setFailure(failureType, failureStep);          UrlRequest urlRequest = mActivity.mUrlRequestContext.createRequest( -                MockUrlRequestJobFactory.REDIRECT_URL, -                listener, listener.getExecutor()); +                NativeTestServer.getRedirectURL(), listener, listener.getExecutor());          urlRequest.start();          listener.blockForDone();          assertEquals(1, listener.mRedirectCount); @@ -1318,8 +1289,7 @@ public class CronetUrlRequestTest extends CronetTestBase {          TestUrlRequestListener listener = new TestUrlRequestListener();          listener.setFailure(FailureType.THROW_SYNC, ResponseStep.ON_SUCCEEDED);          UrlRequest urlRequest = mActivity.mUrlRequestContext.createRequest( -                MockUrlRequestJobFactory.REDIRECT_URL, -                listener, listener.getExecutor()); +                NativeTestServer.getRedirectURL(), listener, listener.getExecutor());          urlRequest.start();          listener.blockForDone();          assertEquals(1, listener.mRedirectCount); diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetHttpURLConnectionTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetHttpURLConnectionTest.java index 7332a208..2f181de 100644 --- a/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetHttpURLConnectionTest.java +++ b/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetHttpURLConnectionTest.java @@ -553,10 +553,8 @@ public class CronetHttpURLConnectionTest extends CronetTestBase {          String data = "MyBigFunkyData";          int dataLength = data.length();          int repeatCount = 100000; -        MockUrlRequestJobFactory mockUrlRequestJobFactory = new MockUrlRequestJobFactory( -                getInstrumentation().getTargetContext()); -        URL url = new URL(mockUrlRequestJobFactory.getMockUrlForData(data, -                repeatCount)); +        MockUrlRequestJobFactory.setUp(); +        URL url = new URL(MockUrlRequestJobFactory.getMockUrlForData(data, repeatCount));          HttpURLConnection connection =                  (HttpURLConnection) url.openConnection();          InputStream in = connection.getInputStream(); @@ -613,10 +611,8 @@ public class CronetHttpURLConnectionTest extends CronetTestBase {          String data = "MyBigFunkyData";          int dataLength = data.length();          int repeatCount = 100000; -        MockUrlRequestJobFactory mockUrlRequestJobFactory = new MockUrlRequestJobFactory( -                getInstrumentation().getTargetContext()); -        URL url = new URL(mockUrlRequestJobFactory.getMockUrlForData(data, -                repeatCount)); +        MockUrlRequestJobFactory.setUp(); +        URL url = new URL(MockUrlRequestJobFactory.getMockUrlForData(data, repeatCount));          HttpURLConnection connection =                  (HttpURLConnection) url.openConnection();          InputStream in = connection.getInputStream(); diff --git a/components/cronet/android/test/mock_url_request_job_factory.cc b/components/cronet/android/test/mock_url_request_job_factory.cc index 390b1e1..4a3030f 100644 --- a/components/cronet/android/test/mock_url_request_job_factory.cc +++ b/components/cronet/android/test/mock_url_request_job_factory.cc @@ -6,40 +6,23 @@  #include "base/android/jni_android.h"  #include "base/android/jni_string.h" -#include "base/files/file_path.h" -#include "base/path_service.h" -#include "base/threading/sequenced_worker_pool.h"  #include "jni/MockUrlRequestJobFactory_jni.h"  #include "net/test/url_request/url_request_failed_job.h"  #include "net/test/url_request/url_request_mock_data_job.h" -#include "net/test/url_request/url_request_mock_http_job.h"  namespace cronet { -void AddUrlInterceptors(JNIEnv* env, jclass jcaller, jstring jtest_files_root) { -  base::FilePath test_files_root( -      base::android::ConvertJavaStringToUTF8(env, jtest_files_root)); -  net::URLRequestMockHTTPJob::AddUrlHandlers( -      test_files_root, new base::SequencedWorkerPool(1, "Worker")); +void AddUrlInterceptors(JNIEnv* env, jclass jcaller) {    net::URLRequestMockDataJob::AddUrlHandler();    net::URLRequestFailedJob::AddUrlHandler();  } -jstring GetMockUrl(JNIEnv* jenv, jclass jcaller, jstring jpath) { -  base::FilePath path(base::android::ConvertJavaStringToUTF8(jenv, jpath)); -  GURL url(net::URLRequestMockHTTPJob::GetMockUrl(path)); -  return base::android::ConvertUTF8ToJavaString(jenv, url.spec()).Release(); -} -  jstring GetMockUrlWithFailure(JNIEnv* jenv,                                jclass jcaller, -                              jstring jpath,                                jint jphase,                                jint jnet_error) { -  base::FilePath path(base::android::ConvertJavaStringToUTF8(jenv, jpath)); -  GURL url(net::URLRequestMockHTTPJob::GetMockUrlWithFailure( -      path, -      static_cast<net::URLRequestMockHTTPJob::FailurePhase>(jphase), +  GURL url(net::URLRequestFailedJob::GetMockHttpUrlWithFailurePhase( +      static_cast<net::URLRequestFailedJob::FailurePhase>(jphase),        static_cast<int>(jnet_error)));    return base::android::ConvertUTF8ToJavaString(jenv, url.spec()).Release();  } diff --git a/components/cronet/android/test/src/org/chromium/net/CronetTestApplication.java b/components/cronet/android/test/src/org/chromium/net/CronetTestApplication.java index 33b86aa..4169547 100644 --- a/components/cronet/android/test/src/org/chromium/net/CronetTestApplication.java +++ b/components/cronet/android/test/src/org/chromium/net/CronetTestApplication.java @@ -22,7 +22,6 @@ public class CronetTestApplication extends Application {      public void onCreate() {          super.onCreate();          initializeApplicationParameters(this); -        TestFilesInstaller.installIfNeeded(this);      }      public static void initializeApplicationParameters(Context context) { diff --git a/components/cronet/android/test/src/org/chromium/net/MockUrlRequestJobFactory.java b/components/cronet/android/test/src/org/chromium/net/MockUrlRequestJobFactory.java index 4f328b1..325d641 100644 --- a/components/cronet/android/test/src/org/chromium/net/MockUrlRequestJobFactory.java +++ b/components/cronet/android/test/src/org/chromium/net/MockUrlRequestJobFactory.java @@ -4,64 +4,42 @@  package org.chromium.net; -import android.content.Context; +import static junit.framework.Assert.assertTrue;  import org.chromium.base.JNINamespace; +import org.chromium.net.test.FailurePhase;  /**   * Helper class to set up url interceptors for testing purposes.   */  @JNINamespace("cronet")  public final class MockUrlRequestJobFactory { -    public static final String SUCCESS_URL = -            "http://mock.http/success.txt"; -    public static final String REDIRECT_URL = -            "http://mock.http/redirect.html"; -    public static final String MULTI_REDIRECT_URL = -            "http://mock.http/multiredirect.html"; -    public static final String NOTFOUND_URL = -            "http://mock.http/notfound.html"; -    public static final String FAILED_URL = -            "http://mock.failed.request/-2"; - -    public static final String SUCCESS_BODY = "this is a text file\n"; - -    enum FailurePhase { -        START, -        READ_ASYNC, -        READ_SYNC, -    }; -      /** -     * Constructs a MockUrlRequestJobFactory and sets up mock environment. -     * @param context application context. +     * Sets up URL interceptors.       */ -    public MockUrlRequestJobFactory(Context context) { -        if (!TestFilesInstaller.areFilesInstalled(context)) { -            throw new IllegalStateException("test files not installed."); -        } -        nativeAddUrlInterceptors(TestFilesInstaller.getInstalledPath(context)); -    } - -    /** -     * Constructs a mock URL. -     * -     * @param path path to a mock file. -     */ -    public String getMockUrl(String path) { -        return nativeGetMockUrl(path); +    public static void setUp() { +        nativeAddUrlInterceptors();      }      /**       * Constructs a mock URL that hangs or fails at certain phase.       * -     * @param path path to a mock file. -     * @param phase at which request fails. +     * @param phase at which request fails. It should be a value in +     *              org.chromium.net.test.FailurePhase.       * @param netError reported by UrlRequestJob. Passing -1, results in hang.       */ -    public String getMockUrlWithFailure(String path, FailurePhase phase, -            int netError) { -        return nativeGetMockUrlWithFailure(path, phase.ordinal(), netError); +    public static String getMockUrlWithFailure(int phase, int netError) { +        assertTrue(netError < 0); +        switch (phase) { +            case FailurePhase.START: +            case FailurePhase.READ_SYNC: +            case FailurePhase.READ_ASYNC: +                break; +            default: +                throw new IllegalArgumentException( +                        "phase not in org.chromium.net.test.FailurePhase"); +        } +        return nativeGetMockUrlWithFailure(phase, netError);      }      /** @@ -71,16 +49,13 @@ public final class MockUrlRequestJobFactory {       * @param data to return in response.       * @param dataRepeatCount number of times to repeat the data.       */ -    public String getMockUrlForData(String data, int dataRepeatCount) { +    public static String getMockUrlForData(String data, int dataRepeatCount) {          return nativeGetMockUrlForData(data, dataRepeatCount);      } -    private static native void nativeAddUrlInterceptors(String installedPath); - -    private static native String nativeGetMockUrl(String path); +    private static native void nativeAddUrlInterceptors(); -    private static native String nativeGetMockUrlWithFailure(String path, -            int phase, int netError); +    private static native String nativeGetMockUrlWithFailure(int phase, int netError);      private static native String nativeGetMockUrlForData(String data,              int dataRepeatCount); diff --git a/components/cronet/android/test/src/org/chromium/net/NativeTestServer.java b/components/cronet/android/test/src/org/chromium/net/NativeTestServer.java index 329b48a..d0437b3 100644 --- a/components/cronet/android/test/src/org/chromium/net/NativeTestServer.java +++ b/components/cronet/android/test/src/org/chromium/net/NativeTestServer.java @@ -18,7 +18,11 @@ import org.chromium.base.JNINamespace;  public final class NativeTestServer {      private static final ConditionVariable sHostResolverBlock = new ConditionVariable(); +    // This variable contains the response body of a request to getSuccessURL(). +    public static final String SUCCESS_BODY = "this is a text file\n"; +      public static boolean startNativeTestServer(Context context) { +        TestFilesInstaller.installIfNeeded(context);          return nativeStartNativeTestServer(                  TestFilesInstaller.getInstalledPath(context));      } @@ -68,6 +72,25 @@ public final class NativeTestServer {          return nativeGetSdchURL();      } +    // The following URLs will make NativeTestServer serve a response based on +    // the contents of the corresponding file and its mock-http-headers file. + +    public static String getSuccessURL() { +        return nativeGetFileURL("/success.txt"); +    } + +    public static String getRedirectURL() { +        return nativeGetFileURL("/redirect.html"); +    } + +    public static String getMultiRedirectURL() { +        return nativeGetFileURL("/multiredirect.html"); +    } + +    public static String getNotFoundURL() { +        return nativeGetFileURL("/notfound.html"); +    } +      @CalledByNative      private static void onHostResolverProcRegistered() {          sHostResolverBlock.open(); diff --git a/components/cronet/android/test/src/org/chromium/net/TestFilesInstaller.java b/components/cronet/android/test/src/org/chromium/net/TestFilesInstaller.java index f5a9838..350ed25 100644 --- a/components/cronet/android/test/src/org/chromium/net/TestFilesInstaller.java +++ b/components/cronet/android/test/src/org/chromium/net/TestFilesInstaller.java @@ -50,7 +50,7 @@ public final class TestFilesInstaller {      /**       * Returns whether test files are installed.       */ -    public static boolean areFilesInstalled(Context context) { +    private static boolean areFilesInstalled(Context context) {          // Checking for file directory is fine even when new files are added,          // because the app will be re-installed and app data will be cleared.          File directory = new File(getInstalledPath(context)); diff --git a/net/android/BUILD.gn b/net/android/BUILD.gn index db15835..89cc6b3 100644 --- a/net/android/BUILD.gn +++ b/net/android/BUILD.gn @@ -10,7 +10,6 @@ android_library("net_java") {    deps = [      "//base:base_java",    ] -    srcjar_deps = [      ":net_errors_java",      ":net_android_java_enums_srcjar", @@ -29,6 +28,7 @@ android_aidl("remote_android_keystore_aidl") {  android_library("net_java_test_support") {    DEPRECATED_java_in_dir = "../test/android/javatests/src" +  srcjar_deps = [ ":net_java_test_support_enums_srcjar" ]  }  android_library("net_javatests") { @@ -50,6 +50,15 @@ java_cpp_template("net_errors_java") {    ]  } +java_cpp_enum("net_java_test_support_enums_srcjar") { +  sources = [ +    "../test/url_request/url_request_failed_job.h", +  ] +  outputs = [ +    "org/chromium/net/test/FailurePhase.java", +  ] +} +  java_cpp_enum("net_android_java_enums_srcjar") {    sources = [      "../base/mime_util.h", diff --git a/net/net.gyp b/net/net.gyp index c8907c6..bd5a1a6 100644 --- a/net/net.gyp +++ b/net/net.gyp @@ -1397,9 +1397,20 @@            'variables': {              'java_in_dir': '../net/test/android/javatests',            }, +          'dependencies': [ +            'url_request_failed_job_java', +          ],            'includes': [ '../build/java.gypi' ],          },          { +          'target_name': 'url_request_failed_job_java', +          'type': 'none', +          'variables': { +            'source_file': 'test/url_request/url_request_failed_job.h', +          }, +          'includes': [ '../build/android/java_cpp_enum.gypi' ], +        }, +        {            'target_name': 'net_javatests',            'type': 'none',            'variables': { diff --git a/net/test/url_request/url_request_failed_job.cc b/net/test/url_request/url_request_failed_job.cc index b0e2536..ce7ecb3 100644 --- a/net/test/url_request/url_request_failed_job.cc +++ b/net/test/url_request/url_request_failed_job.cc @@ -6,54 +6,140 @@  #include "base/bind.h"  #include "base/logging.h" +#include "base/macros.h"  #include "base/message_loop/message_loop.h"  #include "base/strings/string_number_conversions.h"  #include "net/base/net_errors.h" +#include "net/base/url_util.h" +#include "net/http/http_response_headers.h"  #include "net/url_request/url_request.h"  #include "net/url_request/url_request_filter.h" +#include "net/url_request/url_request_interceptor.h"  namespace net { +  namespace {  const char kMockHostname[] = "mock.failed.request"; -// Gets the numeric net error code from URL of the form: -// scheme://kMockHostname/error_code.  The error code must be a valid -// net error code, and not OK or ERR_IO_PENDING. -int GetErrorCode(URLRequest* request) { -  int net_error; -  std::string path = request->url().path(); -  if (path[0] == '/' && base::StringToInt(path.c_str() + 1, &net_error)) { -    CHECK_LT(net_error, 0); -    CHECK_NE(net_error, ERR_IO_PENDING); -    return net_error; +// String names of failure phases matching FailurePhase enum. +const char* kFailurePhase[]{ +    "start",      // START +    "readsync",   // READ_SYNC +    "readasync",  // READ_ASYNC +}; + +static_assert(arraysize(kFailurePhase) == +                  URLRequestFailedJob::FailurePhase::MAX_FAILURE_PHASE, +              "kFailurePhase must match FailurePhase enum"); + +class MockJobInterceptor : public URLRequestInterceptor { + public: +  MockJobInterceptor() {} +  ~MockJobInterceptor() override {} + +  // URLRequestJobFactory::ProtocolHandler implementation: +  URLRequestJob* MaybeInterceptRequest( +      URLRequest* request, +      NetworkDelegate* network_delegate) const override { +    int net_error = OK; +    URLRequestFailedJob::FailurePhase phase = +        URLRequestFailedJob::FailurePhase::MAX_FAILURE_PHASE; +    for (size_t i = 0; i < arraysize(kFailurePhase); i++) { +      std::string phase_error_string; +      if (GetValueForKeyInQuery(request->url(), kFailurePhase[i], +                                &phase_error_string)) { +        if (base::StringToInt(phase_error_string, &net_error)) { +          phase = static_cast<URLRequestFailedJob::FailurePhase>(i); +          break; +        } +      } +    } +    return new URLRequestFailedJob(request, network_delegate, phase, net_error);    } -  NOTREACHED(); -  return ERR_UNEXPECTED; -} + + private: +  DISALLOW_COPY_AND_ASSIGN(MockJobInterceptor); +};  GURL GetMockUrl(const std::string& scheme,                  const std::string& hostname, +                URLRequestFailedJob::FailurePhase phase,                  int net_error) { -  CHECK_LT(net_error, 0); -  CHECK_NE(net_error, ERR_IO_PENDING); -  return GURL(scheme + "://" + hostname + "/" + base::IntToString(net_error)); +  CHECK_GE(phase, URLRequestFailedJob::FailurePhase::START); +  CHECK_LE(phase, URLRequestFailedJob::FailurePhase::READ_ASYNC); +  CHECK_LT(net_error, OK); +  return GURL(scheme + "://" + hostname + "/error?" + kFailurePhase[phase] + +              "=" + base::IntToString(net_error));  }  }  // namespace  URLRequestFailedJob::URLRequestFailedJob(URLRequest* request,                                           NetworkDelegate* network_delegate, +                                         FailurePhase phase,                                           int net_error)      : URLRequestJob(request, network_delegate), +      phase_(phase),        net_error_(net_error),        weak_factory_(this) { +  CHECK_GE(phase, URLRequestFailedJob::FailurePhase::START); +  CHECK_LE(phase, URLRequestFailedJob::FailurePhase::READ_ASYNC); +  CHECK_LT(net_error, OK); +} + +URLRequestFailedJob::URLRequestFailedJob(URLRequest* request, +                                         NetworkDelegate* network_delegate, +                                         int net_error) +    : URLRequestFailedJob(request, network_delegate, START, net_error) {  }  void URLRequestFailedJob::Start() { -  base::MessageLoop::current()->PostTask( +  if (phase_ == START) { +    if (net_error_ != ERR_IO_PENDING) { +      NotifyStartError(URLRequestStatus(URLRequestStatus::FAILED, net_error_)); +      return; +    } +    SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0)); +    return; +  } +  response_info_.headers = new net::HttpResponseHeaders("HTTP/1.1 200 OK"); +  NotifyHeadersComplete(); +} + +bool URLRequestFailedJob::ReadRawData(IOBuffer* buf, +                                      int buf_size, +                                      int* bytes_read) { +  CHECK(phase_ == READ_SYNC || phase_ == READ_ASYNC); +  if (net_error_ != ERR_IO_PENDING && phase_ == READ_SYNC) { +    NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, net_error_)); +    return false; +  } + +  SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0)); + +  if (net_error_ == ERR_IO_PENDING) +    return false; + +  DCHECK_EQ(READ_ASYNC, phase_); +  DCHECK_NE(ERR_IO_PENDING, net_error_); + +  base::MessageLoopProxy::current()->PostTask(        FROM_HERE, -      base::Bind(&URLRequestFailedJob::StartAsync, weak_factory_.GetWeakPtr())); +      base::Bind(&URLRequestFailedJob::NotifyDone, weak_factory_.GetWeakPtr(), +                 URLRequestStatus(URLRequestStatus::FAILED, net_error_))); +  return false; +} + +int URLRequestFailedJob::GetResponseCode() const { +  // If we have headers, get the response code from them. +  if (response_info_.headers) +    return response_info_.headers->response_code(); +  return URLRequestJob::GetResponseCode(); +} + +void URLRequestFailedJob::GetResponseInfo(HttpResponseInfo* info) { +  *info = response_info_;  }  // static @@ -64,10 +150,14 @@ void URLRequestFailedJob::AddUrlHandler() {  // static  void URLRequestFailedJob::AddUrlHandlerForHostname(      const std::string& hostname) { -  // Add |hostname| to URLRequestFilter for HTTP and HTTPS.    URLRequestFilter* filter = URLRequestFilter::GetInstance(); -  filter->AddHostnameHandler("http", hostname, URLRequestFailedJob::Factory); -  filter->AddHostnameHandler("https", hostname, URLRequestFailedJob::Factory); +  // Add |hostname| to URLRequestFilter for HTTP and HTTPS. +  filter->AddHostnameInterceptor( +      "http", hostname, +      scoped_ptr<URLRequestInterceptor>(new MockJobInterceptor())); +  filter->AddHostnameInterceptor( +      "https", hostname, +      scoped_ptr<URLRequestInterceptor>(new MockJobInterceptor()));  }  // static @@ -81,29 +171,26 @@ GURL URLRequestFailedJob::GetMockHttpsUrl(int net_error) {  }  // static -GURL URLRequestFailedJob::GetMockHttpUrlForHostname( -    int net_error, const std::string& hostname) { -  return GetMockUrl("http", hostname, net_error); +GURL URLRequestFailedJob::GetMockHttpUrlWithFailurePhase(FailurePhase phase, +                                                         int net_error) { +  return GetMockUrl("http", kMockHostname, phase, net_error);  }  // static -GURL URLRequestFailedJob::GetMockHttpsUrlForHostname( -    int net_error, const std::string& hostname) { -  return GetMockUrl("https", hostname, net_error); +GURL URLRequestFailedJob::GetMockHttpUrlForHostname( +    int net_error, +    const std::string& hostname) { +  return GetMockUrl("http", hostname, START, net_error);  } -URLRequestFailedJob::~URLRequestFailedJob() {} -  // static -URLRequestJob* URLRequestFailedJob::Factory(URLRequest* request, -                                            NetworkDelegate* network_delegate, -                                            const std::string& scheme) { -  return new URLRequestFailedJob( -      request, network_delegate, GetErrorCode(request)); +GURL URLRequestFailedJob::GetMockHttpsUrlForHostname( +    int net_error, +    const std::string& hostname) { +  return GetMockUrl("https", hostname, START, net_error);  } -void URLRequestFailedJob::StartAsync() { -  NotifyStartError(URLRequestStatus(URLRequestStatus::FAILED, net_error_)); +URLRequestFailedJob::~URLRequestFailedJob() {  }  }  // namespace net diff --git a/net/test/url_request/url_request_failed_job.h b/net/test/url_request/url_request_failed_job.h index 4307f91..0413111 100644 --- a/net/test/url_request/url_request_failed_job.h +++ b/net/test/url_request/url_request_failed_job.h @@ -14,28 +14,56 @@  namespace net { -// This class simulates a URLRequestJob failing with a given error code while -// trying to connect. +// This class simulates a URLRequestJob failing with a given error code at +// a particular phase while trying to connect.  class URLRequestFailedJob : public URLRequestJob {   public: +  // A Java counterpart will be generated for this enum. +  // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.net.test +  enum FailurePhase { +    START = 0, +    READ_SYNC = 1, +    READ_ASYNC = 2, +    MAX_FAILURE_PHASE = 3, +  }; + +  URLRequestFailedJob(URLRequest* request, +                      NetworkDelegate* network_delegate, +                      FailurePhase phase, +                      int net_error); + +  // Same as above, except that the job fails at FailurePhase.START.    URLRequestFailedJob(URLRequest* request,                        NetworkDelegate* network_delegate,                        int net_error); +  // URLRequestJob implementation:    void Start() override; +  bool ReadRawData(IOBuffer* buf, int buf_size, int* bytes_read) override; +  int GetResponseCode() const override; +  void GetResponseInfo(HttpResponseInfo* info) override;    // Adds the testing URLs to the URLRequestFilter.    static void AddUrlHandler();    static void AddUrlHandlerForHostname(const std::string& hostname);    // Given a net error code, constructs a mock URL that will return that error -  // asynchronously when started.  |net_error| must be a valid net error code -  // other than net::OK and net::ERR_IO_PENDING. +  // asynchronously when started. |net_error| must be a valid net error code +  // other than net::OK. Passing net::ERR_IO_PENDING for |net_error| causes the +  // resulting request to hang.    static GURL GetMockHttpUrl(int net_error);    static GURL GetMockHttpsUrl(int net_error); -  // URLRequestFailedJob must be added as a handler for |hostname| for -  // the returned URL to return |net_error|. +  // Constructs a mock URL that reports |net_error| at given |phase| of the +  // request. |net_error| must be a valid net error code other than net::OK. +  // Passing net::ERR_IO_PENDING for |net_error| causes the resulting request to +  // hang. +  static GURL GetMockHttpUrlWithFailurePhase(FailurePhase phase, int net_error); + +  // Given a net error code and a host name, constructs a mock URL that will +  // return that error asynchronously when started. |net_error| must be a valid +  // net error code other than net::OK. Passing net::ERR_IO_PENDING for +  // |net_error| causes the resulting request to hang.    static GURL GetMockHttpUrlForHostname(int net_error,                                          const std::string& hostname);    static GURL GetMockHttpsUrlForHostname(int net_error, @@ -45,13 +73,8 @@ class URLRequestFailedJob : public URLRequestJob {    ~URLRequestFailedJob() override;   private: -  static URLRequestJob* Factory(URLRequest* request, -                                NetworkDelegate* network_delegate, -                                const std::string& scheme); - -  // Simulate a failure. -  void StartAsync(); - +  HttpResponseInfo response_info_; +  const FailurePhase phase_;    const int net_error_;    base::WeakPtrFactory<URLRequestFailedJob> weak_factory_; diff --git a/net/test/url_request/url_request_mock_http_job.cc b/net/test/url_request/url_request_mock_http_job.cc index 012a335..b7b4cdb 100644 --- a/net/test/url_request/url_request_mock_http_job.cc +++ b/net/test/url_request/url_request_mock_http_job.cc @@ -28,13 +28,6 @@ const char kMockHostname[] = "mock.http";  const base::FilePath::CharType kMockHeaderFileSuffix[] =      FILE_PATH_LITERAL(".mock-http-headers"); -// String names of failure phases matching FailurePhase enum. -const char* kFailurePhase[] { -  "start",      // START -  "readasync",  // READ_ASYNC -  "readsync",   // READ_SYNC -}; -  class MockJobInterceptor : public URLRequestInterceptor {   public:    // When |map_all_requests_to_base_path| is true, all request should return the @@ -132,22 +125,6 @@ GURL URLRequestMockHTTPJob::GetMockHttpsUrl(const base::FilePath& path) {  }  // static -GURL URLRequestMockHTTPJob::GetMockUrlWithFailure(const base::FilePath& path, -                                                  FailurePhase phase, -                                                  int net_error) { -  static_assert(arraysize(kFailurePhase) == MAX_FAILURE_PHASE, -                "kFailurePhase must match FailurePhase enum"); -  DCHECK_GE(phase, START); -  DCHECK_LE(phase, READ_SYNC); -  std::string url(GetMockUrl(path).spec()); -  url.append("?"); -  url.append(kFailurePhase[phase]); -  url.append("="); -  url.append(base::IntToString(net_error)); -  return GURL(url); -} - -// static  scoped_ptr<URLRequestInterceptor> URLRequestMockHTTPJob::CreateInterceptor(      const base::FilePath& base_path,      const scoped_refptr<base::SequencedWorkerPool>& worker_pool) { @@ -192,8 +169,6 @@ bool URLRequestMockHTTPJob::IsRedirectResponse(GURL* location,  // Public virtual version.  void URLRequestMockHTTPJob::Start() { -  if (MaybeReportErrorOnPhase(START)) -    return;    base::PostTaskAndReplyWithResult(        task_runner_.get(),        FROM_HERE, @@ -202,20 +177,7 @@ void URLRequestMockHTTPJob::Start() {                   weak_ptr_factory_.GetWeakPtr()));  } -// Public virtual version. -bool URLRequestMockHTTPJob::ReadRawData(IOBuffer* buf, -                                        int buf_size, -                                        int* bytes_read) { -  if (MaybeReportErrorOnPhase(READ_SYNC)) -    return false; -  if (MaybeReportErrorOnPhase(READ_ASYNC)) -    return false; -  return URLRequestFileJob::ReadRawData(buf, buf_size, bytes_read); -} -  void URLRequestMockHTTPJob::SetHeadersAndStart(const std::string& raw_headers) { -  if (MaybeReportErrorOnPhase(START)) -    return;    raw_headers_ = raw_headers;    // Handle CRLF line-endings.    ReplaceSubstringsAfterOffset(&raw_headers_, 0, "\r\n", "\n"); @@ -224,39 +186,6 @@ void URLRequestMockHTTPJob::SetHeadersAndStart(const std::string& raw_headers) {    URLRequestFileJob::Start();  } -bool URLRequestMockHTTPJob::MaybeReportErrorOnPhase( -    FailurePhase current_phase) { -  DCHECK_GE(current_phase, START); -  DCHECK_LE(current_phase, READ_SYNC); -  std::string phase_key(kFailurePhase[current_phase]); -  std::string phase_error_string; -  if (!GetValueForKeyInQuery(request_->url(), phase_key, &phase_error_string)) -    return false; - -  int net_error; -  if (!base::StringToInt(phase_error_string, &net_error)) -    return false; - -  if (net_error != ERR_IO_PENDING && -      (current_phase == START || current_phase == READ_SYNC)) { -    NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, net_error)); -    return true; -  } - -  SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0)); - -  if (current_phase != READ_ASYNC) -    return true; - -  base::MessageLoopProxy::current()->PostTask( -      FROM_HERE, -      base::Bind(&URLRequestMockHTTPJob::NotifyDone, -                 weak_ptr_factory_.GetWeakPtr(), -                 URLRequestStatus(URLRequestStatus::FAILED, net_error))); - -  return true; -} -  // Private const version.  void URLRequestMockHTTPJob::GetResponseInfoConst(HttpResponseInfo* info) const {    info->headers = new HttpResponseHeaders(raw_headers_); diff --git a/net/test/url_request/url_request_mock_http_job.h b/net/test/url_request/url_request_mock_http_job.h index 61d5069..06c3100 100644 --- a/net/test/url_request/url_request_mock_http_job.h +++ b/net/test/url_request/url_request_mock_http_job.h @@ -28,13 +28,6 @@ namespace net {  class URLRequestMockHTTPJob : public URLRequestFileJob {   public: -  enum FailurePhase { -    START = 0, -    READ_ASYNC = 1, -    READ_SYNC = 2, -    MAX_FAILURE_PHASE = 3, -  }; -    // Note that all file IO is done using |worker_pool|.    URLRequestMockHTTPJob(URLRequest* request,                          NetworkDelegate* network_delegate, @@ -42,7 +35,6 @@ class URLRequestMockHTTPJob : public URLRequestFileJob {                          const scoped_refptr<base::TaskRunner>& task_runner);    void Start() override; -  bool ReadRawData(IOBuffer* buf, int buf_size, int* bytes_read) override;    bool GetMimeType(std::string* mime_type) const override;    int GetResponseCode() const override;    bool GetCharset(std::string* charset) override; @@ -59,13 +51,6 @@ class URLRequestMockHTTPJob : public URLRequestFileJob {    static GURL GetMockUrl(const base::FilePath& path);    static GURL GetMockHttpsUrl(const base::FilePath& path); -  // Given the path to a file relative to the path passed to AddUrlHandler(), -  // construct a mock URL that reports |net_error| at given |phase| of the -  // request. Reporting |net_error| ERR_IO_PENDING results in a hung request. -  static GURL GetMockUrlWithFailure(const base::FilePath& path, -                                    FailurePhase phase, -                                    int net_error); -    // Returns a URLRequestJobFactory::ProtocolHandler that serves    // URLRequestMockHTTPJob's responding like an HTTP server. |base_path| is the    // file path leading to the root of the directory to use as the root of the @@ -87,11 +72,6 @@ class URLRequestMockHTTPJob : public URLRequestFileJob {   private:    void GetResponseInfoConst(HttpResponseInfo* info) const;    void SetHeadersAndStart(const std::string& raw_headers); -  // Checks query part of request url, and reports an error if it matches. -  // Error is parsed out from the query and is reported synchronously. -  // Reporting ERR_IO_PENDING results in a hung request. -  // The "readasync" error is posted asynchronously. -  bool MaybeReportErrorOnPhase(FailurePhase phase);    std::string raw_headers_;    const scoped_refptr<base::TaskRunner> task_runner_; | 
