1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.android.settings.backup;
18
19import static com.google.common.truth.Truth.assertThat;
20import static org.mockito.Mockito.anyInt;
21import static org.mockito.Mockito.anyString;
22import static org.mockito.Mockito.mock;
23import static org.mockito.Mockito.spy;
24import static org.mockito.Mockito.verify;
25import static org.mockito.Mockito.when;
26
27import android.app.backup.BackupManager;
28import android.app.backup.IBackupManager;
29import android.content.ComponentName;
30import android.content.Context;
31import android.content.Intent;
32import android.content.pm.PackageManager;
33import android.content.res.Resources;
34import android.os.IBinder;
35import android.os.RemoteException;
36
37import com.android.settings.R;
38import com.android.settings.testutils.SettingsRobolectricTestRunner;
39
40import org.junit.Before;
41import org.junit.Test;
42import org.junit.runner.RunWith;
43import org.mockito.Mock;
44import org.mockito.MockitoAnnotations;
45import org.robolectric.RuntimeEnvironment;
46import org.robolectric.annotation.Config;
47import org.robolectric.annotation.Implementation;
48import org.robolectric.annotation.Implements;
49
50@RunWith(SettingsRobolectricTestRunner.class)
51@Config(shadows = BackupSettingsHelperTest.ShadowBackupManagerStub.class)
52public class BackupSettingsHelperTest {
53
54    private static final String DEFAULT_SETTINGS_CLASSNAME =
55            "com.android.settings.Settings$PrivacySettingsActivity";
56
57    private static final int DEFAULT_SUMMARY_RESOURCE =
58            R.string.backup_configure_account_default_summary;
59
60    private static final int DEFAULT_LABEL_RESOURCE =
61            R.string.privacy_settings_title;
62
63    private static final int MANUFACTURER_INTENT_RESOURCE = R.string.config_backup_settings_intent;
64
65    private static final int MANUFACTURER_LABEL_RESOURCE = R.string.config_backup_settings_label;
66
67    private Context mContext;
68
69    private BackupSettingsHelper mBackupSettingsHelper;
70
71    @Mock
72    private static IBackupManager mBackupManager;
73
74    @Before
75    public void setUp() throws Exception {
76        MockitoAnnotations.initMocks(this);
77        mContext = spy(RuntimeEnvironment.application.getApplicationContext());
78        when(mBackupManager.getCurrentTransport()).thenReturn("test_transport");
79        mBackupSettingsHelper = new BackupSettingsHelper(mContext);
80    }
81
82    @Test
83    public void testGetIntentFromBackupTransport() throws Exception {
84        Intent intent = new Intent();
85
86        when(mBackupManager.getDataManagementIntent(anyString())).thenReturn(intent);
87
88        Intent backupIntent = mBackupSettingsHelper.getIntentForBackupSettingsFromTransport();
89
90        assertThat(backupIntent).isEqualTo(intent);
91
92        verify(mBackupManager).getDataManagementIntent(anyString());
93    }
94
95    @Test
96    public void testGetIntentFromBackupTransport_WithIntent() throws Exception {
97        Intent intent = mock(Intent.class);
98
99        when(mBackupManager.getDataManagementIntent(anyString())).thenReturn(intent);
100
101        Intent backupIntent = mBackupSettingsHelper.getIntentForBackupSettingsFromTransport();
102
103        assertThat(backupIntent).isEqualTo(intent);
104    }
105
106    @Test
107    public void testGetIntentFromBackupTransport_WithNullIntent() throws Exception {
108        when(mBackupManager.getDataManagementIntent(anyString())).thenReturn(null);
109
110        Intent backupIntent = mBackupSettingsHelper.getIntentForBackupSettingsFromTransport();
111
112        assertThat(backupIntent).isNull();
113    }
114
115    @Test
116    public void testGetIntentFromBackupTransport_RemoteException() throws Exception {
117        when(mBackupManager.getDataManagementIntent(anyString())).thenThrow(new RemoteException());
118
119        Intent backupIntent = mBackupSettingsHelper.getIntentForBackupSettingsFromTransport();
120
121        assertThat(backupIntent).isNull();
122    }
123
124    @Test
125    public void testGetIntentFromBackupTransport_BackupEnabled() throws Exception {
126        Intent intent = new Intent("test_intent");
127
128        when(mBackupManager.getDataManagementIntent(anyString())).thenReturn(intent);
129        when(mBackupManager.isBackupServiceActive(anyInt())).thenReturn(true);
130
131        Intent backupIntent = mBackupSettingsHelper.getIntentForBackupSettingsFromTransport();
132
133        assertThat(backupIntent.getExtras().get(BackupManager.EXTRA_BACKUP_SERVICES_AVAILABLE))
134                .isEqualTo(true);
135    }
136
137    @Test
138    public void testGetIntentFromBackupTransport_BackupDisabled() throws Exception {
139        Intent intent = new Intent("test_intent");
140
141        when(mBackupManager.getDataManagementIntent(anyString())).thenReturn(intent);
142        when(mBackupManager.isBackupServiceActive(anyInt())).thenReturn(false);
143
144        Intent backupIntent = mBackupSettingsHelper.getIntentForBackupSettingsFromTransport();
145
146        assertThat(backupIntent.getExtras().get(BackupManager.EXTRA_BACKUP_SERVICES_AVAILABLE))
147                .isEqualTo(false);
148    }
149
150    @Test
151    public void testGetIntentFromBackupTransport_BackupStatusException() throws Exception {
152        Intent intent = new Intent("test_intent");
153
154        when(mBackupManager.getDataManagementIntent(anyString())).thenReturn(intent);
155        when(mBackupManager.isBackupServiceActive(anyInt())).thenThrow(new RemoteException());
156
157        Intent backupIntent = mBackupSettingsHelper.getIntentForBackupSettingsFromTransport();
158
159        assertThat(backupIntent.getExtras().get(BackupManager.EXTRA_BACKUP_SERVICES_AVAILABLE))
160                .isEqualTo(false);
161    }
162
163    @Test
164    public void testIsIntentProvidedByTransport_WithNullIntent() throws Exception {
165        when(mBackupManager.getDataManagementIntent(anyString())).thenReturn(null);
166
167        boolean isIntentProvided = mBackupSettingsHelper.isIntentProvidedByTransport();
168
169        assertThat(isIntentProvided).isFalse();
170    }
171
172    @Test
173    public void testIsIntentProvidedByTransport_WithInvalidIntent() throws Exception {
174        Intent intent = mock(Intent.class);
175
176        when(mBackupManager.getDataManagementIntent(anyString())).thenReturn(intent);
177
178        PackageManager packageManager = mock(PackageManager.class);
179        when(mContext.getPackageManager()).thenReturn(packageManager);
180        when(intent.resolveActivity(packageManager)).thenReturn(null);
181
182        boolean isIntentProvided = mBackupSettingsHelper.isIntentProvidedByTransport();
183
184        assertThat(isIntentProvided).isFalse();
185    }
186
187    @Test
188    public void testIsIntentProvidedByTransport_WithIntent() throws Exception {
189        Intent intent = mock(Intent.class);
190
191        when(mBackupManager.getDataManagementIntent(anyString())).thenReturn(intent);
192
193        PackageManager packageManager = mock(PackageManager.class);
194        when(mContext.getPackageManager()).thenReturn(packageManager);
195        when(intent.resolveActivity(packageManager)).thenReturn(mock(ComponentName.class));
196
197        boolean isIntentProvided = mBackupSettingsHelper.isIntentProvidedByTransport();
198
199        assertThat(isIntentProvided).isTrue();
200    }
201
202    @Test
203    public void testGetSummaryFromBackupTransport() throws Exception {
204        String summary = "test_summary";
205
206        when(mBackupManager.getDestinationString(anyString())).thenReturn(summary);
207
208        String backupSummary = mBackupSettingsHelper.getSummaryFromBackupTransport();
209
210        assertThat(backupSummary).isEqualTo(summary);
211    }
212
213    @Test
214    public void testGetSummaryFromBackupTransport_RemoteException() throws Exception {
215        when(mBackupManager.getDestinationString(anyString())).thenThrow(new RemoteException());
216
217        String backupSummary = mBackupSettingsHelper.getSummaryFromBackupTransport();
218
219        assertThat(backupSummary).isNull();
220    }
221
222    @Test
223    public void testGetLabelBackupTransport() throws Exception {
224        String label = "test_label";
225
226        when(mBackupManager.getDataManagementLabel(anyString())).thenReturn(label);
227
228        String backupLabel = mBackupSettingsHelper.getLabelFromBackupTransport();
229
230        assertThat(backupLabel).isEqualTo(label);
231    }
232
233    @Test
234    public void testGetLabelBackupTransport_RemoteException() throws Exception {
235        when(mBackupManager.getDataManagementLabel(anyString())).thenThrow(new RemoteException());
236
237        String backupLabel = mBackupSettingsHelper.getLabelFromBackupTransport();
238
239        assertThat(backupLabel).isNull();
240    }
241
242    @Test
243    public void testGetIntentForBackupSettings_WithIntentFromTransport() throws Exception {
244        Intent intent = mock(Intent.class);
245
246        when(mBackupManager.getDataManagementIntent(anyString())).thenReturn(intent);
247
248        PackageManager packageManager = mock(PackageManager.class);
249        when(mContext.getPackageManager()).thenReturn(packageManager);
250        when(intent.resolveActivity(packageManager)).thenReturn(mock(ComponentName.class));
251
252        Intent backupIntent = mBackupSettingsHelper.getIntentForBackupSettings();
253
254        assertThat(backupIntent).isEqualTo(intent);
255    }
256
257    @Test
258    public void testGetIntentForBackupSettings_WithoutIntentFromTransport() throws Exception {
259        when(mBackupManager.getDataManagementIntent(anyString())).thenReturn(null);
260
261        Intent backupIntent = mBackupSettingsHelper.getIntentForBackupSettings();
262
263        assertThat(backupIntent.getComponent().getClassName())
264            .isEqualTo(DEFAULT_SETTINGS_CLASSNAME);
265    }
266
267    @Test
268    public void testGetLabelForBackupSettings_WithLabelFromTransport() throws Exception {
269        String label = "test_label";
270
271        when(mBackupManager.getDataManagementLabel(anyString())).thenReturn(label);
272
273        String backupLabel = mBackupSettingsHelper.getLabelForBackupSettings();
274
275        assertThat(backupLabel).isEqualTo(label);
276    }
277
278    @Test
279    public void testGetLabelForBackupSettings_WithEmptyLabelFromTransport() throws Exception {
280        String label = "";
281
282        when(mBackupManager.getDataManagementLabel(anyString())).thenReturn(label);
283
284        String backupLabel = mBackupSettingsHelper.getLabelForBackupSettings();
285
286        assertThat(backupLabel).isEqualTo(mContext.getString(DEFAULT_LABEL_RESOURCE));
287    }
288
289    @Test
290    public void testGetLabelForBackupSettings_WithoutLabelFromTransport() throws Exception {
291        when(mBackupManager.getDataManagementLabel(anyString())).thenReturn(null);
292
293        String backupLabel = mBackupSettingsHelper.getLabelForBackupSettings();
294
295        assertThat(backupLabel).isEqualTo(mContext.getString(DEFAULT_LABEL_RESOURCE));
296    }
297
298    @Test
299    public void testGetSummaryForBackupSettings_WithSummaryFromTransport() throws Exception {
300        String summary = "test_summary";
301
302        when(mBackupManager.getDestinationString(anyString())).thenReturn(summary);
303
304        String backupSummary = mBackupSettingsHelper.getSummaryForBackupSettings();
305
306        assertThat(backupSummary).isEqualTo(summary);
307    }
308
309    @Test
310    public void testGetSummaryForBackupSettings_WithoutSummaryFromTransport() throws Exception {
311        when(mBackupManager.getDestinationString(anyString())).thenReturn(null);
312
313        String backupSummary = mBackupSettingsHelper.getSummaryForBackupSettings();
314
315        assertThat(backupSummary).isEqualTo(mContext.getString(DEFAULT_SUMMARY_RESOURCE));
316    }
317
318    @Test
319    public void testIsBackupProvidedByManufacturer_WithIntent() throws Exception {
320        String intent = "test_intent";
321
322        when(mContext.getApplicationContext()).thenReturn(mContext);
323        Resources spiedResources = spy(mContext.getResources());
324        when(mContext.getResources()).thenReturn(spiedResources);
325        when(spiedResources.getString(MANUFACTURER_INTENT_RESOURCE)).thenReturn(intent);
326        mBackupSettingsHelper = new BackupSettingsHelper(mContext);
327
328        boolean hasManufacturerIntent = mBackupSettingsHelper.isBackupProvidedByManufacturer();
329
330        assertThat(hasManufacturerIntent).isTrue();
331    }
332
333    @Test
334    public void testIsBackupProvidedByManufacturer_WithoutIntent() throws Exception {
335        String intent = "";
336
337        when(mContext.getApplicationContext()).thenReturn(mContext);
338        Resources spiedResources = spy(mContext.getResources());
339        when(mContext.getResources()).thenReturn(spiedResources);
340        when(spiedResources.getString(MANUFACTURER_INTENT_RESOURCE)).thenReturn(intent);
341        mBackupSettingsHelper = new BackupSettingsHelper(mContext);
342
343        boolean hasManufacturerIntent = mBackupSettingsHelper.isBackupProvidedByManufacturer();
344
345        assertThat(hasManufacturerIntent).isFalse();
346    }
347
348    @Test
349    public void testGetLabelProvidedByManufacturer() throws Exception {
350        String label = "test_label";
351
352        when(mContext.getApplicationContext()).thenReturn(mContext);
353        Resources spiedResources = spy(mContext.getResources());
354        when(mContext.getResources()).thenReturn(spiedResources);
355        when(spiedResources.getString(MANUFACTURER_LABEL_RESOURCE)).thenReturn(label);
356        mBackupSettingsHelper = new BackupSettingsHelper(mContext);
357
358        String manufacturerLabel = mBackupSettingsHelper.getLabelProvidedByManufacturer();
359
360        assertThat(manufacturerLabel).isEqualTo(label);
361    }
362
363    @Test
364    public void testGetIntentProvidedByManufacturer() throws Exception {
365        String intent = "test_intent";
366
367        when(mContext.getApplicationContext()).thenReturn(mContext);
368        Resources spiedResources = spy(mContext.getResources());
369        when(mContext.getResources()).thenReturn(spiedResources);
370        when(spiedResources.getString(MANUFACTURER_INTENT_RESOURCE)).thenReturn(intent);
371        mBackupSettingsHelper = new BackupSettingsHelper(mContext);
372
373        Intent manufacturerIntent = mBackupSettingsHelper.getIntentProvidedByManufacturer();
374
375        assertThat(manufacturerIntent).isNotNull();
376    }
377
378    @Implements(IBackupManager.Stub.class)
379    public static class ShadowBackupManagerStub {
380        @Implementation
381        public static IBackupManager asInterface(IBinder iBinder) {
382            return mBackupManager;
383        }
384    }
385}
386