Index: components/cronet/android/test/javatests/src/org/chromium/cronet_test_apk/MockUrlRequestJobTest.java |
diff --git a/components/cronet/android/test/javatests/src/org/chromium/cronet_test_apk/MockUrlRequestJobTest.java b/components/cronet/android/test/javatests/src/org/chromium/cronet_test_apk/MockUrlRequestJobTest.java |
index b271c7d81a0827baab755abfdffa08b2f78b7521..32488ed888cc04a7fcf2c61a4687be9639b79cbd 100644 |
--- a/components/cronet/android/test/javatests/src/org/chromium/cronet_test_apk/MockUrlRequestJobTest.java |
+++ b/components/cronet/android/test/javatests/src/org/chromium/cronet_test_apk/MockUrlRequestJobTest.java |
@@ -4,13 +4,18 @@ |
package org.chromium.cronet_test_apk; |
+import android.test.suitebuilder.annotation.LargeTest; |
import android.test.suitebuilder.annotation.SmallTest; |
import org.chromium.base.test.util.Feature; |
+import org.chromium.net.ChunkedWritableByteChannel; |
import org.chromium.net.HttpUrlRequest; |
+import java.io.IOException; |
+import java.nio.ByteBuffer; |
import java.util.HashMap; |
import java.util.List; |
+import java.util.concurrent.Executors; |
/** |
* Tests that use mock URLRequestJobs to simulate URL requests. |
@@ -128,4 +133,120 @@ public class MockUrlRequestJobTest extends CronetTestBase { |
+ "redirects have been disabled", |
listener.mException.getMessage()); |
} |
+ |
+ /** |
+ * TestByteChannel is used for making sure write is not called after the |
+ * channel has been closed. Can synchronously cancel a request when write is |
+ * called. |
+ */ |
+ static class TestByteChannel extends ChunkedWritableByteChannel { |
+ boolean mIsOpen = true; |
+ HttpUrlRequest mRequestToCancelOnWrite; |
+ |
+ @Override |
+ public int write(ByteBuffer byteBuffer) throws IOException { |
+ assertTrue(isOpen()); |
mmenke
2014/12/10 20:59:14
Should we also be asserting mRequestToCancelOnWrit
mef
2014/12/10 23:23:35
Done.
|
+ if (mRequestToCancelOnWrite != null) { |
+ mRequestToCancelOnWrite.cancel(); |
mmenke
2014/12/10 20:59:14
Should we also have a test where we do this on the
mef
2014/12/10 23:23:35
Hmm, could you elaborate on that?
mmenke
2014/12/11 01:09:19
Run a that cancels on the current thread, and make
|
+ } |
+ return super.write(byteBuffer); |
+ } |
+ |
+ @Override |
+ public void close() { |
+ assertTrue(isOpen()); |
+ mIsOpen = false; |
+ super.close(); |
+ } |
+ |
+ @Override |
+ public boolean isOpen() { |
mmenke
2014/12/10 20:59:14
Do we need this, or mIsOpen? The super class alre
mef
2014/12/10 23:23:34
Done.
|
+ return mIsOpen; |
+ } |
+ |
+ /** |
+ * Set request that will be synchronously canceled when write is called. |
+ */ |
+ public void setRequestToCancelOnWrite(HttpUrlRequest request) { |
+ mRequestToCancelOnWrite = request; |
+ } |
+ } |
+ |
+ @LargeTest |
+ @Feature({"Cronet"}) |
+ public void testWriteAfterCancel() throws Exception { |
mmenke
2014/12/10 20:59:14
Think this test name and the next are confusing:
mef
2014/12/10 23:23:35
Done.
|
+ CronetTestActivity activity = launchCronetTestApp(); |
+ |
+ // This test verifies that WritableByteChannel.write is not called after |
+ // WritableByteChannel.close if request is canceled from another |
+ // thread. |
+ for (int i = 0; i < 100; ++i) { |
+ HashMap<String, String> headers = new HashMap<String, String>(); |
+ TestByteChannel channel = new TestByteChannel(); |
+ TestHttpUrlRequestListener listener = |
+ new TestHttpUrlRequestListener(); |
+ |
+ // Create request. |
+ final HttpUrlRequest request = |
+ activity.mRequestFactory.createRequest( |
+ MockUrlRequestJobFactory.SUCCESS_URL, |
+ HttpUrlRequest.REQUEST_PRIORITY_LOW, headers, |
+ channel, listener); |
+ request.start(); |
+ listener.blockForStart(); |
+ Runnable cancelTask = new Runnable() { |
+ public void run() { |
+ request.cancel(); |
+ } |
+ }; |
+ Executors.newCachedThreadPool().execute(cancelTask); |
+ listener.blockForComplete(); |
mmenke
2014/12/10 20:59:14
Assert that the byte channel is closed? Could do
mef
2014/12/10 23:23:34
Done.
|
+ } |
+ } |
+ |
+ @SmallTest |
+ @Feature({"Cronet"}) |
+ public void testCancelDuringWrite() throws Exception { |
+ CronetTestActivity activity = launchCronetTestApp(); |
+ |
+ HashMap<String, String> headers = new HashMap<String, String>(); |
+ TestByteChannel channel = new TestByteChannel(); |
+ TestHttpUrlRequestListener listener = new TestHttpUrlRequestListener(); |
+ |
+ String data = "MyBigFunkyData"; |
+ int dataLength = data.length(); |
+ int repeatCount = 10000; |
+ String mockUrl = mMockUrlRequestJobFactory.getMockUrlForData(data, |
+ repeatCount); |
+ |
+ // Create request. |
+ final HttpUrlRequest request = |
+ activity.mRequestFactory.createRequest( |
+ mockUrl, |
+ HttpUrlRequest.REQUEST_PRIORITY_LOW, headers, |
+ channel, listener); |
+ // Channel will cancel the request from the network thread during write. |
mmenke
2014/12/10 20:59:14
"during the first write"?
mef
2014/12/10 23:23:35
Done.
|
+ channel.setRequestToCancelOnWrite(request); |
+ request.start(); |
+ listener.blockForComplete(); |
+ assertTrue(request.isCanceled()); |
+ } |
+ |
+ @SmallTest |
+ @Feature({"Cronet"}) |
+ public void testBigDataSyncReadRequest() throws Exception { |
+ String data = "MyBigFunkyData"; |
+ int dataLength = data.length(); |
+ int repeatCount = 100000; |
+ String mockUrl = mMockUrlRequestJobFactory.getMockUrlForData(data, |
+ repeatCount); |
+ TestHttpUrlRequestListener listener = createRequestAndWaitForComplete( |
+ mockUrl, false); |
+ assertEquals(mockUrl, listener.mUrl); |
+ String responseData = new String(listener.mResponseAsBytes); |
+ for (int i = 0; i < repeatCount; ++i) { |
+ assertEquals(data, responseData.substring(dataLength * i, |
+ dataLength * (i + 1))); |
+ } |
+ } |
} |