diff options
7 files changed, 273 insertions, 168 deletions
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index e62ec7ac41aa..3acdc8e3aeb9 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -27,7 +27,6 @@ import android.app.job.JobParameters; import android.app.job.JobScheduler; import android.app.job.JobService; import android.content.ComponentName; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; @@ -38,8 +37,6 @@ import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.os.Trace; import android.os.UserHandle; -import android.provider.Settings; -import android.text.TextUtils; import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; @@ -82,11 +79,11 @@ public class BackupManagerService { return sInstance; } - /** Helper to create the {@link BackupManagerService} instance. */ - public static BackupManagerService create( - Context context, - Trampoline parent, - HandlerThread backupThread) { + private UserBackupManagerService mUserBackupManagerService; + + /** Instantiate a new instance of {@link BackupManagerService}. */ + public BackupManagerService( + Context context, Trampoline trampoline, HandlerThread backupThread) { // Set up our transport options and initialize the default transport SystemConfig systemConfig = SystemConfig.getInstance(); Set<ComponentName> transportWhitelist = systemConfig.getBackupTransportWhitelist(); @@ -94,50 +91,9 @@ public class BackupManagerService { transportWhitelist = Collections.emptySet(); } - String transport = - Settings.Secure.getString( - context.getContentResolver(), Settings.Secure.BACKUP_TRANSPORT); - if (TextUtils.isEmpty(transport)) { - transport = null; - } - if (DEBUG) { - Slog.v(TAG, "Starting with transport " + transport); - } - TransportManager transportManager = - new TransportManager( - context, - transportWhitelist, - transport); - - // If encrypted file systems is enabled or disabled, this call will return the - // correct directory. - File baseStateDir = new File(Environment.getDataDirectory(), "backup"); - - // This dir on /cache is managed directly in init.rc - File dataDir = new File(Environment.getDownloadCacheDirectory(), "backup_stage"); - - return new BackupManagerService( - context, - parent, - backupThread, - baseStateDir, - dataDir, - transportManager); - } - - private UserBackupManagerService mUserBackupManagerService; - - /** Instantiate a new instance of {@link BackupManagerService}. */ - public BackupManagerService( - Context context, - Trampoline trampoline, - HandlerThread backupThread, - File baseStateDir, - File dataDir, - TransportManager transportManager) { mUserBackupManagerService = - new UserBackupManagerService( - context, trampoline, backupThread, baseStateDir, dataDir, transportManager); + UserBackupManagerService.createAndInitializeService( + context, trampoline, backupThread, transportWhitelist); } // TODO(b/118520567): Remove when tests are modified to use per-user instance. @@ -151,30 +107,6 @@ public class BackupManagerService { * a background thread to keep the unlock time down. */ public void unlockSystemUser() { - // Migrate legacy setting - Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "backup migrate"); - if (!backupSettingMigrated(UserHandle.USER_SYSTEM)) { - if (DEBUG) { - Slog.i(TAG, "Backup enable apparently not migrated"); - } - ContentResolver resolver = sInstance.getContext().getContentResolver(); - int enableState = Settings.Secure.getIntForUser(resolver, - Settings.Secure.BACKUP_ENABLED, -1, UserHandle.USER_SYSTEM); - if (enableState >= 0) { - if (DEBUG) { - Slog.i(TAG, "Migrating enable state " + (enableState != 0)); - } - writeBackupEnableState(enableState != 0, UserHandle.USER_SYSTEM); - Settings.Secure.putStringForUser(resolver, - Settings.Secure.BACKUP_ENABLED, null, UserHandle.USER_SYSTEM); - } else { - if (DEBUG) { - Slog.i(TAG, "Backup not yet configured; retaining null enable state"); - } - } - } - Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); - Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "backup enable"); try { sInstance.setBackupEnabled(readBackupEnableState(UserHandle.USER_SYSTEM)); @@ -572,12 +504,6 @@ public class BackupManagerService { mUserBackupManagerService.dump(fd, pw, args); } - private static boolean backupSettingMigrated(int userId) { - File base = new File(Environment.getDataDirectory(), "backup"); - File enableFile = new File(base, BACKUP_ENABLE_FILE); - return enableFile.exists(); - } - private static boolean readBackupEnableState(int userId) { File base = new File(Environment.getDataDirectory(), "backup"); File enableFile = new File(base, BACKUP_ENABLE_FILE); @@ -607,14 +533,8 @@ public class BackupManagerService { stage.renameTo(enableFile); // will be synced immediately by the try-with-resources call to close() } catch (IOException | RuntimeException e) { - // Whoops; looks like we're doomed. Roll everything out, disabled, - // including the legacy state. Slog.e(TAG, "Unable to record backup enable state; reverting to disabled: " + e.getMessage()); - - ContentResolver resolver = sInstance.getContext().getContentResolver(); - Settings.Secure.putStringForUser(resolver, - Settings.Secure.BACKUP_ENABLED, null, userId); enableFile.delete(); stage.delete(); } diff --git a/services/backup/java/com/android/server/backup/Trampoline.java b/services/backup/java/com/android/server/backup/Trampoline.java index 9ca2070c7bab..108f50d922f8 100644 --- a/services/backup/java/com/android/server/backup/Trampoline.java +++ b/services/backup/java/com/android/server/backup/Trampoline.java @@ -137,7 +137,7 @@ public class Trampoline extends IBackupManager.Stub { } protected BackupManagerService createBackupManagerService() { - return BackupManagerService.create(mContext, this, mHandlerThread); + return new BackupManagerService(mContext, this, mHandlerThread); } /** diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java index fe16afe864ac..5220a590ddda 100644 --- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java +++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java @@ -18,6 +18,7 @@ package com.android.server.backup; import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_BACKUP_IN_FOREGROUND; +import static com.android.internal.util.Preconditions.checkNotNull; import static com.android.server.backup.BackupManagerService.DEBUG; import static com.android.server.backup.BackupManagerService.DEBUG_SCHEDULING; import static com.android.server.backup.BackupManagerService.MORE_DEBUG; @@ -68,6 +69,7 @@ import android.database.ContentObserver; import android.net.Uri; import android.os.Binder; import android.os.Bundle; +import android.os.Environment; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; @@ -86,6 +88,7 @@ import android.os.WorkSource; import android.os.storage.IStorageManager; import android.os.storage.StorageManager; import android.provider.Settings; +import android.text.TextUtils; import android.util.ArraySet; import android.util.AtomicFile; import android.util.EventLog; @@ -167,6 +170,10 @@ public class UserBackupManagerService { // Persistently track the need to do a full init. private static final String INIT_SENTINEL_FILE_NAME = "_need_init_"; + // Name of the directories the service stores bookkeeping data under. + private static final String BACKUP_PERSISTENT_DIR = "backup"; + private static final String BACKUP_STAGING_DIR = "backup_stage"; + // System-private key used for backing up an app's widget state. Must // begin with U+FFxx by convention (we reserve all keys starting // with U+FF00 or higher for system use). @@ -360,15 +367,71 @@ public class UserBackupManagerService { private long mAncestralToken = 0; private long mCurrentToken = 0; + /** + * Creates an instance of {@link UserBackupManagerService} and initializes state for it. This + * includes setting up the directories where we keep our bookkeeping and transport management. + * + * @see #createAndInitializeService(Context, Trampoline, HandlerThread, File, File, + * TransportManager) + */ + static UserBackupManagerService createAndInitializeService( + Context context, + Trampoline trampoline, + HandlerThread backupThread, + Set<ComponentName> transportWhitelist) { + String currentTransport = + Settings.Secure.getString( + context.getContentResolver(), Settings.Secure.BACKUP_TRANSPORT); + if (TextUtils.isEmpty(currentTransport)) { + currentTransport = null; + } + + if (DEBUG) { + Slog.v(TAG, "Starting with transport " + currentTransport); + } + TransportManager transportManager = + new TransportManager(context, transportWhitelist, currentTransport); + + File baseStateDir = new File(Environment.getDataDirectory(), BACKUP_PERSISTENT_DIR); + + // This dir on /cache is managed directly in init.rc + File dataDir = new File(Environment.getDownloadCacheDirectory(), BACKUP_STAGING_DIR); + + return createAndInitializeService( + context, trampoline, backupThread, baseStateDir, dataDir, transportManager); + } + + /** + * Creates an instance of {@link UserBackupManagerService}. + * + * @param context The system server context. + * @param trampoline A reference to the proxy to {@link BackupManagerService}. + * @param backupThread The thread running backup/restore operations for the user. + * @param baseStateDir The directory we store the user's persistent bookkeeping data. + * @param dataDir The directory we store the user's temporary staging data. + * @param transportManager The {@link TransportManager} responsible for handling the user's + * transports. + */ @VisibleForTesting - public UserBackupManagerService( + public static UserBackupManagerService createAndInitializeService( + Context context, + Trampoline trampoline, + HandlerThread backupThread, + File baseStateDir, + File dataDir, + TransportManager transportManager) { + return new UserBackupManagerService( + context, trampoline, backupThread, baseStateDir, dataDir, transportManager); + } + + private UserBackupManagerService( Context context, Trampoline parent, HandlerThread backupThread, File baseStateDir, File dataDir, TransportManager transportManager) { - mContext = context; + mContext = checkNotNull(context, "context cannot be null"); mPackageManager = context.getPackageManager(); mPackageManagerBinder = AppGlobals.getPackageManager(); mActivityManager = ActivityManager.getService(); @@ -377,6 +440,7 @@ public class UserBackupManagerService { mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); mStorageManager = IStorageManager.Stub.asInterface(ServiceManager.getService("mount")); + checkNotNull(parent, "trampoline cannot be null"); mBackupManagerBinder = Trampoline.asInterface(parent.asBinder()); mAgentTimeoutParameters = new @@ -384,6 +448,7 @@ public class UserBackupManagerService { mAgentTimeoutParameters.start(); // spin up the backup/restore handler thread + checkNotNull(backupThread, "backupThread cannot be null"); mBackupHandler = new BackupHandler(this, backupThread.getLooper()); // Set up our bookkeeping @@ -398,13 +463,13 @@ public class UserBackupManagerService { Settings.Global.getUriFor(Settings.Global.DEVICE_PROVISIONED), false, mProvisionedObserver); - mBaseStateDir = baseStateDir; + mBaseStateDir = checkNotNull(baseStateDir, "baseStateDir cannot be null"); mBaseStateDir.mkdirs(); if (!SELinux.restorecon(mBaseStateDir)) { Slog.e(TAG, "SELinux restorecon failed on " + mBaseStateDir); } - mDataDir = dataDir; + mDataDir = checkNotNull(dataDir, "dataDir cannot be null"); mBackupPasswordManager = new BackupPasswordManager(mContext, mBaseStateDir, mRng); @@ -451,7 +516,7 @@ public class UserBackupManagerService { addPackageParticipantsLocked(null); } - mTransportManager = transportManager; + mTransportManager = checkNotNull(transportManager, "transportManager cannot be null"); mTransportManager.setOnTransportRegisteredListener(this::onTransportRegistered); mRegisterTransportsRequestedTime = SystemClock.elapsedRealtime(); mBackupHandler.postDelayed( @@ -465,7 +530,6 @@ public class UserBackupManagerService { mWakelock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*backup*"); } - public BackupManagerConstants getConstants() { return mConstants; } diff --git a/services/robotests/src/com/android/server/backup/BackupManagerServiceTest.java b/services/robotests/src/com/android/server/backup/BackupManagerServiceTest.java index ba4caf44024b..b01adc97eeae 100644 --- a/services/robotests/src/com/android/server/backup/BackupManagerServiceTest.java +++ b/services/robotests/src/com/android/server/backup/BackupManagerServiceTest.java @@ -57,7 +57,6 @@ public class BackupManagerServiceTest { private static final String TEST_TRANSPORT = "transport"; @Mock private UserBackupManagerService mUserBackupManagerService; - @Mock private TransportManager mTransportManager; private BackupManagerService mBackupManagerService; private Context mContext; @@ -72,10 +71,7 @@ public class BackupManagerServiceTest { new BackupManagerService( application, new Trampoline(application), - BackupManagerServiceTestUtils.startBackupThread(null), - new File(application.getCacheDir(), "base_state"), - new File(application.getCacheDir(), "data"), - mTransportManager); + BackupManagerServiceTestUtils.startBackupThread(null)); mBackupManagerService.setUserBackupManagerService(mUserBackupManagerService); } diff --git a/services/robotests/src/com/android/server/backup/UserBackupManagerServiceTest.java b/services/robotests/src/com/android/server/backup/UserBackupManagerServiceTest.java index 9d4381914608..efbcb960c1e9 100644 --- a/services/robotests/src/com/android/server/backup/UserBackupManagerServiceTest.java +++ b/services/robotests/src/com/android/server/backup/UserBackupManagerServiceTest.java @@ -148,7 +148,7 @@ public class UserBackupManagerServiceTest { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); when(mTransportManager.getTransportCurrentDestinationString(eq(mTransportName))) .thenReturn("destinationString"); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); String destination = backupManagerService.getDestinationString(mTransportName); @@ -164,7 +164,7 @@ public class UserBackupManagerServiceTest { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); when(mTransportManager.getTransportCurrentDestinationString(eq(mTransportName))) .thenThrow(TransportNotRegisteredException.class); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); String destination = backupManagerService.getDestinationString(mTransportName); @@ -180,7 +180,7 @@ public class UserBackupManagerServiceTest { mShadowContext.denyPermissions(android.Manifest.permission.BACKUP); when(mTransportManager.getTransportCurrentDestinationString(eq(mTransportName))) .thenThrow(TransportNotRegisteredException.class); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); expectThrows( SecurityException.class, @@ -195,7 +195,7 @@ public class UserBackupManagerServiceTest { public void testIsAppEligibleForBackup_whenAppNotEligible() throws Exception { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); setUpCurrentTransport(mTransportManager, mTransport); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); boolean result = backupManagerService.isAppEligibleForBackup(PACKAGE_1); @@ -211,7 +211,7 @@ public class UserBackupManagerServiceTest { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); TransportMock transportMock = setUpCurrentTransport(mTransportManager, backupTransport()); ShadowAppBackupUtils.setAppRunningAndEligibleForBackupWithTransport(PACKAGE_1); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); boolean result = backupManagerService.isAppEligibleForBackup(PACKAGE_1); @@ -229,7 +229,7 @@ public class UserBackupManagerServiceTest { mShadowContext.denyPermissions(android.Manifest.permission.BACKUP); setUpCurrentTransport(mTransportManager, mTransport); ShadowAppBackupUtils.setAppRunningAndEligibleForBackupWithTransport(PACKAGE_1); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); expectThrows( SecurityException.class, @@ -246,7 +246,7 @@ public class UserBackupManagerServiceTest { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); TransportMock transportMock = setUpCurrentTransport(mTransportManager, mTransport); ShadowAppBackupUtils.setAppRunningAndEligibleForBackupWithTransport(PACKAGE_1); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); String[] filtered = backupManagerService.filterAppsEligibleForBackup( @@ -264,7 +264,7 @@ public class UserBackupManagerServiceTest { @Test public void testFilterAppsEligibleForBackup_whenNoneIsEligible() throws Exception { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); String[] filtered = backupManagerService.filterAppsEligibleForBackup( @@ -281,7 +281,7 @@ public class UserBackupManagerServiceTest { public void testFilterAppsEligibleForBackup_withoutPermission() throws Exception { mShadowContext.denyPermissions(android.Manifest.permission.BACKUP); setUpCurrentTransport(mTransportManager, mTransport); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); expectThrows( SecurityException.class, @@ -319,7 +319,7 @@ public class UserBackupManagerServiceTest { public void testSelectBackupTransport() throws Exception { setUpForSelectTransport(); mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); String oldTransport = backupManagerService.selectBackupTransport(mNewTransport.transportName); @@ -338,7 +338,7 @@ public class UserBackupManagerServiceTest { public void testSelectBackupTransport_withoutPermission() throws Exception { setUpForSelectTransport(); mShadowContext.denyPermissions(android.Manifest.permission.BACKUP); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); expectThrows( SecurityException.class, @@ -356,7 +356,7 @@ public class UserBackupManagerServiceTest { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); when(mTransportManager.registerAndSelectTransport(eq(mNewTransportComponent))) .thenReturn(BackupManager.SUCCESS); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); ISelectBackupTransportCallback callback = mock(ISelectBackupTransportCallback.class); backupManagerService.selectBackupTransportAsync(mNewTransportComponent, callback); @@ -380,7 +380,7 @@ public class UserBackupManagerServiceTest { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); when(mTransportManager.registerAndSelectTransport(eq(mNewTransportComponent))) .thenReturn(BackupManager.ERROR_TRANSPORT_UNAVAILABLE); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); ISelectBackupTransportCallback callback = mock(ISelectBackupTransportCallback.class); backupManagerService.selectBackupTransportAsync(mNewTransportComponent, callback); @@ -402,7 +402,7 @@ public class UserBackupManagerServiceTest { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); when(mTransportManager.registerAndSelectTransport(eq(newTransportComponent))) .thenReturn(BackupManager.SUCCESS); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); ISelectBackupTransportCallback callback = mock(ISelectBackupTransportCallback.class); backupManagerService.selectBackupTransportAsync(newTransportComponent, callback); @@ -421,7 +421,7 @@ public class UserBackupManagerServiceTest { public void testSelectBackupTransportAsync_withoutPermission() throws Exception { setUpForSelectTransport(); mShadowContext.denyPermissions(android.Manifest.permission.BACKUP); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); ComponentName newTransportComponent = mNewTransport.getTransportComponent(); expectThrows( @@ -445,7 +445,7 @@ public class UserBackupManagerServiceTest { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); when(mTransportManager.getCurrentTransportComponent()) .thenReturn(mTransport.getTransportComponent()); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); ComponentName transportComponent = backupManagerService.getCurrentTransportComponent(); @@ -460,7 +460,7 @@ public class UserBackupManagerServiceTest { public void testGetCurrentTransportComponent_whenNoTransportSelected() throws Exception { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); when(mTransportManager.getCurrentTransportComponent()).thenReturn(null); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); ComponentName transportComponent = backupManagerService.getCurrentTransportComponent(); @@ -476,7 +476,7 @@ public class UserBackupManagerServiceTest { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); when(mTransportManager.getCurrentTransportComponent()) .thenThrow(TransportNotRegisteredException.class); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); ComponentName transportComponent = backupManagerService.getCurrentTransportComponent(); @@ -490,7 +490,7 @@ public class UserBackupManagerServiceTest { @Test public void testGetCurrentTransportComponent_withoutPermission() throws Exception { mShadowContext.denyPermissions(android.Manifest.permission.BACKUP); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); expectThrows(SecurityException.class, backupManagerService::getCurrentTransportComponent); } @@ -525,7 +525,7 @@ public class UserBackupManagerServiceTest { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); Intent configurationIntent = new Intent(); Intent dataManagementIntent = new Intent(); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); backupManagerService.updateTransportAttributes( mTransportUid, @@ -556,7 +556,7 @@ public class UserBackupManagerServiceTest { throws Exception { setUpForUpdateTransportAttributes(); mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); expectThrows( SecurityException.class, @@ -581,7 +581,7 @@ public class UserBackupManagerServiceTest { throws Exception { setUpForUpdateTransportAttributes(); mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); expectThrows( RuntimeException.class, @@ -605,7 +605,7 @@ public class UserBackupManagerServiceTest { public void testUpdateTransportAttributes_whenNameNull_throwsException() throws Exception { setUpForUpdateTransportAttributes(); mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); expectThrows( RuntimeException.class, @@ -630,7 +630,7 @@ public class UserBackupManagerServiceTest { throws Exception { setUpForUpdateTransportAttributes(); mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); expectThrows( RuntimeException.class, @@ -657,7 +657,7 @@ public class UserBackupManagerServiceTest { throws Exception { setUpForUpdateTransportAttributes(); mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); expectThrows( RuntimeException.class, @@ -696,7 +696,7 @@ public class UserBackupManagerServiceTest { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); Intent configurationIntent = new Intent(); Intent dataManagementIntent = new Intent(); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); backupManagerService.updateTransportAttributes( mTransportUid, @@ -727,7 +727,7 @@ public class UserBackupManagerServiceTest { throws Exception { setUpForUpdateTransportAttributes(); mShadowContext.denyPermissions(android.Manifest.permission.BACKUP); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); expectThrows( SecurityException.class, @@ -766,7 +766,7 @@ public class UserBackupManagerServiceTest { @Test public void testRequestBackup_whenPermissionDenied() throws Exception { mShadowContext.denyPermissions(android.Manifest.permission.BACKUP); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); expectThrows( SecurityException.class, @@ -780,7 +780,7 @@ public class UserBackupManagerServiceTest { @Test public void testRequestBackup_whenPackagesNull() throws Exception { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); expectThrows( IllegalArgumentException.class, @@ -796,7 +796,7 @@ public class UserBackupManagerServiceTest { @Test public void testRequestBackup_whenPackagesEmpty() throws Exception { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); expectThrows( IllegalArgumentException.class, @@ -811,7 +811,7 @@ public class UserBackupManagerServiceTest { @Test public void testRequestBackup_whenBackupDisabled() throws Exception { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); backupManagerService.setEnabled(false); int result = backupManagerService.requestBackup(new String[] {PACKAGE_1}, mObserver, 0); @@ -828,7 +828,7 @@ public class UserBackupManagerServiceTest { @Test public void testRequestBackup_whenNotProvisioned() throws Exception { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); backupManagerService.setProvisioned(false); int result = backupManagerService.requestBackup(new String[] {PACKAGE_1}, mObserver, 0); @@ -846,7 +846,7 @@ public class UserBackupManagerServiceTest { public void testRequestBackup_whenTransportNotRegistered() throws Exception { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); setUpCurrentTransport(mTransportManager, mTransport.unregistered()); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); backupManagerService.setEnabled(true); backupManagerService.setProvisioned(true); @@ -866,7 +866,7 @@ public class UserBackupManagerServiceTest { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); mShadowPackageManager.addPackage(PACKAGE_1); setUpCurrentTransport(mTransportManager, mTransport); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); backupManagerService.setEnabled(true); backupManagerService.setProvisioned(true); // Haven't set PACKAGE_1 as eligible @@ -934,7 +934,7 @@ public class UserBackupManagerServiceTest { @Config(shadows = {ShadowBinder.class, ShadowKeyValueBackupJob.class}) public void testBackupNow_clearsCallingIdentityForJobScheduler() { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); setUpPowerManager(backupManagerService); ShadowBinder.setCallingUid(1); @@ -952,7 +952,7 @@ public class UserBackupManagerServiceTest { @Config(shadows = {ShadowBinder.class, ShadowKeyValueBackupJobException.class}) public void testBackupNow_whenExceptionThrown_restoresCallingIdentity() { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); setUpPowerManager(backupManagerService); ShadowBinder.setCallingUid(1); @@ -963,54 +963,170 @@ public class UserBackupManagerServiceTest { } private UserBackupManagerService createBackupManagerServiceForRequestBackup() { - UserBackupManagerService backupManagerService = createInitializedBackupManagerService(); + UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); backupManagerService.setEnabled(true); backupManagerService.setProvisioned(true); return backupManagerService; } /** - * Test verifying that {@link UserBackupManagerService#UserBackupManagerService(Context, + * Test verifying that {@link UserBackupManagerService#createAndInitializeService(Context, * Trampoline, HandlerThread, File, File, TransportManager)} posts a transport registration task - * to the backup handler thread. + * to the backup thread. */ @Test - public void testConstructor_postRegisterTransports() { + public void testCreateAndInitializeService_postRegisterTransports() { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); - createBackupManagerService(); + UserBackupManagerService.createAndInitializeService( + mContext, + new Trampoline(mContext), + mBackupThread, + mBaseStateDir, + mDataDir, + mTransportManager); mShadowBackupLooper.runToEndOfTasks(); verify(mTransportManager).registerTransports(); } /** - * Test verifying that the {@link UserBackupManagerService#UserBackupManagerService(Context, + * Test verifying that {@link UserBackupManagerService#createAndInitializeService(Context, * Trampoline, HandlerThread, File, File, TransportManager)} does not directly register - * transports in its own thread. + * transports on the main thread. */ @Test - public void testConstructor_doesNotRegisterTransportsSynchronously() { + public void testCreateAndInitializeService_doesNotRegisterTransportsSynchronously() { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); - createBackupManagerService(); - - // Operations posted to mBackupThread only run with mShadowBackupLooper.runToEndOfTasks() - verify(mTransportManager, never()).registerTransports(); - } - - private UserBackupManagerService createBackupManagerService() { - return new UserBackupManagerService( + UserBackupManagerService.createAndInitializeService( mContext, new Trampoline(mContext), mBackupThread, mBaseStateDir, mDataDir, mTransportManager); + + // Operations posted to mBackupThread only run with mShadowBackupLooper.runToEndOfTasks() + verify(mTransportManager, never()).registerTransports(); + } + + /** + * Test checking non-null argument on {@link + * UserBackupManagerService#createAndInitializeService(Context, Trampoline, HandlerThread, File, + * File, TransportManager)}. + */ + @Test + public void testCreateAndInitializeService_withNullContext_throws() { + expectThrows( + NullPointerException.class, + () -> + UserBackupManagerService.createAndInitializeService( + /* context */ null, + new Trampoline(mContext), + mBackupThread, + mBaseStateDir, + mDataDir, + mTransportManager)); + } + + /** + * Test checking non-null argument on {@link + * UserBackupManagerService#createAndInitializeService(Context, Trampoline, HandlerThread, File, + * File, TransportManager)}. + */ + @Test + public void testCreateAndInitializeService_withNullTrampoline_throws() { + expectThrows( + NullPointerException.class, + () -> + UserBackupManagerService.createAndInitializeService( + mContext, + /* trampoline */ null, + mBackupThread, + mBaseStateDir, + mDataDir, + mTransportManager)); + } + + /** + * Test checking non-null argument on {@link + * UserBackupManagerService#createAndInitializeService(Context, Trampoline, HandlerThread, File, + * File, TransportManager)}. + */ + @Test + public void testCreateAndInitializeService_withNullBackupThread_throws() { + expectThrows( + NullPointerException.class, + () -> + UserBackupManagerService.createAndInitializeService( + mContext, + new Trampoline(mContext), + /* backupThread */ null, + mBaseStateDir, + mDataDir, + mTransportManager)); + } + + /** + * Test checking non-null argument on {@link + * UserBackupManagerService#createAndInitializeService(Context, Trampoline, HandlerThread, File, + * File, TransportManager)}. + */ + @Test + public void testCreateAndInitializeService_withNullStateDir_throws() { + expectThrows( + NullPointerException.class, + () -> + UserBackupManagerService.createAndInitializeService( + mContext, + new Trampoline(mContext), + mBackupThread, + /* baseStateDir */ null, + mDataDir, + mTransportManager)); + } + + /** + * Test checking non-null argument on {@link + * UserBackupManagerService#createAndInitializeService(Context, Trampoline, HandlerThread, File, + * File, TransportManager)}. + */ + @Test + public void testCreateAndInitializeService_withNullDataDir_throws() { + expectThrows( + NullPointerException.class, + () -> + UserBackupManagerService.createAndInitializeService( + mContext, + new Trampoline(mContext), + mBackupThread, + mBaseStateDir, + /* dataDir */ null, + mTransportManager)); + } + + /** + * Test checking non-null argument on {@link + * UserBackupManagerService#createAndInitializeService(Context, Trampoline, HandlerThread, File, + * File, TransportManager)}. + */ + @Test + public void testCreateAndInitializeService_withNullTransportManager_throws() { + expectThrows( + NullPointerException.class, + () -> + UserBackupManagerService.createAndInitializeService( + mContext, + new Trampoline(mContext), + mBackupThread, + mBaseStateDir, + mDataDir, + /* transportManager */ null)); } - private UserBackupManagerService createInitializedBackupManagerService() { - return BackupManagerServiceTestUtils.createInitializedUserBackupManagerService( + private UserBackupManagerService createUserBackupManagerServiceAndRunTasks() { + return BackupManagerServiceTestUtils.createUserBackupManagerServiceAndRunTasks( mContext, mBackupThread, mBaseStateDir, mDataDir, mTransportManager); } diff --git a/services/robotests/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java b/services/robotests/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java index 1aa4999b1d3a..099127cbeb4b 100644 --- a/services/robotests/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java +++ b/services/robotests/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java @@ -25,12 +25,9 @@ import static android.app.backup.BackupManager.SUCCESS; import static android.app.backup.ForwardingBackupAgent.forward; import static com.android.server.backup.testing.BackupManagerServiceTestUtils.createBackupWakeLock; -import static com.android.server.backup.testing.BackupManagerServiceTestUtils - .createInitializedUserBackupManagerService; -import static com.android.server.backup.testing.BackupManagerServiceTestUtils - .setUpBackupManagerServiceBasics; -import static com.android.server.backup.testing.BackupManagerServiceTestUtils - .setUpBinderCallerAndApplicationAsSystem; +import static com.android.server.backup.testing.BackupManagerServiceTestUtils.createUserBackupManagerServiceAndRunTasks; +import static com.android.server.backup.testing.BackupManagerServiceTestUtils.setUpBackupManagerServiceBasics; +import static com.android.server.backup.testing.BackupManagerServiceTestUtils.setUpBinderCallerAndApplicationAsSystem; import static com.android.server.backup.testing.PackageData.PM_PACKAGE; import static com.android.server.backup.testing.PackageData.fullBackupPackage; import static com.android.server.backup.testing.PackageData.keyValuePackage; @@ -226,9 +223,8 @@ public class KeyValueBackupTaskTest { // Needed to be able to use a real BMS instead of a mock setUpBinderCallerAndApplicationAsSystem(mApplication); mBackupManagerService = - spy( - createInitializedUserBackupManagerService( - mContext, mBaseStateDir, mDataDir, mTransportManager)); + spy(createUserBackupManagerServiceAndRunTasks( + mContext, mBaseStateDir, mDataDir, mTransportManager)); setUpBackupManagerServiceBasics( mBackupManagerService, mApplication, diff --git a/services/robotests/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java b/services/robotests/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java index bacc44e685f4..06f6d21b9ca9 100644 --- a/services/robotests/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java +++ b/services/robotests/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java @@ -52,23 +52,36 @@ import java.util.concurrent.atomic.AtomicReference; /** Test utils for {@link UserBackupManagerService} and friends. */ public class BackupManagerServiceTestUtils { /** - * If the class-under-test is going to execute methods as the system, it's a good idea to also - * call {@link #setUpBinderCallerAndApplicationAsSystem(Application)} before this method. + * Creates an instance of {@link UserBackupManagerService} with a new backup thread and runs + * tasks that were posted to it during instantiation. + * + * <p>If the class-under-test is going to execute methods as the system, it's a good idea to + * also call {@link #setUpBinderCallerAndApplicationAsSystem(Application)} before this method. + * + * @see #createUserBackupManagerServiceAndRunTasks(Context, HandlerThread, File, File, + * TransportManager) */ - public static UserBackupManagerService createInitializedUserBackupManagerService( + public static UserBackupManagerService createUserBackupManagerServiceAndRunTasks( Context context, File baseStateDir, File dataDir, TransportManager transportManager) { - return createInitializedUserBackupManagerService( + return createUserBackupManagerServiceAndRunTasks( context, startBackupThread(null), baseStateDir, dataDir, transportManager); } - public static UserBackupManagerService createInitializedUserBackupManagerService( + /** + * Creates an instance of {@link UserBackupManagerService} with the supplied backup thread + * {@code backupThread} and runs tasks that were posted to it during instantiation. + * + * <p>If the class-under-test is going to execute methods as the system, it's a good idea to + * also call {@link #setUpBinderCallerAndApplicationAsSystem(Application)} before this method. + */ + public static UserBackupManagerService createUserBackupManagerServiceAndRunTasks( Context context, HandlerThread backupThread, File baseStateDir, File dataDir, TransportManager transportManager) { UserBackupManagerService backupManagerService = - new UserBackupManagerService( + UserBackupManagerService.createAndInitializeService( context, new Trampoline(context), backupThread, |