Index: components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java |
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java |
index 3fbe074bf8a90b7d7cb594c94bb3fa1c7ae0bc21..7537fefc1042cb36de0a33a51fbe5745c2b48512 100644 |
--- a/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java |
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java |
@@ -32,6 +32,7 @@ import java.util.NoSuchElementException; |
import java.util.concurrent.Executor; |
import java.util.concurrent.Executors; |
import java.util.concurrent.ThreadFactory; |
+import java.util.concurrent.atomic.AtomicReference; |
/** |
* Test CronetEngine. |
@@ -747,6 +748,62 @@ public class CronetUrlRequestContextTest extends CronetTestBase { |
FileUtils.recursivelyDeleteFile(netLogDir2); |
assertFalse(netLogDir2.exists()); |
} |
+ @SmallTest |
+ @Feature({"Cronet"}) |
+ @OnlyRunNativeCronet |
+ // Tests that if CronetEngine is shut down on the network thread, an appropriate exception |
+ // is thrown. |
+ public void testShutDownEngineOnNetworkThread() throws Exception { |
+ final CronetTestFramework testFramework = |
+ startCronetTestFrameworkWithCacheEnabled(CronetEngine.Builder.HTTP_CACHE_DISK); |
+ String url = NativeTestServer.getFileURL("/cacheable.txt"); |
+ // Make a request to a cacheable resource. |
+ checkRequestCaching(testFramework.mCronetEngine, url, false); |
+ |
+ final AtomicReference<Throwable> thrown = new AtomicReference<>(); |
+ // Shut down the server. |
+ NativeTestServer.shutdownNativeTestServer(); |
+ class CancelUrlRequestCallback extends TestUrlRequestCallback { |
+ @Override |
+ public void onResponseStarted(UrlRequest request, UrlResponseInfo info) { |
+ super.onResponseStarted(request, info); |
+ request.cancel(); |
+ // Shut down CronetEngine immediately after request is destroyed. |
+ try { |
+ testFramework.mCronetEngine.shutdown(); |
+ } catch (Exception e) { |
+ thrown.set(e); |
+ } |
+ } |
+ |
+ @Override |
+ public void onSucceeded(UrlRequest request, UrlResponseInfo info) { |
+ // onSucceeded will not happen, because the request is canceled |
+ // after sending first read and the executor is single threaded. |
+ throw new RuntimeException("Unexpected"); |
+ } |
+ |
+ @Override |
+ public void onFailed( |
+ UrlRequest request, UrlResponseInfo info, UrlRequestException error) { |
+ throw new RuntimeException("Unexpected"); |
+ } |
+ } |
+ Executor directExecutor = new Executor() { |
+ @Override |
+ public void execute(Runnable command) { |
+ command.run(); |
+ } |
+ }; |
+ CancelUrlRequestCallback callback = new CancelUrlRequestCallback(); |
+ callback.setAllowDirectExecutor(true); |
+ UrlRequest.Builder urlRequestBuilder = |
+ new UrlRequest.Builder(url, callback, directExecutor, testFramework.mCronetEngine); |
+ urlRequestBuilder.allowDirectExecutor(); |
+ urlRequestBuilder.build().start(); |
+ callback.blockForDone(); |
+ assertTrue(thrown.get() instanceof RuntimeException); |
+ } |
@SmallTest |
@Feature({"Cronet"}) |