| 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 |