chromium/base/test/android/java/src/org/chromium/base/MultiprocessTestClientServiceDelegate.java

// Copyright 2017 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.base;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.SparseArray;

import org.chromium.base.library_loader.LibraryLoader;
import org.chromium.base.library_loader.LibraryProcessType;
import org.chromium.base.process_launcher.ChildProcessServiceDelegate;
import org.chromium.native_test.MainRunner;

import java.util.List;

/** Implementation of the ChildProcessServiceDelegate used for the Multiprocess tests. */
public class MultiprocessTestClientServiceDelegate implements ChildProcessServiceDelegate {
    private static final String TAG = "MPTestCSDelegate";

    private ITestCallback mTestCallback;
    private IBinder mBinderBox;

    private final ITestController.Stub mTestController =
            new ITestController.Stub() {
                @Override
                public boolean forceStopSynchronous(int exitCode) {
                    System.exit(exitCode);
                    return true;
                }

                @Override
                public void forceStop(int exitCode) {
                    System.exit(exitCode);
                }
            };

    @Override
    public void onServiceCreated() {
        LibraryLoader.getInstance().setLibraryProcessType(LibraryProcessType.PROCESS_CHILD);
        PathUtils.setPrivateDataDirectorySuffix("chrome_multiprocess_test_client_service");
    }

    @Override
    public void onServiceBound(Intent intent) {}

    @Override
    public void onConnectionSetup(
            Bundle connectionBundle, List<IBinder> callbacks, IBinder binderBox) {
        mTestCallback = ITestCallback.Stub.asInterface(callbacks.get(0));
        mBinderBox = binderBox;
    }

    @Override
    public void preloadNativeLibrary(String packageName) {
        LibraryLoader.getInstance().preloadNow();
    }

    @Override
    public void loadNativeLibrary(Context hostContext) {
        LibraryLoader.getInstance().loadNow();
    }

    @Override
    public SparseArray<String> getFileDescriptorsIdsToKeys() {
        return null;
    }

    @Override
    public void onBeforeMain() {
        try {
            mTestCallback.childConnected(mTestController);
        } catch (RemoteException re) {
            Log.e(TAG, "Failed to notify parent process of connection.");
        }
    }

    @Override
    public void runMain() {
        int result = MainRunner.runMain(CommandLine.getJavaSwitchesForTesting(), mBinderBox);
        try {
            mTestCallback.mainReturned(result);
        } catch (RemoteException re) {
            Log.e(TAG, "Failed to notify parent process of main returning.");
        }
    }

    @Override
    public void consumeRelroBundle(Bundle bundle) {}
}