Index: components/cronet/android/test/javatests/src/org/chromium/net/TestBidirectionalStreamCallback.java |
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/TestBidirectionalStreamCallback.java b/components/cronet/android/test/javatests/src/org/chromium/net/TestBidirectionalStreamCallback.java |
index c7a630c85ead7a43b544b63d88380fbdf6ef8755..e8214eaefee88742d988c357282db8708a329f6a 100644 |
--- a/components/cronet/android/test/javatests/src/org/chromium/net/TestBidirectionalStreamCallback.java |
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/TestBidirectionalStreamCallback.java |
@@ -13,6 +13,7 @@ import static junit.framework.Assert.assertTrue; |
import java.nio.ByteBuffer; |
import java.util.ArrayList; |
+import java.util.Iterator; |
import java.util.concurrent.Executor; |
import java.util.concurrent.ExecutorService; |
import java.util.concurrent.Executors; |
@@ -39,6 +40,7 @@ public class TestBidirectionalStreamCallback extends BidirectionalStream.Callbac |
private static final int READ_BUFFER_SIZE = 32 * 1024; |
+ private boolean mHandleFlush; |
// When false, the consumer is responsible for all calls into the stream |
// that advance it. |
private boolean mAutoAdvance = true; |
@@ -63,7 +65,10 @@ public class TestBidirectionalStreamCallback extends BidirectionalStream.Callbac |
private int mBufferPositionBeforeRead; |
// Data to write. |
- private ArrayList<ByteBuffer> mWriteBuffers = new ArrayList<ByteBuffer>(); |
+ private ArrayList<WriteBuffer> mWriteBuffers = new ArrayList<WriteBuffer>(); |
+ |
+ // Buffers that we yet to receive the corresponding onWriteCompleted callback. |
+ private ArrayList<WriteBuffer> mWriteBuffersToBeAcked = new ArrayList<WriteBuffer>(); |
private class ExecutorThreadFactory implements ThreadFactory { |
public Thread newThread(Runnable r) { |
@@ -72,9 +77,18 @@ public class TestBidirectionalStreamCallback extends BidirectionalStream.Callbac |
} |
} |
+ private static class WriteBuffer { |
+ final ByteBuffer mBuffer; |
+ final boolean mFlush; |
+ public WriteBuffer(ByteBuffer buffer, boolean flush) { |
+ mBuffer = buffer; |
+ mFlush = flush; |
+ } |
+ } |
+ |
public enum ResponseStep { |
NOTHING, |
- ON_REQUEST_HEADERS_SENT, |
+ ON_STREAM_READY, |
ON_RESPONSE_STARTED, |
ON_READ_COMPLETED, |
ON_WRITE_COMPLETED, |
@@ -94,6 +108,10 @@ public class TestBidirectionalStreamCallback extends BidirectionalStream.Callbac |
THROW_SYNC |
} |
+ public void setHandleFlush() { |
+ mHandleFlush = true; |
+ } |
+ |
public void setAutoAdvance(boolean autoAdvance) { |
mAutoAdvance = autoAdvance; |
} |
@@ -126,20 +144,28 @@ public class TestBidirectionalStreamCallback extends BidirectionalStream.Callbac |
} |
public void addWriteData(byte[] data) { |
+ addWriteData(data, false); |
+ } |
+ |
+ public void addWriteData(byte[] data, boolean flush) { |
ByteBuffer writeBuffer = ByteBuffer.allocateDirect(data.length); |
writeBuffer.put(data); |
writeBuffer.flip(); |
- mWriteBuffers.add(writeBuffer); |
+ if (flush && !mHandleFlush) { |
kapishnikov
2016/04/12 19:27:39
Related to the previous comment. I think that shou
xunjieli
2016/04/12 19:59:03
Done.
|
+ throw new IllegalArgumentException("cannot add flush when auto flush is on"); |
+ } |
+ mWriteBuffers.add(new WriteBuffer(writeBuffer, flush)); |
+ mWriteBuffersToBeAcked.add(new WriteBuffer(writeBuffer, flush)); |
} |
@Override |
- public void onRequestHeadersSent(BidirectionalStream stream) { |
+ public void onStreamReady(BidirectionalStream stream) { |
assertEquals(mExecutorThread, Thread.currentThread()); |
assertFalse(stream.isDone()); |
assertEquals(ResponseStep.NOTHING, mResponseStep); |
assertNull(mError); |
- mResponseStep = ResponseStep.ON_REQUEST_HEADERS_SENT; |
+ mResponseStep = ResponseStep.ON_STREAM_READY; |
if (maybeThrowCancelOrPause(stream, mWriteStepBlock)) { |
return; |
} |
@@ -151,7 +177,7 @@ public class TestBidirectionalStreamCallback extends BidirectionalStream.Callbac |
assertEquals(mExecutorThread, Thread.currentThread()); |
assertFalse(stream.isDone()); |
assertTrue(mResponseStep == ResponseStep.NOTHING |
- || mResponseStep == ResponseStep.ON_REQUEST_HEADERS_SENT |
+ || mResponseStep == ResponseStep.ON_STREAM_READY |
|| mResponseStep == ResponseStep.ON_WRITE_COMPLETED); |
assertNull(mError); |
@@ -200,9 +226,9 @@ public class TestBidirectionalStreamCallback extends BidirectionalStream.Callbac |
assertFalse(stream.isDone()); |
assertNull(mError); |
mResponseStep = ResponseStep.ON_WRITE_COMPLETED; |
- if (!mWriteBuffers.isEmpty()) { |
- assertEquals(buffer, mWriteBuffers.get(0)); |
- mWriteBuffers.remove(0); |
+ if (!mWriteBuffersToBeAcked.isEmpty()) { |
+ assertEquals(buffer, mWriteBuffersToBeAcked.get(0).mBuffer); |
+ mWriteBuffersToBeAcked.remove(0); |
} |
if (maybeThrowCancelOrPause(stream, mWriteStepBlock)) { |
return; |
@@ -234,6 +260,8 @@ public class TestBidirectionalStreamCallback extends BidirectionalStream.Callbac |
assertFalse(mOnErrorCalled); |
assertFalse(mOnCanceledCalled); |
assertNull(mError); |
+ assertEquals(0, mWriteBuffers.size()); |
+ assertEquals(0, mWriteBuffersToBeAcked.size()); |
mResponseStep = ResponseStep.ON_SUCCEEDED; |
mResponseInfo = info; |
@@ -285,8 +313,22 @@ public class TestBidirectionalStreamCallback extends BidirectionalStream.Callbac |
public void startNextWrite(BidirectionalStream stream) { |
if (!mWriteBuffers.isEmpty()) { |
- boolean isLastBuffer = mWriteBuffers.size() == 1; |
- stream.write(mWriteBuffers.get(0), isLastBuffer); |
+ if (mHandleFlush) { |
+ Iterator<WriteBuffer> iterator = mWriteBuffers.iterator(); |
+ while (iterator.hasNext()) { |
+ WriteBuffer b = iterator.next(); |
+ stream.write(b.mBuffer, !iterator.hasNext()); |
+ iterator.remove(); |
+ if (b.mFlush) { |
+ stream.flush(); |
+ break; |
+ } |
+ } |
+ } else { |
+ boolean isLastBuffer = (mWriteBuffers.size() == 1); |
+ stream.write(mWriteBuffers.get(0).mBuffer, isLastBuffer); |
+ mWriteBuffers.remove(0); |
+ } |
} |
} |