Merge "BroadcastReceiver in UserBackupManagerService can crash system_server" into qt-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
451e2d843d
@@ -566,10 +566,6 @@ public class UserBackupManagerService {
|
|||||||
// require frequent starting and stopping.
|
// require frequent starting and stopping.
|
||||||
mConstants.start();
|
mConstants.start();
|
||||||
|
|
||||||
// Set up the various sorts of package tracking we do
|
|
||||||
mFullBackupScheduleFile = new File(mBaseStateDir, "fb-schedule");
|
|
||||||
initPackageTracking();
|
|
||||||
|
|
||||||
// Build our mapping of uid to backup client services. This implicitly
|
// Build our mapping of uid to backup client services. This implicitly
|
||||||
// schedules a backup pass on the Package Manager metadata the first
|
// schedules a backup pass on the Package Manager metadata the first
|
||||||
// time anything needs to be backed up.
|
// time anything needs to be backed up.
|
||||||
@@ -589,6 +585,10 @@ public class UserBackupManagerService {
|
|||||||
|
|
||||||
// Power management
|
// Power management
|
||||||
mWakelock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*backup*-" + userId);
|
mWakelock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*backup*-" + userId);
|
||||||
|
|
||||||
|
// Set up the various sorts of package tracking we do
|
||||||
|
mFullBackupScheduleFile = new File(mBaseStateDir, "fb-schedule");
|
||||||
|
initPackageTracking();
|
||||||
}
|
}
|
||||||
|
|
||||||
void initializeBackupEnableState() {
|
void initializeBackupEnableState() {
|
||||||
@@ -744,6 +744,11 @@ public class UserBackupManagerService {
|
|||||||
return mDataDir;
|
return mDataDir;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
BroadcastReceiver getPackageTrackingReceiver() {
|
||||||
|
return mBroadcastReceiver;
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public DataChangedJournal getJournal() {
|
public DataChangedJournal getJournal() {
|
||||||
return mJournal;
|
return mJournal;
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import static org.mockito.ArgumentMatchers.anyInt;
|
|||||||
import static org.mockito.ArgumentMatchers.eq;
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
import static org.robolectric.Shadows.shadowOf;
|
import static org.robolectric.Shadows.shadowOf;
|
||||||
@@ -38,6 +39,7 @@ import static org.testng.Assert.expectThrows;
|
|||||||
import android.app.backup.BackupManager;
|
import android.app.backup.BackupManager;
|
||||||
import android.app.backup.IBackupObserver;
|
import android.app.backup.IBackupObserver;
|
||||||
import android.app.backup.ISelectBackupTransportCallback;
|
import android.app.backup.ISelectBackupTransportCallback;
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.ContextWrapper;
|
import android.content.ContextWrapper;
|
||||||
@@ -48,6 +50,7 @@ import android.os.Binder;
|
|||||||
import android.os.HandlerThread;
|
import android.os.HandlerThread;
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
import android.os.PowerSaveState;
|
import android.os.PowerSaveState;
|
||||||
|
import android.os.UserHandle;
|
||||||
import android.platform.test.annotations.Presubmit;
|
import android.platform.test.annotations.Presubmit;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
|
|
||||||
@@ -66,6 +69,7 @@ import org.junit.Before;
|
|||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
|
import org.mockito.Mockito;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
import org.robolectric.RobolectricTestRunner;
|
||||||
import org.robolectric.RuntimeEnvironment;
|
import org.robolectric.RuntimeEnvironment;
|
||||||
@@ -1130,6 +1134,31 @@ public class UserBackupManagerServiceTest {
|
|||||||
/* transportManager */ null));
|
/* transportManager */ null));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test verifying that creating a new instance registers the broadcast receiver for package
|
||||||
|
* tracking
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testCreateAndInitializeService_registersPackageTrackingReceiver() throws Exception {
|
||||||
|
Context contextSpy = Mockito.spy(mContext);
|
||||||
|
|
||||||
|
UserBackupManagerService service = UserBackupManagerService.createAndInitializeService(
|
||||||
|
USER_ID,
|
||||||
|
contextSpy,
|
||||||
|
new Trampoline(mContext),
|
||||||
|
mBackupThread,
|
||||||
|
mBaseStateDir,
|
||||||
|
mDataDir,
|
||||||
|
mTransportManager);
|
||||||
|
|
||||||
|
BroadcastReceiver packageTrackingReceiver = service.getPackageTrackingReceiver();
|
||||||
|
assertThat(packageTrackingReceiver).isNotNull();
|
||||||
|
|
||||||
|
// One call for package changes and one call for sd card events.
|
||||||
|
verify(contextSpy, times(2)).registerReceiverAsUser(
|
||||||
|
eq(packageTrackingReceiver), eq(UserHandle.of(USER_ID)), any(), any(), any());
|
||||||
|
}
|
||||||
|
|
||||||
private UserBackupManagerService createUserBackupManagerServiceAndRunTasks() {
|
private UserBackupManagerService createUserBackupManagerServiceAndRunTasks() {
|
||||||
return BackupManagerServiceTestUtils.createUserBackupManagerServiceAndRunTasks(
|
return BackupManagerServiceTestUtils.createUserBackupManagerServiceAndRunTasks(
|
||||||
USER_ID, mContext, mBackupThread, mBaseStateDir, mDataDir, mTransportManager);
|
USER_ID, mContext, mBackupThread, mBaseStateDir, mDataDir, mTransportManager);
|
||||||
|
|||||||
Reference in New Issue
Block a user