Index: components/cronet/android/test/javatests/src/org/chromium/net/BidirectionalStreamTest.java |
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/BidirectionalStreamTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/BidirectionalStreamTest.java |
index 064ead0d2608e04eede130ebf8b0123b3463273e..5a296f006c92ef630f7a5c695c5c957a55e0ee67 100644 |
--- a/components/cronet/android/test/javatests/src/org/chromium/net/BidirectionalStreamTest.java |
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/BidirectionalStreamTest.java |
@@ -12,7 +12,6 @@ import android.test.suitebuilder.annotation.SmallTest; |
import org.chromium.base.test.util.DisabledTest; |
import org.chromium.base.test.util.Feature; |
import org.chromium.net.CronetTestBase.OnlyRunNativeCronet; |
-import org.chromium.net.MetricsTestUtil.TestExecutor; |
import org.chromium.net.MetricsTestUtil.TestRequestFinishedListener; |
import org.chromium.net.TestBidirectionalStreamCallback.FailureType; |
import org.chromium.net.TestBidirectionalStreamCallback.ResponseStep; |
@@ -22,6 +21,7 @@ import java.nio.ByteBuffer; |
import java.util.AbstractMap; |
import java.util.ArrayList; |
import java.util.Arrays; |
+import java.util.Date; |
import java.util.HashSet; |
import java.util.List; |
import java.util.Map; |
@@ -227,9 +227,7 @@ public class BidirectionalStreamTest extends CronetTestBase { |
callback.addWriteData("Test String".getBytes()); |
callback.addWriteData("1234567890".getBytes()); |
callback.addWriteData("woot!".getBytes()); |
- TestExecutor testExecutor = new TestExecutor(); |
- TestRequestFinishedListener requestFinishedListener = |
- new TestRequestFinishedListener(testExecutor); |
+ TestRequestFinishedListener requestFinishedListener = new TestRequestFinishedListener(); |
mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedListener); |
// Create stream. |
BidirectionalStream stream = new BidirectionalStream |
@@ -241,17 +239,24 @@ public class BidirectionalStreamTest extends CronetTestBase { |
.addRequestAnnotation(this) |
.addRequestAnnotation("request annotation") |
.build(); |
+ Date startTime = new Date(); |
stream.start(); |
callback.blockForDone(); |
- testExecutor.runAllTasks(); |
assertTrue(stream.isDone()); |
+ requestFinishedListener.blockUntilDone(); |
+ Date endTime = new Date(); |
RequestFinishedInfo finishedInfo = requestFinishedListener.getRequestInfo(); |
assertNotNull("RequestFinishedInfo.Listener must be called", finishedInfo); |
+ RequestFinishedInfo.Metrics metrics = finishedInfo.getMetrics(); |
+ assertNotNull(metrics); |
+ MetricsTestUtil.checkTimingMetrics(metrics, startTime, endTime); |
+ MetricsTestUtil.checkHasConnectTiming(metrics, startTime, endTime, true); |
+ assertTrue(metrics.getSentBytesCount() > 0); |
+ assertTrue(metrics.getReceivedBytesCount() > 0); |
assertEquals(url, finishedInfo.getUrl()); |
assertEquals(newHashSet("request annotation", this), |
new HashSet<Object>(finishedInfo.getAnnotations())); |
assertNotNull(finishedInfo.getResponseInfo()); |
- // TODO(xunjieli): Check other fields once metrics support is in crbug.com/648346. |
assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); |
assertEquals("Test String1234567890woot!", callback.mResponseAsString); |
assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo").get(0)); |
@@ -1153,16 +1158,27 @@ public class BidirectionalStreamTest extends CronetTestBase { |
private void throwOrCancel( |
FailureType failureType, ResponseStep failureStep, boolean expectError) { |
+ // Use a fresh CronetEngine each time so Http2 session is not reused. |
+ CronetEngine.Builder builder = new CronetEngine.Builder(getContext()); |
+ builder.setMockCertVerifierForTesting(QuicTestServer.createMockCertVerifier()); |
+ mTestFramework = startCronetTestFrameworkWithUrlAndCronetEngineBuilder(null, builder); |
TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCallback(); |
callback.setFailure(failureType, failureStep); |
- BidirectionalStream.Builder builder = |
+ TestRequestFinishedListener requestFinishedListener = new TestRequestFinishedListener(); |
+ mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedListener); |
+ BidirectionalStream.Builder streamBuilder = |
new BidirectionalStream.Builder(Http2TestServer.getEchoMethodUrl(), callback, |
callback.getExecutor(), mTestFramework.mCronetEngine); |
- BidirectionalStream stream = builder.setHttpMethod("GET").build(); |
+ BidirectionalStream stream = streamBuilder.setHttpMethod("GET").build(); |
+ Date startTime = new Date(); |
stream.start(); |
callback.blockForDone(); |
- // assertEquals(callback.mResponseStep, failureStep); |
assertTrue(stream.isDone()); |
+ requestFinishedListener.blockUntilDone(); |
+ Date endTime = new Date(); |
+ RequestFinishedInfo finishedInfo = requestFinishedListener.getRequestInfo(); |
+ RequestFinishedInfo.Metrics metrics = finishedInfo.getMetrics(); |
+ assertNotNull(metrics); |
// Cancellation when stream is ready does not guarantee that |
// mResponseInfo is null because there might be a |
// onResponseHeadersReceived already queued in the executor. |
@@ -1170,12 +1186,36 @@ public class BidirectionalStreamTest extends CronetTestBase { |
if (failureStep != ResponseStep.ON_STREAM_READY) { |
assertNotNull(callback.mResponseInfo); |
} |
+ // Check metrics information. |
+ if (failureStep == ResponseStep.ON_RESPONSE_STARTED |
+ || failureStep == ResponseStep.ON_READ_COMPLETED |
+ || failureStep == ResponseStep.ON_TRAILERS) { |
+ // For steps after response headers are received, there will be |
+ // connect timing metrics. |
+ MetricsTestUtil.checkTimingMetrics(metrics, startTime, endTime); |
+ MetricsTestUtil.checkHasConnectTiming(metrics, startTime, endTime, true); |
+ assertTrue(metrics.getSentBytesCount() > 0); |
+ assertTrue(metrics.getReceivedBytesCount() > 0); |
+ } else if (failureStep == ResponseStep.ON_STREAM_READY) { |
+ // onStreamReady() happens before response headers are received, so |
+ // there is no connect timing metrics. |
+ assertNotNull(metrics.getRequestStart()); |
+ MetricsTestUtil.assertAfter(metrics.getRequestStart(), startTime); |
+ MetricsTestUtil.checkNoConnectTiming(metrics); |
+ assertNull(metrics.getResponseStart()); |
+ assertNotNull(metrics.getResponseEnd()); |
+ MetricsTestUtil.assertAfter(endTime, metrics.getResponseEnd()); |
+ // Entire request should take more than 0 ms |
+ assertTrue( |
+ metrics.getResponseEnd().getTime() - metrics.getRequestStart().getTime() > 0); |
+ } |
assertEquals(expectError, callback.mError != null); |
assertEquals(expectError, callback.mOnErrorCalled); |
assertEquals(failureType == FailureType.CANCEL_SYNC |
|| failureType == FailureType.CANCEL_ASYNC |
|| failureType == FailureType.CANCEL_ASYNC_WITHOUT_PAUSE, |
callback.mOnCanceledCalled); |
+ mTestFramework.mCronetEngine.removeRequestFinishedListener(requestFinishedListener); |
} |
@SmallTest |