diff --git a/services/core/java/com/android/server/webkit/SystemImpl.java b/services/core/java/com/android/server/webkit/SystemImpl.java index 9f0f11a1443f2..302f9f6c98ba7 100644 --- a/services/core/java/com/android/server/webkit/SystemImpl.java +++ b/services/core/java/com/android/server/webkit/SystemImpl.java @@ -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 diff --git a/services/core/java/com/android/server/webkit/SystemInterface.java b/services/core/java/com/android/server/webkit/SystemInterface.java index 7c934fc8cdf42..2d7a998722841 100644 --- a/services/core/java/com/android/server/webkit/SystemInterface.java +++ b/services/core/java/com/android/server/webkit/SystemInterface.java @@ -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); } diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java index 863408c17f29b..791fbbca385c4 100644 --- a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java +++ b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java @@ -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); } } } diff --git a/services/tests/servicestests/src/com/android/server/webkit/TestSystemImpl.java b/services/tests/servicestests/src/com/android/server/webkit/TestSystemImpl.java index 3a2a2dea66ade..afa5bac228879 100644 --- a/services/tests/servicestests/src/com/android/server/webkit/TestSystemImpl.java +++ b/services/tests/servicestests/src/com/android/server/webkit/TestSystemImpl.java @@ -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) {} } diff --git a/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java b/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java index b7370331ad0ef..82c7bdbd2d15d 100644 --- a/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java @@ -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 */); } - }