blob: 5f052ceb2e26b8c684bea1e78b2ae8d0e1f9a3fe [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
Michal Karpinski528c3e52018-02-07 17:47:10 +000031import static org.mockito.Mockito.doReturn;
32import static org.mockito.Mockito.mock;
33import static org.mockito.Mockito.when;
Artem Iglikova08220b2017-05-09 14:28:29 +010034import static org.mockito.Mockito.verify;
35import static org.mockito.Mockito.verifyNoMoreInteractions;
36import static org.mockito.Mockito.verifyZeroInteractions;
37import static org.mockito.internal.verification.VerificationModeFactory.times;
38
Artem Iglikov13fffd22017-05-08 17:17:13 +010039import android.app.backup.IBackupManagerMonitor;
40import android.content.Context;
Artem Iglikova08220b2017-05-09 14:28:29 +010041import android.content.pm.ApplicationInfo;
42import android.content.pm.PackageInfo;
Michal Karpinski528c3e52018-02-07 17:47:10 +000043import android.content.pm.PackageManagerInternal;
Artem Iglikov13fffd22017-05-08 17:17:13 +010044import android.content.pm.Signature;
Artem Iglikova08220b2017-05-09 14:28:29 +010045import android.os.Bundle;
46import android.os.Process;
Artem Iglikov13fffd22017-05-08 17:17:13 +010047import android.platform.test.annotations.Presubmit;
48import android.support.test.InstrumentationRegistry;
49import android.support.test.filters.SmallTest;
50import android.support.test.runner.AndroidJUnit4;
51
52import com.android.frameworks.servicestests.R;
53import com.android.server.backup.FileMetadata;
Michal Karpinskife4ae0c2018-01-25 15:24:00 +000054import com.android.server.backup.BackupManagerService;
Artem Iglikov13fffd22017-05-08 17:17:13 +010055import com.android.server.backup.restore.PerformAdbRestoreTask;
Artem Iglikova08220b2017-05-09 14:28:29 +010056import com.android.server.backup.restore.RestorePolicy;
57import com.android.server.backup.testutils.PackageManagerStub;
Artem Iglikov13fffd22017-05-08 17:17:13 +010058
59import com.google.common.hash.Hashing;
60
61import org.junit.Before;
62import org.junit.Test;
63import org.junit.runner.RunWith;
Artem Iglikova08220b2017-05-09 14:28:29 +010064import org.mockito.ArgumentCaptor;
Artem Iglikov13fffd22017-05-08 17:17:13 +010065import org.mockito.Mock;
66import org.mockito.MockitoAnnotations;
67
68import java.io.InputStream;
Artem Iglikova1a4a9f2017-05-11 16:43:53 +010069import java.util.Arrays;
Artem Iglikova08220b2017-05-09 14:28:29 +010070import java.util.List;
Artem Iglikov13fffd22017-05-08 17:17:13 +010071
72@SmallTest
73@Presubmit
74@RunWith(AndroidJUnit4.class)
75public class TarBackupReaderTest {
76 private static final String TELEPHONY_PACKAGE_NAME = "com.android.providers.telephony";
77 private static final String TELEPHONY_PACKAGE_SIGNATURE_SHA256 =
78 "301aa3cb081134501c45f1422abc66c24224fd5ded5fdc8f17e697176fd866aa";
79 private static final int TELEPHONY_PACKAGE_VERSION = 25;
Artem Iglikova1a4a9f2017-05-11 16:43:53 +010080 private static final String TEST_PACKAGE_NAME = "com.android.backup.testing";
Artem Iglikova08220b2017-05-09 14:28:29 +010081 private static final Signature FAKE_SIGNATURE_1 = new Signature("1234");
82 private static final Signature FAKE_SIGNATURE_2 = new Signature("5678");
Artem Iglikov13fffd22017-05-08 17:17:13 +010083
Artem Iglikova08220b2017-05-09 14:28:29 +010084 @Mock private BytesReadListener mBytesReadListenerMock;
85 @Mock private IBackupManagerMonitor mBackupManagerMonitorMock;
Michal Karpinski528c3e52018-02-07 17:47:10 +000086 @Mock private PackageManagerInternal mMockPackageManagerInternal;
Artem Iglikova08220b2017-05-09 14:28:29 +010087
88 private final PackageManagerStub mPackageManagerStub = new PackageManagerStub();
Artem Iglikov13fffd22017-05-08 17:17:13 +010089 private Context mContext;
90
91 @Before
92 public void setUp() throws Exception {
93 MockitoAnnotations.initMocks(this);
94
95 mContext = InstrumentationRegistry.getContext();
96 }
97
98 @Test
99 public void readTarHeaders_backupEncrypted_correctlyParsesFileMetadata() throws Exception {
100 InputStream inputStream = mContext.getResources().openRawResource(
101 R.raw.backup_telephony_with_password);
102 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
103 inputStream, "123");
104 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
105 mBytesReadListenerMock, mBackupManagerMonitorMock);
106 FileMetadata fileMetadata = tarBackupReader.readTarHeaders();
107
108 assertThat(fileMetadata.packageName).isEqualTo(TELEPHONY_PACKAGE_NAME);
109 assertThat(fileMetadata.mode).isEqualTo(0600);
110 assertThat(fileMetadata.size).isEqualTo(2438);
111 assertThat(fileMetadata.domain).isEqualTo(null);
112 assertThat(fileMetadata.path).isEqualTo("_manifest");
113 }
114
115 @Test
116 public void readTarHeaders_backupNotEncrypted_correctlyParsesFileMetadata() throws Exception {
117 InputStream inputStream = mContext.getResources().openRawResource(
118 R.raw.backup_telephony_no_password);
119 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
120 inputStream, null);
121 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
122 mBytesReadListenerMock, mBackupManagerMonitorMock);
123 FileMetadata fileMetadata = tarBackupReader.readTarHeaders();
124
125 assertThat(fileMetadata.packageName).isEqualTo(TELEPHONY_PACKAGE_NAME);
126 assertThat(fileMetadata.mode).isEqualTo(0600);
127 assertThat(fileMetadata.size).isEqualTo(2438);
128 assertThat(fileMetadata.domain).isEqualTo(null);
129 assertThat(fileMetadata.path).isEqualTo("_manifest");
130 }
131
132 @Test
Artem Iglikova1a4a9f2017-05-11 16:43:53 +0100133 public void readTarHeaders_backupNotEncrypted_correctlyReadsPaxHeader() throws Exception {
134 // Files with long names (>100 chars) will force backup to add PAX header.
135 InputStream inputStream = mContext.getResources().openRawResource(
136 R.raw.backup_file_with_long_name);
137 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
138 inputStream, null);
139 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
140 mBytesReadListenerMock, mBackupManagerMonitorMock);
141
142 // Read manifest file.
143 FileMetadata fileMetadata = tarBackupReader.readTarHeaders();
144 Signature[] signatures = tarBackupReader.readAppManifestAndReturnSignatures(
145 fileMetadata);
146 RestorePolicy restorePolicy = tarBackupReader.chooseRestorePolicy(
Michal Karpinski528c3e52018-02-07 17:47:10 +0000147 mPackageManagerStub, false /* allowApks */, fileMetadata, signatures,
148 mMockPackageManagerInternal);
Artem Iglikova1a4a9f2017-05-11 16:43:53 +0100149
150 assertThat(restorePolicy).isEqualTo(RestorePolicy.IGNORE);
151 assertThat(fileMetadata.packageName).isEqualTo(TEST_PACKAGE_NAME);
Michal Karpinskife4ae0c2018-01-25 15:24:00 +0000152 assertThat(fileMetadata.path).isEqualTo(BackupManagerService.BACKUP_MANIFEST_FILENAME);
Artem Iglikova1a4a9f2017-05-11 16:43:53 +0100153
154 tarBackupReader.skipTarPadding(fileMetadata.size);
155
156 // Read actual file (PAX header will only exist here).
157 fileMetadata = tarBackupReader.readTarHeaders();
158 signatures = tarBackupReader.readAppManifestAndReturnSignatures(
159 fileMetadata);
160 restorePolicy = tarBackupReader.chooseRestorePolicy(
Michal Karpinski528c3e52018-02-07 17:47:10 +0000161 mPackageManagerStub, false /* allowApks */, fileMetadata, signatures,
162 mMockPackageManagerInternal);
Artem Iglikova1a4a9f2017-05-11 16:43:53 +0100163
164 assertThat(restorePolicy).isEqualTo(RestorePolicy.IGNORE);
165 assertThat(fileMetadata.packageName).isEqualTo(TEST_PACKAGE_NAME);
166 char[] expectedFileNameChars = new char[200];
167 Arrays.fill(expectedFileNameChars, '1');
168 String expectedFileName = new String(expectedFileNameChars);
169 assertThat(fileMetadata.path).isEqualTo(expectedFileName);
170 }
171
172 @Test
Artem Iglikov13fffd22017-05-08 17:17:13 +0100173 public void readAppManifest_backupEncrypted_correctlyParsesAppManifest() throws Exception {
174 InputStream inputStream = mContext.getResources().openRawResource(
175 R.raw.backup_telephony_with_password);
176 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
177 inputStream, "123");
178 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
179 mBytesReadListenerMock, mBackupManagerMonitorMock);
180 FileMetadata fileMetadata = tarBackupReader.readTarHeaders();
181
182 Signature[] signatures = tarBackupReader.readAppManifestAndReturnSignatures(fileMetadata);
183
184 assertThat(fileMetadata.version).isEqualTo(TELEPHONY_PACKAGE_VERSION);
185 assertThat(fileMetadata.hasApk).isFalse();
186 assertThat(signatures).isNotNull();
187 assertThat(signatures).hasLength(1);
188
189 String signatureSha256 = Hashing.sha256().hashBytes(signatures[0].toByteArray()).toString();
190 assertThat(signatureSha256).isEqualTo(TELEPHONY_PACKAGE_SIGNATURE_SHA256);
191 }
192
193 @Test
194 public void readAppManifest_backupNotEncrypted_correctlyParsesAppManifest() throws Exception {
195 InputStream inputStream = mContext.getResources().openRawResource(
196 R.raw.backup_telephony_no_password);
197 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
198 inputStream, null);
199 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
200 mBytesReadListenerMock, mBackupManagerMonitorMock);
201 FileMetadata fileMetadata = tarBackupReader.readTarHeaders();
202
203 Signature[] signatures = tarBackupReader.readAppManifestAndReturnSignatures(fileMetadata);
204
205 assertThat(fileMetadata.version).isEqualTo(TELEPHONY_PACKAGE_VERSION);
206 assertThat(fileMetadata.hasApk).isFalse();
207 assertThat(signatures).isNotNull();
208 assertThat(signatures).hasLength(1);
209
210 String signatureSha256 = Hashing.sha256().hashBytes(signatures[0].toByteArray()).toString();
211 assertThat(signatureSha256).isEqualTo(TELEPHONY_PACKAGE_SIGNATURE_SHA256);
212 }
Artem Iglikova08220b2017-05-09 14:28:29 +0100213
214 @Test
215 public void chooseRestorePolicy_signaturesIsNull_returnsIgnore() throws Exception {
216 InputStream inputStream = mContext.getResources().openRawResource(
217 R.raw.backup_telephony_no_password);
218 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
219 inputStream, null);
220 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
221 mBytesReadListenerMock, mBackupManagerMonitorMock);
222
223 RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
Michal Karpinski528c3e52018-02-07 17:47:10 +0000224 true /* allowApks */, new FileMetadata(), null /* signatures */,
225 mMockPackageManagerInternal);
Artem Iglikova08220b2017-05-09 14:28:29 +0100226
227 assertThat(policy).isEqualTo(RestorePolicy.IGNORE);
228 verifyZeroInteractions(mBackupManagerMonitorMock);
229 }
230
231 @Test
232 public void chooseRestorePolicy_packageDoesNotExistAndAllowApksAndHasApk_returnsAcceptIfApk()
233 throws Exception {
234 InputStream inputStream = mContext.getResources().openRawResource(
235 R.raw.backup_telephony_no_password);
236 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
237 inputStream, null);
238 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
239 mBytesReadListenerMock, mBackupManagerMonitorMock);
240 FileMetadata info = new FileMetadata();
241 info.hasApk = true;
242 PackageManagerStub.sPackageInfo = null;
243
244 RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
Michal Karpinski528c3e52018-02-07 17:47:10 +0000245 true /* allowApks */, info, new Signature[0] /* signatures */,
246 mMockPackageManagerInternal);
Artem Iglikova08220b2017-05-09 14:28:29 +0100247
248 assertThat(policy).isEqualTo(RestorePolicy.ACCEPT_IF_APK);
249 ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
250 verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture());
251 assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo(
252 LOG_EVENT_ID_APK_NOT_INSTALLED);
253 }
254
255 @Test
256 public void
257 chooseRestorePolicy_packageDoesNotExistAndAllowApksAndDoesNotHaveApk_returnsAcceptIfApkLogsCannotRestore()
258 throws Exception {
259 InputStream inputStream = mContext.getResources().openRawResource(
260 R.raw.backup_telephony_no_password);
261 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
262 inputStream, null);
263 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
264 mBytesReadListenerMock, mBackupManagerMonitorMock);
265 FileMetadata info = new FileMetadata();
266 info.hasApk = false;
267 PackageManagerStub.sPackageInfo = null;
268
269 RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
Michal Karpinski528c3e52018-02-07 17:47:10 +0000270 true /* allowApks */, info, new Signature[0] /* signatures */,
271 mMockPackageManagerInternal);
Artem Iglikova08220b2017-05-09 14:28:29 +0100272
273 assertThat(policy).isEqualTo(RestorePolicy.ACCEPT_IF_APK);
274 ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
275 verify(mBackupManagerMonitorMock, times(2)).onEvent(bundleCaptor.capture());
276 List<Bundle> eventBundles = bundleCaptor.getAllValues();
277 assertThat(eventBundles).hasSize(2);
278 assertThat(eventBundles.get(0).get(EXTRA_LOG_EVENT_ID)).isEqualTo(
279 LOG_EVENT_ID_APK_NOT_INSTALLED);
280 assertThat(eventBundles.get(1).get(EXTRA_LOG_EVENT_ID)).isEqualTo(
281 LOG_EVENT_ID_CANNOT_RESTORE_WITHOUT_APK);
282 }
283
284 @Test
285 public void chooseRestorePolicy_packageDoesNotExistAndDoesNotAllowApks_returnsIgnore()
286 throws Exception {
287 InputStream inputStream = mContext.getResources().openRawResource(
288 R.raw.backup_telephony_no_password);
289 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
290 inputStream, null);
291 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
292 mBytesReadListenerMock, mBackupManagerMonitorMock);
293 PackageManagerStub.sPackageInfo = null;
294
295 RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
Michal Karpinski528c3e52018-02-07 17:47:10 +0000296 false /* allowApks */, new FileMetadata(), new Signature[0] /* signatures */,
297 mMockPackageManagerInternal);
Artem Iglikova08220b2017-05-09 14:28:29 +0100298
299 assertThat(policy).isEqualTo(RestorePolicy.IGNORE);
300 ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
301 verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture());
302 assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo(
303 LOG_EVENT_ID_APK_NOT_INSTALLED);
304 }
305
306 @Test
307 public void chooseRestorePolicy_doesNotAllowsBackup_returnsIgnore() throws Exception {
308 InputStream inputStream = mContext.getResources().openRawResource(
309 R.raw.backup_telephony_no_password);
310 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
311 inputStream, null);
312 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
313 mBytesReadListenerMock, mBackupManagerMonitorMock);
314
315 PackageInfo packageInfo = new PackageInfo();
316 packageInfo.applicationInfo = new ApplicationInfo();
317 packageInfo.applicationInfo.flags = ~ApplicationInfo.FLAG_ALLOW_BACKUP;
318 PackageManagerStub.sPackageInfo = packageInfo;
319
320 RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
Michal Karpinski528c3e52018-02-07 17:47:10 +0000321 false /* allowApks */, new FileMetadata(), new Signature[0] /* signatures */,
322 mMockPackageManagerInternal);
Artem Iglikova08220b2017-05-09 14:28:29 +0100323
324 assertThat(policy).isEqualTo(RestorePolicy.IGNORE);
325 ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
326 verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture());
327 assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo(
328 LOG_EVENT_ID_FULL_RESTORE_ALLOW_BACKUP_FALSE);
329 }
330
331 @Test
332 public void chooseRestorePolicy_systemAppWithNoAgent_returnsIgnore() throws Exception {
333 InputStream inputStream = mContext.getResources().openRawResource(
334 R.raw.backup_telephony_no_password);
335 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
336 inputStream, null);
337 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
338 mBytesReadListenerMock, mBackupManagerMonitorMock);
339
340 PackageInfo packageInfo = new PackageInfo();
341 packageInfo.applicationInfo = new ApplicationInfo();
342 packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP;
343 packageInfo.applicationInfo.uid = Process.SYSTEM_UID;
344 packageInfo.applicationInfo.backupAgentName = null;
345 PackageManagerStub.sPackageInfo = packageInfo;
346
347 RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
Michal Karpinski528c3e52018-02-07 17:47:10 +0000348 false /* allowApks */, new FileMetadata(), new Signature[0] /* signatures */,
349 mMockPackageManagerInternal);
Artem Iglikova08220b2017-05-09 14:28:29 +0100350
351 assertThat(policy).isEqualTo(RestorePolicy.IGNORE);
352 ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
353 verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture());
354 assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo(
355 LOG_EVENT_ID_SYSTEM_APP_NO_AGENT);
356 }
357
358 @Test
359 public void chooseRestorePolicy_nonSystemAppSignaturesDoNotMatch_returnsIgnore()
360 throws Exception {
361 InputStream inputStream = mContext.getResources().openRawResource(
362 R.raw.backup_telephony_no_password);
363 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
364 inputStream, null);
365 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
366 mBytesReadListenerMock, mBackupManagerMonitorMock);
367 Signature[] signatures = new Signature[]{FAKE_SIGNATURE_1};
368
369 PackageInfo packageInfo = new PackageInfo();
370 packageInfo.applicationInfo = new ApplicationInfo();
371 packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP;
372 packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
373 packageInfo.applicationInfo.backupAgentName = null;
Michal Karpinski528c3e52018-02-07 17:47:10 +0000374 packageInfo.signingCertificateHistory = new Signature[][] {{FAKE_SIGNATURE_2}};
Artem Iglikova08220b2017-05-09 14:28:29 +0100375 PackageManagerStub.sPackageInfo = packageInfo;
376
377 RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
Michal Karpinski528c3e52018-02-07 17:47:10 +0000378 false /* allowApks */, new FileMetadata(), signatures, mMockPackageManagerInternal);
Artem Iglikova08220b2017-05-09 14:28:29 +0100379
380 assertThat(policy).isEqualTo(RestorePolicy.IGNORE);
381 ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
382 verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture());
383 assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo(
384 LOG_EVENT_ID_FULL_RESTORE_SIGNATURE_MISMATCH);
385 }
386
387 @Test
Artem Iglikova1a4a9f2017-05-11 16:43:53 +0100388 public void chooseRestorePolicy_systemAppWithBackupAgentAndRestoreAnyVersion_returnsAccept()
389 throws Exception {
Artem Iglikova08220b2017-05-09 14:28:29 +0100390 InputStream inputStream = mContext.getResources().openRawResource(
391 R.raw.backup_telephony_no_password);
392 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
393 inputStream, null);
394 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
395 mBytesReadListenerMock, mBackupManagerMonitorMock);
396 Signature[] signatures = new Signature[]{FAKE_SIGNATURE_1};
397
398 PackageInfo packageInfo = new PackageInfo();
Michal Karpinski528c3e52018-02-07 17:47:10 +0000399 packageInfo.packageName = "test";
Artem Iglikova08220b2017-05-09 14:28:29 +0100400 packageInfo.applicationInfo = new ApplicationInfo();
401 packageInfo.applicationInfo.flags |=
402 ApplicationInfo.FLAG_ALLOW_BACKUP | ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
403 packageInfo.applicationInfo.uid = Process.SYSTEM_UID;
404 packageInfo.applicationInfo.backupAgentName = "backup.agent";
Michal Karpinski528c3e52018-02-07 17:47:10 +0000405 packageInfo.signingCertificateHistory = new Signature[][] {{FAKE_SIGNATURE_1}};
Artem Iglikova08220b2017-05-09 14:28:29 +0100406 PackageManagerStub.sPackageInfo = packageInfo;
407
Michal Karpinski528c3e52018-02-07 17:47:10 +0000408 doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(FAKE_SIGNATURE_1,
409 packageInfo.packageName);
Artem Iglikova08220b2017-05-09 14:28:29 +0100410 RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
Michal Karpinski528c3e52018-02-07 17:47:10 +0000411 false /* allowApks */, new FileMetadata(), signatures, mMockPackageManagerInternal);
Artem Iglikova08220b2017-05-09 14:28:29 +0100412
413 assertThat(policy).isEqualTo(RestorePolicy.ACCEPT);
414 ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
415 verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture());
416 assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo(
417 LOG_EVENT_ID_RESTORE_ANY_VERSION);
418 }
419
420 @Test
421 public void chooseRestorePolicy_restoreAnyVersion_returnsAccept() throws Exception {
422 InputStream inputStream = mContext.getResources().openRawResource(
423 R.raw.backup_telephony_no_password);
424 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
425 inputStream, null);
426 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
427 mBytesReadListenerMock, mBackupManagerMonitorMock);
428 Signature[] signatures = new Signature[]{FAKE_SIGNATURE_1};
429
430 PackageInfo packageInfo = new PackageInfo();
Michal Karpinski528c3e52018-02-07 17:47:10 +0000431 packageInfo.packageName = "test";
Artem Iglikova08220b2017-05-09 14:28:29 +0100432 packageInfo.applicationInfo = new ApplicationInfo();
433 packageInfo.applicationInfo.flags |=
434 ApplicationInfo.FLAG_ALLOW_BACKUP | ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
435 packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
436 packageInfo.applicationInfo.backupAgentName = null;
Michal Karpinski528c3e52018-02-07 17:47:10 +0000437 packageInfo.signingCertificateHistory = new Signature[][] {{FAKE_SIGNATURE_1}};
Artem Iglikova08220b2017-05-09 14:28:29 +0100438 PackageManagerStub.sPackageInfo = packageInfo;
439
Michal Karpinski528c3e52018-02-07 17:47:10 +0000440 doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(FAKE_SIGNATURE_1,
441 packageInfo.packageName);
Artem Iglikova08220b2017-05-09 14:28:29 +0100442 RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
Michal Karpinski528c3e52018-02-07 17:47:10 +0000443 false /* allowApks */, new FileMetadata(), signatures, mMockPackageManagerInternal);
Artem Iglikova08220b2017-05-09 14:28:29 +0100444
445 assertThat(policy).isEqualTo(RestorePolicy.ACCEPT);
446 ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
447 verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture());
448 assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo(
449 LOG_EVENT_ID_RESTORE_ANY_VERSION);
450 }
451
452 @Test
453 public void chooseRestorePolicy_notRestoreAnyVersionButVersionMatch_returnsAccept()
454 throws Exception {
455 InputStream inputStream = mContext.getResources().openRawResource(
456 R.raw.backup_telephony_no_password);
457 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
458 inputStream, null);
459 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
460 mBytesReadListenerMock, mBackupManagerMonitorMock);
461 Signature[] signatures = new Signature[]{FAKE_SIGNATURE_1};
462 FileMetadata info = new FileMetadata();
463 info.version = 1;
464
465 PackageInfo packageInfo = new PackageInfo();
Michal Karpinski528c3e52018-02-07 17:47:10 +0000466 packageInfo.packageName = "test";
Artem Iglikova08220b2017-05-09 14:28:29 +0100467 packageInfo.applicationInfo = new ApplicationInfo();
468 packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP;
469 packageInfo.applicationInfo.flags &= ~ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
470 packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
471 packageInfo.applicationInfo.backupAgentName = null;
Michal Karpinski528c3e52018-02-07 17:47:10 +0000472 packageInfo.signingCertificateHistory = new Signature[][] {{FAKE_SIGNATURE_1}};
Artem Iglikova08220b2017-05-09 14:28:29 +0100473 packageInfo.versionCode = 2;
474 PackageManagerStub.sPackageInfo = packageInfo;
475
Michal Karpinski528c3e52018-02-07 17:47:10 +0000476 doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(FAKE_SIGNATURE_1,
477 packageInfo.packageName);
Artem Iglikova08220b2017-05-09 14:28:29 +0100478 RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
Michal Karpinski528c3e52018-02-07 17:47:10 +0000479 false /* allowApks */, info, signatures, mMockPackageManagerInternal);
Artem Iglikova08220b2017-05-09 14:28:29 +0100480
481 assertThat(policy).isEqualTo(RestorePolicy.ACCEPT);
482 ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
483 verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture());
484 assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo(
485 LOG_EVENT_ID_VERSIONS_MATCH);
486 }
487
488 @Test
489 public void
490 chooseRestorePolicy_notRestoreAnyVersionAndVersionMismatchButAllowApksAndHasApk_returnsAcceptIfApk()
491 throws Exception {
492 InputStream inputStream = mContext.getResources().openRawResource(
493 R.raw.backup_telephony_no_password);
494 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
495 inputStream, null);
496 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
497 mBytesReadListenerMock, mBackupManagerMonitorMock);
498 Signature[] signatures = new Signature[]{FAKE_SIGNATURE_1};
499 FileMetadata info = new FileMetadata();
500 info.version = 2;
501 info.hasApk = true;
502
503 PackageInfo packageInfo = new PackageInfo();
Michal Karpinski528c3e52018-02-07 17:47:10 +0000504 packageInfo.packageName = "test";
Artem Iglikova08220b2017-05-09 14:28:29 +0100505 packageInfo.applicationInfo = new ApplicationInfo();
506 packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP;
507 packageInfo.applicationInfo.flags &= ~ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
508 packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
509 packageInfo.applicationInfo.backupAgentName = null;
Michal Karpinski528c3e52018-02-07 17:47:10 +0000510 packageInfo.signingCertificateHistory = new Signature[][] {{FAKE_SIGNATURE_1}};
Artem Iglikova08220b2017-05-09 14:28:29 +0100511 packageInfo.versionCode = 1;
512 PackageManagerStub.sPackageInfo = packageInfo;
513
Michal Karpinski528c3e52018-02-07 17:47:10 +0000514 doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(FAKE_SIGNATURE_1,
515 packageInfo.packageName);
Artem Iglikova08220b2017-05-09 14:28:29 +0100516 RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
Michal Karpinski528c3e52018-02-07 17:47:10 +0000517 true /* allowApks */, info, signatures, mMockPackageManagerInternal);
Artem Iglikova08220b2017-05-09 14:28:29 +0100518
519 assertThat(policy).isEqualTo(RestorePolicy.ACCEPT_IF_APK);
520 verifyNoMoreInteractions(mBackupManagerMonitorMock);
521 }
522
523 @Test
524 public void
525 chooseRestorePolicy_notRestoreAnyVersionAndVersionMismatchAndDoesNotAllowApks_returnsIgnore()
526 throws Exception {
527 InputStream inputStream = mContext.getResources().openRawResource(
528 R.raw.backup_telephony_no_password);
529 InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream(
530 inputStream, null);
531 TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream,
532 mBytesReadListenerMock, mBackupManagerMonitorMock);
533 Signature[] signatures = new Signature[]{FAKE_SIGNATURE_1};
534 FileMetadata info = new FileMetadata();
535 info.version = 2;
536
537 PackageInfo packageInfo = new PackageInfo();
Michal Karpinski528c3e52018-02-07 17:47:10 +0000538 packageInfo.packageName = "test";
Artem Iglikova08220b2017-05-09 14:28:29 +0100539 packageInfo.applicationInfo = new ApplicationInfo();
540 packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP;
541 packageInfo.applicationInfo.flags &= ~ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
542 packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
543 packageInfo.applicationInfo.backupAgentName = null;
Michal Karpinski528c3e52018-02-07 17:47:10 +0000544 packageInfo.signingCertificateHistory = new Signature[][] {{FAKE_SIGNATURE_1}};
Artem Iglikova08220b2017-05-09 14:28:29 +0100545 packageInfo.versionCode = 1;
546 PackageManagerStub.sPackageInfo = packageInfo;
547
Michal Karpinski528c3e52018-02-07 17:47:10 +0000548 doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(FAKE_SIGNATURE_1,
549 packageInfo.packageName);
Artem Iglikova08220b2017-05-09 14:28:29 +0100550 RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
Michal Karpinski528c3e52018-02-07 17:47:10 +0000551 false /* allowApks */, info, signatures, mMockPackageManagerInternal);
Artem Iglikova08220b2017-05-09 14:28:29 +0100552
553 assertThat(policy).isEqualTo(RestorePolicy.IGNORE);
554 ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
555 verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture());
556 assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo(
557 LOG_EVENT_ID_VERSION_OF_BACKUP_OLDER);
558 }
Artem Iglikova1a4a9f2017-05-11 16:43:53 +0100559}
Artem Iglikova08220b2017-05-09 14:28:29 +0100560