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

Commit 0092dbab authored by Richard Coles's avatar Richard Coles Committed by android-build-merger
Browse files

Merge "Fix WebViewUpdateServiceTest failures when using Thread without Looper." am: be19fe5e

am: 9c47f5c8

Change-Id: Ia5d867468080e0e48a4e5b3c08b1ee627e16cebe
parents 0d5da175 9c47f5c8
Loading
Loading
Loading
Loading
+16 −2
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.UserInfo;
import android.content.res.XmlResourceParser;
import android.database.ContentObserver;
import android.os.Build;
import android.os.RemoteException;
import android.os.UserHandle;
@@ -270,8 +271,21 @@ public class SystemImpl implements SystemInterface {
    }

    @Override
    public void setMultiprocessEnabled(boolean enabled) {
        WebViewZygote.setMultiprocessEnabled(enabled);
    public void setMultiProcessEnabledFromContext(Context context) {
        boolean enableMultiProcess = false;
        try {
            enableMultiProcess = Settings.Global.getInt(context.getContentResolver(),
                    Settings.Global.WEBVIEW_MULTIPROCESS) == 1;
        } catch (Settings.SettingNotFoundException ex) {
        }
        WebViewZygote.setMultiprocessEnabled(enableMultiProcess);
    }

    @Override
    public void registerContentObserver(Context context, ContentObserver contentObserver) {
        context.getContentResolver().registerContentObserver(
                Settings.Global.getUriFor(Settings.Global.WEBVIEW_MULTIPROCESS),
                false, contentObserver);
    }

    // flags declaring we want extra info from the package manager for webview providers
+3 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.server.webkit;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.database.ContentObserver;
import android.webkit.WebViewProviderInfo;

/**
@@ -49,5 +50,6 @@ public interface SystemInterface {
    public PackageInfo getPackageInfoForProvider(WebViewProviderInfo configInfo)
            throws NameNotFoundException;

    public void setMultiprocessEnabled(boolean enabled);
    public void setMultiProcessEnabledFromContext(Context context);
    public void registerContentObserver(Context context, ContentObserver contentObserver);
}
+3 −18
Original line number Diff line number Diff line
@@ -20,12 +20,10 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.Signature;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.UserHandle;
import android.provider.Settings;
import android.util.Base64;
import android.util.Slog;
import android.webkit.WebViewFactory;
@@ -48,7 +46,7 @@ public class WebViewUpdateServiceImpl {
    private SystemInterface mSystemInterface;
    private WebViewUpdater mWebViewUpdater;
    private SettingsObserver mSettingsObserver;
    private Context mContext;
    final private Context mContext;

    public WebViewUpdateServiceImpl(Context context, SystemInterface systemInterface) {
        mContext = context;
@@ -683,15 +681,10 @@ public class WebViewUpdateServiceImpl {
     * appropriately.
     */
    private class SettingsObserver extends ContentObserver {
        private final ContentResolver mResolver;

        SettingsObserver() {
            super(new Handler());

            mResolver = mContext.getContentResolver();
            mResolver.registerContentObserver(
                    Settings.Global.getUriFor(Settings.Global.WEBVIEW_MULTIPROCESS),
                    false, this);
            mSystemInterface.registerContentObserver(mContext, this);

            // Push the current value of the setting immediately.
            notifyZygote();
@@ -703,15 +696,7 @@ public class WebViewUpdateServiceImpl {
        }

        private void notifyZygote() {
            boolean enableMultiprocess = false;

            try {
                enableMultiprocess = Settings.Global.getInt(mResolver,
                        Settings.Global.WEBVIEW_MULTIPROCESS) == 1;
            } catch (Settings.SettingNotFoundException ex) {
            }

            mSystemInterface.setMultiprocessEnabled(enableMultiprocess);
            mSystemInterface.setMultiProcessEnabledFromContext(mContext);
        }
    }
}
+5 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.server.webkit;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.database.ContentObserver;
import android.webkit.WebViewProviderInfo;

import java.util.HashMap;
@@ -115,5 +116,8 @@ public class TestSystemImpl implements SystemInterface {
    }

    @Override
    public void setMultiprocessEnabled(boolean enabled) {}
    public void setMultiProcessEnabledFromContext(Context context) {}

    @Override
    public void registerContentObserver(Context context, ContentObserver contentObserver) {}
}
+83 −29
Original line number Diff line number Diff line
@@ -16,31 +16,42 @@

package com.android.server.webkit;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;

