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

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

Issue 1856073002: Coalesce small buffers in net::BidirectionalStream (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix javadoc Created 4 years, 8 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 android.os.ConditionVariable; 7 import android.os.ConditionVariable;
8 import android.test.suitebuilder.annotation.SmallTest; 8 import android.test.suitebuilder.annotation.SmallTest;
9 9
10 import org.chromium.base.test.util.DisabledTest; 10 import org.chromium.base.test.util.DisabledTest;
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 assertEquals("Test String1234567890woot!", callback.mResponseAsString); 229 assertEquals("Test String1234567890woot!", callback.mResponseAsString);
230 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo ").get(0)); 230 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo ").get(0));
231 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty" ).get(0)); 231 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty" ).get(0));
232 assertEquals( 232 assertEquals(
233 "zebra", callback.mResponseInfo.getAllHeaders().get("echo-conten t-type").get(0)); 233 "zebra", callback.mResponseInfo.getAllHeaders().get("echo-conten t-type").get(0));
234 } 234 }
235 235
236 @SmallTest 236 @SmallTest
237 @Feature({"Cronet"}) 237 @Feature({"Cronet"})
238 @OnlyRunNativeCronet 238 @OnlyRunNativeCronet
239 public void testSimplePostWithFlush() throws Exception {
240 String url = Http2TestServer.getEchoStreamUrl();
241 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
242 callback.addWriteData("Test String".getBytes(), false);
243 callback.addWriteData("1234567890".getBytes(), false);
244 callback.addWriteData("woot!".getBytes(), true);
245 BidirectionalStream stream = new BidirectionalStream
246 .Builder(url, callback, callback.ge tExecutor(),
247 mTestFramework.mCronetEngin e)
248 .disableAutoFlush(true)
249 .addHeader("foo", "bar")
250 .addHeader("empty", "")
251 .addHeader("Content-Type", "zebra")
252 .build();
253 stream.start();
254 callback.blockForDone();
255 assertTrue(stream.isDone());
256
257 // Flush after stream is completed is no-op. It shouldn't call into the destroyed adapter.
258 stream.flush();
259
260 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
261 assertEquals("Test String1234567890woot!", callback.mResponseAsString);
262 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo ").get(0));
263 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty" ).get(0));
264 assertEquals(
265 "zebra", callback.mResponseInfo.getAllHeaders().get("echo-conten t-type").get(0));
266 }
267
268 @SmallTest
269 @Feature({"Cronet"})
270 @OnlyRunNativeCronet
271 public void testSimplePostWithFlushTwice() throws Exception {
272 String url = Http2TestServer.getEchoStreamUrl();
273 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
274 callback.addWriteData("Test String".getBytes(), false);
275 callback.addWriteData("1234567890".getBytes(), false);
276 callback.addWriteData("woot!".getBytes(), true);
277 callback.addWriteData("Test String".getBytes(), false);
278 callback.addWriteData("1234567890".getBytes(), false);
279 callback.addWriteData("woot!".getBytes(), true);
280 BidirectionalStream stream = new BidirectionalStream
281 .Builder(url, callback, callback.ge tExecutor(),
282 mTestFramework.mCronetEngin e)
283 .disableAutoFlush(true)
284 .addHeader("foo", "bar")
285 .addHeader("empty", "")
286 .addHeader("Content-Type", "zebra")
287 .build();
288 stream.start();
289 callback.blockForDone();
290 assertTrue(stream.isDone());
291 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
292 assertEquals(
293 "Test String1234567890woot!Test String1234567890woot!", callback .mResponseAsString);
294 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo ").get(0));
295 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty" ).get(0));
296 assertEquals(
297 "zebra", callback.mResponseInfo.getAllHeaders().get("echo-conten t-type").get(0));
298 }
299
300 @SmallTest
301 @Feature({"Cronet"})
302 @OnlyRunNativeCronet
303 // Tests that it is legal to call read() in onStreamReady().
304 public void testReadDuringOnStreamReady() throws Exception {
305 String url = Http2TestServer.getEchoStreamUrl();
306 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback() {
307 @Override
308 public void onStreamReady(BidirectionalStream stream) {
309 super.onStreamReady(stream);
310 startNextRead(stream);
311 }
312 @Override
313 public void onResponseHeadersReceived(
314 BidirectionalStream stream, UrlResponseInfo info) {
315 // Do nothing. Skip readng.
316 }
317 };
318 callback.addWriteData("Test String".getBytes());
319 callback.addWriteData("1234567890".getBytes());
320 callback.addWriteData("woot!".getBytes());
321 BidirectionalStream stream = new BidirectionalStream
322 .Builder(url, callback, callback.ge tExecutor(),
323 mTestFramework.mCronetEngin e)
324 .addHeader("foo", "bar")
325 .addHeader("empty", "")
326 .addHeader("Content-Type", "zebra")
327 .build();
328 stream.start();
329 callback.blockForDone();
330 assertTrue(stream.isDone());
331 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
332 assertEquals("Test String1234567890woot!", callback.mResponseAsString);
333 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo ").get(0));
334 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty" ).get(0));
335 assertEquals(
336 "zebra", callback.mResponseInfo.getAllHeaders().get("echo-conten t-type").get(0));
337 }
338
339 @SmallTest
340 @Feature({"Cronet"})
341 @OnlyRunNativeCronet
342 // Tests that it is legal to call flush() when previous nativeWritevData has
343 // yet to complete.
344 public void testSimplePostWithFlushBeforePreviousWriteCompleted() throws Exc eption {
345 String url = Http2TestServer.getEchoStreamUrl();
346 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback() {
347 @Override
348 public void onStreamReady(BidirectionalStream stream) {
349 super.onStreamReady(stream);
350 // Write a second time before the previous nativeWritevData has completed.
351 startNextWrite(stream);
352 assertEquals(0, numPendingWrites());
353 }
354 };
355 callback.addWriteData("Test String".getBytes(), false);
356 callback.addWriteData("1234567890".getBytes(), false);
357 callback.addWriteData("woot!".getBytes(), true);
358 callback.addWriteData("Test String".getBytes(), false);
359 callback.addWriteData("1234567890".getBytes(), false);
360 callback.addWriteData("woot!".getBytes(), true);
361 BidirectionalStream stream = new BidirectionalStream
362 .Builder(url, callback, callback.ge tExecutor(),
363 mTestFramework.mCronetEngin e)
364 .disableAutoFlush(true)
365 .addHeader("foo", "bar")
366 .addHeader("empty", "")
367 .addHeader("Content-Type", "zebra")
368 .build();
369 stream.start();
370 callback.blockForDone();
371 assertTrue(stream.isDone());
372 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
373 assertEquals(
374 "Test String1234567890woot!Test String1234567890woot!", callback .mResponseAsString);
375 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo ").get(0));
376 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty" ).get(0));
377 assertEquals(
378 "zebra", callback.mResponseInfo.getAllHeaders().get("echo-conten t-type").get(0));
379 }
380
381 @SmallTest
382 @Feature({"Cronet"})
383 @OnlyRunNativeCronet
239 public void testSimplePut() throws Exception { 384 public void testSimplePut() throws Exception {
240 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 385 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
241 callback.addWriteData("Put This Data!".getBytes()); 386 callback.addWriteData("Put This Data!".getBytes());
242 String methodName = "PUT"; 387 String methodName = "PUT";
243 BidirectionalStream.Builder builder = 388 BidirectionalStream.Builder builder =
244 new BidirectionalStream.Builder(Http2TestServer.getServerUrl(), callback, 389 new BidirectionalStream.Builder(Http2TestServer.getServerUrl(), callback,
245 callback.getExecutor(), mTestFramework.mCronetEngine); 390 callback.getExecutor(), mTestFramework.mCronetEngine);
246 builder.setHttpMethod(methodName); 391 builder.setHttpMethod(methodName);
247 builder.build().start(); 392 builder.build().start();
248 callback.blockForDone(); 393 callback.blockForDone();
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
476 assertEquals("", callback.mResponseAsString); 621 assertEquals("", callback.mResponseAsString);
477 } 622 }
478 623
479 @SmallTest 624 @SmallTest
480 @Feature({"Cronet"}) 625 @Feature({"Cronet"})
481 @OnlyRunNativeCronet 626 @OnlyRunNativeCronet
482 public void testDoubleWrite() throws Exception { 627 public void testDoubleWrite() throws Exception {
483 String url = Http2TestServer.getEchoStreamUrl(); 628 String url = Http2TestServer.getEchoStreamUrl();
484 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback() { 629 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback() {
485 @Override 630 @Override
486 public void onRequestHeadersSent(BidirectionalStream stream) { 631 public void onStreamReady(BidirectionalStream stream) {
632 // super class will call Write() once.
633 super.onStreamReady(stream);
634 // Call Write() again.
487 startNextWrite(stream); 635 startNextWrite(stream);
488 try { 636 // Make sure there is no pending write.
489 // Second write from callback invoked on single-threaded exe cutor throws 637 assertEquals(0, numPendingWrites());
490 // an exception because first write is still pending until i ts completion
491 // is handled on executor.
492 ByteBuffer writeBuffer = ByteBuffer.allocateDirect(5);
493 writeBuffer.put("abc".getBytes());
494 writeBuffer.flip();
495 stream.write(writeBuffer, false);
496 fail("Exception is not thrown.");
497 } catch (Exception e) {
498 assertEquals("Unexpected write attempt.", e.getMessage());
499 }
500 } 638 }
501 }; 639 };
502 callback.addWriteData("1".getBytes()); 640 callback.addWriteData("1".getBytes());
503 callback.addWriteData("2".getBytes()); 641 callback.addWriteData("2".getBytes());
504 // Create stream. 642 // Create stream.
505 BidirectionalStream stream = new BidirectionalStream 643 BidirectionalStream stream = new BidirectionalStream
506 .Builder(url, callback, callback.ge tExecutor(), 644 .Builder(url, callback, callback.ge tExecutor(),
507 mTestFramework.mCronetEngin e) 645 mTestFramework.mCronetEngin e)
508 .build(); 646 .build();
509 stream.start(); 647 stream.start();
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 callback.addWriteData(writeData.getBytes()); 735 callback.addWriteData(writeData.getBytes());
598 stringData.append(writeData); 736 stringData.append(writeData);
599 } 737 }
600 // Create stream. 738 // Create stream.
601 BidirectionalStream stream = new BidirectionalStream 739 BidirectionalStream stream = new BidirectionalStream
602 .Builder(url, callback, callback.ge tExecutor(), 740 .Builder(url, callback, callback.ge tExecutor(),
603 mTestFramework.mCronetEngin e) 741 mTestFramework.mCronetEngin e)
604 .build(); 742 .build();
605 stream.start(); 743 stream.start();
606 // Write first. 744 // Write first.
607 callback.waitForNextWriteStep(); 745 callback.waitForNextWriteStep(); // onStreamReady
608 for (String expected : testData) { 746 for (String expected : testData) {
609 // Write next chunk of test data. 747 // Write next chunk of test data.
610 callback.startNextWrite(stream); 748 callback.startNextWrite(stream);
611 callback.waitForNextWriteStep(); 749 callback.waitForNextWriteStep(); // onWriteCompleted
612 } 750 }
613 751
614 // Wait for read step, but don't read yet. 752 // Wait for read step, but don't read yet.
615 callback.waitForNextReadStep(); 753 callback.waitForNextReadStep(); // onResponseHeadersReceived
616 assertEquals("", callback.mResponseAsString); 754 assertEquals("", callback.mResponseAsString);
617 // Read back. 755 // Read back.
618 callback.startNextRead(stream); 756 callback.startNextRead(stream);
619 callback.waitForNextReadStep(); 757 callback.waitForNextReadStep(); // onReadCompleted
620 // Verify that some part of proper response is read. 758 // Verify that some part of proper response is read.
621 assertTrue(callback.mResponseAsString.startsWith(testData[0])); 759 assertTrue(callback.mResponseAsString.startsWith(testData[0]));
622 assertTrue(stringData.toString().startsWith(callback.mResponseAsString)) ; 760 assertTrue(stringData.toString().startsWith(callback.mResponseAsString)) ;
623 // Read the rest of the response. 761 // Read the rest of the response.
624 callback.setAutoAdvance(true); 762 callback.setAutoAdvance(true);
625 callback.startNextRead(stream); 763 callback.startNextRead(stream);
626 callback.blockForDone(); 764 callback.blockForDone();
627 assertTrue(stream.isDone()); 765 assertTrue(stream.isDone());
628 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 766 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
629 assertEquals(stringData.toString(), callback.mResponseAsString); 767 assertEquals(stringData.toString(), callback.mResponseAsString);
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
736 874
737 // Make sure position and limit were updated correctly. 875 // Make sure position and limit were updated correctly.
738 assertEquals(4, readBuffer.position()); 876 assertEquals(4, readBuffer.position());
739 assertEquals(5, readBuffer.limit()); 877 assertEquals(5, readBuffer.limit());
740 878
741 assertEquals(ResponseStep.ON_READ_COMPLETED, callback.mResponseStep); 879 assertEquals(ResponseStep.ON_READ_COMPLETED, callback.mResponseStep);
742 880
743 // One more read attempt. The request should complete. 881 // One more read attempt. The request should complete.
744 readBuffer.position(1); 882 readBuffer.position(1);
745 readBuffer.limit(5); 883 readBuffer.limit(5);
884 callback.setAutoAdvance(true);
746 callback.startNextRead(stream, readBuffer); 885 callback.startNextRead(stream, readBuffer);
747 callback.waitForNextReadStep(); 886 callback.blockForDone();
748 887
749 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 888 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
750 assertEquals("GET", callback.mResponseAsString); 889 assertEquals("GET", callback.mResponseAsString);
751 checkResponseInfo(callback.mResponseInfo, Http2TestServer.getEchoMethodU rl(), 200, ""); 890 checkResponseInfo(callback.mResponseInfo, Http2TestServer.getEchoMethodU rl(), 200, "");
752 891
753 // Check that buffer contents were not modified. 892 // Check that buffer contents were not modified.
754 assertEquals("FORTE", bufferContentsToString(readBuffer, 0, 5)); 893 assertEquals("FORTE", bufferContentsToString(readBuffer, 0, 5));
755 894
756 // Position should not have been modified, since nothing was read. 895 // Position should not have been modified, since nothing was read.
757 assertEquals(1, readBuffer.position()); 896 assertEquals(1, readBuffer.position());
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
816 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 955 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
817 callback.setFailure(failureType, failureStep); 956 callback.setFailure(failureType, failureStep);
818 BidirectionalStream.Builder builder = 957 BidirectionalStream.Builder builder =
819 new BidirectionalStream.Builder(Http2TestServer.getEchoMethodUrl (), callback, 958 new BidirectionalStream.Builder(Http2TestServer.getEchoMethodUrl (), callback,
820 callback.getExecutor(), mTestFramework.mCronetEngine); 959 callback.getExecutor(), mTestFramework.mCronetEngine);
821 BidirectionalStream stream = builder.setHttpMethod("GET").build(); 960 BidirectionalStream stream = builder.setHttpMethod("GET").build();
822 stream.start(); 961 stream.start();
823 callback.blockForDone(); 962 callback.blockForDone();
824 // assertEquals(callback.mResponseStep, failureStep); 963 // assertEquals(callback.mResponseStep, failureStep);
825 assertTrue(stream.isDone()); 964 assertTrue(stream.isDone());
826 // Cancellation when request headers are sent does not guarantee that 965 // Cancellation when stream is ready does not guarantee that
827 // mResponseInfo is null because there might be a 966 // mResponseInfo is null because there might be a
828 // onResponseHeadersReceived already queued in the executor. 967 // onResponseHeadersReceived already queued in the executor.
829 // See crbug.com/594432. 968 // See crbug.com/594432.
830 if (failureStep != ResponseStep.ON_REQUEST_HEADERS_SENT) { 969 if (failureStep != ResponseStep.ON_STREAM_READY) {
831 assertNotNull(callback.mResponseInfo); 970 assertNotNull(callback.mResponseInfo);
832 } 971 }
833 assertEquals(expectError, callback.mError != null); 972 assertEquals(expectError, callback.mError != null);
834 assertEquals(expectError, callback.mOnErrorCalled); 973 assertEquals(expectError, callback.mOnErrorCalled);
835 assertEquals(failureType == FailureType.CANCEL_SYNC 974 assertEquals(failureType == FailureType.CANCEL_SYNC
836 || failureType == FailureType.CANCEL_ASYNC 975 || failureType == FailureType.CANCEL_ASYNC
837 || failureType == FailureType.CANCEL_ASYNC_WITHOUT_PAUSE , 976 || failureType == FailureType.CANCEL_ASYNC_WITHOUT_PAUSE ,
838 callback.mOnCanceledCalled); 977 callback.mOnCanceledCalled);
839 } 978 }
840 979
841 @SmallTest 980 @SmallTest
842 @Feature({"Cronet"}) 981 @Feature({"Cronet"})
843 @OnlyRunNativeCronet 982 @OnlyRunNativeCronet
844 public void testFailures() throws Exception { 983 public void testFailures() throws Exception {
845 throwOrCancel(FailureType.CANCEL_SYNC, ResponseStep.ON_REQUEST_HEADERS_S ENT, false); 984 throwOrCancel(FailureType.CANCEL_SYNC, ResponseStep.ON_STREAM_READY, fal se);
846 throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_REQUEST_HEADERS_ SENT, false); 985 throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_STREAM_READY, fa lse);
847 throwOrCancel(FailureType.CANCEL_ASYNC_WITHOUT_PAUSE, ResponseStep.ON_RE QUEST_HEADERS_SENT, 986 throwOrCancel(FailureType.CANCEL_ASYNC_WITHOUT_PAUSE, ResponseStep.ON_ST REAM_READY, false);
848 false); 987 throwOrCancel(FailureType.THROW_SYNC, ResponseStep.ON_STREAM_READY, true );
849 throwOrCancel(FailureType.THROW_SYNC, ResponseStep.ON_REQUEST_HEADERS_SE NT, true);
850 988
851 throwOrCancel(FailureType.CANCEL_SYNC, ResponseStep.ON_RESPONSE_STARTED, false); 989 throwOrCancel(FailureType.CANCEL_SYNC, ResponseStep.ON_RESPONSE_STARTED, false);
852 throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_RESPONSE_STARTED , false); 990 throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_RESPONSE_STARTED , false);
853 throwOrCancel( 991 throwOrCancel(
854 FailureType.CANCEL_ASYNC_WITHOUT_PAUSE, ResponseStep.ON_RESPONSE _STARTED, false); 992 FailureType.CANCEL_ASYNC_WITHOUT_PAUSE, ResponseStep.ON_RESPONSE _STARTED, false);
855 throwOrCancel(FailureType.THROW_SYNC, ResponseStep.ON_RESPONSE_STARTED, true); 993 throwOrCancel(FailureType.THROW_SYNC, ResponseStep.ON_RESPONSE_STARTED, true);
856 994
857 throwOrCancel(FailureType.CANCEL_SYNC, ResponseStep.ON_READ_COMPLETED, f alse); 995 throwOrCancel(FailureType.CANCEL_SYNC, ResponseStep.ON_READ_COMPLETED, f alse);
858 throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_READ_COMPLETED, false); 996 throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_READ_COMPLETED, false);
859 throwOrCancel( 997 throwOrCancel(
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
1050 private static String bufferContentsToString(ByteBuffer byteBuffer, int star t, int end) { 1188 private static String bufferContentsToString(ByteBuffer byteBuffer, int star t, int end) {
1051 // Use a duplicate to avoid modifying byteBuffer. 1189 // Use a duplicate to avoid modifying byteBuffer.
1052 ByteBuffer duplicate = byteBuffer.duplicate(); 1190 ByteBuffer duplicate = byteBuffer.duplicate();
1053 duplicate.position(start); 1191 duplicate.position(start);
1054 duplicate.limit(end); 1192 duplicate.limit(end);
1055 byte[] contents = new byte[duplicate.remaining()]; 1193 byte[] contents = new byte[duplicate.remaining()];
1056 duplicate.get(contents); 1194 duplicate.get(contents);
1057 return new String(contents); 1195 return new String(contents);
1058 } 1196 }
1059 } 1197 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698