Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(41)

Unified Diff: components/cronet/android/test/javatests/src/org/chromium/net/GetStatusTest.java

Issue 1924593002: Do a null check in CronetURLRequestAdapter::GetStatusOnNetworkThread (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address comments Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/cronet/android/cronet_url_request_adapter.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/cronet/android/test/javatests/src/org/chromium/net/GetStatusTest.java
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/GetStatusTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/GetStatusTest.java
index c57a175ab00c9eaaadf05ed23933ee79330c2b34..4d7b672bd79a876fb300228de848540699029fd4 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/GetStatusTest.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/GetStatusTest.java
@@ -12,6 +12,10 @@ import org.chromium.net.TestUrlRequestCallback.ResponseStep;
import org.chromium.net.UrlRequest.Status;
import org.chromium.net.UrlRequest.StatusListener;
+import java.io.IOException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+
/**
* Tests that {@link CronetUrlRequest#getStatus} works as expected.
*/
@@ -137,4 +141,58 @@ public class GetStatusTest extends CronetTestBase {
assertEquals("No request status found.", e.getMessage());
}
}
+
+ @SmallTest
+ @Feature({"Cronet"})
+ // Regression test for crbug.com/606872.
+ @OnlyRunNativeCronet
+ public void testGetStatusForUpload() throws Exception {
+ TestUrlRequestCallback callback = new TestUrlRequestCallback();
+ UrlRequest.Builder builder = new UrlRequest.Builder(NativeTestServer.getEchoBodyURL(),
+ callback, callback.getExecutor(), mTestFramework.mCronetEngine);
+
+ final ConditionVariable block = new ConditionVariable();
+ // Use a separate executor for UploadDataProvider so the upload can be
+ // stalled while getStatus gets processed.
+ Executor uploadProviderExecutor = Executors.newSingleThreadExecutor();
+ TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+ TestUploadDataProvider.SuccessCallbackMode.SYNC, uploadProviderExecutor) {
+ @Override
+ public long getLength() throws IOException {
+ // Pause the data provider.
+ block.block();
+ block.close();
+ return super.getLength();
+ }
+ };
+ dataProvider.addRead("test".getBytes());
+ builder.setUploadDataProvider(dataProvider, uploadProviderExecutor);
+ builder.addHeader("Content-Type", "useless/string");
+ UrlRequest urlRequest = builder.build();
+ TestStatusListener statusListener = new TestStatusListener();
+ urlRequest.start();
+ // Call getStatus() immediately after start(), which will post
+ // startInternal() to the upload provider's executor because there is an
+ // upload. When CronetUrlRequestAdapter::GetStatusOnNetworkThread is
+ // executed, the |url_request_| is null.
+ urlRequest.getStatus(statusListener);
+ statusListener.waitUntilOnStatusCalled();
+ assertTrue(statusListener.mOnStatusCalled);
+ // The request should be in IDLE state because GetStatusOnNetworkThread
+ // is called before |url_request_| is initialized and started.
+ assertEquals(Status.IDLE, statusListener.mStatus);
+ // Resume the UploadDataProvider.
+ block.open();
+
+ // Make sure the request is successful and there is no crash.
+ callback.blockForDone();
+ dataProvider.assertClosed();
+
+ assertEquals(4, dataProvider.getUploadedLength());
+ assertEquals(1, dataProvider.getNumReadCalls());
+ assertEquals(0, dataProvider.getNumRewindCalls());
+
+ assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
+ assertEquals("test", callback.mResponseAsString);
+ }
}
« no previous file with comments | « components/cronet/android/cronet_url_request_adapter.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698