xref: /aosp_15_r20/build/soong/java/app_import_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2020 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage java
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"fmt"
19*333d2b36SAndroid Build Coastguard Worker	"reflect"
20*333d2b36SAndroid Build Coastguard Worker	"strings"
21*333d2b36SAndroid Build Coastguard Worker	"testing"
22*333d2b36SAndroid Build Coastguard Worker
23*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
24*333d2b36SAndroid Build Coastguard Worker
25*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
26*333d2b36SAndroid Build Coastguard Worker)
27*333d2b36SAndroid Build Coastguard Worker
28*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport(t *testing.T) {
29*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
30*333d2b36SAndroid Build Coastguard Worker		android_app_import {
31*333d2b36SAndroid Build Coastguard Worker			name: "foo",
32*333d2b36SAndroid Build Coastguard Worker			apk: "prebuilts/apk/app.apk",
33*333d2b36SAndroid Build Coastguard Worker			certificate: "platform",
34*333d2b36SAndroid Build Coastguard Worker			dex_preopt: {
35*333d2b36SAndroid Build Coastguard Worker				enabled: true,
36*333d2b36SAndroid Build Coastguard Worker			},
37*333d2b36SAndroid Build Coastguard Worker		}
38*333d2b36SAndroid Build Coastguard Worker		`)
39*333d2b36SAndroid Build Coastguard Worker
40*333d2b36SAndroid Build Coastguard Worker	variant := ctx.ModuleForTests("foo", "android_common")
41*333d2b36SAndroid Build Coastguard Worker
42*333d2b36SAndroid Build Coastguard Worker	// Check dexpreopt outputs.
43*333d2b36SAndroid Build Coastguard Worker	if variant.MaybeOutput("dexpreopt/foo/oat/arm64/package.vdex").Rule == nil ||
44*333d2b36SAndroid Build Coastguard Worker		variant.MaybeOutput("dexpreopt/foo/oat/arm64/package.odex").Rule == nil {
45*333d2b36SAndroid Build Coastguard Worker		t.Errorf("can't find dexpreopt outputs")
46*333d2b36SAndroid Build Coastguard Worker	}
47*333d2b36SAndroid Build Coastguard Worker
48*333d2b36SAndroid Build Coastguard Worker	// Check cert signing flag.
49*333d2b36SAndroid Build Coastguard Worker	signedApk := variant.Output("signed/foo.apk")
50*333d2b36SAndroid Build Coastguard Worker	signingFlag := signedApk.Args["certificates"]
51*333d2b36SAndroid Build Coastguard Worker	expected := "build/make/target/product/security/platform.x509.pem build/make/target/product/security/platform.pk8"
52*333d2b36SAndroid Build Coastguard Worker	if expected != signingFlag {
53*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected, signingFlag)
54*333d2b36SAndroid Build Coastguard Worker	}
55*333d2b36SAndroid Build Coastguard Worker	rule := variant.Rule("genProvenanceMetaData")
56*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid input", "prebuilts/apk/app.apk", rule.Inputs[0].String())
57*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", rule.Output.String())
58*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid args", "foo", rule.Args["module_name"])
59*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid args", "/system/app/foo/foo.apk", rule.Args["install_path"])
60*333d2b36SAndroid Build Coastguard Worker}
61*333d2b36SAndroid Build Coastguard Worker
62*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport_NoDexPreopt(t *testing.T) {
63*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
64*333d2b36SAndroid Build Coastguard Worker		android_app_import {
65*333d2b36SAndroid Build Coastguard Worker			name: "foo",
66*333d2b36SAndroid Build Coastguard Worker			apk: "prebuilts/apk/app.apk",
67*333d2b36SAndroid Build Coastguard Worker			certificate: "platform",
68*333d2b36SAndroid Build Coastguard Worker			dex_preopt: {
69*333d2b36SAndroid Build Coastguard Worker				enabled: false,
70*333d2b36SAndroid Build Coastguard Worker			},
71*333d2b36SAndroid Build Coastguard Worker		}
72*333d2b36SAndroid Build Coastguard Worker		`)
73*333d2b36SAndroid Build Coastguard Worker
74*333d2b36SAndroid Build Coastguard Worker	variant := ctx.ModuleForTests("foo", "android_common")
75*333d2b36SAndroid Build Coastguard Worker
76*333d2b36SAndroid Build Coastguard Worker	// Check dexpreopt outputs. They shouldn't exist.
77*333d2b36SAndroid Build Coastguard Worker	if variant.MaybeOutput("dexpreopt/foo/oat/arm64/package.vdex").Rule != nil ||
78*333d2b36SAndroid Build Coastguard Worker		variant.MaybeOutput("dexpreopt/foo/oat/arm64/package.odex").Rule != nil {
79*333d2b36SAndroid Build Coastguard Worker		t.Errorf("dexpreopt shouldn't have run.")
80*333d2b36SAndroid Build Coastguard Worker	}
81*333d2b36SAndroid Build Coastguard Worker
82*333d2b36SAndroid Build Coastguard Worker	rule := variant.Rule("genProvenanceMetaData")
83*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid input", "prebuilts/apk/app.apk", rule.Inputs[0].String())
84*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", rule.Output.String())
85*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid args", "foo", rule.Args["module_name"])
86*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid args", "/system/app/foo/foo.apk", rule.Args["install_path"])
87*333d2b36SAndroid Build Coastguard Worker}
88*333d2b36SAndroid Build Coastguard Worker
89*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport_Presigned(t *testing.T) {
90*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
91*333d2b36SAndroid Build Coastguard Worker		android_app_import {
92*333d2b36SAndroid Build Coastguard Worker			name: "foo",
93*333d2b36SAndroid Build Coastguard Worker			apk: "prebuilts/apk/app.apk",
94*333d2b36SAndroid Build Coastguard Worker			presigned: true,
95*333d2b36SAndroid Build Coastguard Worker			dex_preopt: {
96*333d2b36SAndroid Build Coastguard Worker				enabled: true,
97*333d2b36SAndroid Build Coastguard Worker			},
98*333d2b36SAndroid Build Coastguard Worker		}
99*333d2b36SAndroid Build Coastguard Worker		`)
100*333d2b36SAndroid Build Coastguard Worker
101*333d2b36SAndroid Build Coastguard Worker	variant := ctx.ModuleForTests("foo", "android_common")
102*333d2b36SAndroid Build Coastguard Worker
103*333d2b36SAndroid Build Coastguard Worker	// Check dexpreopt outputs.
104*333d2b36SAndroid Build Coastguard Worker	if variant.MaybeOutput("dexpreopt/foo/oat/arm64/package.vdex").Rule == nil ||
105*333d2b36SAndroid Build Coastguard Worker		variant.MaybeOutput("dexpreopt/foo/oat/arm64/package.odex").Rule == nil {
106*333d2b36SAndroid Build Coastguard Worker		t.Errorf("can't find dexpreopt outputs")
107*333d2b36SAndroid Build Coastguard Worker	}
108*333d2b36SAndroid Build Coastguard Worker	// Make sure signing was skipped and aligning was done.
109*333d2b36SAndroid Build Coastguard Worker	if variant.MaybeOutput("signed/foo.apk").Rule != nil {
110*333d2b36SAndroid Build Coastguard Worker		t.Errorf("signing rule shouldn't be included.")
111*333d2b36SAndroid Build Coastguard Worker	}
112*333d2b36SAndroid Build Coastguard Worker	if variant.MaybeOutput("zip-aligned/foo.apk").Rule == nil {
113*333d2b36SAndroid Build Coastguard Worker		t.Errorf("can't find aligning rule")
114*333d2b36SAndroid Build Coastguard Worker	}
115*333d2b36SAndroid Build Coastguard Worker
116*333d2b36SAndroid Build Coastguard Worker	rule := variant.Rule("genProvenanceMetaData")
117*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid input", "prebuilts/apk/app.apk", rule.Inputs[0].String())
118*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", rule.Output.String())
119*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid args", "foo", rule.Args["module_name"])
120*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid args", "/system/app/foo/foo.apk", rule.Args["install_path"])
121*333d2b36SAndroid Build Coastguard Worker}
122*333d2b36SAndroid Build Coastguard Worker
123*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport_SigningLineage(t *testing.T) {
124*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
125*333d2b36SAndroid Build Coastguard Worker	  android_app_import {
126*333d2b36SAndroid Build Coastguard Worker			name: "foo",
127*333d2b36SAndroid Build Coastguard Worker			apk: "prebuilts/apk/app.apk",
128*333d2b36SAndroid Build Coastguard Worker			certificate: "platform",
129*333d2b36SAndroid Build Coastguard Worker			additional_certificates: [":additional_certificate"],
130*333d2b36SAndroid Build Coastguard Worker			lineage: "lineage.bin",
131*333d2b36SAndroid Build Coastguard Worker			rotationMinSdkVersion: "32",
132*333d2b36SAndroid Build Coastguard Worker		}
133*333d2b36SAndroid Build Coastguard Worker
134*333d2b36SAndroid Build Coastguard Worker		android_app_certificate {
135*333d2b36SAndroid Build Coastguard Worker			name: "additional_certificate",
136*333d2b36SAndroid Build Coastguard Worker			certificate: "cert/additional_cert",
137*333d2b36SAndroid Build Coastguard Worker		}
138*333d2b36SAndroid Build Coastguard Worker	`)
139*333d2b36SAndroid Build Coastguard Worker
140*333d2b36SAndroid Build Coastguard Worker	variant := ctx.ModuleForTests("foo", "android_common")
141*333d2b36SAndroid Build Coastguard Worker
142*333d2b36SAndroid Build Coastguard Worker	signedApk := variant.Output("signed/foo.apk")
143*333d2b36SAndroid Build Coastguard Worker	// Check certificates
144*333d2b36SAndroid Build Coastguard Worker	certificatesFlag := signedApk.Args["certificates"]
145*333d2b36SAndroid Build Coastguard Worker	expected := "build/make/target/product/security/platform.x509.pem " +
146*333d2b36SAndroid Build Coastguard Worker		"build/make/target/product/security/platform.pk8 " +
147*333d2b36SAndroid Build Coastguard Worker		"cert/additional_cert.x509.pem cert/additional_cert.pk8"
148*333d2b36SAndroid Build Coastguard Worker	if expected != certificatesFlag {
149*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Incorrect certificates flags, expected: %q, got: %q", expected, certificatesFlag)
150*333d2b36SAndroid Build Coastguard Worker	}
151*333d2b36SAndroid Build Coastguard Worker
152*333d2b36SAndroid Build Coastguard Worker	// Check cert signing flags.
153*333d2b36SAndroid Build Coastguard Worker	actualCertSigningFlags := signedApk.Args["flags"]
154*333d2b36SAndroid Build Coastguard Worker	expectedCertSigningFlags := "--lineage lineage.bin --rotation-min-sdk-version 32"
155*333d2b36SAndroid Build Coastguard Worker	if expectedCertSigningFlags != actualCertSigningFlags {
156*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Incorrect signing flags, expected: %q, got: %q", expectedCertSigningFlags, actualCertSigningFlags)
157*333d2b36SAndroid Build Coastguard Worker	}
158*333d2b36SAndroid Build Coastguard Worker
159*333d2b36SAndroid Build Coastguard Worker	rule := variant.Rule("genProvenanceMetaData")
160*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid input", "prebuilts/apk/app.apk", rule.Inputs[0].String())
161*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", rule.Output.String())
162*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid args", "foo", rule.Args["module_name"])
163*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid args", "/system/app/foo/foo.apk", rule.Args["install_path"])
164*333d2b36SAndroid Build Coastguard Worker}
165*333d2b36SAndroid Build Coastguard Worker
166*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport_SigningLineageFilegroup(t *testing.T) {
167*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
168*333d2b36SAndroid Build Coastguard Worker	  android_app_import {
169*333d2b36SAndroid Build Coastguard Worker			name: "foo",
170*333d2b36SAndroid Build Coastguard Worker			apk: "prebuilts/apk/app.apk",
171*333d2b36SAndroid Build Coastguard Worker			certificate: "platform",
172*333d2b36SAndroid Build Coastguard Worker			lineage: ":lineage_bin",
173*333d2b36SAndroid Build Coastguard Worker		}
174*333d2b36SAndroid Build Coastguard Worker
175*333d2b36SAndroid Build Coastguard Worker		filegroup {
176*333d2b36SAndroid Build Coastguard Worker			name: "lineage_bin",
177*333d2b36SAndroid Build Coastguard Worker			srcs: ["lineage.bin"],
178*333d2b36SAndroid Build Coastguard Worker		}
179*333d2b36SAndroid Build Coastguard Worker	`)
180*333d2b36SAndroid Build Coastguard Worker
181*333d2b36SAndroid Build Coastguard Worker	variant := ctx.ModuleForTests("foo", "android_common")
182*333d2b36SAndroid Build Coastguard Worker
183*333d2b36SAndroid Build Coastguard Worker	signedApk := variant.Output("signed/foo.apk")
184*333d2b36SAndroid Build Coastguard Worker	// Check cert signing lineage flag.
185*333d2b36SAndroid Build Coastguard Worker	signingFlag := signedApk.Args["flags"]
186*333d2b36SAndroid Build Coastguard Worker	expected := "--lineage lineage.bin"
187*333d2b36SAndroid Build Coastguard Worker	if expected != signingFlag {
188*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected, signingFlag)
189*333d2b36SAndroid Build Coastguard Worker	}
190*333d2b36SAndroid Build Coastguard Worker
191*333d2b36SAndroid Build Coastguard Worker	rule := variant.Rule("genProvenanceMetaData")
192*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid input", "prebuilts/apk/app.apk", rule.Inputs[0].String())
193*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", rule.Output.String())
194*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid args", "foo", rule.Args["module_name"])
195*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid args", "/system/app/foo/foo.apk", rule.Args["install_path"])
196*333d2b36SAndroid Build Coastguard Worker}
197*333d2b36SAndroid Build Coastguard Worker
198*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport_DefaultDevCert(t *testing.T) {
199*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
200*333d2b36SAndroid Build Coastguard Worker		android_app_import {
201*333d2b36SAndroid Build Coastguard Worker			name: "foo",
202*333d2b36SAndroid Build Coastguard Worker			apk: "prebuilts/apk/app.apk",
203*333d2b36SAndroid Build Coastguard Worker			default_dev_cert: true,
204*333d2b36SAndroid Build Coastguard Worker			dex_preopt: {
205*333d2b36SAndroid Build Coastguard Worker				enabled: true,
206*333d2b36SAndroid Build Coastguard Worker			},
207*333d2b36SAndroid Build Coastguard Worker		}
208*333d2b36SAndroid Build Coastguard Worker		`)
209*333d2b36SAndroid Build Coastguard Worker
210*333d2b36SAndroid Build Coastguard Worker	variant := ctx.ModuleForTests("foo", "android_common")
211*333d2b36SAndroid Build Coastguard Worker
212*333d2b36SAndroid Build Coastguard Worker	// Check dexpreopt outputs.
213*333d2b36SAndroid Build Coastguard Worker	if variant.MaybeOutput("dexpreopt/foo/oat/arm64/package.vdex").Rule == nil ||
214*333d2b36SAndroid Build Coastguard Worker		variant.MaybeOutput("dexpreopt/foo/oat/arm64/package.odex").Rule == nil {
215*333d2b36SAndroid Build Coastguard Worker		t.Errorf("can't find dexpreopt outputs")
216*333d2b36SAndroid Build Coastguard Worker	}
217*333d2b36SAndroid Build Coastguard Worker
218*333d2b36SAndroid Build Coastguard Worker	// Check cert signing flag.
219*333d2b36SAndroid Build Coastguard Worker	signedApk := variant.Output("signed/foo.apk")
220*333d2b36SAndroid Build Coastguard Worker	signingFlag := signedApk.Args["certificates"]
221*333d2b36SAndroid Build Coastguard Worker	expected := "build/make/target/product/security/testkey.x509.pem build/make/target/product/security/testkey.pk8"
222*333d2b36SAndroid Build Coastguard Worker	if expected != signingFlag {
223*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected, signingFlag)
224*333d2b36SAndroid Build Coastguard Worker	}
225*333d2b36SAndroid Build Coastguard Worker
226*333d2b36SAndroid Build Coastguard Worker	rule := variant.Rule("genProvenanceMetaData")
227*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid input", "prebuilts/apk/app.apk", rule.Inputs[0].String())
228*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", rule.Output.String())
229*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid args", "foo", rule.Args["module_name"])
230*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid args", "/system/app/foo/foo.apk", rule.Args["install_path"])
231*333d2b36SAndroid Build Coastguard Worker}
232*333d2b36SAndroid Build Coastguard Worker
233*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport_DpiVariants(t *testing.T) {
234*333d2b36SAndroid Build Coastguard Worker	bp := `
235*333d2b36SAndroid Build Coastguard Worker		android_app_import {
236*333d2b36SAndroid Build Coastguard Worker			name: "foo",
237*333d2b36SAndroid Build Coastguard Worker			apk: "prebuilts/apk/app.apk",
238*333d2b36SAndroid Build Coastguard Worker			dpi_variants: {
239*333d2b36SAndroid Build Coastguard Worker				xhdpi: {
240*333d2b36SAndroid Build Coastguard Worker					apk: "prebuilts/apk/app_xhdpi.apk",
241*333d2b36SAndroid Build Coastguard Worker				},
242*333d2b36SAndroid Build Coastguard Worker				xxhdpi: {
243*333d2b36SAndroid Build Coastguard Worker					apk: "prebuilts/apk/app_xxhdpi.apk",
244*333d2b36SAndroid Build Coastguard Worker				},
245*333d2b36SAndroid Build Coastguard Worker			},
246*333d2b36SAndroid Build Coastguard Worker			presigned: true,
247*333d2b36SAndroid Build Coastguard Worker			dex_preopt: {
248*333d2b36SAndroid Build Coastguard Worker				enabled: true,
249*333d2b36SAndroid Build Coastguard Worker			},
250*333d2b36SAndroid Build Coastguard Worker		}
251*333d2b36SAndroid Build Coastguard Worker		`
252*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
253*333d2b36SAndroid Build Coastguard Worker		name                                   string
254*333d2b36SAndroid Build Coastguard Worker		aaptPreferredConfig                    *string
255*333d2b36SAndroid Build Coastguard Worker		aaptPrebuiltDPI                        []string
256*333d2b36SAndroid Build Coastguard Worker		expected                               string
257*333d2b36SAndroid Build Coastguard Worker		expectedProvenanceMetaDataArtifactPath string
258*333d2b36SAndroid Build Coastguard Worker	}{
259*333d2b36SAndroid Build Coastguard Worker		{
260*333d2b36SAndroid Build Coastguard Worker			name:                                   "no preferred",
261*333d2b36SAndroid Build Coastguard Worker			aaptPreferredConfig:                    nil,
262*333d2b36SAndroid Build Coastguard Worker			aaptPrebuiltDPI:                        []string{},
263*333d2b36SAndroid Build Coastguard Worker			expected:                               "verify_uses_libraries/apk/app.apk",
264*333d2b36SAndroid Build Coastguard Worker			expectedProvenanceMetaDataArtifactPath: "prebuilts/apk/app.apk",
265*333d2b36SAndroid Build Coastguard Worker		},
266*333d2b36SAndroid Build Coastguard Worker		{
267*333d2b36SAndroid Build Coastguard Worker			name:                                   "AAPTPreferredConfig matches",
268*333d2b36SAndroid Build Coastguard Worker			aaptPreferredConfig:                    proptools.StringPtr("xhdpi"),
269*333d2b36SAndroid Build Coastguard Worker			aaptPrebuiltDPI:                        []string{"xxhdpi", "ldpi"},
270*333d2b36SAndroid Build Coastguard Worker			expected:                               "verify_uses_libraries/apk/app_xhdpi.apk",
271*333d2b36SAndroid Build Coastguard Worker			expectedProvenanceMetaDataArtifactPath: "prebuilts/apk/app_xhdpi.apk",
272*333d2b36SAndroid Build Coastguard Worker		},
273*333d2b36SAndroid Build Coastguard Worker		{
274*333d2b36SAndroid Build Coastguard Worker			name:                                   "AAPTPrebuiltDPI matches",
275*333d2b36SAndroid Build Coastguard Worker			aaptPreferredConfig:                    proptools.StringPtr("mdpi"),
276*333d2b36SAndroid Build Coastguard Worker			aaptPrebuiltDPI:                        []string{"xxhdpi", "xhdpi"},
277*333d2b36SAndroid Build Coastguard Worker			expected:                               "verify_uses_libraries/apk/app_xxhdpi.apk",
278*333d2b36SAndroid Build Coastguard Worker			expectedProvenanceMetaDataArtifactPath: "prebuilts/apk/app_xxhdpi.apk",
279*333d2b36SAndroid Build Coastguard Worker		},
280*333d2b36SAndroid Build Coastguard Worker		{
281*333d2b36SAndroid Build Coastguard Worker			name:                                   "non-first AAPTPrebuiltDPI matches",
282*333d2b36SAndroid Build Coastguard Worker			aaptPreferredConfig:                    proptools.StringPtr("mdpi"),
283*333d2b36SAndroid Build Coastguard Worker			aaptPrebuiltDPI:                        []string{"ldpi", "xhdpi"},
284*333d2b36SAndroid Build Coastguard Worker			expected:                               "verify_uses_libraries/apk/app_xhdpi.apk",
285*333d2b36SAndroid Build Coastguard Worker			expectedProvenanceMetaDataArtifactPath: "prebuilts/apk/app_xhdpi.apk",
286*333d2b36SAndroid Build Coastguard Worker		},
287*333d2b36SAndroid Build Coastguard Worker		{
288*333d2b36SAndroid Build Coastguard Worker			name:                                   "no matches",
289*333d2b36SAndroid Build Coastguard Worker			aaptPreferredConfig:                    proptools.StringPtr("mdpi"),
290*333d2b36SAndroid Build Coastguard Worker			aaptPrebuiltDPI:                        []string{"ldpi", "xxxhdpi"},
291*333d2b36SAndroid Build Coastguard Worker			expected:                               "verify_uses_libraries/apk/app.apk",
292*333d2b36SAndroid Build Coastguard Worker			expectedProvenanceMetaDataArtifactPath: "prebuilts/apk/app.apk",
293*333d2b36SAndroid Build Coastguard Worker		},
294*333d2b36SAndroid Build Coastguard Worker	}
295*333d2b36SAndroid Build Coastguard Worker
296*333d2b36SAndroid Build Coastguard Worker	for _, test := range testCases {
297*333d2b36SAndroid Build Coastguard Worker		result := android.GroupFixturePreparers(
298*333d2b36SAndroid Build Coastguard Worker			PrepareForTestWithJavaDefaultModules,
299*333d2b36SAndroid Build Coastguard Worker			android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
300*333d2b36SAndroid Build Coastguard Worker				variables.AAPTPreferredConfig = test.aaptPreferredConfig
301*333d2b36SAndroid Build Coastguard Worker				variables.AAPTPrebuiltDPI = test.aaptPrebuiltDPI
302*333d2b36SAndroid Build Coastguard Worker			}),
303*333d2b36SAndroid Build Coastguard Worker		).RunTestWithBp(t, bp)
304*333d2b36SAndroid Build Coastguard Worker
305*333d2b36SAndroid Build Coastguard Worker		variant := result.ModuleForTests("foo", "android_common")
306*333d2b36SAndroid Build Coastguard Worker		input := variant.Output("jnis-uncompressed/foo.apk").Input.String()
307*333d2b36SAndroid Build Coastguard Worker		if strings.HasSuffix(input, test.expected) {
308*333d2b36SAndroid Build Coastguard Worker			t.Errorf("wrong src apk, expected: %q got: %q", test.expected, input)
309*333d2b36SAndroid Build Coastguard Worker		}
310*333d2b36SAndroid Build Coastguard Worker
311*333d2b36SAndroid Build Coastguard Worker		provenanceMetaDataRule := variant.Rule("genProvenanceMetaData")
312*333d2b36SAndroid Build Coastguard Worker		android.AssertStringEquals(t, "Invalid input", test.expectedProvenanceMetaDataArtifactPath, provenanceMetaDataRule.Inputs[0].String())
313*333d2b36SAndroid Build Coastguard Worker		android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", provenanceMetaDataRule.Output.String())
314*333d2b36SAndroid Build Coastguard Worker		android.AssertStringEquals(t, "Invalid args", "foo", provenanceMetaDataRule.Args["module_name"])
315*333d2b36SAndroid Build Coastguard Worker		android.AssertStringEquals(t, "Invalid args", "/system/app/foo/foo.apk", provenanceMetaDataRule.Args["install_path"])
316*333d2b36SAndroid Build Coastguard Worker	}
317*333d2b36SAndroid Build Coastguard Worker}
318*333d2b36SAndroid Build Coastguard Worker
319*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport_Filename(t *testing.T) {
320*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
321*333d2b36SAndroid Build Coastguard Worker		android_app_import {
322*333d2b36SAndroid Build Coastguard Worker			name: "foo",
323*333d2b36SAndroid Build Coastguard Worker			apk: "prebuilts/apk/app.apk",
324*333d2b36SAndroid Build Coastguard Worker			presigned: true,
325*333d2b36SAndroid Build Coastguard Worker		}
326*333d2b36SAndroid Build Coastguard Worker
327*333d2b36SAndroid Build Coastguard Worker		android_app_import {
328*333d2b36SAndroid Build Coastguard Worker			name: "bar",
329*333d2b36SAndroid Build Coastguard Worker			apk: "prebuilts/apk/app.apk",
330*333d2b36SAndroid Build Coastguard Worker			presigned: true,
331*333d2b36SAndroid Build Coastguard Worker			filename: "bar_sample.apk"
332*333d2b36SAndroid Build Coastguard Worker		}
333*333d2b36SAndroid Build Coastguard Worker		`)
334*333d2b36SAndroid Build Coastguard Worker
335*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
336*333d2b36SAndroid Build Coastguard Worker		name                 string
337*333d2b36SAndroid Build Coastguard Worker		expected             string
338*333d2b36SAndroid Build Coastguard Worker		onDevice             string
339*333d2b36SAndroid Build Coastguard Worker		expectedArtifactPath string
340*333d2b36SAndroid Build Coastguard Worker		expectedMetaDataPath string
341*333d2b36SAndroid Build Coastguard Worker	}{
342*333d2b36SAndroid Build Coastguard Worker		{
343*333d2b36SAndroid Build Coastguard Worker			name:                 "foo",
344*333d2b36SAndroid Build Coastguard Worker			expected:             "foo.apk",
345*333d2b36SAndroid Build Coastguard Worker			onDevice:             "/system/app/foo/foo.apk",
346*333d2b36SAndroid Build Coastguard Worker			expectedArtifactPath: "prebuilts/apk/app.apk",
347*333d2b36SAndroid Build Coastguard Worker			expectedMetaDataPath: "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto",
348*333d2b36SAndroid Build Coastguard Worker		},
349*333d2b36SAndroid Build Coastguard Worker		{
350*333d2b36SAndroid Build Coastguard Worker			name:                 "bar",
351*333d2b36SAndroid Build Coastguard Worker			expected:             "bar_sample.apk",
352*333d2b36SAndroid Build Coastguard Worker			onDevice:             "/system/app/bar/bar_sample.apk",
353*333d2b36SAndroid Build Coastguard Worker			expectedArtifactPath: "prebuilts/apk/app.apk",
354*333d2b36SAndroid Build Coastguard Worker			expectedMetaDataPath: "out/soong/.intermediates/provenance_metadata/bar/provenance_metadata.textproto",
355*333d2b36SAndroid Build Coastguard Worker		},
356*333d2b36SAndroid Build Coastguard Worker	}
357*333d2b36SAndroid Build Coastguard Worker
358*333d2b36SAndroid Build Coastguard Worker	for _, test := range testCases {
359*333d2b36SAndroid Build Coastguard Worker		variant := ctx.ModuleForTests(test.name, "android_common")
360*333d2b36SAndroid Build Coastguard Worker		if variant.MaybeOutput(test.expected).Rule == nil {
361*333d2b36SAndroid Build Coastguard Worker			t.Errorf("can't find output named %q - all outputs: %v", test.expected, variant.AllOutputs())
362*333d2b36SAndroid Build Coastguard Worker		}
363*333d2b36SAndroid Build Coastguard Worker
364*333d2b36SAndroid Build Coastguard Worker		a := variant.Module().(*AndroidAppImport)
365*333d2b36SAndroid Build Coastguard Worker		expectedValues := []string{test.expected}
366*333d2b36SAndroid Build Coastguard Worker		entries := android.AndroidMkEntriesForTest(t, ctx, a)[0]
367*333d2b36SAndroid Build Coastguard Worker		actualValues := entries.EntryMap["LOCAL_INSTALLED_MODULE_STEM"]
368*333d2b36SAndroid Build Coastguard Worker		if !reflect.DeepEqual(actualValues, expectedValues) {
369*333d2b36SAndroid Build Coastguard Worker			t.Errorf("Incorrect LOCAL_INSTALLED_MODULE_STEM value '%s', expected '%s'",
370*333d2b36SAndroid Build Coastguard Worker				actualValues, expectedValues)
371*333d2b36SAndroid Build Coastguard Worker		}
372*333d2b36SAndroid Build Coastguard Worker		android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "android_app_import", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
373*333d2b36SAndroid Build Coastguard Worker
374*333d2b36SAndroid Build Coastguard Worker		rule := variant.Rule("genProvenanceMetaData")
375*333d2b36SAndroid Build Coastguard Worker		android.AssertStringEquals(t, "Invalid input", test.expectedArtifactPath, rule.Inputs[0].String())
376*333d2b36SAndroid Build Coastguard Worker		android.AssertStringEquals(t, "Invalid output", test.expectedMetaDataPath, rule.Output.String())
377*333d2b36SAndroid Build Coastguard Worker		android.AssertStringEquals(t, "Invalid args", test.name, rule.Args["module_name"])
378*333d2b36SAndroid Build Coastguard Worker		android.AssertStringEquals(t, "Invalid args", test.onDevice, rule.Args["install_path"])
379*333d2b36SAndroid Build Coastguard Worker	}
380*333d2b36SAndroid Build Coastguard Worker}
381*333d2b36SAndroid Build Coastguard Worker
382*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport_ArchVariants(t *testing.T) {
383*333d2b36SAndroid Build Coastguard Worker	// The test config's target arch is ARM64.
384*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
385*333d2b36SAndroid Build Coastguard Worker		name         string
386*333d2b36SAndroid Build Coastguard Worker		bp           string
387*333d2b36SAndroid Build Coastguard Worker		expected     string
388*333d2b36SAndroid Build Coastguard Worker		artifactPath string
389*333d2b36SAndroid Build Coastguard Worker		metaDataPath string
390*333d2b36SAndroid Build Coastguard Worker		installPath  string
391*333d2b36SAndroid Build Coastguard Worker	}{
392*333d2b36SAndroid Build Coastguard Worker		{
393*333d2b36SAndroid Build Coastguard Worker			name: "matching arch",
394*333d2b36SAndroid Build Coastguard Worker			bp: `
395*333d2b36SAndroid Build Coastguard Worker				android_app_import {
396*333d2b36SAndroid Build Coastguard Worker					name: "foo",
397*333d2b36SAndroid Build Coastguard Worker					apk: "prebuilts/apk/app.apk",
398*333d2b36SAndroid Build Coastguard Worker					arch: {
399*333d2b36SAndroid Build Coastguard Worker						arm64: {
400*333d2b36SAndroid Build Coastguard Worker							apk: "prebuilts/apk/app_arm64.apk",
401*333d2b36SAndroid Build Coastguard Worker						},
402*333d2b36SAndroid Build Coastguard Worker					},
403*333d2b36SAndroid Build Coastguard Worker					presigned: true,
404*333d2b36SAndroid Build Coastguard Worker					dex_preopt: {
405*333d2b36SAndroid Build Coastguard Worker						enabled: true,
406*333d2b36SAndroid Build Coastguard Worker					},
407*333d2b36SAndroid Build Coastguard Worker				}
408*333d2b36SAndroid Build Coastguard Worker			`,
409*333d2b36SAndroid Build Coastguard Worker			expected:     "verify_uses_libraries/apk/app_arm64.apk",
410*333d2b36SAndroid Build Coastguard Worker			artifactPath: "prebuilts/apk/app_arm64.apk",
411*333d2b36SAndroid Build Coastguard Worker			installPath:  "/system/app/foo/foo.apk",
412*333d2b36SAndroid Build Coastguard Worker		},
413*333d2b36SAndroid Build Coastguard Worker		{
414*333d2b36SAndroid Build Coastguard Worker			name: "matching arch without default",
415*333d2b36SAndroid Build Coastguard Worker			bp: `
416*333d2b36SAndroid Build Coastguard Worker				android_app_import {
417*333d2b36SAndroid Build Coastguard Worker					name: "foo",
418*333d2b36SAndroid Build Coastguard Worker					apk: "prebuilts/apk/app.apk",
419*333d2b36SAndroid Build Coastguard Worker					arch: {
420*333d2b36SAndroid Build Coastguard Worker						arm64: {
421*333d2b36SAndroid Build Coastguard Worker							apk: "prebuilts/apk/app_arm64.apk",
422*333d2b36SAndroid Build Coastguard Worker						},
423*333d2b36SAndroid Build Coastguard Worker					},
424*333d2b36SAndroid Build Coastguard Worker					presigned: true,
425*333d2b36SAndroid Build Coastguard Worker					dex_preopt: {
426*333d2b36SAndroid Build Coastguard Worker						enabled: true,
427*333d2b36SAndroid Build Coastguard Worker					},
428*333d2b36SAndroid Build Coastguard Worker				}
429*333d2b36SAndroid Build Coastguard Worker			`,
430*333d2b36SAndroid Build Coastguard Worker			expected:     "verify_uses_libraries/apk/app_arm64.apk",
431*333d2b36SAndroid Build Coastguard Worker			artifactPath: "prebuilts/apk/app_arm64.apk",
432*333d2b36SAndroid Build Coastguard Worker			installPath:  "/system/app/foo/foo.apk",
433*333d2b36SAndroid Build Coastguard Worker		},
434*333d2b36SAndroid Build Coastguard Worker		{
435*333d2b36SAndroid Build Coastguard Worker			name: "no matching arch",
436*333d2b36SAndroid Build Coastguard Worker			bp: `
437*333d2b36SAndroid Build Coastguard Worker				android_app_import {
438*333d2b36SAndroid Build Coastguard Worker					name: "foo",
439*333d2b36SAndroid Build Coastguard Worker					apk: "prebuilts/apk/app.apk",
440*333d2b36SAndroid Build Coastguard Worker					arch: {
441*333d2b36SAndroid Build Coastguard Worker						arm: {
442*333d2b36SAndroid Build Coastguard Worker							apk: "prebuilts/apk/app_arm.apk",
443*333d2b36SAndroid Build Coastguard Worker						},
444*333d2b36SAndroid Build Coastguard Worker					},
445*333d2b36SAndroid Build Coastguard Worker					presigned: true,
446*333d2b36SAndroid Build Coastguard Worker					dex_preopt: {
447*333d2b36SAndroid Build Coastguard Worker						enabled: true,
448*333d2b36SAndroid Build Coastguard Worker					},
449*333d2b36SAndroid Build Coastguard Worker				}
450*333d2b36SAndroid Build Coastguard Worker			`,
451*333d2b36SAndroid Build Coastguard Worker			expected:     "verify_uses_libraries/apk/app.apk",
452*333d2b36SAndroid Build Coastguard Worker			artifactPath: "prebuilts/apk/app.apk",
453*333d2b36SAndroid Build Coastguard Worker			installPath:  "/system/app/foo/foo.apk",
454*333d2b36SAndroid Build Coastguard Worker		},
455*333d2b36SAndroid Build Coastguard Worker		{
456*333d2b36SAndroid Build Coastguard Worker			name: "no matching arch without default",
457*333d2b36SAndroid Build Coastguard Worker			bp: `
458*333d2b36SAndroid Build Coastguard Worker				android_app_import {
459*333d2b36SAndroid Build Coastguard Worker					name: "foo",
460*333d2b36SAndroid Build Coastguard Worker					arch: {
461*333d2b36SAndroid Build Coastguard Worker						arm: {
462*333d2b36SAndroid Build Coastguard Worker							apk: "prebuilts/apk/app_arm.apk",
463*333d2b36SAndroid Build Coastguard Worker						},
464*333d2b36SAndroid Build Coastguard Worker					},
465*333d2b36SAndroid Build Coastguard Worker					presigned: true,
466*333d2b36SAndroid Build Coastguard Worker					dex_preopt: {
467*333d2b36SAndroid Build Coastguard Worker						enabled: true,
468*333d2b36SAndroid Build Coastguard Worker					},
469*333d2b36SAndroid Build Coastguard Worker				}
470*333d2b36SAndroid Build Coastguard Worker			`,
471*333d2b36SAndroid Build Coastguard Worker			expected:     "",
472*333d2b36SAndroid Build Coastguard Worker			artifactPath: "prebuilts/apk/app_arm.apk",
473*333d2b36SAndroid Build Coastguard Worker			installPath:  "/system/app/foo/foo.apk",
474*333d2b36SAndroid Build Coastguard Worker		},
475*333d2b36SAndroid Build Coastguard Worker		{
476*333d2b36SAndroid Build Coastguard Worker			name: "matching arch and dpi_variants",
477*333d2b36SAndroid Build Coastguard Worker			bp: `
478*333d2b36SAndroid Build Coastguard Worker				android_app_import {
479*333d2b36SAndroid Build Coastguard Worker					name: "foo",
480*333d2b36SAndroid Build Coastguard Worker					apk: "prebuilts/apk/app.apk",
481*333d2b36SAndroid Build Coastguard Worker					arch: {
482*333d2b36SAndroid Build Coastguard Worker						arm64: {
483*333d2b36SAndroid Build Coastguard Worker							apk: "prebuilts/apk/app_arm64.apk",
484*333d2b36SAndroid Build Coastguard Worker							dpi_variants: {
485*333d2b36SAndroid Build Coastguard Worker								mdpi: {
486*333d2b36SAndroid Build Coastguard Worker									apk: "prebuilts/apk/app_arm64_mdpi.apk",
487*333d2b36SAndroid Build Coastguard Worker								},
488*333d2b36SAndroid Build Coastguard Worker								xhdpi: {
489*333d2b36SAndroid Build Coastguard Worker									apk: "prebuilts/apk/app_arm64_xhdpi.apk",
490*333d2b36SAndroid Build Coastguard Worker								},
491*333d2b36SAndroid Build Coastguard Worker							},
492*333d2b36SAndroid Build Coastguard Worker						},
493*333d2b36SAndroid Build Coastguard Worker					},
494*333d2b36SAndroid Build Coastguard Worker					presigned: true,
495*333d2b36SAndroid Build Coastguard Worker					dex_preopt: {
496*333d2b36SAndroid Build Coastguard Worker						enabled: true,
497*333d2b36SAndroid Build Coastguard Worker					},
498*333d2b36SAndroid Build Coastguard Worker				}
499*333d2b36SAndroid Build Coastguard Worker			`,
500*333d2b36SAndroid Build Coastguard Worker			expected:     "verify_uses_libraries/apk/app_arm64_xhdpi.apk",
501*333d2b36SAndroid Build Coastguard Worker			artifactPath: "prebuilts/apk/app_arm64_xhdpi.apk",
502*333d2b36SAndroid Build Coastguard Worker			installPath:  "/system/app/foo/foo.apk",
503*333d2b36SAndroid Build Coastguard Worker		},
504*333d2b36SAndroid Build Coastguard Worker	}
505*333d2b36SAndroid Build Coastguard Worker
506*333d2b36SAndroid Build Coastguard Worker	for _, test := range testCases {
507*333d2b36SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
508*333d2b36SAndroid Build Coastguard Worker			ctx, _ := testJava(t, test.bp)
509*333d2b36SAndroid Build Coastguard Worker
510*333d2b36SAndroid Build Coastguard Worker			variant := ctx.ModuleForTests("foo", "android_common")
511*333d2b36SAndroid Build Coastguard Worker			if test.expected == "" {
512*333d2b36SAndroid Build Coastguard Worker				if variant.Module().Enabled(android.PanickingConfigAndErrorContext(ctx)) {
513*333d2b36SAndroid Build Coastguard Worker					t.Error("module should have been disabled, but wasn't")
514*333d2b36SAndroid Build Coastguard Worker				}
515*333d2b36SAndroid Build Coastguard Worker				rule := variant.MaybeRule("genProvenanceMetaData")
516*333d2b36SAndroid Build Coastguard Worker				android.AssertDeepEquals(t, "Provenance metadata is not empty", android.TestingBuildParams{}, rule)
517*333d2b36SAndroid Build Coastguard Worker				return
518*333d2b36SAndroid Build Coastguard Worker			}
519*333d2b36SAndroid Build Coastguard Worker			input := variant.Output("jnis-uncompressed/foo.apk").Input.String()
520*333d2b36SAndroid Build Coastguard Worker			if strings.HasSuffix(input, test.expected) {
521*333d2b36SAndroid Build Coastguard Worker				t.Errorf("wrong src apk, expected: %q got: %q", test.expected, input)
522*333d2b36SAndroid Build Coastguard Worker			}
523*333d2b36SAndroid Build Coastguard Worker			rule := variant.Rule("genProvenanceMetaData")
524*333d2b36SAndroid Build Coastguard Worker			android.AssertStringEquals(t, "Invalid input", test.artifactPath, rule.Inputs[0].String())
525*333d2b36SAndroid Build Coastguard Worker			android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", rule.Output.String())
526*333d2b36SAndroid Build Coastguard Worker			android.AssertStringEquals(t, "Invalid args", "foo", rule.Args["module_name"])
527*333d2b36SAndroid Build Coastguard Worker			android.AssertStringEquals(t, "Invalid args", test.installPath, rule.Args["install_path"])
528*333d2b36SAndroid Build Coastguard Worker		})
529*333d2b36SAndroid Build Coastguard Worker	}
530*333d2b36SAndroid Build Coastguard Worker}
531*333d2b36SAndroid Build Coastguard Worker
532*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport_SoongConfigVariables(t *testing.T) {
533*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
534*333d2b36SAndroid Build Coastguard Worker		name         string
535*333d2b36SAndroid Build Coastguard Worker		bp           string
536*333d2b36SAndroid Build Coastguard Worker		expected     string
537*333d2b36SAndroid Build Coastguard Worker		artifactPath string
538*333d2b36SAndroid Build Coastguard Worker		metaDataPath string
539*333d2b36SAndroid Build Coastguard Worker		installPath  string
540*333d2b36SAndroid Build Coastguard Worker	}{
541*333d2b36SAndroid Build Coastguard Worker		{
542*333d2b36SAndroid Build Coastguard Worker			name: "matching arch",
543*333d2b36SAndroid Build Coastguard Worker			bp: `
544*333d2b36SAndroid Build Coastguard Worker				soong_config_module_type {
545*333d2b36SAndroid Build Coastguard Worker					name: "my_android_app_import",
546*333d2b36SAndroid Build Coastguard Worker					module_type: "android_app_import",
547*333d2b36SAndroid Build Coastguard Worker					config_namespace: "my_namespace",
548*333d2b36SAndroid Build Coastguard Worker					value_variables: ["my_apk_var"],
549*333d2b36SAndroid Build Coastguard Worker					properties: ["apk"],
550*333d2b36SAndroid Build Coastguard Worker				}
551*333d2b36SAndroid Build Coastguard Worker				soong_config_value_variable {
552*333d2b36SAndroid Build Coastguard Worker					name: "my_apk_var",
553*333d2b36SAndroid Build Coastguard Worker				}
554*333d2b36SAndroid Build Coastguard Worker				my_android_app_import {
555*333d2b36SAndroid Build Coastguard Worker					name: "foo",
556*333d2b36SAndroid Build Coastguard Worker					soong_config_variables: {
557*333d2b36SAndroid Build Coastguard Worker						my_apk_var: {
558*333d2b36SAndroid Build Coastguard Worker							apk: "prebuilts/apk/%s.apk",
559*333d2b36SAndroid Build Coastguard Worker						},
560*333d2b36SAndroid Build Coastguard Worker					},
561*333d2b36SAndroid Build Coastguard Worker					presigned: true,
562*333d2b36SAndroid Build Coastguard Worker					dex_preopt: {
563*333d2b36SAndroid Build Coastguard Worker						enabled: true,
564*333d2b36SAndroid Build Coastguard Worker					},
565*333d2b36SAndroid Build Coastguard Worker				}
566*333d2b36SAndroid Build Coastguard Worker			`,
567*333d2b36SAndroid Build Coastguard Worker			expected:     "verify_uses_libraries/apk/name_from_soong_config.apk",
568*333d2b36SAndroid Build Coastguard Worker			artifactPath: "prebuilts/apk/name_from_soong_config.apk",
569*333d2b36SAndroid Build Coastguard Worker			installPath:  "/system/app/foo/foo.apk",
570*333d2b36SAndroid Build Coastguard Worker		},
571*333d2b36SAndroid Build Coastguard Worker	}
572*333d2b36SAndroid Build Coastguard Worker
573*333d2b36SAndroid Build Coastguard Worker	for _, test := range testCases {
574*333d2b36SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
575*333d2b36SAndroid Build Coastguard Worker			ctx := android.GroupFixturePreparers(
576*333d2b36SAndroid Build Coastguard Worker				prepareForJavaTest,
577*333d2b36SAndroid Build Coastguard Worker				android.PrepareForTestWithSoongConfigModuleBuildComponents,
578*333d2b36SAndroid Build Coastguard Worker				android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
579*333d2b36SAndroid Build Coastguard Worker					variables.VendorVars = map[string]map[string]string{
580*333d2b36SAndroid Build Coastguard Worker						"my_namespace": {
581*333d2b36SAndroid Build Coastguard Worker							"my_apk_var": "name_from_soong_config",
582*333d2b36SAndroid Build Coastguard Worker						},
583*333d2b36SAndroid Build Coastguard Worker					}
584*333d2b36SAndroid Build Coastguard Worker				}),
585*333d2b36SAndroid Build Coastguard Worker			).RunTestWithBp(t, test.bp).TestContext
586*333d2b36SAndroid Build Coastguard Worker
587*333d2b36SAndroid Build Coastguard Worker			variant := ctx.ModuleForTests("foo", "android_common")
588*333d2b36SAndroid Build Coastguard Worker			if test.expected == "" {
589*333d2b36SAndroid Build Coastguard Worker				if variant.Module().Enabled(android.PanickingConfigAndErrorContext(ctx)) {
590*333d2b36SAndroid Build Coastguard Worker					t.Error("module should have been disabled, but wasn't")
591*333d2b36SAndroid Build Coastguard Worker				}
592*333d2b36SAndroid Build Coastguard Worker				rule := variant.MaybeRule("genProvenanceMetaData")
593*333d2b36SAndroid Build Coastguard Worker				android.AssertDeepEquals(t, "Provenance metadata is not empty", android.TestingBuildParams{}, rule)
594*333d2b36SAndroid Build Coastguard Worker				return
595*333d2b36SAndroid Build Coastguard Worker			}
596*333d2b36SAndroid Build Coastguard Worker			input := variant.Output("jnis-uncompressed/foo.apk").Input.String()
597*333d2b36SAndroid Build Coastguard Worker			if strings.HasSuffix(input, test.expected) {
598*333d2b36SAndroid Build Coastguard Worker				t.Errorf("wrong src apk, expected: %q got: %q", test.expected, input)
599*333d2b36SAndroid Build Coastguard Worker			}
600*333d2b36SAndroid Build Coastguard Worker			rule := variant.Rule("genProvenanceMetaData")
601*333d2b36SAndroid Build Coastguard Worker			android.AssertStringEquals(t, "Invalid input", test.artifactPath, rule.Inputs[0].String())
602*333d2b36SAndroid Build Coastguard Worker			android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", rule.Output.String())
603*333d2b36SAndroid Build Coastguard Worker			android.AssertStringEquals(t, "Invalid args", "foo", rule.Args["module_name"])
604*333d2b36SAndroid Build Coastguard Worker			android.AssertStringEquals(t, "Invalid args", test.installPath, rule.Args["install_path"])
605*333d2b36SAndroid Build Coastguard Worker		})
606*333d2b36SAndroid Build Coastguard Worker	}
607*333d2b36SAndroid Build Coastguard Worker}
608*333d2b36SAndroid Build Coastguard Worker
609*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport_overridesDisabledAndroidApp(t *testing.T) {
610*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
611*333d2b36SAndroid Build Coastguard Worker		android_app {
612*333d2b36SAndroid Build Coastguard Worker			name: "foo",
613*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
614*333d2b36SAndroid Build Coastguard Worker			enabled: false,
615*333d2b36SAndroid Build Coastguard Worker		}
616*333d2b36SAndroid Build Coastguard Worker
617*333d2b36SAndroid Build Coastguard Worker 		android_app_import {
618*333d2b36SAndroid Build Coastguard Worker			name: "foo",
619*333d2b36SAndroid Build Coastguard Worker			apk: "prebuilts/apk/app.apk",
620*333d2b36SAndroid Build Coastguard Worker			certificate: "platform",
621*333d2b36SAndroid Build Coastguard Worker			prefer: true,
622*333d2b36SAndroid Build Coastguard Worker		}
623*333d2b36SAndroid Build Coastguard Worker		`)
624*333d2b36SAndroid Build Coastguard Worker
625*333d2b36SAndroid Build Coastguard Worker	variant := ctx.ModuleForTests("prebuilt_foo", "android_common")
626*333d2b36SAndroid Build Coastguard Worker	a := variant.Module().(*AndroidAppImport)
627*333d2b36SAndroid Build Coastguard Worker	// The prebuilt module should still be enabled and active even if the source-based counterpart
628*333d2b36SAndroid Build Coastguard Worker	// is disabled.
629*333d2b36SAndroid Build Coastguard Worker	if !a.prebuilt.UsePrebuilt() {
630*333d2b36SAndroid Build Coastguard Worker		t.Errorf("prebuilt foo module is not active")
631*333d2b36SAndroid Build Coastguard Worker	}
632*333d2b36SAndroid Build Coastguard Worker	if !a.Enabled(android.PanickingConfigAndErrorContext(ctx)) {
633*333d2b36SAndroid Build Coastguard Worker		t.Errorf("prebuilt foo module is disabled")
634*333d2b36SAndroid Build Coastguard Worker	}
635*333d2b36SAndroid Build Coastguard Worker}
636*333d2b36SAndroid Build Coastguard Worker
637*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport_relativeInstallPath(t *testing.T) {
638*333d2b36SAndroid Build Coastguard Worker	bp := `
639*333d2b36SAndroid Build Coastguard Worker		android_app_import {
640*333d2b36SAndroid Build Coastguard Worker			name: "no_relative_install_path",
641*333d2b36SAndroid Build Coastguard Worker			apk: "prebuilts/apk/app.apk",
642*333d2b36SAndroid Build Coastguard Worker			presigned: true,
643*333d2b36SAndroid Build Coastguard Worker		}
644*333d2b36SAndroid Build Coastguard Worker
645*333d2b36SAndroid Build Coastguard Worker		android_app_import {
646*333d2b36SAndroid Build Coastguard Worker			name: "relative_install_path",
647*333d2b36SAndroid Build Coastguard Worker			apk: "prebuilts/apk/app.apk",
648*333d2b36SAndroid Build Coastguard Worker			presigned: true,
649*333d2b36SAndroid Build Coastguard Worker			relative_install_path: "my/path",
650*333d2b36SAndroid Build Coastguard Worker		}
651*333d2b36SAndroid Build Coastguard Worker
652*333d2b36SAndroid Build Coastguard Worker		android_app_import {
653*333d2b36SAndroid Build Coastguard Worker			name: "privileged_relative_install_path",
654*333d2b36SAndroid Build Coastguard Worker			apk: "prebuilts/apk/app.apk",
655*333d2b36SAndroid Build Coastguard Worker			presigned: true,
656*333d2b36SAndroid Build Coastguard Worker			privileged: true,
657*333d2b36SAndroid Build Coastguard Worker			relative_install_path: "my/path"
658*333d2b36SAndroid Build Coastguard Worker		}
659*333d2b36SAndroid Build Coastguard Worker		`
660*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
661*333d2b36SAndroid Build Coastguard Worker		name                string
662*333d2b36SAndroid Build Coastguard Worker		expectedInstallPath string
663*333d2b36SAndroid Build Coastguard Worker		errorMessage        string
664*333d2b36SAndroid Build Coastguard Worker	}{
665*333d2b36SAndroid Build Coastguard Worker		{
666*333d2b36SAndroid Build Coastguard Worker			name:                "no_relative_install_path",
667*333d2b36SAndroid Build Coastguard Worker			expectedInstallPath: "out/soong/target/product/test_device/system/app/no_relative_install_path/no_relative_install_path.apk",
668*333d2b36SAndroid Build Coastguard Worker			errorMessage:        "Install path is not correct when relative_install_path is missing",
669*333d2b36SAndroid Build Coastguard Worker		},
670*333d2b36SAndroid Build Coastguard Worker		{
671*333d2b36SAndroid Build Coastguard Worker			name:                "relative_install_path",
672*333d2b36SAndroid Build Coastguard Worker			expectedInstallPath: "out/soong/target/product/test_device/system/app/my/path/relative_install_path/relative_install_path.apk",
673*333d2b36SAndroid Build Coastguard Worker			errorMessage:        "Install path is not correct for app when relative_install_path is present",
674*333d2b36SAndroid Build Coastguard Worker		},
675*333d2b36SAndroid Build Coastguard Worker		{
676*333d2b36SAndroid Build Coastguard Worker			name:                "privileged_relative_install_path",
677*333d2b36SAndroid Build Coastguard Worker			expectedInstallPath: "out/soong/target/product/test_device/system/priv-app/my/path/privileged_relative_install_path/privileged_relative_install_path.apk",
678*333d2b36SAndroid Build Coastguard Worker			errorMessage:        "Install path is not correct for privileged app when relative_install_path is present",
679*333d2b36SAndroid Build Coastguard Worker		},
680*333d2b36SAndroid Build Coastguard Worker	}
681*333d2b36SAndroid Build Coastguard Worker	for _, testCase := range testCases {
682*333d2b36SAndroid Build Coastguard Worker		ctx, _ := testJava(t, bp)
683*333d2b36SAndroid Build Coastguard Worker		mod := ctx.ModuleForTests(testCase.name, "android_common").Module().(*AndroidAppImport)
684*333d2b36SAndroid Build Coastguard Worker		android.AssertPathRelativeToTopEquals(t, testCase.errorMessage, testCase.expectedInstallPath, mod.installPath)
685*333d2b36SAndroid Build Coastguard Worker	}
686*333d2b36SAndroid Build Coastguard Worker}
687*333d2b36SAndroid Build Coastguard Worker
688*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidTestImport(t *testing.T) {
689*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
690*333d2b36SAndroid Build Coastguard Worker		android_test_import {
691*333d2b36SAndroid Build Coastguard Worker			name: "foo",
692*333d2b36SAndroid Build Coastguard Worker			apk: "prebuilts/apk/app.apk",
693*333d2b36SAndroid Build Coastguard Worker			presigned: true,
694*333d2b36SAndroid Build Coastguard Worker			data: [
695*333d2b36SAndroid Build Coastguard Worker				"testdata/data",
696*333d2b36SAndroid Build Coastguard Worker			],
697*333d2b36SAndroid Build Coastguard Worker		}
698*333d2b36SAndroid Build Coastguard Worker		`)
699*333d2b36SAndroid Build Coastguard Worker
700*333d2b36SAndroid Build Coastguard Worker	test := ctx.ModuleForTests("foo", "android_common").Module().(*AndroidTestImport)
701*333d2b36SAndroid Build Coastguard Worker
702*333d2b36SAndroid Build Coastguard Worker	// Check android mks.
703*333d2b36SAndroid Build Coastguard Worker	entries := android.AndroidMkEntriesForTest(t, ctx, test)[0]
704*333d2b36SAndroid Build Coastguard Worker	expected := []string{"tests"}
705*333d2b36SAndroid Build Coastguard Worker	actual := entries.EntryMap["LOCAL_MODULE_TAGS"]
706*333d2b36SAndroid Build Coastguard Worker	if !reflect.DeepEqual(expected, actual) {
707*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Unexpected module tags - expected: %q, actual: %q", expected, actual)
708*333d2b36SAndroid Build Coastguard Worker	}
709*333d2b36SAndroid Build Coastguard Worker	expected = []string{"testdata/data:testdata/data"}
710*333d2b36SAndroid Build Coastguard Worker	actual = entries.EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
711*333d2b36SAndroid Build Coastguard Worker	if !reflect.DeepEqual(expected, actual) {
712*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Unexpected test data - expected: %q, actual: %q", expected, actual)
713*333d2b36SAndroid Build Coastguard Worker	}
714*333d2b36SAndroid Build Coastguard Worker}
715*333d2b36SAndroid Build Coastguard Worker
716*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidTestImport_NoJinUncompressForPresigned(t *testing.T) {
717*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
718*333d2b36SAndroid Build Coastguard Worker		android_test_import {
719*333d2b36SAndroid Build Coastguard Worker			name: "foo",
720*333d2b36SAndroid Build Coastguard Worker			apk: "prebuilts/apk/app.apk",
721*333d2b36SAndroid Build Coastguard Worker			certificate: "cert/new_cert",
722*333d2b36SAndroid Build Coastguard Worker			data: [
723*333d2b36SAndroid Build Coastguard Worker				"testdata/data",
724*333d2b36SAndroid Build Coastguard Worker			],
725*333d2b36SAndroid Build Coastguard Worker		}
726*333d2b36SAndroid Build Coastguard Worker
727*333d2b36SAndroid Build Coastguard Worker		android_test_import {
728*333d2b36SAndroid Build Coastguard Worker			name: "foo_presigned",
729*333d2b36SAndroid Build Coastguard Worker			apk: "prebuilts/apk/app.apk",
730*333d2b36SAndroid Build Coastguard Worker			presigned: true,
731*333d2b36SAndroid Build Coastguard Worker			data: [
732*333d2b36SAndroid Build Coastguard Worker				"testdata/data",
733*333d2b36SAndroid Build Coastguard Worker			],
734*333d2b36SAndroid Build Coastguard Worker		}
735*333d2b36SAndroid Build Coastguard Worker		`)
736*333d2b36SAndroid Build Coastguard Worker
737*333d2b36SAndroid Build Coastguard Worker	variant := ctx.ModuleForTests("foo", "android_common")
738*333d2b36SAndroid Build Coastguard Worker	jniRule := variant.Output("jnis-uncompressed/foo.apk").BuildParams.Rule.String()
739*333d2b36SAndroid Build Coastguard Worker	if jniRule == android.Cp.String() {
740*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Unexpected JNI uncompress rule command: " + jniRule)
741*333d2b36SAndroid Build Coastguard Worker	}
742*333d2b36SAndroid Build Coastguard Worker
743*333d2b36SAndroid Build Coastguard Worker	variant = ctx.ModuleForTests("foo_presigned", "android_common")
744*333d2b36SAndroid Build Coastguard Worker	jniRule = variant.Output("jnis-uncompressed/foo_presigned.apk").BuildParams.Rule.String()
745*333d2b36SAndroid Build Coastguard Worker	if jniRule != android.Cp.String() {
746*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Unexpected JNI uncompress rule: " + jniRule)
747*333d2b36SAndroid Build Coastguard Worker	}
748*333d2b36SAndroid Build Coastguard Worker	if variant.MaybeOutput("zip-aligned/foo_presigned.apk").Rule == nil {
749*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Presigned test apk should be aligned")
750*333d2b36SAndroid Build Coastguard Worker	}
751*333d2b36SAndroid Build Coastguard Worker}
752*333d2b36SAndroid Build Coastguard Worker
753*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidTestImport_Preprocessed(t *testing.T) {
754*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
755*333d2b36SAndroid Build Coastguard Worker		android_test_import {
756*333d2b36SAndroid Build Coastguard Worker			name: "foo",
757*333d2b36SAndroid Build Coastguard Worker			apk: "prebuilts/apk/app.apk",
758*333d2b36SAndroid Build Coastguard Worker			presigned: true,
759*333d2b36SAndroid Build Coastguard Worker			preprocessed: true,
760*333d2b36SAndroid Build Coastguard Worker		}
761*333d2b36SAndroid Build Coastguard Worker		`)
762*333d2b36SAndroid Build Coastguard Worker
763*333d2b36SAndroid Build Coastguard Worker	apkName := "foo.apk"
764*333d2b36SAndroid Build Coastguard Worker	variant := ctx.ModuleForTests("foo", "android_common")
765*333d2b36SAndroid Build Coastguard Worker	jniRule := variant.Output("jnis-uncompressed/" + apkName).BuildParams.Rule.String()
766*333d2b36SAndroid Build Coastguard Worker	if jniRule != android.Cp.String() {
767*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Unexpected JNI uncompress rule: " + jniRule)
768*333d2b36SAndroid Build Coastguard Worker	}
769*333d2b36SAndroid Build Coastguard Worker
770*333d2b36SAndroid Build Coastguard Worker	// Make sure signing and aligning were skipped.
771*333d2b36SAndroid Build Coastguard Worker	if variant.MaybeOutput("signed/"+apkName).Rule != nil {
772*333d2b36SAndroid Build Coastguard Worker		t.Errorf("signing rule shouldn't be included for preprocessed.")
773*333d2b36SAndroid Build Coastguard Worker	}
774*333d2b36SAndroid Build Coastguard Worker	if variant.MaybeOutput("zip-aligned/"+apkName).Rule != nil {
775*333d2b36SAndroid Build Coastguard Worker		t.Errorf("aligning rule shouldn't be for preprocessed")
776*333d2b36SAndroid Build Coastguard Worker	}
777*333d2b36SAndroid Build Coastguard Worker}
778*333d2b36SAndroid Build Coastguard Worker
779*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport_Preprocessed(t *testing.T) {
780*333d2b36SAndroid Build Coastguard Worker	for _, dontUncompressPrivAppDexs := range []bool{false, true} {
781*333d2b36SAndroid Build Coastguard Worker		name := fmt.Sprintf("dontUncompressPrivAppDexs:%t", dontUncompressPrivAppDexs)
782*333d2b36SAndroid Build Coastguard Worker		t.Run(name, func(t *testing.T) {
783*333d2b36SAndroid Build Coastguard Worker			result := android.GroupFixturePreparers(
784*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithJavaDefaultModules,
785*333d2b36SAndroid Build Coastguard Worker				android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
786*333d2b36SAndroid Build Coastguard Worker					variables.UncompressPrivAppDex = proptools.BoolPtr(!dontUncompressPrivAppDexs)
787*333d2b36SAndroid Build Coastguard Worker				}),
788*333d2b36SAndroid Build Coastguard Worker			).RunTestWithBp(t, `
789*333d2b36SAndroid Build Coastguard Worker				android_app_import {
790*333d2b36SAndroid Build Coastguard Worker					name: "foo",
791*333d2b36SAndroid Build Coastguard Worker					apk: "prebuilts/apk/app.apk",
792*333d2b36SAndroid Build Coastguard Worker					presigned: true,
793*333d2b36SAndroid Build Coastguard Worker					preprocessed: true,
794*333d2b36SAndroid Build Coastguard Worker				}
795*333d2b36SAndroid Build Coastguard Worker
796*333d2b36SAndroid Build Coastguard Worker				android_app_import {
797*333d2b36SAndroid Build Coastguard Worker					name: "bar",
798*333d2b36SAndroid Build Coastguard Worker					apk: "prebuilts/apk/app.apk",
799*333d2b36SAndroid Build Coastguard Worker					presigned: true,
800*333d2b36SAndroid Build Coastguard Worker					privileged: true,
801*333d2b36SAndroid Build Coastguard Worker					preprocessed: true,
802*333d2b36SAndroid Build Coastguard Worker				}
803*333d2b36SAndroid Build Coastguard Worker			`)
804*333d2b36SAndroid Build Coastguard Worker
805*333d2b36SAndroid Build Coastguard Worker			// non-privileged app
806*333d2b36SAndroid Build Coastguard Worker			apkName := "foo.apk"
807*333d2b36SAndroid Build Coastguard Worker			variant := result.ModuleForTests("foo", "android_common")
808*333d2b36SAndroid Build Coastguard Worker			outputBuildParams := variant.Output(apkName).BuildParams
809*333d2b36SAndroid Build Coastguard Worker			if outputBuildParams.Rule.String() != android.Cp.String() {
810*333d2b36SAndroid Build Coastguard Worker				t.Errorf("Unexpected prebuilt android_app_import rule: " + outputBuildParams.Rule.String())
811*333d2b36SAndroid Build Coastguard Worker			}
812*333d2b36SAndroid Build Coastguard Worker
813*333d2b36SAndroid Build Coastguard Worker			// Make sure compression and aligning were validated.
814*333d2b36SAndroid Build Coastguard Worker			if outputBuildParams.Validation == nil {
815*333d2b36SAndroid Build Coastguard Worker				t.Errorf("Expected validation rule, but was not found")
816*333d2b36SAndroid Build Coastguard Worker			}
817*333d2b36SAndroid Build Coastguard Worker
818*333d2b36SAndroid Build Coastguard Worker			validationBuildParams := variant.Output("validated-prebuilt/check.stamp").BuildParams
819*333d2b36SAndroid Build Coastguard Worker			if validationBuildParams.Rule.String() != checkPresignedApkRule.String() {
820*333d2b36SAndroid Build Coastguard Worker				t.Errorf("Unexpected validation rule: " + validationBuildParams.Rule.String())
821*333d2b36SAndroid Build Coastguard Worker			}
822*333d2b36SAndroid Build Coastguard Worker
823*333d2b36SAndroid Build Coastguard Worker			expectedScriptArgs := "--preprocessed"
824*333d2b36SAndroid Build Coastguard Worker			actualScriptArgs := validationBuildParams.Args["extraArgs"]
825*333d2b36SAndroid Build Coastguard Worker			android.AssertStringEquals(t, "check script extraArgs", expectedScriptArgs, actualScriptArgs)
826*333d2b36SAndroid Build Coastguard Worker
827*333d2b36SAndroid Build Coastguard Worker			// privileged app
828*333d2b36SAndroid Build Coastguard Worker			apkName = "bar.apk"
829*333d2b36SAndroid Build Coastguard Worker			variant = result.ModuleForTests("bar", "android_common")
830*333d2b36SAndroid Build Coastguard Worker			outputBuildParams = variant.Output(apkName).BuildParams
831*333d2b36SAndroid Build Coastguard Worker			if outputBuildParams.Rule.String() != android.Cp.String() {
832*333d2b36SAndroid Build Coastguard Worker				t.Errorf("Unexpected prebuilt android_app_import rule: " + outputBuildParams.Rule.String())
833*333d2b36SAndroid Build Coastguard Worker			}
834*333d2b36SAndroid Build Coastguard Worker
835*333d2b36SAndroid Build Coastguard Worker			// Make sure compression and aligning were validated.
836*333d2b36SAndroid Build Coastguard Worker			if outputBuildParams.Validation == nil {
837*333d2b36SAndroid Build Coastguard Worker				t.Errorf("Expected validation rule, but was not found")
838*333d2b36SAndroid Build Coastguard Worker			}
839*333d2b36SAndroid Build Coastguard Worker
840*333d2b36SAndroid Build Coastguard Worker			validationBuildParams = variant.Output("validated-prebuilt/check.stamp").BuildParams
841*333d2b36SAndroid Build Coastguard Worker			if validationBuildParams.Rule.String() != checkPresignedApkRule.String() {
842*333d2b36SAndroid Build Coastguard Worker				t.Errorf("Unexpected validation rule: " + validationBuildParams.Rule.String())
843*333d2b36SAndroid Build Coastguard Worker			}
844*333d2b36SAndroid Build Coastguard Worker
845*333d2b36SAndroid Build Coastguard Worker			expectedScriptArgs = "--privileged"
846*333d2b36SAndroid Build Coastguard Worker			if !dontUncompressPrivAppDexs {
847*333d2b36SAndroid Build Coastguard Worker				expectedScriptArgs += " --uncompress-priv-app-dex"
848*333d2b36SAndroid Build Coastguard Worker			}
849*333d2b36SAndroid Build Coastguard Worker			expectedScriptArgs += " --preprocessed"
850*333d2b36SAndroid Build Coastguard Worker			actualScriptArgs = validationBuildParams.Args["extraArgs"]
851*333d2b36SAndroid Build Coastguard Worker			android.AssertStringEquals(t, "check script extraArgs", expectedScriptArgs, actualScriptArgs)
852*333d2b36SAndroid Build Coastguard Worker		})
853*333d2b36SAndroid Build Coastguard Worker	}
854*333d2b36SAndroid Build Coastguard Worker}
855*333d2b36SAndroid Build Coastguard Worker
856*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidTestImport_UncompressDex(t *testing.T) {
857*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
858*333d2b36SAndroid Build Coastguard Worker		name string
859*333d2b36SAndroid Build Coastguard Worker		bp   string
860*333d2b36SAndroid Build Coastguard Worker	}{
861*333d2b36SAndroid Build Coastguard Worker		{
862*333d2b36SAndroid Build Coastguard Worker			name: "normal",
863*333d2b36SAndroid Build Coastguard Worker			bp: `
864*333d2b36SAndroid Build Coastguard Worker				android_app_import {
865*333d2b36SAndroid Build Coastguard Worker					name: "foo",
866*333d2b36SAndroid Build Coastguard Worker					presigned: true,
867*333d2b36SAndroid Build Coastguard Worker					apk: "prebuilts/apk/app.apk",
868*333d2b36SAndroid Build Coastguard Worker				}
869*333d2b36SAndroid Build Coastguard Worker			`,
870*333d2b36SAndroid Build Coastguard Worker		},
871*333d2b36SAndroid Build Coastguard Worker		{
872*333d2b36SAndroid Build Coastguard Worker			name: "privileged",
873*333d2b36SAndroid Build Coastguard Worker			bp: `
874*333d2b36SAndroid Build Coastguard Worker				android_app_import {
875*333d2b36SAndroid Build Coastguard Worker					name: "foo",
876*333d2b36SAndroid Build Coastguard Worker					presigned: true,
877*333d2b36SAndroid Build Coastguard Worker					privileged: true,
878*333d2b36SAndroid Build Coastguard Worker					apk: "prebuilts/apk/app.apk",
879*333d2b36SAndroid Build Coastguard Worker				}
880*333d2b36SAndroid Build Coastguard Worker			`,
881*333d2b36SAndroid Build Coastguard Worker		},
882*333d2b36SAndroid Build Coastguard Worker	}
883*333d2b36SAndroid Build Coastguard Worker
884*333d2b36SAndroid Build Coastguard Worker	test := func(t *testing.T, bp string, unbundled bool, dontUncompressPrivAppDexs bool) {
885*333d2b36SAndroid Build Coastguard Worker		t.Helper()
886*333d2b36SAndroid Build Coastguard Worker
887*333d2b36SAndroid Build Coastguard Worker		result := android.GroupFixturePreparers(
888*333d2b36SAndroid Build Coastguard Worker			prepareForJavaTest,
889*333d2b36SAndroid Build Coastguard Worker			android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
890*333d2b36SAndroid Build Coastguard Worker				if unbundled {
891*333d2b36SAndroid Build Coastguard Worker					variables.Unbundled_build = proptools.BoolPtr(true)
892*333d2b36SAndroid Build Coastguard Worker				}
893*333d2b36SAndroid Build Coastguard Worker				variables.UncompressPrivAppDex = proptools.BoolPtr(!dontUncompressPrivAppDexs)
894*333d2b36SAndroid Build Coastguard Worker			}),
895*333d2b36SAndroid Build Coastguard Worker		).RunTestWithBp(t, bp)
896*333d2b36SAndroid Build Coastguard Worker
897*333d2b36SAndroid Build Coastguard Worker		foo := result.ModuleForTests("foo", "android_common")
898*333d2b36SAndroid Build Coastguard Worker		actual := foo.MaybeRule("uncompress-dex").Rule != nil
899*333d2b36SAndroid Build Coastguard Worker
900*333d2b36SAndroid Build Coastguard Worker		expect := !unbundled
901*333d2b36SAndroid Build Coastguard Worker		if strings.Contains(bp, "privileged: true") {
902*333d2b36SAndroid Build Coastguard Worker			if dontUncompressPrivAppDexs {
903*333d2b36SAndroid Build Coastguard Worker				expect = false
904*333d2b36SAndroid Build Coastguard Worker			} else {
905*333d2b36SAndroid Build Coastguard Worker				// TODO(b/194504107): shouldn't priv-apps be always uncompressed unless
906*333d2b36SAndroid Build Coastguard Worker				// DONT_UNCOMPRESS_PRIV_APPS_DEXS is true (regardless of unbundling)?
907*333d2b36SAndroid Build Coastguard Worker				// expect = true
908*333d2b36SAndroid Build Coastguard Worker			}
909*333d2b36SAndroid Build Coastguard Worker		}
910*333d2b36SAndroid Build Coastguard Worker
911*333d2b36SAndroid Build Coastguard Worker		android.AssertBoolEquals(t, "uncompress dex", expect, actual)
912*333d2b36SAndroid Build Coastguard Worker	}
913*333d2b36SAndroid Build Coastguard Worker
914*333d2b36SAndroid Build Coastguard Worker	for _, unbundled := range []bool{false, true} {
915*333d2b36SAndroid Build Coastguard Worker		for _, dontUncompressPrivAppDexs := range []bool{false, true} {
916*333d2b36SAndroid Build Coastguard Worker			for _, tt := range testCases {
917*333d2b36SAndroid Build Coastguard Worker				name := fmt.Sprintf("%s,unbundled:%t,dontUncompressPrivAppDexs:%t",
918*333d2b36SAndroid Build Coastguard Worker					tt.name, unbundled, dontUncompressPrivAppDexs)
919*333d2b36SAndroid Build Coastguard Worker				t.Run(name, func(t *testing.T) {
920*333d2b36SAndroid Build Coastguard Worker					test(t, tt.bp, unbundled, dontUncompressPrivAppDexs)
921*333d2b36SAndroid Build Coastguard Worker				})
922*333d2b36SAndroid Build Coastguard Worker			}
923*333d2b36SAndroid Build Coastguard Worker		}
924*333d2b36SAndroid Build Coastguard Worker	}
925*333d2b36SAndroid Build Coastguard Worker}
926*333d2b36SAndroid Build Coastguard Worker
927*333d2b36SAndroid Build Coastguard Workerfunc TestAppImportMissingCertificateAllowMissingDependencies(t *testing.T) {
928*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
929*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
930*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithAllowMissingDependencies,
931*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithAndroidMk,
932*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
933*333d2b36SAndroid Build Coastguard Worker		android_app_import {
934*333d2b36SAndroid Build Coastguard Worker			name: "foo",
935*333d2b36SAndroid Build Coastguard Worker			apk: "a.apk",
936*333d2b36SAndroid Build Coastguard Worker			certificate: ":missing_certificate",
937*333d2b36SAndroid Build Coastguard Worker		}`)
938*333d2b36SAndroid Build Coastguard Worker
939*333d2b36SAndroid Build Coastguard Worker	foo := result.ModuleForTests("foo", "android_common")
940*333d2b36SAndroid Build Coastguard Worker	fooApk := foo.Output("signed/foo.apk")
941*333d2b36SAndroid Build Coastguard Worker	if fooApk.Rule != android.ErrorRule {
942*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("expected ErrorRule for foo.apk, got %s", fooApk.Rule.String())
943*333d2b36SAndroid Build Coastguard Worker	}
944*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "expected error rule message", fooApk.Args["error"], "missing dependencies: missing_certificate\n")
945*333d2b36SAndroid Build Coastguard Worker}
946