PerformInitializeTaskTest.java revision fe4ae0c5b1bc3b31adc4cc2c5a0197e29e97b6bc
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;
5279155590e67a30f520677d9d22e215365d595a73Bernardo Rufinoimport com.android.server.testing.SystemLoaderClasses;
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)
70fe4ae0c5b1bc3b31adc4cc2c5a0197e29e97b6bcMichal Karpinski@SystemLoaderClasses({
71fe4ae0c5b1bc3b31adc4cc2c5a0197e29e97b6bcMichal Karpinski    BackupManagerService.class,
72fe4ae0c5b1bc3b31adc4cc2c5a0197e29e97b6bcMichal Karpinski    PerformInitializeTaskTest.class,
73fe4ae0c5b1bc3b31adc4cc2c5a0197e29e97b6bcMichal Karpinski    TransportManager.class
74fe4ae0c5b1bc3b31adc4cc2c5a0197e29e97b6bcMichal Karpinski})
7579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino@Presubmit
7679155590e67a30f520677d9d22e215365d595a73Bernardo Rufinopublic class PerformInitializeTaskTest {
77fe4ae0c5b1bc3b31adc4cc2c5a0197e29e97b6bcMichal Karpinski    @Mock private BackupManagerService mBackupManagerService;
7879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    @Mock private TransportManager mTransportManager;
7979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    @Mock private OnTaskFinishedListener mListener;
8041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino    @Mock private IBackupTransport mTransportBinder;
8179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    @Mock private IBackupObserver mObserver;
8279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    @Mock private AlarmManager mAlarmManager;
8379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    @Mock private PendingIntent mRunInitIntent;
8479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    private File mBaseStateDir;
8541349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino    private TransportData mTransport;
8641349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino    private String mTransportName;
8779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
8879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    @Before
8979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    public void setUp() throws Exception {
9079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        MockitoAnnotations.initMocks(this);
9179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
9241349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        mTransport = backupTransport();
9341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        mTransportName = mTransport.transportName;
9441349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino
9579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        Application context = RuntimeEnvironment.application;
9679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        mBaseStateDir = new File(context.getCacheDir(), "base_state_dir");
9779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        assertThat(mBaseStateDir.mkdir()).isTrue();
9879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
9979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        when(mBackupManagerService.getAlarmManager()).thenReturn(mAlarmManager);
10079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        when(mBackupManagerService.getRunInitIntent()).thenReturn(mRunInitIntent);
10179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    }
10279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
10379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    @Test
10479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    public void testRun_callsTransportCorrectly() throws Exception {
10541349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        setUpTransport(mTransport);
10641349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        configureTransport(mTransportBinder, TRANSPORT_OK, TRANSPORT_OK);
10741349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName);
10879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
10979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        performInitializeTask.run();
11079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
11141349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        verify(mTransportBinder).initializeDevice();
11241349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        verify(mTransportBinder).finishBackup();
11379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    }
11479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
11579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    @Test
11679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    public void testRun_callsBackupManagerCorrectly() throws Exception {
11741349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        setUpTransport(mTransport);
11841349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        configureTransport(mTransportBinder, TRANSPORT_OK, TRANSPORT_OK);
11941349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName);
12079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
12179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        performInitializeTask.run();
12279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
12379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mBackupManagerService)
12441349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                .recordInitPending(false, mTransportName, mTransport.transportDirName);
12579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mBackupManagerService)
12641349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                .resetBackupState(eq(new File(mBaseStateDir, mTransport.transportDirName)));
12779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    }
12879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
12979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    @Test
13079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    public void testRun_callsObserverAndListenerCorrectly() throws Exception {
13141349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        setUpTransport(mTransport);
13241349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        configureTransport(mTransportBinder, TRANSPORT_OK, TRANSPORT_OK);
13341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName);
13479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
13579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        performInitializeTask.run();
13679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
13741349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        verify(mObserver).onResult(eq(mTransportName), eq(TRANSPORT_OK));
13879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mObserver).backupFinished(eq(TRANSPORT_OK));
13979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mListener).onFinished(any());
14079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    }
14179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
14279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    @Test
14379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    public void testRun_whenInitializeDeviceFails() throws Exception {
14441349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        setUpTransport(mTransport);
14541349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        configureTransport(mTransportBinder, TRANSPORT_ERROR, 0);
14641349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName);
14779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
14879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        performInitializeTask.run();
14979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
15041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        verify(mTransportBinder).initializeDevice();
15141349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        verify(mTransportBinder, never()).finishBackup();
15279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mBackupManagerService)
15341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                .recordInitPending(true, mTransportName, mTransport.transportDirName);
15479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    }
15579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
15679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    @Test
15779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    public void testRun_whenInitializeDeviceFails_callsObserverAndListenerCorrectly()
15879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino            throws Exception {
15941349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        setUpTransport(mTransport);
16041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        configureTransport(mTransportBinder, TRANSPORT_ERROR, 0);
16141349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName);
16279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
16379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        performInitializeTask.run();
16479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
16541349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        verify(mObserver).onResult(eq(mTransportName), eq(TRANSPORT_ERROR));
16679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mObserver).backupFinished(eq(TRANSPORT_ERROR));
16779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mListener).onFinished(any());
16879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    }
16979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
17079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    @Test
17179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    public void testRun_whenInitializeDeviceFails_schedulesAlarm() throws Exception {
17241349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        setUpTransport(mTransport);
17341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        configureTransport(mTransportBinder, TRANSPORT_ERROR, 0);
17441349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName);
17579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
17679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        performInitializeTask.run();
17779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
17879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mAlarmManager).set(anyInt(), anyLong(), eq(mRunInitIntent));
17979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    }
18079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
18179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    @Test
18279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    public void testRun_whenFinishBackupFails() throws Exception {
18341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        setUpTransport(mTransport);
18441349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        configureTransport(mTransportBinder, TRANSPORT_OK, TRANSPORT_ERROR);
18541349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName);
18679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
18779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        performInitializeTask.run();
18879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
18941349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        verify(mTransportBinder).initializeDevice();
19041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        verify(mTransportBinder).finishBackup();
19179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mBackupManagerService)
19241349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                .recordInitPending(true, mTransportName, mTransport.transportDirName);
19379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    }
19479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
19579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    @Test
19679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    public void testRun_whenFinishBackupFails_callsObserverAndListenerCorrectly() throws Exception {
19741349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        setUpTransport(mTransport);
19841349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        configureTransport(mTransportBinder, TRANSPORT_OK, TRANSPORT_ERROR);
19941349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName);
20079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
20179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        performInitializeTask.run();
20279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
20341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        verify(mObserver).onResult(eq(mTransportName), eq(TRANSPORT_ERROR));
20479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mObserver).backupFinished(eq(TRANSPORT_ERROR));
20579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mListener).onFinished(any());
20679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    }
20779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
20879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    @Test
20979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    public void testRun_whenFinishBackupFails_schedulesAlarm() throws Exception {
21041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        setUpTransport(mTransport);
21141349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        configureTransport(mTransportBinder, TRANSPORT_OK, TRANSPORT_ERROR);
21241349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName);
21379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
21479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        performInitializeTask.run();
21579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
21679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mAlarmManager).set(anyInt(), anyLong(), eq(mRunInitIntent));
21779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    }
21879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
21979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    @Test
22079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    public void testRun_whenOnlyOneTransportFails() throws Exception {
22141349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        TransportData transport1 = backupTransport();
22241349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        TransportData transport2 = d2dTransport();
22341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        List<TransportMock> transportMocks =
22441349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                setUpTransports(mTransportManager, transport1, transport2);
22541349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        configureTransport(transportMocks.get(0).transport, TRANSPORT_ERROR, 0);
22641349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        configureTransport(transportMocks.get(1).transport, TRANSPORT_OK, TRANSPORT_OK);
22779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        PerformInitializeTask performInitializeTask =
22841349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                createPerformInitializeTask(transport1.transportName, transport2.transportName);
22979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
23079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        performInitializeTask.run();
23179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
23241349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        verify(transportMocks.get(1).transport).initializeDevice();
23341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        verify(mObserver).onResult(eq(transport1.transportName), eq(TRANSPORT_ERROR));
23441349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        verify(mObserver).onResult(eq(transport2.transportName), eq(TRANSPORT_OK));
23579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mObserver).backupFinished(eq(TRANSPORT_ERROR));
23679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    }
23779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
23879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    @Test
23979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    public void testRun_withMultipleTransports() throws Exception {
24041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        List<TransportMock> transportMocks =
24141349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                setUpTransports(
24241349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                        mTransportManager, backupTransport(), d2dTransport(), localTransport());
24341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        configureTransport(transportMocks.get(0).transport, TRANSPORT_OK, TRANSPORT_OK);
24441349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        configureTransport(transportMocks.get(1).transport, TRANSPORT_OK, TRANSPORT_OK);
24541349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        configureTransport(transportMocks.get(2).transport, TRANSPORT_OK, TRANSPORT_OK);
24641349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        String[] transportNames =
24741349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                Stream.of(new TransportData[] {backupTransport(), d2dTransport(), localTransport()})
24841349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                        .map(t -> t.transportName)
24941349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                        .toArray(String[]::new);
25041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        PerformInitializeTask performInitializeTask = createPerformInitializeTask(transportNames);
25179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
25279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        performInitializeTask.run();
25379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
25441349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        Iterator<TransportData> transportsIterator =
25541349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                Arrays.asList(
25641349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                                new TransportData[] {
25741349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                                    backupTransport(), d2dTransport(), localTransport()
25841349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                                })
25941349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                        .iterator();
26041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        for (TransportMock transportMock : transportMocks) {
26141349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino            TransportData transport = transportsIterator.next();
26279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino            verify(mTransportManager).getTransportClient(eq(transport.transportName), any());
26379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino            verify(mTransportManager)
26441349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                    .disposeOfTransportClient(eq(transportMock.transportClient), any());
26579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        }
26679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    }
26779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
26879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    @Test
26979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    public void testRun_whenOnlyOneTransportFails_disposesAllTransports() throws Exception {
27041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        TransportData transport1 = backupTransport();
27141349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        TransportData transport2 = d2dTransport();
27241349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        List<TransportMock> transportMocks =
27341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                setUpTransports(mTransportManager, transport1, transport2);
27441349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        configureTransport(transportMocks.get(0).transport, TRANSPORT_ERROR, 0);
27541349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        configureTransport(transportMocks.get(1).transport, TRANSPORT_OK, TRANSPORT_OK);
27679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        PerformInitializeTask performInitializeTask =
27741349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                createPerformInitializeTask(transport1.transportName, transport2.transportName);
27879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
27979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        performInitializeTask.run();
28079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
28179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mTransportManager)
28241349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                .disposeOfTransportClient(eq(transportMocks.get(0).transportClient), any());
28379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mTransportManager)
28441349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                .disposeOfTransportClient(eq(transportMocks.get(1).transportClient), any());
28579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    }
28679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
28779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    @Test
28879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    public void testRun_whenTransportNotRegistered() throws Exception {
28941349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        setUpTransports(mTransportManager, mTransport.unregistered());
29041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName);
29179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
29279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        performInitializeTask.run();
29379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
29479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mTransportManager, never()).disposeOfTransportClient(any(), any());
29579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mObserver, never()).onResult(any(), anyInt());
29679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mObserver).backupFinished(eq(TRANSPORT_OK));
29779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    }
29879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
29979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    @Test
30079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    public void testRun_whenOnlyOneTransportNotRegistered() throws Exception {
30141349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        TransportData transport1 = backupTransport().unregistered();
30241349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        TransportData transport2 = d2dTransport();
30341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        List<TransportMock> transportMocks =
30441349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                setUpTransports(mTransportManager, transport1, transport2);
30541349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        String registeredTransportName = transport2.transportName;
30641349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        IBackupTransport registeredTransport = transportMocks.get(1).transport;
30741349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        TransportClient registeredTransportClient = transportMocks.get(1).transportClient;
30879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        PerformInitializeTask performInitializeTask =
30941349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                createPerformInitializeTask(transport1.transportName, transport2.transportName);
31079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
31179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        performInitializeTask.run();
31279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
31379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(registeredTransport).initializeDevice();
31479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mTransportManager).disposeOfTransportClient(eq(registeredTransportClient), any());
31579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mObserver).onResult(eq(registeredTransportName), eq(TRANSPORT_OK));
31679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    }
31779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
31879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    @Test
31979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    public void testRun_whenTransportNotAvailable() throws Exception {
32041349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        TransportMock transportMock = setUpTransport(mTransport.unavailable());
32141349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName);
32279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
32379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        performInitializeTask.run();
32479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
32541349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        verify(mTransportManager)
32641349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                .disposeOfTransportClient(eq(transportMock.transportClient), any());
32779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mObserver).backupFinished(eq(TRANSPORT_ERROR));
32879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mListener).onFinished(any());
32979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    }
33079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
33179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    @Test
33279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    public void testRun_whenTransportThrowsDeadObjectException() throws Exception {
33341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        TransportMock transportMock = setUpTransport(mTransport);
33441349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        IBackupTransport transport = transportMock.transport;
33541349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        TransportClient transportClient = transportMock.transportClient;
33641349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        when(transport.initializeDevice()).thenThrow(DeadObjectException.class);
33741349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName);
33879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
33979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        performInitializeTask.run();
34079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
34179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mTransportManager).disposeOfTransportClient(eq(transportClient), any());
34279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mObserver).backupFinished(eq(TRANSPORT_ERROR));
34379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        verify(mListener).onFinished(any());
34479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    }
34579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
34679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    private PerformInitializeTask createPerformInitializeTask(String... transportNames) {
34779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        return new PerformInitializeTask(
34879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino                mBackupManagerService,
34979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino                mTransportManager,
35079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino                transportNames,
35179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino                mObserver,
35279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino                mListener,
35379155590e67a30f520677d9d22e215365d595a73Bernardo Rufino                mBaseStateDir);
35479155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    }
35579155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
35679155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    private void configureTransport(
35779155590e67a30f520677d9d22e215365d595a73Bernardo Rufino            IBackupTransport transportMock, int initializeDeviceStatus, int finishBackupStatus)
35879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino            throws Exception {
35979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        when(transportMock.initializeDevice()).thenReturn(initializeDeviceStatus);
36079155590e67a30f520677d9d22e215365d595a73Bernardo Rufino        when(transportMock.finishBackup()).thenReturn(finishBackupStatus);
36179155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    }
36279155590e67a30f520677d9d22e215365d595a73Bernardo Rufino
36341349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino    private TransportMock setUpTransport(TransportData transport) throws Exception {
36441349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        TransportMock transportMock =
36541349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino                TransportTestUtils.setUpTransport(mTransportManager, transport);
36641349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        mTransportBinder = transportMock.transport;
36741349c02a8867b956ff48752c2d3dffc124fc0fcBernardo Rufino        return transportMock;
36879155590e67a30f520677d9d22e215365d595a73Bernardo Rufino    }
36979155590e67a30f520677d9d22e215365d595a73Bernardo Rufino}
370