import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.Signature;
import android.os.Bundle;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.MediumTest;
import android.util.Base64;
import android.test.AndroidTestCase;

import android.webkit.WebViewFactory;
import android.webkit.WebViewProviderInfo;
import android.webkit.WebViewProviderResponse;

import java.util.concurrent.CountDownLatch;

import org.hamcrest.Description;

import org.junit.Test;
import org.junit.runner.RunWith;

import org.mockito.Mockito;
import org.mockito.Matchers;
import org.mockito.ArgumentMatcher;

import java.util.concurrent.CountDownLatch;


/**
 * Tests for WebViewUpdateService
 */
public class WebViewUpdateServiceTest extends AndroidTestCase {
// Use MediumTest instead of SmallTest as the implementation of WebViewUpdateService
// is intended to work on several threads and uses at least one sleep/wait-statement.
@RunWith(AndroidJUnit4.class)
@MediumTest
public class WebViewUpdateServiceTest {
    private final static String TAG = WebViewUpdateServiceTest.class.getSimpleName();

    private WebViewUpdateServiceImpl mWebViewUpdateServiceImpl;
@@ -48,11 +59,6 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {

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

    @Override
    protected void setUp() throws Exception {
        super.setUp();
    }

    /**
     * Creates a new instance.
     */
@@ -102,7 +108,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
        // Add (enabled and valid) package infos for each provider
        setEnabledAndValidPackageInfos(webviewPackages);

        mWebViewUpdateServiceImpl.prepareWebViewInSystemServer();
        runWebViewBootPreparationOnMainSync();

        Mockito.verify(mTestSystemImpl).onWebViewProviderChanged(
                Mockito.argThat(new IsPackageInfoWithName(expectedProviderName)));
@@ -188,12 +194,27 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
        assertEquals(expectedPackage, response.packageInfo.packageName);
    }

    /**
     * The WebView preparation boot phase is run on the main thread (especially on a thread with a
     * looper) so to avoid bugs where our tests fail because a looper hasn't been attached to the
     * thread running prepareWebViewInSystemServer we run it on the main thread.
     */
    private void runWebViewBootPreparationOnMainSync() {
        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
            @Override
            public void run() {
                mWebViewUpdateServiceImpl.prepareWebViewInSystemServer();
            }
        });
    }


    // ****************
    // Tests
    // ****************


    @Test
    public void testWithSinglePackage() {
        String testPackageName = "test.package.name";
        checkCertainPackageUsedAfterWebViewBootPreparation(testPackageName,
@@ -202,6 +223,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
                            true /*default available*/, false /* fallback */, null)});
    }

    @Test
    public void testDefaultPackageUsedOverNonDefault() {
        String defaultPackage = "defaultPackage";
        String nonDefaultPackage = "nonDefaultPackage";
@@ -211,6 +233,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
        checkCertainPackageUsedAfterWebViewBootPreparation(defaultPackage, packages);
    }

    @Test
    public void testSeveralRelros() {
        String singlePackage = "singlePackage";
        checkCertainPackageUsedAfterWebViewBootPreparation(
@@ -222,6 +245,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {

    // Ensure that package with valid signatures is chosen rather than package with invalid
    // signatures.
    @Test
    public void testWithSignatures() {
        String validPackage = "valid package";
        String invalidPackage = "invalid package";
@@ -247,7 +271,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
                    true /* valid */, true /* installed */, new Signature[]{validSignature}
                    , 0 /* updateTime */));

        mWebViewUpdateServiceImpl.prepareWebViewInSystemServer();
        runWebViewBootPreparationOnMainSync();


        checkPreparationPhasesForPackage(validPackage, 1 /* first preparation for this package */);
@@ -257,13 +281,14 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
        assertEquals(validPackage, validPackages[0].packageName);
    }

    @Test
    public void testFailWaitingForRelro() {
        WebViewProviderInfo[] packages = new WebViewProviderInfo[] {
            new WebViewProviderInfo("packagename", "", true, true, null)};
        setupWithPackages(packages);
        setEnabledAndValidPackageInfos(packages);

        mWebViewUpdateServiceImpl.prepareWebViewInSystemServer();
        runWebViewBootPreparationOnMainSync();

        Mockito.verify(mTestSystemImpl).onWebViewProviderChanged(
                Mockito.argThat(new IsPackageInfoWithName(packages[0].packageName)));
@@ -274,12 +299,13 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
        assertEquals(WebViewFactory.LIBLOAD_FAILED_WAITING_FOR_RELRO, response.status);
    }

    @Test
    public void testFailListingEmptyWebviewPackages() {
        WebViewProviderInfo[] packages = new WebViewProviderInfo[0];
        setupWithPackages(packages);
        setEnabledAndValidPackageInfos(packages);

        mWebViewUpdateServiceImpl.prepareWebViewInSystemServer();
        runWebViewBootPreparationOnMainSync();

        Mockito.verify(mTestSystemImpl, Mockito.never()).onWebViewProviderChanged(
                Matchers.anyObject());
@@ -288,6 +314,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
        assertEquals(WebViewFactory.LIBLOAD_FAILED_LISTING_WEBVIEW_PACKAGES, response.status);
    }

    @Test
    public void testFailListingInvalidWebviewPackage() {
        WebViewProviderInfo wpi = new WebViewProviderInfo("package", "", true, true, null);
        WebViewProviderInfo[] packages = new WebViewProviderInfo[] {wpi};
@@ -296,7 +323,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
                createPackageInfo(wpi.packageName, true /* enabled */, false /* valid */,
                    true /* installed */));

        mWebViewUpdateServiceImpl.prepareWebViewInSystemServer();
        runWebViewBootPreparationOnMainSync();

        Mockito.verify(mTestSystemImpl, Mockito.never()).onWebViewProviderChanged(
                Matchers.anyObject());
@@ -315,6 +342,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
    }

    // Test that switching provider using changeProviderAndSetting works.
    @Test
    public void testSwitchingProvider() {
        String firstPackage = "first";
        String secondPackage = "second";
@@ -324,6 +352,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
        checkSwitchingProvider(packages, firstPackage, secondPackage);
    }

    @Test
    public void testSwitchingProviderToNonDefault() {
        String defaultPackage = "defaultPackage";
        String nonDefaultPackage = "nonDefaultPackage";
@@ -344,11 +373,13 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
    }

    // Change provider during relro creation by using changeProviderAndSetting
    @Test
    public void testSwitchingProviderDuringRelroCreation() {
        checkChangingProviderDuringRelroCreation(true);
    }

    // Change provider during relro creation by enabling a provider
    @Test
    public void testChangingProviderThroughEnablingDuringRelroCreation() {
        checkChangingProviderDuringRelroCreation(false);
    }
