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

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

Issue 2339223002: Cronet API Refactoring (Closed)
Patch Set: Rebased onto Charles change + Paul's Comments 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;
15 import org.chromium.net.MetricsTestUtil.TestExecutor; 14 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;
25 import java.util.HashSet; 24 import java.util.HashSet;
26 import java.util.List; 25 import java.util.List;
27 import java.util.Map; 26 import java.util.Map;
28 import java.util.regex.Matcher; 27 import java.util.regex.Matcher;
29 import java.util.regex.Pattern; 28 import java.util.regex.Pattern;
30 29
31 /** 30 /**
32 * Test functionality of BidirectionalStream interface. 31 * Test functionality of BidirectionalStream interface.
33 */ 32 */
34 public class BidirectionalStreamTest extends CronetTestBase { 33 public class BidirectionalStreamTest extends CronetTestBase {
35 private CronetTestFramework mTestFramework; 34 private CronetTestFramework mTestFramework;
36 35
37 @Override 36 @Override
38 protected void setUp() throws Exception { 37 protected void setUp() throws Exception {
39 super.setUp(); 38 super.setUp();
40 // Load library first to create MockCertVerifier. 39 // Load library first to create MockCertVerifier.
41 System.loadLibrary("cronet_tests"); 40 System.loadLibrary("cronet_tests");
42 CronetEngine.Builder builder = new CronetEngine.Builder(getContext()); 41 ExperimentalCronetEngine.Builder builder =
43 builder.setMockCertVerifierForTesting(QuicTestServer.createMockCertVerif ier()); 42 new ExperimentalCronetEngine.Builder(getContext());
43 CronetTestUtil.setMockCertVerifierForTesting(
44 builder, QuicTestServer.createMockCertVerifier());
44 45
45 mTestFramework = startCronetTestFrameworkWithUrlAndCronetEngineBuilder(n ull, builder); 46 mTestFramework = startCronetTestFrameworkWithUrlAndCronetEngineBuilder(n ull, builder);
46 assertTrue(Http2TestServer.startHttp2TestServer( 47 assertTrue(Http2TestServer.startHttp2TestServer(
47 getContext(), QuicTestServer.getServerCert(), QuicTestServer.get ServerCertKey())); 48 getContext(), QuicTestServer.getServerCert(), QuicTestServer.get ServerCertKey()));
48 } 49 }
49 50
50 @Override 51 @Override
51 protected void tearDown() throws Exception { 52 protected void tearDown() throws Exception {
52 assertTrue(Http2TestServer.shutdownHttp2TestServer()); 53 assertTrue(Http2TestServer.shutdownHttp2TestServer());
53 if (mTestFramework.mCronetEngine != null) { 54 if (mTestFramework.mCronetEngine != null) {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 Arrays.asList(urls), statusCode, message, headersList, false, "h 2", null); 88 Arrays.asList(urls), statusCode, message, headersList, false, "h 2", null);
88 urlResponseInfo.setReceivedBytesCount(receivedBytes); 89 urlResponseInfo.setReceivedBytesCount(receivedBytes);
89 return urlResponseInfo; 90 return urlResponseInfo;
90 } 91 }
91 92
92 private void runSimpleGetWithExpectedReceivedBytesCount(int expectedReceived Bytes) 93 private void runSimpleGetWithExpectedReceivedBytesCount(int expectedReceived Bytes)
93 throws Exception { 94 throws Exception {
94 String url = Http2TestServer.getEchoMethodUrl(); 95 String url = Http2TestServer.getEchoMethodUrl();
95 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 96 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
96 // Create stream. 97 // Create stream.
97 BidirectionalStream stream = new BidirectionalStream 98 BidirectionalStream stream =
98 .Builder(url, callback, callback.ge tExecutor(), 99 mTestFramework.mCronetEngine
99 mTestFramework.mCronetEngin e) 100 .newBidirectionalStreamBuilder(url, callback, callback.g etExecutor())
100 .setHttpMethod("GET") 101 .setHttpMethod("GET")
101 .build(); 102 .build();
102 stream.start(); 103 stream.start();
103 callback.blockForDone(); 104 callback.blockForDone();
104 assertTrue(stream.isDone()); 105 assertTrue(stream.isDone());
105 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 106 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
106 // Default method is 'GET'. 107 // Default method is 'GET'.
107 assertEquals("GET", callback.mResponseAsString); 108 assertEquals("GET", callback.mResponseAsString);
108 UrlResponseInfo urlResponseInfo = createUrlResponseInfo( 109 UrlResponseInfo urlResponseInfo = createUrlResponseInfo(
109 new String[] {url}, "", 200, expectedReceivedBytes, ":status", " 200"); 110 new String[] {url}, "", 200, expectedReceivedBytes, ":status", " 200");
110 assertResponseEquals(urlResponseInfo, callback.mResponseInfo); 111 assertResponseEquals(urlResponseInfo, callback.mResponseInfo);
111 checkResponseInfo(callback.mResponseInfo, Http2TestServer.getEchoMethodU rl(), 200, ""); 112 checkResponseInfo(callback.mResponseInfo, Http2TestServer.getEchoMethodU rl(), 200, "");
112 } 113 }
113 114
114 @SmallTest 115 @SmallTest
115 @Feature({"Cronet"}) 116 @Feature({"Cronet"})
117 @OnlyRunNativeCronet
pauljensen 2016/09/26 14:51:22 perhaps we should run with the java-only impl and
kapishnikov 2016/09/27 18:38:26 I will add a new test.
kapishnikov 2016/09/30 16:01:43 Done.
116 public void testBuilderChecks() throws Exception { 118 public void testBuilderChecks() throws Exception {
117 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 119 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
118 try { 120 try {
119 new BidirectionalStream.Builder( 121 mTestFramework.mCronetEngine.newBidirectionalStreamBuilder(
120 null, callback, callback.getExecutor(), mTestFramework.mCron etEngine); 122 null, callback, callback.getExecutor());
121 fail("URL not null-checked"); 123 fail("URL not null-checked");
122 } catch (NullPointerException e) { 124 } catch (NullPointerException e) {
123 assertEquals("URL is required.", e.getMessage()); 125 assertEquals("URL is required.", e.getMessage());
124 } 126 }
125 try { 127 try {
126 new BidirectionalStream.Builder(Http2TestServer.getServerUrl(), null , 128 mTestFramework.mCronetEngine.newBidirectionalStreamBuilder(
127 callback.getExecutor(), mTestFramework.mCronetEngine); 129 Http2TestServer.getServerUrl(), null, callback.getExecutor() );
128 fail("Callback not null-checked"); 130 fail("Callback not null-checked");
129 } catch (NullPointerException e) { 131 } catch (NullPointerException e) {
130 assertEquals("Callback is required.", e.getMessage()); 132 assertEquals("Callback is required.", e.getMessage());
131 } 133 }
132 try { 134 try {
133 new BidirectionalStream.Builder( 135 mTestFramework.mCronetEngine.newBidirectionalStreamBuilder(
134 Http2TestServer.getServerUrl(), callback, null, mTestFramewo rk.mCronetEngine); 136 Http2TestServer.getServerUrl(), callback, null);
135 fail("Executor not null-checked"); 137 fail("Executor not null-checked");
136 } catch (NullPointerException e) { 138 } catch (NullPointerException e) {
137 assertEquals("Executor is required.", e.getMessage()); 139 assertEquals("Executor is required.", e.getMessage());
138 } 140 }
139 try {
140 new BidirectionalStream.Builder(
141 Http2TestServer.getServerUrl(), callback, callback.getExecut or(), null);
142 fail("CronetEngine not null-checked");
143 } catch (NullPointerException e) {
144 assertEquals("CronetEngine is required.", e.getMessage());
145 }
146 // Verify successful creation doesn't throw. 141 // Verify successful creation doesn't throw.
147 BidirectionalStream.Builder builder = 142 BidirectionalStream.Builder builder =
148 new BidirectionalStream.Builder(Http2TestServer.getServerUrl(), callback, 143 mTestFramework.mCronetEngine.newBidirectionalStreamBuilder(
149 callback.getExecutor(), mTestFramework.mCronetEngine); 144 Http2TestServer.getServerUrl(), callback, callback.getEx ecutor());
150 try { 145 try {
151 builder.addHeader(null, "value"); 146 builder.addHeader(null, "value");
152 fail("Header name is not null-checked"); 147 fail("Header name is not null-checked");
153 } catch (NullPointerException e) { 148 } catch (NullPointerException e) {
154 assertEquals("Invalid header name.", e.getMessage()); 149 assertEquals("Invalid header name.", e.getMessage());
155 } 150 }
156 try { 151 try {
157 builder.addHeader("name", null); 152 builder.addHeader("name", null);
158 fail("Header value is not null-checked"); 153 fail("Header value is not null-checked");
159 } catch (NullPointerException e) { 154 } catch (NullPointerException e) {
160 assertEquals("Invalid header value.", e.getMessage()); 155 assertEquals("Invalid header value.", e.getMessage());
161 } 156 }
162 try { 157 try {
163 builder.setHttpMethod(null); 158 builder.setHttpMethod(null);
164 fail("Method name is not null-checked"); 159 fail("Method name is not null-checked");
165 } catch (NullPointerException e) { 160 } catch (NullPointerException e) {
166 assertEquals("Method is required.", e.getMessage()); 161 assertEquals("Method is required.", e.getMessage());
167 } 162 }
168 } 163 }
169 164
170 @SmallTest 165 @SmallTest
171 @Feature({"Cronet"}) 166 @Feature({"Cronet"})
172 @OnlyRunNativeCronet 167 @OnlyRunNativeCronet
173 public void testFailPlainHttp() throws Exception { 168 public void testFailPlainHttp() throws Exception {
174 String url = "http://example.com"; 169 String url = "http://example.com";
175 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 170 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
176 // Create stream. 171 // Create stream.
177 BidirectionalStream stream = new BidirectionalStream 172 BidirectionalStream stream =
178 .Builder(url, callback, callback.ge tExecutor(), 173 mTestFramework.mCronetEngine
179 mTestFramework.mCronetEngin e) 174 .newBidirectionalStreamBuilder(url, callback, callback.g etExecutor())
180 .build(); 175 .build();
181 stream.start(); 176 stream.start();
182 callback.blockForDone(); 177 callback.blockForDone();
183 assertTrue(stream.isDone()); 178 assertTrue(stream.isDone());
184 assertEquals("Exception in BidirectionalStream: net::ERR_DISALLOWED_URL_ SCHEME", 179 assertEquals("Exception in BidirectionalStream: net::ERR_DISALLOWED_URL_ SCHEME",
185 callback.mError.getMessage()); 180 callback.mError.getMessage());
186 assertEquals(-301, callback.mError.getCronetInternalErrorCode()); 181 assertEquals(-301, callback.mError.getCronetInternalErrorCode());
187 } 182 }
188 183
189 @SmallTest 184 @SmallTest
190 @Feature({"Cronet"}) 185 @Feature({"Cronet"})
191 @OnlyRunNativeCronet 186 @OnlyRunNativeCronet
192 public void testSimpleGet() throws Exception { 187 public void testSimpleGet() throws Exception {
193 // Since this is the first request on the connection, the expected recei ved bytes count 188 // Since this is the first request on the connection, the expected recei ved bytes count
194 // must account for an HPACK dynamic table size update. 189 // must account for an HPACK dynamic table size update.
195 runSimpleGetWithExpectedReceivedBytesCount(31); 190 runSimpleGetWithExpectedReceivedBytesCount(31);
196 } 191 }
197 192
198 @SmallTest 193 @SmallTest
199 @Feature({"Cronet"}) 194 @Feature({"Cronet"})
200 @OnlyRunNativeCronet 195 @OnlyRunNativeCronet
201 public void testSimpleHead() throws Exception { 196 public void testSimpleHead() throws Exception {
202 String url = Http2TestServer.getEchoMethodUrl(); 197 String url = Http2TestServer.getEchoMethodUrl();
203 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 198 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
204 // Create stream. 199 // Create stream.
205 BidirectionalStream stream = new BidirectionalStream 200 BidirectionalStream stream =
206 .Builder(url, callback, callback.ge tExecutor(), 201 mTestFramework.mCronetEngine
207 mTestFramework.mCronetEngin e) 202 .newBidirectionalStreamBuilder(url, callback, callback.g etExecutor())
208 .setHttpMethod("HEAD") 203 .setHttpMethod("HEAD")
209 .build(); 204 .build();
210 stream.start(); 205 stream.start();
211 callback.blockForDone(); 206 callback.blockForDone();
212 assertTrue(stream.isDone()); 207 assertTrue(stream.isDone());
213 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 208 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
214 assertEquals("HEAD", callback.mResponseAsString); 209 assertEquals("HEAD", callback.mResponseAsString);
215 UrlResponseInfo urlResponseInfo = 210 UrlResponseInfo urlResponseInfo =
216 createUrlResponseInfo(new String[] {url}, "", 200, 32, ":status" , "200"); 211 createUrlResponseInfo(new String[] {url}, "", 200, 32, ":status" , "200");
217 assertResponseEquals(urlResponseInfo, callback.mResponseInfo); 212 assertResponseEquals(urlResponseInfo, callback.mResponseInfo);
218 checkResponseInfo(callback.mResponseInfo, Http2TestServer.getEchoMethodU rl(), 200, ""); 213 checkResponseInfo(callback.mResponseInfo, Http2TestServer.getEchoMethodU rl(), 200, "");
219 } 214 }
220 215
221 @SmallTest 216 @SmallTest
222 @Feature({"Cronet"}) 217 @Feature({"Cronet"})
223 @OnlyRunNativeCronet 218 @OnlyRunNativeCronet
224 public void testSimplePost() throws Exception { 219 public void testSimplePost() throws Exception {
225 String url = Http2TestServer.getEchoStreamUrl(); 220 String url = Http2TestServer.getEchoStreamUrl();
226 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 221 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
227 callback.addWriteData("Test String".getBytes()); 222 callback.addWriteData("Test String".getBytes());
228 callback.addWriteData("1234567890".getBytes()); 223 callback.addWriteData("1234567890".getBytes());
229 callback.addWriteData("woot!".getBytes()); 224 callback.addWriteData("woot!".getBytes());
230 TestExecutor testExecutor = new TestExecutor(); 225 TestExecutor testExecutor = new TestExecutor();
231 TestRequestFinishedListener requestFinishedListener = 226 TestRequestFinishedListener requestFinishedListener =
232 new TestRequestFinishedListener(testExecutor); 227 new TestRequestFinishedListener(testExecutor);
233 mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedL istener); 228 mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedL istener);
234 // Create stream. 229 // Create stream.
235 BidirectionalStream stream = new BidirectionalStream 230 BidirectionalStream stream =
236 .Builder(url, callback, callback.ge tExecutor(), 231 mTestFramework.mCronetEngine
237 mTestFramework.mCronetEngin e) 232 .newBidirectionalStreamBuilder(url, callback, callback.g etExecutor())
238 .addHeader("foo", "bar") 233 .addRequestAnnotation(this)
239 .addHeader("empty", "") 234 .addRequestAnnotation("request annotation")
240 .addHeader("Content-Type", "zebra") 235 .addHeader("foo", "bar")
241 .addRequestAnnotation(this) 236 .addHeader("empty", "")
242 .addRequestAnnotation("request anno tation") 237 .addHeader("Content-Type", "zebra")
243 .build(); 238 .build();
244 stream.start(); 239 stream.start();
245 callback.blockForDone(); 240 callback.blockForDone();
246 testExecutor.runAllTasks(); 241 testExecutor.runAllTasks();
247 assertTrue(stream.isDone()); 242 assertTrue(stream.isDone());
248 RequestFinishedInfo finishedInfo = requestFinishedListener.getRequestInf o(); 243 RequestFinishedInfo finishedInfo = requestFinishedListener.getRequestInf o();
249 assertNotNull("RequestFinishedInfo.Listener must be called", finishedInf o); 244 assertNotNull("RequestFinishedInfo.Listener must be called", finishedInf o);
250 assertEquals(url, finishedInfo.getUrl()); 245 assertEquals(url, finishedInfo.getUrl());
251 assertEquals(newHashSet("request annotation", this), 246 assertEquals(newHashSet("request annotation", this),
252 new HashSet<Object>(finishedInfo.getAnnotations())); 247 new HashSet<Object>(finishedInfo.getAnnotations()));
253 assertNotNull(finishedInfo.getResponseInfo()); 248 assertNotNull(finishedInfo.getResponseInfo());
254 // TODO(xunjieli): Check other fields once metrics support is in crbug.c om/648346. 249 // TODO(xunjieli): Check other fields once metrics support is in crbug.c om/648346.
255 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 250 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
256 assertEquals("Test String1234567890woot!", callback.mResponseAsString); 251 assertEquals("Test String1234567890woot!", callback.mResponseAsString);
257 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo ").get(0)); 252 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo ").get(0));
258 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty" ).get(0)); 253 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty" ).get(0));
259 assertEquals( 254 assertEquals(
260 "zebra", callback.mResponseInfo.getAllHeaders().get("echo-conten t-type").get(0)); 255 "zebra", callback.mResponseInfo.getAllHeaders().get("echo-conten t-type").get(0));
261 } 256 }
262 257
263 @SmallTest 258 @SmallTest
264 @Feature({"Cronet"}) 259 @Feature({"Cronet"})
265 @OnlyRunNativeCronet 260 @OnlyRunNativeCronet
266 public void testSimplePostWithFlush() throws Exception { 261 public void testSimplePostWithFlush() throws Exception {
267 String url = Http2TestServer.getEchoStreamUrl(); 262 String url = Http2TestServer.getEchoStreamUrl();
268 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 263 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
269 callback.addWriteData("Test String".getBytes(), false); 264 callback.addWriteData("Test String".getBytes(), false);
270 callback.addWriteData("1234567890".getBytes(), false); 265 callback.addWriteData("1234567890".getBytes(), false);
271 callback.addWriteData("woot!".getBytes(), true); 266 callback.addWriteData("woot!".getBytes(), true);
272 BidirectionalStream stream = new BidirectionalStream 267 BidirectionalStream stream =
273 .Builder(url, callback, callback.ge tExecutor(), 268 mTestFramework.mCronetEngine
274 mTestFramework.mCronetEngin e) 269 .newBidirectionalStreamBuilder(url, callback, callback.g etExecutor())
275 .addHeader("foo", "bar") 270 .addHeader("foo", "bar")
276 .addHeader("empty", "") 271 .addHeader("empty", "")
277 .addHeader("Content-Type", "zebra") 272 .addHeader("Content-Type", "zebra")
278 .build(); 273 .build();
279 // Flush before stream is started should not crash. 274 // Flush before stream is started should not crash.
280 stream.flush(); 275 stream.flush();
281 276
282 stream.start(); 277 stream.start();
283 callback.blockForDone(); 278 callback.blockForDone();
284 assertTrue(stream.isDone()); 279 assertTrue(stream.isDone());
285 280
286 // Flush after stream is completed is no-op. It shouldn't call into the destroyed adapter. 281 // Flush after stream is completed is no-op. It shouldn't call into the destroyed adapter.
287 stream.flush(); 282 stream.flush();
288 283
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 ((CronetBidirectionalStream) stream).getFlushDataFor Testing().size()); 335 ((CronetBidirectionalStream) stream).getFlushDataFor Testing().size());
341 } 336 }
342 } 337 }
343 }; 338 };
344 callback.addWriteData("1".getBytes(), false); 339 callback.addWriteData("1".getBytes(), false);
345 callback.addWriteData("2".getBytes(), false); 340 callback.addWriteData("2".getBytes(), false);
346 callback.addWriteData("3".getBytes(), true); 341 callback.addWriteData("3".getBytes(), true);
347 callback.addWriteData("4".getBytes(), false); 342 callback.addWriteData("4".getBytes(), false);
348 callback.addWriteData("5".getBytes(), true); 343 callback.addWriteData("5".getBytes(), true);
349 callback.addWriteData("6".getBytes(), false); 344 callback.addWriteData("6".getBytes(), false);
350 CronetBidirectionalStream stream = (CronetBidirectionalStream) new Bidir ectionalStream 345 CronetBidirectionalStream stream =
351 .Builder(url, callback, callb ack.getExecutor(), 346 (CronetBidirectionalStream) mTestFramework.mCronetEngine
352 mTestFramework.mCrone tEngine) 347 .newBidirectionalStreamBuilder(url, callback, callback.g etExecutor())
353 .addHeader("foo", "bar") 348 .addHeader("foo", "bar")
354 .addHeader("empty", "") 349 .addHeader("empty", "")
355 .addHeader("Content-Type", "z ebra") 350 .addHeader("Content-Type", "zebra")
356 .build(); 351 .build();
357 callback.setAutoAdvance(false); 352 callback.setAutoAdvance(false);
358 stream.start(); 353 stream.start();
359 callback.waitForNextWriteStep(); // onStreamReady 354 callback.waitForNextWriteStep(); // onStreamReady
360 355
361 assertEquals(0, stream.getPendingDataForTesting().size()); 356 assertEquals(0, stream.getPendingDataForTesting().size());
362 assertEquals(0, stream.getFlushDataForTesting().size()); 357 assertEquals(0, stream.getFlushDataForTesting().size());
363 358
364 // Write 1, 2, 3 and flush(). 359 // Write 1, 2, 3 and flush().
365 callback.startNextWrite(stream); 360 callback.startNextWrite(stream);
366 // Write 4, 5 and flush(). 4, 5 will be in flush queue. 361 // Write 4, 5 and flush(). 4, 5 will be in flush queue.
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 stream.flush(); 394 stream.flush();
400 super.onStreamReady(stream); 395 super.onStreamReady(stream);
401 try { 396 try {
402 // Attempt to write data for GET request. 397 // Attempt to write data for GET request.
403 stream.write(ByteBuffer.wrap("dummy".getBytes()), true); 398 stream.write(ByteBuffer.wrap("dummy".getBytes()), true);
404 } catch (IllegalArgumentException e) { 399 } catch (IllegalArgumentException e) {
405 // Expected. 400 // Expected.
406 } 401 }
407 } 402 }
408 }; 403 };
409 BidirectionalStream stream = new BidirectionalStream 404 BidirectionalStream stream =
410 .Builder(url, callback, callbac k.getExecutor(), 405 mTestFramework.mCronetEngine
411 mTestFramework.mCronetE ngine) 406 .newBidirectionalStreamBuilder(url, callback, callba ck.getExecutor())
412 .setHttpMethod("GET") 407 .setHttpMethod("GET")
413 .delayRequestHeadersUntilFirstF lush(i == 0) 408 .delayRequestHeadersUntilFirstFlush(i == 0)
414 .addHeader("foo", "bar") 409 .addHeader("foo", "bar")
415 .addHeader("empty", "") 410 .addHeader("empty", "")
416 .build(); 411 .build();
417 // Flush before stream is started should not crash. 412 // Flush before stream is started should not crash.
418 stream.flush(); 413 stream.flush();
419 414
420 stream.start(); 415 stream.start();
421 callback.blockForDone(); 416 callback.blockForDone();
422 assertTrue(stream.isDone()); 417 assertTrue(stream.isDone());
423 418
424 // Flush after stream is completed is no-op. It shouldn't call into the destroyed 419 // Flush after stream is completed is no-op. It shouldn't call into the destroyed
425 // adapter. 420 // adapter.
426 stream.flush(); 421 stream.flush();
427 422
428 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 423 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
429 assertEquals("", callback.mResponseAsString); 424 assertEquals("", callback.mResponseAsString);
430 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo -foo").get(0)); 425 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo -foo").get(0));
431 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-em pty").get(0)); 426 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-em pty").get(0));
432 } 427 }
433 } 428 }
434 429
435 @SmallTest 430 @SmallTest
436 @Feature({"Cronet"}) 431 @Feature({"Cronet"})
437 @OnlyRunNativeCronet 432 @OnlyRunNativeCronet
438 public void testSimplePostWithFlushAfterOneWrite() throws Exception { 433 public void testSimplePostWithFlushAfterOneWrite() throws Exception {
439 // TODO(xunjieli): Use ParameterizedTest instead of the loop. 434 // TODO(xunjieli): Use ParameterizedTest instead of the loop.
440 for (int i = 0; i < 2; i++) { 435 for (int i = 0; i < 2; i++) {
441 String url = Http2TestServer.getEchoStreamUrl(); 436 String url = Http2TestServer.getEchoStreamUrl();
442 TestBidirectionalStreamCallback callback = new TestBidirectionalStre amCallback(); 437 TestBidirectionalStreamCallback callback = new TestBidirectionalStre amCallback();
443 callback.addWriteData("Test String".getBytes(), true); 438 callback.addWriteData("Test String".getBytes(), true);
444 BidirectionalStream stream = new BidirectionalStream 439 BidirectionalStream stream =
445 .Builder(url, callback, callbac k.getExecutor(), 440 mTestFramework.mCronetEngine
446 mTestFramework.mCronetE ngine) 441 .newBidirectionalStreamBuilder(url, callback, callba ck.getExecutor())
447 .delayRequestHeadersUntilFirstF lush(i == 0) 442 .delayRequestHeadersUntilFirstFlush(i == 0)
448 .addHeader("foo", "bar") 443 .addHeader("foo", "bar")
449 .addHeader("empty", "") 444 .addHeader("empty", "")
450 .addHeader("Content-Type", "zeb ra") 445 .addHeader("Content-Type", "zebra")
451 .build(); 446 .build();
452 stream.start(); 447 stream.start();
453 callback.blockForDone(); 448 callback.blockForDone();
454 assertTrue(stream.isDone()); 449 assertTrue(stream.isDone());
455 450
456 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 451 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
457 assertEquals("Test String", callback.mResponseAsString); 452 assertEquals("Test String", callback.mResponseAsString);
458 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo -foo").get(0)); 453 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo -foo").get(0));
459 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-em pty").get(0)); 454 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-em pty").get(0));
460 assertEquals("zebra", 455 assertEquals("zebra",
461 callback.mResponseInfo.getAllHeaders().get("echo-content-typ e").get(0)); 456 callback.mResponseInfo.getAllHeaders().get("echo-content-typ e").get(0));
462 } 457 }
463 } 458 }
464 459
465 @SmallTest 460 @SmallTest
466 @Feature({"Cronet"}) 461 @Feature({"Cronet"})
467 @OnlyRunNativeCronet 462 @OnlyRunNativeCronet
468 public void testSimplePostWithFlushTwice() throws Exception { 463 public void testSimplePostWithFlushTwice() throws Exception {
469 // TODO(xunjieli): Use ParameterizedTest instead of the loop. 464 // TODO(xunjieli): Use ParameterizedTest instead of the loop.
470 for (int i = 0; i < 2; i++) { 465 for (int i = 0; i < 2; i++) {
471 String url = Http2TestServer.getEchoStreamUrl(); 466 String url = Http2TestServer.getEchoStreamUrl();
472 TestBidirectionalStreamCallback callback = new TestBidirectionalStre amCallback(); 467 TestBidirectionalStreamCallback callback = new TestBidirectionalStre amCallback();
473 callback.addWriteData("Test String".getBytes(), false); 468 callback.addWriteData("Test String".getBytes(), false);
474 callback.addWriteData("1234567890".getBytes(), false); 469 callback.addWriteData("1234567890".getBytes(), false);
475 callback.addWriteData("woot!".getBytes(), true); 470 callback.addWriteData("woot!".getBytes(), true);
476 callback.addWriteData("Test String".getBytes(), false); 471 callback.addWriteData("Test String".getBytes(), false);
477 callback.addWriteData("1234567890".getBytes(), false); 472 callback.addWriteData("1234567890".getBytes(), false);
478 callback.addWriteData("woot!".getBytes(), true); 473 callback.addWriteData("woot!".getBytes(), true);
479 BidirectionalStream stream = new BidirectionalStream 474 BidirectionalStream stream =
480 .Builder(url, callback, callbac k.getExecutor(), 475 mTestFramework.mCronetEngine
481 mTestFramework.mCronetE ngine) 476 .newBidirectionalStreamBuilder(url, callback, callba ck.getExecutor())
482 .delayRequestHeadersUntilFirstF lush(i == 0) 477 .delayRequestHeadersUntilFirstFlush(i == 0)
483 .addHeader("foo", "bar") 478 .addHeader("foo", "bar")
484 .addHeader("empty", "") 479 .addHeader("empty", "")
485 .addHeader("Content-Type", "zeb ra") 480 .addHeader("Content-Type", "zebra")
486 .build(); 481 .build();
487 stream.start(); 482 stream.start();
488 callback.blockForDone(); 483 callback.blockForDone();
489 assertTrue(stream.isDone()); 484 assertTrue(stream.isDone());
490 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 485 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
491 assertEquals("Test String1234567890woot!Test String1234567890woot!", 486 assertEquals("Test String1234567890woot!Test String1234567890woot!",
492 callback.mResponseAsString); 487 callback.mResponseAsString);
493 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo -foo").get(0)); 488 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo -foo").get(0));
494 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-em pty").get(0)); 489 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-em pty").get(0));
495 assertEquals("zebra", 490 assertEquals("zebra",
496 callback.mResponseInfo.getAllHeaders().get("echo-content-typ e").get(0)); 491 callback.mResponseInfo.getAllHeaders().get("echo-content-typ e").get(0));
(...skipping 14 matching lines...) Expand all
511 } 506 }
512 @Override 507 @Override
513 public void onResponseHeadersReceived( 508 public void onResponseHeadersReceived(
514 BidirectionalStream stream, UrlResponseInfo info) { 509 BidirectionalStream stream, UrlResponseInfo info) {
515 // Do nothing. Skip readng. 510 // Do nothing. Skip readng.
516 } 511 }
517 }; 512 };
518 callback.addWriteData("Test String".getBytes()); 513 callback.addWriteData("Test String".getBytes());
519 callback.addWriteData("1234567890".getBytes()); 514 callback.addWriteData("1234567890".getBytes());
520 callback.addWriteData("woot!".getBytes()); 515 callback.addWriteData("woot!".getBytes());
521 BidirectionalStream stream = new BidirectionalStream 516 BidirectionalStream stream =
522 .Builder(url, callback, callback.ge tExecutor(), 517 mTestFramework.mCronetEngine
523 mTestFramework.mCronetEngin e) 518 .newBidirectionalStreamBuilder(url, callback, callback.g etExecutor())
524 .addHeader("foo", "bar") 519 .addHeader("foo", "bar")
525 .addHeader("empty", "") 520 .addHeader("empty", "")
526 .addHeader("Content-Type", "zebra") 521 .addHeader("Content-Type", "zebra")
527 .build(); 522 .build();
528 stream.start(); 523 stream.start();
529 callback.blockForDone(); 524 callback.blockForDone();
530 assertTrue(stream.isDone()); 525 assertTrue(stream.isDone());
531 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 526 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
532 assertEquals("Test String1234567890woot!", callback.mResponseAsString); 527 assertEquals("Test String1234567890woot!", callback.mResponseAsString);
533 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo ").get(0)); 528 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo ").get(0));
534 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty" ).get(0)); 529 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty" ).get(0));
535 assertEquals( 530 assertEquals(
536 "zebra", callback.mResponseInfo.getAllHeaders().get("echo-conten t-type").get(0)); 531 "zebra", callback.mResponseInfo.getAllHeaders().get("echo-conten t-type").get(0));
537 } 532 }
(...skipping 13 matching lines...) Expand all
551 startNextWrite(stream); 546 startNextWrite(stream);
552 assertEquals(0, numPendingWrites()); 547 assertEquals(0, numPendingWrites());
553 } 548 }
554 }; 549 };
555 callback.addWriteData("Test String".getBytes(), false); 550 callback.addWriteData("Test String".getBytes(), false);
556 callback.addWriteData("1234567890".getBytes(), false); 551 callback.addWriteData("1234567890".getBytes(), false);
557 callback.addWriteData("woot!".getBytes(), true); 552 callback.addWriteData("woot!".getBytes(), true);
558 callback.addWriteData("Test String".getBytes(), false); 553 callback.addWriteData("Test String".getBytes(), false);
559 callback.addWriteData("1234567890".getBytes(), false); 554 callback.addWriteData("1234567890".getBytes(), false);
560 callback.addWriteData("woot!".getBytes(), true); 555 callback.addWriteData("woot!".getBytes(), true);
561 BidirectionalStream stream = new BidirectionalStream 556 BidirectionalStream stream =
562 .Builder(url, callback, callback.ge tExecutor(), 557 mTestFramework.mCronetEngine
563 mTestFramework.mCronetEngin e) 558 .newBidirectionalStreamBuilder(url, callback, callback.g etExecutor())
564 .addHeader("foo", "bar") 559 .addHeader("foo", "bar")
565 .addHeader("empty", "") 560 .addHeader("empty", "")
566 .addHeader("Content-Type", "zebra") 561 .addHeader("Content-Type", "zebra")
567 .build(); 562 .build();
568 stream.start(); 563 stream.start();
569 callback.blockForDone(); 564 callback.blockForDone();
570 assertTrue(stream.isDone()); 565 assertTrue(stream.isDone());
571 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 566 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
572 assertEquals( 567 assertEquals(
573 "Test String1234567890woot!Test String1234567890woot!", callback .mResponseAsString); 568 "Test String1234567890woot!Test String1234567890woot!", callback .mResponseAsString);
574 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo ").get(0)); 569 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo ").get(0));
575 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty" ).get(0)); 570 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty" ).get(0));
576 assertEquals( 571 assertEquals(
577 "zebra", callback.mResponseInfo.getAllHeaders().get("echo-conten t-type").get(0)); 572 "zebra", callback.mResponseInfo.getAllHeaders().get("echo-conten t-type").get(0));
578 } 573 }
579 574
580 @SmallTest 575 @SmallTest
581 @Feature({"Cronet"}) 576 @Feature({"Cronet"})
582 @OnlyRunNativeCronet 577 @OnlyRunNativeCronet
583 public void testSimplePut() throws Exception { 578 public void testSimplePut() throws Exception {
584 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 579 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
585 callback.addWriteData("Put This Data!".getBytes()); 580 callback.addWriteData("Put This Data!".getBytes());
586 String methodName = "PUT"; 581 String methodName = "PUT";
587 BidirectionalStream.Builder builder = 582 BidirectionalStream.Builder builder =
588 new BidirectionalStream.Builder(Http2TestServer.getServerUrl(), callback, 583 mTestFramework.mCronetEngine.newBidirectionalStreamBuilder(
589 callback.getExecutor(), mTestFramework.mCronetEngine); 584 Http2TestServer.getServerUrl(), callback, callback.getEx ecutor());
590 builder.setHttpMethod(methodName); 585 builder.setHttpMethod(methodName);
591 builder.build().start(); 586 builder.build().start();
592 callback.blockForDone(); 587 callback.blockForDone();
593 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 588 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
594 assertEquals("Put This Data!", callback.mResponseAsString); 589 assertEquals("Put This Data!", callback.mResponseAsString);
595 assertEquals(methodName, callback.mResponseInfo.getAllHeaders().get("ech o-method").get(0)); 590 assertEquals(methodName, callback.mResponseInfo.getAllHeaders().get("ech o-method").get(0));
596 } 591 }
597 592
598 @SmallTest 593 @SmallTest
599 @Feature({"Cronet"}) 594 @Feature({"Cronet"})
600 @OnlyRunNativeCronet 595 @OnlyRunNativeCronet
601 public void testBadMethod() throws Exception { 596 public void testBadMethod() throws Exception {
602 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 597 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
603 BidirectionalStream.Builder builder = 598 BidirectionalStream.Builder builder =
604 new BidirectionalStream.Builder(Http2TestServer.getServerUrl(), callback, 599 mTestFramework.mCronetEngine.newBidirectionalStreamBuilder(
605 callback.getExecutor(), mTestFramework.mCronetEngine); 600 Http2TestServer.getServerUrl(), callback, callback.getEx ecutor());
606 try { 601 try {
607 builder.setHttpMethod("bad:method!"); 602 builder.setHttpMethod("bad:method!");
608 builder.build().start(); 603 builder.build().start();
609 fail("IllegalArgumentException not thrown."); 604 fail("IllegalArgumentException not thrown.");
610 } catch (IllegalArgumentException e) { 605 } catch (IllegalArgumentException e) {
611 assertEquals("Invalid http method bad:method!", e.getMessage()); 606 assertEquals("Invalid http method bad:method!", e.getMessage());
612 } 607 }
613 } 608 }
614 609
615 @SmallTest 610 @SmallTest
616 @Feature({"Cronet"}) 611 @Feature({"Cronet"})
617 @OnlyRunNativeCronet 612 @OnlyRunNativeCronet
618 public void testBadHeaderName() throws Exception { 613 public void testBadHeaderName() throws Exception {
619 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 614 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
620 BidirectionalStream.Builder builder = 615 BidirectionalStream.Builder builder =
621 new BidirectionalStream.Builder(Http2TestServer.getServerUrl(), callback, 616 mTestFramework.mCronetEngine.newBidirectionalStreamBuilder(
622 callback.getExecutor(), mTestFramework.mCronetEngine); 617 Http2TestServer.getServerUrl(), callback, callback.getEx ecutor());
623 try { 618 try {
624 builder.addHeader("goodheader1", "headervalue"); 619 builder.addHeader("goodheader1", "headervalue");
625 builder.addHeader("header:name", "headervalue"); 620 builder.addHeader("header:name", "headervalue");
626 builder.addHeader("goodheader2", "headervalue"); 621 builder.addHeader("goodheader2", "headervalue");
627 builder.build().start(); 622 builder.build().start();
628 fail("IllegalArgumentException not thrown."); 623 fail("IllegalArgumentException not thrown.");
629 } catch (IllegalArgumentException e) { 624 } catch (IllegalArgumentException e) {
630 assertEquals("Invalid header header:name=headervalue", e.getMessage( )); 625 assertEquals("Invalid header header:name=headervalue", e.getMessage( ));
631 } 626 }
632 } 627 }
633 628
634 @SmallTest 629 @SmallTest
635 @Feature({"Cronet"}) 630 @Feature({"Cronet"})
636 @OnlyRunNativeCronet 631 @OnlyRunNativeCronet
637 public void testBadHeaderValue() throws Exception { 632 public void testBadHeaderValue() throws Exception {
638 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 633 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
639 BidirectionalStream.Builder builder = 634 BidirectionalStream.Builder builder =
640 new BidirectionalStream.Builder(Http2TestServer.getServerUrl(), callback, 635 mTestFramework.mCronetEngine.newBidirectionalStreamBuilder(
641 callback.getExecutor(), mTestFramework.mCronetEngine); 636 Http2TestServer.getServerUrl(), callback, callback.getEx ecutor());
642 try { 637 try {
643 builder.addHeader("headername", "bad header\r\nvalue"); 638 builder.addHeader("headername", "bad header\r\nvalue");
644 builder.build().start(); 639 builder.build().start();
645 fail("IllegalArgumentException not thrown."); 640 fail("IllegalArgumentException not thrown.");
646 } catch (IllegalArgumentException e) { 641 } catch (IllegalArgumentException e) {
647 assertEquals("Invalid header headername=bad header\r\nvalue", e.getM essage()); 642 assertEquals("Invalid header headername=bad header\r\nvalue", e.getM essage());
648 } 643 }
649 } 644 }
650 645
651 @SmallTest 646 @SmallTest
652 @Feature({"Cronet"}) 647 @Feature({"Cronet"})
653 @OnlyRunNativeCronet 648 @OnlyRunNativeCronet
654 public void testAddHeader() throws Exception { 649 public void testAddHeader() throws Exception {
655 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 650 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
656 String headerName = "header-name"; 651 String headerName = "header-name";
657 String headerValue = "header-value"; 652 String headerValue = "header-value";
658 BidirectionalStream.Builder builder = 653 BidirectionalStream.Builder builder =
659 new BidirectionalStream.Builder(Http2TestServer.getEchoHeaderUrl (headerName), 654 mTestFramework.mCronetEngine.newBidirectionalStreamBuilder(
660 callback, callback.getExecutor(), mTestFramework.mCronet Engine); 655 Http2TestServer.getEchoHeaderUrl(headerName), callback,
656 callback.getExecutor());
661 builder.addHeader(headerName, headerValue); 657 builder.addHeader(headerName, headerValue);
662 builder.setHttpMethod("GET"); 658 builder.setHttpMethod("GET");
663 builder.build().start(); 659 builder.build().start();
664 callback.blockForDone(); 660 callback.blockForDone();
665 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 661 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
666 assertEquals(headerValue, callback.mResponseAsString); 662 assertEquals(headerValue, callback.mResponseAsString);
667 } 663 }
668 664
669 @SmallTest 665 @SmallTest
670 @Feature({"Cronet"}) 666 @Feature({"Cronet"})
671 @OnlyRunNativeCronet 667 @OnlyRunNativeCronet
672 public void testMultiRequestHeaders() throws Exception { 668 public void testMultiRequestHeaders() throws Exception {
673 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 669 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
674 String headerName = "header-name"; 670 String headerName = "header-name";
675 String headerValue1 = "header-value1"; 671 String headerValue1 = "header-value1";
676 String headerValue2 = "header-value2"; 672 String headerValue2 = "header-value2";
677 BidirectionalStream.Builder builder = 673 BidirectionalStream.Builder builder =
678 new BidirectionalStream.Builder(Http2TestServer.getEchoAllHeader sUrl(), callback, 674 mTestFramework.mCronetEngine.newBidirectionalStreamBuilder(
679 callback.getExecutor(), mTestFramework.mCronetEngine); 675 Http2TestServer.getEchoAllHeadersUrl(), callback, callba ck.getExecutor());
680 builder.addHeader(headerName, headerValue1); 676 builder.addHeader(headerName, headerValue1);
681 builder.addHeader(headerName, headerValue2); 677 builder.addHeader(headerName, headerValue2);
682 builder.setHttpMethod("GET"); 678 builder.setHttpMethod("GET");
683 builder.build().start(); 679 builder.build().start();
684 callback.blockForDone(); 680 callback.blockForDone();
685 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 681 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
686 String headers = callback.mResponseAsString; 682 String headers = callback.mResponseAsString;
687 Pattern pattern = Pattern.compile(headerName + ":\\s(.*)\\r\\n"); 683 Pattern pattern = Pattern.compile(headerName + ":\\s(.*)\\r\\n");
688 Matcher matcher = pattern.matcher(headers); 684 Matcher matcher = pattern.matcher(headers);
689 List<String> actualValues = new ArrayList<String>(); 685 List<String> actualValues = new ArrayList<String>();
690 while (matcher.find()) { 686 while (matcher.find()) {
691 actualValues.add(matcher.group(1)); 687 actualValues.add(matcher.group(1));
692 } 688 }
693 assertEquals(1, actualValues.size()); 689 assertEquals(1, actualValues.size());
694 assertEquals("header-value2", actualValues.get(0)); 690 assertEquals("header-value2", actualValues.get(0));
695 } 691 }
696 692
697 @SmallTest 693 @SmallTest
698 @Feature({"Cronet"}) 694 @Feature({"Cronet"})
699 @OnlyRunNativeCronet 695 @OnlyRunNativeCronet
700 public void testEchoTrailers() throws Exception { 696 public void testEchoTrailers() throws Exception {
701 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 697 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
702 String headerName = "header-name"; 698 String headerName = "header-name";
703 String headerValue = "header-value"; 699 String headerValue = "header-value";
704 BidirectionalStream.Builder builder = 700 BidirectionalStream.Builder builder =
705 new BidirectionalStream.Builder(Http2TestServer.getEchoTrailersU rl(), callback, 701 mTestFramework.mCronetEngine.newBidirectionalStreamBuilder(
706 callback.getExecutor(), mTestFramework.mCronetEngine); 702 Http2TestServer.getEchoTrailersUrl(), callback, callback .getExecutor());
707 builder.addHeader(headerName, headerValue); 703 builder.addHeader(headerName, headerValue);
708 builder.setHttpMethod("GET"); 704 builder.setHttpMethod("GET");
709 builder.build().start(); 705 builder.build().start();
710 callback.blockForDone(); 706 callback.blockForDone();
711 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 707 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
712 assertNotNull(callback.mTrailers); 708 assertNotNull(callback.mTrailers);
713 // Verify that header value is properly echoed in trailers. 709 // Verify that header value is properly echoed in trailers.
714 assertEquals(headerValue, callback.mTrailers.getAsMap().get("echo-" + he aderName).get(0)); 710 assertEquals(headerValue, callback.mTrailers.getAsMap().get("echo-" + he aderName).get(0));
715 } 711 }
716 712
717 @SmallTest 713 @SmallTest
718 @Feature({"Cronet"}) 714 @Feature({"Cronet"})
719 @OnlyRunNativeCronet 715 @OnlyRunNativeCronet
720 public void testCustomUserAgent() throws Exception { 716 public void testCustomUserAgent() throws Exception {
721 String userAgentName = "User-Agent"; 717 String userAgentName = "User-Agent";
722 String userAgentValue = "User-Agent-Value"; 718 String userAgentValue = "User-Agent-Value";
723 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 719 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
724 BidirectionalStream.Builder builder = 720 BidirectionalStream.Builder builder =
725 new BidirectionalStream.Builder(Http2TestServer.getEchoHeaderUrl (userAgentName), 721 mTestFramework.mCronetEngine.newBidirectionalStreamBuilder(
726 callback, callback.getExecutor(), mTestFramework.mCronet Engine); 722 Http2TestServer.getEchoHeaderUrl(userAgentName), callbac k,
723 callback.getExecutor());
727 builder.setHttpMethod("GET"); 724 builder.setHttpMethod("GET");
728 builder.addHeader(userAgentName, userAgentValue); 725 builder.addHeader(userAgentName, userAgentValue);
729 builder.build().start(); 726 builder.build().start();
730 callback.blockForDone(); 727 callback.blockForDone();
731 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 728 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
732 assertEquals(userAgentValue, callback.mResponseAsString); 729 assertEquals(userAgentValue, callback.mResponseAsString);
733 } 730 }
734 731
735 @SmallTest 732 @SmallTest
736 @Feature({"Cronet"}) 733 @Feature({"Cronet"})
737 @OnlyRunNativeCronet 734 @OnlyRunNativeCronet
738 public void testCustomCronetEngineUserAgent() throws Exception { 735 public void testCustomCronetEngineUserAgent() throws Exception {
739 String userAgentName = "User-Agent"; 736 String userAgentName = "User-Agent";
740 String userAgentValue = "User-Agent-Value"; 737 String userAgentValue = "User-Agent-Value";
741 CronetEngine engine = 738 ExperimentalCronetEngine.Builder engineBuilder =
742 new CronetEngine.Builder(getContext()) 739 new ExperimentalCronetEngine.Builder(getContext());
743 .setMockCertVerifierForTesting(QuicTestServer.createMock CertVerifier()) 740 engineBuilder.setUserAgent(userAgentValue);
744 .setUserAgent(userAgentValue) 741 CronetTestUtil.setMockCertVerifierForTesting(
745 .build(); 742 engineBuilder, QuicTestServer.createMockCertVerifier());
743 ExperimentalCronetEngine engine = engineBuilder.build();
746 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 744 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
747 BidirectionalStream.Builder builder = 745 BidirectionalStream.Builder builder = engine.newBidirectionalStreamBuild er(
748 new BidirectionalStream.Builder(Http2TestServer.getEchoHeaderUrl (userAgentName), 746 Http2TestServer.getEchoHeaderUrl(userAgentName), callback, callb ack.getExecutor());
749 callback, callback.getExecutor(), engine);
750 builder.setHttpMethod("GET"); 747 builder.setHttpMethod("GET");
751 builder.build().start(); 748 builder.build().start();
752 callback.blockForDone(); 749 callback.blockForDone();
753 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 750 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
754 assertEquals(userAgentValue, callback.mResponseAsString); 751 assertEquals(userAgentValue, callback.mResponseAsString);
755 } 752 }
756 753
757 @SmallTest 754 @SmallTest
758 @Feature({"Cronet"}) 755 @Feature({"Cronet"})
759 @OnlyRunNativeCronet 756 @OnlyRunNativeCronet
760 public void testDefaultUserAgent() throws Exception { 757 public void testDefaultUserAgent() throws Exception {
761 String userAgentName = "User-Agent"; 758 String userAgentName = "User-Agent";
762 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 759 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
763 BidirectionalStream.Builder builder = 760 BidirectionalStream.Builder builder =
764 new BidirectionalStream.Builder(Http2TestServer.getEchoHeaderUrl (userAgentName), 761 mTestFramework.mCronetEngine.newBidirectionalStreamBuilder(
765 callback, callback.getExecutor(), mTestFramework.mCronet Engine); 762 Http2TestServer.getEchoHeaderUrl(userAgentName), callbac k,
763 callback.getExecutor());
766 builder.setHttpMethod("GET"); 764 builder.setHttpMethod("GET");
767 builder.build().start(); 765 builder.build().start();
768 callback.blockForDone(); 766 callback.blockForDone();
769 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 767 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
770 assertEquals(new CronetEngine.Builder(getContext()).getDefaultUserAgent( ), 768 assertEquals(new CronetEngine.Builder(getContext()).getDefaultUserAgent( ),
771 callback.mResponseAsString); 769 callback.mResponseAsString);
772 } 770 }
773 771
774 @SmallTest 772 @SmallTest
775 @Feature({"Cronet"}) 773 @Feature({"Cronet"})
776 @OnlyRunNativeCronet 774 @OnlyRunNativeCronet
777 public void testEchoStream() throws Exception { 775 public void testEchoStream() throws Exception {
778 String url = Http2TestServer.getEchoStreamUrl(); 776 String url = Http2TestServer.getEchoStreamUrl();
779 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 777 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
780 String[] testData = {"Test String", createLongString("1234567890", 50000 ), "woot!"}; 778 String[] testData = {"Test String", createLongString("1234567890", 50000 ), "woot!"};
781 StringBuilder stringData = new StringBuilder(); 779 StringBuilder stringData = new StringBuilder();
782 for (String writeData : testData) { 780 for (String writeData : testData) {
783 callback.addWriteData(writeData.getBytes()); 781 callback.addWriteData(writeData.getBytes());
784 stringData.append(writeData); 782 stringData.append(writeData);
785 } 783 }
786 // Create stream. 784 // Create stream.
787 BidirectionalStream stream = new BidirectionalStream 785 BidirectionalStream stream =
788 .Builder(url, callback, callback.ge tExecutor(), 786 mTestFramework.mCronetEngine
789 mTestFramework.mCronetEngin e) 787 .newBidirectionalStreamBuilder(url, callback, callback.g etExecutor())
790 .addHeader("foo", "Value with Space s") 788 .addHeader("foo", "Value with Spaces")
791 .addHeader("Content-Type", "zebra") 789 .addHeader("Content-Type", "zebra")
792 .build(); 790 .build();
793 stream.start(); 791 stream.start();
794 callback.blockForDone(); 792 callback.blockForDone();
795 assertTrue(stream.isDone()); 793 assertTrue(stream.isDone());
796 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 794 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
797 assertEquals(stringData.toString(), callback.mResponseAsString); 795 assertEquals(stringData.toString(), callback.mResponseAsString);
798 assertEquals( 796 assertEquals(
799 "Value with Spaces", callback.mResponseInfo.getAllHeaders().get( "echo-foo").get(0)); 797 "Value with Spaces", callback.mResponseInfo.getAllHeaders().get( "echo-foo").get(0));
800 assertEquals( 798 assertEquals(
801 "zebra", callback.mResponseInfo.getAllHeaders().get("echo-conten t-type").get(0)); 799 "zebra", callback.mResponseInfo.getAllHeaders().get("echo-conten t-type").get(0));
802 } 800 }
803 801
804 @SmallTest 802 @SmallTest
805 @Feature({"Cronet"}) 803 @Feature({"Cronet"})
806 @OnlyRunNativeCronet 804 @OnlyRunNativeCronet
807 public void testEchoStreamEmptyWrite() throws Exception { 805 public void testEchoStreamEmptyWrite() throws Exception {
808 String url = Http2TestServer.getEchoStreamUrl(); 806 String url = Http2TestServer.getEchoStreamUrl();
809 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 807 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
810 callback.addWriteData(new byte[0]); 808 callback.addWriteData(new byte[0]);
811 // Create stream. 809 // Create stream.
812 BidirectionalStream stream = new BidirectionalStream 810 BidirectionalStream stream =
813 .Builder(url, callback, callback.ge tExecutor(), 811 mTestFramework.mCronetEngine
814 mTestFramework.mCronetEngin e) 812 .newBidirectionalStreamBuilder(url, callback, callback.g etExecutor())
815 .build(); 813 .build();
816 stream.start(); 814 stream.start();
817 callback.blockForDone(); 815 callback.blockForDone();
818 assertTrue(stream.isDone()); 816 assertTrue(stream.isDone());
819 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 817 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
820 assertEquals("", callback.mResponseAsString); 818 assertEquals("", callback.mResponseAsString);
821 } 819 }
822 820
823 @SmallTest 821 @SmallTest
824 @Feature({"Cronet"}) 822 @Feature({"Cronet"})
825 @OnlyRunNativeCronet 823 @OnlyRunNativeCronet
826 public void testDoubleWrite() throws Exception { 824 public void testDoubleWrite() throws Exception {
827 String url = Http2TestServer.getEchoStreamUrl(); 825 String url = Http2TestServer.getEchoStreamUrl();
828 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback() { 826 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback() {
829 @Override 827 @Override
830 public void onStreamReady(BidirectionalStream stream) { 828 public void onStreamReady(BidirectionalStream stream) {
831 // super class will call Write() once. 829 // super class will call Write() once.
832 super.onStreamReady(stream); 830 super.onStreamReady(stream);
833 // Call Write() again. 831 // Call Write() again.
834 startNextWrite(stream); 832 startNextWrite(stream);
835 // Make sure there is no pending write. 833 // Make sure there is no pending write.
836 assertEquals(0, numPendingWrites()); 834 assertEquals(0, numPendingWrites());
837 } 835 }
838 }; 836 };
839 callback.addWriteData("1".getBytes()); 837 callback.addWriteData("1".getBytes());
840 callback.addWriteData("2".getBytes()); 838 callback.addWriteData("2".getBytes());
841 // Create stream. 839 // Create stream.
842 BidirectionalStream stream = new BidirectionalStream 840 BidirectionalStream stream =
843 .Builder(url, callback, callback.ge tExecutor(), 841 mTestFramework.mCronetEngine
844 mTestFramework.mCronetEngin e) 842 .newBidirectionalStreamBuilder(url, callback, callback.g etExecutor())
845 .build(); 843 .build();
846 stream.start(); 844 stream.start();
847 callback.blockForDone(); 845 callback.blockForDone();
848 assertTrue(stream.isDone()); 846 assertTrue(stream.isDone());
849 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 847 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
850 assertEquals("12", callback.mResponseAsString); 848 assertEquals("12", callback.mResponseAsString);
851 } 849 }
852 850
853 @SmallTest 851 @SmallTest
854 @Feature({"Cronet"}) 852 @Feature({"Cronet"})
855 @OnlyRunNativeCronet 853 @OnlyRunNativeCronet
(...skipping 11 matching lines...) Expand all
867 stream.read(ByteBuffer.allocateDirect(5)); 865 stream.read(ByteBuffer.allocateDirect(5));
868 fail("Exception is not thrown."); 866 fail("Exception is not thrown.");
869 } catch (Exception e) { 867 } catch (Exception e) {
870 assertEquals("Unexpected read attempt.", e.getMessage()); 868 assertEquals("Unexpected read attempt.", e.getMessage());
871 } 869 }
872 } 870 }
873 }; 871 };
874 callback.addWriteData("1".getBytes()); 872 callback.addWriteData("1".getBytes());
875 callback.addWriteData("2".getBytes()); 873 callback.addWriteData("2".getBytes());
876 // Create stream. 874 // Create stream.
877 BidirectionalStream stream = new BidirectionalStream 875 BidirectionalStream stream =
878 .Builder(url, callback, callback.ge tExecutor(), 876 mTestFramework.mCronetEngine
879 mTestFramework.mCronetEngin e) 877 .newBidirectionalStreamBuilder(url, callback, callback.g etExecutor())
880 .build(); 878 .build();
881 stream.start(); 879 stream.start();
882 callback.blockForDone(); 880 callback.blockForDone();
883 assertTrue(stream.isDone()); 881 assertTrue(stream.isDone());
884 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 882 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
885 assertEquals("12", callback.mResponseAsString); 883 assertEquals("12", callback.mResponseAsString);
886 } 884 }
887 885
888 @SmallTest 886 @SmallTest
889 @Feature({"Cronet"}) 887 @Feature({"Cronet"})
890 @OnlyRunNativeCronet 888 @OnlyRunNativeCronet
891 @DisabledTest(message = "Disabled due to timeout. See crbug.com/591112") 889 @DisabledTest(message = "Disabled due to timeout. See crbug.com/591112")
892 public void testReadAndWrite() throws Exception { 890 public void testReadAndWrite() throws Exception {
893 String url = Http2TestServer.getEchoStreamUrl(); 891 String url = Http2TestServer.getEchoStreamUrl();
894 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback() { 892 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback() {
895 @Override 893 @Override
896 public void onResponseHeadersReceived( 894 public void onResponseHeadersReceived(
897 BidirectionalStream stream, UrlResponseInfo info) { 895 BidirectionalStream stream, UrlResponseInfo info) {
898 // Start the write, that will not complete until callback comple tion. 896 // Start the write, that will not complete until callback comple tion.
899 startNextWrite(stream); 897 startNextWrite(stream);
900 // Start the read. It is allowed with write in flight. 898 // Start the read. It is allowed with write in flight.
901 super.onResponseHeadersReceived(stream, info); 899 super.onResponseHeadersReceived(stream, info);
902 } 900 }
903 }; 901 };
904 callback.setAutoAdvance(false); 902 callback.setAutoAdvance(false);
905 callback.addWriteData("1".getBytes()); 903 callback.addWriteData("1".getBytes());
906 callback.addWriteData("2".getBytes()); 904 callback.addWriteData("2".getBytes());
907 // Create stream. 905 // Create stream.
908 BidirectionalStream stream = new BidirectionalStream 906 BidirectionalStream stream =
909 .Builder(url, callback, callback.ge tExecutor(), 907 mTestFramework.mCronetEngine
910 mTestFramework.mCronetEngin e) 908 .newBidirectionalStreamBuilder(url, callback, callback.g etExecutor())
911 .build(); 909 .build();
912 stream.start(); 910 stream.start();
913 callback.waitForNextWriteStep(); 911 callback.waitForNextWriteStep();
914 callback.waitForNextReadStep(); 912 callback.waitForNextReadStep();
915 callback.startNextRead(stream); 913 callback.startNextRead(stream);
916 callback.setAutoAdvance(true); 914 callback.setAutoAdvance(true);
917 callback.blockForDone(); 915 callback.blockForDone();
918 assertTrue(stream.isDone()); 916 assertTrue(stream.isDone());
919 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 917 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
920 assertEquals("12", callback.mResponseAsString); 918 assertEquals("12", callback.mResponseAsString);
921 } 919 }
922 920
923 @SmallTest 921 @SmallTest
924 @Feature({"Cronet"}) 922 @Feature({"Cronet"})
925 @OnlyRunNativeCronet 923 @OnlyRunNativeCronet
926 public void testEchoStreamWriteFirst() throws Exception { 924 public void testEchoStreamWriteFirst() throws Exception {
927 String url = Http2TestServer.getEchoStreamUrl(); 925 String url = Http2TestServer.getEchoStreamUrl();
928 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 926 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
929 callback.setAutoAdvance(false); 927 callback.setAutoAdvance(false);
930 String[] testData = {"a", "bb", "ccc", "Test String", "1234567890", "woo t!"}; 928 String[] testData = {"a", "bb", "ccc", "Test String", "1234567890", "woo t!"};
931 StringBuilder stringData = new StringBuilder(); 929 StringBuilder stringData = new StringBuilder();
932 for (String writeData : testData) { 930 for (String writeData : testData) {
933 callback.addWriteData(writeData.getBytes()); 931 callback.addWriteData(writeData.getBytes());
934 stringData.append(writeData); 932 stringData.append(writeData);
935 } 933 }
936 // Create stream. 934 // Create stream.
937 BidirectionalStream stream = new BidirectionalStream 935 BidirectionalStream stream =
938 .Builder(url, callback, callback.ge tExecutor(), 936 mTestFramework.mCronetEngine
939 mTestFramework.mCronetEngin e) 937 .newBidirectionalStreamBuilder(url, callback, callback.g etExecutor())
940 .build(); 938 .build();
941 stream.start(); 939 stream.start();
942 // Write first. 940 // Write first.
943 callback.waitForNextWriteStep(); // onStreamReady 941 callback.waitForNextWriteStep(); // onStreamReady
944 for (String expected : testData) { 942 for (String expected : testData) {
945 // Write next chunk of test data. 943 // Write next chunk of test data.
946 callback.startNextWrite(stream); 944 callback.startNextWrite(stream);
947 callback.waitForNextWriteStep(); // onWriteCompleted 945 callback.waitForNextWriteStep(); // onWriteCompleted
948 } 946 }
949 947
950 // Wait for read step, but don't read yet. 948 // Wait for read step, but don't read yet.
(...skipping 21 matching lines...) Expand all
972 String url = Http2TestServer.getEchoStreamUrl(); 970 String url = Http2TestServer.getEchoStreamUrl();
973 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 971 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
974 callback.setAutoAdvance(false); 972 callback.setAutoAdvance(false);
975 String[] testData = {"a", "bb", "ccc", "Test String", "1234567890", "woo t!"}; 973 String[] testData = {"a", "bb", "ccc", "Test String", "1234567890", "woo t!"};
976 StringBuilder stringData = new StringBuilder(); 974 StringBuilder stringData = new StringBuilder();
977 for (String writeData : testData) { 975 for (String writeData : testData) {
978 callback.addWriteData(writeData.getBytes()); 976 callback.addWriteData(writeData.getBytes());
979 stringData.append(writeData); 977 stringData.append(writeData);
980 } 978 }
981 // Create stream. 979 // Create stream.
982 BidirectionalStream stream = new BidirectionalStream 980 BidirectionalStream stream =
983 .Builder(url, callback, callback.ge tExecutor(), 981 mTestFramework.mCronetEngine
984 mTestFramework.mCronetEngin e) 982 .newBidirectionalStreamBuilder(url, callback, callback.g etExecutor())
985 .build(); 983 .build();
986 stream.start(); 984 stream.start();
987 callback.waitForNextWriteStep(); 985 callback.waitForNextWriteStep();
988 callback.waitForNextReadStep(); 986 callback.waitForNextReadStep();
989 987
990 for (String expected : testData) { 988 for (String expected : testData) {
991 // Write next chunk of test data. 989 // Write next chunk of test data.
992 callback.startNextWrite(stream); 990 callback.startNextWrite(stream);
993 callback.waitForNextWriteStep(); 991 callback.waitForNextWriteStep();
994 992
995 // Read next chunk of test data. 993 // Read next chunk of test data.
(...skipping 16 matching lines...) Expand all
1012 * Checks that the buffer is updated correctly, when starting at an offset. 1010 * Checks that the buffer is updated correctly, when starting at an offset.
1013 */ 1011 */
1014 @SmallTest 1012 @SmallTest
1015 @Feature({"Cronet"}) 1013 @Feature({"Cronet"})
1016 @OnlyRunNativeCronet 1014 @OnlyRunNativeCronet
1017 public void testSimpleGetBufferUpdates() throws Exception { 1015 public void testSimpleGetBufferUpdates() throws Exception {
1018 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 1016 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
1019 callback.setAutoAdvance(false); 1017 callback.setAutoAdvance(false);
1020 // Since the method is "GET", the expected response body is also "GET". 1018 // Since the method is "GET", the expected response body is also "GET".
1021 BidirectionalStream.Builder builder = 1019 BidirectionalStream.Builder builder =
1022 new BidirectionalStream.Builder(Http2TestServer.getEchoMethodUrl (), callback, 1020 mTestFramework.mCronetEngine.newBidirectionalStreamBuilder(
1023 callback.getExecutor(), mTestFramework.mCronetEngine); 1021 Http2TestServer.getEchoMethodUrl(), callback, callback.g etExecutor());
1024 BidirectionalStream stream = builder.setHttpMethod("GET").build(); 1022 BidirectionalStream stream = builder.setHttpMethod("GET").build();
1025 stream.start(); 1023 stream.start();
1026 callback.waitForNextReadStep(); 1024 callback.waitForNextReadStep();
1027 1025
1028 assertEquals(null, callback.mError); 1026 assertEquals(null, callback.mError);
1029 assertFalse(callback.isDone()); 1027 assertFalse(callback.isDone());
1030 assertEquals(TestBidirectionalStreamCallback.ResponseStep.ON_RESPONSE_ST ARTED, 1028 assertEquals(TestBidirectionalStreamCallback.ResponseStep.ON_RESPONSE_ST ARTED,
1031 callback.mResponseStep); 1029 callback.mResponseStep);
1032 1030
1033 ByteBuffer readBuffer = ByteBuffer.allocateDirect(5); 1031 ByteBuffer readBuffer = ByteBuffer.allocateDirect(5);
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1105 runSimpleGetWithExpectedReceivedBytesCount(27); 1103 runSimpleGetWithExpectedReceivedBytesCount(27);
1106 } 1104 }
1107 1105
1108 @SmallTest 1106 @SmallTest
1109 @Feature({"Cronet"}) 1107 @Feature({"Cronet"})
1110 @OnlyRunNativeCronet 1108 @OnlyRunNativeCronet
1111 public void testBadBuffers() throws Exception { 1109 public void testBadBuffers() throws Exception {
1112 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 1110 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
1113 callback.setAutoAdvance(false); 1111 callback.setAutoAdvance(false);
1114 BidirectionalStream.Builder builder = 1112 BidirectionalStream.Builder builder =
1115 new BidirectionalStream.Builder(Http2TestServer.getEchoMethodUrl (), callback, 1113 mTestFramework.mCronetEngine.newBidirectionalStreamBuilder(
1116 callback.getExecutor(), mTestFramework.mCronetEngine); 1114 Http2TestServer.getEchoMethodUrl(), callback, callback.g etExecutor());
1117 BidirectionalStream stream = builder.setHttpMethod("GET").build(); 1115 BidirectionalStream stream = builder.setHttpMethod("GET").build();
1118 stream.start(); 1116 stream.start();
1119 callback.waitForNextReadStep(); 1117 callback.waitForNextReadStep();
1120 1118
1121 assertEquals(null, callback.mError); 1119 assertEquals(null, callback.mError);
1122 assertFalse(callback.isDone()); 1120 assertFalse(callback.isDone());
1123 assertEquals(TestBidirectionalStreamCallback.ResponseStep.ON_RESPONSE_ST ARTED, 1121 assertEquals(TestBidirectionalStreamCallback.ResponseStep.ON_RESPONSE_ST ARTED,
1124 callback.mResponseStep); 1122 callback.mResponseStep);
1125 1123
1126 // Try to read using a full buffer. 1124 // Try to read using a full buffer.
(...skipping 22 matching lines...) Expand all
1149 callback.blockForDone(); 1147 callback.blockForDone();
1150 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 1148 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
1151 assertEquals("GET", callback.mResponseAsString); 1149 assertEquals("GET", callback.mResponseAsString);
1152 } 1150 }
1153 1151
1154 private void throwOrCancel( 1152 private void throwOrCancel(
1155 FailureType failureType, ResponseStep failureStep, boolean expectErr or) { 1153 FailureType failureType, ResponseStep failureStep, boolean expectErr or) {
1156 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 1154 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
1157 callback.setFailure(failureType, failureStep); 1155 callback.setFailure(failureType, failureStep);
1158 BidirectionalStream.Builder builder = 1156 BidirectionalStream.Builder builder =
1159 new BidirectionalStream.Builder(Http2TestServer.getEchoMethodUrl (), callback, 1157 mTestFramework.mCronetEngine.newBidirectionalStreamBuilder(
1160 callback.getExecutor(), mTestFramework.mCronetEngine); 1158 Http2TestServer.getEchoMethodUrl(), callback, callback.g etExecutor());
1161 BidirectionalStream stream = builder.setHttpMethod("GET").build(); 1159 BidirectionalStream stream = builder.setHttpMethod("GET").build();
1162 stream.start(); 1160 stream.start();
1163 callback.blockForDone(); 1161 callback.blockForDone();
1164 // assertEquals(callback.mResponseStep, failureStep); 1162 // assertEquals(callback.mResponseStep, failureStep);
1165 assertTrue(stream.isDone()); 1163 assertTrue(stream.isDone());
1166 // Cancellation when stream is ready does not guarantee that 1164 // Cancellation when stream is ready does not guarantee that
1167 // mResponseInfo is null because there might be a 1165 // mResponseInfo is null because there might be a
1168 // onResponseHeadersReceived already queued in the executor. 1166 // onResponseHeadersReceived already queued in the executor.
1169 // See crbug.com/594432. 1167 // See crbug.com/594432.
1170 if (failureStep != ResponseStep.ON_STREAM_READY) { 1168 if (failureStep != ResponseStep.ON_STREAM_READY) {
(...skipping 29 matching lines...) Expand all
1200 throwOrCancel(FailureType.THROW_SYNC, ResponseStep.ON_READ_COMPLETED, tr ue); 1198 throwOrCancel(FailureType.THROW_SYNC, ResponseStep.ON_READ_COMPLETED, tr ue);
1201 } 1199 }
1202 1200
1203 @SmallTest 1201 @SmallTest
1204 @Feature({"Cronet"}) 1202 @Feature({"Cronet"})
1205 @OnlyRunNativeCronet 1203 @OnlyRunNativeCronet
1206 public void testThrowOnSucceeded() { 1204 public void testThrowOnSucceeded() {
1207 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 1205 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
1208 callback.setFailure(FailureType.THROW_SYNC, ResponseStep.ON_SUCCEEDED); 1206 callback.setFailure(FailureType.THROW_SYNC, ResponseStep.ON_SUCCEEDED);
1209 BidirectionalStream.Builder builder = 1207 BidirectionalStream.Builder builder =
1210 new BidirectionalStream.Builder(Http2TestServer.getEchoMethodUrl (), callback, 1208 mTestFramework.mCronetEngine.newBidirectionalStreamBuilder(
1211 callback.getExecutor(), mTestFramework.mCronetEngine); 1209 Http2TestServer.getEchoMethodUrl(), callback, callback.g etExecutor());
1212 BidirectionalStream stream = builder.setHttpMethod("GET").build(); 1210 BidirectionalStream stream = builder.setHttpMethod("GET").build();
1213 stream.start(); 1211 stream.start();
1214 callback.blockForDone(); 1212 callback.blockForDone();
1215 assertEquals(callback.mResponseStep, ResponseStep.ON_SUCCEEDED); 1213 assertEquals(callback.mResponseStep, ResponseStep.ON_SUCCEEDED);
1216 assertTrue(stream.isDone()); 1214 assertTrue(stream.isDone());
1217 assertNotNull(callback.mResponseInfo); 1215 assertNotNull(callback.mResponseInfo);
1218 // Check that error thrown from 'onSucceeded' callback is not reported. 1216 // Check that error thrown from 'onSucceeded' callback is not reported.
1219 assertNull(callback.mError); 1217 assertNull(callback.mError);
1220 assertFalse(callback.mOnErrorCalled); 1218 assertFalse(callback.mOnErrorCalled);
1221 } 1219 }
1222 1220
1223 @SmallTest 1221 @SmallTest
1224 @Feature({"Cronet"}) 1222 @Feature({"Cronet"})
1225 @OnlyRunNativeCronet 1223 @OnlyRunNativeCronet
1226 public void testExecutorShutdownBeforeStreamIsDone() { 1224 public void testExecutorShutdownBeforeStreamIsDone() {
1227 // Test that stream is destroyed even if executor is shut down and rejec ts posting tasks. 1225 // Test that stream is destroyed even if executor is shut down and rejec ts posting tasks.
1228 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 1226 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
1229 callback.setAutoAdvance(false); 1227 callback.setAutoAdvance(false);
1230 BidirectionalStream.Builder builder = 1228 BidirectionalStream.Builder builder =
1231 new BidirectionalStream.Builder(Http2TestServer.getEchoMethodUrl (), callback, 1229 mTestFramework.mCronetEngine.newBidirectionalStreamBuilder(
1232 callback.getExecutor(), mTestFramework.mCronetEngine); 1230 Http2TestServer.getEchoMethodUrl(), callback, callback.g etExecutor());
1233 CronetBidirectionalStream stream = 1231 CronetBidirectionalStream stream =
1234 (CronetBidirectionalStream) builder.setHttpMethod("GET").build() ; 1232 (CronetBidirectionalStream) builder.setHttpMethod("GET").build() ;
1235 stream.start(); 1233 stream.start();
1236 callback.waitForNextReadStep(); 1234 callback.waitForNextReadStep();
1237 assertFalse(callback.isDone()); 1235 assertFalse(callback.isDone());
1238 assertFalse(stream.isDone()); 1236 assertFalse(stream.isDone());
1239 1237
1240 final ConditionVariable streamDestroyed = new ConditionVariable(false); 1238 final ConditionVariable streamDestroyed = new ConditionVariable(false);
1241 stream.setOnDestroyedCallbackForTesting(new Runnable() { 1239 stream.setOnDestroyedCallbackForTesting(new Runnable() {
1242 @Override 1240 @Override
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1291 @SmallTest 1289 @SmallTest
1292 @Feature({"Cronet"}) 1290 @Feature({"Cronet"})
1293 @OnlyRunNativeCronet 1291 @OnlyRunNativeCronet
1294 public void testCronetEngineShutdown() throws Exception { 1292 public void testCronetEngineShutdown() throws Exception {
1295 // Test that CronetEngine cannot be shut down if there are any active st reams. 1293 // Test that CronetEngine cannot be shut down if there are any active st reams.
1296 TestBidirectionalStreamCallback callback = new ShutdownTestBidirectional StreamCallback(); 1294 TestBidirectionalStreamCallback callback = new ShutdownTestBidirectional StreamCallback();
1297 // Block callback when response starts to verify that shutdown fails 1295 // Block callback when response starts to verify that shutdown fails
1298 // if there are active streams. 1296 // if there are active streams.
1299 callback.setAutoAdvance(false); 1297 callback.setAutoAdvance(false);
1300 BidirectionalStream.Builder builder = 1298 BidirectionalStream.Builder builder =
1301 new BidirectionalStream.Builder(Http2TestServer.getEchoMethodUrl (), callback, 1299 mTestFramework.mCronetEngine.newBidirectionalStreamBuilder(
1302 callback.getExecutor(), mTestFramework.mCronetEngine); 1300 Http2TestServer.getEchoMethodUrl(), callback, callback.g etExecutor());
1303 CronetBidirectionalStream stream = 1301 CronetBidirectionalStream stream =
1304 (CronetBidirectionalStream) builder.setHttpMethod("GET").build() ; 1302 (CronetBidirectionalStream) builder.setHttpMethod("GET").build() ;
1305 stream.start(); 1303 stream.start();
1306 try { 1304 try {
1307 mTestFramework.mCronetEngine.shutdown(); 1305 mTestFramework.mCronetEngine.shutdown();
1308 fail("Should throw an exception"); 1306 fail("Should throw an exception");
1309 } catch (Exception e) { 1307 } catch (Exception e) {
1310 assertEquals("Cannot shutdown with active requests.", e.getMessage() ); 1308 assertEquals("Cannot shutdown with active requests.", e.getMessage() );
1311 } 1309 }
1312 1310
(...skipping 23 matching lines...) Expand all
1336 callback.blockForDone(); 1334 callback.blockForDone();
1337 } 1335 }
1338 1336
1339 @SmallTest 1337 @SmallTest
1340 @Feature({"Cronet"}) 1338 @Feature({"Cronet"})
1341 @OnlyRunNativeCronet 1339 @OnlyRunNativeCronet
1342 public void testCronetEngineShutdownAfterStreamFailure() throws Exception { 1340 public void testCronetEngineShutdownAfterStreamFailure() throws Exception {
1343 // Test that CronetEngine can be shut down after stream reports a failur e. 1341 // Test that CronetEngine can be shut down after stream reports a failur e.
1344 TestBidirectionalStreamCallback callback = new ShutdownTestBidirectional StreamCallback(); 1342 TestBidirectionalStreamCallback callback = new ShutdownTestBidirectional StreamCallback();
1345 BidirectionalStream.Builder builder = 1343 BidirectionalStream.Builder builder =
1346 new BidirectionalStream.Builder(Http2TestServer.getEchoMethodUrl (), callback, 1344 mTestFramework.mCronetEngine.newBidirectionalStreamBuilder(
1347 callback.getExecutor(), mTestFramework.mCronetEngine); 1345 Http2TestServer.getEchoMethodUrl(), callback, callback.g etExecutor());
1348 CronetBidirectionalStream stream = 1346 CronetBidirectionalStream stream =
1349 (CronetBidirectionalStream) builder.setHttpMethod("GET").build() ; 1347 (CronetBidirectionalStream) builder.setHttpMethod("GET").build() ;
1350 stream.start(); 1348 stream.start();
1351 callback.setFailure(FailureType.THROW_SYNC, ResponseStep.ON_READ_COMPLET ED); 1349 callback.setFailure(FailureType.THROW_SYNC, ResponseStep.ON_READ_COMPLET ED);
1352 callback.blockForDone(); 1350 callback.blockForDone();
1353 assertTrue(callback.mOnErrorCalled); 1351 assertTrue(callback.mOnErrorCalled);
1354 assertNull(mTestFramework.mCronetEngine); 1352 assertNull(mTestFramework.mCronetEngine);
1355 } 1353 }
1356 1354
1357 @SmallTest 1355 @SmallTest
1358 @Feature({"Cronet"}) 1356 @Feature({"Cronet"})
1359 @OnlyRunNativeCronet 1357 @OnlyRunNativeCronet
1360 public void testCronetEngineShutdownAfterStreamCancel() throws Exception { 1358 public void testCronetEngineShutdownAfterStreamCancel() throws Exception {
1361 // Test that CronetEngine can be shut down after stream is canceled. 1359 // Test that CronetEngine can be shut down after stream is canceled.
1362 TestBidirectionalStreamCallback callback = new ShutdownTestBidirectional StreamCallback(); 1360 TestBidirectionalStreamCallback callback = new ShutdownTestBidirectional StreamCallback();
1363 BidirectionalStream.Builder builder = 1361 BidirectionalStream.Builder builder =
1364 new BidirectionalStream.Builder(Http2TestServer.getEchoMethodUrl (), callback, 1362 mTestFramework.mCronetEngine.newBidirectionalStreamBuilder(
1365 callback.getExecutor(), mTestFramework.mCronetEngine); 1363 Http2TestServer.getEchoMethodUrl(), callback, callback.g etExecutor());
1366 CronetBidirectionalStream stream = 1364 CronetBidirectionalStream stream =
1367 (CronetBidirectionalStream) builder.setHttpMethod("GET").build() ; 1365 (CronetBidirectionalStream) builder.setHttpMethod("GET").build() ;
1368 1366
1369 // Block callback when response starts to verify that shutdown fails 1367 // Block callback when response starts to verify that shutdown fails
1370 // if there are active requests. 1368 // if there are active requests.
1371 callback.setAutoAdvance(false); 1369 callback.setAutoAdvance(false);
1372 stream.start(); 1370 stream.start();
1373 try { 1371 try {
1374 mTestFramework.mCronetEngine.shutdown(); 1372 mTestFramework.mCronetEngine.shutdown();
1375 fail("Should throw an exception"); 1373 fail("Should throw an exception");
(...skipping 13 matching lines...) Expand all
1389 private static String bufferContentsToString(ByteBuffer byteBuffer, int star t, int end) { 1387 private static String bufferContentsToString(ByteBuffer byteBuffer, int star t, int end) {
1390 // Use a duplicate to avoid modifying byteBuffer. 1388 // Use a duplicate to avoid modifying byteBuffer.
1391 ByteBuffer duplicate = byteBuffer.duplicate(); 1389 ByteBuffer duplicate = byteBuffer.duplicate();
1392 duplicate.position(start); 1390 duplicate.position(start);
1393 duplicate.limit(end); 1391 duplicate.limit(end);
1394 byte[] contents = new byte[duplicate.remaining()]; 1392 byte[] contents = new byte[duplicate.remaining()];
1395 duplicate.get(contents); 1393 duplicate.get(contents);
1396 return new String(contents); 1394 return new String(contents);
1397 } 1395 }
1398 } 1396 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698