| Index: components/cronet/android/test/javatests/src/org/chromium/cronet_test_apk/TestUrlRequestListener.java
|
| diff --git a/components/cronet/android/test/javatests/src/org/chromium/cronet_test_apk/TestUrlRequestListener.java b/components/cronet/android/test/javatests/src/org/chromium/cronet_test_apk/TestUrlRequestListener.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3bcfe4f56d599afc646430cddb165e6b0d078d07
|
| --- /dev/null
|
| +++ b/components/cronet/android/test/javatests/src/org/chromium/cronet_test_apk/TestUrlRequestListener.java
|
| @@ -0,0 +1,193 @@
|
| +// Copyright 2014 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.
|
| +
|
| +package org.chromium.cronet_test_apk;
|
| +
|
| +import android.os.ConditionVariable;
|
| +
|
| +import static junit.framework.Assert.assertEquals;
|
| +import static junit.framework.Assert.assertTrue;
|
| +
|
| +import org.chromium.net.ExtendedResponseInfo;
|
| +import org.chromium.net.ResponseInfo;
|
| +import org.chromium.net.UrlRequest;
|
| +import org.chromium.net.UrlRequestException;
|
| +import org.chromium.net.UrlRequestListener;
|
| +
|
| +import java.nio.ByteBuffer;
|
| +import java.util.ArrayList;
|
| +import java.util.concurrent.Executor;
|
| +import java.util.concurrent.ExecutorService;
|
| +import java.util.concurrent.Executors;
|
| +import java.util.concurrent.ThreadFactory;
|
| +
|
| +/**
|
| + * Listener 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.
|
| + */
|
| +class TestUrlRequestListener implements UrlRequestListener {
|
| + public ArrayList<ResponseInfo> mRedirectResponseInfoList =
|
| + new ArrayList<ResponseInfo>();
|
| + public ResponseInfo mResponseInfo;
|
| + public ExtendedResponseInfo mExtendedResponseInfo;
|
| + public UrlRequestException mError;
|
| +
|
| + public ResponseStep mResponseStep = ResponseStep.NOTHING;
|
| +
|
| + public boolean mOnRedirectCalled = false;
|
| + public boolean mOnErrorCalled = false;
|
| +
|
| + public int mHttpResponseDataLength = 0;
|
| + public byte[] mLastDataReceivedAsBytes;
|
| + public String mResponseAsString = "";
|
| +
|
| + // Conditionally fail on certain steps.
|
| + private FailureType mFailureType = FailureType.NONE;
|
| + private ResponseStep mFailureStep = ResponseStep.NOTHING;
|
| +
|
| + // Signals when request is done either successfully or not.
|
| + private ConditionVariable mDone = new ConditionVariable();
|
| + private ConditionVariable mStepBlock = new ConditionVariable(true);
|
| +
|
| + // Executor for Cronet callbacks.
|
| + ExecutorService mExecutor = Executors.newSingleThreadExecutor(
|
| + new ExecutorThreadFactory());
|
| + Thread mExecutorThread;
|
| +
|
| + private class ExecutorThreadFactory implements ThreadFactory {
|
| + public Thread newThread(Runnable r) {
|
| + mExecutorThread = new Thread(r);
|
| + return mExecutorThread;
|
| + }
|
| + }
|
| +
|
| + public enum ResponseStep {
|
| + NOTHING,
|
| + ON_REDIRECT,
|
| + ON_RESPONSE_STARTED,
|
| + ON_DATA_RECEIVED,
|
| + ON_SUCCEEDED
|
| + };
|
| +
|
| + public enum FailureType {
|
| + NONE,
|
| + BLOCK,
|
| + CANCEL_SYNC,
|
| + CANCEL_ASYNC,
|
| + THROW_SYNC
|
| + };
|
| +
|
| + public TestUrlRequestListener() {
|
| + }
|
| +
|
| + public void setFailure(FailureType failureType, ResponseStep failureStep) {
|
| + mFailureStep = failureStep;
|
| + mFailureType = failureType;
|
| + if (failureType == FailureType.BLOCK) {
|
| + mStepBlock.close();
|
| + }
|
| + }
|
| +
|
| + public void blockForDone() {
|
| + mDone.block();
|
| + }
|
| +
|
| + public void openBlockedStep() {
|
| + mStepBlock.open();
|
| + }
|
| +
|
| + public Executor getExecutor() {
|
| + return mExecutor;
|
| + }
|
| +
|
| + @Override
|
| + public void onRedirect(UrlRequest request,
|
| + ResponseInfo info,
|
| + String newLocationUrl) {
|
| + assertEquals(mExecutorThread, Thread.currentThread());
|
| + assertTrue(mResponseStep == ResponseStep.NOTHING
|
| + || mResponseStep == ResponseStep.ON_REDIRECT);
|
| + mRedirectResponseInfoList.add(info);
|
| + mResponseStep = ResponseStep.ON_REDIRECT;
|
| + mOnRedirectCalled = true;
|
| + maybeThrowOrCancel(request);
|
| + }
|
| +
|
| + @Override
|
| + public void onResponseStarted(UrlRequest request, ResponseInfo info) {
|
| + assertEquals(mExecutorThread, Thread.currentThread());
|
| + assertTrue(mResponseStep == ResponseStep.NOTHING
|
| + || mResponseStep == ResponseStep.ON_REDIRECT);
|
| + mResponseStep = ResponseStep.ON_RESPONSE_STARTED;
|
| + mResponseInfo = info;
|
| + maybeThrowOrCancel(request);
|
| + }
|
| +
|
| + @Override
|
| + public void onDataReceived(UrlRequest request,
|
| + ResponseInfo info,
|
| + ByteBuffer byteBuffer) {
|
| + assertEquals(mExecutorThread, Thread.currentThread());
|
| + assertTrue(mResponseStep == ResponseStep.ON_RESPONSE_STARTED
|
| + || mResponseStep == ResponseStep.ON_DATA_RECEIVED);
|
| + mResponseStep = ResponseStep.ON_DATA_RECEIVED;
|
| +
|
| + mHttpResponseDataLength += byteBuffer.capacity();
|
| + mLastDataReceivedAsBytes = new byte[byteBuffer.capacity()];
|
| + byteBuffer.get(mLastDataReceivedAsBytes);
|
| + mResponseAsString += new String(mLastDataReceivedAsBytes);
|
| + maybeThrowOrCancel(request);
|
| + }
|
| +
|
| + @Override
|
| + public void onSucceeded(UrlRequest request, ExtendedResponseInfo info) {
|
| + assertEquals(mExecutorThread, Thread.currentThread());
|
| + assertTrue(mResponseStep == ResponseStep.ON_RESPONSE_STARTED
|
| + || mResponseStep == ResponseStep.ON_DATA_RECEIVED);
|
| + mResponseStep = ResponseStep.ON_SUCCEEDED;
|
| + mExtendedResponseInfo = info;
|
| + openDone();
|
| + maybeThrowOrCancel(request);
|
| + }
|
| +
|
| + @Override
|
| + public void onFailed(UrlRequest request,
|
| + ResponseInfo info,
|
| + UrlRequestException error) {
|
| + assertEquals(mExecutorThread, Thread.currentThread());
|
| + mOnErrorCalled = true;
|
| + mError = error;
|
| + openDone();
|
| + maybeThrowOrCancel(request);
|
| + }
|
| +
|
| + protected void openDone() {
|
| + mDone.open();
|
| + }
|
| +
|
| + private void maybeThrowOrCancel(final UrlRequest request) {
|
| + if (mResponseStep != mFailureStep) {
|
| + return;
|
| + }
|
| + if (mFailureType == FailureType.NONE) {
|
| + return;
|
| + }
|
| + if (mFailureType == FailureType.THROW_SYNC) {
|
| + throw new IllegalStateException("Listener Exception.");
|
| + }
|
| + Runnable task = new Runnable() {
|
| + public void run() {
|
| + request.cancel();
|
| + openDone();
|
| + }
|
| + };
|
| + if (mFailureType == FailureType.CANCEL_ASYNC) {
|
| + mExecutor.execute(task);
|
| + } else {
|
| + task.run();
|
| + }
|
| + }
|
| +}
|
| +
|
|
|