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