// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.net.smoke;
import static com.google.common.truth.Truth.assertThat;
import android.os.ConditionVariable;
import org.chromium.net.CronetException;
import org.chromium.net.UrlRequest;
import org.chromium.net.UrlResponseInfo;
import java.nio.ByteBuffer;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/** A simple boilerplate implementation of {@link UrlRequest.Callback} that is used by smoke tests. */
class SmokeTestRequestCallback extends UrlRequest.Callback {
private static final int READ_BUFFER_SIZE = 10000;
// An executor that is used to execute {@link UrlRequest.Callback UrlRequest callbacks}.
private ExecutorService mExecutor = Executors.newSingleThreadExecutor();
// Signals when the request is done either successfully or not.
private final ConditionVariable mDone = new ConditionVariable();
// The state of the request.
public enum State {
NotSet,
Succeeded,
Failed,
Canceled
}
// The current state of the request.
private State mState = State.NotSet;
// Response info of the finished request.
private UrlResponseInfo mResponseInfo;
// Holds an error if the request failed.
private CronetException mError;
@Override
public void onRedirectReceived(UrlRequest request, UrlResponseInfo info, String newLocationUrl)
throws Exception {
request.followRedirect();
}
@Override
public void onResponseStarted(UrlRequest request, UrlResponseInfo info) throws Exception {
request.read(ByteBuffer.allocateDirect(READ_BUFFER_SIZE));
}
@Override
public void onReadCompleted(UrlRequest request, UrlResponseInfo info, ByteBuffer byteBuffer)
throws Exception {
request.read(ByteBuffer.allocateDirect(READ_BUFFER_SIZE));
}
@Override
public void onSucceeded(UrlRequest request, UrlResponseInfo info) {
done(State.Succeeded, info);
}
@Override
public void onFailed(UrlRequest request, UrlResponseInfo info, CronetException error) {
mError = error;
done(State.Failed, info);
}
@Override
public void onCanceled(UrlRequest request, UrlResponseInfo info) {
done(State.Canceled, info);
}
/**
* Returns the request executor.
*
* @return the executor.
*/
public Executor getExecutor() {
return mExecutor;
}
/** Blocks until the request is either succeeded, failed or canceled. */
public void blockForDone() {
mDone.block();
}
/**
* Returns the final state of the request.
*
* @return the state.
*/
public State getFinalState() {
return mState;
}
/**
* Returns an error that was passed to {@link #onFailed} when the request failed.
*
* @return the error if the request failed; {@code null} otherwise.
*/
public CronetException getFailureError() {
return mError;
}
/**
* Returns {@link UrlResponseInfo} of the finished response.
*
* @return the response info. {@code null} if the request hasn't completed yet.
*/
public UrlResponseInfo getResponseInfo() {
return mResponseInfo;
}
private void done(State finalState, UrlResponseInfo responseInfo) {
assertThat(mState).isEqualTo(State.NotSet);
mResponseInfo = responseInfo;
mState = finalState;
mDone.open();
}
}