Chromium Code Reviews| Index: components/cronet/android/test/javatests/src/org/chromium/cronet_test_apk/CronetUrlRequestTest.java |
| diff --git a/components/cronet/android/test/javatests/src/org/chromium/cronet_test_apk/CronetUrlRequestTest.java b/components/cronet/android/test/javatests/src/org/chromium/cronet_test_apk/CronetUrlRequestTest.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..5aca2072a2d3418f0f532190187521156e8a6fab |
| --- /dev/null |
| +++ b/components/cronet/android/test/javatests/src/org/chromium/cronet_test_apk/CronetUrlRequestTest.java |
| @@ -0,0 +1,416 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +package org.chromium.cronet_test_apk; |
| + |
| +import android.os.ConditionVariable; |
| + |
| +import android.test.suitebuilder.annotation.SmallTest; |
| + |
| +import org.chromium.base.test.util.Feature; |
| +import org.chromium.net.ExtendedResponseInfo; |
| +import org.chromium.net.ResponseInfo; |
| +import org.chromium.net.UrlRequest; |
| +import org.chromium.net.UrlRequestException; |
| +import org.chromium.net.UrlRequestListener; |
| + |
| +import java.net.URL; |
| +import java.nio.ByteBuffer; |
| +import java.util.concurrent.ExecutorService; |
| +import java.util.concurrent.Executors; |
| + |
| +/** |
| + * Test basic functionality of UrlRequest. |
| + */ |
| +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 static final String MOCK_CRONET_TEST_SUCCESS_URL = |
| + "http://mock.http/success.txt"; |
| + private static final String MOCK_CRONET_TEST_REDIRECT_URL = |
| + "http://mock.http/redirect.html"; |
| + private static final String MOCK_CRONET_TEST_NOTFOUND_URL = |
| + "http://mock.http/notfound.html"; |
| + private static final String MOCK_CRONET_TEST_FAILED_URL = |
| + "http://mock.failed.request/-2"; |
| + |
| + // Executor for Cronet callbacks |
|
mmenke
2014/10/20 21:07:29
nit: +.
mef
2014/10/21 21:27:47
Done.
|
| + ExecutorService mExecutor = Executors.newSingleThreadExecutor(); |
| + CronetTestActivity mActivity; |
| + |
| + class SimpleUrlRequestListener implements UrlRequestListener { |
| + ConditionVariable mComplete = new ConditionVariable(); |
|
mmenke
2014/10/20 21:07:29
nit: Suggest a blank line between public and non-
mmenke
2014/10/20 21:07:29
+private? Without it, I'm not sure if the outer c
mef
2014/10/21 21:27:47
Done.
|
| + public ResponseInfo mResponseInfo; |
| + public UrlRequestException mError; |
| + |
| + public int mHttpResponseDataLength = 0; |
| + |
| + public boolean mOnRedirectCalled = false; |
| + public boolean mOnResponseStartedCalled = false; |
| + public boolean mOnDataReceivedCalled = false; |
| + public boolean mOnCompleteCalled = false; |
| + public boolean mOnErrorCalled = false; |
| + |
| + public SimpleUrlRequestListener() { |
| + } |
| + |
| + @Override |
| + public void onRedirect(UrlRequest request, |
| + ResponseInfo info, |
| + URL newLocation) { |
| + mOnRedirectCalled = true; |
|
mmenke
2014/10/20 21:07:29
Check that mOnResponseStartedCalled is false? (Si
mmenke
2014/10/20 21:07:29
Should keep a count here, or better, a list of the
mmenke
2014/10/20 21:07:29
Should check if request == the request we got when
mef
2014/10/22 20:50:05
Done.
|
| + } |
| + |
| + @Override |
| + public void onResponseStarted(UrlRequest request, ResponseInfo info) { |
| + mOnResponseStartedCalled = true; |
| + mResponseInfo = info; |
| + } |
| + |
| + @Override |
| + public void onDataReceived(UrlRequest request, |
| + ResponseInfo info, |
| + ByteBuffer byteBuffer) { |
| + mOnDataReceivedCalled = true; |
| + mHttpResponseDataLength += byteBuffer.capacity(); |
| + } |
| + |
| + @Override |
| + public void onComplete(UrlRequest request, ExtendedResponseInfo info) { |
| + mOnCompleteCalled = true; |
| + mComplete.open(); |
| + } |
| + |
| + @Override |
| + public void onError(UrlRequest request, |
| + ResponseInfo info, |
| + UrlRequestException error) { |
| + mOnErrorCalled = true; |
| + mError = error; |
| + mComplete.open(); |
| + } |
| + |
| + public void blockForComplete() { |
| + mComplete.block(); |
| + } |
| + |
| + public void resetComplete() { |
|
mmenke
2014/10/20 21:07:29
Not used.
mef
2014/10/21 21:27:47
Done.
|
| + mComplete.close(); |
| + } |
| + } |
| + |
| + @Override |
| + protected void setUp() throws Exception { |
| + super.setUp(); |
| + mActivity = launchCronetTestApp(); |
| + // Make sure the activity was created as expected. |
| + waitForActiveShellToBeDoneLoading(); |
| + // AddUrlInterceptors() after native application context is initialized. |
| + MockUrlRequestJobUtil.addUrlInterceptors(); |
| + } |
| + |
| + public SimpleUrlRequestListener startAndWaitForComplete(String url) |
| + throws Exception { |
| + SimpleUrlRequestListener listener = new SimpleUrlRequestListener(); |
| + // Create request. |
| + UrlRequest urlRequest = mActivity.mUrlRequestFactory.createRequest( |
| + url, listener, mExecutor); |
| + urlRequest.start(); |
| + listener.blockForComplete(); |
| + return listener; |
| + } |
| + |
| + @SmallTest |
| + @Feature({"Cronet"}) |
| + public void testSimpleGet() throws Exception { |
| + SimpleUrlRequestListener listener = startAndWaitForComplete(TEST_URL); |
| + assertEquals(200, listener.mResponseInfo.getHttpStatusCode()); |
| + assertTrue(listener.mHttpResponseDataLength != 0); |
|
mmenke
2014/10/20 21:07:29
Should check all the fields of ResponseInfo, and t
|
| + } |
| + |
| + @SmallTest |
| + @Feature({"Cronet"}) |
| + public void testMockSuccess() throws Exception { |
| + SimpleUrlRequestListener listener = startAndWaitForComplete( |
| + MOCK_CRONET_TEST_SUCCESS_URL); |
| + assertEquals(200, listener.mResponseInfo.getHttpStatusCode()); |
| + assertTrue(listener.mHttpResponseDataLength != 0); |
| + } |
| + |
| + @SmallTest |
| + @Feature({"Cronet"}) |
| + public void testMockRedirect() throws Exception { |
| + SimpleUrlRequestListener listener = startAndWaitForComplete( |
| + MOCK_CRONET_TEST_REDIRECT_URL); |
| + ResponseInfo mResponseInfo = listener.mResponseInfo; |
| + assertTrue(listener.mOnRedirectCalled); |
| + assertEquals(200, mResponseInfo.getHttpStatusCode()); |
| + assertEquals(MOCK_CRONET_TEST_SUCCESS_URL, |
| + mResponseInfo.getUrl()); |
| + assertEquals(2, mResponseInfo.getUrlChain().length); |
| + assertEquals(MOCK_CRONET_TEST_REDIRECT_URL, |
| + mResponseInfo.getUrlChain()[0]); |
| + assertEquals(MOCK_CRONET_TEST_SUCCESS_URL, |
| + mResponseInfo.getUrlChain()[1]); |
| + assertTrue(listener.mHttpResponseDataLength != 0); |
| + } |
| + |
| + @SmallTest |
| + @Feature({"Cronet"}) |
| + public void testMockNotFound() throws Exception { |
| + SimpleUrlRequestListener listener = startAndWaitForComplete( |
| + MOCK_CRONET_TEST_NOTFOUND_URL); |
| + assertEquals(404, listener.mResponseInfo.getHttpStatusCode()); |
| + assertTrue(listener.mHttpResponseDataLength != 0); |
| + } |
| + |
| + @SmallTest |
| + @Feature({"Cronet"}) |
| + public void testMockFailed() throws Exception { |
|
mmenke
2014/10/20 21:07:29
I believe this effectively just tests the same cas
mef
2014/10/22 20:50:05
Yes, but using different mock jobs.
|
| + SimpleUrlRequestListener listener = startAndWaitForComplete( |
| + MOCK_CRONET_TEST_FAILED_URL); |
| + assertEquals(null, listener.mResponseInfo); |
| + assertEquals(0, listener.mHttpResponseDataLength); |
| + assertNotNull(listener.mError); |
| + assertEquals(-2, listener.mError.netError()); |
| + } |
| + |
| + @SmallTest |
| + @Feature({"Cronet"}) |
| + public void testMockStartSyncError() throws Exception { |
|
mmenke
2014/10/20 21:07:29
This is actually async.
mef
2014/10/22 20:50:05
Done.
|
| + SimpleUrlRequestListener listener = startAndWaitForComplete( |
| + MockUrlRequestJobUtil.getMockUrlWithFailure( |
| + MOCK_SUCCESS_PATH, |
| + MockUrlRequestJobUtil.FailurePhase.START, |
| + -3)); |
| + assertNull(listener.mResponseInfo); |
| + assertNotNull(listener.mError); |
| + assertEquals(-3, listener.mError.netError()); |
| + assertFalse(listener.mOnRedirectCalled); |
| + assertFalse(listener.mOnResponseStartedCalled); |
| + assertFalse(listener.mOnDataReceivedCalled); |
| + assertFalse(listener.mOnCompleteCalled); |
| + assertTrue(listener.mOnErrorCalled); |
| + } |
| + |
| + @SmallTest |
| + @Feature({"Cronet"}) |
| + public void testMockReadDataSyncError() throws Exception { |
| + SimpleUrlRequestListener listener = startAndWaitForComplete( |
| + MockUrlRequestJobUtil.getMockUrlWithFailure( |
| + MOCK_SUCCESS_PATH, |
| + MockUrlRequestJobUtil.FailurePhase.READ_SYNC, |
| + -5)); |
| + assertEquals(200, listener.mResponseInfo.getHttpStatusCode()); |
| + assertNotNull(listener.mError); |
| + assertEquals(-5, listener.mError.netError()); |
| + assertFalse(listener.mOnRedirectCalled); |
| + assertTrue(listener.mOnResponseStartedCalled); |
| + assertFalse(listener.mOnDataReceivedCalled); |
| + assertFalse(listener.mOnCompleteCalled); |
| + assertTrue(listener.mOnErrorCalled); |
| + } |
| + |
| + @SmallTest |
| + @Feature({"Cronet"}) |
| + public void testMockReadDataAsyncError() throws Exception { |
| + SimpleUrlRequestListener listener = startAndWaitForComplete( |
| + MockUrlRequestJobUtil.getMockUrlWithFailure( |
| + MOCK_SUCCESS_PATH, |
| + MockUrlRequestJobUtil.FailurePhase.READ_ASYNC, |
| + -5)); |
| + assertEquals(200, listener.mResponseInfo.getHttpStatusCode()); |
| + assertNotNull(listener.mError); |
| + assertEquals(-5, listener.mError.netError()); |
| + assertFalse(listener.mOnRedirectCalled); |
| + assertTrue(listener.mOnResponseStartedCalled); |
| + assertFalse(listener.mOnDataReceivedCalled); |
| + assertFalse(listener.mOnCompleteCalled); |
| + assertTrue(listener.mOnErrorCalled); |
| + } |
| + |
| + class CancelingUrlRequestListener extends SimpleUrlRequestListener { |
| + public boolean mCancelAfterRedirect = false; |
| + public boolean mCancelAfterResponseStarted = false; |
| + public boolean mCancelAfterDataReceived = false; |
| + |
| + public boolean mCancelFromRedirect = false; |
| + public boolean mCancelFromResponseStarted = false; |
| + public boolean mCancelFromDataReceived = false; |
|
mmenke
2014/10/20 21:07:29
My suggestion: Use one bool to indicate sync vs a
mef
2014/10/21 21:27:47
Done.
|
| + |
| + public CancelingUrlRequestListener() { |
| + } |
| + |
| + @Override |
| + public void onRedirect(UrlRequest request, |
| + ResponseInfo info, |
| + URL newLocation) { |
| + super.onRedirect(request, info, newLocation); |
| + if (mCancelFromRedirect) { |
| + request.cancel(); |
| + mComplete.open(); |
| + } |
| + maybePostCancel(request, mCancelAfterRedirect); |
| + } |
| + |
| + @Override |
| + public void onResponseStarted(UrlRequest request, ResponseInfo info) { |
| + super.onResponseStarted(request, info); |
| + if (mCancelFromResponseStarted) { |
| + request.cancel(); |
| + mComplete.open(); |
| + } |
| + maybePostCancel(request, mCancelAfterResponseStarted); |
| + } |
| + |
| + @Override |
| + public void onDataReceived(UrlRequest request, |
| + ResponseInfo info, |
| + ByteBuffer byteBuffer) { |
| + super.onDataReceived(request, info, byteBuffer); |
| + if (mCancelFromDataReceived) { |
| + request.cancel(); |
| + mComplete.open(); |
| + } |
| + maybePostCancel(request, mCancelAfterDataReceived); |
| + } |
| + |
| + void maybePostCancel(final UrlRequest request, boolean doPostCancel) { |
| + if (doPostCancel) { |
| + Runnable task = new Runnable() { |
| + public void run() { |
| + request.cancel(); |
| + mComplete.open(); |
| + } |
| + }; |
| + mExecutor.execute(task); |
| + } |
| + } |
| + } |
| + |
| + @SmallTest |
| + @Feature({"Cronet"}) |
| + public void testCancelAfterOnRedirect() throws Exception { |
| + CancelingUrlRequestListener listener = |
| + new CancelingUrlRequestListener(); |
| + listener.mCancelAfterRedirect = true; |
| + UrlRequest urlRequest = mActivity.mUrlRequestFactory.createRequest( |
| + MOCK_CRONET_TEST_REDIRECT_URL, listener, mExecutor); |
| + urlRequest.start(); |
| + listener.blockForComplete(); |
| + assertNull(listener.mResponseInfo); |
| + assertNull(listener.mError); |
| + assertTrue(listener.mOnRedirectCalled); |
| + assertFalse(listener.mOnResponseStartedCalled); |
| + assertFalse(listener.mOnDataReceivedCalled); |
| + assertFalse(listener.mOnCompleteCalled); |
| + assertFalse(listener.mOnErrorCalled); |
| + assertTrue(urlRequest.isCanceled()); |
| + } |
| + |
| + @SmallTest |
| + @Feature({"Cronet"}) |
| + public void testCancelAfterOnResponseStarted() throws Exception { |
| + CancelingUrlRequestListener listener = |
| + new CancelingUrlRequestListener(); |
| + listener.mCancelAfterResponseStarted = true; |
| + UrlRequest urlRequest = mActivity.mUrlRequestFactory.createRequest( |
| + MOCK_CRONET_TEST_REDIRECT_URL, listener, mExecutor); |
| + urlRequest.start(); |
| + listener.blockForComplete(); |
| + assertNotNull(listener.mResponseInfo); |
| + assertNull(listener.mError); |
| + assertTrue(listener.mOnRedirectCalled); |
| + assertTrue(listener.mOnResponseStartedCalled); |
| + assertFalse(listener.mOnDataReceivedCalled); |
| + assertFalse(listener.mOnCompleteCalled); |
| + assertFalse(listener.mOnErrorCalled); |
| + assertTrue(urlRequest.isCanceled()); |
| + } |
| + |
| + @SmallTest |
| + @Feature({"Cronet"}) |
| + public void testCancelAfterOnDataReceived() throws Exception { |
| + CancelingUrlRequestListener listener = |
| + new CancelingUrlRequestListener(); |
| + listener.mCancelAfterDataReceived = true; |
| + // Create request. |
| + UrlRequest urlRequest = mActivity.mUrlRequestFactory.createRequest( |
| + MOCK_CRONET_TEST_REDIRECT_URL, listener, mExecutor); |
| + urlRequest.start(); |
| + listener.blockForComplete(); |
| + assertNotNull(listener.mResponseInfo); |
| + assertNull(listener.mError); |
| + assertTrue(listener.mOnRedirectCalled); |
| + assertTrue(listener.mOnResponseStartedCalled); |
| + assertTrue(listener.mOnDataReceivedCalled); |
| + assertFalse(listener.mOnCompleteCalled); |
| + assertFalse(listener.mOnErrorCalled); |
| + assertTrue(urlRequest.isCanceled()); |
| + } |
| + |
| + |
| + @SmallTest |
| + @Feature({"Cronet"}) |
| + public void testCancelFromOnRedirect() throws Exception { |
| + CancelingUrlRequestListener listener = |
| + new CancelingUrlRequestListener(); |
| + listener.mCancelFromRedirect = true; |
| + UrlRequest urlRequest = mActivity.mUrlRequestFactory.createRequest( |
| + MOCK_CRONET_TEST_REDIRECT_URL, listener, mExecutor); |
| + urlRequest.start(); |
| + listener.blockForComplete(); |
| + assertNull(listener.mResponseInfo); |
| + assertNull(listener.mError); |
| + assertTrue(listener.mOnRedirectCalled); |
| + assertFalse(listener.mOnResponseStartedCalled); |
| + assertFalse(listener.mOnDataReceivedCalled); |
| + assertFalse(listener.mOnCompleteCalled); |
| + assertFalse(listener.mOnErrorCalled); |
| + assertTrue(urlRequest.isCanceled()); |
| + } |
| + |
| + @SmallTest |
| + @Feature({"Cronet"}) |
| + public void testCancelFromOnResponseStarted() throws Exception { |
| + CancelingUrlRequestListener listener = |
| + new CancelingUrlRequestListener(); |
| + listener.mCancelFromResponseStarted = true; |
| + UrlRequest urlRequest = mActivity.mUrlRequestFactory.createRequest( |
| + MOCK_CRONET_TEST_REDIRECT_URL, listener, mExecutor); |
| + urlRequest.start(); |
| + listener.blockForComplete(); |
| + assertNotNull(listener.mResponseInfo); |
| + assertNull(listener.mError); |
| + assertTrue(listener.mOnRedirectCalled); |
| + assertTrue(listener.mOnResponseStartedCalled); |
| + assertFalse(listener.mOnDataReceivedCalled); |
| + assertFalse(listener.mOnCompleteCalled); |
| + assertFalse(listener.mOnErrorCalled); |
| + assertTrue(urlRequest.isCanceled()); |
| + } |
| + |
| + @SmallTest |
| + @Feature({"Cronet"}) |
| + public void testCancelFromOnDataReceived() throws Exception { |
| + CancelingUrlRequestListener listener = |
| + new CancelingUrlRequestListener(); |
| + listener.mCancelFromDataReceived = true; |
| + // Create request. |
| + UrlRequest urlRequest = mActivity.mUrlRequestFactory.createRequest( |
| + MOCK_CRONET_TEST_REDIRECT_URL, listener, mExecutor); |
| + urlRequest.start(); |
| + listener.blockForComplete(); |
| + assertNotNull(listener.mResponseInfo); |
| + assertNull(listener.mError); |
| + assertTrue(listener.mOnRedirectCalled); |
| + assertTrue(listener.mOnResponseStartedCalled); |
| + assertTrue(listener.mOnDataReceivedCalled); |
| + assertFalse(listener.mOnCompleteCalled); |
| + assertFalse(listener.mOnErrorCalled); |
| + assertTrue(urlRequest.isCanceled()); |
|
mmenke
2014/10/20 21:23:04
Hrm...Is there some way to validate the request wa
|
| + } |
|
mmenke
2014/10/20 21:23:05
Since we're handling it, should have yet another s
mef
2014/10/22 20:50:05
Done.
|
| +} |