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