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..8f05ccefa4ec59ef239f0be5b1363a37df37d1bc 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; |
@@ -63,7 +64,10 @@ public class TestBidirectionalStreamCallback extends BidirectionalStream.Callbac |
private int mBufferPositionBeforeRead; |
// Data to write. |
- private ArrayList<ByteBuffer> mWriteBuffers = new ArrayList<ByteBuffer>(); |
+ private final ArrayList<WriteBuffer> mWriteBuffers = new ArrayList<WriteBuffer>(); |
+ |
+ // Buffers that we yet to receive the corresponding onWriteCompleted callback. |
+ private final ArrayList<WriteBuffer> mWriteBuffersToBeAcked = new ArrayList<WriteBuffer>(); |
private class ExecutorThreadFactory implements ThreadFactory { |
public Thread newThread(Runnable r) { |
@@ -72,16 +76,25 @@ 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, |
ON_TRAILERS, |
ON_CANCELED, |
ON_FAILED, |
- ON_SUCCEEDED |
+ ON_SUCCEEDED, |
} |
public enum FailureType { |
@@ -126,20 +139,24 @@ public class TestBidirectionalStreamCallback extends BidirectionalStream.Callbac |
} |
public void addWriteData(byte[] data) { |
+ addWriteData(data, true); |
+ } |
+ |
+ public void addWriteData(byte[] data, boolean flush) { |
ByteBuffer writeBuffer = ByteBuffer.allocateDirect(data.length); |
writeBuffer.put(data); |
writeBuffer.flip(); |
- mWriteBuffers.add(writeBuffer); |
+ 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 +168,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); |
@@ -164,8 +181,8 @@ public class TestBidirectionalStreamCallback extends BidirectionalStream.Callbac |
} |
@Override |
- public void onReadCompleted( |
- BidirectionalStream stream, UrlResponseInfo info, ByteBuffer byteBuffer) { |
+ public void onReadCompleted(BidirectionalStream stream, UrlResponseInfo info, |
+ ByteBuffer byteBuffer, boolean endOfStream) { |
assertEquals(mExecutorThread, Thread.currentThread()); |
assertFalse(stream.isDone()); |
assertTrue(mResponseStep == ResponseStep.ON_RESPONSE_STARTED |
@@ -175,6 +192,7 @@ public class TestBidirectionalStreamCallback extends BidirectionalStream.Callbac |
assertNull(mError); |
mResponseStep = ResponseStep.ON_READ_COMPLETED; |
+ mResponseInfo = info; |
final int bytesRead = byteBuffer.position() - mBufferPositionBeforeRead; |
mHttpResponseDataLength += bytesRead; |
@@ -190,19 +208,23 @@ public class TestBidirectionalStreamCallback extends BidirectionalStream.Callbac |
if (maybeThrowCancelOrPause(stream, mReadStepBlock)) { |
return; |
} |
- startNextRead(stream); |
+ // Do not read if EOF has been reached. |
+ if (!endOfStream) { |
+ startNextRead(stream); |
+ } |
} |
@Override |
- public void onWriteCompleted( |
- BidirectionalStream stream, UrlResponseInfo info, ByteBuffer buffer) { |
+ public void onWriteCompleted(BidirectionalStream stream, UrlResponseInfo info, |
+ ByteBuffer buffer, boolean endOfStream) { |
assertEquals(mExecutorThread, Thread.currentThread()); |
assertFalse(stream.isDone()); |
assertNull(mError); |
mResponseStep = ResponseStep.ON_WRITE_COMPLETED; |
- if (!mWriteBuffers.isEmpty()) { |
- assertEquals(buffer, mWriteBuffers.get(0)); |
- mWriteBuffers.remove(0); |
+ mResponseInfo = info; |
+ if (!mWriteBuffersToBeAcked.isEmpty()) { |
+ assertEquals(buffer, mWriteBuffersToBeAcked.get(0).mBuffer); |
+ mWriteBuffersToBeAcked.remove(0); |
} |
if (maybeThrowCancelOrPause(stream, mWriteStepBlock)) { |
return; |
@@ -217,6 +239,7 @@ public class TestBidirectionalStreamCallback extends BidirectionalStream.Callbac |
assertFalse(stream.isDone()); |
assertNull(mError); |
mResponseStep = ResponseStep.ON_TRAILERS; |
+ mResponseInfo = info; |
mTrailers = trailers; |
if (maybeThrowCancelOrPause(stream, mReadStepBlock)) { |
return; |
@@ -234,6 +257,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; |
@@ -252,6 +277,7 @@ public class TestBidirectionalStreamCallback extends BidirectionalStream.Callbac |
assertFalse(mOnCanceledCalled); |
assertNull(mError); |
mResponseStep = ResponseStep.ON_FAILED; |
+ mResponseInfo = info; |
mOnErrorCalled = true; |
mError = error; |
@@ -268,6 +294,7 @@ public class TestBidirectionalStreamCallback extends BidirectionalStream.Callbac |
assertFalse(mOnErrorCalled); |
assertNull(mError); |
mResponseStep = ResponseStep.ON_CANCELED; |
+ mResponseInfo = info; |
mOnCanceledCalled = true; |
openDone(); |
@@ -285,8 +312,16 @@ 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); |
+ 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; |
+ } |
+ } |
} |
} |
@@ -297,6 +332,13 @@ public class TestBidirectionalStreamCallback extends BidirectionalStream.Callbac |
return mDone.block(1); |
} |
+ /** |
+ * Returns the number of pending Writes. |
+ */ |
+ public int numPendingWrites() { |
+ return mWriteBuffers.size(); |
+ } |
+ |
protected void openDone() { |
mDone.open(); |
} |