| 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 cd0f40a06b5b64ca3a81e415f4cc095fc9262c75..ec3de1a9e951327d75a87bd9b0674ddc3a214b18 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
|
| @@ -400,6 +400,55 @@ public class BidirectionalStreamTest extends CronetTestBase {
|
| @SmallTest
|
| @Feature({"Cronet"})
|
| @OnlyRunNativeCronet
|
| + // Regression test for crbug.com/692168. This test is racy, but it should catch the regression
|
| + // sometimes.
|
| + public void testCancelWhileWriteDataPending() throws Exception {
|
| + String url = Http2TestServer.getEchoStreamUrl();
|
| + TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCallback() {
|
| + // Number of onWriteCompleted callbacks that have been invoked.
|
| + private int mNumWriteCompleted = 0;
|
| + @Override
|
| + public void onWriteCompleted(BidirectionalStream stream, UrlResponseInfo info,
|
| + ByteBuffer buffer, boolean endOfStream) {
|
| + mNumWriteCompleted++;
|
| + super.onWriteCompleted(stream, info, buffer, endOfStream);
|
| + assertTrue(mNumWriteCompleted <= 2);
|
| + // Cancel in the second write callback to get a better chance of catching the race.
|
| + if (mNumWriteCompleted == 2) {
|
| + stream.cancel();
|
| + }
|
| + }
|
| + };
|
| + byte[] dummyString = "dummy".getBytes();
|
| + callback.addWriteData(dummyString, true);
|
| + callback.addWriteData(dummyString, false);
|
| + callback.addWriteData(dummyString, true);
|
| + callback.addWriteData(dummyString, false);
|
| + callback.addWriteData(dummyString, false);
|
| + callback.addWriteData(dummyString, false);
|
| + callback.addWriteData(dummyString, true);
|
| + callback.addWriteData(dummyString, false);
|
| + callback.addWriteData(dummyString, true);
|
| + callback.addWriteData(dummyString, false);
|
| + CronetBidirectionalStream stream =
|
| + (CronetBidirectionalStream) mTestFramework.mCronetEngine
|
| + .newBidirectionalStreamBuilder(url, callback, callback.getExecutor())
|
| + .build();
|
| + callback.setAutoAdvance(false);
|
| + stream.start();
|
| + callback.waitForNextWriteStep(); // onStreamReady
|
| + // Write 1 and flush().
|
| + callback.startNextWrite(stream);
|
| + // Write 2, 3 and flush(). 2 and 3 are in the flush queue.
|
| + callback.startNextWrite(stream);
|
| + callback.setAutoAdvance(true);
|
| + callback.blockForDone();
|
| + assertTrue(callback.mOnCanceledCalled);
|
| + }
|
| +
|
| + @SmallTest
|
| + @Feature({"Cronet"})
|
| + @OnlyRunNativeCronet
|
| public void testSimpleGetWithFlush() throws Exception {
|
| // TODO(xunjieli): Use ParameterizedTest instead of the loop.
|
| for (int i = 0; i < 2; i++) {
|
|
|