179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino/* 279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino * Copyright (C) 2017 The Android Open Source Project 379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino * 479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino * Licensed under the Apache License, Version 2.0 (the "License"); 579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino * you may not use this file except in compliance with the License. 679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino * You may obtain a copy of the License at 779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino * 879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino * http://www.apache.org/licenses/LICENSE-2.0 979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino * 1079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino * Unless required by applicable law or agreed to in writing, software 1179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino * distributed under the License is distributed on an "AS IS" BASIS, 1279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino * See the License for the specific language governing permissions and 1479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino * limitations under the License 1579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino */ 1679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 1779155590e67a30f520677d9d22e215365d595a73Bernardo Rufinopackage com.android.server.backup.internal; 1879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 1979155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport static android.app.backup.BackupTransport.TRANSPORT_ERROR; 2079155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport static android.app.backup.BackupTransport.TRANSPORT_OK; 2179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 2241349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufinoimport static com.android.server.backup.testing.TransportData.backupTransport; 2341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufinoimport static com.android.server.backup.testing.TransportData.d2dTransport; 2441349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufinoimport static com.android.server.backup.testing.TransportData.localTransport; 2541349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufinoimport static com.android.server.backup.testing.TransportTestUtils.setUpTransports; 26fa51853ae56ed74a0c854c01851cb1435453005fBernardo Rufino 2779155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport static com.google.common.truth.Truth.assertThat; 2879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 2979155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport static org.mockito.ArgumentMatchers.any; 3079155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport static org.mockito.ArgumentMatchers.anyInt; 3179155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport static org.mockito.ArgumentMatchers.anyLong; 3279155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport static org.mockito.ArgumentMatchers.eq; 3379155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport static org.mockito.Mockito.never; 3479155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport static org.mockito.Mockito.verify; 3579155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport static org.mockito.Mockito.when; 3679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 3779155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport android.app.AlarmManager; 3879155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport android.app.Application; 3979155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport android.app.PendingIntent; 4079155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport android.app.backup.IBackupObserver; 4179155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport android.os.DeadObjectException; 4279155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport android.platform.test.annotations.Presubmit; 4379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 4479155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport com.android.internal.backup.IBackupTransport; 45fe4ae0c5b1bc3b31adc4cc2c5a0197e29e97b6bcMichal Karpinskiimport com.android.server.backup.BackupManagerService; 4679155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport com.android.server.backup.TransportManager; 47fa51853ae56ed74a0c854c01851cb1435453005fBernardo Rufinoimport com.android.server.backup.testing.TransportTestUtils; 4841349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufinoimport com.android.server.backup.testing.TransportData; 4941349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufinoimport com.android.server.backup.testing.TransportTestUtils.TransportMock; 5079155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport com.android.server.backup.transport.TransportClient; 5179155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport com.android.server.testing.FrameworkRobolectricTestRunner; 5203b767733c3efea4bcb0f57122a809091966d90dBernardo Rufinoimport com.android.server.testing.SystemLoaderPackages; 5379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 5479155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport org.junit.Before; 5579155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport org.junit.Test; 5679155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport org.junit.runner.RunWith; 5779155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport org.mockito.Mock; 5879155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport org.mockito.MockitoAnnotations; 5979155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport org.robolectric.RuntimeEnvironment; 6079155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport org.robolectric.annotation.Config; 6179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 6279155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport java.io.File; 6341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufinoimport java.util.Arrays; 6441349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufinoimport java.util.Iterator; 6579155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport java.util.List; 6641349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufinoimport java.util.stream.Stream; 6779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 6879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino@RunWith(FrameworkRobolectricTestRunner.class) 6979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino@Config(manifest = Config.NONE, sdk = 26) 7003b767733c3efea4bcb0f57122a809091966d90dBernardo Rufino@SystemLoaderPackages({"com.android.server.backup"}) 7179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino@Presubmit 7279155590e67a30f520677d9d22e215365d595a73Bernardo Rufinopublic class PerformInitializeTaskTest { 73fe4ae0c5b1bc3b31adc4cc2c5a0197e29e97b6bcMichal Karpinski @Mock private BackupManagerService mBackupManagerService; 7479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino @Mock private TransportManager mTransportManager; 7579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino @Mock private OnTaskFinishedListener mListener; 7641349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino @Mock private IBackupTransport mTransportBinder; 7779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino @Mock private IBackupObserver mObserver; 7879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino @Mock private AlarmManager mAlarmManager; 7979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino @Mock private PendingIntent mRunInitIntent; 8079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino private File mBaseStateDir; 8141349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino private TransportData mTransport; 8241349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino private String mTransportName; 8379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 8479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino @Before 8579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino public void setUp() throws Exception { 8679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino MockitoAnnotations.initMocks(this); 8779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 8841349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino mTransport = backupTransport(); 8941349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino mTransportName = mTransport.transportName; 9041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino 9179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino Application context = RuntimeEnvironment.application; 9279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino mBaseStateDir = new File(context.getCacheDir(), "base_state_dir"); 9379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino assertThat(mBaseStateDir.mkdir()).isTrue(); 9479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 9579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino when(mBackupManagerService.getAlarmManager()).thenReturn(mAlarmManager); 9679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino when(mBackupManagerService.getRunInitIntent()).thenReturn(mRunInitIntent); 9779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino } 9879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 9979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino @Test 10079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino public void testRun_callsTransportCorrectly() throws Exception { 10141349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino setUpTransport(mTransport); 10241349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino configureTransport(mTransportBinder, TRANSPORT_OK, TRANSPORT_OK); 10341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName); 10479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 10579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino performInitializeTask.run(); 10679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 10741349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino verify(mTransportBinder).initializeDevice(); 10841349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino verify(mTransportBinder).finishBackup(); 10979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino } 11079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 11179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino @Test 11279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino public void testRun_callsBackupManagerCorrectly() throws Exception { 11341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino setUpTransport(mTransport); 11441349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino configureTransport(mTransportBinder, TRANSPORT_OK, TRANSPORT_OK); 11541349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName); 11679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 11779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino performInitializeTask.run(); 11879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 11979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mBackupManagerService) 12041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino .recordInitPending(false, mTransportName, mTransport.transportDirName); 12179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mBackupManagerService) 12241349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino .resetBackupState(eq(new File(mBaseStateDir, mTransport.transportDirName))); 12379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino } 12479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 12579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino @Test 12679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino public void testRun_callsObserverAndListenerCorrectly() throws Exception { 12741349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino setUpTransport(mTransport); 12841349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino configureTransport(mTransportBinder, TRANSPORT_OK, TRANSPORT_OK); 12941349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName); 13079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 13179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino performInitializeTask.run(); 13279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 13341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino verify(mObserver).onResult(eq(mTransportName), eq(TRANSPORT_OK)); 13479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mObserver).backupFinished(eq(TRANSPORT_OK)); 13579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mListener).onFinished(any()); 13679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino } 13779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 13879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino @Test 13979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino public void testRun_whenInitializeDeviceFails() throws Exception { 14041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino setUpTransport(mTransport); 14141349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino configureTransport(mTransportBinder, TRANSPORT_ERROR, 0); 14241349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName); 14379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 14479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino performInitializeTask.run(); 14579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 14641349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino verify(mTransportBinder).initializeDevice(); 14741349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino verify(mTransportBinder, never()).finishBackup(); 14879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mBackupManagerService) 14941349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino .recordInitPending(true, mTransportName, mTransport.transportDirName); 15079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino } 15179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 15279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino @Test 15379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino public void testRun_whenInitializeDeviceFails_callsObserverAndListenerCorrectly() 15479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino throws Exception { 15541349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino setUpTransport(mTransport); 15641349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino configureTransport(mTransportBinder, TRANSPORT_ERROR, 0); 15741349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName); 15879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 15979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino performInitializeTask.run(); 16079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 16141349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino verify(mObserver).onResult(eq(mTransportName), eq(TRANSPORT_ERROR)); 16279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mObserver).backupFinished(eq(TRANSPORT_ERROR)); 16379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mListener).onFinished(any()); 16479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino } 16579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 16679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino @Test 16779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino public void testRun_whenInitializeDeviceFails_schedulesAlarm() throws Exception { 16841349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino setUpTransport(mTransport); 16941349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino configureTransport(mTransportBinder, TRANSPORT_ERROR, 0); 17041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName); 17179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 17279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino performInitializeTask.run(); 17379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 17479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mAlarmManager).set(anyInt(), anyLong(), eq(mRunInitIntent)); 17579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino } 17679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 17779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino @Test 17879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino public void testRun_whenFinishBackupFails() throws Exception { 17941349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino setUpTransport(mTransport); 18041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino configureTransport(mTransportBinder, TRANSPORT_OK, TRANSPORT_ERROR); 18141349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName); 18279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 18379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino performInitializeTask.run(); 18479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 18541349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino verify(mTransportBinder).initializeDevice(); 18641349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino verify(mTransportBinder).finishBackup(); 18779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mBackupManagerService) 18841349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino .recordInitPending(true, mTransportName, mTransport.transportDirName); 18979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino } 19079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 19179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino @Test 19279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino public void testRun_whenFinishBackupFails_callsObserverAndListenerCorrectly() throws Exception { 19341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino setUpTransport(mTransport); 19441349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino configureTransport(mTransportBinder, TRANSPORT_OK, TRANSPORT_ERROR); 19541349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName); 19679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 19779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino performInitializeTask.run(); 19879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 19941349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino verify(mObserver).onResult(eq(mTransportName), eq(TRANSPORT_ERROR)); 20079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mObserver).backupFinished(eq(TRANSPORT_ERROR)); 20179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mListener).onFinished(any()); 20279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino } 20379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 20479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino @Test 20579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino public void testRun_whenFinishBackupFails_schedulesAlarm() throws Exception { 20641349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino setUpTransport(mTransport); 20741349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino configureTransport(mTransportBinder, TRANSPORT_OK, TRANSPORT_ERROR); 20841349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName); 20979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 21079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino performInitializeTask.run(); 21179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 21279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mAlarmManager).set(anyInt(), anyLong(), eq(mRunInitIntent)); 21379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino } 21479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 21579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino @Test 21679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino public void testRun_whenOnlyOneTransportFails() throws Exception { 21741349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino TransportData transport1 = backupTransport(); 21841349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino TransportData transport2 = d2dTransport(); 21941349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino List<TransportMock> transportMocks = 22041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino setUpTransports(mTransportManager, transport1, transport2); 22141349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino configureTransport(transportMocks.get(0).transport, TRANSPORT_ERROR, 0); 22241349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino configureTransport(transportMocks.get(1).transport, TRANSPORT_OK, TRANSPORT_OK); 22379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino PerformInitializeTask performInitializeTask = 22441349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino createPerformInitializeTask(transport1.transportName, transport2.transportName); 22579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 22679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino performInitializeTask.run(); 22779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 22841349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino verify(transportMocks.get(1).transport).initializeDevice(); 22941349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino verify(mObserver).onResult(eq(transport1.transportName), eq(TRANSPORT_ERROR)); 23041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino verify(mObserver).onResult(eq(transport2.transportName), eq(TRANSPORT_OK)); 23179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mObserver).backupFinished(eq(TRANSPORT_ERROR)); 23279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino } 23379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 23479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino @Test 23579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino public void testRun_withMultipleTransports() throws Exception { 23641349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino List<TransportMock> transportMocks = 23741349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino setUpTransports( 23841349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino mTransportManager, backupTransport(), d2dTransport(), localTransport()); 23941349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino configureTransport(transportMocks.get(0).transport, TRANSPORT_OK, TRANSPORT_OK); 24041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino configureTransport(transportMocks.get(1).transport, TRANSPORT_OK, TRANSPORT_OK); 24141349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino configureTransport(transportMocks.get(2).transport, TRANSPORT_OK, TRANSPORT_OK); 24241349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino String[] transportNames = 24341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino Stream.of(new TransportData[] {backupTransport(), d2dTransport(), localTransport()}) 24441349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino .map(t -> t.transportName) 24541349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino .toArray(String[]::new); 24641349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino PerformInitializeTask performInitializeTask = createPerformInitializeTask(transportNames); 24779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 24879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino performInitializeTask.run(); 24979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 25041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino Iterator<TransportData> transportsIterator = 25141349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino Arrays.asList( 25241349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino new TransportData[] { 25341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino backupTransport(), d2dTransport(), localTransport() 25441349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino }) 25541349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino .iterator(); 25641349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino for (TransportMock transportMock : transportMocks) { 25741349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino TransportData transport = transportsIterator.next(); 25879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mTransportManager).getTransportClient(eq(transport.transportName), any()); 25979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mTransportManager) 26041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino .disposeOfTransportClient(eq(transportMock.transportClient), any()); 26179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino } 26279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino } 26379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 26479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino @Test 26579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino public void testRun_whenOnlyOneTransportFails_disposesAllTransports() throws Exception { 26641349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino TransportData transport1 = backupTransport(); 26741349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino TransportData transport2 = d2dTransport(); 26841349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino List<TransportMock> transportMocks = 26941349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino setUpTransports(mTransportManager, transport1, transport2); 27041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino configureTransport(transportMocks.get(0).transport, TRANSPORT_ERROR, 0); 27141349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino configureTransport(transportMocks.get(1).transport, TRANSPORT_OK, TRANSPORT_OK); 27279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino PerformInitializeTask performInitializeTask = 27341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino createPerformInitializeTask(transport1.transportName, transport2.transportName); 27479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 27579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino performInitializeTask.run(); 27679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 27779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mTransportManager) 27841349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino .disposeOfTransportClient(eq(transportMocks.get(0).transportClient), any()); 27979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mTransportManager) 28041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino .disposeOfTransportClient(eq(transportMocks.get(1).transportClient), any()); 28179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino } 28279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 28379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino @Test 28479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino public void testRun_whenTransportNotRegistered() throws Exception { 28541349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino setUpTransports(mTransportManager, mTransport.unregistered()); 28641349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName); 28779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 28879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino performInitializeTask.run(); 28979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 29079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mTransportManager, never()).disposeOfTransportClient(any(), any()); 29179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mObserver, never()).onResult(any(), anyInt()); 29279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mObserver).backupFinished(eq(TRANSPORT_OK)); 29379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino } 29479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 29579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino @Test 29679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino public void testRun_whenOnlyOneTransportNotRegistered() throws Exception { 29741349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino TransportData transport1 = backupTransport().unregistered(); 29841349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino TransportData transport2 = d2dTransport(); 29941349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino List<TransportMock> transportMocks = 30041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino setUpTransports(mTransportManager, transport1, transport2); 30141349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino String registeredTransportName = transport2.transportName; 30241349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino IBackupTransport registeredTransport = transportMocks.get(1).transport; 30341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino TransportClient registeredTransportClient = transportMocks.get(1).transportClient; 30479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino PerformInitializeTask performInitializeTask = 30541349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino createPerformInitializeTask(transport1.transportName, transport2.transportName); 30679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 30779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino performInitializeTask.run(); 30879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 30979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(registeredTransport).initializeDevice(); 31079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mTransportManager).disposeOfTransportClient(eq(registeredTransportClient), any()); 31179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mObserver).onResult(eq(registeredTransportName), eq(TRANSPORT_OK)); 31279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino } 31379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 31479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino @Test 31579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino public void testRun_whenTransportNotAvailable() throws Exception { 31641349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino TransportMock transportMock = setUpTransport(mTransport.unavailable()); 31741349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName); 31879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 31979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino performInitializeTask.run(); 32079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 32141349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino verify(mTransportManager) 32241349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino .disposeOfTransportClient(eq(transportMock.transportClient), any()); 32379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mObserver).backupFinished(eq(TRANSPORT_ERROR)); 32479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mListener).onFinished(any()); 32579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino } 32679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 32779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino @Test 32879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino public void testRun_whenTransportThrowsDeadObjectException() throws Exception { 32941349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino TransportMock transportMock = setUpTransport(mTransport); 33041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino IBackupTransport transport = transportMock.transport; 33141349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino TransportClient transportClient = transportMock.transportClient; 33241349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino when(transport.initializeDevice()).thenThrow(DeadObjectException.class); 33341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName); 33479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 33579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino performInitializeTask.run(); 33679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 33779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mTransportManager).disposeOfTransportClient(eq(transportClient), any()); 33879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mObserver).backupFinished(eq(TRANSPORT_ERROR)); 33979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino verify(mListener).onFinished(any()); 34079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino } 34179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 34279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino private PerformInitializeTask createPerformInitializeTask(String... transportNames) { 34379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino return new PerformInitializeTask( 34479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino mBackupManagerService, 34579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino mTransportManager, 34679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino transportNames, 34779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino mObserver, 34879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino mListener, 34979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino mBaseStateDir); 35079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino } 35179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 35279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino private void configureTransport( 35379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino IBackupTransport transportMock, int initializeDeviceStatus, int finishBackupStatus) 35479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino throws Exception { 35579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino when(transportMock.initializeDevice()).thenReturn(initializeDeviceStatus); 35679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino when(transportMock.finishBackup()).thenReturn(finishBackupStatus); 35779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino } 35879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino 35941349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino private TransportMock setUpTransport(TransportData transport) throws Exception { 36041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino TransportMock transportMock = 36141349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino TransportTestUtils.setUpTransport(mTransportManager, transport); 36241349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino mTransportBinder = transportMock.transport; 36341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino return transportMock; 36479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino } 36579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino} 366