summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorxunjieli <xunjieli@chromium.org>2015-05-07 09:48:14 -0700
committerCommit bot <commit-bot@chromium.org>2015-05-07 16:48:53 +0000
commitd26defc009990bc77a193d9c8cbd827cb87c6dc7 (patch)
treecf8b88f28c208745dc8ea287fda5f0c423426f3e
parentd2668bf5bd2bcebb73e37c127386b619d4907fcc (diff)
downloadchromium_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}
-rw-r--r--chrome/browser/net/certificate_error_reporter_unittest.cc10
-rw-r--r--chrome/test/data/captive_portal/iframe_timeout.html2
-rw-r--r--chrome/test/data/iframe_dns_error.html2
-rw-r--r--components/cronet.gypi19
-rw-r--r--components/cronet/android/test/javatests/src/org/chromium/net/ChromiumUrlRequestTest.java (renamed from components/cronet/android/test/javatests/src/org/chromium/net/MockUrlRequestJobTest.java)66
-rw-r--r--components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestTest.java120
-rw-r--r--components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetHttpURLConnectionTest.java12
-rw-r--r--components/cronet/android/test/mock_url_request_job_factory.cc23
-rw-r--r--components/cronet/android/test/src/org/chromium/net/CronetTestApplication.java1
-rw-r--r--components/cronet/android/test/src/org/chromium/net/MockUrlRequestJobFactory.java69
-rw-r--r--components/cronet/android/test/src/org/chromium/net/NativeTestServer.java23
-rw-r--r--components/cronet/android/test/src/org/chromium/net/TestFilesInstaller.java2
-rw-r--r--net/android/BUILD.gn11
-rw-r--r--net/net.gyp11
-rw-r--r--net/test/url_request/url_request_failed_job.cc159
-rw-r--r--net/test/url_request/url_request_failed_job.h49
-rw-r--r--net/test/url_request/url_request_mock_http_job.cc71
-rw-r--r--net/test/url_request/url_request_mock_http_job.h20
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_;