Index: components/cronet/android/test/javatests/src/org/chromium/net/RequestFinishedInfoTest.java |
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/RequestFinishedInfoTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/RequestFinishedInfoTest.java |
index e646547e86e018b22e48f59f78c9e9cfb81d713b..55988a598b2dc6ad4f05dc058525d32d76ddb0ee 100644 |
--- a/components/cronet/android/test/javatests/src/org/chromium/net/RequestFinishedInfoTest.java |
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/RequestFinishedInfoTest.java |
@@ -6,6 +6,7 @@ package org.chromium.net; |
import static org.chromium.base.CollectionUtil.newHashSet; |
+import android.os.ConditionVariable; |
import android.test.suitebuilder.annotation.SmallTest; |
import org.chromium.base.test.util.Feature; |
@@ -42,9 +43,16 @@ public class RequestFinishedInfoTest extends CronetTestBase { |
} |
static class DirectExecutor implements Executor { |
+ private ConditionVariable mBlock = new ConditionVariable(); |
+ |
@Override |
public void execute(Runnable task) { |
task.run(); |
+ mBlock.open(); |
+ } |
+ |
+ public void blockUntilDone() { |
+ mBlock.block(); |
} |
} |
@@ -66,23 +74,24 @@ public class RequestFinishedInfoTest extends CronetTestBase { |
} |
@SmallTest |
+ @OnlyRunNativeCronet |
@Feature({"Cronet"}) |
@SuppressWarnings("deprecation") |
public void testRequestFinishedListener() throws Exception { |
mTestFramework = startCronetTestFramework(); |
- TestExecutor testExecutor = new TestExecutor(); |
- TestRequestFinishedListener requestFinishedListener = |
- new TestRequestFinishedListener(testExecutor); |
+ TestRequestFinishedListener requestFinishedListener = new TestRequestFinishedListener(); |
mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedListener); |
TestUrlRequestCallback callback = new TestUrlRequestCallback(); |
UrlRequest.Builder urlRequestBuilder = new UrlRequest.Builder( |
mUrl, callback, callback.getExecutor(), mTestFramework.mCronetEngine); |
+ Date startTime = new Date(); |
urlRequestBuilder.addRequestAnnotation("request annotation") |
.addRequestAnnotation(this) |
.build() |
.start(); |
callback.blockForDone(); |
- testExecutor.runAllTasks(); |
+ requestFinishedListener.blockUntilDone(); |
+ Date endTime = new Date(); |
RequestFinishedInfo requestInfo = requestFinishedListener.getRequestInfo(); |
assertNotNull("RequestFinishedInfo.Listener must be called", requestInfo); |
@@ -92,29 +101,42 @@ public class RequestFinishedInfoTest extends CronetTestBase { |
new HashSet<Object>(requestInfo.getAnnotations())); |
RequestFinishedInfo.Metrics metrics = requestInfo.getMetrics(); |
assertNotNull("RequestFinishedInfo.getMetrics() must not be null", metrics); |
+ // Check old (deprecated) timing metrics |
assertTrue(metrics.getTotalTimeMs() > 0); |
assertTrue(metrics.getTotalTimeMs() >= metrics.getTtfbMs()); |
+ // Check new timing metrics |
+ MetricsTestUtil.checkTimingMetrics(metrics, startTime, endTime); |
+ MetricsTestUtil.checkHasConnectTiming(metrics, startTime, endTime, false); |
+ assertNull(metrics.getPushStart()); |
+ assertNull(metrics.getPushEnd()); |
+ // Check data use metrics |
assertTrue(metrics.getReceivedBytesCount() > 0); |
mTestFramework.mCronetEngine.shutdown(); |
} |
@SmallTest |
+ @OnlyRunNativeCronet |
@Feature({"Cronet"}) |
@SuppressWarnings("deprecation") |
public void testRequestFinishedListenerDirectExecutor() throws Exception { |
mTestFramework = startCronetTestFramework(); |
- Executor testExecutor = new DirectExecutor(); |
+ DirectExecutor testExecutor = new DirectExecutor(); |
TestRequestFinishedListener requestFinishedListener = |
new TestRequestFinishedListener(testExecutor); |
mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedListener); |
TestUrlRequestCallback callback = new TestUrlRequestCallback(); |
UrlRequest.Builder urlRequestBuilder = new UrlRequest.Builder( |
mUrl, callback, callback.getExecutor(), mTestFramework.mCronetEngine); |
+ Date startTime = new Date(); |
urlRequestBuilder.addRequestAnnotation("request annotation") |
.addRequestAnnotation(this) |
.build() |
.start(); |
callback.blockForDone(); |
+ // Block on the executor, not the listener, since blocking on the listener doesn't work when |
+ // it's created with a non-default executor. |
+ testExecutor.blockUntilDone(); |
+ Date endTime = new Date(); |
RequestFinishedInfo requestInfo = requestFinishedListener.getRequestInfo(); |
assertNotNull("RequestFinishedInfo.Listener must be called", requestInfo); |
@@ -126,29 +148,34 @@ public class RequestFinishedInfoTest extends CronetTestBase { |
assertNotNull("RequestFinishedInfo.getMetrics() must not be null", metrics); |
assertTrue(metrics.getTotalTimeMs() > 0); |
assertTrue(metrics.getTotalTimeMs() >= metrics.getTtfbMs()); |
+ MetricsTestUtil.checkTimingMetrics(metrics, startTime, endTime); |
+ MetricsTestUtil.checkHasConnectTiming(metrics, startTime, endTime, false); |
assertTrue(metrics.getReceivedBytesCount() > 0); |
mTestFramework.mCronetEngine.shutdown(); |
} |
@SmallTest |
+ @OnlyRunNativeCronet |
@Feature({"Cronet"}) |
@SuppressWarnings("deprecation") |
public void testRequestFinishedListenerDifferentThreads() throws Exception { |
mTestFramework = startCronetTestFramework(); |
- ThreadExecutor testExecutor = new ThreadExecutor(); |
- TestRequestFinishedListener firstListener = new TestRequestFinishedListener(testExecutor); |
- TestRequestFinishedListener secondListener = new TestRequestFinishedListener(testExecutor); |
+ TestRequestFinishedListener firstListener = new TestRequestFinishedListener(); |
+ TestRequestFinishedListener secondListener = new TestRequestFinishedListener(); |
mTestFramework.mCronetEngine.addRequestFinishedListener(firstListener); |
mTestFramework.mCronetEngine.addRequestFinishedListener(secondListener); |
TestUrlRequestCallback callback = new TestUrlRequestCallback(); |
UrlRequest.Builder urlRequestBuilder = new UrlRequest.Builder( |
mUrl, callback, callback.getExecutor(), mTestFramework.mCronetEngine); |
+ Date startTime = new Date(); |
urlRequestBuilder.addRequestAnnotation("request annotation") |
.addRequestAnnotation(this) |
.build() |
.start(); |
callback.blockForDone(); |
- testExecutor.joinAll(); |
+ firstListener.blockUntilDone(); |
+ secondListener.blockUntilDone(); |
+ Date endTime = new Date(); |
RequestFinishedInfo firstRequestInfo = firstListener.getRequestInfo(); |
RequestFinishedInfo secondRequestInfo = secondListener.getRequestInfo(); |
@@ -166,32 +193,37 @@ public class RequestFinishedInfoTest extends CronetTestBase { |
assertNotNull("RequestFinishedInfo.getMetrics() must not be null", firstMetrics); |
assertTrue(firstMetrics.getTotalTimeMs() > 0); |
assertTrue(firstMetrics.getTotalTimeMs() >= firstMetrics.getTtfbMs()); |
+ MetricsTestUtil.checkTimingMetrics(firstMetrics, startTime, endTime); |
+ MetricsTestUtil.checkHasConnectTiming(firstMetrics, startTime, endTime, false); |
assertTrue(firstMetrics.getReceivedBytesCount() > 0); |
RequestFinishedInfo.Metrics secondMetrics = secondRequestInfo.getMetrics(); |
assertNotNull("RequestFinishedInfo.getMetrics() must not be null", secondMetrics); |
assertTrue(secondMetrics.getTotalTimeMs() > 0); |
assertTrue(secondMetrics.getTotalTimeMs() >= secondMetrics.getTtfbMs()); |
+ MetricsTestUtil.checkTimingMetrics(secondMetrics, startTime, endTime); |
+ MetricsTestUtil.checkHasConnectTiming(secondMetrics, startTime, endTime, false); |
assertTrue(secondMetrics.getReceivedBytesCount() > 0); |
mTestFramework.mCronetEngine.shutdown(); |
} |
@SmallTest |
+ @OnlyRunNativeCronet |
@Feature({"Cronet"}) |
@SuppressWarnings("deprecation") |
public void testRequestFinishedListenerFailedRequest() throws Exception { |
String connectionRefusedUrl = "http://127.0.0.1:3"; |
mTestFramework = startCronetTestFramework(); |
- TestExecutor testExecutor = new TestExecutor(); |
- TestRequestFinishedListener requestFinishedListener = |
- new TestRequestFinishedListener(testExecutor); |
+ TestRequestFinishedListener requestFinishedListener = new TestRequestFinishedListener(); |
mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedListener); |
TestUrlRequestCallback callback = new TestUrlRequestCallback(); |
UrlRequest.Builder urlRequestBuilder = new UrlRequest.Builder(connectionRefusedUrl, |
callback, callback.getExecutor(), mTestFramework.mCronetEngine); |
+ Date startTime = new Date(); |
urlRequestBuilder.build().start(); |
callback.blockForDone(); |
assertTrue(callback.mOnErrorCalled); |
- testExecutor.runAllTasks(); |
+ requestFinishedListener.blockUntilDone(); |
+ Date endTime = new Date(); |
RequestFinishedInfo requestInfo = requestFinishedListener.getRequestInfo(); |
assertNotNull("RequestFinishedInfo.Listener must be called", requestInfo); |
@@ -202,11 +234,25 @@ public class RequestFinishedInfoTest extends CronetTestBase { |
// The failure is occasionally fast enough that time reported is 0, so just check for null |
assertNotNull(metrics.getTotalTimeMs()); |
assertNull(metrics.getTtfbMs()); |
+ |
+ // Check the timing metrics |
+ assertNotNull(metrics.getRequestStart()); |
+ assertTrue(metrics.getRequestStart().after(startTime)); |
+ MetricsTestUtil.checkNoConnectTiming(metrics); |
+ assertNull(metrics.getSendingStart()); |
+ assertNull(metrics.getSendingEnd()); |
+ assertNull(metrics.getResponseStart()); |
+ assertNotNull(metrics.getResponseEnd()); |
+ assertTrue(metrics.getResponseEnd().before(endTime)); |
+ // Entire request should take more than 0 ms |
+ assertTrue(metrics.getResponseEnd().getTime() - metrics.getRequestStart().getTime() > 0); |
+ |
assertTrue(metrics.getReceivedBytesCount() == null || metrics.getReceivedBytesCount() == 0); |
mTestFramework.mCronetEngine.shutdown(); |
} |
@SmallTest |
+ @OnlyRunNativeCronet |
@Feature({"Cronet"}) |
@SuppressWarnings("deprecation") |
public void testRequestFinishedListenerRemoved() throws Exception { |
@@ -215,11 +261,12 @@ public class RequestFinishedInfoTest extends CronetTestBase { |
TestRequestFinishedListener requestFinishedListener = |
new TestRequestFinishedListener(testExecutor); |
mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedListener); |
- mTestFramework.mCronetEngine.removeRequestFinishedListener(requestFinishedListener); |
TestUrlRequestCallback callback = new TestUrlRequestCallback(); |
UrlRequest.Builder urlRequestBuilder = new UrlRequest.Builder( |
mUrl, callback, callback.getExecutor(), mTestFramework.mCronetEngine); |
- urlRequestBuilder.build().start(); |
+ UrlRequest request = urlRequestBuilder.build(); |
+ mTestFramework.mCronetEngine.removeRequestFinishedListener(requestFinishedListener); |
+ request.start(); |
callback.blockForDone(); |
testExecutor.runAllTasks(); |
@@ -229,6 +276,52 @@ public class RequestFinishedInfoTest extends CronetTestBase { |
} |
@SmallTest |
+ @OnlyRunNativeCronet |
+ @Feature({"Cronet"}) |
+ public void testRequestFinishedListenerCanceledRequest() throws Exception { |
+ mTestFramework = startCronetTestFramework(); |
+ TestRequestFinishedListener requestFinishedListener = new TestRequestFinishedListener(); |
+ mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedListener); |
+ TestUrlRequestCallback callback = new TestUrlRequestCallback() { |
+ @Override |
+ public void onResponseStarted(UrlRequest request, UrlResponseInfo info) { |
+ super.onResponseStarted(request, info); |
+ request.cancel(); |
+ } |
+ }; |
+ UrlRequest.Builder urlRequestBuilder = new UrlRequest.Builder( |
+ mUrl, callback, callback.getExecutor(), mTestFramework.mCronetEngine); |
+ Date startTime = new Date(); |
+ urlRequestBuilder.addRequestAnnotation("request annotation") |
+ .addRequestAnnotation(this) |
+ .build() |
+ .start(); |
+ callback.blockForDone(); |
+ requestFinishedListener.blockUntilDone(); |
+ Date endTime = new Date(); |
+ |
+ RequestFinishedInfo requestInfo = requestFinishedListener.getRequestInfo(); |
+ assertNotNull("RequestFinishedInfo.Listener must be called", requestInfo); |
+ assertEquals(mUrl, requestInfo.getUrl()); |
+ assertNotNull(requestInfo.getResponseInfo()); |
+ assertEquals(newHashSet("request annotation", this), // Use sets for unordered comparison. |
+ new HashSet<Object>(requestInfo.getAnnotations())); |
+ RequestFinishedInfo.Metrics metrics = requestInfo.getMetrics(); |
+ assertNotNull("RequestFinishedInfo.getMetrics() must not be null", metrics); |
+ // Check old (deprecated) timing metrics |
+ assertTrue(metrics.getTotalTimeMs() > 0); |
+ assertTrue(metrics.getTotalTimeMs() >= metrics.getTtfbMs()); |
+ // Check new timing metrics |
+ MetricsTestUtil.checkTimingMetrics(metrics, startTime, endTime); |
+ MetricsTestUtil.checkHasConnectTiming(metrics, startTime, endTime, false); |
+ assertNull(metrics.getPushStart()); |
+ assertNull(metrics.getPushEnd()); |
+ // Check data use metrics |
+ assertTrue(metrics.getReceivedBytesCount() > 0); |
+ mTestFramework.mCronetEngine.shutdown(); |
+ } |
+ |
+ @SmallTest |
@Feature({"Cronet"}) |
public void testMetricsGetters() throws Exception { |
long requestStart = 1; |