blob: 79eba680c998f35bcbfeaa348dc7755c04217844 [file] [log] [blame]
Artem Iglikov6052ef52017-04-20 17:23:39 +01001/*
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
17package com.android.server.backup;
18
19import static junit.framework.Assert.assertEquals;
20import static junit.framework.Assert.assertFalse;
Tony Mak8b20b2c2017-05-02 14:15:10 +010021import static junit.framework.Assert.assertNotNull;
Artem Iglikov6052ef52017-04-20 17:23:39 +010022import static junit.framework.Assert.assertNull;
23import static junit.framework.Assert.assertTrue;
Artem Iglikove5263c62017-04-21 13:23:16 +010024import static junit.framework.Assert.fail;
Artem Iglikov6052ef52017-04-20 17:23:39 +010025
Artem Iglikove5263c62017-04-21 13:23:16 +010026import static org.mockito.Mockito.reset;
Artem Iglikov6052ef52017-04-20 17:23:39 +010027import static org.mockito.Mockito.verify;
28import static org.mockito.Mockito.verifyNoMoreInteractions;
29import static org.mockito.Mockito.when;
30
Artem Iglikovc92eb462017-04-21 09:56:35 +010031import android.app.backup.BackupManager;
Artem Iglikov6052ef52017-04-20 17:23:39 +010032import android.app.backup.IBackupManagerMonitor;
33import android.app.backup.IBackupObserver;
34import android.app.backup.IFullBackupRestoreObserver;
Tony Mak8b20b2c2017-05-02 14:15:10 +010035import android.app.backup.ISelectBackupTransportCallback;
Artem Iglikov6052ef52017-04-20 17:23:39 +010036import android.content.ComponentName;
37import android.content.Context;
38import android.content.Intent;
Artem Iglikove5263c62017-04-21 13:23:16 +010039import android.content.pm.PackageManager;
Artem Iglikov6052ef52017-04-20 17:23:39 +010040import android.os.IBinder;
41import android.os.ParcelFileDescriptor;
Artem Iglikove5263c62017-04-21 13:23:16 +010042import android.os.Process;
Artem Iglikov6052ef52017-04-20 17:23:39 +010043import android.os.RemoteException;
44import android.os.UserHandle;
Artem Iglikove5263c62017-04-21 13:23:16 +010045import android.platform.test.annotations.Presubmit;
Brett Chabot8091d9e2019-02-26 14:52:33 -080046
47import androidx.test.filters.SmallTest;
48import androidx.test.runner.AndroidJUnit4;
Artem Iglikov6052ef52017-04-20 17:23:39 +010049
50import org.junit.Before;
Artem Iglikov6052ef52017-04-20 17:23:39 +010051import org.junit.Test;
52import org.junit.runner.RunWith;
53import org.mockito.Mock;
54import org.mockito.MockitoAnnotations;
55
56import java.io.File;
Artem Iglikove5263c62017-04-21 13:23:16 +010057import java.io.FileDescriptor;
58import java.io.IOException;
59import java.io.PrintWriter;
Tony Mak8b20b2c2017-05-02 14:15:10 +010060import java.util.concurrent.LinkedBlockingQueue;
61import java.util.concurrent.TimeUnit;
Artem Iglikov6052ef52017-04-20 17:23:39 +010062
Artem Iglikove5263c62017-04-21 13:23:16 +010063@SmallTest
64@Presubmit
Artem Iglikov6052ef52017-04-20 17:23:39 +010065@RunWith(AndroidJUnit4.class)
66public class TrampolineTest {
67 private static final String PACKAGE_NAME = "some.package.name";
68 private static final String TRANSPORT_NAME = "some.transport.name";
69 private static final String CURRENT_PASSWORD = "current_password";
70 private static final String NEW_PASSWORD = "new_password";
71 private static final String ENCRYPTION_PASSWORD = "encryption_password";
72 private static final String DATA_MANAGEMENT_LABEL = "data_management_label";
73 private static final String DESTINATION_STRING = "destination_string";
74 private static final String[] PACKAGE_NAMES =
75 new String[]{"some.package.name._1", "some.package.name._2"};
76 private static final String[] TRANSPORTS =
77 new String[]{"some.transport.name._1", "some.transport.name._2"};
78 private static final ComponentName TRANSPORT_COMPONENT_NAME = new ComponentName("package",
79 "class");
80 private static final ComponentName[] TRANSPORT_COMPONENTS = new ComponentName[]{
81 new ComponentName("package1", "class1"),
82 new ComponentName("package2", "class2")
83 };
Artem Iglikove5263c62017-04-21 13:23:16 +010084 private final int NON_USER_SYSTEM = UserHandle.USER_SYSTEM + 1;
Artem Iglikov6052ef52017-04-20 17:23:39 +010085
Michal Karpinskife4ae0c2018-01-25 15:24:00 +000086 @Mock private BackupManagerService mBackupManagerServiceMock;
Artem Iglikov6052ef52017-04-20 17:23:39 +010087 @Mock private Context mContextMock;
88 @Mock private File mSuppressFileMock;
89 @Mock private File mSuppressFileParentMock;
90 @Mock private IBinder mAgentMock;
Artem Iglikove5263c62017-04-21 13:23:16 +010091 @Mock private ParcelFileDescriptor mParcelFileDescriptorMock;
Artem Iglikov6052ef52017-04-20 17:23:39 +010092 @Mock private IFullBackupRestoreObserver mFullBackupRestoreObserverMock;
93 @Mock private IBackupObserver mBackupObserverMock;
94 @Mock private IBackupManagerMonitor mBackupManagerMonitorMock;
Artem Iglikove5263c62017-04-21 13:23:16 +010095 @Mock private PrintWriter mPrintWriterMock;
96
97 private FileDescriptor mFileDescriptorStub = new FileDescriptor();
Artem Iglikov6052ef52017-04-20 17:23:39 +010098
99 private TrampolineTestable mTrampoline;
100
101 @Before
102 public void setUp() {
103 MockitoAnnotations.initMocks(this);
104
Michal Karpinskife4ae0c2018-01-25 15:24:00 +0000105 TrampolineTestable.sBackupManagerServiceMock = mBackupManagerServiceMock;
Artem Iglikove5263c62017-04-21 13:23:16 +0100106 TrampolineTestable.sSuppressFile = mSuppressFileMock;
107 TrampolineTestable.sCallingUid = Process.SYSTEM_UID;
Artem Iglikove5263c62017-04-21 13:23:16 +0100108 TrampolineTestable.sBackupDisabled = false;
Artem Iglikov6052ef52017-04-20 17:23:39 +0100109
110 when(mSuppressFileMock.getParentFile()).thenReturn(mSuppressFileParentMock);
Artem Iglikove5263c62017-04-21 13:23:16 +0100111
112 mTrampoline = new TrampolineTestable(mContextMock);
Artem Iglikov6052ef52017-04-20 17:23:39 +0100113 }
114
115 @Test
116 public void constructor_createsSuppressFileDirectory() {
Artem Iglikov6052ef52017-04-20 17:23:39 +0100117 verify(mSuppressFileParentMock).mkdirs();
118 }
119
120 @Test
121 public void initialize_forUserSystem_successfullyInitialized() {
122 mTrampoline.initialize(UserHandle.USER_SYSTEM);
123
124 assertTrue(mTrampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
125 }
126
127 // The BackupManagerService can only be initialized by USER_SYSTEM, so we check that if any
128 // other user trying to initialize it leaves it non-active.
129 @Test
130 public void initialize_forNonUserSystem_nonInitialized() {
Artem Iglikove5263c62017-04-21 13:23:16 +0100131 mTrampoline.initialize(NON_USER_SYSTEM);
Artem Iglikov6052ef52017-04-20 17:23:39 +0100132
Artem Iglikove5263c62017-04-21 13:23:16 +0100133 assertFalse(mTrampoline.isBackupServiceActive(NON_USER_SYSTEM));
Artem Iglikov6052ef52017-04-20 17:23:39 +0100134 }
135
136 @Test
137 public void initialize_globallyDisabled_nonInitialized() {
Artem Iglikove5263c62017-04-21 13:23:16 +0100138 TrampolineTestable.sBackupDisabled = true;
139
140 TrampolineTestable trampoline = new TrampolineTestable(mContextMock);
Artem Iglikov6052ef52017-04-20 17:23:39 +0100141 trampoline.initialize(UserHandle.USER_SYSTEM);
142
143 assertFalse(trampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
144 }
145
146 // Verify that BackupManagerService is not initialized if suppress file exists.
147 @Test
148 public void initialize_suppressFileExists_nonInitialized() {
149 when(mSuppressFileMock.exists()).thenReturn(true);
150
Artem Iglikove5263c62017-04-21 13:23:16 +0100151 TrampolineTestable trampoline = new TrampolineTestable(mContextMock);
Artem Iglikov6052ef52017-04-20 17:23:39 +0100152 trampoline.initialize(UserHandle.USER_SYSTEM);
153
154 assertFalse(trampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
155 }
156
157 @Test
158 public void isBackupServiceActive_calledBeforeInitialize_returnsFalse() {
159 assertFalse(mTrampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
160 }
161
162 @Test
Artem Iglikove5263c62017-04-21 13:23:16 +0100163 public void setBackupServiceActive_callerSystemUid_serviceCreated() {
164 TrampolineTestable.sCallingUid = Process.SYSTEM_UID;
165
166 mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, true);
167
168 assertTrue(mTrampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
169 }
170
171 @Test
172 public void setBackupServiceActive_callerRootUid_serviceCreated() {
173 TrampolineTestable.sCallingUid = Process.ROOT_UID;
174
175 mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, true);
176
177 assertTrue(mTrampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
178 }
179
180 @Test
181 public void setBackupServiceActive_callerNonRootNonSystem_securityExceptionThrown() {
182 TrampolineTestable.sCallingUid = Process.FIRST_APPLICATION_UID;
183
184 try {
185 mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, true);
186 fail();
187 } catch (SecurityException expected) {
188 }
189
190 assertFalse(mTrampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
191 }
192
193 @Test
194 public void setBackupServiceActive_backupDisabled_ignored() {
195 TrampolineTestable.sBackupDisabled = true;
196 TrampolineTestable trampoline = new TrampolineTestable(mContextMock);
197
198 trampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, true);
199
200 assertFalse(trampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
201 }
202
203 @Test
204 public void setBackupServiceActive_nonUserSystem_ignored() {
205 mTrampoline.setBackupServiceActive(NON_USER_SYSTEM, true);
206
207 assertFalse(mTrampoline.isBackupServiceActive(NON_USER_SYSTEM));
208 }
209
210 @Test
211 public void setBackupServiceActive_alreadyActive_ignored() {
212 mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, true);
213 assertTrue(mTrampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
214 assertEquals(1, mTrampoline.getCreateServiceCallsCount());
215
216 mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, true);
217 assertTrue(mTrampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
218 assertEquals(1, mTrampoline.getCreateServiceCallsCount());
219 }
220
221 @Test
222 public void setBackupServiceActive_makeActive_serviceCreatedAndSuppressFileDeleted() {
223 mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, true);
224
225 assertTrue(mTrampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
226 verify(mSuppressFileMock).delete();
227 }
228
229 @Test
230 public void setBackupServiceActive_makeNonActive_serviceDeletedAndSuppressFileCreated()
231 throws IOException {
232 mTrampoline.initialize(UserHandle.USER_SYSTEM);
233 assertTrue(mTrampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
234
235 mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, false);
236
237 assertFalse(mTrampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
238 verify(mSuppressFileMock).createNewFile();
239 }
240
241 @Test
242 public void
243 setBackupServiceActive_makeNonActive_serviceDeletedAndSuppressFileCreated_ioExceptionHandled()
244 throws IOException {
245 when(mSuppressFileMock.createNewFile()).thenThrow(new IOException());
246 mTrampoline.initialize(UserHandle.USER_SYSTEM);
247 assertTrue(mTrampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
248
249 mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, false);
250
251 assertFalse(mTrampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
252 verify(mSuppressFileMock).createNewFile();
253 }
254
255 @Test
256 public void setBackupServiceActive_makeNonActive_alreadyNonActive_ignored() throws IOException {
257 reset(mSuppressFileMock);
258
259 mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, false);
260
261 verifyNoMoreInteractions(mSuppressFileMock);
262 }
263
264 @Test
Artem Iglikov6052ef52017-04-20 17:23:39 +0100265 public void dataChanged_calledBeforeInitialize_ignored() throws RemoteException {
266 mTrampoline.dataChanged(PACKAGE_NAME);
267 verifyNoMoreInteractions(mBackupManagerServiceMock);
268 }
269
270 @Test
271 public void dataChanged_forwarded() throws RemoteException {
272 mTrampoline.initialize(UserHandle.USER_SYSTEM);
273 mTrampoline.dataChanged(PACKAGE_NAME);
274 verify(mBackupManagerServiceMock).dataChanged(PACKAGE_NAME);
275 }
276
277 @Test
278 public void clearBackupData_calledBeforeInitialize_ignored() throws RemoteException {
279 mTrampoline.clearBackupData(TRANSPORT_NAME, PACKAGE_NAME);
280 verifyNoMoreInteractions(mBackupManagerServiceMock);
281 }
282
283 @Test
284 public void clearBackupData_forwarded() throws RemoteException {
285 mTrampoline.initialize(UserHandle.USER_SYSTEM);
286 mTrampoline.clearBackupData(TRANSPORT_NAME, PACKAGE_NAME);
287 verify(mBackupManagerServiceMock).clearBackupData(TRANSPORT_NAME, PACKAGE_NAME);
288 }
289
290 @Test
291 public void agentConnected_calledBeforeInitialize_ignored() throws RemoteException {
292 mTrampoline.agentConnected(PACKAGE_NAME, mAgentMock);
293 verifyNoMoreInteractions(mBackupManagerServiceMock);
294 }
295
296 @Test
297 public void agentConnected_forwarded() throws RemoteException {
298 mTrampoline.initialize(UserHandle.USER_SYSTEM);
299 mTrampoline.agentConnected(PACKAGE_NAME, mAgentMock);
300 verify(mBackupManagerServiceMock).agentConnected(PACKAGE_NAME, mAgentMock);
301 }
302
303 @Test
304 public void agentDisconnected_calledBeforeInitialize_ignored() throws RemoteException {
305 mTrampoline.agentDisconnected(PACKAGE_NAME);
306 verifyNoMoreInteractions(mBackupManagerServiceMock);
307 }
308
309 @Test
310 public void agentDisconnected_forwarded() throws RemoteException {
311 mTrampoline.initialize(UserHandle.USER_SYSTEM);
312 mTrampoline.agentDisconnected(PACKAGE_NAME);
313 verify(mBackupManagerServiceMock).agentDisconnected(PACKAGE_NAME);
314 }
315
316 @Test
317 public void restoreAtInstall_calledBeforeInitialize_ignored() throws RemoteException {
318 mTrampoline.restoreAtInstall(PACKAGE_NAME, 123);
319 verifyNoMoreInteractions(mBackupManagerServiceMock);
320 }
321
322 @Test
323 public void restoreAtInstall_forwarded() throws RemoteException {
324 mTrampoline.initialize(UserHandle.USER_SYSTEM);
325 mTrampoline.restoreAtInstall(PACKAGE_NAME, 123);
326 verify(mBackupManagerServiceMock).restoreAtInstall(PACKAGE_NAME, 123);
327 }
328
329 @Test
330 public void setBackupEnabled_calledBeforeInitialize_ignored() throws RemoteException {
331 mTrampoline.setBackupEnabled(true);
332 verifyNoMoreInteractions(mBackupManagerServiceMock);
333 }
334
335 @Test
336 public void setBackupEnabled_forwarded() throws RemoteException {
337 mTrampoline.initialize(UserHandle.USER_SYSTEM);
338 mTrampoline.setBackupEnabled(true);
339 verify(mBackupManagerServiceMock).setBackupEnabled(true);
340 }
341
342 @Test
343 public void setAutoRestore_calledBeforeInitialize_ignored() throws RemoteException {
344 mTrampoline.setAutoRestore(true);
345 verifyNoMoreInteractions(mBackupManagerServiceMock);
346 }
347
348 @Test
349 public void setAutoRestore_forwarded() throws RemoteException {
350 mTrampoline.initialize(UserHandle.USER_SYSTEM);
351 mTrampoline.setAutoRestore(true);
352 verify(mBackupManagerServiceMock).setAutoRestore(true);
353 }
354
355 @Test
356 public void setBackupProvisioned_calledBeforeInitialize_ignored() throws RemoteException {
357 mTrampoline.setBackupProvisioned(true);
358 verifyNoMoreInteractions(mBackupManagerServiceMock);
359 }
360
361 @Test
362 public void setBackupProvisioned_forwarded() throws RemoteException {
363 mTrampoline.initialize(UserHandle.USER_SYSTEM);
364 mTrampoline.setBackupProvisioned(true);
365 verify(mBackupManagerServiceMock).setBackupProvisioned(true);
366 }
367
368 @Test
369 public void isBackupEnabled_calledBeforeInitialize_ignored() throws RemoteException {
370 assertFalse(mTrampoline.isBackupEnabled());
371 verifyNoMoreInteractions(mBackupManagerServiceMock);
372 }
373
374 @Test
375 public void isBackupEnabled_forwarded() throws RemoteException {
376 mTrampoline.initialize(UserHandle.USER_SYSTEM);
377 mTrampoline.isBackupEnabled();
378 verify(mBackupManagerServiceMock).isBackupEnabled();
379 }
380
381 @Test
382 public void setBackupPassword_calledBeforeInitialize_ignored() throws RemoteException {
383 mTrampoline.setBackupPassword(CURRENT_PASSWORD, NEW_PASSWORD);
384 verifyNoMoreInteractions(mBackupManagerServiceMock);
385 }
386
387 @Test
388 public void setBackupPassword_forwarded() throws RemoteException {
389 mTrampoline.initialize(UserHandle.USER_SYSTEM);
390 mTrampoline.setBackupPassword(CURRENT_PASSWORD, NEW_PASSWORD);
391 verify(mBackupManagerServiceMock).setBackupPassword(CURRENT_PASSWORD, NEW_PASSWORD);
392 }
393
394 @Test
395 public void hasBackupPassword_calledBeforeInitialize_ignored() throws RemoteException {
396 assertFalse(mTrampoline.hasBackupPassword());
397 verifyNoMoreInteractions(mBackupManagerServiceMock);
398 }
399
400 @Test
401 public void hasBackupPassword_forwarded() throws RemoteException {
402 mTrampoline.initialize(UserHandle.USER_SYSTEM);
403 mTrampoline.hasBackupPassword();
404 verify(mBackupManagerServiceMock).hasBackupPassword();
405 }
406
407 @Test
408 public void backupNow_calledBeforeInitialize_ignored() throws RemoteException {
409 mTrampoline.backupNow();
410 verifyNoMoreInteractions(mBackupManagerServiceMock);
411 }
412
413 @Test
414 public void backupNow_forwarded() throws RemoteException {
415 mTrampoline.initialize(UserHandle.USER_SYSTEM);
416 mTrampoline.backupNow();
417 verify(mBackupManagerServiceMock).backupNow();
418 }
419
420 @Test
421 public void adbBackup_calledBeforeInitialize_ignored() throws RemoteException {
Artem Iglikove5263c62017-04-21 13:23:16 +0100422 mTrampoline.adbBackup(mParcelFileDescriptorMock, true, true, true, true, true, true, true,
423 true,
Artem Iglikov6052ef52017-04-20 17:23:39 +0100424 PACKAGE_NAMES);
425 verifyNoMoreInteractions(mBackupManagerServiceMock);
426 }
427
428 @Test
429 public void adbBackup_forwarded() throws RemoteException {
430 mTrampoline.initialize(UserHandle.USER_SYSTEM);
Artem Iglikove5263c62017-04-21 13:23:16 +0100431 mTrampoline.adbBackup(mParcelFileDescriptorMock, true, true, true, true, true, true, true,
432 true,
Artem Iglikov6052ef52017-04-20 17:23:39 +0100433 PACKAGE_NAMES);
Artem Iglikove5263c62017-04-21 13:23:16 +0100434 verify(mBackupManagerServiceMock).adbBackup(mParcelFileDescriptorMock, true, true, true,
435 true,
Artem Iglikov6052ef52017-04-20 17:23:39 +0100436 true, true, true, true, PACKAGE_NAMES);
437 }
438
439 @Test
440 public void fullTransportBackup_calledBeforeInitialize_ignored() throws RemoteException {
441 mTrampoline.fullTransportBackup(PACKAGE_NAMES);
442 verifyNoMoreInteractions(mBackupManagerServiceMock);
443 }
444
445 @Test
446 public void fullTransportBackup_forwarded() throws RemoteException {
447 mTrampoline.initialize(UserHandle.USER_SYSTEM);
448 mTrampoline.fullTransportBackup(PACKAGE_NAMES);
449 verify(mBackupManagerServiceMock).fullTransportBackup(PACKAGE_NAMES);
450 }
451
452 @Test
453 public void adbRestore_calledBeforeInitialize_ignored() throws RemoteException {
Artem Iglikove5263c62017-04-21 13:23:16 +0100454 mTrampoline.adbRestore(mParcelFileDescriptorMock);
Artem Iglikov6052ef52017-04-20 17:23:39 +0100455 verifyNoMoreInteractions(mBackupManagerServiceMock);
456 }
457
458 @Test
459 public void adbRestore_forwarded() throws RemoteException {
460 mTrampoline.initialize(UserHandle.USER_SYSTEM);
Artem Iglikove5263c62017-04-21 13:23:16 +0100461 mTrampoline.adbRestore(mParcelFileDescriptorMock);
462 verify(mBackupManagerServiceMock).adbRestore(mParcelFileDescriptorMock);
Artem Iglikov6052ef52017-04-20 17:23:39 +0100463 }
464
465 @Test
466 public void acknowledgeFullBackupOrRestore_calledBeforeInitialize_ignored()
467 throws RemoteException {
468 mTrampoline.acknowledgeFullBackupOrRestore(123, true, CURRENT_PASSWORD, ENCRYPTION_PASSWORD,
469 mFullBackupRestoreObserverMock);
470 verifyNoMoreInteractions(mBackupManagerServiceMock);
471 }
472
473 @Test
474 public void acknowledgeFullBackupOrRestore_forwarded() throws RemoteException {
475 mTrampoline.initialize(UserHandle.USER_SYSTEM);
476 mTrampoline.acknowledgeFullBackupOrRestore(123, true, CURRENT_PASSWORD, ENCRYPTION_PASSWORD,
477 mFullBackupRestoreObserverMock);
478 verify(mBackupManagerServiceMock).acknowledgeAdbBackupOrRestore(123, true, CURRENT_PASSWORD,
479 ENCRYPTION_PASSWORD, mFullBackupRestoreObserverMock);
480 }
481
482 @Test
483 public void getCurrentTransport_calledBeforeInitialize_ignored() throws RemoteException {
484 assertNull(mTrampoline.getCurrentTransport());
485 verifyNoMoreInteractions(mBackupManagerServiceMock);
486 }
487
488 @Test
489 public void getCurrentTransport_forwarded() throws RemoteException {
490 when(mBackupManagerServiceMock.getCurrentTransport()).thenReturn(TRANSPORT_NAME);
491
492 mTrampoline.initialize(UserHandle.USER_SYSTEM);
493
494 assertEquals(TRANSPORT_NAME, mTrampoline.getCurrentTransport());
495 verify(mBackupManagerServiceMock).getCurrentTransport();
496 }
497
498 @Test
499 public void listAllTransports_calledBeforeInitialize_ignored() throws RemoteException {
500 assertNull(mTrampoline.listAllTransports());
501 verifyNoMoreInteractions(mBackupManagerServiceMock);
502 }
503
504 @Test
505 public void listAllTransports_forwarded() throws RemoteException {
506 when(mBackupManagerServiceMock.listAllTransports()).thenReturn(TRANSPORTS);
507
508 mTrampoline.initialize(UserHandle.USER_SYSTEM);
509 assertEquals(TRANSPORTS, mTrampoline.listAllTransports());
510 verify(mBackupManagerServiceMock).listAllTransports();
511 }
512
513 @Test
514 public void listAllTransportComponents_calledBeforeInitialize_ignored() throws RemoteException {
515 assertNull(mTrampoline.listAllTransportComponents());
516 verifyNoMoreInteractions(mBackupManagerServiceMock);
517 }
518
519 @Test
520 public void listAllTransportComponents_forwarded() throws RemoteException {
521 when(mBackupManagerServiceMock.listAllTransportComponents()).thenReturn(
522 TRANSPORT_COMPONENTS);
523
524 mTrampoline.initialize(UserHandle.USER_SYSTEM);
525 assertEquals(TRANSPORT_COMPONENTS, mTrampoline.listAllTransportComponents());
526 verify(mBackupManagerServiceMock).listAllTransportComponents();
527 }
528
529 @Test
530 public void getTransportWhitelist_calledBeforeInitialize_ignored() throws RemoteException {
531 assertNull(mTrampoline.getTransportWhitelist());
532 verifyNoMoreInteractions(mBackupManagerServiceMock);
533 }
534
535 @Test
536 public void getTransportWhitelist_forwarded() throws RemoteException {
537 when(mBackupManagerServiceMock.getTransportWhitelist()).thenReturn(TRANSPORTS);
538
539 mTrampoline.initialize(UserHandle.USER_SYSTEM);
540 assertEquals(TRANSPORTS, mTrampoline.getTransportWhitelist());
541 verify(mBackupManagerServiceMock).getTransportWhitelist();
542 }
543
544 @Test
Bernardo Rufinoab953332017-11-22 22:10:32 +0000545 public void describeTransport_calledBeforeInitialize_ignored() throws RemoteException {
546 mTrampoline.updateTransportAttributes(TRANSPORT_COMPONENT_NAME, TRANSPORT_NAME, null,
547 "Transport Destination", null, "Data Management");
548 verifyNoMoreInteractions(mBackupManagerServiceMock);
549 }
550
551 @Test
552 public void describeTransport_forwarded() throws RemoteException {
553 when(mBackupManagerServiceMock.getTransportWhitelist()).thenReturn(TRANSPORTS);
554
555 mTrampoline.initialize(UserHandle.USER_SYSTEM);
556 mTrampoline.updateTransportAttributes(TRANSPORT_COMPONENT_NAME, TRANSPORT_NAME, null,
557 "Transport Destination", null, "Data Management");
558 verify(mBackupManagerServiceMock).updateTransportAttributes(TRANSPORT_COMPONENT_NAME,
559 TRANSPORT_NAME, null, "Transport Destination", null, "Data Management");
560 }
561
562 @Test
Artem Iglikov6052ef52017-04-20 17:23:39 +0100563 public void selectBackupTransport_calledBeforeInitialize_ignored() throws RemoteException {
564 mTrampoline.selectBackupTransport(TRANSPORT_NAME);
565 verifyNoMoreInteractions(mBackupManagerServiceMock);
566 }
567
568 @Test
569 public void selectBackupTransport_forwarded() throws RemoteException {
570 mTrampoline.initialize(UserHandle.USER_SYSTEM);
571 mTrampoline.selectBackupTransport(TRANSPORT_NAME);
572 verify(mBackupManagerServiceMock).selectBackupTransport(TRANSPORT_NAME);
573 }
574
575 @Test
Tony Mak8b20b2c2017-05-02 14:15:10 +0100576 public void selectBackupTransportAsync_calledBeforeInitialize_ignored() throws Exception {
577 LinkedBlockingQueue<Integer> q = new LinkedBlockingQueue();
578 mTrampoline.selectBackupTransportAsync(
579 TRANSPORT_COMPONENT_NAME,
580 new ISelectBackupTransportCallback() {
581 @Override
582 public void onSuccess(String transportName) throws RemoteException {
583
584 }
585
586 @Override
587 public void onFailure(int reason) throws RemoteException {
588 q.offer(reason);
589 }
590
591 @Override
592 public IBinder asBinder() {
593 return null;
594 }
595 });
Artem Iglikov6052ef52017-04-20 17:23:39 +0100596 verifyNoMoreInteractions(mBackupManagerServiceMock);
Tony Mak8b20b2c2017-05-02 14:15:10 +0100597 Integer errorCode = q.poll(5, TimeUnit.SECONDS);
598 assertNotNull(errorCode);
599 assertEquals(BackupManager.ERROR_BACKUP_NOT_ALLOWED, (int) errorCode);
Artem Iglikov6052ef52017-04-20 17:23:39 +0100600 }
601
602 @Test
Tony Mak2dd109d2017-05-04 11:42:31 +0100603 public void selectBackupTransportAsync_calledBeforeInitialize_ignored_nullListener()
604 throws Exception {
605 mTrampoline.selectBackupTransportAsync(TRANSPORT_COMPONENT_NAME, null);
606 verifyNoMoreInteractions(mBackupManagerServiceMock);
607 // No crash.
608 }
609
610 @Test
611 public void selectBackupTransportAsync_calledBeforeInitialize_ignored_listenerThrowException()
612 throws Exception {
613 mTrampoline.selectBackupTransportAsync(
614 TRANSPORT_COMPONENT_NAME,
615 new ISelectBackupTransportCallback() {
616 @Override
617 public void onSuccess(String transportName) throws RemoteException {
618
619 }
620
621 @Override
622 public void onFailure(int reason) throws RemoteException {
623 throw new RemoteException("Crash");
624 }
625
626 @Override
627 public IBinder asBinder() {
628 return null;
629 }
630 });
631 verifyNoMoreInteractions(mBackupManagerServiceMock);
632 // No crash.
633 }
634
635 @Test
Artem Iglikov6052ef52017-04-20 17:23:39 +0100636 public void selectBackupTransportAsync_forwarded() throws RemoteException {
637 mTrampoline.initialize(UserHandle.USER_SYSTEM);
638 mTrampoline.selectBackupTransportAsync(TRANSPORT_COMPONENT_NAME, null);
639 verify(mBackupManagerServiceMock).selectBackupTransportAsync(TRANSPORT_COMPONENT_NAME,
640 null);
641 }
642
643 @Test
644 public void getConfigurationIntent_calledBeforeInitialize_ignored() throws RemoteException {
645 mTrampoline.getConfigurationIntent(TRANSPORT_NAME);
646 verifyNoMoreInteractions(mBackupManagerServiceMock);
647 }
648
649 @Test
650 public void getConfigurationIntent_forwarded() throws RemoteException {
651 Intent configurationIntentStub = new Intent();
652 when(mBackupManagerServiceMock.getConfigurationIntent(TRANSPORT_NAME)).thenReturn(
653 configurationIntentStub);
654
655 mTrampoline.initialize(UserHandle.USER_SYSTEM);
656 assertEquals(configurationIntentStub, mTrampoline.getConfigurationIntent(TRANSPORT_NAME));
657 verify(mBackupManagerServiceMock).getConfigurationIntent(TRANSPORT_NAME);
658 }
659
660 @Test
661 public void getDestinationString_calledBeforeInitialize_ignored() throws RemoteException {
662 assertNull(mTrampoline.getDestinationString(TRANSPORT_NAME));
663 verifyNoMoreInteractions(mBackupManagerServiceMock);
664 }
665
666 @Test
667 public void getDestinationString_forwarded() throws RemoteException {
668 when(mBackupManagerServiceMock.getDestinationString(TRANSPORT_NAME)).thenReturn(
669 DESTINATION_STRING);
670
671 mTrampoline.initialize(UserHandle.USER_SYSTEM);
672 assertEquals(DESTINATION_STRING, mTrampoline.getDestinationString(TRANSPORT_NAME));
673 verify(mBackupManagerServiceMock).getDestinationString(TRANSPORT_NAME);
674 }
675
676 @Test
677 public void getDataManagementIntent_calledBeforeInitialize_ignored() throws RemoteException {
678 assertNull(mTrampoline.getDataManagementIntent(TRANSPORT_NAME));
679 verifyNoMoreInteractions(mBackupManagerServiceMock);
680 }
681
682 @Test
683 public void getDataManagementIntent_forwarded() throws RemoteException {
684 Intent dataManagementIntent = new Intent();
685 when(mBackupManagerServiceMock.getDataManagementIntent(TRANSPORT_NAME)).thenReturn(
686 dataManagementIntent);
687
688 mTrampoline.initialize(UserHandle.USER_SYSTEM);
689 assertEquals(dataManagementIntent, mTrampoline.getDataManagementIntent(TRANSPORT_NAME));
690 verify(mBackupManagerServiceMock).getDataManagementIntent(TRANSPORT_NAME);
691 }
692
693 @Test
694 public void getDataManagementLabel_calledBeforeInitialize_ignored() throws RemoteException {
695 assertNull(mTrampoline.getDataManagementLabel(TRANSPORT_NAME));
696 verifyNoMoreInteractions(mBackupManagerServiceMock);
697 }
698
699 @Test
700 public void getDataManagementLabel_forwarded() throws RemoteException {
701 when(mBackupManagerServiceMock.getDataManagementLabel(TRANSPORT_NAME)).thenReturn(
702 DATA_MANAGEMENT_LABEL);
703
704 mTrampoline.initialize(UserHandle.USER_SYSTEM);
705 assertEquals(DATA_MANAGEMENT_LABEL, mTrampoline.getDataManagementLabel(TRANSPORT_NAME));
706 verify(mBackupManagerServiceMock).getDataManagementLabel(TRANSPORT_NAME);
707 }
708
709 @Test
710 public void beginRestoreSession_calledBeforeInitialize_ignored() throws RemoteException {
711 mTrampoline.beginRestoreSession(PACKAGE_NAME, TRANSPORT_NAME);
712 verifyNoMoreInteractions(mBackupManagerServiceMock);
713 }
714
715 @Test
716 public void beginRestoreSession_forwarded() throws RemoteException {
717 mTrampoline.initialize(UserHandle.USER_SYSTEM);
718 mTrampoline.beginRestoreSession(PACKAGE_NAME, TRANSPORT_NAME);
719 verify(mBackupManagerServiceMock).beginRestoreSession(PACKAGE_NAME, TRANSPORT_NAME);
720 }
721
722 @Test
723 public void opComplete_calledBeforeInitialize_ignored() throws RemoteException {
724 mTrampoline.opComplete(1, 2);
725 verifyNoMoreInteractions(mBackupManagerServiceMock);
726 }
727
728 @Test
729 public void opComplete_forwarded() throws RemoteException {
730 mTrampoline.initialize(UserHandle.USER_SYSTEM);
731 mTrampoline.opComplete(1, 2);
732 verify(mBackupManagerServiceMock).opComplete(1, 2);
733 }
734
735 @Test
736 public void getAvailableRestoreToken_calledBeforeInitialize_ignored() throws RemoteException {
737 assertEquals(0, mTrampoline.getAvailableRestoreToken(PACKAGE_NAME));
738 verifyNoMoreInteractions(mBackupManagerServiceMock);
739 }
740
741 @Test
742 public void getAvailableRestoreToken_forwarded() throws RemoteException {
743 when(mBackupManagerServiceMock.getAvailableRestoreToken(PACKAGE_NAME)).thenReturn(123L);
744
745 mTrampoline.initialize(UserHandle.USER_SYSTEM);
746 assertEquals(123, mTrampoline.getAvailableRestoreToken(PACKAGE_NAME));
747 verify(mBackupManagerServiceMock).getAvailableRestoreToken(PACKAGE_NAME);
748 }
749
750 @Test
751 public void isAppEligibleForBackup_calledBeforeInitialize_ignored() throws RemoteException {
752 assertFalse(mTrampoline.isAppEligibleForBackup(PACKAGE_NAME));
753 verifyNoMoreInteractions(mBackupManagerServiceMock);
754 }
755
756 @Test
757 public void isAppEligibleForBackup_forwarded() throws RemoteException {
758 when(mBackupManagerServiceMock.isAppEligibleForBackup(PACKAGE_NAME)).thenReturn(true);
759
760 mTrampoline.initialize(UserHandle.USER_SYSTEM);
761 assertTrue(mTrampoline.isAppEligibleForBackup(PACKAGE_NAME));
762 verify(mBackupManagerServiceMock).isAppEligibleForBackup(PACKAGE_NAME);
763 }
764
Artem Iglikov6052ef52017-04-20 17:23:39 +0100765 @Test
766 public void requestBackup_calledBeforeInitialize_ignored() throws RemoteException {
Artem Iglikovc92eb462017-04-21 09:56:35 +0100767 assertEquals(BackupManager.ERROR_BACKUP_NOT_ALLOWED, mTrampoline.requestBackup(
768 PACKAGE_NAMES, mBackupObserverMock, mBackupManagerMonitorMock, 123));
Artem Iglikov6052ef52017-04-20 17:23:39 +0100769 verifyNoMoreInteractions(mBackupManagerServiceMock);
770 }
771
772 @Test
773 public void requestBackup_forwarded() throws RemoteException {
774 when(mBackupManagerServiceMock.requestBackup(PACKAGE_NAMES, mBackupObserverMock,
775 mBackupManagerMonitorMock, 123)).thenReturn(456);
776
777 mTrampoline.initialize(UserHandle.USER_SYSTEM);
778 assertEquals(456, mTrampoline.requestBackup(PACKAGE_NAMES, mBackupObserverMock,
779 mBackupManagerMonitorMock, 123));
780 verify(mBackupManagerServiceMock).requestBackup(PACKAGE_NAMES, mBackupObserverMock,
781 mBackupManagerMonitorMock, 123);
782 }
783
784 @Test
785 public void cancelBackups_calledBeforeInitialize_ignored() throws RemoteException {
786 mTrampoline.cancelBackups();
787 verifyNoMoreInteractions(mBackupManagerServiceMock);
788 }
789
790 @Test
791 public void cancelBackups_forwarded() throws RemoteException {
792 mTrampoline.initialize(UserHandle.USER_SYSTEM);
793 mTrampoline.cancelBackups();
794 verify(mBackupManagerServiceMock).cancelBackups();
795 }
796
797 @Test
798 public void beginFullBackup_calledBeforeInitialize_ignored() throws RemoteException {
799 mTrampoline.beginFullBackup(new FullBackupJob());
800 verifyNoMoreInteractions(mBackupManagerServiceMock);
801 }
802
803 @Test
804 public void beginFullBackup_forwarded() throws RemoteException {
805 FullBackupJob fullBackupJob = new FullBackupJob();
806 when(mBackupManagerServiceMock.beginFullBackup(fullBackupJob)).thenReturn(true);
807
808 mTrampoline.initialize(UserHandle.USER_SYSTEM);
809 assertTrue(mTrampoline.beginFullBackup(fullBackupJob));
810 verify(mBackupManagerServiceMock).beginFullBackup(fullBackupJob);
811 }
812
813 @Test
814 public void endFullBackup_calledBeforeInitialize_ignored() throws RemoteException {
815 mTrampoline.endFullBackup();
816 verifyNoMoreInteractions(mBackupManagerServiceMock);
817 }
818
819 @Test
820 public void endFullBackup_forwarded() throws RemoteException {
821 mTrampoline.initialize(UserHandle.USER_SYSTEM);
822 mTrampoline.endFullBackup();
823 verify(mBackupManagerServiceMock).endFullBackup();
824 }
825
Artem Iglikove5263c62017-04-21 13:23:16 +0100826 @Test
827 public void dump_callerDoesNotHavePermission_ignored() throws RemoteException {
828 when(mContextMock.checkCallingOrSelfPermission(
829 android.Manifest.permission.DUMP)).thenReturn(
830 PackageManager.PERMISSION_DENIED);
Artem Iglikov6052ef52017-04-20 17:23:39 +0100831
Artem Iglikove5263c62017-04-21 13:23:16 +0100832 mTrampoline.initialize(UserHandle.USER_SYSTEM);
833
834 mTrampoline.dump(mFileDescriptorStub, mPrintWriterMock, new String[0]);
835
836 verifyNoMoreInteractions(mBackupManagerServiceMock);
837 }
838
839 @Test
840 public void dump_calledBeforeInitialize_ignored() throws RemoteException {
841 when(mContextMock.checkCallingOrSelfPermission(
842 android.Manifest.permission.DUMP)).thenReturn(
843 PackageManager.PERMISSION_GRANTED);
844
845 mTrampoline.dump(mFileDescriptorStub, mPrintWriterMock, new String[0]);
846
847 verifyNoMoreInteractions(mBackupManagerServiceMock);
848 }
849
850 @Test
851 public void dump_callerHasPermission_forwarded() throws RemoteException {
852 when(mContextMock.checkCallingOrSelfPermission(
853 android.Manifest.permission.DUMP)).thenReturn(
854 PackageManager.PERMISSION_GRANTED);
855
856 mTrampoline.initialize(UserHandle.USER_SYSTEM);
857
858 mTrampoline.dump(mFileDescriptorStub, mPrintWriterMock, null);
859
860 verify(mBackupManagerServiceMock).dump(mFileDescriptorStub, mPrintWriterMock, null);
861 }
862
863 private static class TrampolineTestable extends Trampoline {
864 static boolean sBackupDisabled = false;
Artem Iglikove5263c62017-04-21 13:23:16 +0100865 static File sSuppressFile = null;
866 static int sCallingUid = -1;
Michal Karpinskife4ae0c2018-01-25 15:24:00 +0000867 static BackupManagerService sBackupManagerServiceMock = null;
Artem Iglikove5263c62017-04-21 13:23:16 +0100868 private int mCreateServiceCallsCount = 0;
869
870 TrampolineTestable(Context context) {
871 super(context);
Artem Iglikov6052ef52017-04-20 17:23:39 +0100872 }
873
874 @Override
Artem Iglikove5263c62017-04-21 13:23:16 +0100875 public boolean isBackupDisabled() {
876 return sBackupDisabled;
877 }
878
879 @Override
880 public File getSuppressFile() {
881 return sSuppressFile;
882 }
883
884 @Override
885 protected int binderGetCallingUid() {
886 return sCallingUid;
887 }
888
889 @Override
Michal Karpinskife4ae0c2018-01-25 15:24:00 +0000890 protected BackupManagerServiceInterface createBackupManagerService() {
Bernardo Rufino728dcea2017-11-30 16:17:26 +0000891 mCreateServiceCallsCount++;
Michal Karpinskife4ae0c2018-01-25 15:24:00 +0000892 return sBackupManagerServiceMock;
Artem Iglikove5263c62017-04-21 13:23:16 +0100893 }
894
Artem Iglikove5263c62017-04-21 13:23:16 +0100895 int getCreateServiceCallsCount() {
896 return mCreateServiceCallsCount;
Artem Iglikov6052ef52017-04-20 17:23:39 +0100897 }
898 }
899}