blob: 0cdf04bda2d07856cefd6b3a2df16d7c66525cf9 [file] [log] [blame]
Artem Iglikov13fffd22017-05-08 17:17:13 +01001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.android.server.backup.utils;
18
Artem Iglikova08220b2017-05-09 14:28:29 +010019import static android.app.backup.BackupManagerMonitor.EXTRA_LOG_EVENT_ID;
20import static android.app.backup.BackupManagerMonitor.LOG_EVENT_ID_APK_NOT_INSTALLED;
21import static android.app.backup.BackupManagerMonitor.LOG_EVENT_ID_CANNOT_RESTORE_WITHOUT_APK;
22import static android.app.backup.BackupManagerMonitor.LOG_EVENT_ID_FULL_RESTORE_ALLOW_BACKUP_FALSE;
23import static android.app.backup.BackupManagerMonitor.LOG_EVENT_ID_FULL_RESTORE_SIGNATURE_MISMATCH;
24import static android.app.backup.BackupManagerMonitor.LOG_EVENT_ID_RESTORE_ANY_VERSION;
25import static android.app.backup.BackupManagerMonitor.LOG_EVENT_ID_SYSTEM_APP_NO_AGENT;
26import static android.app.backup.BackupManagerMonitor.LOG_EVENT_ID_VERSIONS_MATCH;
27import static android.app.backup.BackupManagerMonitor.LOG_EVENT_ID_VERSION_OF_BACKUP_OLDER;
28
Artem Iglikov13fffd22017-05-08 17:17:13 +010029import static com.google.common.truth.Truth.assertThat;
30
Artem Iglikova08220b2017-05-09 14:28:29 +010031import static org.mockito.Mockito.verify;
32import static org.mockito.Mockito.verifyNoMoreInteractions;
33import static org.mockito.Mockito.verifyZeroInteractions;
34import static org.mockito.internal.verification.VerificationModeFactory.times;
35
Artem Iglikov13fffd22017-05-08 17:17:13 +010036import android.app.backup.IBackupManagerMonitor;
37import android.content.Context;
Artem Iglikova08220b2017-05-09 14:28:29 +010038import android.content.pm.ApplicationInfo;
39import android.content.pm.PackageInfo;
Artem Iglikov13fffd22017-05-08 17:17:13 +010040import android.content.pm.Signature;
Artem Iglikova08220b2017-05-09 14:28:29 +010041import android.os.Bundle;
42import android.os.Process;
Artem Iglikov13fffd22017-05-08 17:17:13 +010043import android.platform.test.annotations.Presubmit;
44import android.support.test.InstrumentationRegistry;
45import android.support.test.filters.SmallTest;
46import android.support.test.runner.AndroidJUnit4;
47
48import com.android.frameworks.servicestests.R;
49import com.android.server.backup.FileMetadata;
Michal Karpinskife4ae0c2018-01-25 15:24:00 +000050import com.android.server.backup.BackupManagerService;
Artem Iglikov13fffd22017-05-08 17:17:13 +010051import com.android.server.backup.restore.PerformAdbRestoreTask;
Artem Iglikova08220b2017-05-09 14:28:29 +010052import com.android.server.backup.restore.RestorePolicy;
53import com.android.server.backup.testutils.PackageManagerStub;
Artem Iglikov13fffd22017-05-08 17:17:13 +010054
55import com.google.common.hash.Hashing;
56
57import org.junit.Before;
58import org.junit.Test;
59import org.junit.runner.RunWith;
Artem Iglikova08220b2017-05-09 14:28:29 +010060import org.mockito.ArgumentCaptor;
Artem Iglikov13fffd22017-05-08 17:17:13 +010061import org.mockito.Mock;
62import org.mockito.MockitoAnnotations;
63
64import java.io.InputStream;
Artem Iglikova1a4a9f2017-05-11 16:43:53 +010065import java.util.Arrays;
Artem Iglikova08220b2017-05-09 14:28:29 +010066import java.util.List;
Artem Iglikov13fffd22017-05-08 17:17:13 +010067
68@SmallTest
69@Presubmit
70@RunWith(AndroidJUnit4.class)
71public class TarBackupReaderTest {
72 private static final String TELEPHONY_PACKAGE_NAME = "com.android.providers.telephony";
73 private static final String TELEPHONY_PACKAGE_SIGNATURE_SHA256 =
74 "301aa3cb081134501c45f1422abc66c24224fd5ded5fdc8f17e697176fd866aa";
75 private static final int TELEPHONY_PACKAGE_VERSION = 25;
Artem Iglikova1a4a9f2017-05-11 16:43:53 +010076 private static final String TEST_PACKAGE_NAME = "com.android.backup.testing";
Artem Iglikova08220b2017-05-09 14:28:29 +010077 private static final Signature FAKE_SIGNATURE_1 = new Signature("1234");
78 private static final Signature FAKE_SIGNATURE_2 = new Signature("5678");
Artem Iglikov13fffd22017-05-08 17:17:13 +010079
Artem Iglikova08220b2017-05-09 14:28:29 +010080 @Mock private BytesReadListener mBytesReadListenerMock;
81 @Mock private IBackupManagerMonitor mBackupManagerMonitorMock;
82
83 private final PackageManagerStub mPackageManagerStub = new PackageManagerStub();
Artem Iglikov13fffd22017-05-08 17:17:13 +010084 private Context mContext;
85
86 @Before
87 public void setUp() throws Exception {
88 MockitoAnnotations.initMocks(this);
89
90 mContext = InstrumentationRegistry.getContext();
91 }
92
93 @Test
94 public void readTarHeaders_backupEncrypted_correctlyParsesFileMetadata() throws Exception {
95 InputStream inputStream = mContext.getResources().openRawResource(
96 R.raw.backup_telephony_with_password);
97 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
98 inputStream, "123");
99 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
100 mBytesReadListenerMock, mBackupManagerMonitorMock);
101 FileMetadata fileMetadata = tarBackupReader.readTarHeaders();
102
103 assertThat(fileMetadata.packageName).isEqualTo(TELEPHONY_PACKAGE_NAME);
104 assertThat(fileMetadata.mode).isEqualTo(0600);
105 assertThat(fileMetadata.size).isEqualTo(2438);
106 assertThat(fileMetadata.domain).isEqualTo(null);
107 assertThat(fileMetadata.path).isEqualTo("_manifest");
108 }
109
110 @Test
111 public void readTarHeaders_backupNotEncrypted_correctlyParsesFileMetadata() throws Exception {
112 InputStream inputStream = mContext.getResources().openRawResource(
113 R.raw.backup_telephony_no_password);
114 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
115 inputStream, null);
116 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
117 mBytesReadListenerMock, mBackupManagerMonitorMock);
118 FileMetadata fileMetadata = tarBackupReader.readTarHeaders();
119
120 assertThat(fileMetadata.packageName).isEqualTo(TELEPHONY_PACKAGE_NAME);
121 assertThat(fileMetadata.mode).isEqualTo(0600);
122 assertThat(fileMetadata.size).isEqualTo(2438);
123 assertThat(fileMetadata.domain).isEqualTo(null);
124 assertThat(fileMetadata.path).isEqualTo("_manifest");
125 }
126
127 @Test
Artem Iglikova1a4a9f2017-05-11 16:43:53 +0100128 public void readTarHeaders_backupNotEncrypted_correctlyReadsPaxHeader() throws Exception {
129 // Files with long names (>100 chars) will force backup to add PAX header.
130 InputStream inputStream = mContext.getResources().openRawResource(
131 R.raw.backup_file_with_long_name);
132 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
133 inputStream, null);
134 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
135 mBytesReadListenerMock, mBackupManagerMonitorMock);
136
137 // Read manifest file.
138 FileMetadata fileMetadata = tarBackupReader.readTarHeaders();
139 Signature[] signatures = tarBackupReader.readAppManifestAndReturnSignatures(
140 fileMetadata);
141 RestorePolicy restorePolicy = tarBackupReader.chooseRestorePolicy(
142 mPackageManagerStub, false /* allowApks */, fileMetadata, signatures);
143
144 assertThat(restorePolicy).isEqualTo(RestorePolicy.IGNORE);
145 assertThat(fileMetadata.packageName).isEqualTo(TEST_PACKAGE_NAME);
Michal Karpinskife4ae0c2018-01-25 15:24:00 +0000146 assertThat(fileMetadata.path).isEqualTo(BackupManagerService.BACKUP_MANIFEST_FILENAME);
Artem Iglikova1a4a9f2017-05-11 16:43:53 +0100147
148 tarBackupReader.skipTarPadding(fileMetadata.size);
149
150 // Read actual file (PAX header will only exist here).
151 fileMetadata = tarBackupReader.readTarHeaders();
152 signatures = tarBackupReader.readAppManifestAndReturnSignatures(
153 fileMetadata);
154 restorePolicy = tarBackupReader.chooseRestorePolicy(
155 mPackageManagerStub, false /* allowApks */, fileMetadata, signatures);
156
157 assertThat(restorePolicy).isEqualTo(RestorePolicy.IGNORE);
158 assertThat(fileMetadata.packageName).isEqualTo(TEST_PACKAGE_NAME);
159 char[] expectedFileNameChars = new char[200];
160 Arrays.fill(expectedFileNameChars, '1');
161 String expectedFileName = new String(expectedFileNameChars);
162 assertThat(fileMetadata.path).isEqualTo(expectedFileName);
163 }
164
165 @Test
Artem Iglikov13fffd22017-05-08 17:17:13 +0100166 public void readAppManifest_backupEncrypted_correctlyParsesAppManifest() throws Exception {
167 InputStream inputStream = mContext.getResources().openRawResource(
168 R.raw.backup_telephony_with_password);
169 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
170 inputStream, "123");
171 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
172 mBytesReadListenerMock, mBackupManagerMonitorMock);
173 FileMetadata fileMetadata = tarBackupReader.readTarHeaders();
174
175 Signature[] signatures = tarBackupReader.readAppManifestAndReturnSignatures(fileMetadata);
176
177 assertThat(fileMetadata.version).isEqualTo(TELEPHONY_PACKAGE_VERSION);
178 assertThat(fileMetadata.hasApk).isFalse();
179 assertThat(signatures).isNotNull();
180 assertThat(signatures).hasLength(1);
181
182 String signatureSha256 = Hashing.sha256().hashBytes(signatures[0].toByteArray()).toString();
183 assertThat(signatureSha256).isEqualTo(TELEPHONY_PACKAGE_SIGNATURE_SHA256);
184 }
185
186 @Test
187 public void readAppManifest_backupNotEncrypted_correctlyParsesAppManifest() throws Exception {
188 InputStream inputStream = mContext.getResources().openRawResource(
189 R.raw.backup_telephony_no_password);
190 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
191 inputStream, null);
192 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
193 mBytesReadListenerMock, mBackupManagerMonitorMock);
194 FileMetadata fileMetadata = tarBackupReader.readTarHeaders();
195
196 Signature[] signatures = tarBackupReader.readAppManifestAndReturnSignatures(fileMetadata);
197
198 assertThat(fileMetadata.version).isEqualTo(TELEPHONY_PACKAGE_VERSION);
199 assertThat(fileMetadata.hasApk).isFalse();
200 assertThat(signatures).isNotNull();
201 assertThat(signatures).hasLength(1);
202
203 String signatureSha256 = Hashing.sha256().hashBytes(signatures[0].toByteArray()).toString();
204 assertThat(signatureSha256).isEqualTo(TELEPHONY_PACKAGE_SIGNATURE_SHA256);
205 }
Artem Iglikova08220b2017-05-09 14:28:29 +0100206
207 @Test
208 public void chooseRestorePolicy_signaturesIsNull_returnsIgnore() throws Exception {
209 InputStream inputStream = mContext.getResources().openRawResource(
210 R.raw.backup_telephony_no_password);
211 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
212 inputStream, null);
213 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
214 mBytesReadListenerMock, mBackupManagerMonitorMock);
215
216 RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
217 true /* allowApks */, new FileMetadata(), null /* signatures */);
218
219 assertThat(policy).isEqualTo(RestorePolicy.IGNORE);
220 verifyZeroInteractions(mBackupManagerMonitorMock);
221 }
222
223 @Test
224 public void chooseRestorePolicy_packageDoesNotExistAndAllowApksAndHasApk_returnsAcceptIfApk()
225 throws Exception {
226 InputStream inputStream = mContext.getResources().openRawResource(
227 R.raw.backup_telephony_no_password);
228 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
229 inputStream, null);
230 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
231 mBytesReadListenerMock, mBackupManagerMonitorMock);
232 FileMetadata info = new FileMetadata();
233 info.hasApk = true;
234 PackageManagerStub.sPackageInfo = null;
235
236 RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
237 true /* allowApks */, info, new Signature[0] /* signatures */);
238
239 assertThat(policy).isEqualTo(RestorePolicy.ACCEPT_IF_APK);
240 ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
241 verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture());
242 assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo(
243 LOG_EVENT_ID_APK_NOT_INSTALLED);
244 }
245
246 @Test
247 public void
248 chooseRestorePolicy_packageDoesNotExistAndAllowApksAndDoesNotHaveApk_returnsAcceptIfApkLogsCannotRestore()
249 throws Exception {
250 InputStream inputStream = mContext.getResources().openRawResource(
251 R.raw.backup_telephony_no_password);
252 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
253 inputStream, null);
254 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
255 mBytesReadListenerMock, mBackupManagerMonitorMock);
256 FileMetadata info = new FileMetadata();
257 info.hasApk = false;
258 PackageManagerStub.sPackageInfo = null;
259
260 RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
261 true /* allowApks */, info, new Signature[0] /* signatures */);
262
263 assertThat(policy).isEqualTo(RestorePolicy.ACCEPT_IF_APK);
264 ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
265 verify(mBackupManagerMonitorMock, times(2)).onEvent(bundleCaptor.capture());
266 List<Bundle> eventBundles = bundleCaptor.getAllValues();
267 assertThat(eventBundles).hasSize(2);
268 assertThat(eventBundles.get(0).get(EXTRA_LOG_EVENT_ID)).isEqualTo(
269 LOG_EVENT_ID_APK_NOT_INSTALLED);
270 assertThat(eventBundles.get(1).get(EXTRA_LOG_EVENT_ID)).isEqualTo(
271 LOG_EVENT_ID_CANNOT_RESTORE_WITHOUT_APK);
272 }
273
274 @Test
275 public void chooseRestorePolicy_packageDoesNotExistAndDoesNotAllowApks_returnsIgnore()
276 throws Exception {
277 InputStream inputStream = mContext.getResources().openRawResource(
278 R.raw.backup_telephony_no_password);
279 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
280 inputStream, null);
281 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
282 mBytesReadListenerMock, mBackupManagerMonitorMock);
283 PackageManagerStub.sPackageInfo = null;
284
285 RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
286 false /* allowApks */, new FileMetadata(), new Signature[0] /* signatures */);
287
288 assertThat(policy).isEqualTo(RestorePolicy.IGNORE);
289 ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
290 verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture());
291 assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo(
292 LOG_EVENT_ID_APK_NOT_INSTALLED);
293 }
294
295 @Test
296 public void chooseRestorePolicy_doesNotAllowsBackup_returnsIgnore() throws Exception {
297 InputStream inputStream = mContext.getResources().openRawResource(
298 R.raw.backup_telephony_no_password);
299 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
300 inputStream, null);
301 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
302 mBytesReadListenerMock, mBackupManagerMonitorMock);
303
304 PackageInfo packageInfo = new PackageInfo();
305 packageInfo.applicationInfo = new ApplicationInfo();
306 packageInfo.applicationInfo.flags = ~ApplicationInfo.FLAG_ALLOW_BACKUP;
307 PackageManagerStub.sPackageInfo = packageInfo;
308
309 RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
310 false /* allowApks */, new FileMetadata(), new Signature[0] /* signatures */);
311
312 assertThat(policy).isEqualTo(RestorePolicy.IGNORE);
313 ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
314 verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture());
315 assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo(
316 LOG_EVENT_ID_FULL_RESTORE_ALLOW_BACKUP_FALSE);
317 }
318
319 @Test
320 public void chooseRestorePolicy_systemAppWithNoAgent_returnsIgnore() throws Exception {
321 InputStream inputStream = mContext.getResources().openRawResource(
322 R.raw.backup_telephony_no_password);
323 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
324 inputStream, null);
325 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
326 mBytesReadListenerMock, mBackupManagerMonitorMock);
327
328 PackageInfo packageInfo = new PackageInfo();
329 packageInfo.applicationInfo = new ApplicationInfo();
330 packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP;
331 packageInfo.applicationInfo.uid = Process.SYSTEM_UID;
332 packageInfo.applicationInfo.backupAgentName = null;
333 PackageManagerStub.sPackageInfo = packageInfo;
334
335 RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
336 false /* allowApks */, new FileMetadata(), new Signature[0] /* signatures */);
337
338 assertThat(policy).isEqualTo(RestorePolicy.IGNORE);
339 ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
340 verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture());
341 assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo(
342 LOG_EVENT_ID_SYSTEM_APP_NO_AGENT);
343 }
344
345 @Test
346 public void chooseRestorePolicy_nonSystemAppSignaturesDoNotMatch_returnsIgnore()
347 throws Exception {
348 InputStream inputStream = mContext.getResources().openRawResource(
349 R.raw.backup_telephony_no_password);
350 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
351 inputStream, null);
352 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
353 mBytesReadListenerMock, mBackupManagerMonitorMock);
354 Signature[] signatures = new Signature[]{FAKE_SIGNATURE_1};
355
356 PackageInfo packageInfo = new PackageInfo();
357 packageInfo.applicationInfo = new ApplicationInfo();
358 packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP;
359 packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
360 packageInfo.applicationInfo.backupAgentName = null;
361 packageInfo.signatures = new Signature[]{FAKE_SIGNATURE_2};
362 PackageManagerStub.sPackageInfo = packageInfo;
363
364 RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
365 false /* allowApks */, new FileMetadata(), signatures);
366
367 assertThat(policy).isEqualTo(RestorePolicy.IGNORE);
368 ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
369 verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture());
370 assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo(
371 LOG_EVENT_ID_FULL_RESTORE_SIGNATURE_MISMATCH);
372 }
373
374 @Test
Artem Iglikova1a4a9f2017-05-11 16:43:53 +0100375 public void chooseRestorePolicy_systemAppWithBackupAgentAndRestoreAnyVersion_returnsAccept()
376 throws Exception {
Artem Iglikova08220b2017-05-09 14:28:29 +0100377 InputStream inputStream = mContext.getResources().openRawResource(
378 R.raw.backup_telephony_no_password);
379 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
380 inputStream, null);
381 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
382 mBytesReadListenerMock, mBackupManagerMonitorMock);
383 Signature[] signatures = new Signature[]{FAKE_SIGNATURE_1};
384
385 PackageInfo packageInfo = new PackageInfo();
386 packageInfo.applicationInfo = new ApplicationInfo();
387 packageInfo.applicationInfo.flags |=
388 ApplicationInfo.FLAG_ALLOW_BACKUP | ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
389 packageInfo.applicationInfo.uid = Process.SYSTEM_UID;
390 packageInfo.applicationInfo.backupAgentName = "backup.agent";
391 packageInfo.signatures = new Signature[]{FAKE_SIGNATURE_1};
392 PackageManagerStub.sPackageInfo = packageInfo;
393
394 RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
395 false /* allowApks */, new FileMetadata(), signatures);
396
397 assertThat(policy).isEqualTo(RestorePolicy.ACCEPT);
398 ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
399 verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture());
400 assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo(
401 LOG_EVENT_ID_RESTORE_ANY_VERSION);
402 }
403
404 @Test
405 public void chooseRestorePolicy_restoreAnyVersion_returnsAccept() throws Exception {
406 InputStream inputStream = mContext.getResources().openRawResource(
407 R.raw.backup_telephony_no_password);
408 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
409 inputStream, null);
410 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
411 mBytesReadListenerMock, mBackupManagerMonitorMock);
412 Signature[] signatures = new Signature[]{FAKE_SIGNATURE_1};
413
414 PackageInfo packageInfo = new PackageInfo();
415 packageInfo.applicationInfo = new ApplicationInfo();
416 packageInfo.applicationInfo.flags |=
417 ApplicationInfo.FLAG_ALLOW_BACKUP | ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
418 packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
419 packageInfo.applicationInfo.backupAgentName = null;
420 packageInfo.signatures = new Signature[]{FAKE_SIGNATURE_1};
421 PackageManagerStub.sPackageInfo = packageInfo;
422
423 RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
424 false /* allowApks */, new FileMetadata(), signatures);
425
426 assertThat(policy).isEqualTo(RestorePolicy.ACCEPT);
427 ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
428 verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture());
429 assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo(
430 LOG_EVENT_ID_RESTORE_ANY_VERSION);
431 }
432
433 @Test
434 public void chooseRestorePolicy_notRestoreAnyVersionButVersionMatch_returnsAccept()
435 throws Exception {
436 InputStream inputStream = mContext.getResources().openRawResource(
437 R.raw.backup_telephony_no_password);
438 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
439 inputStream, null);
440 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
441 mBytesReadListenerMock, mBackupManagerMonitorMock);
442 Signature[] signatures = new Signature[]{FAKE_SIGNATURE_1};
443 FileMetadata info = new FileMetadata();
444 info.version = 1;
445
446 PackageInfo packageInfo = new PackageInfo();
447 packageInfo.applicationInfo = new ApplicationInfo();
448 packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP;
449 packageInfo.applicationInfo.flags &= ~ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
450 packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
451 packageInfo.applicationInfo.backupAgentName = null;
452 packageInfo.signatures = new Signature[]{FAKE_SIGNATURE_1};
453 packageInfo.versionCode = 2;
454 PackageManagerStub.sPackageInfo = packageInfo;
455
456 RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
457 false /* allowApks */, info, signatures);
458
459 assertThat(policy).isEqualTo(RestorePolicy.ACCEPT);
460 ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
461 verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture());
462 assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo(
463 LOG_EVENT_ID_VERSIONS_MATCH);
464 }
465
466 @Test
467 public void
468 chooseRestorePolicy_notRestoreAnyVersionAndVersionMismatchButAllowApksAndHasApk_returnsAcceptIfApk()
469 throws Exception {
470 InputStream inputStream = mContext.getResources().openRawResource(
471 R.raw.backup_telephony_no_password);
472 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
473 inputStream, null);
474 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
475 mBytesReadListenerMock, mBackupManagerMonitorMock);
476 Signature[] signatures = new Signature[]{FAKE_SIGNATURE_1};
477 FileMetadata info = new FileMetadata();
478 info.version = 2;
479 info.hasApk = true;
480
481 PackageInfo packageInfo = new PackageInfo();
482 packageInfo.applicationInfo = new ApplicationInfo();
483 packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP;
484 packageInfo.applicationInfo.flags &= ~ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
485 packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
486 packageInfo.applicationInfo.backupAgentName = null;
487 packageInfo.signatures = new Signature[]{FAKE_SIGNATURE_1};
488 packageInfo.versionCode = 1;
489 PackageManagerStub.sPackageInfo = packageInfo;
490
491 RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
492 true /* allowApks */, info, signatures);
493
494 assertThat(policy).isEqualTo(RestorePolicy.ACCEPT_IF_APK);
495 verifyNoMoreInteractions(mBackupManagerMonitorMock);
496 }
497
498 @Test
499 public void
500 chooseRestorePolicy_notRestoreAnyVersionAndVersionMismatchAndDoesNotAllowApks_returnsIgnore()
501 throws Exception {
502 InputStream inputStream = mContext.getResources().openRawResource(
503 R.raw.backup_telephony_no_password);
504 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
505 inputStream, null);
506 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
507 mBytesReadListenerMock, mBackupManagerMonitorMock);
508 Signature[] signatures = new Signature[]{FAKE_SIGNATURE_1};
509 FileMetadata info = new FileMetadata();
510 info.version = 2;
511
512 PackageInfo packageInfo = new PackageInfo();
513 packageInfo.applicationInfo = new ApplicationInfo();
514 packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP;
515 packageInfo.applicationInfo.flags &= ~ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
516 packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
517 packageInfo.applicationInfo.backupAgentName = null;
518 packageInfo.signatures = new Signature[]{FAKE_SIGNATURE_1};
519 packageInfo.versionCode = 1;
520 PackageManagerStub.sPackageInfo = packageInfo;
521
522 RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
523 false /* allowApks */, info, signatures);
524
525 assertThat(policy).isEqualTo(RestorePolicy.IGNORE);
526 ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
527 verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture());
528 assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo(
529 LOG_EVENT_ID_VERSION_OF_BACKUP_OLDER);
530 }
Artem Iglikova1a4a9f2017-05-11 16:43:53 +0100531}
Artem Iglikova08220b2017-05-09 14:28:29 +0100532