diff options
| author | Bernardo Rufino <brufino@google.com> | 2018-02-28 11:05:18 +0000 |
|---|---|---|
| committer | Bernardo Rufino <brufino@google.com> | 2018-02-28 11:07:30 +0000 |
| commit | cea93536bc47a76d4e8ea420990e39f4e54d712b (patch) | |
| tree | 8a6e8b9438aff0b7ae32f43796c2b5d97241001b | |
| parent | 12b6bafcf443723c0479d255af373df201d1ae6f (diff) | |
More tests for ActiveRestoreSession - 2
Around restorePackage().
Test: m - j RunFrameworksServicesRoboTests
Change-Id: I291d899d5bb786a1d394e758698418718d6c4d9b
4 files changed, 147 insertions, 44 deletions
diff --git a/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java b/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java index 91d4937c104c..466ce1f2f1e3 100644 --- a/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java +++ b/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java @@ -19,6 +19,7 @@ package com.android.server.backup; import static com.android.server.backup.testing.BackupManagerServiceTestUtils.createBackupWakeLock; import static com.android.server.backup.testing.BackupManagerServiceTestUtils.setUpBackupManagerServiceBasics; import static com.android.server.backup.testing.BackupManagerServiceTestUtils.startBackupThreadAndGetLooper; + import static com.android.server.backup.testing.TransportData.backupTransport; import static com.google.common.truth.Truth.assertThat; @@ -102,18 +103,10 @@ import java.util.stream.Stream; @Config( manifest = Config.NONE, sdk = 26, - shadows = { - ShadowBackupDataInput.class, - ShadowBackupDataOutput.class, - ShadowQueuedWork.class - } + shadows = {ShadowBackupDataInput.class, ShadowBackupDataOutput.class, ShadowQueuedWork.class} ) @SystemLoaderPackages({"com.android.server.backup", "android.app.backup"}) -@SystemLoaderClasses({ - IBackupTransport.class, - IBackupAgent.class, - PackageInfo.class -}) +@SystemLoaderClasses({IBackupTransport.class, IBackupAgent.class, PackageInfo.class}) @Presubmit public class PerformBackupTaskTest { private static final String PACKAGE_1 = "com.example.package1"; @@ -579,6 +572,7 @@ public class PerformBackupTaskTest { return task; } + /** Matches {@link PackageInfo} whose package name is {@code packageName}. */ private static ArgumentMatcher<PackageInfo> packageInfo(String packageName) { // We have to test for packageInfo nulity because of Mockito's own stubbing with argThat(). // E.g. if you do: diff --git a/services/robotests/src/com/android/server/backup/TransportManagerTest.java b/services/robotests/src/com/android/server/backup/TransportManagerTest.java index 02514b82ffba..d02b616c4b19 100644 --- a/services/robotests/src/com/android/server/backup/TransportManagerTest.java +++ b/services/robotests/src/com/android/server/backup/TransportManagerTest.java @@ -97,7 +97,6 @@ public class TransportManagerTest { private TransportData mTransportA1; private TransportData mTransportA2; private TransportData mTransportB1; - private ShadowPackageManager mShadowPackageManager; private Context mContext; diff --git a/services/robotests/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java b/services/robotests/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java index c6a4f57b2a91..03792b1d40ba 100644 --- a/services/robotests/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java +++ b/services/robotests/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java @@ -39,6 +39,8 @@ import android.app.backup.IBackupManagerMonitor; import android.app.backup.IRestoreObserver; import android.app.backup.IRestoreSession; import android.app.backup.RestoreSet; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; import android.os.Looper; import android.os.PowerManager; import android.os.RemoteException; @@ -65,7 +67,9 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowApplication; +import org.robolectric.shadows.ShadowBinder; import org.robolectric.shadows.ShadowLooper; +import org.robolectric.shadows.ShadowPackageManager; import java.util.ArrayDeque; @@ -73,13 +77,15 @@ import java.util.ArrayDeque; @Config( manifest = Config.NONE, sdk = 26, - shadows = {ShadowEventLog.class, ShadowPerformUnifiedRestoreTask.class} + shadows = {ShadowEventLog.class, ShadowPerformUnifiedRestoreTask.class, ShadowBinder.class} ) @SystemLoaderPackages({"com.android.server.backup"}) @Presubmit public class ActiveRestoreSessionTest { private static final String PACKAGE_1 = "com.example.package1"; private static final String PACKAGE_2 = "com.example.package2"; + public static final long TOKEN_1 = 1L; + public static final long TOKEN_2 = 2L; @Mock private BackupManagerService mBackupManagerService; @Mock private TransportManager mTransportManager; @@ -89,10 +95,9 @@ public class ActiveRestoreSessionTest { private ShadowApplication mShadowApplication; private PowerManager.WakeLock mWakeLock; private TransportData mTransport; - private long mToken1; - private long mToken2; private RestoreSet mRestoreSet1; private RestoreSet mRestoreSet2; + private ShadowPackageManager mShadowPackageManager; @Before public void setUp() throws Exception { @@ -100,14 +105,14 @@ public class ActiveRestoreSessionTest { mTransport = backupTransport(); - mToken1 = 1L; - mRestoreSet1 = new RestoreSet("name1", "device1", mToken1); - mToken2 = 2L; - mRestoreSet2 = new RestoreSet("name2", "device2", mToken2); + mRestoreSet1 = new RestoreSet("name1", "device1", TOKEN_1); + mRestoreSet2 = new RestoreSet("name2", "device2", TOKEN_2); Application application = RuntimeEnvironment.application; mShadowApplication = shadowOf(application); + mShadowPackageManager = shadowOf(application.getPackageManager()); + Looper backupLooper = startBackupThreadAndGetLooper(); mShadowBackupLooper = shadowOf(backupLooper); BackupHandler backupHandler = new BackupHandler(mBackupManagerService, backupLooper); @@ -223,7 +228,7 @@ public class ActiveRestoreSessionTest { IRestoreSession restoreSession = createActiveRestoreSessionWithRestoreSets(null, mTransport, mRestoreSet1); - int result = restoreSession.restoreAll(mToken1, mObserver, mMonitor); + int result = restoreSession.restoreAll(TOKEN_1, mObserver, mMonitor); mShadowBackupLooper.runToEndOfTasks(); assertThat(result).isEqualTo(0); @@ -245,11 +250,9 @@ public class ActiveRestoreSessionTest { setUpTransport(mTransport); IRestoreSession restoreSession = createActiveRestoreSession(null, mTransport); - int result = restoreSession.restoreAll(mToken1, mObserver, mMonitor); + int result = restoreSession.restoreAll(TOKEN_1, mObserver, mMonitor); - mShadowBackupLooper.runToEndOfTasks(); assertThat(result).isEqualTo(-1); - assertThat(ShadowPerformUnifiedRestoreTask.getLastCreated()).isNull(); } @Test @@ -259,11 +262,9 @@ public class ActiveRestoreSessionTest { IRestoreSession restoreSession = createActiveRestoreSessionWithRestoreSets(PACKAGE_1, mTransport, mRestoreSet1); - int result = restoreSession.restoreAll(mToken1, mObserver, mMonitor); + int result = restoreSession.restoreAll(TOKEN_1, mObserver, mMonitor); - mShadowBackupLooper.runToEndOfTasks(); assertThat(result).isEqualTo(-1); - assertThat(ShadowPerformUnifiedRestoreTask.getLastCreated()).isNull(); } @Test @@ -277,7 +278,7 @@ public class ActiveRestoreSessionTest { expectThrows( IllegalStateException.class, - () -> restoreSession.restoreAll(mToken1, mObserver, mMonitor)); + () -> restoreSession.restoreAll(TOKEN_1, mObserver, mMonitor)); } @Test @@ -287,11 +288,9 @@ public class ActiveRestoreSessionTest { IRestoreSession restoreSession = createActiveRestoreSessionWithRestoreSets(null, mTransport, mRestoreSet1); - int result = restoreSession.restoreAll(mToken1, mObserver, mMonitor); + int result = restoreSession.restoreAll(TOKEN_1, mObserver, mMonitor); - mShadowBackupLooper.runToEndOfTasks(); assertThat(result).isEqualTo(-1); - assertThat(ShadowPerformUnifiedRestoreTask.getLastCreated()).isNull(); } @Test @@ -302,7 +301,7 @@ public class ActiveRestoreSessionTest { IRestoreSession restoreSession = createActiveRestoreSessionWithRestoreSets(null, mTransport, mRestoreSet1); - int result = restoreSession.restoreAll(mToken1, mObserver, mMonitor); + int result = restoreSession.restoreAll(TOKEN_1, mObserver, mMonitor); mShadowBackupLooper.runToEndOfTasks(); assertThat(result).isEqualTo(0); @@ -318,7 +317,7 @@ public class ActiveRestoreSessionTest { int result = restoreSession.restoreSome( - mToken1, mObserver, mMonitor, new String[] {PACKAGE_1, PACKAGE_2}); + TOKEN_1, mObserver, mMonitor, new String[] {PACKAGE_1, PACKAGE_2}); mShadowBackupLooper.runToEndOfTasks(); assertThat(result).isEqualTo(0); @@ -340,7 +339,7 @@ public class ActiveRestoreSessionTest { createActiveRestoreSessionWithRestoreSets(null, mTransport, mRestoreSet1); restoreSession.restoreSome( - mToken1, mObserver, mMonitor, new String[] {PACKAGE_1, PACKAGE_2}); + TOKEN_1, mObserver, mMonitor, new String[] {PACKAGE_1, PACKAGE_2}); mShadowBackupLooper.runToEndOfTasks(); assertThat(ShadowPerformUnifiedRestoreTask.getLastCreated().isFullSystemRestore()).isTrue(); @@ -353,7 +352,7 @@ public class ActiveRestoreSessionTest { IRestoreSession restoreSession = createActiveRestoreSessionWithRestoreSets(null, mTransport, mRestoreSet1); - restoreSession.restoreSome(mToken1, mObserver, mMonitor, new String[] {PACKAGE_1}); + restoreSession.restoreSome(TOKEN_1, mObserver, mMonitor, new String[] {PACKAGE_1}); mShadowBackupLooper.runToEndOfTasks(); ShadowPerformUnifiedRestoreTask shadowTask = @@ -369,7 +368,7 @@ public class ActiveRestoreSessionTest { IRestoreSession restoreSession = createActiveRestoreSessionWithRestoreSets(null, mTransport, mRestoreSet1); - restoreSession.restoreSome(mToken1, mObserver, mMonitor, new String[] {PACKAGE_1}); + restoreSession.restoreSome(TOKEN_1, mObserver, mMonitor, new String[] {PACKAGE_1}); mShadowBackupLooper.runToEndOfTasks(); assertThat(ShadowPerformUnifiedRestoreTask.getLastCreated().isFullSystemRestore()) @@ -383,11 +382,9 @@ public class ActiveRestoreSessionTest { IRestoreSession restoreSession = createActiveRestoreSession(null, mTransport); int result = - restoreSession.restoreSome(mToken1, mObserver, mMonitor, new String[] {PACKAGE_1}); + restoreSession.restoreSome(TOKEN_1, mObserver, mMonitor, new String[] {PACKAGE_1}); - mShadowBackupLooper.runToEndOfTasks(); assertThat(result).isEqualTo(-1); - assertThat(ShadowPerformUnifiedRestoreTask.getLastCreated()).isNull(); } @Test @@ -398,11 +395,9 @@ public class ActiveRestoreSessionTest { createActiveRestoreSessionWithRestoreSets(PACKAGE_1, mTransport, mRestoreSet1); int result = - restoreSession.restoreSome(mToken1, mObserver, mMonitor, new String[] {PACKAGE_2}); + restoreSession.restoreSome(TOKEN_1, mObserver, mMonitor, new String[] {PACKAGE_2}); - mShadowBackupLooper.runToEndOfTasks(); assertThat(result).isEqualTo(-1); - assertThat(ShadowPerformUnifiedRestoreTask.getLastCreated()).isNull(); } @Test @@ -418,7 +413,7 @@ public class ActiveRestoreSessionTest { IllegalStateException.class, () -> restoreSession.restoreSome( - mToken1, mObserver, mMonitor, new String[] {PACKAGE_1})); + TOKEN_1, mObserver, mMonitor, new String[] {PACKAGE_1})); } @Test @@ -429,11 +424,125 @@ public class ActiveRestoreSessionTest { createActiveRestoreSessionWithRestoreSets(null, mTransport, mRestoreSet1); int result = - restoreSession.restoreSome(mToken1, mObserver, mMonitor, new String[] {PACKAGE_1}); + restoreSession.restoreSome(TOKEN_1, mObserver, mMonitor, new String[] {PACKAGE_1}); + + assertThat(result).isEqualTo(-1); + } + + @Test + public void testRestorePackage_whenCallerIsPackage() throws Exception { + // No need for BACKUP permission in this case + mShadowApplication.denyPermissions(android.Manifest.permission.BACKUP); + ShadowBinder.setCallingUid(1); + setUpPackage(PACKAGE_1, /* uid */ 1); + when(mBackupManagerService.getAvailableRestoreToken(PACKAGE_1)).thenReturn(TOKEN_1); + TransportMock transportMock = setUpTransport(mTransport); + IRestoreSession restoreSession = createActiveRestoreSession(PACKAGE_1, mTransport); + + int result = restoreSession.restorePackage(PACKAGE_1, mObserver, mMonitor); + + mShadowBackupLooper.runToEndOfTasks(); + assertThat(result).isEqualTo(0); + verify(mTransportManager) + .disposeOfTransportClient(eq(transportMock.transportClient), any()); + assertThat(mWakeLock.isHeld()).isFalse(); + assertThat(mBackupManagerService.isRestoreInProgress()).isFalse(); + ShadowPerformUnifiedRestoreTask shadowTask = + ShadowPerformUnifiedRestoreTask.getLastCreated(); + assertThat(shadowTask.isFullSystemRestore()).isFalse(); + assertThat(shadowTask.getFilterSet()).isNull(); + assertThat(shadowTask.getPackage().packageName).isEqualTo(PACKAGE_1); + } + + @Test + public void testRestorePackage_whenPackageNullWhenCreated() throws Exception { + ShadowBinder.setCallingUid(1); + setUpPackage(PACKAGE_1, /* uid */ 1); + when(mBackupManagerService.getAvailableRestoreToken(PACKAGE_1)).thenReturn(TOKEN_1); + setUpTransport(mTransport); + IRestoreSession restoreSession = createActiveRestoreSession(null, mTransport); + + int result = restoreSession.restorePackage(PACKAGE_1, mObserver, mMonitor); mShadowBackupLooper.runToEndOfTasks(); + assertThat(result).isEqualTo(0); + } + + @Test + public void testRestorePackage_whenCallerIsNotPackageAndPermissionGranted() throws Exception { + mShadowApplication.grantPermissions(android.Manifest.permission.BACKUP); + ShadowBinder.setCallingUid(1); + setUpPackage(PACKAGE_1, /* uid */ 2); + when(mBackupManagerService.getAvailableRestoreToken(PACKAGE_1)).thenReturn(TOKEN_1); + setUpTransport(mTransport); + IRestoreSession restoreSession = createActiveRestoreSession(PACKAGE_1, mTransport); + + int result = restoreSession.restorePackage(PACKAGE_1, mObserver, mMonitor); + + mShadowBackupLooper.runToEndOfTasks(); + assertThat(result).isEqualTo(0); + } + + @Test + public void testRestorePackage_whenCallerIsNotPackageAndPermissionDenied() throws Exception { + mShadowApplication.denyPermissions(android.Manifest.permission.BACKUP); + ShadowBinder.setCallingUid(1); + setUpPackage(PACKAGE_1, /* uid */ 2); + when(mBackupManagerService.getAvailableRestoreToken(PACKAGE_1)).thenReturn(TOKEN_1); + setUpTransport(mTransport); + IRestoreSession restoreSession = createActiveRestoreSession(PACKAGE_1, mTransport); + + expectThrows( + SecurityException.class, + () -> restoreSession.restorePackage(PACKAGE_1, mObserver, mMonitor)); + } + + @Test + public void testRestorePackage_whenPackageNotFound() throws Exception { + mShadowApplication.grantPermissions(android.Manifest.permission.BACKUP); + setUpPackage(PACKAGE_1, /* uid */ 1); + setUpTransport(mTransport); + IRestoreSession restoreSession = createActiveRestoreSession(null, mTransport); + + int result = restoreSession.restorePackage(PACKAGE_2, mObserver, mMonitor); + assertThat(result).isEqualTo(-1); - assertThat(ShadowPerformUnifiedRestoreTask.getLastCreated()).isNull(); + } + + @Test + public void testRestorePackage_whenSessionEnded() throws Exception { + ShadowBinder.setCallingUid(1); + setUpPackage(PACKAGE_1, /* uid */ 1); + setUpTransport(mTransport); + IRestoreSession restoreSession = createActiveRestoreSession(null, mTransport); + restoreSession.endRestoreSession(); + mShadowBackupLooper.runToEndOfTasks(); + + expectThrows( + IllegalStateException.class, + () -> restoreSession.restorePackage(PACKAGE_1, mObserver, mMonitor)); + } + + @Test + public void testRestorePackage_whenTransportNotRegistered() throws Exception { + ShadowBinder.setCallingUid(1); + setUpPackage(PACKAGE_1, /* uid */ 1); + setUpTransport(mTransport.unregistered()); + IRestoreSession restoreSession = createActiveRestoreSession(null, mTransport); + + int result = restoreSession.restorePackage(PACKAGE_1, mObserver, mMonitor); + + assertThat(result).isEqualTo(-1); + } + + // TODO: Create a builder for PackageInfo/ApplicationInfo and unify usage with + // TransportManagerTest + private void setUpPackage(String packageName, int uid) { + PackageInfo packageInfo = new PackageInfo(); + packageInfo.packageName = packageName; + packageInfo.applicationInfo = new ApplicationInfo(); + packageInfo.applicationInfo.uid = uid; + mShadowPackageManager.addPackage(packageInfo); } private IRestoreSession createActiveRestoreSession( 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 3c0234bf0a2d..c210fdea6e89 100644 --- a/services/robotests/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java +++ b/services/robotests/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java @@ -34,8 +34,9 @@ import com.android.server.backup.internal.BackupHandler; import java.lang.Thread.UncaughtExceptionHandler; +/** Test utils for {@link BackupManagerService} and friends. */ public class BackupManagerServiceTestUtils { - /** Sets up a basic mocks for {@link BackupManagerService} */ + /** Sets up basic mocks for {@link BackupManagerService}. */ public static void setUpBackupManagerServiceBasics( BackupManagerService backupManagerService, Context context, |
