Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b2e1acac authored by Ziad Youssef's avatar Ziad Youssef Committed by Android (Google) Code Review
Browse files

Merge "Allow testing for the new WebView update service" into main

parents a218f4fc 0645abef
Loading
Loading
Loading
Loading
+54 −46
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.content.pm.Signature;
import android.os.AsyncTask;
import android.os.Trace;
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.Slog;
import android.webkit.UserPackage;
import android.webkit.WebViewFactory;
@@ -70,10 +71,6 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface {
        WebViewPackageMissingException(String message) {
            super(message);
        }

        WebViewPackageMissingException(Exception e) {
            super(e);
        }
    }

    private static final int WAIT_TIMEOUT_MS = 1000; // KEY_DISPATCHING_TIMEOUT is 5000.
@@ -365,9 +362,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface {
        AsyncTask.THREAD_POOL_EXECUTOR.execute(this::startZygoteWhenReady);
    }

    /**
     * Fetch only the currently valid WebView packages.
     **/
    /** Fetch only the currently valid WebView packages. */
    @Override
    public WebViewProviderInfo[] getValidWebViewPackages() {
        ProviderAndPackageInfo[] providersAndPackageInfos = getValidWebViewPackagesAndInfos();
@@ -636,9 +631,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface {
                "enableMultiProcess shouldn't be called if update_service_v2 flag is set.");
    }

    /**
     * Dump the state of this Service.
     */
    /** Dump the state of this Service. */
    @Override
    public void dumpState(PrintWriter pw) {
        pw.println("Current WebView Update Service state");
@@ -646,30 +639,38 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface {
            if (mCurrentWebViewPackage == null) {
                pw.println("  Current WebView package is null");
            } else {
                pw.println(String.format("  Current WebView package (name, version): (%s, %s)",
                pw.println(
                        TextUtils.formatSimple(
                                "  Current WebView package (name, version): (%s, %s)",
                                mCurrentWebViewPackage.packageName,
                                mCurrentWebViewPackage.versionName));
            }
            pw.println(String.format("  Minimum targetSdkVersion: %d",
                    UserPackage.MINIMUM_SUPPORTED_SDK));
            pw.println(String.format("  Minimum WebView version code: %d",
                    mMinimumVersionCode));
            pw.println(String.format("  Number of relros started: %d",
                    mNumRelroCreationsStarted));
            pw.println(String.format("  Number of relros finished: %d",
                        mNumRelroCreationsFinished));
            pw.println(String.format("  WebView package dirty: %b", mWebViewPackageDirty));
            pw.println(String.format("  Any WebView package installed: %b",
                    mAnyWebViewInstalled));
            pw.println(
                    TextUtils.formatSimple(
                            "  Minimum targetSdkVersion: %d", UserPackage.MINIMUM_SUPPORTED_SDK));
            pw.println(
                    TextUtils.formatSimple(
                            "  Minimum WebView version code: %d", mMinimumVersionCode));
            pw.println(
                    TextUtils.formatSimple(
                            "  Number of relros started: %d", mNumRelroCreationsStarted));
            pw.println(
                    TextUtils.formatSimple(
                            "  Number of relros finished: %d", mNumRelroCreationsFinished));
            pw.println(TextUtils.formatSimple("  WebView package dirty: %b", mWebViewPackageDirty));
            pw.println(
                    TextUtils.formatSimple(
                            "  Any WebView package installed: %b", mAnyWebViewInstalled));

            try {
                PackageInfo preferredWebViewPackage = findPreferredWebViewPackage();
                pw.println(String.format(
                pw.println(
                        TextUtils.formatSimple(
                                "  Preferred WebView package (name, version): (%s, %s)",
                                preferredWebViewPackage.packageName,
                                preferredWebViewPackage.versionName));
            } catch (WebViewPackageMissingException e) {
                pw.println(String.format("  Preferred WebView package: none"));
                pw.println("  Preferred WebView package: none");
            }

            dumpAllPackageInformationLocked(pw);
@@ -685,26 +686,33 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface {
            PackageInfo systemUserPackageInfo =
                    userPackages.get(UserHandle.USER_SYSTEM).getPackageInfo();
            if (systemUserPackageInfo == null) {
                pw.println(String.format("    %s is NOT installed.", provider.packageName));
                pw.println(
                        TextUtils.formatSimple("    %s is NOT installed.", provider.packageName));
                continue;
            }

            int validity = validityResult(provider, systemUserPackageInfo);
            String packageDetails = String.format(
            String packageDetails =
                    TextUtils.formatSimple(
                            "versionName: %s, versionCode: %d, targetSdkVersion: %d",
                            systemUserPackageInfo.versionName,
                            systemUserPackageInfo.getLongVersionCode(),
                            systemUserPackageInfo.applicationInfo.targetSdkVersion);
            if (validity == VALIDITY_OK) {
                boolean installedForAllUsers = isInstalledAndEnabledForAllUsers(
                        mSystemInterface.getPackageInfoForProviderAllUsers(mContext, provider));
                pw.println(String.format(
                boolean installedForAllUsers =
                        isInstalledAndEnabledForAllUsers(
                                mSystemInterface.getPackageInfoForProviderAllUsers(
                                        mContext, provider));
                pw.println(
                        TextUtils.formatSimple(
                                "    Valid package %s (%s) is %s installed/enabled for all users",
                                systemUserPackageInfo.packageName,
                                packageDetails,
                                installedForAllUsers ? "" : "NOT"));
            } else {
                pw.println(String.format("    Invalid package %s (%s), reason: %s",
                pw.println(
                        TextUtils.formatSimple(
                                "    Invalid package %s (%s), reason: %s",
                                systemUserPackageInfo.packageName,
                                packageDetails,
                                getInvalidityReason(validity)));
+21 −3
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.server.webkit;

import static android.webkit.Flags.updateServiceV2;

import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -25,6 +27,9 @@ import android.content.pm.PackageInfo;
import android.content.pm.Signature;
import android.os.Build;
import android.os.Bundle;
import android.platform.test.annotations.RequiresFlagsDisabled;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.test.suitebuilder.annotation.MediumTest;
import android.util.Base64;
import android.webkit.UserPackage;
@@ -35,6 +40,7 @@ import android.webkit.WebViewProviderResponse;
import androidx.test.InstrumentationRegistry;
import androidx.test.runner.AndroidJUnit4;

import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentMatcher;
@@ -55,11 +61,14 @@ import java.util.concurrent.CountDownLatch;
public class WebViewUpdateServiceTest {
    private final static String TAG = WebViewUpdateServiceTest.class.getSimpleName();

    private WebViewUpdateServiceImpl mWebViewUpdateServiceImpl;
    private WebViewUpdateServiceInterface mWebViewUpdateServiceImpl;
    private TestSystemImpl mTestSystemImpl;

    private static final String WEBVIEW_LIBRARY_FLAG = "com.android.webview.WebViewLibrary";

    @Rule
    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();

    /**
     * Creates a new instance.
     */
@@ -92,9 +101,14 @@ public class WebViewUpdateServiceTest {
        TestSystemImpl testing = new TestSystemImpl(packages, numRelros, isDebuggable,
                multiProcessDefault);
        mTestSystemImpl = Mockito.spy(testing);
        if (updateServiceV2()) {
            mWebViewUpdateServiceImpl =
                    new WebViewUpdateServiceImpl2(null /*Context*/, mTestSystemImpl);
        } else {
            mWebViewUpdateServiceImpl =
                    new WebViewUpdateServiceImpl(null /*Context*/, mTestSystemImpl);
        }
    }

    private void setEnabledAndValidPackageInfos(WebViewProviderInfo[] providers) {
        // Set package infos for the primary user (user 0).
@@ -1310,11 +1324,13 @@ public class WebViewUpdateServiceTest {
    }

    @Test
    @RequiresFlagsDisabled("android.webkit.update_service_v2")
    public void testMultiProcessEnabledByDefault() {
        testMultiProcessByDefault(true /* enabledByDefault */);
    }

    @Test
    @RequiresFlagsDisabled("android.webkit.update_service_v2")
    public void testMultiProcessDisabledByDefault() {
        testMultiProcessByDefault(false /* enabledByDefault */);
    }
@@ -1344,6 +1360,7 @@ public class WebViewUpdateServiceTest {
    }

    @Test
    @RequiresFlagsDisabled("android.webkit.update_service_v2")
    public void testMultiProcessEnabledByDefaultWithSettingsValue() {
        testMultiProcessByDefaultWithSettingsValue(
                true /* enabledByDefault */, Integer.MIN_VALUE, false /* expectEnabled */);
@@ -1356,6 +1373,7 @@ public class WebViewUpdateServiceTest {
    }

    @Test
    @RequiresFlagsDisabled("android.webkit.update_service_v2")
    public void testMultiProcessDisabledByDefaultWithSettingsValue() {
        testMultiProcessByDefaultWithSettingsValue(
                false /* enabledByDefault */, Integer.MIN_VALUE, false /* expectEnabled */);