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

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: self review 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 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
257 assertEquals("Test String1234567890woot!", callback.mResponseAsString);
258 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo ").get(0));
259 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty" ).get(0));
260 assertEquals(
261 "zebra", callback.mResponseInfo.getAllHeaders().get("echo-conten t-type").get(0));
262 }
263
264 @SmallTest
265 @Feature({"Cronet"})
266 @OnlyRunNativeCronet
267 public void testSimplePostWithFlushTwice() throws Exception {
268 String url = Http2TestServer.getEchoStreamUrl();
269 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
270 callback.addWriteData("Test String".getBytes(), false);
271 callback.addWriteData("1234567890".getBytes(), false);
272 callback.addWriteData("woot!".getBytes(), true);
273 callback.addWriteData("Test String".getBytes(), false);
274 callback.addWriteData("1234567890".getBytes(), false);
275 callback.addWriteData("woot!".getBytes(), true);
276 BidirectionalStream stream = new BidirectionalStream
277 .Builder(url, callback, callback.ge tExecutor(),
278 mTestFramework.mCronetEngin e)
279 .disableAutoFlush(true)
280 .addHeader("foo", "bar")
281 .addHeader("empty", "")
282 .addHeader("Content-Type", "zebra")
283 .build();
284 stream.start();
285 callback.blockForDone();
286 assertTrue(stream.isDone());
287 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
288 assertEquals(
289 "Test String1234567890woot!Test String1234567890woot!", callback .mResponseAsString);
290 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo ").get(0));
291 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty" ).get(0));
292 assertEquals(
293 "zebra", callback.mResponseInfo.getAllHeaders().get("echo-conten t-type").get(0));
294 }
295
296 @SmallTest
297 @Feature({"Cronet"})
298 @OnlyRunNativeCronet
299 // Tests that it is legal to call flush() when previous nativeWritevData has
300 // yet to complete.
301 public void testSimplePostWithFlushBeforePreviousWriteCompleted() throws Exc eption {
302 String url = Http2TestServer.getEchoStreamUrl();
303 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback() {
304 @Override
305 public void onStreamReady(BidirectionalStream stream) {
306 super.onStreamReady(stream);
307 // Write a second time before the previous nativeWritevData has completed.
308 startNextWrite(stream);
309 assertEquals(0, numPendingWrites());
310 }
311 };
312 callback.addWriteData("Test String".getBytes(), false);
313 callback.addWriteData("1234567890".getBytes(), false);
314 callback.addWriteData("woot!".getBytes(), true);
315 callback.addWriteData("Test String".getBytes(), false);
316 callback.addWriteData("1234567890".getBytes(), false);
317 callback.addWriteData("woot!".getBytes(), true);
318 BidirectionalStream stream = new BidirectionalStream
319 .Builder(url, callback, callback.ge tExecutor(),
320 mTestFramework.mCronetEngin e)
321 .disableAutoFlush(true)
322 .addHeader("foo", "bar")
323 .addHeader("empty", "")
324 .addHeader("Content-Type", "zebra")
325 .build();
326 stream.start();
327 callback.blockForDone();
328 assertTrue(stream.isDone());
329 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
330 assertEquals(
331 "Test String1234567890woot!Test String1234567890woot!", callback .mResponseAsString);
332 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo ").get(0));
333 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty" ).get(0));
334 assertEquals(
335 "zebra", callback.mResponseInfo.getAllHeaders().get("echo-conten t-type").get(0));
336 }
337
338 @SmallTest
339 @Feature({"Cronet"})
340 @OnlyRunNativeCronet
239 public void testSimplePut() throws Exception { 341 public void testSimplePut() throws Exception {
240 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 342 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
241 callback.addWriteData("Put This Data!".getBytes()); 343 callback.addWriteData("Put This Data!".getBytes());
242 String methodName = "PUT"; 344 String methodName = "PUT";
243 BidirectionalStream.Builder builder = 345 BidirectionalStream.Builder builder =
244 new BidirectionalStream.Builder(Http2TestServer.getServerUrl(), callback, 346 new BidirectionalStream.Builder(Http2TestServer.getServerUrl(), callback,
245 callback.getExecutor(), mTestFramework.mCronetEngine); 347 callback.getExecutor(), mTestFramework.mCronetEngine);
246 builder.setHttpMethod(methodName); 348 builder.setHttpMethod(methodName);
247 builder.build().start(); 349 builder.build().start();
248 callback.blockForDone(); 350 callback.blockForDone();
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
476 assertEquals("", callback.mResponseAsString); 578 assertEquals("", callback.mResponseAsString);
477 } 579 }
478 580
479 @SmallTest 581 @SmallTest
480 @Feature({"Cronet"}) 582 @Feature({"Cronet"})
481 @OnlyRunNativeCronet 583 @OnlyRunNativeCronet
482 public void testDoubleWrite() throws Exception { 584 public void testDoubleWrite() throws Exception {
483 String url = Http2TestServer.getEchoStreamUrl(); 585 String url = Http2TestServer.getEchoStreamUrl();
484 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback() { 586 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback() {
485 @Override 587 @Override
486 public void onRequestHeadersSent(BidirectionalStream stream) { 588 public void onStreamReady(BidirectionalStream stream) {
589 // super class will call Write() once.
590 super.onStreamReady(stream);
591 // Call Write() again.
487 startNextWrite(stream); 592 startNextWrite(stream);
488 try { 593 // Make sure there is no pending write.
489 // Second write from callback invoked on single-threaded exe cutor throws 594 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 } 595 }
501 }; 596 };
502 callback.addWriteData("1".getBytes()); 597 callback.addWriteData("1".getBytes());
503 callback.addWriteData("2".getBytes()); 598 callback.addWriteData("2".getBytes());
504 // Create stream. 599 // Create stream.
505 BidirectionalStream stream = new BidirectionalStream 600 BidirectionalStream stream = new BidirectionalStream
506 .Builder(url, callback, callback.ge tExecutor(), 601 .Builder(url, callback, callback.ge tExecutor(),
507 mTestFramework.mCronetEngin e) 602 mTestFramework.mCronetEngin e)
508 .build(); 603 .build();
509 stream.start(); 604 stream.start();
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 callback.addWriteData(writeData.getBytes()); 692 callback.addWriteData(writeData.getBytes());
598 stringData.append(writeData); 693 stringData.append(writeData);
599 } 694 }
600 // Create stream. 695 // Create stream.
601 BidirectionalStream stream = new BidirectionalStream 696 BidirectionalStream stream = new BidirectionalStream
602 .Builder(url, callback, callback.ge tExecutor(), 697 .Builder(url, callback, callback.ge tExecutor(),
603 mTestFramework.mCronetEngin e) 698 mTestFramework.mCronetEngin e)
604 .build(); 699 .build();
605 stream.start(); 700 stream.start();
606 // Write first. 701 // Write first.
607 callback.waitForNextWriteStep(); 702 callback.waitForNextWriteStep(); // onStreamReady
608 for (String expected : testData) { 703 for (String expected : testData) {
609 // Write next chunk of test data. 704 // Write next chunk of test data.
610 callback.startNextWrite(stream); 705 callback.startNextWrite(stream);
611 callback.waitForNextWriteStep(); 706 callback.waitForNextWriteStep(); // onWriteCompleted
612 } 707 }
613 708
614 // Wait for read step, but don't read yet. 709 // Wait for read step, but don't read yet.
615 callback.waitForNextReadStep(); 710 callback.waitForNextReadStep(); // onResponseHeadersReceived
616 assertEquals("", callback.mResponseAsString); 711 assertEquals("", callback.mResponseAsString);
617 // Read back. 712 // Read back.
618 callback.startNextRead(stream); 713 callback.startNextRead(stream);
619 callback.waitForNextReadStep(); 714 callback.waitForNextReadStep(); // onReadCompleted
620 // Verify that some part of proper response is read. 715 // Verify that some part of proper response is read.
621 assertTrue(callback.mResponseAsString.startsWith(testData[0])); 716 assertTrue(callback.mResponseAsString.startsWith(testData[0]));
622 assertTrue(stringData.toString().startsWith(callback.mResponseAsString)) ; 717 assertTrue(stringData.toString().startsWith(callback.mResponseAsString)) ;
623 // Read the rest of the response. 718 // Read the rest of the response.
624 callback.setAutoAdvance(true); 719 callback.setAutoAdvance(true);
625 callback.startNextRead(stream); 720 callback.startNextRead(stream);
626 callback.blockForDone(); 721 callback.blockForDone();
627 assertTrue(stream.isDone()); 722 assertTrue(stream.isDone());
628 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 723 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
629 assertEquals(stringData.toString(), callback.mResponseAsString); 724 assertEquals(stringData.toString(), callback.mResponseAsString);
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
816 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback(); 911 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa llback();
817 callback.setFailure(failureType, failureStep); 912 callback.setFailure(failureType, failureStep);
818 BidirectionalStream.Builder builder = 913 BidirectionalStream.Builder builder =
819 new BidirectionalStream.Builder(Http2TestServer.getEchoMethodUrl (), callback, 914 new BidirectionalStream.Builder(Http2TestServer.getEchoMethodUrl (), callback,
820 callback.getExecutor(), mTestFramework.mCronetEngine); 915 callback.getExecutor(), mTestFramework.mCronetEngine);
821 BidirectionalStream stream = builder.setHttpMethod("GET").build(); 916 BidirectionalStream stream = builder.setHttpMethod("GET").build();
822 stream.start(); 917 stream.start();
823 callback.blockForDone(); 918 callback.blockForDone();
824 // assertEquals(callback.mResponseStep, failureStep); 919 // assertEquals(callback.mResponseStep, failureStep);
825 assertTrue(stream.isDone()); 920 assertTrue(stream.isDone());
826 // Cancellation when request headers are sent does not guarantee that 921 // Cancellation when stream is ready does not guarantee that
827 // mResponseInfo is null because there might be a 922 // mResponseInfo is null because there might be a
828 // onResponseHeadersReceived already queued in the executor. 923 // onResponseHeadersReceived already queued in the executor.
829 // See crbug.com/594432. 924 // See crbug.com/594432.
830 if (failureStep != ResponseStep.ON_REQUEST_HEADERS_SENT) { 925 if (failureStep != ResponseStep.ON_STREAM_READY) {
831 assertNotNull(callback.mResponseInfo); 926 assertNotNull(callback.mResponseInfo);
832 } 927 }
833 assertEquals(expectError, callback.mError != null); 928 assertEquals(expectError, callback.mError != null);
834 assertEquals(expectError, callback.mOnErrorCalled); 929 assertEquals(expectError, callback.mOnErrorCalled);
835 assertEquals(failureType == FailureType.CANCEL_SYNC 930 assertEquals(failureType == FailureType.CANCEL_SYNC
836 || failureType == FailureType.CANCEL_ASYNC 931 || failureType == FailureType.CANCEL_ASYNC
837 || failureType == FailureType.CANCEL_ASYNC_WITHOUT_PAUSE , 932 || failureType == FailureType.CANCEL_ASYNC_WITHOUT_PAUSE ,
838 callback.mOnCanceledCalled); 933 callback.mOnCanceledCalled);
839 } 934 }
840 935
841 @SmallTest 936 @SmallTest
842 @Feature({"Cronet"}) 937 @Feature({"Cronet"})
843 @OnlyRunNativeCronet 938 @OnlyRunNativeCronet
844 public void testFailures() throws Exception { 939 public void testFailures() throws Exception {
845 throwOrCancel(FailureType.CANCEL_SYNC, ResponseStep.ON_REQUEST_HEADERS_S ENT, false); 940 throwOrCancel(FailureType.CANCEL_SYNC, ResponseStep.ON_STREAM_READY, fal se);
846 throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_REQUEST_HEADERS_ SENT, false); 941 throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_STREAM_READY, fa lse);
847 throwOrCancel(FailureType.CANCEL_ASYNC_WITHOUT_PAUSE, ResponseStep.ON_RE QUEST_HEADERS_SENT, 942 throwOrCancel(FailureType.CANCEL_ASYNC_WITHOUT_PAUSE, ResponseStep.ON_ST REAM_READY, false);
848 false); 943 throwOrCancel(FailureType.THROW_SYNC, ResponseStep.ON_STREAM_READY, true );
849 throwOrCancel(FailureType.THROW_SYNC, ResponseStep.ON_REQUEST_HEADERS_SE NT, true);
850 944
851 throwOrCancel(FailureType.CANCEL_SYNC, ResponseStep.ON_RESPONSE_STARTED, false); 945 throwOrCancel(FailureType.CANCEL_SYNC, ResponseStep.ON_RESPONSE_STARTED, false);
852 throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_RESPONSE_STARTED , false); 946 throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_RESPONSE_STARTED , false);
853 throwOrCancel( 947 throwOrCancel(
854 FailureType.CANCEL_ASYNC_WITHOUT_PAUSE, ResponseStep.ON_RESPONSE _STARTED, false); 948 FailureType.CANCEL_ASYNC_WITHOUT_PAUSE, ResponseStep.ON_RESPONSE _STARTED, false);
855 throwOrCancel(FailureType.THROW_SYNC, ResponseStep.ON_RESPONSE_STARTED, true); 949 throwOrCancel(FailureType.THROW_SYNC, ResponseStep.ON_RESPONSE_STARTED, true);
856 950
857 throwOrCancel(FailureType.CANCEL_SYNC, ResponseStep.ON_READ_COMPLETED, f alse); 951 throwOrCancel(FailureType.CANCEL_SYNC, ResponseStep.ON_READ_COMPLETED, f alse);
858 throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_READ_COMPLETED, false); 952 throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_READ_COMPLETED, false);
859 throwOrCancel( 953 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) { 1144 private static String bufferContentsToString(ByteBuffer byteBuffer, int star t, int end) {
1051 // Use a duplicate to avoid modifying byteBuffer. 1145 // Use a duplicate to avoid modifying byteBuffer.
1052 ByteBuffer duplicate = byteBuffer.duplicate(); 1146 ByteBuffer duplicate = byteBuffer.duplicate();
1053 duplicate.position(start); 1147 duplicate.position(start);
1054 duplicate.limit(end); 1148 duplicate.limit(end);
1055 byte[] contents = new byte[duplicate.remaining()]; 1149 byte[] contents = new byte[duplicate.remaining()];
1056 duplicate.get(contents); 1150 duplicate.get(contents);
1057 return new String(contents); 1151 return new String(contents);
1058 } 1152 }
1059 } 1153 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698