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

Unified Diff: components/cronet/android/test/javatests/src/org/chromium/net/TestBidirectionalStreamCallback.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/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();
}

Powered by Google App Engine
This is Rietveld 408576698