Index: components/cronet/android/test/javatests/src/org/chromium/cronet_test_apk/CronetUrlTest.java |
diff --git a/components/cronet/android/test/javatests/src/org/chromium/cronet_test_apk/CronetUrlTest.java b/components/cronet/android/test/javatests/src/org/chromium/cronet_test_apk/CronetUrlTest.java |
index 5ede19a65c84a27fc38ce59c8d5aada676c7d54e..0555e262113afc6b0cfca09acdc2d3001e9244da 100644 |
--- a/components/cronet/android/test/javatests/src/org/chromium/cronet_test_apk/CronetUrlTest.java |
+++ b/components/cronet/android/test/javatests/src/org/chromium/cronet_test_apk/CronetUrlTest.java |
@@ -4,14 +4,19 @@ |
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 org.chromium.net.HttpUrlRequestFactoryConfig; |
import java.io.File; |
+import java.io.IOException; |
+import java.nio.ByteBuffer; |
import java.util.HashMap; |
+import java.util.concurrent.Executors; |
/** |
* Example test that just starts the cronet sample. |
@@ -245,4 +250,60 @@ public class CronetUrlTest extends CronetTestBase { |
// ignored. |
assertEquals(0, listener.mResponseAsBytes.length); |
} |
+ |
+ static class TestByteChannel extends ChunkedWritableByteChannel { |
+ boolean mIsOpen = true; |
+ |
+ @Override |
+ public int write(ByteBuffer byteBuffer) throws IOException { |
+ assertTrue(isOpen()); |
+ return super.write(byteBuffer); |
+ } |
+ |
+ @Override |
+ public void close() { |
+ assertTrue(isOpen()); |
+ mIsOpen = false; |
+ super.close(); |
+ } |
+ |
+ @Override |
+ public boolean isOpen() { |
+ return mIsOpen; |
+ } |
+ } |
+ |
+ @LargeTest |
+ @Feature({"Cronet"}) |
+ public void testWriteAfterCancel() throws Exception { |
+ CronetTestActivity activity = launchCronetTestAppWithUrl(URL); |
+ |
+ // Make sure the activity was created as expected. |
+ waitForActiveShellToBeDoneLoading(); |
+ |
+ // This test verifies that WritableByteChannel.write is not called after |
+ // WritableByteChannel.close if 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( |
+ URL, HttpUrlRequest.REQUEST_PRIORITY_LOW, headers, |
+ channel, listener); |
+ request.start(); |
+ listener.blockForStarted(); |
+ Runnable cancelTask = new Runnable() { |
+ public void run() { |
+ request.cancel(); |
+ } |
+ }; |
+ Executors.newCachedThreadPool().execute(cancelTask); |
mmenke
2014/12/02 17:10:24
Any reason not to just cancel on the current threa
mef
2014/12/02 19:41:39
I've adopted this test from testAppendChunkRaceWit
|
+ listener.blockForComplete(); |
+ } |
+ } |
} |