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

Side by Side Diff: components/cronet/android/test/javatests/src/org/chromium/net/BidirectionalStreamTest.java

Issue 2360813003: [Cronet] Pass metrics information from C++ BidirectionalStream to Java (Closed)
Patch Set: Rebased Created 4 years, 2 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.net; 5 package org.chromium.net;
6 6
7 import static org.chromium.base.CollectionUtil.newHashSet; 7 import static org.chromium.base.CollectionUtil.newHashSet;
8 8
9 import android.os.ConditionVariable; 9 import android.os.ConditionVariable;
10 import android.test.suitebuilder.annotation.SmallTest; 10 import android.test.suitebuilder.annotation.SmallTest;
11 11
12 import org.chromium.base.test.util.DisabledTest; 12 import org.chromium.base.test.util.DisabledTest;
13 import org.chromium.base.test.util.Feature; 13 import org.chromium.base.test.util.Feature;
14 import org.chromium.net.CronetTestBase.OnlyRunNativeCronet; 14 import org.chromium.net.CronetTestBase.OnlyRunNativeCronet;
15 import org.chromium.net.MetricsTestUtil.TestExecutor;
16 import org.chromium.net.MetricsTestUtil.TestRequestFinishedListener; 15 import org.chromium.net.MetricsTestUtil.TestRequestFinishedListener;
17 import org.chromium.net.TestBidirectionalStreamCallback.FailureType; 16 import org.chromium.net.TestBidirectionalStreamCallback.FailureType;
18 import org.chromium.net.TestBidirectionalStreamCallback.ResponseStep; 17 import org.chromium.net.TestBidirectionalStreamCallback.ResponseStep;
19 import org.chromium.net.impl.CronetBidirectionalStream; 18 import org.chromium.net.impl.CronetBidirectionalStream;
20 19
21 import java.nio.ByteBuffer; 20 import java.nio.ByteBuffer;
22 import java.util.AbstractMap; 21 import java.util.AbstractMap;
23 import java.util.ArrayList; 22 import java.util.ArrayList;
24 import java.util.Arrays; 23 import java.util.Arrays;
24 import java.util.Date;
25 import java.util.HashSet; 25 import java.util.HashSet;
26 import java.util.List; 26 import java.util.List;
27 import java.util.Map; 27 import java.util.Map;
28 import java.util.regex.Matcher; 28 import java.util.regex.Matcher;
29 import java.util.regex.Pattern; 29 import java.util.regex.Pattern;
30 30
31 /** 31 /**
32 * Test functionality of BidirectionalStream interface. 32 * Test functionality of BidirectionalStream interface.
33 */ 33 */
34 public class BidirectionalStreamTest extends CronetTestBase { 34 public class BidirectionalStreamTest extends CronetTestBase {
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 220
221 @SmallTest 221 @SmallTest
222 @Feature({"Cronet"}) 222 @Feature({"Cronet"})
223 @OnlyRunNativeCronet 223 @OnlyRunNativeCronet
224 public void testSimplePost() throws Exception { 224 public void testSimplePost() throws Exception {
225 String url = Http2TestServer.getEchoStreamUrl(); 225 String url = Http2TestServer.getEchoStreamUrl();
226 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 226 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
227 callback.addWriteData("Test String".getBytes()); 227 callback.addWriteData("Test String".getBytes());
228 callback.addWriteData("1234567890".getBytes()); 228 callback.addWriteData("1234567890".getBytes());
229 callback.addWriteData("woot!".getBytes()); 229 callback.addWriteData("woot!".getBytes());
230 TestExecutor testExecutor = new TestExecutor(); 230 TestRequestFinishedListener requestFinishedListener = new TestRequestFin ishedListener();
231 TestRequestFinishedListener requestFinishedListener =
232 new TestRequestFinishedListener(testExecutor);
233 mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedL istener); 231 mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedL istener);
234 // Create stream. 232 // Create stream.
235 BidirectionalStream stream = new BidirectionalStream 233 BidirectionalStream stream = new BidirectionalStream
236 .Builder(url, callback, callback.ge tExecutor(), 234 .Builder(url, callback, callback.ge tExecutor(),
237 mTestFramework.mCronetEngin e) 235 mTestFramework.mCronetEngin e)
238 .addHeader("foo", "bar") 236 .addHeader("foo", "bar")
239 .addHeader("empty", "") 237 .addHeader("empty", "")
240 .addHeader("Content-Type", "zebra") 238 .addHeader("Content-Type", "zebra")
241 .addRequestAnnotation(this) 239 .addRequestAnnotation(this)
242 .addRequestAnnotation("request anno tation") 240 .addRequestAnnotation("request anno tation")
243 .build(); 241 .build();
242 Date startTime = new Date();
244 stream.start(); 243 stream.start();
245 callback.blockForDone(); 244 callback.blockForDone();
246 testExecutor.runAllTasks();
247 assertTrue(stream.isDone()); 245 assertTrue(stream.isDone());
246 requestFinishedListener.blockUntilDone();
247 Date endTime = new Date();
248 RequestFinishedInfo finishedInfo = requestFinishedListener.getRequestInf o(); 248 RequestFinishedInfo finishedInfo = requestFinishedListener.getRequestInf o();
249 assertNotNull("RequestFinishedInfo.Listener must be called", finishedInf o); 249 assertNotNull("RequestFinishedInfo.Listener must be called", finishedInf o);
250 RequestFinishedInfo.Metrics metrics = finishedInfo.getMetrics();
251 assertNotNull(metrics);
252 MetricsTestUtil.checkTimingMetrics(metrics, startTime, endTime);
253 MetricsTestUtil.checkHasConnectTiming(metrics, startTime, endTime, true) ;
254 assertTrue(metrics.getSentBytesCount() > 0);
255 assertTrue(metrics.getReceivedBytesCount() > 0);
250 assertEquals(url, finishedInfo.getUrl()); 256 assertEquals(url, finishedInfo.getUrl());
251 assertEquals(newHashSet("request annotation", this), 257 assertEquals(newHashSet("request annotation", this),
252 new HashSet<Object>(finishedInfo.getAnnotations())); 258 new HashSet<Object>(finishedInfo.getAnnotations()));
253 assertNotNull(finishedInfo.getResponseInfo()); 259 assertNotNull(finishedInfo.getResponseInfo());
254 // TODO(xunjieli): Check other fields once metrics support is in crbug.c om/648346.
255 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 260 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
256 assertEquals("Test String1234567890woot!", callback.mResponseAsString); 261 assertEquals("Test String1234567890woot!", callback.mResponseAsString);
257 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo ").get(0)); 262 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo ").get(0));
258 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty" ).get(0)); 263 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty" ).get(0));
259 assertEquals( 264 assertEquals(
260 "zebra", callback.mResponseInfo.getAllHeaders().get("echo-conten t-type").get(0)); 265 "zebra", callback.mResponseInfo.getAllHeaders().get("echo-conten t-type").get(0));
261 } 266 }
262 267
263 @SmallTest 268 @SmallTest
264 @Feature({"Cronet"}) 269 @Feature({"Cronet"})
(...skipping 881 matching lines...) Expand 10 before | Expand all | Expand 10 after
1146 callback.setAutoAdvance(true); 1151 callback.setAutoAdvance(true);
1147 ByteBuffer readBuffer = ByteBuffer.allocateDirect(5); 1152 ByteBuffer readBuffer = ByteBuffer.allocateDirect(5);
1148 stream.read(readBuffer); 1153 stream.read(readBuffer);
1149 callback.blockForDone(); 1154 callback.blockForDone();
1150 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 1155 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
1151 assertEquals("GET", callback.mResponseAsString); 1156 assertEquals("GET", callback.mResponseAsString);
1152 } 1157 }
1153 1158
1154 private void throwOrCancel( 1159 private void throwOrCancel(
1155 FailureType failureType, ResponseStep failureStep, boolean expectErr or) { 1160 FailureType failureType, ResponseStep failureStep, boolean expectErr or) {
1161 // Use a fresh CronetEngine each time so Http2 session is not reused.
1162 CronetEngine.Builder builder = new CronetEngine.Builder(getContext());
1163 builder.setMockCertVerifierForTesting(QuicTestServer.createMockCertVerif ier());
1164 mTestFramework = startCronetTestFrameworkWithUrlAndCronetEngineBuilder(n ull, builder);
1156 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 1165 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
1157 callback.setFailure(failureType, failureStep); 1166 callback.setFailure(failureType, failureStep);
1158 BidirectionalStream.Builder builder = 1167 TestRequestFinishedListener requestFinishedListener = new TestRequestFin ishedListener();
1168 mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedL istener);
1169 BidirectionalStream.Builder streamBuilder =
1159 new BidirectionalStream.Builder(Http2TestServer.getEchoMethodUrl (), callback, 1170 new BidirectionalStream.Builder(Http2TestServer.getEchoMethodUrl (), callback,
1160 callback.getExecutor(), mTestFramework.mCronetEngine); 1171 callback.getExecutor(), mTestFramework.mCronetEngine);
1161 BidirectionalStream stream = builder.setHttpMethod("GET").build(); 1172 BidirectionalStream stream = streamBuilder.setHttpMethod("GET").build();
1173 Date startTime = new Date();
1162 stream.start(); 1174 stream.start();
1163 callback.blockForDone(); 1175 callback.blockForDone();
1164 // assertEquals(callback.mResponseStep, failureStep);
1165 assertTrue(stream.isDone()); 1176 assertTrue(stream.isDone());
1177 requestFinishedListener.blockUntilDone();
1178 Date endTime = new Date();
1179 RequestFinishedInfo finishedInfo = requestFinishedListener.getRequestInf o();
1180 RequestFinishedInfo.Metrics metrics = finishedInfo.getMetrics();
1181 assertNotNull(metrics);
1166 // Cancellation when stream is ready does not guarantee that 1182 // Cancellation when stream is ready does not guarantee that
1167 // mResponseInfo is null because there might be a 1183 // mResponseInfo is null because there might be a
1168 // onResponseHeadersReceived already queued in the executor. 1184 // onResponseHeadersReceived already queued in the executor.
1169 // See crbug.com/594432. 1185 // See crbug.com/594432.
1170 if (failureStep != ResponseStep.ON_STREAM_READY) { 1186 if (failureStep != ResponseStep.ON_STREAM_READY) {
1171 assertNotNull(callback.mResponseInfo); 1187 assertNotNull(callback.mResponseInfo);
1172 } 1188 }
1189 // Check metrics information.
1190 if (failureStep == ResponseStep.ON_RESPONSE_STARTED
1191 || failureStep == ResponseStep.ON_READ_COMPLETED
1192 || failureStep == ResponseStep.ON_TRAILERS) {
1193 // For steps after response headers are received, there will be
1194 // connect timing metrics.
1195 MetricsTestUtil.checkTimingMetrics(metrics, startTime, endTime);
1196 MetricsTestUtil.checkHasConnectTiming(metrics, startTime, endTime, t rue);
1197 assertTrue(metrics.getSentBytesCount() > 0);
1198 assertTrue(metrics.getReceivedBytesCount() > 0);
1199 } else if (failureStep == ResponseStep.ON_STREAM_READY) {
1200 // onStreamReady() happens before response headers are received, so
1201 // there is no connect timing metrics.
1202 assertNotNull(metrics.getRequestStart());
1203 MetricsTestUtil.assertAfter(metrics.getRequestStart(), startTime);
1204 MetricsTestUtil.checkNoConnectTiming(metrics);
1205 assertNull(metrics.getResponseStart());
1206 assertNotNull(metrics.getResponseEnd());
1207 MetricsTestUtil.assertAfter(endTime, metrics.getResponseEnd());
1208 // Entire request should take more than 0 ms
1209 assertTrue(
1210 metrics.getResponseEnd().getTime() - metrics.getRequestStart ().getTime() > 0);
1211 }
1173 assertEquals(expectError, callback.mError != null); 1212 assertEquals(expectError, callback.mError != null);
1174 assertEquals(expectError, callback.mOnErrorCalled); 1213 assertEquals(expectError, callback.mOnErrorCalled);
1175 assertEquals(failureType == FailureType.CANCEL_SYNC 1214 assertEquals(failureType == FailureType.CANCEL_SYNC
1176 || failureType == FailureType.CANCEL_ASYNC 1215 || failureType == FailureType.CANCEL_ASYNC
1177 || failureType == FailureType.CANCEL_ASYNC_WITHOUT_PAUSE , 1216 || failureType == FailureType.CANCEL_ASYNC_WITHOUT_PAUSE ,
1178 callback.mOnCanceledCalled); 1217 callback.mOnCanceledCalled);
1218 mTestFramework.mCronetEngine.removeRequestFinishedListener(requestFinish edListener);
1179 } 1219 }
1180 1220
1181 @SmallTest 1221 @SmallTest
1182 @Feature({"Cronet"}) 1222 @Feature({"Cronet"})
1183 @OnlyRunNativeCronet 1223 @OnlyRunNativeCronet
1184 public void testFailures() throws Exception { 1224 public void testFailures() throws Exception {
1185 throwOrCancel(FailureType.CANCEL_SYNC, ResponseStep.ON_STREAM_READY, fal se); 1225 throwOrCancel(FailureType.CANCEL_SYNC, ResponseStep.ON_STREAM_READY, fal se);
1186 throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_STREAM_READY, fa lse); 1226 throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_STREAM_READY, fa lse);
1187 throwOrCancel(FailureType.CANCEL_ASYNC_WITHOUT_PAUSE, ResponseStep.ON_ST REAM_READY, false); 1227 throwOrCancel(FailureType.CANCEL_ASYNC_WITHOUT_PAUSE, ResponseStep.ON_ST REAM_READY, false);
1188 throwOrCancel(FailureType.THROW_SYNC, ResponseStep.ON_STREAM_READY, true ); 1228 throwOrCancel(FailureType.THROW_SYNC, ResponseStep.ON_STREAM_READY, true );
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
1389 private static String bufferContentsToString(ByteBuffer byteBuffer, int star t, int end) { 1429 private static String bufferContentsToString(ByteBuffer byteBuffer, int star t, int end) {
1390 // Use a duplicate to avoid modifying byteBuffer. 1430 // Use a duplicate to avoid modifying byteBuffer.
1391 ByteBuffer duplicate = byteBuffer.duplicate(); 1431 ByteBuffer duplicate = byteBuffer.duplicate();
1392 duplicate.position(start); 1432 duplicate.position(start);
1393 duplicate.limit(end); 1433 duplicate.limit(end);
1394 byte[] contents = new byte[duplicate.remaining()]; 1434 byte[] contents = new byte[duplicate.remaining()];
1395 duplicate.get(contents); 1435 duplicate.get(contents);
1396 return new String(contents); 1436 return new String(contents);
1397 } 1437 }
1398 } 1438 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698