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

Commit 0645abef authored by Ziad Youssef's avatar Ziad Youssef
Browse files

Allow testing for the new WebView update service

Apply lint suggestions from ag/25355777
Allow testing the new WebViewUpdateServiceImpl2

Test:  atest com.android.server.webkit.WebViewUpdateServiceTest

Bug: 308907090

Change-Id: I284bc81e570e1507cbae4fd5527fe7b270430522
parent 2c0bae19
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 */);