| Index: components/cronet/android/test/javatests/src/org/chromium/net/TestBidirectionalStreamCallback.java
|
| diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/TestUrlRequestCallback.java b/components/cronet/android/test/javatests/src/org/chromium/net/TestBidirectionalStreamCallback.java
|
| similarity index 55%
|
| copy from components/cronet/android/test/javatests/src/org/chromium/net/TestUrlRequestCallback.java
|
| copy to components/cronet/android/test/javatests/src/org/chromium/net/TestBidirectionalStreamCallback.java
|
| index c703de9b59641a90d2cacc519b00ba49a705e61f..dad6714afc9d26dba1abf64742d36a8bded09790 100644
|
| --- a/components/cronet/android/test/javatests/src/org/chromium/net/TestUrlRequestCallback.java
|
| +++ b/components/cronet/android/test/javatests/src/org/chromium/net/TestBidirectionalStreamCallback.java
|
| @@ -1,4 +1,4 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| @@ -20,28 +20,22 @@ import java.util.concurrent.ThreadFactory;
|
|
|
| /**
|
| * Callback that tracks information from different callbacks and and has a
|
| - * method to block thread until the request completes on another thread.
|
| - * Allows to cancel, block request or throw an exception from an arbitrary step.
|
| + * method to block thread until the stream completes on another thread.
|
| + * Allows to cancel, block stream or throw an exception from an arbitrary step.
|
| */
|
| -class TestUrlRequestCallback extends UrlRequest.Callback {
|
| - public ArrayList<UrlResponseInfo> mRedirectResponseInfoList = new ArrayList<UrlResponseInfo>();
|
| - public ArrayList<String> mRedirectUrlList = new ArrayList<String>();
|
| +class TestBidirectionalStreamCallback extends BidirectionalStream.Callback {
|
| public UrlResponseInfo mResponseInfo;
|
| - public UrlRequestException mError;
|
| + public CronetException mError;
|
|
|
| public ResponseStep mResponseStep = ResponseStep.NOTHING;
|
|
|
| - public int mRedirectCount = 0;
|
| public boolean mOnErrorCalled = false;
|
| public boolean mOnCanceledCalled = false;
|
|
|
| public int mHttpResponseDataLength = 0;
|
| public String mResponseAsString = "";
|
|
|
| - // Expect legacy read() API to be used on UrlRequest.
|
| - // TODO(pauljensen): Remove when all callers of UrlRequest.read() are
|
| - // transitioned to UrlRequest.readNew();
|
| - public boolean mLegacyReadByteBufferAdjustment = false;
|
| + public UrlResponseInfo.HeaderBlock mTrailers;
|
|
|
| private static final int READ_BUFFER_SIZE = 32 * 1024;
|
|
|
| @@ -57,16 +51,20 @@ class TestUrlRequestCallback extends UrlRequest.Callback {
|
| private final ConditionVariable mDone = new ConditionVariable();
|
|
|
| // Signaled on each step when mAutoAdvance is false.
|
| - private final ConditionVariable mStepBlock = new ConditionVariable();
|
| + private final ConditionVariable mReadStepBlock = new ConditionVariable();
|
| + private final ConditionVariable mWriteStepBlock = new ConditionVariable();
|
|
|
| // Executor Service for Cronet callbacks.
|
| private final ExecutorService mExecutorService =
|
| Executors.newSingleThreadExecutor(new ExecutorThreadFactory());
|
| private Thread mExecutorThread;
|
|
|
| - // position() of ByteBuffer prior to readNew() call.
|
| + // position() of ByteBuffer prior to read() call.
|
| private int mBufferPositionBeforeRead;
|
|
|
| + // Data to write.
|
| + private ArrayList<ByteBuffer> mWriteBuffers = new ArrayList<ByteBuffer>();
|
| +
|
| private class ExecutorThreadFactory implements ThreadFactory {
|
| public Thread newThread(Runnable r) {
|
| mExecutorThread = new Thread(r);
|
| @@ -76,9 +74,13 @@ class TestUrlRequestCallback extends UrlRequest.Callback {
|
|
|
| public enum ResponseStep {
|
| NOTHING,
|
| - ON_RECEIVED_REDIRECT,
|
| + ON_REQUEST_HEADERS_SENT,
|
| ON_RESPONSE_STARTED,
|
| ON_READ_COMPLETED,
|
| + ON_WRITE_COMPLETED,
|
| + ON_TRAILERS,
|
| + ON_CANCELED,
|
| + ON_ERROR,
|
| ON_SUCCEEDED
|
| }
|
|
|
| @@ -105,9 +107,14 @@ class TestUrlRequestCallback extends UrlRequest.Callback {
|
| mDone.block();
|
| }
|
|
|
| - public void waitForNextStep() {
|
| - mStepBlock.block();
|
| - mStepBlock.close();
|
| + public void waitForNextReadStep() {
|
| + mReadStepBlock.block();
|
| + mReadStepBlock.close();
|
| + }
|
| +
|
| + public void waitForNextWriteStep() {
|
| + mWriteStepBlock.block();
|
| + mWriteStepBlock.close();
|
| }
|
|
|
| public Executor getExecutor() {
|
| @@ -118,45 +125,48 @@ class TestUrlRequestCallback extends UrlRequest.Callback {
|
| mExecutorService.shutdown();
|
| }
|
|
|
| + public void addWriteData(byte[] data) {
|
| + ByteBuffer writeBuffer = ByteBuffer.allocateDirect(data.length);
|
| + writeBuffer.put(data);
|
| + writeBuffer.flip();
|
| + mWriteBuffers.add(writeBuffer);
|
| + }
|
| +
|
| @Override
|
| - public void onRedirectReceived(
|
| - UrlRequest request, UrlResponseInfo info, String newLocationUrl) {
|
| + public void onRequestHeadersSent(BidirectionalStream stream) {
|
| assertEquals(mExecutorThread, Thread.currentThread());
|
| - assertFalse(request.isDone());
|
| - assertTrue(mResponseStep == ResponseStep.NOTHING
|
| - || mResponseStep == ResponseStep.ON_RECEIVED_REDIRECT);
|
| + assertFalse(stream.isDone());
|
| + assertTrue(mResponseStep == ResponseStep.NOTHING);
|
| assertNull(mError);
|
|
|
| - mResponseStep = ResponseStep.ON_RECEIVED_REDIRECT;
|
| - mRedirectUrlList.add(newLocationUrl);
|
| - mRedirectResponseInfoList.add(info);
|
| - ++mRedirectCount;
|
| - if (maybeThrowCancelOrPause(request)) {
|
| + mResponseStep = ResponseStep.ON_REQUEST_HEADERS_SENT;
|
| + if (maybeThrowCancelOrPause(stream, mWriteStepBlock)) {
|
| return;
|
| }
|
| - request.followRedirect();
|
| + startNextWrite(stream);
|
| }
|
|
|
| @Override
|
| - public void onResponseStarted(UrlRequest request, UrlResponseInfo info) {
|
| + public void onResponseHeadersReceived(BidirectionalStream stream, UrlResponseInfo info) {
|
| assertEquals(mExecutorThread, Thread.currentThread());
|
| - assertFalse(request.isDone());
|
| + assertFalse(stream.isDone());
|
| assertTrue(mResponseStep == ResponseStep.NOTHING
|
| - || mResponseStep == ResponseStep.ON_RECEIVED_REDIRECT);
|
| + || mResponseStep == ResponseStep.ON_REQUEST_HEADERS_SENT);
|
| assertNull(mError);
|
|
|
| mResponseStep = ResponseStep.ON_RESPONSE_STARTED;
|
| mResponseInfo = info;
|
| - if (maybeThrowCancelOrPause(request)) {
|
| + if (maybeThrowCancelOrPause(stream, mReadStepBlock)) {
|
| return;
|
| }
|
| - startNextRead(request);
|
| + startNextRead(stream);
|
| }
|
|
|
| @Override
|
| - public void onReadCompleted(UrlRequest request, UrlResponseInfo info, ByteBuffer byteBuffer) {
|
| + public void onReadCompleted(
|
| + BidirectionalStream stream, UrlResponseInfo info, ByteBuffer byteBuffer) {
|
| assertEquals(mExecutorThread, Thread.currentThread());
|
| - assertFalse(request.isDone());
|
| + assertFalse(stream.isDone());
|
| assertTrue(mResponseStep == ResponseStep.ON_RESPONSE_STARTED
|
| || mResponseStep == ResponseStep.ON_READ_COMPLETED);
|
| assertNull(mError);
|
| @@ -164,35 +174,55 @@ class TestUrlRequestCallback extends UrlRequest.Callback {
|
| mResponseStep = ResponseStep.ON_READ_COMPLETED;
|
|
|
| final byte[] lastDataReceivedAsBytes;
|
| - if (mLegacyReadByteBufferAdjustment) {
|
| - // Make a slice of ByteBuffer, so can read from it without affecting
|
| - // position, which allows tests to check the state of the buffer.
|
| - ByteBuffer slice = byteBuffer.slice();
|
| - mHttpResponseDataLength += slice.remaining();
|
| - lastDataReceivedAsBytes = new byte[slice.remaining()];
|
| - slice.get(lastDataReceivedAsBytes);
|
| - } else {
|
| - final int bytesRead = byteBuffer.position() - mBufferPositionBeforeRead;
|
| - mHttpResponseDataLength += bytesRead;
|
| - lastDataReceivedAsBytes = new byte[bytesRead];
|
| - // Rewind |byteBuffer.position()| to pre-read() position.
|
| - byteBuffer.position(mBufferPositionBeforeRead);
|
| - // This restores |byteBuffer.position()| to its value on entrance to
|
| - // this function.
|
| - byteBuffer.get(lastDataReceivedAsBytes);
|
| - }
|
| + final int bytesRead = byteBuffer.position() - mBufferPositionBeforeRead;
|
| + mHttpResponseDataLength += bytesRead;
|
| + lastDataReceivedAsBytes = new byte[bytesRead];
|
| + // Rewind |byteBuffer.position()| to pre-read() position.
|
| + byteBuffer.position(mBufferPositionBeforeRead);
|
| + // This restores |byteBuffer.position()| to its value on entrance to
|
| + // this function.
|
| + byteBuffer.get(lastDataReceivedAsBytes);
|
| +
|
| mResponseAsString += new String(lastDataReceivedAsBytes);
|
|
|
| - if (maybeThrowCancelOrPause(request)) {
|
| + if (maybeThrowCancelOrPause(stream, mReadStepBlock)) {
|
| return;
|
| }
|
| - startNextRead(request);
|
| + startNextRead(stream);
|
| }
|
|
|
| @Override
|
| - public void onSucceeded(UrlRequest request, UrlResponseInfo info) {
|
| + public void onWriteCompleted(
|
| + BidirectionalStream stream, UrlResponseInfo info, ByteBuffer buffer) {
|
| assertEquals(mExecutorThread, Thread.currentThread());
|
| - assertTrue(request.isDone());
|
| + assertFalse(stream.isDone());
|
| + assertNull(mError);
|
| + if (maybeThrowCancelOrPause(stream, mWriteStepBlock)) {
|
| + return;
|
| + }
|
| + if (!mWriteBuffers.isEmpty()) {
|
| + assertEquals(buffer, mWriteBuffers.get(0));
|
| + mWriteBuffers.remove(0);
|
| + startNextWrite(stream);
|
| + }
|
| + }
|
| +
|
| + @Override
|
| + public void onResponseTrailersReceived(BidirectionalStream stream, UrlResponseInfo info,
|
| + UrlResponseInfo.HeaderBlock trailers) {
|
| + assertEquals(mExecutorThread, Thread.currentThread());
|
| + assertFalse(stream.isDone());
|
| + assertNull(mError);
|
| + mTrailers = trailers;
|
| + if (maybeThrowCancelOrPause(stream, mReadStepBlock)) {
|
| + return;
|
| + }
|
| + }
|
| +
|
| + @Override
|
| + public void onSucceeded(BidirectionalStream stream, UrlResponseInfo info) {
|
| + assertEquals(mExecutorThread, Thread.currentThread());
|
| + assertTrue(stream.isDone());
|
| assertTrue(mResponseStep == ResponseStep.ON_RESPONSE_STARTED
|
| || mResponseStep == ResponseStep.ON_READ_COMPLETED);
|
| assertFalse(mOnErrorCalled);
|
| @@ -202,13 +232,13 @@ class TestUrlRequestCallback extends UrlRequest.Callback {
|
| mResponseStep = ResponseStep.ON_SUCCEEDED;
|
| mResponseInfo = info;
|
| openDone();
|
| - maybeThrowCancelOrPause(request);
|
| + maybeThrowCancelOrPause(stream, mReadStepBlock);
|
| }
|
|
|
| @Override
|
| - public void onFailed(UrlRequest request, UrlResponseInfo info, UrlRequestException error) {
|
| + public void onFailed(BidirectionalStream stream, UrlResponseInfo info, CronetException error) {
|
| assertEquals(mExecutorThread, Thread.currentThread());
|
| - assertTrue(request.isDone());
|
| + assertTrue(stream.isDone());
|
| // Shouldn't happen after success.
|
| assertTrue(mResponseStep != ResponseStep.ON_SUCCEEDED);
|
| // Should happen at most once for a single request.
|
| @@ -219,13 +249,13 @@ class TestUrlRequestCallback extends UrlRequest.Callback {
|
| mOnErrorCalled = true;
|
| mError = error;
|
| openDone();
|
| - maybeThrowCancelOrPause(request);
|
| + maybeThrowCancelOrPause(stream, mReadStepBlock);
|
| }
|
|
|
| @Override
|
| - public void onCanceled(UrlRequest request, UrlResponseInfo info) {
|
| + public void onCanceled(BidirectionalStream stream, UrlResponseInfo info) {
|
| assertEquals(mExecutorThread, Thread.currentThread());
|
| - assertTrue(request.isDone());
|
| + assertTrue(stream.isDone());
|
| // Should happen at most once for a single request.
|
| assertFalse(mOnCanceledCalled);
|
| assertFalse(mOnErrorCalled);
|
| @@ -233,16 +263,23 @@ class TestUrlRequestCallback extends UrlRequest.Callback {
|
|
|
| mOnCanceledCalled = true;
|
| openDone();
|
| - maybeThrowCancelOrPause(request);
|
| + maybeThrowCancelOrPause(stream, mReadStepBlock);
|
| }
|
|
|
| - public void startNextRead(UrlRequest request) {
|
| - startNextRead(request, ByteBuffer.allocateDirect(READ_BUFFER_SIZE));
|
| + public void startNextRead(BidirectionalStream stream) {
|
| + startNextRead(stream, ByteBuffer.allocateDirect(READ_BUFFER_SIZE));
|
| }
|
|
|
| - public void startNextRead(UrlRequest request, ByteBuffer buffer) {
|
| + public void startNextRead(BidirectionalStream stream, ByteBuffer buffer) {
|
| mBufferPositionBeforeRead = buffer.position();
|
| - request.readNew(buffer);
|
| + stream.read(buffer);
|
| + }
|
| +
|
| + public void startNextWrite(BidirectionalStream stream) {
|
| + if (!mWriteBuffers.isEmpty()) {
|
| + boolean isLastBuffer = mWriteBuffers.size() == 1;
|
| + stream.write(mWriteBuffers.get(0), isLastBuffer);
|
| + }
|
| }
|
|
|
| public boolean isDone() {
|
| @@ -260,21 +297,22 @@ class TestUrlRequestCallback extends UrlRequest.Callback {
|
| * Returns {@code false} if the listener should continue to advance the
|
| * request.
|
| */
|
| - private boolean maybeThrowCancelOrPause(final UrlRequest request) {
|
| + private boolean maybeThrowCancelOrPause(
|
| + final BidirectionalStream stream, ConditionVariable stepBlock) {
|
| if (mResponseStep != mFailureStep || mFailureType == FailureType.NONE) {
|
| if (!mAutoAdvance) {
|
| - mStepBlock.open();
|
| + stepBlock.open();
|
| return true;
|
| }
|
| return false;
|
| }
|
|
|
| if (mFailureType == FailureType.THROW_SYNC) {
|
| - throw new IllegalStateException("Listener Exception.");
|
| + throw new IllegalStateException("Callback Exception.");
|
| }
|
| Runnable task = new Runnable() {
|
| public void run() {
|
| - request.cancel();
|
| + stream.cancel();
|
| }
|
| };
|
| if (mFailureType == FailureType.CANCEL_ASYNC
|
|
|