1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.server.backup; 18 19 import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; 20 21 import static com.google.common.truth.Truth.assertThat; 22 23 import static junit.framework.Assert.assertEquals; 24 import static junit.framework.Assert.assertFalse; 25 import static junit.framework.Assert.assertNotNull; 26 import static junit.framework.Assert.assertNull; 27 import static junit.framework.Assert.assertTrue; 28 import static junit.framework.Assert.fail; 29 30 import static org.mockito.ArgumentMatchers.any; 31 import static org.mockito.ArgumentMatchers.anyString; 32 import static org.mockito.ArgumentMatchers.eq; 33 import static org.mockito.Mockito.doThrow; 34 import static org.mockito.Mockito.inOrder; 35 import static org.mockito.Mockito.mock; 36 import static org.mockito.Mockito.never; 37 import static org.mockito.Mockito.verify; 38 import static org.mockito.Mockito.when; 39 40 import android.Manifest; 41 import android.annotation.UserIdInt; 42 import android.app.backup.BackupManager; 43 import android.app.backup.ISelectBackupTransportCallback; 44 import android.app.job.JobScheduler; 45 import android.content.ComponentName; 46 import android.content.Context; 47 import android.content.pm.PackageManager; 48 import android.content.pm.UserInfo; 49 import android.os.ConditionVariable; 50 import android.os.FileUtils; 51 import android.os.Process; 52 import android.os.RemoteException; 53 import android.os.UserHandle; 54 import android.os.UserManager; 55 import android.platform.test.annotations.Presubmit; 56 57 import androidx.test.InstrumentationRegistry; 58 import androidx.test.ext.junit.runners.AndroidJUnit4; 59 import androidx.test.filters.SmallTest; 60 61 import com.android.dx.mockito.inline.extended.ExtendedMockito; 62 import com.android.server.SystemService; 63 import com.android.server.backup.utils.RandomAccessFileUtils; 64 65 import org.junit.After; 66 import org.junit.Before; 67 import org.junit.Test; 68 import org.junit.runner.RunWith; 69 import org.mockito.InOrder; 70 import org.mockito.Mock; 71 import org.mockito.MockitoSession; 72 import org.mockito.quality.Strictness; 73 74 import java.io.File; 75 import java.io.FileDescriptor; 76 import java.io.PrintWriter; 77 import java.util.concurrent.CompletableFuture; 78 import java.util.concurrent.TimeUnit; 79 80 @SmallTest 81 @Presubmit 82 @RunWith(AndroidJUnit4.class) 83 public class BackupManagerServiceTest { 84 private static final ComponentName TRANSPORT_COMPONENT_NAME = new ComponentName("package", 85 "class"); 86 private static final int NON_SYSTEM_USER = UserHandle.USER_SYSTEM + 1; 87 88 @UserIdInt 89 private int mUserId; 90 @Mock 91 private UserBackupManagerService mSystemUserBackupManagerService; 92 @Mock 93 private UserBackupManagerService mNonSystemUserBackupManagerService; 94 @Mock 95 private Context mContextMock; 96 @Mock 97 private PrintWriter mPrintWriterMock; 98 @Mock 99 private UserManager mUserManagerMock; 100 @Mock 101 private UserInfo mUserInfoMock; 102 103 private FileDescriptor mFileDescriptorStub = new FileDescriptor(); 104 105 private BackupManagerServiceTestable mService; 106 private BackupManagerService.Lifecycle mServiceLifecycle; 107 private static File sTestDir; 108 private MockitoSession mSession; 109 110 @Before setUp()111 public void setUp() throws Exception { 112 mSession = 113 ExtendedMockito.mockitoSession().initMocks( 114 this) 115 .strictness(Strictness.LENIENT) 116 .spyStatic(UserBackupManagerService.class) 117 .startMocking(); 118 doReturn(mSystemUserBackupManagerService).when( 119 () -> UserBackupManagerService.createAndInitializeService( 120 eq(UserHandle.USER_SYSTEM), any(), any(), any())); 121 doReturn(mNonSystemUserBackupManagerService).when( 122 () -> UserBackupManagerService.createAndInitializeService(eq(NON_SYSTEM_USER), 123 any(), any(), any())); 124 125 mUserId = UserHandle.USER_SYSTEM; 126 127 when(mUserManagerMock.getUserInfo(UserHandle.USER_SYSTEM)).thenReturn(mUserInfoMock); 128 when(mUserManagerMock.getUserInfo(NON_SYSTEM_USER)).thenReturn(mUserInfoMock); 129 // Null main user means there is no main user on the device. 130 when(mUserManagerMock.getMainUser()).thenReturn(null); 131 132 BackupManagerServiceTestable.sCallingUserId = UserHandle.USER_SYSTEM; 133 BackupManagerServiceTestable.sCallingUid = Process.SYSTEM_UID; 134 BackupManagerServiceTestable.sBackupDisabled = false; 135 BackupManagerServiceTestable.sUserManagerMock = mUserManagerMock; 136 137 sTestDir = InstrumentationRegistry.getContext().getFilesDir(); 138 sTestDir.mkdirs(); 139 140 when(mContextMock.getSystemService(Context.JOB_SCHEDULER_SERVICE)) 141 .thenReturn(mock(JobScheduler.class)); 142 } 143 144 @After tearDown()145 public void tearDown() throws Exception { 146 FileUtils.deleteContentsAndDir(sTestDir); 147 mSession.finishMocking(); 148 } 149 150 @Test onUnlockUser_startsUserService()151 public void onUnlockUser_startsUserService() { 152 createBackupManagerServiceAndUnlockSystemUser(); 153 mService.setBackupServiceActive(NON_SYSTEM_USER, true); 154 ConditionVariable unlocked = new ConditionVariable(false); 155 156 simulateUserUnlocked(NON_SYSTEM_USER); 157 158 assertNotNull(mService.getUserService(NON_SYSTEM_USER)); 159 } 160 161 @Test startServiceForUser_backupDisabledGlobally_doesNotStartUserService()162 public void startServiceForUser_backupDisabledGlobally_doesNotStartUserService() { 163 createBackupManagerServiceAndUnlockSystemUser(); 164 BackupManagerServiceTestable.sBackupDisabled = true; 165 BackupManagerServiceTestable service = new BackupManagerServiceTestable(mContextMock); 166 167 service.startServiceForUser(UserHandle.USER_SYSTEM); 168 169 assertNull(service.getUserService(UserHandle.USER_SYSTEM)); 170 } 171 172 @Test startServiceForUser_backupNotActiveForUser_doesNotStartUserService()173 public void startServiceForUser_backupNotActiveForUser_doesNotStartUserService() { 174 createBackupManagerServiceAndUnlockSystemUser(); 175 mService.setBackupServiceActive(UserHandle.USER_SYSTEM, false); 176 177 mService.startServiceForUser(UserHandle.USER_SYSTEM); 178 179 assertNull(mService.getUserService(UserHandle.USER_SYSTEM)); 180 } 181 182 @Test startServiceForUser_backupEnabledGloballyAndActiveForUser_startsUserService()183 public void startServiceForUser_backupEnabledGloballyAndActiveForUser_startsUserService() { 184 setMockMainUserAndCreateBackupManagerService(NON_SYSTEM_USER); 185 186 mService.startServiceForUser(NON_SYSTEM_USER); 187 188 assertNotNull(mService.getUserService(NON_SYSTEM_USER)); 189 } 190 191 @Test isBackupServiceActive_backupDisabledGlobally_returnFalse()192 public void isBackupServiceActive_backupDisabledGlobally_returnFalse() { 193 createBackupManagerServiceAndUnlockSystemUser(); 194 BackupManagerServiceTestable.sBackupDisabled = true; 195 BackupManagerService service = new BackupManagerServiceTestable(mContextMock); 196 service.setBackupServiceActive(UserHandle.USER_SYSTEM, true); 197 198 assertFalse(service.isBackupServiceActive(UserHandle.USER_SYSTEM)); 199 } 200 201 @Test isBackupServiceActive_systemUser_isDefault_deactivated_returnsFalse()202 public void isBackupServiceActive_systemUser_isDefault_deactivated_returnsFalse() { 203 createBackupManagerServiceAndUnlockSystemUser(); 204 // If there's no 'main' user on the device, the default user is the system user. 205 mService.setBackupServiceActive(UserHandle.USER_SYSTEM, false); 206 207 assertFalse(mService.isBackupServiceActive(UserHandle.USER_SYSTEM)); 208 } 209 210 @Test isBackupServiceActive_systemUser_isNotDefault_returnsFalse()211 public void isBackupServiceActive_systemUser_isNotDefault_returnsFalse() { 212 createBackupManagerServiceAndUnlockSystemUser(); 213 setMockMainUserAndCreateBackupManagerService(NON_SYSTEM_USER); 214 215 assertFalse(mService.isBackupServiceActive(UserHandle.USER_SYSTEM)); 216 } 217 218 @Test isBackupServiceActive_systemUser_isDefault_returnsTrue()219 public void isBackupServiceActive_systemUser_isDefault_returnsTrue() { 220 createBackupManagerServiceAndUnlockSystemUser(); 221 222 // If there's no 'main' user on the device, the default user is the system user. 223 assertTrue(mService.isBackupServiceActive(UserHandle.USER_SYSTEM)); 224 } 225 226 @Test isBackupServiceActive_nonSystemUser_isDefault_systemUserDeactivated_returnsFalse()227 public void isBackupServiceActive_nonSystemUser_isDefault_systemUserDeactivated_returnsFalse() { 228 setMockMainUserAndCreateBackupManagerService(NON_SYSTEM_USER); 229 mService.setBackupServiceActive(UserHandle.USER_SYSTEM, false); 230 231 assertFalse(mService.isBackupServiceActive(NON_SYSTEM_USER)); 232 } 233 234 @Test isBackupServiceActive_nonSystemUser_isDefault_deactivated_returnsFalse()235 public void isBackupServiceActive_nonSystemUser_isDefault_deactivated_returnsFalse() { 236 setMockMainUserAndCreateBackupManagerService(NON_SYSTEM_USER); 237 mService.setBackupServiceActive(NON_SYSTEM_USER, false); 238 239 assertFalse(mService.isBackupServiceActive(NON_SYSTEM_USER)); 240 } 241 242 @Test isBackupServiceActive_nonSystemUser_isDefault_returnsTrue()243 public void isBackupServiceActive_nonSystemUser_isDefault_returnsTrue() { 244 createBackupManagerServiceAndUnlockSystemUser(); 245 246 setMockMainUserAndCreateBackupManagerService(NON_SYSTEM_USER); 247 248 assertTrue(mService.isBackupServiceActive(NON_SYSTEM_USER)); 249 } 250 251 @Test isBackupServiceActive_nonSystemUser_isNotDefault_notActivated_returnsFalse()252 public void isBackupServiceActive_nonSystemUser_isNotDefault_notActivated_returnsFalse() { 253 createBackupManagerServiceAndUnlockSystemUser(); 254 255 // By default non-system non-default users are not activated. 256 assertFalse(mService.isBackupServiceActive(NON_SYSTEM_USER)); 257 } 258 259 @Test isBackupServiceActive_nonSystemUser_isNotDefault_activated_returnsTrue()260 public void isBackupServiceActive_nonSystemUser_isNotDefault_activated_returnsTrue() { 261 createBackupManagerServiceAndUnlockSystemUser(); 262 mService.setBackupServiceActive(NON_SYSTEM_USER, true); 263 264 assertTrue(mService.isBackupServiceActive(NON_SYSTEM_USER)); 265 } 266 267 @Test setBackupServiceActive_forSystemUserAndCallerSystemUid_createsService()268 public void setBackupServiceActive_forSystemUserAndCallerSystemUid_createsService() { 269 createBackupManagerServiceAndUnlockSystemUser(); 270 BackupManagerServiceTestable.sCallingUid = Process.SYSTEM_UID; 271 272 mService.setBackupServiceActive(UserHandle.USER_SYSTEM, true); 273 274 assertTrue(mService.isUserReadyForBackup(UserHandle.USER_SYSTEM)); 275 } 276 277 @Test setBackupServiceActive_forSystemUserAndCallerRootUid_createsService()278 public void setBackupServiceActive_forSystemUserAndCallerRootUid_createsService() { 279 createBackupManagerServiceAndUnlockSystemUser(); 280 BackupManagerServiceTestable.sCallingUid = Process.ROOT_UID; 281 282 mService.setBackupServiceActive(UserHandle.USER_SYSTEM, true); 283 284 assertTrue(mService.isUserReadyForBackup(UserHandle.USER_SYSTEM)); 285 } 286 287 @Test setBackupServiceActive_forSystemUserAndCallerNonRootNonSystem_throws()288 public void setBackupServiceActive_forSystemUserAndCallerNonRootNonSystem_throws() { 289 createBackupManagerServiceAndUnlockSystemUser(); 290 BackupManagerServiceTestable.sCallingUid = Process.FIRST_APPLICATION_UID; 291 292 try { 293 mService.setBackupServiceActive(UserHandle.USER_SYSTEM, true); 294 fail(); 295 } catch (SecurityException expected) { 296 } 297 } 298 299 @Test setBackupServiceActive_forManagedProfileAndCallerSystemUid_createsService()300 public void setBackupServiceActive_forManagedProfileAndCallerSystemUid_createsService() { 301 createBackupManagerServiceAndUnlockSystemUser(); 302 simulateUserUnlocked(NON_SYSTEM_USER); 303 when(mUserInfoMock.isManagedProfile()).thenReturn(true); 304 BackupManagerServiceTestable.sCallingUid = Process.SYSTEM_UID; 305 306 mService.setBackupServiceActive(NON_SYSTEM_USER, true); 307 308 assertTrue(mService.isUserReadyForBackup(NON_SYSTEM_USER)); 309 } 310 311 @Test setBackupServiceActive_forManagedProfileAndCallerRootUid_createsService()312 public void setBackupServiceActive_forManagedProfileAndCallerRootUid_createsService() { 313 createBackupManagerServiceAndUnlockSystemUser(); 314 simulateUserUnlocked(NON_SYSTEM_USER); 315 when(mUserInfoMock.isManagedProfile()).thenReturn(true); 316 BackupManagerServiceTestable.sCallingUid = Process.ROOT_UID; 317 318 mService.setBackupServiceActive(NON_SYSTEM_USER, true); 319 320 assertTrue(mService.isUserReadyForBackup(NON_SYSTEM_USER)); 321 } 322 323 @Test setBackupServiceActive_forManagedProfileAndCallerNonRootNonSystem_throws()324 public void setBackupServiceActive_forManagedProfileAndCallerNonRootNonSystem_throws() { 325 createBackupManagerServiceAndUnlockSystemUser(); 326 when(mUserInfoMock.isManagedProfile()).thenReturn(true); 327 BackupManagerServiceTestable.sCallingUid = Process.FIRST_APPLICATION_UID; 328 329 try { 330 mService.setBackupServiceActive(NON_SYSTEM_USER, true); 331 fail(); 332 } catch (SecurityException expected) { 333 } 334 } 335 336 @Test setBackupServiceActive_forNonSystemUserAndCallerWithoutBackupPermission_throws()337 public void setBackupServiceActive_forNonSystemUserAndCallerWithoutBackupPermission_throws() { 338 createBackupManagerServiceAndUnlockSystemUser(); 339 doThrow(new SecurityException()) 340 .when(mContextMock) 341 .enforceCallingOrSelfPermission(eq(Manifest.permission.BACKUP), anyString()); 342 343 try { 344 mService.setBackupServiceActive(NON_SYSTEM_USER, true); 345 fail(); 346 } catch (SecurityException expected) { 347 } 348 } 349 350 @Test setBackupServiceActive_forNonSystemUserAndCallerWithoutUserPermission_throws()351 public void setBackupServiceActive_forNonSystemUserAndCallerWithoutUserPermission_throws() { 352 createBackupManagerServiceAndUnlockSystemUser(); 353 doThrow(new SecurityException()) 354 .when(mContextMock) 355 .enforceCallingOrSelfPermission( 356 eq(Manifest.permission.INTERACT_ACROSS_USERS_FULL), anyString()); 357 358 try { 359 mService.setBackupServiceActive(NON_SYSTEM_USER, true); 360 fail(); 361 } catch (SecurityException expected) { 362 } 363 } 364 365 @Test setBackupServiceActive_backupDisabledGlobally_ignored()366 public void setBackupServiceActive_backupDisabledGlobally_ignored() { 367 createBackupManagerServiceAndUnlockSystemUser(); 368 BackupManagerServiceTestable.sBackupDisabled = true; 369 BackupManagerServiceTestable service = new BackupManagerServiceTestable(mContextMock); 370 371 service.setBackupServiceActive(UserHandle.USER_SYSTEM, true); 372 373 assertFalse(service.isBackupServiceActive(UserHandle.USER_SYSTEM)); 374 } 375 376 @Test setBackupServiceActive_alreadyActive_ignored()377 public void setBackupServiceActive_alreadyActive_ignored() { 378 createBackupManagerServiceAndUnlockSystemUser(); 379 mService.setBackupServiceActive(UserHandle.USER_SYSTEM, true); 380 assertTrue(mService.isBackupServiceActive(UserHandle.USER_SYSTEM)); 381 382 mService.setBackupServiceActive(UserHandle.USER_SYSTEM, true); 383 assertTrue(mService.isBackupServiceActive(UserHandle.USER_SYSTEM)); 384 } 385 386 @Test setBackupServiceActive_systemUser_makeActive_deletesSuppressFile()387 public void setBackupServiceActive_systemUser_makeActive_deletesSuppressFile() { 388 createBackupManagerServiceAndUnlockSystemUser(); 389 mService.setBackupServiceActive(UserHandle.USER_SYSTEM, false); 390 391 mService.setBackupServiceActive(UserHandle.USER_SYSTEM, true); 392 393 assertFalse(getFakeSuppressFileForUser(UserHandle.USER_SYSTEM).exists()); 394 } 395 396 @Test setBackupServiceActive_systemUser_makeNonActive_createsSuppressFile()397 public void setBackupServiceActive_systemUser_makeNonActive_createsSuppressFile() { 398 createBackupManagerServiceAndUnlockSystemUser(); 399 mService.setBackupServiceActive(UserHandle.USER_SYSTEM, false); 400 401 assertTrue(getFakeSuppressFileForUser(UserHandle.USER_SYSTEM).exists()); 402 } 403 404 @Test setBackupServiceActive_systemUser_makeNonActive_stopsUserService()405 public void setBackupServiceActive_systemUser_makeNonActive_stopsUserService() { 406 createBackupManagerServiceAndUnlockSystemUser(); 407 assertTrue(mService.isUserReadyForBackup(UserHandle.USER_SYSTEM)); 408 409 mService.setBackupServiceActive(UserHandle.USER_SYSTEM, false); 410 411 assertFalse(mService.isUserReadyForBackup(UserHandle.USER_SYSTEM)); 412 } 413 414 @Test setBackupServiceActive_nonSystemUser_isDefault_makeActive_createsService()415 public void setBackupServiceActive_nonSystemUser_isDefault_makeActive_createsService() { 416 setMockMainUserAndCreateBackupManagerService(NON_SYSTEM_USER); 417 simulateUserUnlocked(NON_SYSTEM_USER); 418 mService.setBackupServiceActive(NON_SYSTEM_USER, false); 419 420 mService.setBackupServiceActive(NON_SYSTEM_USER, true); 421 422 assertTrue(mService.isUserReadyForBackup(NON_SYSTEM_USER)); 423 } 424 425 @Test setBackupServiceActive_nonSystemUser_isDefault_makeActive_deletesSuppressFile()426 public void setBackupServiceActive_nonSystemUser_isDefault_makeActive_deletesSuppressFile() { 427 setMockMainUserAndCreateBackupManagerService(NON_SYSTEM_USER); 428 simulateUserUnlocked(NON_SYSTEM_USER); 429 mService.setBackupServiceActive(NON_SYSTEM_USER, false); 430 431 mService.setBackupServiceActive(NON_SYSTEM_USER, true); 432 433 assertFalse(getFakeSuppressFileForUser(NON_SYSTEM_USER).exists()); 434 } 435 436 @Test setBackupServiceActive_nonSystemUser_isDefault_makeNonActive_createsSuppressFile()437 public void setBackupServiceActive_nonSystemUser_isDefault_makeNonActive_createsSuppressFile() { 438 setMockMainUserAndCreateBackupManagerService(NON_SYSTEM_USER); 439 mService.setBackupServiceActive(NON_SYSTEM_USER, false); 440 441 assertTrue(getFakeSuppressFileForUser(NON_SYSTEM_USER).exists()); 442 } 443 444 @Test setBackupServiceActive_nonSystemUser_isDefault_makeNonActive_stopsUserService()445 public void setBackupServiceActive_nonSystemUser_isDefault_makeNonActive_stopsUserService() { 446 setMockMainUserAndCreateBackupManagerService(NON_SYSTEM_USER); 447 simulateUserUnlocked(NON_SYSTEM_USER); 448 assertTrue(mService.isUserReadyForBackup(NON_SYSTEM_USER)); 449 450 mService.setBackupServiceActive(NON_SYSTEM_USER, false); 451 452 assertFalse(mService.isUserReadyForBackup(NON_SYSTEM_USER)); 453 } 454 455 @Test setBackupServiceActive_nonSystemUser_isNotDefault_makeActive_createsService()456 public void setBackupServiceActive_nonSystemUser_isNotDefault_makeActive_createsService() { 457 createBackupManagerServiceAndUnlockSystemUser(); 458 simulateUserUnlocked(NON_SYSTEM_USER); 459 460 mService.setBackupServiceActive(NON_SYSTEM_USER, true); 461 462 assertTrue(mService.isUserReadyForBackup(NON_SYSTEM_USER)); 463 } 464 465 @Test setBackupServiceActive_nonSystemUser_isNotDefault_makeActive_createActivatedFile()466 public void setBackupServiceActive_nonSystemUser_isNotDefault_makeActive_createActivatedFile() { 467 createBackupManagerServiceAndUnlockSystemUser(); 468 469 mService.setBackupServiceActive(NON_SYSTEM_USER, true); 470 471 assertTrue(getFakeActivatedFileForUser(NON_SYSTEM_USER).exists()); 472 } 473 474 @Test setBackupServiceActive_nonSystemUser_isNotDefault_makeNonActive_stopsUserService()475 public void setBackupServiceActive_nonSystemUser_isNotDefault_makeNonActive_stopsUserService() { 476 createBackupManagerServiceAndUnlockSystemUser(); 477 simulateUserUnlocked(NON_SYSTEM_USER); 478 mService.setBackupServiceActive(NON_SYSTEM_USER, true); 479 480 mService.setBackupServiceActive(NON_SYSTEM_USER, false); 481 482 assertFalse(mService.isUserReadyForBackup(NON_SYSTEM_USER)); 483 } 484 485 @Test setBackupServiceActive_nonSystemUser_isNotDefault_makeActive_deleteActivatedFile()486 public void setBackupServiceActive_nonSystemUser_isNotDefault_makeActive_deleteActivatedFile() { 487 createBackupManagerServiceAndUnlockSystemUser(); 488 mService.setBackupServiceActive(NON_SYSTEM_USER, true); 489 490 mService.setBackupServiceActive(NON_SYSTEM_USER, false); 491 492 assertFalse(getFakeActivatedFileForUser(NON_SYSTEM_USER).exists()); 493 } 494 495 @Test setBackupServiceActive_forOneNonSystemUser_doesNotActivateForAllNonSystemUsers()496 public void setBackupServiceActive_forOneNonSystemUser_doesNotActivateForAllNonSystemUsers() { 497 createBackupManagerServiceAndUnlockSystemUser(); 498 int otherUser = NON_SYSTEM_USER + 1; 499 mService.setBackupServiceActive(UserHandle.USER_SYSTEM, true); 500 501 mService.setBackupServiceActive(NON_SYSTEM_USER, true); 502 503 assertFalse(mService.isBackupServiceActive(otherUser)); 504 } 505 506 @Test setBackupServiceActive_forNonSystemUser_remembersActivated()507 public void setBackupServiceActive_forNonSystemUser_remembersActivated() { 508 createBackupManagerServiceAndUnlockSystemUser(); 509 510 mService.setBackupServiceActive(NON_SYSTEM_USER, true); 511 512 assertTrue(RandomAccessFileUtils.readBoolean( 513 getFakeRememberActivatedFileForUser(NON_SYSTEM_USER), false)); 514 } 515 516 @Test setBackupServiceActiveFalse_forNonSystemUser_remembersActivated()517 public void setBackupServiceActiveFalse_forNonSystemUser_remembersActivated() { 518 createBackupManagerServiceAndUnlockSystemUser(); 519 520 mService.setBackupServiceActive(NON_SYSTEM_USER, false); 521 522 assertFalse(RandomAccessFileUtils.readBoolean( 523 getFakeRememberActivatedFileForUser(NON_SYSTEM_USER), true)); 524 } 525 526 @Test setBackupServiceActiveTwice_forNonSystemUser_remembersLastActivated()527 public void setBackupServiceActiveTwice_forNonSystemUser_remembersLastActivated() { 528 createBackupManagerServiceAndUnlockSystemUser(); 529 530 mService.setBackupServiceActive(NON_SYSTEM_USER, true); 531 mService.setBackupServiceActive(NON_SYSTEM_USER, false); 532 533 assertFalse(RandomAccessFileUtils.readBoolean( 534 getFakeRememberActivatedFileForUser(NON_SYSTEM_USER), true)); 535 } 536 537 @Test selectBackupTransportAsyncForUser_beforeUserUnlocked_notifiesBackupNotAllowed()538 public void selectBackupTransportAsyncForUser_beforeUserUnlocked_notifiesBackupNotAllowed() 539 throws Exception { 540 mService = new BackupManagerServiceTestable(mContextMock); 541 CompletableFuture<Integer> future = new CompletableFuture<>(); 542 ISelectBackupTransportCallback listener = 543 new ISelectBackupTransportCallback.Stub() { 544 @Override 545 public void onSuccess(String transportName) { 546 future.completeExceptionally(new AssertionError()); 547 } 548 549 @Override 550 public void onFailure(int reason) { 551 future.complete(reason); 552 } 553 }; 554 555 mService.selectBackupTransportAsyncForUser(mUserId, TRANSPORT_COMPONENT_NAME, listener); 556 557 assertEquals(BackupManager.ERROR_BACKUP_NOT_ALLOWED, (int) future.get(5, TimeUnit.SECONDS)); 558 } 559 560 @Test selectBackupTransportAsyncForUser_beforeUserUnlockedWithNullListener_doesNotThrow()561 public void selectBackupTransportAsyncForUser_beforeUserUnlockedWithNullListener_doesNotThrow() 562 throws Exception { 563 createBackupManagerServiceAndUnlockSystemUser(); 564 565 mService.selectBackupTransportAsyncForUser(mUserId, TRANSPORT_COMPONENT_NAME, null); 566 567 // No crash. 568 } 569 570 @Test selectBackupTransportAsyncForUser_beforeUserUnlockedListenerThrowing_doesNotThrow()571 public void selectBackupTransportAsyncForUser_beforeUserUnlockedListenerThrowing_doesNotThrow() 572 throws Exception { 573 createBackupManagerServiceAndUnlockSystemUser(); 574 575 ISelectBackupTransportCallback.Stub listener = 576 new ISelectBackupTransportCallback.Stub() { 577 @Override 578 public void onSuccess(String transportName) { 579 } 580 581 @Override 582 public void onFailure(int reason) throws RemoteException { 583 throw new RemoteException(); 584 } 585 }; 586 587 mService.selectBackupTransportAsyncForUser(mUserId, TRANSPORT_COMPONENT_NAME, listener); 588 589 // No crash. 590 } 591 592 @Test dump_callerDoesNotHaveDumpPermission_ignored()593 public void dump_callerDoesNotHaveDumpPermission_ignored() { 594 createBackupManagerServiceAndUnlockSystemUser(); 595 when(mContextMock.checkCallingOrSelfPermission( 596 Manifest.permission.DUMP)).thenReturn( 597 PackageManager.PERMISSION_DENIED); 598 599 mService.dump(mFileDescriptorStub, mPrintWriterMock, new String[0]); 600 601 verify(mSystemUserBackupManagerService, never()).dump(any(), any(), any()); 602 verify(mNonSystemUserBackupManagerService, never()).dump(any(), any(), any()); 603 } 604 605 @Test dump_callerDoesNotHavePackageUsageStatsPermission_ignored()606 public void dump_callerDoesNotHavePackageUsageStatsPermission_ignored() { 607 createBackupManagerServiceAndUnlockSystemUser(); 608 when(mContextMock.checkCallingOrSelfPermission( 609 Manifest.permission.PACKAGE_USAGE_STATS)).thenReturn( 610 PackageManager.PERMISSION_DENIED); 611 612 mService.dump(mFileDescriptorStub, mPrintWriterMock, new String[0]); 613 614 verify(mSystemUserBackupManagerService, never()).dump(any(), any(), any()); 615 verify(mNonSystemUserBackupManagerService, never()).dump(any(), any(), any()); 616 } 617 618 /** 619 * Test that {@link BackupManagerService#dump(FileDescriptor, PrintWriter, String[])} dumps 620 * system user information before non-system user information. 621 */ 622 @Test testDump_systemUserFirst()623 public void testDump_systemUserFirst() { 624 createBackupManagerServiceAndUnlockSystemUser(); 625 mService.setBackupServiceActive(NON_SYSTEM_USER, true); 626 simulateUserUnlocked(NON_SYSTEM_USER); 627 String[] args = new String[0]; 628 mService.dumpWithoutCheckingPermission(mFileDescriptorStub, mPrintWriterMock, args); 629 630 InOrder inOrder = 631 inOrder(mSystemUserBackupManagerService, mNonSystemUserBackupManagerService); 632 inOrder.verify(mSystemUserBackupManagerService) 633 .dump(mFileDescriptorStub, mPrintWriterMock, args); 634 inOrder.verify(mNonSystemUserBackupManagerService) 635 .dump(mFileDescriptorStub, mPrintWriterMock, args); 636 inOrder.verifyNoMoreInteractions(); 637 } 638 639 @Test testGetUserForAncestralSerialNumber_forSystemUser()640 public void testGetUserForAncestralSerialNumber_forSystemUser() { 641 createBackupManagerServiceAndUnlockSystemUser(); 642 simulateUserUnlocked(NON_SYSTEM_USER); 643 when(mUserManagerMock.getProfileIds(UserHandle.getCallingUserId(), false)) 644 .thenReturn(new int[]{UserHandle.USER_SYSTEM, NON_SYSTEM_USER}); 645 when(mSystemUserBackupManagerService.getAncestralSerialNumber()).thenReturn(11L); 646 647 UserHandle user = mService.getUserForAncestralSerialNumber(11L); 648 649 assertThat(user).isEqualTo(UserHandle.of(UserHandle.USER_SYSTEM)); 650 } 651 652 @Test testGetUserForAncestralSerialNumber_forNonSystemUser()653 public void testGetUserForAncestralSerialNumber_forNonSystemUser() { 654 setMockMainUserAndCreateBackupManagerService(NON_SYSTEM_USER); 655 simulateUserUnlocked(NON_SYSTEM_USER); 656 when(mUserManagerMock.getProfileIds(UserHandle.getCallingUserId(), false)) 657 .thenReturn(new int[] {UserHandle.USER_SYSTEM, NON_SYSTEM_USER}); 658 when(mNonSystemUserBackupManagerService.getAncestralSerialNumber()).thenReturn(11L); 659 660 UserHandle user = mService.getUserForAncestralSerialNumber(11L); 661 662 assertThat(user).isEqualTo(UserHandle.of(NON_SYSTEM_USER)); 663 } 664 665 @Test testGetUserForAncestralSerialNumber_whenDisabled()666 public void testGetUserForAncestralSerialNumber_whenDisabled() { 667 createBackupManagerServiceAndUnlockSystemUser(); 668 BackupManagerServiceTestable.sBackupDisabled = true; 669 BackupManagerService backupManagerService = new BackupManagerServiceTestable(mContextMock); 670 when(mSystemUserBackupManagerService.getAncestralSerialNumber()).thenReturn(11L); 671 672 UserHandle user = backupManagerService.getUserForAncestralSerialNumber(11L); 673 674 assertThat(user).isNull(); 675 } 676 677 @Test onUserUnlocking_mainUserChanged_firstUnlockAfterReboot_updatesDefaultUser()678 public void onUserUnlocking_mainUserChanged_firstUnlockAfterReboot_updatesDefaultUser() { 679 // Create BMS *before* setting a main user to simulate the main user being created after 680 // BMS, which can happen for the first ever boot of a new device. 681 mService = new BackupManagerServiceTestable(mContextMock); 682 mServiceLifecycle = new BackupManagerService.Lifecycle(mContextMock, mService); 683 when(mUserManagerMock.getMainUser()).thenReturn(UserHandle.of(NON_SYSTEM_USER)); 684 assertFalse(mService.isBackupServiceActive(NON_SYSTEM_USER)); 685 686 simulateUserUnlocked(UserHandle.USER_SYSTEM); 687 688 assertTrue(mService.isBackupServiceActive(NON_SYSTEM_USER)); 689 } 690 691 @Test onUserUnlocking_mainUserChanged_firstUnlockAfterReboot_doesNotStartForSystemUser()692 public void onUserUnlocking_mainUserChanged_firstUnlockAfterReboot_doesNotStartForSystemUser() { 693 // Create BMS *before* setting a main user to simulate the main user being created after 694 // BMS, which can happen for the first ever boot of a new device. 695 mService = new BackupManagerServiceTestable(mContextMock); 696 mServiceLifecycle = new BackupManagerService.Lifecycle(mContextMock, mService); 697 when(mUserManagerMock.getMainUser()).thenReturn(UserHandle.of(NON_SYSTEM_USER)); 698 assertFalse(mService.isBackupServiceActive(NON_SYSTEM_USER)); 699 700 simulateUserUnlocked(UserHandle.USER_SYSTEM); 701 702 assertFalse(mService.isUserReadyForBackup(UserHandle.USER_SYSTEM)); 703 } 704 705 @Test onUserUnlocking_mainUserChanged_secondUnlockAfterReboot_doesNotUpdateDefaultUser()706 public void onUserUnlocking_mainUserChanged_secondUnlockAfterReboot_doesNotUpdateDefaultUser() { 707 // Create BMS *before* setting a main user to simulate the main user being created after 708 // BMS, which can happen for the first ever boot of a new device. 709 createBackupManagerServiceAndUnlockSystemUser(); 710 when(mUserManagerMock.getMainUser()).thenReturn(UserHandle.of(NON_SYSTEM_USER)); 711 assertFalse(mService.isBackupServiceActive(NON_SYSTEM_USER)); 712 713 simulateUserUnlocked(NON_SYSTEM_USER); 714 715 assertFalse(mService.isBackupServiceActive(NON_SYSTEM_USER)); 716 } 717 createBackupManagerServiceAndUnlockSystemUser()718 private void createBackupManagerServiceAndUnlockSystemUser() { 719 mService = new BackupManagerServiceTestable(mContextMock); 720 mServiceLifecycle = new BackupManagerService.Lifecycle(mContextMock, mService); 721 simulateUserUnlocked(UserHandle.USER_SYSTEM); 722 } 723 724 /** 725 * The 'default' user is set in the constructor of {@link BackupManagerService} so we need to 726 * start a new service after mocking the 'main' user. 727 */ setMockMainUserAndCreateBackupManagerService(int userId)728 private void setMockMainUserAndCreateBackupManagerService(int userId) { 729 when(mUserManagerMock.getMainUser()).thenReturn(UserHandle.of(userId)); 730 mService = new BackupManagerServiceTestable(mContextMock); 731 mServiceLifecycle = new BackupManagerService.Lifecycle(mContextMock, mService); 732 } 733 simulateUserUnlocked(int userId)734 private void simulateUserUnlocked(int userId) { 735 ConditionVariable unlocked = new ConditionVariable(false); 736 mServiceLifecycle.onUserUnlocking( 737 new SystemService.TargetUser( 738 new UserInfo(userId, /* name= */ "test", /* flags= */ 0))); 739 mService.getBackupHandler().post(unlocked::open); 740 unlocked.block(); 741 when(mUserManagerMock.isUserUnlocked(userId)).thenReturn(true); 742 } 743 getFakeSuppressFileForUser(int userId)744 private static File getFakeSuppressFileForUser(int userId) { 745 return new File(sTestDir, "suppress-" + userId); 746 } 747 getFakeActivatedFileForUser(int userId)748 private static File getFakeActivatedFileForUser(int userId) { 749 return new File(sTestDir, "activated-" + userId); 750 } 751 getFakeRememberActivatedFileForUser(int userId)752 private static File getFakeRememberActivatedFileForUser(int userId) { 753 return new File(sTestDir, "rememberActivated-" + userId); 754 } 755 756 private static class BackupManagerServiceTestable extends BackupManagerService { 757 static boolean sBackupDisabled = false; 758 static int sCallingUserId = -1; 759 static int sCallingUid = -1; 760 static UserManager sUserManagerMock = null; 761 BackupManagerServiceTestable(Context context)762 BackupManagerServiceTestable(Context context) { 763 super(context); 764 } 765 766 @Override getUserManager()767 protected UserManager getUserManager() { 768 return sUserManagerMock; 769 } 770 771 @Override isBackupDisabled()772 protected boolean isBackupDisabled() { 773 return sBackupDisabled; 774 } 775 776 @Override getSuppressFileForUser(int userId)777 protected File getSuppressFileForUser(int userId) { 778 return getFakeSuppressFileForUser(userId); 779 } 780 781 @Override getRememberActivatedFileForNonSystemUser(int userId)782 protected File getRememberActivatedFileForNonSystemUser(int userId) { 783 return getFakeRememberActivatedFileForUser(userId); 784 } 785 786 @Override getActivatedFileForUser(int userId)787 protected File getActivatedFileForUser(int userId) { 788 return getFakeActivatedFileForUser(userId); 789 } 790 791 @Override binderGetCallingUserId()792 protected int binderGetCallingUserId() { 793 return sCallingUserId; 794 } 795 796 @Override binderGetCallingUid()797 protected int binderGetCallingUid() { 798 return sCallingUid; 799 } 800 801 @Override postToHandler(Runnable runnable)802 protected void postToHandler(Runnable runnable) { 803 runnable.run(); 804 } 805 } 806 } 807