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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: components/cronet/android/test/javatests/src/org/chromium/net/BidirectionalStreamTest.java
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/BidirectionalStreamTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/BidirectionalStreamTest.java
index 74c88ad6e0e026a097139394112a9b434597c8af..550a6f6ef5386a6850f88b8321de74695d13dc7c 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/BidirectionalStreamTest.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/BidirectionalStreamTest.java
@@ -236,6 +236,151 @@ public class BidirectionalStreamTest extends CronetTestBase {
@SmallTest
@Feature({"Cronet"})
@OnlyRunNativeCronet
+ public void testSimplePostWithFlush() throws Exception {
+ String url = Http2TestServer.getEchoStreamUrl();
+ TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCallback();
+ callback.addWriteData("Test String".getBytes(), false);
+ callback.addWriteData("1234567890".getBytes(), false);
+ callback.addWriteData("woot!".getBytes(), true);
+ BidirectionalStream stream = new BidirectionalStream
+ .Builder(url, callback, callback.getExecutor(),
+ mTestFramework.mCronetEngine)
+ .disableAutoFlush(true)
+ .addHeader("foo", "bar")
+ .addHeader("empty", "")
+ .addHeader("Content-Type", "zebra")
+ .build();
+ stream.start();
+ callback.blockForDone();
+ assertTrue(stream.isDone());
+
+ // Flush after stream is completed is no-op. It shouldn't call into the destroyed adapter.
+ stream.flush();
+
+ assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
+ assertEquals("Test String1234567890woot!", callback.mResponseAsString);
+ assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo").get(0));
+ assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty").get(0));
+ assertEquals(
+ "zebra", callback.mResponseInfo.getAllHeaders().get("echo-content-type").get(0));
+ }
+
+ @SmallTest
+ @Feature({"Cronet"})
+ @OnlyRunNativeCronet
+ public void testSimplePostWithFlushTwice() throws Exception {
+ String url = Http2TestServer.getEchoStreamUrl();
+ TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCallback();
+ callback.addWriteData("Test String".getBytes(), false);
+ callback.addWriteData("1234567890".getBytes(), false);
+ callback.addWriteData("woot!".getBytes(), true);
+ callback.addWriteData("Test String".getBytes(), false);
+ callback.addWriteData("1234567890".getBytes(), false);
+ callback.addWriteData("woot!".getBytes(), true);
+ BidirectionalStream stream = new BidirectionalStream
+ .Builder(url, callback, callback.getExecutor(),
+ mTestFramework.mCronetEngine)
+ .disableAutoFlush(true)
+ .addHeader("foo", "bar")
+ .addHeader("empty", "")
+ .addHeader("Content-Type", "zebra")
+ .build();
+ stream.start();
+ callback.blockForDone();
+ assertTrue(stream.isDone());
+ assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
+ assertEquals(
+ "Test String1234567890woot!Test String1234567890woot!", callback.mResponseAsString);
+ assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo").get(0));
+ assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty").get(0));
+ assertEquals(
+ "zebra", callback.mResponseInfo.getAllHeaders().get("echo-content-type").get(0));
+ }
+
+ @SmallTest
+ @Feature({"Cronet"})
+ @OnlyRunNativeCronet
+ // Tests that it is legal to call read() in onStreamReady().
+ public void testReadDuringOnStreamReady() throws Exception {
+ String url = Http2TestServer.getEchoStreamUrl();
+ TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCallback() {
+ @Override
+ public void onStreamReady(BidirectionalStream stream) {
+ super.onStreamReady(stream);
+ startNextRead(stream);
+ }
+ @Override
+ public void onResponseHeadersReceived(
+ BidirectionalStream stream, UrlResponseInfo info) {
+ // Do nothing. Skip readng.
+ }
+ };
+ callback.addWriteData("Test String".getBytes());
+ callback.addWriteData("1234567890".getBytes());
+ callback.addWriteData("woot!".getBytes());
+ BidirectionalStream stream = new BidirectionalStream
+ .Builder(url, callback, callback.getExecutor(),
+ mTestFramework.mCronetEngine)
+ .addHeader("foo", "bar")
+ .addHeader("empty", "")
+ .addHeader("Content-Type", "zebra")
+ .build();
+ stream.start();
+ callback.blockForDone();
+ assertTrue(stream.isDone());
+ assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
+ assertEquals("Test String1234567890woot!", callback.mResponseAsString);
+ assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo").get(0));
+ assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty").get(0));
+ assertEquals(
+ "zebra", callback.mResponseInfo.getAllHeaders().get("echo-content-type").get(0));
+ }
+
+ @SmallTest
+ @Feature({"Cronet"})
+ @OnlyRunNativeCronet
+ // Tests that it is legal to call flush() when previous nativeWritevData has
+ // yet to complete.
+ public void testSimplePostWithFlushBeforePreviousWriteCompleted() throws Exception {
+ String url = Http2TestServer.getEchoStreamUrl();
+ TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCallback() {
+ @Override
+ public void onStreamReady(BidirectionalStream stream) {
+ super.onStreamReady(stream);
+ // Write a second time before the previous nativeWritevData has completed.
+ startNextWrite(stream);
+ assertEquals(0, numPendingWrites());
+ }
+ };
+ callback.addWriteData("Test String".getBytes(), false);
+ callback.addWriteData("1234567890".getBytes(), false);
+ callback.addWriteData("woot!".getBytes(), true);
+ callback.addWriteData("Test String".getBytes(), false);
+ callback.addWriteData("1234567890".getBytes(), false);
+ callback.addWriteData("woot!".getBytes(), true);
+ BidirectionalStream stream = new BidirectionalStream
+ .Builder(url, callback, callback.getExecutor(),
+ mTestFramework.mCronetEngine)
+ .disableAutoFlush(true)
+ .addHeader("foo", "bar")
+ .addHeader("empty", "")
+ .addHeader("Content-Type", "zebra")
+ .build();
+ stream.start();
+ callback.blockForDone();
+ assertTrue(stream.isDone());
+ assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
+ assertEquals(
+ "Test String1234567890woot!Test String1234567890woot!", callback.mResponseAsString);
+ assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo").get(0));
+ assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty").get(0));
+ assertEquals(
+ "zebra", callback.mResponseInfo.getAllHeaders().get("echo-content-type").get(0));
+ }
+
+ @SmallTest
+ @Feature({"Cronet"})
+ @OnlyRunNativeCronet
public void testSimplePut() throws Exception {
TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCallback();
callback.addWriteData("Put This Data!".getBytes());
@@ -483,20 +628,13 @@ public class BidirectionalStreamTest extends CronetTestBase {
String url = Http2TestServer.getEchoStreamUrl();
TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCallback() {
@Override
- public void onRequestHeadersSent(BidirectionalStream stream) {
+ public void onStreamReady(BidirectionalStream stream) {
+ // super class will call Write() once.
+ super.onStreamReady(stream);
+ // Call Write() again.
startNextWrite(stream);
- try {
- // Second write from callback invoked on single-threaded executor throws
- // an exception because first write is still pending until its completion
- // is handled on executor.
- ByteBuffer writeBuffer = ByteBuffer.allocateDirect(5);
- writeBuffer.put("abc".getBytes());
- writeBuffer.flip();
- stream.write(writeBuffer, false);
- fail("Exception is not thrown.");
- } catch (Exception e) {
- assertEquals("Unexpected write attempt.", e.getMessage());
- }
+ // Make sure there is no pending write.
+ assertEquals(0, numPendingWrites());
}
};
callback.addWriteData("1".getBytes());
@@ -604,19 +742,19 @@ public class BidirectionalStreamTest extends CronetTestBase {
.build();
stream.start();
// Write first.
- callback.waitForNextWriteStep();
+ callback.waitForNextWriteStep(); // onStreamReady
for (String expected : testData) {
// Write next chunk of test data.
callback.startNextWrite(stream);
- callback.waitForNextWriteStep();
+ callback.waitForNextWriteStep(); // onWriteCompleted
}
// Wait for read step, but don't read yet.
- callback.waitForNextReadStep();
+ callback.waitForNextReadStep(); // onResponseHeadersReceived
assertEquals("", callback.mResponseAsString);
// Read back.
callback.startNextRead(stream);
- callback.waitForNextReadStep();
+ callback.waitForNextReadStep(); // onReadCompleted
// Verify that some part of proper response is read.
assertTrue(callback.mResponseAsString.startsWith(testData[0]));
assertTrue(stringData.toString().startsWith(callback.mResponseAsString));
@@ -743,8 +881,9 @@ public class BidirectionalStreamTest extends CronetTestBase {
// One more read attempt. The request should complete.
readBuffer.position(1);
readBuffer.limit(5);
+ callback.setAutoAdvance(true);
callback.startNextRead(stream, readBuffer);
- callback.waitForNextReadStep();
+ callback.blockForDone();
assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
assertEquals("GET", callback.mResponseAsString);
@@ -823,11 +962,11 @@ public class BidirectionalStreamTest extends CronetTestBase {
callback.blockForDone();
// assertEquals(callback.mResponseStep, failureStep);
assertTrue(stream.isDone());
- // Cancellation when request headers are sent does not guarantee that
+ // Cancellation when stream is ready does not guarantee that
// mResponseInfo is null because there might be a
// onResponseHeadersReceived already queued in the executor.
// See crbug.com/594432.
- if (failureStep != ResponseStep.ON_REQUEST_HEADERS_SENT) {
+ if (failureStep != ResponseStep.ON_STREAM_READY) {
assertNotNull(callback.mResponseInfo);
}
assertEquals(expectError, callback.mError != null);
@@ -842,11 +981,10 @@ public class BidirectionalStreamTest extends CronetTestBase {
@Feature({"Cronet"})
@OnlyRunNativeCronet
public void testFailures() throws Exception {
- throwOrCancel(FailureType.CANCEL_SYNC, ResponseStep.ON_REQUEST_HEADERS_SENT, false);
- throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_REQUEST_HEADERS_SENT, false);
- throwOrCancel(FailureType.CANCEL_ASYNC_WITHOUT_PAUSE, ResponseStep.ON_REQUEST_HEADERS_SENT,
- false);
- throwOrCancel(FailureType.THROW_SYNC, ResponseStep.ON_REQUEST_HEADERS_SENT, true);
+ throwOrCancel(FailureType.CANCEL_SYNC, ResponseStep.ON_STREAM_READY, false);
+ throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_STREAM_READY, false);
+ throwOrCancel(FailureType.CANCEL_ASYNC_WITHOUT_PAUSE, ResponseStep.ON_STREAM_READY, false);
+ throwOrCancel(FailureType.THROW_SYNC, ResponseStep.ON_STREAM_READY, true);
throwOrCancel(FailureType.CANCEL_SYNC, ResponseStep.ON_RESPONSE_STARTED, false);
throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_RESPONSE_STARTED, false);

Powered by Google App Engine
This is Rietveld 408576698