chromium/components/cronet/android/test/src/org/chromium/net/MockUrlRequestJobFactory.java

// Copyright 2014 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;

import static com.google.common.truth.Truth.assertThat;

import org.jni_zero.JNINamespace;
import org.jni_zero.NativeMethods;

import org.chromium.net.impl.CronetUrlRequestContext;
import org.chromium.net.test.FailurePhase;

/** Helper class to set up url interceptors for testing purposes. */
@JNINamespace("cronet")
public final class MockUrlRequestJobFactory {
    private final long mInterceptorHandle;
    private final CronetTestUtil.NetworkThreadTestConnector mNetworkThreadTestConnector;

    /** Sets up URL interceptors. */
    public MockUrlRequestJobFactory(CronetEngine cronetEngine) {
        mNetworkThreadTestConnector = new CronetTestUtil.NetworkThreadTestConnector(cronetEngine);

        mInterceptorHandle =
                MockUrlRequestJobFactoryJni.get()
                        .addUrlInterceptors(
                                ((CronetUrlRequestContext) cronetEngine)
                                        .getUrlRequestContextAdapter());
    }

    /** Remove URL Interceptors. */
    public void shutdown() {
        MockUrlRequestJobFactoryJni.get().removeUrlInterceptorJobFactory(mInterceptorHandle);
        mNetworkThreadTestConnector.shutdown();
    }

    /**
     * Constructs a mock URL that hangs or fails at certain phase.
     *
     * @param phase at which request fails. It should be a value in
     *              org.chromium.net.test.FailurePhase.
     * @param netError reported by UrlRequestJob. Passing -1, results in hang.
     */
    public static String getMockUrlWithFailure(int phase, int netError) {
        assertThat(netError).isLessThan(0);
        switch (phase) {
            case FailurePhase.START:
            case FailurePhase.READ_SYNC:
            case FailurePhase.READ_ASYNC:
                break;
            default:
                throw new IllegalArgumentException(
                        "phase not in org.chromium.net.test.FailurePhase");
        }
        return MockUrlRequestJobFactoryJni.get().getMockUrlWithFailure(phase, netError);
    }

    /**
     * Constructs a mock URL that synchronously responds with data repeated many
     * times.
     *
     * @param data to return in response.
     * @param dataRepeatCount number of times to repeat the data.
     */
    public static String getMockUrlForData(String data, int dataRepeatCount) {
        return MockUrlRequestJobFactoryJni.get().getMockUrlForData(data, dataRepeatCount);
    }

    /**
     * Constructs a mock URL that will request client certificate and return
     * the string "data" as the response.
     */
    public static String getMockUrlForClientCertificateRequest() {
        return MockUrlRequestJobFactoryJni.get().getMockUrlForClientCertificateRequest();
    }

    /** Constructs a mock URL that will fail with an SSL certificate error. */
    public static String getMockUrlForSSLCertificateError() {
        return MockUrlRequestJobFactoryJni.get().getMockUrlForSSLCertificateError();
    }

    /** Constructs a mock URL that will hang when try to read response body from the remote. */
    public static String getMockUrlForHangingRead() {
        return MockUrlRequestJobFactoryJni.get().getMockUrlForHangingRead();
    }

    @NativeMethods("cronet_tests")
    interface Natives {
        long addUrlInterceptors(long requestContextAdapter);

        void removeUrlInterceptorJobFactory(long interceptorHandle);

        String getMockUrlWithFailure(int phase, int netError);

        String getMockUrlForData(String data, int dataRepeatCount);

        String getMockUrlForClientCertificateRequest();

        String getMockUrlForSSLCertificateError();

        String getMockUrlForHangingRead();
    }
}