@@ -373,7 +404,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {

        CountDownLatch countdown = new CountDownLatch(1);

        mWebViewUpdateServiceImpl.prepareWebViewInSystemServer();
        runWebViewBootPreparationOnMainSync();

        Mockito.verify(mTestSystemImpl).onWebViewProviderChanged(
                Mockito.argThat(new IsPackageInfoWithName(firstPackage)));
@@ -420,10 +451,12 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
        }
    }

    @Test
    public void testRunFallbackLogicIfEnabled() {
        checkFallbackLogicBeingRun(true);
    }

    @Test
    public void testDontRunFallbackLogicIfDisabled() {
        checkFallbackLogicBeingRun(false);
    }
@@ -439,7 +472,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
        setupWithPackages(packages, fallbackLogicEnabled);
        setEnabledAndValidPackageInfos(packages);

        mWebViewUpdateServiceImpl.prepareWebViewInSystemServer();
        runWebViewBootPreparationOnMainSync();
        // Verify that we disable the fallback package if fallback logic enabled, and don't disable
        // the fallback package if that logic is disabled
        if (fallbackLogicEnabled) {
@@ -475,6 +508,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
     * 2. Install non-fallback
     * 3. Fallback should be disabled
     */
    @Test
    public void testInstallingNonFallbackPackage() {
        String primaryPackage = "primary";
        String fallbackPackage = "fallback";
@@ -488,7 +522,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
                createPackageInfo(fallbackPackage, true /* enabled */ , true /* valid */,
                    true /* installed */));

        mWebViewUpdateServiceImpl.prepareWebViewInSystemServer();
        runWebViewBootPreparationOnMainSync();
        Mockito.verify(mTestSystemImpl, Mockito.never()).uninstallAndDisablePackageForAllUsers(
                Matchers.anyObject(), Matchers.anyObject());

@@ -509,6 +543,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
        Mockito.verify(mTestSystemImpl).killPackageDependents(Mockito.eq(fallbackPackage));
    }

    @Test
    public void testFallbackChangesEnabledState() {
        String primaryPackage = "primary";
        String fallbackPackage = "fallback";
@@ -520,7 +555,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
        setupWithPackages(packages, true /* fallbackLogicEnabled */);
        setEnabledAndValidPackageInfos(packages);

        mWebViewUpdateServiceImpl.prepareWebViewInSystemServer();
        runWebViewBootPreparationOnMainSync();

        // Verify fallback disabled at boot when primary package enabled
        Mockito.verify(mTestSystemImpl).enablePackageForUser(
@@ -558,10 +593,12 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
        checkPreparationPhasesForPackage(primaryPackage, 2);
    }

    @Test
    public void testAddUserWhenFallbackLogicEnabled() {
        checkAddingNewUser(true);
    }

    @Test
    public void testAddUserWhenFallbackLogicDisabled() {
        checkAddingNewUser(false);
    }
@@ -595,6 +632,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
     * Timing dependent test where we verify that the list of valid webview packages becoming empty
     * at a certain point doesn't crash us or break our state.
     */
    @Test
    public void testNotifyRelroDoesntCrashIfNoPackages() {
        String firstPackage = "first";
        String secondPackage = "second";
@@ -607,7 +645,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
        // Add (enabled and valid) package infos for each provider
        setEnabledAndValidPackageInfos(packages);

        mWebViewUpdateServiceImpl.prepareWebViewInSystemServer();
        runWebViewBootPreparationOnMainSync();

        Mockito.verify(mTestSystemImpl).onWebViewProviderChanged(
                Mockito.argThat(new IsPackageInfoWithName(firstPackage)));
@@ -646,6 +684,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
     * Verify that even if a user-chosen package is removed temporarily we start using it again when
     * it is added back.
     */
    @Test
    public void testTempRemovePackageDoesntSwitchProviderPermanently() {
        String firstPackage = "first";
        String secondPackage = "second";
@@ -679,6 +718,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
     * Ensure that we update the user-chosen setting across boots if the chosen package is no
     * longer installed and valid.
     */
    @Test
    public void testProviderSettingChangedDuringBootIfProviderNotAvailable() {
        String chosenPackage = "chosenPackage";
        String nonChosenPackage = "non-chosenPackage";
@@ -696,7 +736,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
        // Set user-chosen package
        mTestSystemImpl.updateUserSetting(null, chosenPackage);

        mWebViewUpdateServiceImpl.prepareWebViewInSystemServer();
        runWebViewBootPreparationOnMainSync();

        // Verify that we switch the setting to point to the current package
        Mockito.verify(mTestSystemImpl).updateUserSetting(
@@ -706,10 +746,12 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
        checkPreparationPhasesForPackage(nonChosenPackage, 1);
    }

    @Test
    public void testRecoverFailedListingWebViewPackagesSettingsChange() {
        checkRecoverAfterFailListingWebviewPackages(true);
    }

    @Test
    public void testRecoverFailedListingWebViewPackagesAddedPackage() {
        checkRecoverAfterFailListingWebviewPackages(false);
    }
@@ -756,10 +798,12 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
        checkPreparationPhasesForPackage(secondPackage, 1);
    }

    @Test
    public void testDontKillIfPackageReplaced() {
        checkDontKillIfPackageRemoved(true);
    }

    @Test
    public void testDontKillIfPackageRemoved() {
        checkDontKillIfPackageRemoved(false);
    }
@@ -793,6 +837,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
                Mockito.anyObject());
    }

    @Test
    public void testKillIfSettingChanged() {
        String firstPackage = "first";
        String secondPackage = "second";
@@ -814,6 +859,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
     * Test that we kill apps using an old provider when we change the provider setting, even if the
     * new provider is not the one we intended to change to.
     */
    @Test
    public void testKillIfChangeProviderIncorrectly() {
        String firstPackage = "first";
        String secondPackage = "second";
@@ -831,7 +877,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
        // Start with the setting pointing to the third package
        mTestSystemImpl.updateUserSetting(null, thirdPackage);

        mWebViewUpdateServiceImpl.prepareWebViewInSystemServer();
        runWebViewBootPreparationOnMainSync();
        checkPreparationPhasesForPackage(thirdPackage, 1);

        mTestSystemImpl.setPackageInfo(
@@ -849,6 +895,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {

    // Ensure that the update service uses an uninstalled package if that is the only package
    // available.
    @Test
    public void testWithSingleUninstalledPackage() {
        String testPackageName = "test.package.name";
        WebViewProviderInfo[] webviewPackages = new WebViewProviderInfo[] {
@@ -858,15 +905,17 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
        mTestSystemImpl.setPackageInfo(createPackageInfo(testPackageName, true /* enabled */,
                    true /* valid */, false /* installed */));

        mWebViewUpdateServiceImpl.prepareWebViewInSystemServer();
        runWebViewBootPreparationOnMainSync();

        checkPreparationPhasesForPackage(testPackageName, 1 /* first preparation phase */);
    }

    @Test
    public void testNonhiddenPackageUserOverHidden() {
        checkVisiblePackageUserOverNonVisible(false /* true == uninstalled, false == hidden */);
    }

    @Test
    public void testInstalledPackageUsedOverUninstalled() {
        checkVisiblePackageUserOverNonVisible(true /* true == uninstalled, false == hidden */);
    }
@@ -889,16 +938,18 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
                    true /* valid */, (testUninstalled ? false : true) /* installed */,
                    null /* signatures */, 0 /* updateTime */, (testHidden ? true : false)));

        mWebViewUpdateServiceImpl.prepareWebViewInSystemServer();
        runWebViewBootPreparationOnMainSync();

        checkPreparationPhasesForPackage(installedPackage, 1 /* first preparation phase */);
    }

    @Test
    public void testCantSwitchToHiddenPackage () {
        checkCantSwitchToNonVisiblePackage(false /* true == uninstalled, false == hidden */);
    }


    @Test
    public void testCantSwitchToUninstalledPackage () {
        checkCantSwitchToNonVisiblePackage(true /* true == uninstalled, false == hidden */);
    }
@@ -927,7 +978,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
                    null /* signatures */, 0 /* updateTime */,
                    (testHidden ? true : false) /* hidden */));

        mWebViewUpdateServiceImpl.prepareWebViewInSystemServer();
        runWebViewBootPreparationOnMainSync();

        checkPreparationPhasesForPackage(installedPackage, 1 /* first preparation phase */);

@@ -947,11 +998,13 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
                Mockito.argThat(new IsPackageInfoWithName(installedPackage)));
    }

    @Test
    public void testHiddenPackageNotPrioritizedEvenIfChosen() {
        checkNonvisiblePackageNotPrioritizedEvenIfChosen(
                false /* true == uninstalled, false == hidden */);
    }

    @Test
    public void testUninstalledPackageNotPrioritizedEvenIfChosen() {
        checkNonvisiblePackageNotPrioritizedEvenIfChosen(
                true /* true == uninstalled, false == hidden */);
@@ -979,7 +1032,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
        // Start with the setting pointing to the uninstalled package
        mTestSystemImpl.updateUserSetting(null, uninstalledPackage);

        mWebViewUpdateServiceImpl.prepareWebViewInSystemServer();
        runWebViewBootPreparationOnMainSync();

        checkPreparationPhasesForPackage(installedPackage, 1 /* first preparation phase */);
    }
