| 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 android.os.ConditionVariable; | 7 import android.os.ConditionVariable; |
| 8 import android.test.suitebuilder.annotation.LargeTest; | 8 import android.test.suitebuilder.annotation.LargeTest; |
| 9 import android.test.suitebuilder.annotation.SmallTest; | 9 import android.test.suitebuilder.annotation.SmallTest; |
| 10 | 10 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 import java.io.FileNotFoundException; | 21 import java.io.FileNotFoundException; |
| 22 import java.io.IOException; | 22 import java.io.IOException; |
| 23 import java.util.Date; | 23 import java.util.Date; |
| 24 import java.util.concurrent.Executors; | 24 import java.util.concurrent.Executors; |
| 25 | 25 |
| 26 /** | 26 /** |
| 27 * Tests making requests using QUIC. | 27 * Tests making requests using QUIC. |
| 28 */ | 28 */ |
| 29 public class QuicTest extends CronetTestBase { | 29 public class QuicTest extends CronetTestBase { |
| 30 private static final String TAG = "cr.QuicTest"; | 30 private static final String TAG = "cr.QuicTest"; |
| 31 private static final String QUIC_PROTOCOL_STRING_PREFIX = "http/2+quic/"; |
| 31 private CronetTestFramework mTestFramework; | 32 private CronetTestFramework mTestFramework; |
| 32 private ExperimentalCronetEngine.Builder mBuilder; | 33 private ExperimentalCronetEngine.Builder mBuilder; |
| 33 | 34 |
| 34 @Override | 35 @Override |
| 35 protected void setUp() throws Exception { | 36 protected void setUp() throws Exception { |
| 36 super.setUp(); | 37 super.setUp(); |
| 37 // Load library first, since we need the Quic test server's URL. | 38 // Load library first, since we need the Quic test server's URL. |
| 38 System.loadLibrary("cronet_tests"); | 39 System.loadLibrary("cronet_tests"); |
| 39 QuicTestServer.startQuicTestServer(getContext()); | 40 QuicTestServer.startQuicTestServer(getContext()); |
| 40 | 41 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 // QUIC will always succeed with a 200 (see | 85 // QUIC will always succeed with a 200 (see |
| 85 // net::HttpStreamFactoryImpl::Request::OnStreamFailed). | 86 // net::HttpStreamFactoryImpl::Request::OnStreamFailed). |
| 86 UrlRequest.Builder requestBuilder = mTestFramework.mCronetEngine.newUrlR
equestBuilder( | 87 UrlRequest.Builder requestBuilder = mTestFramework.mCronetEngine.newUrlR
equestBuilder( |
| 87 quicURL, callback, callback.getExecutor()); | 88 quicURL, callback, callback.getExecutor()); |
| 88 requestBuilder.build().start(); | 89 requestBuilder.build().start(); |
| 89 callback.blockForDone(); | 90 callback.blockForDone(); |
| 90 | 91 |
| 91 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); | 92 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); |
| 92 String expectedContent = "This is a simple text file served by QUIC.\n"; | 93 String expectedContent = "This is a simple text file served by QUIC.\n"; |
| 93 assertEquals(expectedContent, callback.mResponseAsString); | 94 assertEquals(expectedContent, callback.mResponseAsString); |
| 94 assertEquals("quic/1+spdy/3", callback.mResponseInfo.getNegotiatedProtoc
ol()); | 95 assertIsQuic(callback.mResponseInfo); |
| 95 // The total received bytes should be larger than the content length, to
account for | 96 // The total received bytes should be larger than the content length, to
account for |
| 96 // headers. | 97 // headers. |
| 97 assertTrue(callback.mResponseInfo.getReceivedBytesCount() > expectedCont
ent.length()); | 98 assertTrue(callback.mResponseInfo.getReceivedBytesCount() > expectedCont
ent.length()); |
| 98 // This test takes a long time, since the update will only be scheduled | 99 // This test takes a long time, since the update will only be scheduled |
| 99 // after kUpdatePrefsDelayMs in http_server_properties_manager.cc. | 100 // after kUpdatePrefsDelayMs in http_server_properties_manager.cc. |
| 100 while (true) { | 101 while (true) { |
| 101 Log.i(TAG, "Still waiting for pref file update....."); | 102 Log.i(TAG, "Still waiting for pref file update....."); |
| 102 Thread.sleep(10000); | 103 Thread.sleep(10000); |
| 103 boolean contains = false; | 104 boolean contains = false; |
| 104 try { | 105 try { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 127 CronetTestUtil.setMockCertVerifierForTesting( | 128 CronetTestUtil.setMockCertVerifierForTesting( |
| 128 builder, QuicTestServer.createMockCertVerifier()); | 129 builder, QuicTestServer.createMockCertVerifier()); |
| 129 mTestFramework = startCronetTestFrameworkWithUrlAndCronetEngineBuilder(n
ull, builder); | 130 mTestFramework = startCronetTestFrameworkWithUrlAndCronetEngineBuilder(n
ull, builder); |
| 130 TestUrlRequestCallback callback2 = new TestUrlRequestCallback(); | 131 TestUrlRequestCallback callback2 = new TestUrlRequestCallback(); |
| 131 requestBuilder = mTestFramework.mCronetEngine.newUrlRequestBuilder( | 132 requestBuilder = mTestFramework.mCronetEngine.newUrlRequestBuilder( |
| 132 quicURL, callback2, callback2.getExecutor()); | 133 quicURL, callback2, callback2.getExecutor()); |
| 133 requestBuilder.build().start(); | 134 requestBuilder.build().start(); |
| 134 callback2.blockForDone(); | 135 callback2.blockForDone(); |
| 135 assertEquals(200, callback2.mResponseInfo.getHttpStatusCode()); | 136 assertEquals(200, callback2.mResponseInfo.getHttpStatusCode()); |
| 136 assertEquals(expectedContent, callback2.mResponseAsString); | 137 assertEquals(expectedContent, callback2.mResponseAsString); |
| 137 assertEquals("quic/1+spdy/3", callback2.mResponseInfo.getNegotiatedProto
col()); | 138 assertIsQuic(callback.mResponseInfo); |
| 138 // The total received bytes should be larger than the content length, to
account for | 139 // The total received bytes should be larger than the content length, to
account for |
| 139 // headers. | 140 // headers. |
| 140 assertTrue(callback2.mResponseInfo.getReceivedBytesCount() > expectedCon
tent.length()); | 141 assertTrue(callback2.mResponseInfo.getReceivedBytesCount() > expectedCon
tent.length()); |
| 141 } | 142 } |
| 142 | 143 |
| 143 // Returns whether a file contains a particular string. | 144 // Returns whether a file contains a particular string. |
| 144 @SuppressFBWarnings("OBL_UNSATISFIED_OBLIGATION_EXCEPTION_EDGE") | 145 @SuppressFBWarnings("OBL_UNSATISFIED_OBLIGATION_EXCEPTION_EDGE") |
| 145 private boolean fileContainsString(String filename, String content) throws I
OException { | 146 private boolean fileContainsString(String filename, String content) throws I
OException { |
| 146 File file = | 147 File file = |
| 147 new File(CronetTestFramework.getTestStorage(getContext()) + "/pr
efs/" + filename); | 148 new File(CronetTestFramework.getTestStorage(getContext()) + "/pr
efs/" + filename); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 178 // QUIC will always succeed with a 200 (see | 179 // QUIC will always succeed with a 200 (see |
| 179 // net::HttpStreamFactoryImpl::Request::OnStreamFailed). | 180 // net::HttpStreamFactoryImpl::Request::OnStreamFailed). |
| 180 UrlRequest.Builder requestBuilder = mTestFramework.mCronetEngine.newUrlR
equestBuilder( | 181 UrlRequest.Builder requestBuilder = mTestFramework.mCronetEngine.newUrlR
equestBuilder( |
| 181 quicURL, callback, callback.getExecutor()); | 182 quicURL, callback, callback.getExecutor()); |
| 182 requestBuilder.build().start(); | 183 requestBuilder.build().start(); |
| 183 callback.blockForDone(); | 184 callback.blockForDone(); |
| 184 | 185 |
| 185 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); | 186 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); |
| 186 String expectedContent = "This is a simple text file served by QUIC.\n"; | 187 String expectedContent = "This is a simple text file served by QUIC.\n"; |
| 187 assertEquals(expectedContent, callback.mResponseAsString); | 188 assertEquals(expectedContent, callback.mResponseAsString); |
| 188 assertEquals("quic/1+spdy/3", callback.mResponseInfo.getNegotiatedProtoc
ol()); | 189 assertIsQuic(callback.mResponseInfo); |
| 189 | 190 |
| 190 // Throughput observation is posted to the network quality estimator on
the network thread | 191 // Throughput observation is posted to the network quality estimator on
the network thread |
| 191 // after the UrlRequest is completed. The observations are then eventual
ly posted to | 192 // after the UrlRequest is completed. The observations are then eventual
ly posted to |
| 192 // throughput listeners on the executor provided to network quality. | 193 // throughput listeners on the executor provided to network quality. |
| 193 waitForThroughput.block(); | 194 waitForThroughput.block(); |
| 194 assertTrue(throughputListener.throughputObservationCount() > 0); | 195 assertTrue(throughputListener.throughputObservationCount() > 0); |
| 195 | 196 |
| 196 // Check RTT observation count after throughput observation has been rec
eived. This ensures | 197 // Check RTT observation count after throughput observation has been rec
eived. This ensures |
| 197 // that executor has finished posting the RTT observation to the RTT lis
teners. | 198 // that executor has finished posting the RTT observation to the RTT lis
teners. |
| 198 // NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST | 199 // NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST |
| (...skipping 23 matching lines...) Expand all Loading... |
| 222 | 223 |
| 223 UrlRequest.Builder requestBuilder = mTestFramework.mCronetEngine.newUrlR
equestBuilder( | 224 UrlRequest.Builder requestBuilder = mTestFramework.mCronetEngine.newUrlR
equestBuilder( |
| 224 quicURL, callback, callback.getExecutor()); | 225 quicURL, callback, callback.getExecutor()); |
| 225 Date startTime = new Date(); | 226 Date startTime = new Date(); |
| 226 requestBuilder.build().start(); | 227 requestBuilder.build().start(); |
| 227 callback.blockForDone(); | 228 callback.blockForDone(); |
| 228 requestFinishedListener.blockUntilDone(); | 229 requestFinishedListener.blockUntilDone(); |
| 229 Date endTime = new Date(); | 230 Date endTime = new Date(); |
| 230 | 231 |
| 231 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); | 232 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); |
| 232 assertEquals("quic/1+spdy/3", callback.mResponseInfo.getNegotiatedProtoc
ol()); | 233 assertIsQuic(callback.mResponseInfo); |
| 233 | 234 |
| 234 RequestFinishedInfo requestInfo = requestFinishedListener.getRequestInfo
(); | 235 RequestFinishedInfo requestInfo = requestFinishedListener.getRequestInfo
(); |
| 235 MetricsTestUtil.checkRequestFinishedInfo(requestInfo, quicURL, startTime
, endTime); | 236 MetricsTestUtil.checkRequestFinishedInfo(requestInfo, quicURL, startTime
, endTime); |
| 236 assertEquals(RequestFinishedInfo.SUCCEEDED, requestInfo.getFinishedReaso
n()); | 237 assertEquals(RequestFinishedInfo.SUCCEEDED, requestInfo.getFinishedReaso
n()); |
| 237 MetricsTestUtil.checkHasConnectTiming(requestInfo.getMetrics(), startTim
e, endTime, true); | 238 MetricsTestUtil.checkHasConnectTiming(requestInfo.getMetrics(), startTim
e, endTime, true); |
| 238 | 239 |
| 239 // Second request should use the same connection and not have ConnectTim
ing numbers | 240 // Second request should use the same connection and not have ConnectTim
ing numbers |
| 240 callback = new TestUrlRequestCallback(); | 241 callback = new TestUrlRequestCallback(); |
| 241 requestFinishedListener.reset(); | 242 requestFinishedListener.reset(); |
| 242 requestBuilder = mTestFramework.mCronetEngine.newUrlRequestBuilder( | 243 requestBuilder = mTestFramework.mCronetEngine.newUrlRequestBuilder( |
| 243 quicURL, callback, callback.getExecutor()); | 244 quicURL, callback, callback.getExecutor()); |
| 244 startTime = new Date(); | 245 startTime = new Date(); |
| 245 requestBuilder.build().start(); | 246 requestBuilder.build().start(); |
| 246 callback.blockForDone(); | 247 callback.blockForDone(); |
| 247 requestFinishedListener.blockUntilDone(); | 248 requestFinishedListener.blockUntilDone(); |
| 248 endTime = new Date(); | 249 endTime = new Date(); |
| 249 | 250 |
| 250 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); | 251 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); |
| 251 assertEquals("quic/1+spdy/3", callback.mResponseInfo.getNegotiatedProtoc
ol()); | 252 assertIsQuic(callback.mResponseInfo); |
| 252 | 253 |
| 253 requestInfo = requestFinishedListener.getRequestInfo(); | 254 requestInfo = requestFinishedListener.getRequestInfo(); |
| 254 MetricsTestUtil.checkRequestFinishedInfo(requestInfo, quicURL, startTime
, endTime); | 255 MetricsTestUtil.checkRequestFinishedInfo(requestInfo, quicURL, startTime
, endTime); |
| 255 assertEquals(RequestFinishedInfo.SUCCEEDED, requestInfo.getFinishedReaso
n()); | 256 assertEquals(RequestFinishedInfo.SUCCEEDED, requestInfo.getFinishedReaso
n()); |
| 256 MetricsTestUtil.checkNoConnectTiming(requestInfo.getMetrics()); | 257 MetricsTestUtil.checkNoConnectTiming(requestInfo.getMetrics()); |
| 257 | 258 |
| 258 mTestFramework.mCronetEngine.shutdown(); | 259 mTestFramework.mCronetEngine.shutdown(); |
| 259 } | 260 } |
| 261 |
| 262 // Helper method to assert that the request is negotiated over QUIC. |
| 263 private void assertIsQuic(UrlResponseInfo responseInfo) { |
| 264 assertTrue(responseInfo.getNegotiatedProtocol().startsWith(QUIC_PROTOCOL
_STRING_PREFIX)); |
| 265 } |
| 260 } | 266 } |
| OLD | NEW |