| 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);
|
|
|