blob: 3c3721c6b20a4a690adda0c68740b82365584eee [file] [log] [blame]
Narayan Kamath988149c2016-12-01 13:32:59 +00001/*
2 * Copyright (C) 2016 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 */
16package com.android.server.pm;
17
Philip P. Moltmann0635dab2019-03-02 11:19:03 -080018import static android.content.res.Resources.ID_NULL;
19
Philip P. Moltmann17f65af2018-10-18 15:32:29 -070020import static org.junit.Assert.assertEquals;
21import static org.junit.Assert.assertNotNull;
22import static org.junit.Assert.assertSame;
23import static org.junit.Assert.assertTrue;
Brett Chabota26eda92018-07-23 13:08:30 -070024
Narayan Kamathfb2afbf2016-11-24 13:22:40 +000025import android.content.pm.ActivityInfo;
26import android.content.pm.ApplicationInfo;
27import android.content.pm.ConfigurationInfo;
28import android.content.pm.FeatureGroupInfo;
29import android.content.pm.FeatureInfo;
30import android.content.pm.InstrumentationInfo;
Narayan Kamath988149c2016-12-01 13:32:59 +000031import android.content.pm.PackageParser;
Narayan Kamathfb2afbf2016-11-24 13:22:40 +000032import android.content.pm.ProviderInfo;
33import android.content.pm.ServiceInfo;
Nicolas Geoffrayabcd58e2018-10-22 10:23:50 +010034import android.content.pm.SharedLibraryInfo;
Narayan Kamathfb2afbf2016-11-24 13:22:40 +000035import android.content.pm.Signature;
36import android.os.Bundle;
37import android.os.Parcel;
Adrian Roosc8af6042018-03-19 14:51:02 +010038import android.platform.test.annotations.Presubmit;
Brett Chabota26eda92018-07-23 13:08:30 -070039import android.util.ArrayMap;
40import android.util.ArraySet;
41
42import androidx.test.filters.MediumTest;
43import androidx.test.filters.SmallTest;
44import androidx.test.runner.AndroidJUnit4;
45
Nicolas Geoffray10b07792018-10-27 13:48:54 +010046import libcore.io.IoUtils;
47
Brett Chabota26eda92018-07-23 13:08:30 -070048import org.junit.Before;
49import org.junit.Test;
50import org.junit.runner.RunWith;
51
Narayan Kamath988149c2016-12-01 13:32:59 +000052import java.io.File;
Narayan Kamathfb2afbf2016-11-24 13:22:40 +000053import java.lang.reflect.Array;
54import java.lang.reflect.Field;
Narayan Kamath988149c2016-12-01 13:32:59 +000055import java.nio.charset.StandardCharsets;
Narayan Kamathfb2afbf2016-11-24 13:22:40 +000056import java.util.ArrayList;
57import java.util.Arrays;
58import java.util.HashSet;
59import java.util.List;
60import java.util.Set;
Narayan Kamath988149c2016-12-01 13:32:59 +000061
Narayan Kamath988149c2016-12-01 13:32:59 +000062@RunWith(AndroidJUnit4.class)
63@MediumTest
64public class PackageParserTest {
65 private File mTmpDir;
66 private static final File FRAMEWORK = new File("/system/framework/framework-res.apk");
67
68 @Before
69 public void setUp() {
70 // Create a new temporary directory for each of our tests.
71 mTmpDir = IoUtils.createTemporaryDirectory("PackageParserTest");
72 }
73
74 @Test
75 public void testParse_noCache() throws Exception {
76 PackageParser pp = new CachePackageNameParser();
77 PackageParser.Package pkg = pp.parsePackage(FRAMEWORK, 0 /* parseFlags */,
78 false /* useCaches */);
79 assertNotNull(pkg);
80
81 pp.setCacheDir(mTmpDir);
82 pkg = pp.parsePackage(FRAMEWORK, 0 /* parseFlags */,
83 false /* useCaches */);
84 assertNotNull(pkg);
85
86 // Make sure that we always write out a cache entry for future reference,
87 // whether or not we're asked to use caches.
88 assertEquals(1, mTmpDir.list().length);
89 }
90
91 @Test
92 public void testParse_withCache() throws Exception {
93 PackageParser pp = new CachePackageNameParser();
94
95 pp.setCacheDir(mTmpDir);
96 // The first parse will write this package to the cache.
97 pp.parsePackage(FRAMEWORK, 0 /* parseFlags */, true /* useCaches */);
98
99 // Now attempt to parse the package again, should return the
100 // cached result.
101 PackageParser.Package pkg = pp.parsePackage(FRAMEWORK, 0 /* parseFlags */,
102 true /* useCaches */);
103 assertEquals("cache_android", pkg.packageName);
104
105 // Try again, with useCaches == false, shouldn't return the parsed
106 // result.
107 pkg = pp.parsePackage(FRAMEWORK, 0 /* parseFlags */, false /* useCaches */);
108 assertEquals("android", pkg.packageName);
109
110 // We haven't set a cache directory here : the parse should still succeed,
111 // just not using the cached results.
112 pp = new CachePackageNameParser();
113 pkg = pp.parsePackage(FRAMEWORK, 0 /* parseFlags */, true /* useCaches */);
114 assertEquals("android", pkg.packageName);
115
116 pkg = pp.parsePackage(FRAMEWORK, 0 /* parseFlags */, false /* useCaches */);
117 assertEquals("android", pkg.packageName);
118 }
119
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000120 @Test
121 public void test_serializePackage() throws Exception {
122 PackageParser pp = new PackageParser();
123 pp.setCacheDir(mTmpDir);
124
125 PackageParser.Package pkg = pp.parsePackage(FRAMEWORK, 0 /* parseFlags */,
126 true /* useCaches */);
127
128 Parcel p = Parcel.obtain();
129 pkg.writeToParcel(p, 0 /* flags */);
130
131 p.setDataPosition(0);
132 PackageParser.Package deserialized = new PackageParser.Package(p);
133
134 assertPackagesEqual(pkg, deserialized);
135 }
136
137 @Test
Adrian Roosc8af6042018-03-19 14:51:02 +0100138 @SmallTest
139 @Presubmit
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000140 public void test_roundTripKnownFields() throws Exception {
141 PackageParser.Package pkg = new PackageParser.Package("foo");
142 setKnownFields(pkg);
143
144 Parcel p = Parcel.obtain();
145 pkg.writeToParcel(p, 0 /* flags */);
146
147 p.setDataPosition(0);
148 PackageParser.Package deserialized = new PackageParser.Package(p);
149 assertAllFieldsExist(deserialized);
150 }
151
Narayan Kamath07ac1442017-02-10 15:08:07 +0000152 @Test
153 public void test_stringInterning() throws Exception {
154 PackageParser.Package pkg = new PackageParser.Package("foo");
155 setKnownFields(pkg);
156
157 Parcel p = Parcel.obtain();
158 pkg.writeToParcel(p, 0 /* flags */);
159
160 p.setDataPosition(0);
161 PackageParser.Package deserialized = new PackageParser.Package(p);
162
163 p.setDataPosition(0);
164 PackageParser.Package deserialized2 = new PackageParser.Package(p);
165
166 assertSame(deserialized.packageName, deserialized2.packageName);
167 assertSame(deserialized.applicationInfo.permission,
168 deserialized2.applicationInfo.permission);
169 assertSame(deserialized.requestedPermissions.get(0),
170 deserialized2.requestedPermissions.get(0));
171 assertSame(deserialized.protectedBroadcasts.get(0),
172 deserialized2.protectedBroadcasts.get(0));
173 assertSame(deserialized.usesLibraries.get(0),
174 deserialized2.usesLibraries.get(0));
175 assertSame(deserialized.usesOptionalLibraries.get(0),
176 deserialized2.usesOptionalLibraries.get(0));
177 assertSame(deserialized.mVersionName, deserialized2.mVersionName);
178 assertSame(deserialized.mSharedUserId, deserialized2.mSharedUserId);
179 }
180
181
Narayan Kamath988149c2016-12-01 13:32:59 +0000182 /**
183 * A trivial subclass of package parser that only caches the package name, and throws away
184 * all other information.
185 */
186 public static class CachePackageNameParser extends PackageParser {
187 @Override
188 public byte[] toCacheEntry(Package pkg) {
189 return ("cache_" + pkg.packageName).getBytes(StandardCharsets.UTF_8);
190 }
191
192 @Override
193 public Package fromCacheEntry(byte[] cacheEntry) {
194 return new Package(new String(cacheEntry, StandardCharsets.UTF_8));
195 }
196 }
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000197
198 // NOTE: The equality assertions below are based on code autogenerated by IntelliJ.
199
200 public static void assertPackagesEqual(PackageParser.Package a, PackageParser.Package b) {
201 assertEquals(a.baseRevisionCode, b.baseRevisionCode);
202 assertEquals(a.baseHardwareAccelerated, b.baseHardwareAccelerated);
203 assertEquals(a.mVersionCode, b.mVersionCode);
204 assertEquals(a.mSharedUserLabel, b.mSharedUserLabel);
205 assertEquals(a.mPreferredOrder, b.mPreferredOrder);
206 assertEquals(a.installLocation, b.installLocation);
207 assertEquals(a.coreApp, b.coreApp);
208 assertEquals(a.mRequiredForAllUsers, b.mRequiredForAllUsers);
Alan Viveretteb6a25732017-11-21 14:49:24 -0500209 assertEquals(a.mCompileSdkVersion, b.mCompileSdkVersion);
210 assertEquals(a.mCompileSdkVersionCodename, b.mCompileSdkVersionCodename);
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000211 assertEquals(a.use32bitAbi, b.use32bitAbi);
212 assertEquals(a.packageName, b.packageName);
213 assertTrue(Arrays.equals(a.splitNames, b.splitNames));
214 assertEquals(a.volumeUuid, b.volumeUuid);
215 assertEquals(a.codePath, b.codePath);
216 assertEquals(a.baseCodePath, b.baseCodePath);
217 assertTrue(Arrays.equals(a.splitCodePaths, b.splitCodePaths));
218 assertTrue(Arrays.equals(a.splitRevisionCodes, b.splitRevisionCodes));
219 assertTrue(Arrays.equals(a.splitFlags, b.splitFlags));
220 assertTrue(Arrays.equals(a.splitPrivateFlags, b.splitPrivateFlags));
221 assertApplicationInfoEqual(a.applicationInfo, b.applicationInfo);
222
223 assertEquals(a.permissions.size(), b.permissions.size());
224 for (int i = 0; i < a.permissions.size(); ++i) {
225 assertPermissionsEqual(a.permissions.get(i), b.permissions.get(i));
226 assertSame(a.permissions.get(i).owner, a);
227 assertSame(b.permissions.get(i).owner, b);
228 }
229
230 assertEquals(a.permissionGroups.size(), b.permissionGroups.size());
231 for (int i = 0; i < a.permissionGroups.size(); ++i) {
232 assertPermissionGroupsEqual(a.permissionGroups.get(i), b.permissionGroups.get(i));
233 }
234
235 assertEquals(a.activities.size(), b.activities.size());
236 for (int i = 0; i < a.activities.size(); ++i) {
237 assertActivitiesEqual(a.activities.get(i), b.activities.get(i));
238 }
239
240 assertEquals(a.receivers.size(), b.receivers.size());
241 for (int i = 0; i < a.receivers.size(); ++i) {
242 assertActivitiesEqual(a.receivers.get(i), b.receivers.get(i));
243 }
244
245 assertEquals(a.providers.size(), b.providers.size());
246 for (int i = 0; i < a.providers.size(); ++i) {
247 assertProvidersEqual(a.providers.get(i), b.providers.get(i));
248 }
249
250 assertEquals(a.services.size(), b.services.size());
251 for (int i = 0; i < a.services.size(); ++i) {
252 assertServicesEqual(a.services.get(i), b.services.get(i));
253 }
254
255 assertEquals(a.instrumentation.size(), b.instrumentation.size());
256 for (int i = 0; i < a.instrumentation.size(); ++i) {
257 assertInstrumentationEqual(a.instrumentation.get(i), b.instrumentation.get(i));
258 }
259
260 assertEquals(a.requestedPermissions, b.requestedPermissions);
261 assertEquals(a.protectedBroadcasts, b.protectedBroadcasts);
262 assertEquals(a.parentPackage, b.parentPackage);
263 assertEquals(a.childPackages, b.childPackages);
264 assertEquals(a.libraryNames, b.libraryNames);
265 assertEquals(a.usesLibraries, b.usesLibraries);
266 assertEquals(a.usesOptionalLibraries, b.usesOptionalLibraries);
267 assertTrue(Arrays.equals(a.usesLibraryFiles, b.usesLibraryFiles));
268 assertEquals(a.mOriginalPackages, b.mOriginalPackages);
269 assertEquals(a.mRealPackage, b.mRealPackage);
270 assertEquals(a.mAdoptPermissions, b.mAdoptPermissions);
271 assertBundleApproximateEquals(a.mAppMetaData, b.mAppMetaData);
272 assertEquals(a.mVersionName, b.mVersionName);
273 assertEquals(a.mSharedUserId, b.mSharedUserId);
Patrick Baumann420d58a2017-12-19 10:17:21 -0800274 assertTrue(Arrays.equals(a.mSigningDetails.signatures, b.mSigningDetails.signatures));
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000275 assertTrue(Arrays.equals(a.mLastPackageUsageTimeInMills, b.mLastPackageUsageTimeInMills));
276 assertEquals(a.mExtras, b.mExtras);
277 assertEquals(a.mRestrictedAccountType, b.mRestrictedAccountType);
278 assertEquals(a.mRequiredAccountType, b.mRequiredAccountType);
279 assertEquals(a.mOverlayTarget, b.mOverlayTarget);
Ryan Mitchella3628462019-01-14 12:19:40 -0800280 assertEquals(a.mOverlayTargetName, b.mOverlayTargetName);
Adrian Roosc8af6042018-03-19 14:51:02 +0100281 assertEquals(a.mOverlayCategory, b.mOverlayCategory);
282 assertEquals(a.mOverlayPriority, b.mOverlayPriority);
283 assertEquals(a.mOverlayIsStatic, b.mOverlayIsStatic);
Patrick Baumann420d58a2017-12-19 10:17:21 -0800284 assertEquals(a.mSigningDetails.publicKeys, b.mSigningDetails.publicKeys);
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000285 assertEquals(a.mUpgradeKeySets, b.mUpgradeKeySets);
286 assertEquals(a.mKeySetMapping, b.mKeySetMapping);
287 assertEquals(a.cpuAbiOverride, b.cpuAbiOverride);
288 assertTrue(Arrays.equals(a.restrictUpdateHash, b.restrictUpdateHash));
289 }
290
291 private static void assertBundleApproximateEquals(Bundle a, Bundle b) {
292 if (a == b) {
293 return;
294 }
295
296 // Force the bundles to be unparceled.
297 a.getBoolean("foo");
298 b.getBoolean("foo");
299
300 assertEquals(a.toString(), b.toString());
301 }
302
303 private static void assertComponentsEqual(PackageParser.Component<?> a,
304 PackageParser.Component<?> b) {
305 assertEquals(a.className, b.className);
306 assertBundleApproximateEquals(a.metaData, b.metaData);
307 assertEquals(a.getComponentName(), b.getComponentName());
308
309 if (a.intents != null && b.intents != null) {
310 assertEquals(a.intents.size(), b.intents.size());
311 } else if (a.intents == null || b.intents == null) {
312 return;
313 }
314
315 for (int i = 0; i < a.intents.size(); ++i) {
316 PackageParser.IntentInfo aIntent = a.intents.get(i);
317 PackageParser.IntentInfo bIntent = b.intents.get(i);
318
319 assertEquals(aIntent.hasDefault, bIntent.hasDefault);
320 assertEquals(aIntent.labelRes, bIntent.labelRes);
321 assertEquals(aIntent.nonLocalizedLabel, bIntent.nonLocalizedLabel);
322 assertEquals(aIntent.icon, bIntent.icon);
323 assertEquals(aIntent.logo, bIntent.logo);
324 assertEquals(aIntent.banner, bIntent.banner);
325 assertEquals(aIntent.preferred, bIntent.preferred);
326 }
327 }
328
329 private static void assertPermissionsEqual(PackageParser.Permission a,
330 PackageParser.Permission b) {
331 assertComponentsEqual(a, b);
332 assertEquals(a.tree, b.tree);
333
334 // Verify basic flags in PermissionInfo to make sure they're consistent. We don't perform
335 // a full structural equality here because the code that serializes them isn't parser
336 // specific and is tested elsewhere.
337 assertEquals(a.info.protectionLevel, b.info.protectionLevel);
338 assertEquals(a.info.group, b.info.group);
339 assertEquals(a.info.flags, b.info.flags);
340
341 if (a.group != null && b.group != null) {
342 assertPermissionGroupsEqual(a.group, b.group);
343 } else if (a.group != null || b.group != null) {
344 throw new AssertionError();
345 }
346 }
347
348 private static void assertInstrumentationEqual(PackageParser.Instrumentation a,
349 PackageParser.Instrumentation b) {
350 assertComponentsEqual(a, b);
351
352 // Sanity check for InstrumentationInfo.
353 assertEquals(a.info.targetPackage, b.info.targetPackage);
Dianne Hackborn1be53542017-04-28 13:36:00 -0700354 assertEquals(a.info.targetProcesses, b.info.targetProcesses);
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000355 assertEquals(a.info.sourceDir, b.info.sourceDir);
356 assertEquals(a.info.publicSourceDir, b.info.publicSourceDir);
357 }
358
359 private static void assertServicesEqual(PackageParser.Service a, PackageParser.Service b) {
360 assertComponentsEqual(a, b);
361
362 // Sanity check for ServiceInfo.
363 assertApplicationInfoEqual(a.info.applicationInfo, b.info.applicationInfo);
364 assertEquals(a.info.name, b.info.name);
365 }
366
367 private static void assertProvidersEqual(PackageParser.Provider a, PackageParser.Provider b) {
368 assertComponentsEqual(a, b);
369
370 // Sanity check for ProviderInfo
371 assertApplicationInfoEqual(a.info.applicationInfo, b.info.applicationInfo);
372 assertEquals(a.info.name, b.info.name);
373 }
374
375 private static void assertActivitiesEqual(PackageParser.Activity a, PackageParser.Activity b) {
376 assertComponentsEqual(a, b);
377
378 // Sanity check for ActivityInfo.
379 assertApplicationInfoEqual(a.info.applicationInfo, b.info.applicationInfo);
380 assertEquals(a.info.name, b.info.name);
381 }
382
383 private static void assertPermissionGroupsEqual(PackageParser.PermissionGroup a,
384 PackageParser.PermissionGroup b) {
385 assertComponentsEqual(a, b);
386
387 // Sanity check for PermissionGroupInfo.
388 assertEquals(a.info.name, b.info.name);
389 assertEquals(a.info.descriptionRes, b.info.descriptionRes);
390 }
391
392 private static void assertApplicationInfoEqual(ApplicationInfo a, ApplicationInfo that) {
393 assertEquals(a.descriptionRes, that.descriptionRes);
394 assertEquals(a.theme, that.theme);
395 assertEquals(a.fullBackupContent, that.fullBackupContent);
396 assertEquals(a.uiOptions, that.uiOptions);
397 assertEquals(a.flags, that.flags);
398 assertEquals(a.privateFlags, that.privateFlags);
399 assertEquals(a.requiresSmallestWidthDp, that.requiresSmallestWidthDp);
400 assertEquals(a.compatibleWidthLimitDp, that.compatibleWidthLimitDp);
401 assertEquals(a.largestWidthLimitDp, that.largestWidthLimitDp);
402 assertEquals(a.nativeLibraryRootRequiresIsa, that.nativeLibraryRootRequiresIsa);
403 assertEquals(a.uid, that.uid);
404 assertEquals(a.minSdkVersion, that.minSdkVersion);
405 assertEquals(a.targetSdkVersion, that.targetSdkVersion);
406 assertEquals(a.versionCode, that.versionCode);
407 assertEquals(a.enabled, that.enabled);
408 assertEquals(a.enabledSetting, that.enabledSetting);
409 assertEquals(a.installLocation, that.installLocation);
410 assertEquals(a.networkSecurityConfigRes, that.networkSecurityConfigRes);
411 assertEquals(a.taskAffinity, that.taskAffinity);
412 assertEquals(a.permission, that.permission);
413 assertEquals(a.processName, that.processName);
414 assertEquals(a.className, that.className);
415 assertEquals(a.manageSpaceActivityName, that.manageSpaceActivityName);
416 assertEquals(a.backupAgentName, that.backupAgentName);
417 assertEquals(a.volumeUuid, that.volumeUuid);
418 assertEquals(a.scanSourceDir, that.scanSourceDir);
419 assertEquals(a.scanPublicSourceDir, that.scanPublicSourceDir);
420 assertEquals(a.sourceDir, that.sourceDir);
421 assertEquals(a.publicSourceDir, that.publicSourceDir);
422 assertTrue(Arrays.equals(a.splitSourceDirs, that.splitSourceDirs));
423 assertTrue(Arrays.equals(a.splitPublicSourceDirs, that.splitPublicSourceDirs));
424 assertTrue(Arrays.equals(a.resourceDirs, that.resourceDirs));
Todd Kennedybe0b8892017-02-15 14:13:52 -0800425 assertEquals(a.seInfo, that.seInfo);
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000426 assertTrue(Arrays.equals(a.sharedLibraryFiles, that.sharedLibraryFiles));
427 assertEquals(a.dataDir, that.dataDir);
428 assertEquals(a.deviceProtectedDataDir, that.deviceProtectedDataDir);
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000429 assertEquals(a.credentialProtectedDataDir, that.credentialProtectedDataDir);
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000430 assertEquals(a.nativeLibraryDir, that.nativeLibraryDir);
431 assertEquals(a.secondaryNativeLibraryDir, that.secondaryNativeLibraryDir);
432 assertEquals(a.nativeLibraryRootDir, that.nativeLibraryRootDir);
433 assertEquals(a.primaryCpuAbi, that.primaryCpuAbi);
434 assertEquals(a.secondaryCpuAbi, that.secondaryCpuAbi);
435 }
436
437 public static void setKnownFields(PackageParser.Package pkg) {
438 pkg.baseRevisionCode = 100;
439 pkg.baseHardwareAccelerated = true;
440 pkg.mVersionCode = 100;
441 pkg.mSharedUserLabel = 100;
442 pkg.mPreferredOrder = 100;
443 pkg.installLocation = 100;
444 pkg.coreApp = true;
445 pkg.mRequiredForAllUsers = true;
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000446 pkg.use32bitAbi = true;
447 pkg.packageName = "foo";
Narayan Kamath07ac1442017-02-10 15:08:07 +0000448 pkg.splitNames = new String[] { "foo2" };
449 pkg.volumeUuid = "foo3";
450 pkg.codePath = "foo4";
451 pkg.baseCodePath = "foo5";
452 pkg.splitCodePaths = new String[] { "foo6" };
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000453 pkg.splitRevisionCodes = new int[] { 100 };
454 pkg.splitFlags = new int[] { 100 };
455 pkg.splitPrivateFlags = new int[] { 100 };
456 pkg.applicationInfo = new ApplicationInfo();
457
Philip P. Moltmanna4844d12019-03-02 10:17:23 -0800458 pkg.permissions.add(new PackageParser.Permission(pkg, (String) null));
Philip P. Moltmann0635dab2019-03-02 11:19:03 -0800459 pkg.permissionGroups.add(new PackageParser.PermissionGroup(pkg, ID_NULL, ID_NULL, ID_NULL));
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000460
461 final PackageParser.ParseComponentArgs dummy = new PackageParser.ParseComponentArgs(
462 pkg, new String[1], 0, 0, 0, 0, 0, 0, null, 0, 0, 0);
463
464 pkg.activities.add(new PackageParser.Activity(dummy, new ActivityInfo()));
465 pkg.receivers.add(new PackageParser.Activity(dummy, new ActivityInfo()));
466 pkg.providers.add(new PackageParser.Provider(dummy, new ProviderInfo()));
467 pkg.services.add(new PackageParser.Service(dummy, new ServiceInfo()));
468 pkg.instrumentation.add(new PackageParser.Instrumentation(dummy, new InstrumentationInfo()));
Narayan Kamath07ac1442017-02-10 15:08:07 +0000469 pkg.requestedPermissions.add("foo7");
Philip P. Moltmann17f65af2018-10-18 15:32:29 -0700470 pkg.implicitPermissions.add("foo25");
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000471
472 pkg.protectedBroadcasts = new ArrayList<>();
Narayan Kamath07ac1442017-02-10 15:08:07 +0000473 pkg.protectedBroadcasts.add("foo8");
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000474
Narayan Kamath07ac1442017-02-10 15:08:07 +0000475 pkg.parentPackage = new PackageParser.Package("foo9");
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000476
477 pkg.childPackages = new ArrayList<>();
478 pkg.childPackages.add(new PackageParser.Package("bar"));
479
Narayan Kamath07ac1442017-02-10 15:08:07 +0000480 pkg.staticSharedLibName = "foo23";
481 pkg.staticSharedLibVersion = 100;
482 pkg.usesStaticLibraries = new ArrayList<>();
483 pkg.usesStaticLibraries.add("foo23");
Svetoslav Ganovcdd685c2017-08-22 14:35:04 -0700484 pkg.usesStaticLibrariesCertDigests = new String[1][];
485 pkg.usesStaticLibrariesCertDigests[0] = new String[] { "digest" };
Dianne Hackborn3accca02013-09-20 09:32:11 -0700486 pkg.usesStaticLibrariesVersions = new long[] { 100 };
Narayan Kamath07ac1442017-02-10 15:08:07 +0000487
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000488 pkg.libraryNames = new ArrayList<>();
Narayan Kamath07ac1442017-02-10 15:08:07 +0000489 pkg.libraryNames.add("foo10");
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000490
491 pkg.usesLibraries = new ArrayList<>();
Narayan Kamath07ac1442017-02-10 15:08:07 +0000492 pkg.usesLibraries.add("foo11");
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000493
494 pkg.usesOptionalLibraries = new ArrayList<>();
Narayan Kamath07ac1442017-02-10 15:08:07 +0000495 pkg.usesOptionalLibraries.add("foo12");
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000496
Narayan Kamath07ac1442017-02-10 15:08:07 +0000497 pkg.usesLibraryFiles = new String[] { "foo13"};
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000498
Nicolas Geoffrayabcd58e2018-10-22 10:23:50 +0100499 pkg.usesLibraryInfos = new ArrayList<>();
Nicolas Geoffray8d144eb2018-11-15 12:59:52 +0000500 pkg.usesLibraryInfos.add(
501 new SharedLibraryInfo(null, null, null, null, 0L, 0, null, null, null));
Nicolas Geoffrayabcd58e2018-10-22 10:23:50 +0100502
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000503 pkg.mOriginalPackages = new ArrayList<>();
Narayan Kamath07ac1442017-02-10 15:08:07 +0000504 pkg.mOriginalPackages.add("foo14");
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000505
Narayan Kamath07ac1442017-02-10 15:08:07 +0000506 pkg.mRealPackage = "foo15";
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000507
508 pkg.mAdoptPermissions = new ArrayList<>();
Narayan Kamath07ac1442017-02-10 15:08:07 +0000509 pkg.mAdoptPermissions.add("foo16");
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000510
511 pkg.mAppMetaData = new Bundle();
Narayan Kamath07ac1442017-02-10 15:08:07 +0000512 pkg.mVersionName = "foo17";
513 pkg.mSharedUserId = "foo18";
Patrick Baumann420d58a2017-12-19 10:17:21 -0800514 pkg.mSigningDetails =
515 new PackageParser.SigningDetails(
516 new Signature[] { new Signature(new byte[16]) },
517 2,
Daniel Cashman77029c52018-01-18 16:19:29 -0800518 new ArraySet<>(),
Daniel Cashman77029c52018-01-18 16:19:29 -0800519 null);
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000520 pkg.mExtras = new Bundle();
Narayan Kamath07ac1442017-02-10 15:08:07 +0000521 pkg.mRestrictedAccountType = "foo19";
522 pkg.mRequiredAccountType = "foo20";
523 pkg.mOverlayTarget = "foo21";
Jaekyun Seokfe77bbc2017-05-12 14:56:19 +0900524 pkg.mOverlayPriority = 100;
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000525 pkg.mUpgradeKeySets = new ArraySet<>();
526 pkg.mKeySetMapping = new ArrayMap<>();
Narayan Kamath07ac1442017-02-10 15:08:07 +0000527 pkg.cpuAbiOverride = "foo22";
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000528 pkg.restrictUpdateHash = new byte[16];
529
530 pkg.preferredActivityFilters = new ArrayList<>();
531 pkg.preferredActivityFilters.add(new PackageParser.ActivityIntentInfo(
532 new PackageParser.Activity(dummy, new ActivityInfo())));
533
534 pkg.configPreferences = new ArrayList<>();
535 pkg.configPreferences.add(new ConfigurationInfo());
536
537 pkg.reqFeatures = new ArrayList<>();
538 pkg.reqFeatures.add(new FeatureInfo());
539
540 pkg.featureGroups = new ArrayList<>();
541 pkg.featureGroups.add(new FeatureGroupInfo());
Todd Kennedy5b1df2f2017-12-11 13:26:14 -0800542
543 pkg.mCompileSdkVersionCodename = "foo23";
544 pkg.mCompileSdkVersion = 100;
545 pkg.mVersionCodeMajor = 100;
Adrian Roosc8af6042018-03-19 14:51:02 +0100546
547 pkg.mOverlayCategory = "foo24";
548 pkg.mOverlayIsStatic = true;
Ryan Mitchella3628462019-01-14 12:19:40 -0800549 pkg.mOverlayTargetName = "foo26";
Adrian Roosc8af6042018-03-19 14:51:02 +0100550
551 pkg.baseHardwareAccelerated = true;
552 pkg.coreApp = true;
553 pkg.mRequiredForAllUsers = true;
554 pkg.visibleToInstantApps = true;
555 pkg.use32bitAbi = true;
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000556 }
557
558 private static void assertAllFieldsExist(PackageParser.Package pkg) throws Exception {
559 Field[] fields = PackageParser.Package.class.getDeclaredFields();
560
561 Set<String> nonSerializedFields = new HashSet<>();
562 nonSerializedFields.add("mExtras");
563 nonSerializedFields.add("packageUsageTimeMillis");
Adrian Roosc8af6042018-03-19 14:51:02 +0100564 nonSerializedFields.add("isStub");
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000565
566 for (Field f : fields) {
567 final Class<?> fieldType = f.getType();
568
569 if (nonSerializedFields.contains(f.getName())) {
570 continue;
571 }
572
573 if (List.class.isAssignableFrom(fieldType)) {
574 // Sanity check for list fields: Assume they're non-null and contain precisely
575 // one element.
576 List<?> list = (List<?>) f.get(pkg);
Narayan Kamath07ac1442017-02-10 15:08:07 +0000577 assertNotNull("List was null: " + f, list);
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000578 assertEquals(1, list.size());
579 } else if (fieldType.getComponentType() != null) {
580 // Sanity check for array fields: Assume they're non-null and contain precisely
581 // one element.
582 Object array = f.get(pkg);
583 assertNotNull(Array.get(array, 0));
584 } else if (fieldType == String.class) {
585 // String fields: Check that they're set to "foo".
586 String value = (String) f.get(pkg);
Narayan Kamath07ac1442017-02-10 15:08:07 +0000587
588 assertTrue("Bad value for field: " + f, value != null && value.startsWith("foo"));
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000589 } else if (fieldType == int.class) {
590 // int fields: Check that they're set to 100.
591 int value = (int) f.get(pkg);
Narayan Kamath07ac1442017-02-10 15:08:07 +0000592 assertEquals("Bad value for field: " + f, 100, value);
Adrian Roosc8af6042018-03-19 14:51:02 +0100593 } else if (fieldType == boolean.class) {
594 // boolean fields: Check that they're set to true.
595 boolean value = (boolean) f.get(pkg);
596 assertEquals("Bad value for field: " + f, true, value);
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000597 } else {
598 // All other fields: Check that they're set.
599 Object o = f.get(pkg);
Narayan Kamath07ac1442017-02-10 15:08:07 +0000600 assertNotNull("Field was null: " + f, o);
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000601 }
602 }
603 }
Narayan Kamath988149c2016-12-01 13:32:59 +0000604}
Narayan Kamathfb2afbf2016-11-24 13:22:40 +0000605