// 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 android.content.Context;

import org.json.JSONObject;

import org.chromium.base.Log;
import org.chromium.net.CronetTestUtil;
import org.chromium.net.ExperimentalCronetEngine;

/**
 * Provides support for tests that depend on QUIC and HTTP2 servers.
 */
class ChromiumNativeTestSupport extends ChromiumPlatformOnlyTestSupport {
    private static final String TAG = ChromiumNativeTestSupport.class.getSimpleName();

    @Override
    public TestServer createTestServer(Context context, Protocol protocol) {
        switch (protocol) {
            case QUIC:
                return new QuicTestServer(context);
            case HTTP2:
                return new Http2TestServer(context);
            case HTTP1:
                return super.createTestServer(context, protocol);
            default:
                throw new RuntimeException("Unknown server protocol: " + protocol);
        }
    }

    @Override
    public void addHostResolverRules(JSONObject experimentalOptionsJson) {
        try {
            JSONObject hostResolverParams = CronetTestUtil.generateHostResolverRules();
            experimentalOptionsJson.put("HostResolverRules", hostResolverParams);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void installMockCertVerifierForTesting(ExperimentalCronetEngine.Builder builder) {
        CronetTestUtil.setMockCertVerifierForTesting(
                builder, org.chromium.net.QuicTestServer.createMockCertVerifier());
    }

    @Override
    public void loadTestNativeLibrary() {
        System.loadLibrary("cronet_tests");
    }

    private static class QuicTestServer implements TestServer {
        private final Context mContext;

        QuicTestServer(Context context) {
            mContext = context;
        }

        @Override
        public boolean start() {
            org.chromium.net.QuicTestServer.startQuicTestServer(mContext);
            return true;
        }

        @Override
        public void shutdown() {
            org.chromium.net.QuicTestServer.shutdownQuicTestServer();
        }

        @Override
        public String getSuccessURL() {
            return org.chromium.net.QuicTestServer.getServerURL() + "/simple.txt";
        }
    }

    private static class Http2TestServer implements TestServer {
        private final Context mContext;

        Http2TestServer(Context context) {
            mContext = context;
        }

        @Override
        public boolean start() {
            try {
                return org.chromium.net.Http2TestServer.startHttp2TestServer(mContext);
            } catch (Exception e) {
                Log.e(TAG, "Exception during Http2TestServer start", e);
                return false;
            }
        }

        @Override
        public void shutdown() {
            try {
                org.chromium.net.Http2TestServer.shutdownHttp2TestServer();
            } catch (Exception e) {
                Log.e(TAG, "Exception during Http2TestServer shutdown", e);
            }
        }

        @Override
        public String getSuccessURL() {
            return org.chromium.net.Http2TestServer.getEchoMethodUrl();
        }
    }
}
