summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/backup/java/com/android/server/backup/BackupManagerService.java94
-rw-r--r--services/backup/java/com/android/server/backup/Trampoline.java2
-rw-r--r--services/backup/java/com/android/server/backup/UserBackupManagerService.java76
-rw-r--r--services/robotests/src/com/android/server/backup/BackupManagerServiceTest.java6
-rw-r--r--services/robotests/src/com/android/server/backup/UserBackupManagerServiceTest.java224
-rw-r--r--services/robotests/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java14
-rw-r--r--services/robotests/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java25
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,