@@ -988,6 +1041,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
     * Ensures that fallback becomes enabled if the primary package is uninstalled for the current
     * user.
     */
    @Test
    public void testFallbackEnabledIfPrimaryUninstalled() {
        String primaryPackage = "primary";
        String fallbackPackage = "fallback";
@@ -1002,7 +1056,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
        mTestSystemImpl.setPackageInfo(createPackageInfo(fallbackPackage, true /* enabled */,
                    true /* valid */, true /* installed */));

        mWebViewUpdateServiceImpl.prepareWebViewInSystemServer();
        runWebViewBootPreparationOnMainSync();
        // Verify that we enable the fallback package
        Mockito.verify(mTestSystemImpl).enablePackageForAllUsers(
                Mockito.anyObject(), Mockito.eq(fallbackPackage), Mockito.eq(true) /* enable */);
@@ -1010,6 +1064,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
        checkPreparationPhasesForPackage(fallbackPackage, 1 /* first preparation phase */);
    }

    @Test
    public void testPreparationRunsIffNewPackage() {
        String primaryPackage = "primary";
        String fallbackPackage = "fallback";
@@ -1025,7 +1080,7 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {
        mTestSystemImpl.setPackageInfo(createPackageInfo(fallbackPackage, true /* enabled */,
                    true /* valid */, true /* installed */));

        mWebViewUpdateServiceImpl.prepareWebViewInSystemServer();
        runWebViewBootPreparationOnMainSync();

        checkPreparationPhasesForPackage(primaryPackage, 1 /* first preparation phase */);
        Mockito.verify(mTestSystemImpl, Mockito.times(1)).enablePackageForUser(
@@ -1070,5 +1125,4 @@ public class WebViewUpdateServiceTest extends AndroidTestCase {

        checkPreparationPhasesForPackage(primaryPackage, 3 /* third preparation phase */);
    }

}