OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |