xref: /aosp_15_r20/build/soong/apex/apex_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2018 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 apex
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"fmt"
19*333d2b36SAndroid Build Coastguard Worker	"path"
20*333d2b36SAndroid Build Coastguard Worker	"path/filepath"
21*333d2b36SAndroid Build Coastguard Worker	"reflect"
22*333d2b36SAndroid Build Coastguard Worker	"regexp"
23*333d2b36SAndroid Build Coastguard Worker	"slices"
24*333d2b36SAndroid Build Coastguard Worker	"sort"
25*333d2b36SAndroid Build Coastguard Worker	"strconv"
26*333d2b36SAndroid Build Coastguard Worker	"strings"
27*333d2b36SAndroid Build Coastguard Worker	"testing"
28*333d2b36SAndroid Build Coastguard Worker
29*333d2b36SAndroid Build Coastguard Worker	"android/soong/aconfig/codegen"
30*333d2b36SAndroid Build Coastguard Worker
31*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
32*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/bpmodify"
33*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
34*333d2b36SAndroid Build Coastguard Worker
35*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
36*333d2b36SAndroid Build Coastguard Worker	"android/soong/bpf"
37*333d2b36SAndroid Build Coastguard Worker	"android/soong/cc"
38*333d2b36SAndroid Build Coastguard Worker	"android/soong/dexpreopt"
39*333d2b36SAndroid Build Coastguard Worker	prebuilt_etc "android/soong/etc"
40*333d2b36SAndroid Build Coastguard Worker	"android/soong/filesystem"
41*333d2b36SAndroid Build Coastguard Worker	"android/soong/java"
42*333d2b36SAndroid Build Coastguard Worker	"android/soong/rust"
43*333d2b36SAndroid Build Coastguard Worker	"android/soong/sh"
44*333d2b36SAndroid Build Coastguard Worker)
45*333d2b36SAndroid Build Coastguard Worker
46*333d2b36SAndroid Build Coastguard Worker// names returns name list from white space separated string
47*333d2b36SAndroid Build Coastguard Workerfunc names(s string) (ns []string) {
48*333d2b36SAndroid Build Coastguard Worker	for _, n := range strings.Split(s, " ") {
49*333d2b36SAndroid Build Coastguard Worker		if len(n) > 0 {
50*333d2b36SAndroid Build Coastguard Worker			ns = append(ns, n)
51*333d2b36SAndroid Build Coastguard Worker		}
52*333d2b36SAndroid Build Coastguard Worker	}
53*333d2b36SAndroid Build Coastguard Worker	return
54*333d2b36SAndroid Build Coastguard Worker}
55*333d2b36SAndroid Build Coastguard Worker
56*333d2b36SAndroid Build Coastguard Workerfunc testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
57*333d2b36SAndroid Build Coastguard Worker	t.Helper()
58*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
59*333d2b36SAndroid Build Coastguard Worker		prepareForApexTest,
60*333d2b36SAndroid Build Coastguard Worker		android.GroupFixturePreparers(preparers...),
61*333d2b36SAndroid Build Coastguard Worker	).
62*333d2b36SAndroid Build Coastguard Worker		ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
63*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, bp)
64*333d2b36SAndroid Build Coastguard Worker}
65*333d2b36SAndroid Build Coastguard Worker
66*333d2b36SAndroid Build Coastguard Workerfunc testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
67*333d2b36SAndroid Build Coastguard Worker	t.Helper()
68*333d2b36SAndroid Build Coastguard Worker
69*333d2b36SAndroid Build Coastguard Worker	optionalBpPreparer := android.NullFixturePreparer
70*333d2b36SAndroid Build Coastguard Worker	if bp != "" {
71*333d2b36SAndroid Build Coastguard Worker		optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
72*333d2b36SAndroid Build Coastguard Worker	}
73*333d2b36SAndroid Build Coastguard Worker
74*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
75*333d2b36SAndroid Build Coastguard Worker		prepareForApexTest,
76*333d2b36SAndroid Build Coastguard Worker		android.GroupFixturePreparers(preparers...),
77*333d2b36SAndroid Build Coastguard Worker		optionalBpPreparer,
78*333d2b36SAndroid Build Coastguard Worker	).RunTest(t)
79*333d2b36SAndroid Build Coastguard Worker
80*333d2b36SAndroid Build Coastguard Worker	return result.TestContext
81*333d2b36SAndroid Build Coastguard Worker}
82*333d2b36SAndroid Build Coastguard Worker
83*333d2b36SAndroid Build Coastguard Workerfunc withFiles(files android.MockFS) android.FixturePreparer {
84*333d2b36SAndroid Build Coastguard Worker	return files.AddToFixture()
85*333d2b36SAndroid Build Coastguard Worker}
86*333d2b36SAndroid Build Coastguard Worker
87*333d2b36SAndroid Build Coastguard Workerfunc withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
88*333d2b36SAndroid Build Coastguard Worker	return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
89*333d2b36SAndroid Build Coastguard Worker		variables.ManifestPackageNameOverrides = specs
90*333d2b36SAndroid Build Coastguard Worker	})
91*333d2b36SAndroid Build Coastguard Worker}
92*333d2b36SAndroid Build Coastguard Worker
93*333d2b36SAndroid Build Coastguard Workerfunc withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
94*333d2b36SAndroid Build Coastguard Worker	return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
95*333d2b36SAndroid Build Coastguard Worker		variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
96*333d2b36SAndroid Build Coastguard Worker	})
97*333d2b36SAndroid Build Coastguard Worker}
98*333d2b36SAndroid Build Coastguard Worker
99*333d2b36SAndroid Build Coastguard Workervar withBinder32bit = android.FixtureModifyProductVariables(
100*333d2b36SAndroid Build Coastguard Worker	func(variables android.FixtureProductVariables) {
101*333d2b36SAndroid Build Coastguard Worker		variables.Binder32bit = proptools.BoolPtr(true)
102*333d2b36SAndroid Build Coastguard Worker	},
103*333d2b36SAndroid Build Coastguard Worker)
104*333d2b36SAndroid Build Coastguard Worker
105*333d2b36SAndroid Build Coastguard Workervar withUnbundledBuild = android.FixtureModifyProductVariables(
106*333d2b36SAndroid Build Coastguard Worker	func(variables android.FixtureProductVariables) {
107*333d2b36SAndroid Build Coastguard Worker		variables.Unbundled_build = proptools.BoolPtr(true)
108*333d2b36SAndroid Build Coastguard Worker	},
109*333d2b36SAndroid Build Coastguard Worker)
110*333d2b36SAndroid Build Coastguard Worker
111*333d2b36SAndroid Build Coastguard Worker// Legacy preparer used for running tests within the apex package.
112*333d2b36SAndroid Build Coastguard Worker//
113*333d2b36SAndroid Build Coastguard Worker// This includes everything that was needed to run any test in the apex package prior to the
114*333d2b36SAndroid Build Coastguard Worker// introduction of the test fixtures. Tests that are being converted to use fixtures directly
115*333d2b36SAndroid Build Coastguard Worker// rather than through the testApex...() methods should avoid using this and instead use the
116*333d2b36SAndroid Build Coastguard Worker// various preparers directly, using android.GroupFixturePreparers(...) to group them when
117*333d2b36SAndroid Build Coastguard Worker// necessary.
118*333d2b36SAndroid Build Coastguard Worker//
119*333d2b36SAndroid Build Coastguard Worker// deprecated
120*333d2b36SAndroid Build Coastguard Workervar prepareForApexTest = android.GroupFixturePreparers(
121*333d2b36SAndroid Build Coastguard Worker	// General preparers in alphabetical order as test infrastructure will enforce correct
122*333d2b36SAndroid Build Coastguard Worker	// registration order.
123*333d2b36SAndroid Build Coastguard Worker	android.PrepareForTestWithAndroidBuildComponents,
124*333d2b36SAndroid Build Coastguard Worker	bpf.PrepareForTestWithBpf,
125*333d2b36SAndroid Build Coastguard Worker	cc.PrepareForTestWithCcBuildComponents,
126*333d2b36SAndroid Build Coastguard Worker	java.PrepareForTestWithDexpreopt,
127*333d2b36SAndroid Build Coastguard Worker	prebuilt_etc.PrepareForTestWithPrebuiltEtc,
128*333d2b36SAndroid Build Coastguard Worker	rust.PrepareForTestWithRustDefaultModules,
129*333d2b36SAndroid Build Coastguard Worker	sh.PrepareForTestWithShBuildComponents,
130*333d2b36SAndroid Build Coastguard Worker	codegen.PrepareForTestWithAconfigBuildComponents,
131*333d2b36SAndroid Build Coastguard Worker
132*333d2b36SAndroid Build Coastguard Worker	PrepareForTestWithApexBuildComponents,
133*333d2b36SAndroid Build Coastguard Worker
134*333d2b36SAndroid Build Coastguard Worker	// Additional apex test specific preparers.
135*333d2b36SAndroid Build Coastguard Worker	android.FixtureAddTextFile("system/sepolicy/Android.bp", `
136*333d2b36SAndroid Build Coastguard Worker		filegroup {
137*333d2b36SAndroid Build Coastguard Worker			name: "myapex-file_contexts",
138*333d2b36SAndroid Build Coastguard Worker			srcs: [
139*333d2b36SAndroid Build Coastguard Worker				"apex/myapex-file_contexts",
140*333d2b36SAndroid Build Coastguard Worker			],
141*333d2b36SAndroid Build Coastguard Worker		}
142*333d2b36SAndroid Build Coastguard Worker	`),
143*333d2b36SAndroid Build Coastguard Worker	prepareForTestWithMyapex,
144*333d2b36SAndroid Build Coastguard Worker	android.FixtureMergeMockFs(android.MockFS{
145*333d2b36SAndroid Build Coastguard Worker		"a.java":                 nil,
146*333d2b36SAndroid Build Coastguard Worker		"PrebuiltAppFoo.apk":     nil,
147*333d2b36SAndroid Build Coastguard Worker		"PrebuiltAppFooPriv.apk": nil,
148*333d2b36SAndroid Build Coastguard Worker		"apex_manifest.json":     nil,
149*333d2b36SAndroid Build Coastguard Worker		"AndroidManifest.xml":    nil,
150*333d2b36SAndroid Build Coastguard Worker		"system/sepolicy/apex/myapex.updatable-file_contexts":         nil,
151*333d2b36SAndroid Build Coastguard Worker		"system/sepolicy/apex/myapex2-file_contexts":                  nil,
152*333d2b36SAndroid Build Coastguard Worker		"system/sepolicy/apex/otherapex-file_contexts":                nil,
153*333d2b36SAndroid Build Coastguard Worker		"system/sepolicy/apex/com.android.vndk-file_contexts":         nil,
154*333d2b36SAndroid Build Coastguard Worker		"system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
155*333d2b36SAndroid Build Coastguard Worker		"mylib.cpp":                            nil,
156*333d2b36SAndroid Build Coastguard Worker		"mytest.cpp":                           nil,
157*333d2b36SAndroid Build Coastguard Worker		"mytest1.cpp":                          nil,
158*333d2b36SAndroid Build Coastguard Worker		"mytest2.cpp":                          nil,
159*333d2b36SAndroid Build Coastguard Worker		"mytest3.cpp":                          nil,
160*333d2b36SAndroid Build Coastguard Worker		"myprebuilt":                           nil,
161*333d2b36SAndroid Build Coastguard Worker		"my_include":                           nil,
162*333d2b36SAndroid Build Coastguard Worker		"foo/bar/MyClass.java":                 nil,
163*333d2b36SAndroid Build Coastguard Worker		"prebuilt.jar":                         nil,
164*333d2b36SAndroid Build Coastguard Worker		"prebuilt.so":                          nil,
165*333d2b36SAndroid Build Coastguard Worker		"vendor/foo/devkeys/test.x509.pem":     nil,
166*333d2b36SAndroid Build Coastguard Worker		"vendor/foo/devkeys/test.pk8":          nil,
167*333d2b36SAndroid Build Coastguard Worker		"testkey.x509.pem":                     nil,
168*333d2b36SAndroid Build Coastguard Worker		"testkey.pk8":                          nil,
169*333d2b36SAndroid Build Coastguard Worker		"testkey.override.x509.pem":            nil,
170*333d2b36SAndroid Build Coastguard Worker		"testkey.override.pk8":                 nil,
171*333d2b36SAndroid Build Coastguard Worker		"vendor/foo/devkeys/testkey.avbpubkey": nil,
172*333d2b36SAndroid Build Coastguard Worker		"vendor/foo/devkeys/testkey.pem":       nil,
173*333d2b36SAndroid Build Coastguard Worker		"NOTICE":                               nil,
174*333d2b36SAndroid Build Coastguard Worker		"custom_notice":                        nil,
175*333d2b36SAndroid Build Coastguard Worker		"custom_notice_for_static_lib":         nil,
176*333d2b36SAndroid Build Coastguard Worker		"testkey2.avbpubkey":                   nil,
177*333d2b36SAndroid Build Coastguard Worker		"testkey2.pem":                         nil,
178*333d2b36SAndroid Build Coastguard Worker		"myapex-arm64.apex":                    nil,
179*333d2b36SAndroid Build Coastguard Worker		"myapex-arm.apex":                      nil,
180*333d2b36SAndroid Build Coastguard Worker		"myapex.apks":                          nil,
181*333d2b36SAndroid Build Coastguard Worker		"frameworks/base/api/current.txt":      nil,
182*333d2b36SAndroid Build Coastguard Worker		"framework/aidl/a.aidl":                nil,
183*333d2b36SAndroid Build Coastguard Worker		"dummy.txt":                            nil,
184*333d2b36SAndroid Build Coastguard Worker		"baz":                                  nil,
185*333d2b36SAndroid Build Coastguard Worker		"bar/baz":                              nil,
186*333d2b36SAndroid Build Coastguard Worker		"testdata/baz":                         nil,
187*333d2b36SAndroid Build Coastguard Worker		"AppSet.apks":                          nil,
188*333d2b36SAndroid Build Coastguard Worker		"foo.rs":                               nil,
189*333d2b36SAndroid Build Coastguard Worker		"libfoo.jar":                           nil,
190*333d2b36SAndroid Build Coastguard Worker		"libbar.jar":                           nil,
191*333d2b36SAndroid Build Coastguard Worker	},
192*333d2b36SAndroid Build Coastguard Worker	),
193*333d2b36SAndroid Build Coastguard Worker
194*333d2b36SAndroid Build Coastguard Worker	android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
195*333d2b36SAndroid Build Coastguard Worker		variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
196*333d2b36SAndroid Build Coastguard Worker		variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
197*333d2b36SAndroid Build Coastguard Worker		variables.Platform_sdk_codename = proptools.StringPtr("Q")
198*333d2b36SAndroid Build Coastguard Worker		variables.Platform_sdk_final = proptools.BoolPtr(false)
199*333d2b36SAndroid Build Coastguard Worker		// "Tiramisu" needs to be in the next line for compatibility with soong code,
200*333d2b36SAndroid Build Coastguard Worker		// not because of these tests specifically (it's not used by the tests)
201*333d2b36SAndroid Build Coastguard Worker		variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
202*333d2b36SAndroid Build Coastguard Worker		variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
203*333d2b36SAndroid Build Coastguard Worker	}),
204*333d2b36SAndroid Build Coastguard Worker)
205*333d2b36SAndroid Build Coastguard Worker
206*333d2b36SAndroid Build Coastguard Workervar prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
207*333d2b36SAndroid Build Coastguard Worker	"system/sepolicy/apex/myapex-file_contexts": nil,
208*333d2b36SAndroid Build Coastguard Worker})
209*333d2b36SAndroid Build Coastguard Worker
210*333d2b36SAndroid Build Coastguard Workervar prepareForTestWithOtherapex = android.FixtureMergeMockFs(android.MockFS{
211*333d2b36SAndroid Build Coastguard Worker	"system/sepolicy/apex/otherapex-file_contexts": nil,
212*333d2b36SAndroid Build Coastguard Worker})
213*333d2b36SAndroid Build Coastguard Worker
214*333d2b36SAndroid Build Coastguard Worker// ensure that 'result' equals 'expected'
215*333d2b36SAndroid Build Coastguard Workerfunc ensureEquals(t *testing.T, result string, expected string) {
216*333d2b36SAndroid Build Coastguard Worker	t.Helper()
217*333d2b36SAndroid Build Coastguard Worker	if result != expected {
218*333d2b36SAndroid Build Coastguard Worker		t.Errorf("%q != %q", expected, result)
219*333d2b36SAndroid Build Coastguard Worker	}
220*333d2b36SAndroid Build Coastguard Worker}
221*333d2b36SAndroid Build Coastguard Worker
222*333d2b36SAndroid Build Coastguard Worker// ensure that 'result' contains 'expected'
223*333d2b36SAndroid Build Coastguard Workerfunc ensureContains(t *testing.T, result string, expected string) {
224*333d2b36SAndroid Build Coastguard Worker	t.Helper()
225*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(result, expected) {
226*333d2b36SAndroid Build Coastguard Worker		t.Errorf("%q is not found in %q", expected, result)
227*333d2b36SAndroid Build Coastguard Worker	}
228*333d2b36SAndroid Build Coastguard Worker}
229*333d2b36SAndroid Build Coastguard Worker
230*333d2b36SAndroid Build Coastguard Worker// ensure that 'result' contains 'expected' exactly one time
231*333d2b36SAndroid Build Coastguard Workerfunc ensureContainsOnce(t *testing.T, result string, expected string) {
232*333d2b36SAndroid Build Coastguard Worker	t.Helper()
233*333d2b36SAndroid Build Coastguard Worker	count := strings.Count(result, expected)
234*333d2b36SAndroid Build Coastguard Worker	if count != 1 {
235*333d2b36SAndroid Build Coastguard Worker		t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
236*333d2b36SAndroid Build Coastguard Worker	}
237*333d2b36SAndroid Build Coastguard Worker}
238*333d2b36SAndroid Build Coastguard Worker
239*333d2b36SAndroid Build Coastguard Worker// ensures that 'result' does not contain 'notExpected'
240*333d2b36SAndroid Build Coastguard Workerfunc ensureNotContains(t *testing.T, result string, notExpected string) {
241*333d2b36SAndroid Build Coastguard Worker	t.Helper()
242*333d2b36SAndroid Build Coastguard Worker	if strings.Contains(result, notExpected) {
243*333d2b36SAndroid Build Coastguard Worker		t.Errorf("%q is found in %q", notExpected, result)
244*333d2b36SAndroid Build Coastguard Worker	}
245*333d2b36SAndroid Build Coastguard Worker}
246*333d2b36SAndroid Build Coastguard Worker
247*333d2b36SAndroid Build Coastguard Workerfunc ensureMatches(t *testing.T, result string, expectedRex string) {
248*333d2b36SAndroid Build Coastguard Worker	t.Helper()
249*333d2b36SAndroid Build Coastguard Worker	ok, err := regexp.MatchString(expectedRex, result)
250*333d2b36SAndroid Build Coastguard Worker	if err != nil {
251*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
252*333d2b36SAndroid Build Coastguard Worker		return
253*333d2b36SAndroid Build Coastguard Worker	}
254*333d2b36SAndroid Build Coastguard Worker	if !ok {
255*333d2b36SAndroid Build Coastguard Worker		t.Errorf("%s does not match regular expession %s", result, expectedRex)
256*333d2b36SAndroid Build Coastguard Worker	}
257*333d2b36SAndroid Build Coastguard Worker}
258*333d2b36SAndroid Build Coastguard Worker
259*333d2b36SAndroid Build Coastguard Workerfunc ensureListContainsMatch(t *testing.T, result []string, expectedRex string) {
260*333d2b36SAndroid Build Coastguard Worker	t.Helper()
261*333d2b36SAndroid Build Coastguard Worker	p := regexp.MustCompile(expectedRex)
262*333d2b36SAndroid Build Coastguard Worker	if android.IndexListPred(func(s string) bool { return p.MatchString(s) }, result) == -1 {
263*333d2b36SAndroid Build Coastguard Worker		t.Errorf("%q is not found in %v", expectedRex, result)
264*333d2b36SAndroid Build Coastguard Worker	}
265*333d2b36SAndroid Build Coastguard Worker}
266*333d2b36SAndroid Build Coastguard Worker
267*333d2b36SAndroid Build Coastguard Workerfunc ensureListContains(t *testing.T, result []string, expected string) {
268*333d2b36SAndroid Build Coastguard Worker	t.Helper()
269*333d2b36SAndroid Build Coastguard Worker	if !android.InList(expected, result) {
270*333d2b36SAndroid Build Coastguard Worker		t.Errorf("%q is not found in %v", expected, result)
271*333d2b36SAndroid Build Coastguard Worker	}
272*333d2b36SAndroid Build Coastguard Worker}
273*333d2b36SAndroid Build Coastguard Worker
274*333d2b36SAndroid Build Coastguard Workerfunc ensureListNotContains(t *testing.T, result []string, notExpected string) {
275*333d2b36SAndroid Build Coastguard Worker	t.Helper()
276*333d2b36SAndroid Build Coastguard Worker	if android.InList(notExpected, result) {
277*333d2b36SAndroid Build Coastguard Worker		t.Errorf("%q is found in %v", notExpected, result)
278*333d2b36SAndroid Build Coastguard Worker	}
279*333d2b36SAndroid Build Coastguard Worker}
280*333d2b36SAndroid Build Coastguard Worker
281*333d2b36SAndroid Build Coastguard Workerfunc ensureListEmpty(t *testing.T, result []string) {
282*333d2b36SAndroid Build Coastguard Worker	t.Helper()
283*333d2b36SAndroid Build Coastguard Worker	if len(result) > 0 {
284*333d2b36SAndroid Build Coastguard Worker		t.Errorf("%q is expected to be empty", result)
285*333d2b36SAndroid Build Coastguard Worker	}
286*333d2b36SAndroid Build Coastguard Worker}
287*333d2b36SAndroid Build Coastguard Worker
288*333d2b36SAndroid Build Coastguard Workerfunc ensureListNotEmpty(t *testing.T, result []string) {
289*333d2b36SAndroid Build Coastguard Worker	t.Helper()
290*333d2b36SAndroid Build Coastguard Worker	if len(result) == 0 {
291*333d2b36SAndroid Build Coastguard Worker		t.Errorf("%q is expected to be not empty", result)
292*333d2b36SAndroid Build Coastguard Worker	}
293*333d2b36SAndroid Build Coastguard Worker}
294*333d2b36SAndroid Build Coastguard Worker
295*333d2b36SAndroid Build Coastguard Worker// Minimal test
296*333d2b36SAndroid Build Coastguard Workerfunc TestBasicApex(t *testing.T) {
297*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
298*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
299*333d2b36SAndroid Build Coastguard Worker		apex_defaults {
300*333d2b36SAndroid Build Coastguard Worker			name: "myapex-defaults",
301*333d2b36SAndroid Build Coastguard Worker			manifest: ":myapex.manifest",
302*333d2b36SAndroid Build Coastguard Worker			androidManifest: ":myapex.androidmanifest",
303*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
304*333d2b36SAndroid Build Coastguard Worker			binaries: ["foo.rust"],
305*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: [
306*333d2b36SAndroid Build Coastguard Worker				"mylib",
307*333d2b36SAndroid Build Coastguard Worker				"libfoo.ffi",
308*333d2b36SAndroid Build Coastguard Worker			],
309*333d2b36SAndroid Build Coastguard Worker			rust_dyn_libs: ["libfoo.dylib.rust"],
310*333d2b36SAndroid Build Coastguard Worker			multilib: {
311*333d2b36SAndroid Build Coastguard Worker				both: {
312*333d2b36SAndroid Build Coastguard Worker					binaries: ["foo"],
313*333d2b36SAndroid Build Coastguard Worker				}
314*333d2b36SAndroid Build Coastguard Worker			},
315*333d2b36SAndroid Build Coastguard Worker			java_libs: [
316*333d2b36SAndroid Build Coastguard Worker				"myjar",
317*333d2b36SAndroid Build Coastguard Worker				"myjar_dex",
318*333d2b36SAndroid Build Coastguard Worker			],
319*333d2b36SAndroid Build Coastguard Worker			updatable: false,
320*333d2b36SAndroid Build Coastguard Worker		}
321*333d2b36SAndroid Build Coastguard Worker
322*333d2b36SAndroid Build Coastguard Worker		apex {
323*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
324*333d2b36SAndroid Build Coastguard Worker			defaults: ["myapex-defaults"],
325*333d2b36SAndroid Build Coastguard Worker		}
326*333d2b36SAndroid Build Coastguard Worker
327*333d2b36SAndroid Build Coastguard Worker		apex_key {
328*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
329*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
330*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
331*333d2b36SAndroid Build Coastguard Worker		}
332*333d2b36SAndroid Build Coastguard Worker
333*333d2b36SAndroid Build Coastguard Worker		filegroup {
334*333d2b36SAndroid Build Coastguard Worker			name: "myapex.manifest",
335*333d2b36SAndroid Build Coastguard Worker			srcs: ["apex_manifest.json"],
336*333d2b36SAndroid Build Coastguard Worker		}
337*333d2b36SAndroid Build Coastguard Worker
338*333d2b36SAndroid Build Coastguard Worker		filegroup {
339*333d2b36SAndroid Build Coastguard Worker			name: "myapex.androidmanifest",
340*333d2b36SAndroid Build Coastguard Worker			srcs: ["AndroidManifest.xml"],
341*333d2b36SAndroid Build Coastguard Worker		}
342*333d2b36SAndroid Build Coastguard Worker
343*333d2b36SAndroid Build Coastguard Worker		cc_library {
344*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
345*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
346*333d2b36SAndroid Build Coastguard Worker			shared_libs: [
347*333d2b36SAndroid Build Coastguard Worker				"mylib2",
348*333d2b36SAndroid Build Coastguard Worker				"libbar.ffi",
349*333d2b36SAndroid Build Coastguard Worker			],
350*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
351*333d2b36SAndroid Build Coastguard Worker			stl: "none",
352*333d2b36SAndroid Build Coastguard Worker			// TODO: remove //apex_available:platform
353*333d2b36SAndroid Build Coastguard Worker			apex_available: [
354*333d2b36SAndroid Build Coastguard Worker				"//apex_available:platform",
355*333d2b36SAndroid Build Coastguard Worker				"myapex",
356*333d2b36SAndroid Build Coastguard Worker			],
357*333d2b36SAndroid Build Coastguard Worker		}
358*333d2b36SAndroid Build Coastguard Worker
359*333d2b36SAndroid Build Coastguard Worker		cc_binary {
360*333d2b36SAndroid Build Coastguard Worker			name: "foo",
361*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
362*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "both",
363*333d2b36SAndroid Build Coastguard Worker			multilib: {
364*333d2b36SAndroid Build Coastguard Worker					lib32: {
365*333d2b36SAndroid Build Coastguard Worker							suffix: "32",
366*333d2b36SAndroid Build Coastguard Worker					},
367*333d2b36SAndroid Build Coastguard Worker					lib64: {
368*333d2b36SAndroid Build Coastguard Worker							suffix: "64",
369*333d2b36SAndroid Build Coastguard Worker					},
370*333d2b36SAndroid Build Coastguard Worker			},
371*333d2b36SAndroid Build Coastguard Worker			symlinks: ["foo_link_"],
372*333d2b36SAndroid Build Coastguard Worker			symlink_preferred_arch: true,
373*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
374*333d2b36SAndroid Build Coastguard Worker			stl: "none",
375*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
376*333d2b36SAndroid Build Coastguard Worker		}
377*333d2b36SAndroid Build Coastguard Worker
378*333d2b36SAndroid Build Coastguard Worker		rust_binary {
379*333d2b36SAndroid Build Coastguard Worker			name: "foo.rust",
380*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
381*333d2b36SAndroid Build Coastguard Worker			rlibs: ["libfoo.rlib.rust"],
382*333d2b36SAndroid Build Coastguard Worker			rustlibs: ["libfoo.transitive.dylib.rust"],
383*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
384*333d2b36SAndroid Build Coastguard Worker		}
385*333d2b36SAndroid Build Coastguard Worker
386*333d2b36SAndroid Build Coastguard Worker		rust_library_rlib {
387*333d2b36SAndroid Build Coastguard Worker			name: "libfoo.rlib.rust",
388*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
389*333d2b36SAndroid Build Coastguard Worker			crate_name: "foo",
390*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
391*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libfoo.shared_from_rust"],
392*333d2b36SAndroid Build Coastguard Worker		}
393*333d2b36SAndroid Build Coastguard Worker
394*333d2b36SAndroid Build Coastguard Worker		cc_library_shared {
395*333d2b36SAndroid Build Coastguard Worker			name: "libfoo.shared_from_rust",
396*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
397*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
398*333d2b36SAndroid Build Coastguard Worker			stl: "none",
399*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
400*333d2b36SAndroid Build Coastguard Worker		}
401*333d2b36SAndroid Build Coastguard Worker
402*333d2b36SAndroid Build Coastguard Worker		rust_library_dylib {
403*333d2b36SAndroid Build Coastguard Worker			name: "libfoo.dylib.rust",
404*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
405*333d2b36SAndroid Build Coastguard Worker			crate_name: "foo",
406*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
407*333d2b36SAndroid Build Coastguard Worker		}
408*333d2b36SAndroid Build Coastguard Worker
409*333d2b36SAndroid Build Coastguard Worker		rust_library_dylib {
410*333d2b36SAndroid Build Coastguard Worker			name: "libfoo.transitive.dylib.rust",
411*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
412*333d2b36SAndroid Build Coastguard Worker			crate_name: "foo",
413*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
414*333d2b36SAndroid Build Coastguard Worker		}
415*333d2b36SAndroid Build Coastguard Worker
416*333d2b36SAndroid Build Coastguard Worker		rust_ffi_shared {
417*333d2b36SAndroid Build Coastguard Worker			name: "libfoo.ffi",
418*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
419*333d2b36SAndroid Build Coastguard Worker			crate_name: "foo",
420*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
421*333d2b36SAndroid Build Coastguard Worker		}
422*333d2b36SAndroid Build Coastguard Worker
423*333d2b36SAndroid Build Coastguard Worker		rust_ffi_shared {
424*333d2b36SAndroid Build Coastguard Worker			name: "libbar.ffi",
425*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
426*333d2b36SAndroid Build Coastguard Worker			crate_name: "bar",
427*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
428*333d2b36SAndroid Build Coastguard Worker		}
429*333d2b36SAndroid Build Coastguard Worker
430*333d2b36SAndroid Build Coastguard Worker		cc_library_shared {
431*333d2b36SAndroid Build Coastguard Worker			name: "mylib2",
432*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
433*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
434*333d2b36SAndroid Build Coastguard Worker			stl: "none",
435*333d2b36SAndroid Build Coastguard Worker			static_libs: ["libstatic"],
436*333d2b36SAndroid Build Coastguard Worker			// TODO: remove //apex_available:platform
437*333d2b36SAndroid Build Coastguard Worker			apex_available: [
438*333d2b36SAndroid Build Coastguard Worker				"//apex_available:platform",
439*333d2b36SAndroid Build Coastguard Worker				"myapex",
440*333d2b36SAndroid Build Coastguard Worker			],
441*333d2b36SAndroid Build Coastguard Worker		}
442*333d2b36SAndroid Build Coastguard Worker
443*333d2b36SAndroid Build Coastguard Worker		cc_prebuilt_library_shared {
444*333d2b36SAndroid Build Coastguard Worker			name: "mylib2",
445*333d2b36SAndroid Build Coastguard Worker			srcs: ["prebuilt.so"],
446*333d2b36SAndroid Build Coastguard Worker			// TODO: remove //apex_available:platform
447*333d2b36SAndroid Build Coastguard Worker			apex_available: [
448*333d2b36SAndroid Build Coastguard Worker				"//apex_available:platform",
449*333d2b36SAndroid Build Coastguard Worker				"myapex",
450*333d2b36SAndroid Build Coastguard Worker			],
451*333d2b36SAndroid Build Coastguard Worker		}
452*333d2b36SAndroid Build Coastguard Worker
453*333d2b36SAndroid Build Coastguard Worker		cc_library_static {
454*333d2b36SAndroid Build Coastguard Worker			name: "libstatic",
455*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
456*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
457*333d2b36SAndroid Build Coastguard Worker			stl: "none",
458*333d2b36SAndroid Build Coastguard Worker			// TODO: remove //apex_available:platform
459*333d2b36SAndroid Build Coastguard Worker			apex_available: [
460*333d2b36SAndroid Build Coastguard Worker				"//apex_available:platform",
461*333d2b36SAndroid Build Coastguard Worker				"myapex",
462*333d2b36SAndroid Build Coastguard Worker			],
463*333d2b36SAndroid Build Coastguard Worker		}
464*333d2b36SAndroid Build Coastguard Worker
465*333d2b36SAndroid Build Coastguard Worker		java_library {
466*333d2b36SAndroid Build Coastguard Worker			name: "myjar",
467*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
468*333d2b36SAndroid Build Coastguard Worker			stem: "myjar_stem",
469*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
470*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
471*333d2b36SAndroid Build Coastguard Worker			static_libs: ["myotherjar"],
472*333d2b36SAndroid Build Coastguard Worker			libs: ["mysharedjar"],
473*333d2b36SAndroid Build Coastguard Worker			// TODO: remove //apex_available:platform
474*333d2b36SAndroid Build Coastguard Worker			apex_available: [
475*333d2b36SAndroid Build Coastguard Worker				"//apex_available:platform",
476*333d2b36SAndroid Build Coastguard Worker				"myapex",
477*333d2b36SAndroid Build Coastguard Worker			],
478*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
479*333d2b36SAndroid Build Coastguard Worker		}
480*333d2b36SAndroid Build Coastguard Worker
481*333d2b36SAndroid Build Coastguard Worker		dex_import {
482*333d2b36SAndroid Build Coastguard Worker			name: "myjar_dex",
483*333d2b36SAndroid Build Coastguard Worker			jars: ["prebuilt.jar"],
484*333d2b36SAndroid Build Coastguard Worker			apex_available: [
485*333d2b36SAndroid Build Coastguard Worker				"//apex_available:platform",
486*333d2b36SAndroid Build Coastguard Worker				"myapex",
487*333d2b36SAndroid Build Coastguard Worker			],
488*333d2b36SAndroid Build Coastguard Worker		}
489*333d2b36SAndroid Build Coastguard Worker
490*333d2b36SAndroid Build Coastguard Worker		java_library {
491*333d2b36SAndroid Build Coastguard Worker			name: "myotherjar",
492*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
493*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
494*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
495*333d2b36SAndroid Build Coastguard Worker			// TODO: remove //apex_available:platform
496*333d2b36SAndroid Build Coastguard Worker			apex_available: [
497*333d2b36SAndroid Build Coastguard Worker				"//apex_available:platform",
498*333d2b36SAndroid Build Coastguard Worker				"myapex",
499*333d2b36SAndroid Build Coastguard Worker			],
500*333d2b36SAndroid Build Coastguard Worker		}
501*333d2b36SAndroid Build Coastguard Worker
502*333d2b36SAndroid Build Coastguard Worker		java_library {
503*333d2b36SAndroid Build Coastguard Worker			name: "mysharedjar",
504*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
505*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
506*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
507*333d2b36SAndroid Build Coastguard Worker		}
508*333d2b36SAndroid Build Coastguard Worker	`)
509*333d2b36SAndroid Build Coastguard Worker
510*333d2b36SAndroid Build Coastguard Worker	apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
511*333d2b36SAndroid Build Coastguard Worker
512*333d2b36SAndroid Build Coastguard Worker	// Make sure that Android.mk is created
513*333d2b36SAndroid Build Coastguard Worker	ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
514*333d2b36SAndroid Build Coastguard Worker	data := android.AndroidMkDataForTest(t, ctx, ab)
515*333d2b36SAndroid Build Coastguard Worker	var builder strings.Builder
516*333d2b36SAndroid Build Coastguard Worker	data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
517*333d2b36SAndroid Build Coastguard Worker
518*333d2b36SAndroid Build Coastguard Worker	androidMk := builder.String()
519*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
520*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
521*333d2b36SAndroid Build Coastguard Worker
522*333d2b36SAndroid Build Coastguard Worker	optFlags := apexRule.Args["opt_flags"]
523*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
524*333d2b36SAndroid Build Coastguard Worker	// Ensure that the NOTICE output is being packaged as an asset.
525*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
526*333d2b36SAndroid Build Coastguard Worker
527*333d2b36SAndroid Build Coastguard Worker	copyCmds := apexRule.Args["copy_commands"]
528*333d2b36SAndroid Build Coastguard Worker
529*333d2b36SAndroid Build Coastguard Worker	// Ensure that main rule creates an output
530*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
531*333d2b36SAndroid Build Coastguard Worker
532*333d2b36SAndroid Build Coastguard Worker	// Ensure that apex variant is created for the direct dep
533*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
534*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
535*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
536*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
537*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
538*333d2b36SAndroid Build Coastguard Worker
539*333d2b36SAndroid Build Coastguard Worker	// Ensure that apex variant is created for the indirect dep
540*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
541*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
542*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
543*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
544*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.transitive.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
545*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
546*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
547*333d2b36SAndroid Build Coastguard Worker
548*333d2b36SAndroid Build Coastguard Worker	// Ensure that both direct and indirect deps are copied into apex
549*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
550*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
551*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
552*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
553*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
554*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/libfoo.transitive.dylib.rust.dylib.so")
555*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
556*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
557*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
558*333d2b36SAndroid Build Coastguard Worker	// .. but not for java libs
559*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
560*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
561*333d2b36SAndroid Build Coastguard Worker
562*333d2b36SAndroid Build Coastguard Worker	// Ensure that the platform variant ends with _shared or _common
563*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
564*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
565*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
566*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
567*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
568*333d2b36SAndroid Build Coastguard Worker
569*333d2b36SAndroid Build Coastguard Worker	// Ensure that dynamic dependency to java libs are not included
570*333d2b36SAndroid Build Coastguard Worker	ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
571*333d2b36SAndroid Build Coastguard Worker
572*333d2b36SAndroid Build Coastguard Worker	// Ensure that all symlinks are present.
573*333d2b36SAndroid Build Coastguard Worker	found_foo_link_64 := false
574*333d2b36SAndroid Build Coastguard Worker	found_foo := false
575*333d2b36SAndroid Build Coastguard Worker	for _, cmd := range strings.Split(copyCmds, " && ") {
576*333d2b36SAndroid Build Coastguard Worker		if strings.HasPrefix(cmd, "ln -sfn foo64") {
577*333d2b36SAndroid Build Coastguard Worker			if strings.HasSuffix(cmd, "bin/foo") {
578*333d2b36SAndroid Build Coastguard Worker				found_foo = true
579*333d2b36SAndroid Build Coastguard Worker			} else if strings.HasSuffix(cmd, "bin/foo_link_64") {
580*333d2b36SAndroid Build Coastguard Worker				found_foo_link_64 = true
581*333d2b36SAndroid Build Coastguard Worker			}
582*333d2b36SAndroid Build Coastguard Worker		}
583*333d2b36SAndroid Build Coastguard Worker	}
584*333d2b36SAndroid Build Coastguard Worker	good := found_foo && found_foo_link_64
585*333d2b36SAndroid Build Coastguard Worker	if !good {
586*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
587*333d2b36SAndroid Build Coastguard Worker	}
588*333d2b36SAndroid Build Coastguard Worker
589*333d2b36SAndroid Build Coastguard Worker	fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
590*333d2b36SAndroid Build Coastguard Worker		ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
591*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, fullDepsInfo, "  myjar(minSdkVersion:(no version)) <- myapex")
592*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, fullDepsInfo, "  mylib2(minSdkVersion:(no version)) <- mylib")
593*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, fullDepsInfo, "  myotherjar(minSdkVersion:(no version)) <- myjar")
594*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, fullDepsInfo, "  mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
595*333d2b36SAndroid Build Coastguard Worker
596*333d2b36SAndroid Build Coastguard Worker	flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
597*333d2b36SAndroid Build Coastguard Worker		ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
598*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
599*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
600*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
601*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
602*333d2b36SAndroid Build Coastguard Worker}
603*333d2b36SAndroid Build Coastguard Worker
604*333d2b36SAndroid Build Coastguard Workerfunc TestDefaults(t *testing.T) {
605*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
606*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
607*333d2b36SAndroid Build Coastguard Worker		apex_defaults {
608*333d2b36SAndroid Build Coastguard Worker			name: "myapex-defaults",
609*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
610*333d2b36SAndroid Build Coastguard Worker			prebuilts: ["myetc"],
611*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib"],
612*333d2b36SAndroid Build Coastguard Worker			java_libs: ["myjar"],
613*333d2b36SAndroid Build Coastguard Worker			apps: ["AppFoo"],
614*333d2b36SAndroid Build Coastguard Worker			rros: ["rro"],
615*333d2b36SAndroid Build Coastguard Worker			bpfs: ["bpf", "netdTest"],
616*333d2b36SAndroid Build Coastguard Worker			updatable: false,
617*333d2b36SAndroid Build Coastguard Worker		}
618*333d2b36SAndroid Build Coastguard Worker
619*333d2b36SAndroid Build Coastguard Worker		prebuilt_etc {
620*333d2b36SAndroid Build Coastguard Worker			name: "myetc",
621*333d2b36SAndroid Build Coastguard Worker			src: "myprebuilt",
622*333d2b36SAndroid Build Coastguard Worker		}
623*333d2b36SAndroid Build Coastguard Worker
624*333d2b36SAndroid Build Coastguard Worker		apex {
625*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
626*333d2b36SAndroid Build Coastguard Worker			defaults: ["myapex-defaults"],
627*333d2b36SAndroid Build Coastguard Worker		}
628*333d2b36SAndroid Build Coastguard Worker
629*333d2b36SAndroid Build Coastguard Worker		apex_key {
630*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
631*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
632*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
633*333d2b36SAndroid Build Coastguard Worker		}
634*333d2b36SAndroid Build Coastguard Worker
635*333d2b36SAndroid Build Coastguard Worker		cc_library {
636*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
637*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
638*333d2b36SAndroid Build Coastguard Worker			stl: "none",
639*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
640*333d2b36SAndroid Build Coastguard Worker		}
641*333d2b36SAndroid Build Coastguard Worker
642*333d2b36SAndroid Build Coastguard Worker		java_library {
643*333d2b36SAndroid Build Coastguard Worker			name: "myjar",
644*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
645*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
646*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
647*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
648*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
649*333d2b36SAndroid Build Coastguard Worker		}
650*333d2b36SAndroid Build Coastguard Worker
651*333d2b36SAndroid Build Coastguard Worker		android_app {
652*333d2b36SAndroid Build Coastguard Worker			name: "AppFoo",
653*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
654*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
655*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
656*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
657*333d2b36SAndroid Build Coastguard Worker		}
658*333d2b36SAndroid Build Coastguard Worker
659*333d2b36SAndroid Build Coastguard Worker		runtime_resource_overlay {
660*333d2b36SAndroid Build Coastguard Worker			name: "rro",
661*333d2b36SAndroid Build Coastguard Worker			theme: "blue",
662*333d2b36SAndroid Build Coastguard Worker		}
663*333d2b36SAndroid Build Coastguard Worker
664*333d2b36SAndroid Build Coastguard Worker		bpf {
665*333d2b36SAndroid Build Coastguard Worker			name: "bpf",
666*333d2b36SAndroid Build Coastguard Worker			srcs: ["bpf.c", "bpf2.c"],
667*333d2b36SAndroid Build Coastguard Worker		}
668*333d2b36SAndroid Build Coastguard Worker
669*333d2b36SAndroid Build Coastguard Worker		bpf {
670*333d2b36SAndroid Build Coastguard Worker			name: "netdTest",
671*333d2b36SAndroid Build Coastguard Worker			srcs: ["netdTest.c"],
672*333d2b36SAndroid Build Coastguard Worker			sub_dir: "netd",
673*333d2b36SAndroid Build Coastguard Worker		}
674*333d2b36SAndroid Build Coastguard Worker
675*333d2b36SAndroid Build Coastguard Worker	`)
676*333d2b36SAndroid Build Coastguard Worker	ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
677*333d2b36SAndroid Build Coastguard Worker		"etc/myetc",
678*333d2b36SAndroid Build Coastguard Worker		"javalib/myjar.jar",
679*333d2b36SAndroid Build Coastguard Worker		"lib64/mylib.so",
680*333d2b36SAndroid Build Coastguard Worker		"app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
681*333d2b36SAndroid Build Coastguard Worker		"overlay/blue/rro.apk",
682*333d2b36SAndroid Build Coastguard Worker		"etc/bpf/bpf.o",
683*333d2b36SAndroid Build Coastguard Worker		"etc/bpf/bpf2.o",
684*333d2b36SAndroid Build Coastguard Worker		"etc/bpf/netd/netdTest.o",
685*333d2b36SAndroid Build Coastguard Worker	})
686*333d2b36SAndroid Build Coastguard Worker}
687*333d2b36SAndroid Build Coastguard Worker
688*333d2b36SAndroid Build Coastguard Workerfunc TestApexManifest(t *testing.T) {
689*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
690*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
691*333d2b36SAndroid Build Coastguard Worker		apex {
692*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
693*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
694*333d2b36SAndroid Build Coastguard Worker			updatable: false,
695*333d2b36SAndroid Build Coastguard Worker		}
696*333d2b36SAndroid Build Coastguard Worker
697*333d2b36SAndroid Build Coastguard Worker		apex_key {
698*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
699*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
700*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
701*333d2b36SAndroid Build Coastguard Worker		}
702*333d2b36SAndroid Build Coastguard Worker	`)
703*333d2b36SAndroid Build Coastguard Worker
704*333d2b36SAndroid Build Coastguard Worker	module := ctx.ModuleForTests("myapex", "android_common_myapex")
705*333d2b36SAndroid Build Coastguard Worker	args := module.Rule("apexRule").Args
706*333d2b36SAndroid Build Coastguard Worker	if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
707*333d2b36SAndroid Build Coastguard Worker		t.Error("manifest should be apex_manifest.pb, but " + manifest)
708*333d2b36SAndroid Build Coastguard Worker	}
709*333d2b36SAndroid Build Coastguard Worker}
710*333d2b36SAndroid Build Coastguard Worker
711*333d2b36SAndroid Build Coastguard Workerfunc TestApexManifestMinSdkVersion(t *testing.T) {
712*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
713*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
714*333d2b36SAndroid Build Coastguard Worker		apex_defaults {
715*333d2b36SAndroid Build Coastguard Worker			name: "my_defaults",
716*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
717*333d2b36SAndroid Build Coastguard Worker			product_specific: true,
718*333d2b36SAndroid Build Coastguard Worker			file_contexts: ":my-file-contexts",
719*333d2b36SAndroid Build Coastguard Worker			updatable: false,
720*333d2b36SAndroid Build Coastguard Worker		}
721*333d2b36SAndroid Build Coastguard Worker		apex {
722*333d2b36SAndroid Build Coastguard Worker			name: "myapex_30",
723*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "30",
724*333d2b36SAndroid Build Coastguard Worker			defaults: ["my_defaults"],
725*333d2b36SAndroid Build Coastguard Worker		}
726*333d2b36SAndroid Build Coastguard Worker
727*333d2b36SAndroid Build Coastguard Worker		apex {
728*333d2b36SAndroid Build Coastguard Worker			name: "myapex_current",
729*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "current",
730*333d2b36SAndroid Build Coastguard Worker			defaults: ["my_defaults"],
731*333d2b36SAndroid Build Coastguard Worker		}
732*333d2b36SAndroid Build Coastguard Worker
733*333d2b36SAndroid Build Coastguard Worker		apex {
734*333d2b36SAndroid Build Coastguard Worker			name: "myapex_none",
735*333d2b36SAndroid Build Coastguard Worker			defaults: ["my_defaults"],
736*333d2b36SAndroid Build Coastguard Worker		}
737*333d2b36SAndroid Build Coastguard Worker
738*333d2b36SAndroid Build Coastguard Worker		apex_key {
739*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
740*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
741*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
742*333d2b36SAndroid Build Coastguard Worker		}
743*333d2b36SAndroid Build Coastguard Worker
744*333d2b36SAndroid Build Coastguard Worker		filegroup {
745*333d2b36SAndroid Build Coastguard Worker			name: "my-file-contexts",
746*333d2b36SAndroid Build Coastguard Worker			srcs: ["product_specific_file_contexts"],
747*333d2b36SAndroid Build Coastguard Worker		}
748*333d2b36SAndroid Build Coastguard Worker	`, withFiles(map[string][]byte{
749*333d2b36SAndroid Build Coastguard Worker		"product_specific_file_contexts": nil,
750*333d2b36SAndroid Build Coastguard Worker	}), android.FixtureModifyProductVariables(
751*333d2b36SAndroid Build Coastguard Worker		func(variables android.FixtureProductVariables) {
752*333d2b36SAndroid Build Coastguard Worker			variables.Unbundled_build = proptools.BoolPtr(true)
753*333d2b36SAndroid Build Coastguard Worker			variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
754*333d2b36SAndroid Build Coastguard Worker		}), android.FixtureMergeEnv(map[string]string{
755*333d2b36SAndroid Build Coastguard Worker		"UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
756*333d2b36SAndroid Build Coastguard Worker	}))
757*333d2b36SAndroid Build Coastguard Worker
758*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
759*333d2b36SAndroid Build Coastguard Worker		module        string
760*333d2b36SAndroid Build Coastguard Worker		minSdkVersion string
761*333d2b36SAndroid Build Coastguard Worker	}{
762*333d2b36SAndroid Build Coastguard Worker		{
763*333d2b36SAndroid Build Coastguard Worker			module:        "myapex_30",
764*333d2b36SAndroid Build Coastguard Worker			minSdkVersion: "30",
765*333d2b36SAndroid Build Coastguard Worker		},
766*333d2b36SAndroid Build Coastguard Worker		{
767*333d2b36SAndroid Build Coastguard Worker			module:        "myapex_current",
768*333d2b36SAndroid Build Coastguard Worker			minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
769*333d2b36SAndroid Build Coastguard Worker		},
770*333d2b36SAndroid Build Coastguard Worker		{
771*333d2b36SAndroid Build Coastguard Worker			module:        "myapex_none",
772*333d2b36SAndroid Build Coastguard Worker			minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
773*333d2b36SAndroid Build Coastguard Worker		},
774*333d2b36SAndroid Build Coastguard Worker	}
775*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testCases {
776*333d2b36SAndroid Build Coastguard Worker		module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
777*333d2b36SAndroid Build Coastguard Worker		args := module.Rule("apexRule").Args
778*333d2b36SAndroid Build Coastguard Worker		optFlags := args["opt_flags"]
779*333d2b36SAndroid Build Coastguard Worker		if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
780*333d2b36SAndroid Build Coastguard Worker			t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
781*333d2b36SAndroid Build Coastguard Worker		}
782*333d2b36SAndroid Build Coastguard Worker	}
783*333d2b36SAndroid Build Coastguard Worker}
784*333d2b36SAndroid Build Coastguard Worker
785*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithDessertSha(t *testing.T) {
786*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
787*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
788*333d2b36SAndroid Build Coastguard Worker		apex_defaults {
789*333d2b36SAndroid Build Coastguard Worker			name: "my_defaults",
790*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
791*333d2b36SAndroid Build Coastguard Worker			product_specific: true,
792*333d2b36SAndroid Build Coastguard Worker			file_contexts: ":my-file-contexts",
793*333d2b36SAndroid Build Coastguard Worker			updatable: false,
794*333d2b36SAndroid Build Coastguard Worker		}
795*333d2b36SAndroid Build Coastguard Worker		apex {
796*333d2b36SAndroid Build Coastguard Worker			name: "myapex_30",
797*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "30",
798*333d2b36SAndroid Build Coastguard Worker			defaults: ["my_defaults"],
799*333d2b36SAndroid Build Coastguard Worker		}
800*333d2b36SAndroid Build Coastguard Worker
801*333d2b36SAndroid Build Coastguard Worker		apex {
802*333d2b36SAndroid Build Coastguard Worker			name: "myapex_current",
803*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "current",
804*333d2b36SAndroid Build Coastguard Worker			defaults: ["my_defaults"],
805*333d2b36SAndroid Build Coastguard Worker		}
806*333d2b36SAndroid Build Coastguard Worker
807*333d2b36SAndroid Build Coastguard Worker		apex {
808*333d2b36SAndroid Build Coastguard Worker			name: "myapex_none",
809*333d2b36SAndroid Build Coastguard Worker			defaults: ["my_defaults"],
810*333d2b36SAndroid Build Coastguard Worker		}
811*333d2b36SAndroid Build Coastguard Worker
812*333d2b36SAndroid Build Coastguard Worker		apex_key {
813*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
814*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
815*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
816*333d2b36SAndroid Build Coastguard Worker		}
817*333d2b36SAndroid Build Coastguard Worker
818*333d2b36SAndroid Build Coastguard Worker		filegroup {
819*333d2b36SAndroid Build Coastguard Worker			name: "my-file-contexts",
820*333d2b36SAndroid Build Coastguard Worker			srcs: ["product_specific_file_contexts"],
821*333d2b36SAndroid Build Coastguard Worker		}
822*333d2b36SAndroid Build Coastguard Worker	`, withFiles(map[string][]byte{
823*333d2b36SAndroid Build Coastguard Worker		"product_specific_file_contexts": nil,
824*333d2b36SAndroid Build Coastguard Worker	}), android.FixtureModifyProductVariables(
825*333d2b36SAndroid Build Coastguard Worker		func(variables android.FixtureProductVariables) {
826*333d2b36SAndroid Build Coastguard Worker			variables.Unbundled_build = proptools.BoolPtr(true)
827*333d2b36SAndroid Build Coastguard Worker			variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
828*333d2b36SAndroid Build Coastguard Worker		}), android.FixtureMergeEnv(map[string]string{
829*333d2b36SAndroid Build Coastguard Worker		"UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
830*333d2b36SAndroid Build Coastguard Worker	}))
831*333d2b36SAndroid Build Coastguard Worker
832*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
833*333d2b36SAndroid Build Coastguard Worker		module        string
834*333d2b36SAndroid Build Coastguard Worker		minSdkVersion string
835*333d2b36SAndroid Build Coastguard Worker	}{
836*333d2b36SAndroid Build Coastguard Worker		{
837*333d2b36SAndroid Build Coastguard Worker			module:        "myapex_30",
838*333d2b36SAndroid Build Coastguard Worker			minSdkVersion: "30",
839*333d2b36SAndroid Build Coastguard Worker		},
840*333d2b36SAndroid Build Coastguard Worker		{
841*333d2b36SAndroid Build Coastguard Worker			module:        "myapex_current",
842*333d2b36SAndroid Build Coastguard Worker			minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
843*333d2b36SAndroid Build Coastguard Worker		},
844*333d2b36SAndroid Build Coastguard Worker		{
845*333d2b36SAndroid Build Coastguard Worker			module:        "myapex_none",
846*333d2b36SAndroid Build Coastguard Worker			minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
847*333d2b36SAndroid Build Coastguard Worker		},
848*333d2b36SAndroid Build Coastguard Worker	}
849*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testCases {
850*333d2b36SAndroid Build Coastguard Worker		module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
851*333d2b36SAndroid Build Coastguard Worker		args := module.Rule("apexRule").Args
852*333d2b36SAndroid Build Coastguard Worker		optFlags := args["opt_flags"]
853*333d2b36SAndroid Build Coastguard Worker		if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
854*333d2b36SAndroid Build Coastguard Worker			t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
855*333d2b36SAndroid Build Coastguard Worker		}
856*333d2b36SAndroid Build Coastguard Worker	}
857*333d2b36SAndroid Build Coastguard Worker}
858*333d2b36SAndroid Build Coastguard Worker
859*333d2b36SAndroid Build Coastguard Workerfunc TestFileContexts(t *testing.T) {
860*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
861*333d2b36SAndroid Build Coastguard Worker	for _, vendor := range []bool{true, false} {
862*333d2b36SAndroid Build Coastguard Worker		prop := ""
863*333d2b36SAndroid Build Coastguard Worker		if vendor {
864*333d2b36SAndroid Build Coastguard Worker			prop = "vendor: true,\n"
865*333d2b36SAndroid Build Coastguard Worker		}
866*333d2b36SAndroid Build Coastguard Worker		ctx := testApex(t, `
867*333d2b36SAndroid Build Coastguard Worker			apex {
868*333d2b36SAndroid Build Coastguard Worker				name: "myapex",
869*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
870*333d2b36SAndroid Build Coastguard Worker				updatable: false,
871*333d2b36SAndroid Build Coastguard Worker				`+prop+`
872*333d2b36SAndroid Build Coastguard Worker			}
873*333d2b36SAndroid Build Coastguard Worker
874*333d2b36SAndroid Build Coastguard Worker			apex_key {
875*333d2b36SAndroid Build Coastguard Worker				name: "myapex.key",
876*333d2b36SAndroid Build Coastguard Worker				public_key: "testkey.avbpubkey",
877*333d2b36SAndroid Build Coastguard Worker				private_key: "testkey.pem",
878*333d2b36SAndroid Build Coastguard Worker			}
879*333d2b36SAndroid Build Coastguard Worker		`)
880*333d2b36SAndroid Build Coastguard Worker
881*333d2b36SAndroid Build Coastguard Worker		rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
882*333d2b36SAndroid Build Coastguard Worker		if vendor {
883*333d2b36SAndroid Build Coastguard Worker			android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
884*333d2b36SAndroid Build Coastguard Worker				rule.RuleParams.Command,
885*333d2b36SAndroid Build Coastguard Worker				"apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
886*333d2b36SAndroid Build Coastguard Worker		} else {
887*333d2b36SAndroid Build Coastguard Worker			android.AssertStringDoesContain(t, "should force-label as system_file",
888*333d2b36SAndroid Build Coastguard Worker				rule.RuleParams.Command,
889*333d2b36SAndroid Build Coastguard Worker				"apex_manifest\\\\.pb u:object_r:system_file:s0")
890*333d2b36SAndroid Build Coastguard Worker		}
891*333d2b36SAndroid Build Coastguard Worker	}
892*333d2b36SAndroid Build Coastguard Worker}
893*333d2b36SAndroid Build Coastguard Worker
894*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithStubs(t *testing.T) {
895*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
896*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
897*333d2b36SAndroid Build Coastguard Worker		apex {
898*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
899*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
900*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib", "mylib3"],
901*333d2b36SAndroid Build Coastguard Worker			binaries: ["foo.rust"],
902*333d2b36SAndroid Build Coastguard Worker			updatable: false,
903*333d2b36SAndroid Build Coastguard Worker		}
904*333d2b36SAndroid Build Coastguard Worker
905*333d2b36SAndroid Build Coastguard Worker		apex_key {
906*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
907*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
908*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
909*333d2b36SAndroid Build Coastguard Worker		}
910*333d2b36SAndroid Build Coastguard Worker
911*333d2b36SAndroid Build Coastguard Worker		cc_library {
912*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
913*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
914*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["mylib2", "mylib3#impl", "my_prebuilt_platform_lib", "my_prebuilt_platform_stub_only_lib"],
915*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
916*333d2b36SAndroid Build Coastguard Worker			stl: "none",
917*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
918*333d2b36SAndroid Build Coastguard Worker		}
919*333d2b36SAndroid Build Coastguard Worker
920*333d2b36SAndroid Build Coastguard Worker		cc_library {
921*333d2b36SAndroid Build Coastguard Worker			name: "mylib2",
922*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
923*333d2b36SAndroid Build Coastguard Worker			cflags: ["-include mylib.h"],
924*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
925*333d2b36SAndroid Build Coastguard Worker			stl: "none",
926*333d2b36SAndroid Build Coastguard Worker			stubs: {
927*333d2b36SAndroid Build Coastguard Worker				symbol_file: "mylib2.map.txt",
928*333d2b36SAndroid Build Coastguard Worker				versions: ["1", "2", "3"],
929*333d2b36SAndroid Build Coastguard Worker			},
930*333d2b36SAndroid Build Coastguard Worker		}
931*333d2b36SAndroid Build Coastguard Worker
932*333d2b36SAndroid Build Coastguard Worker		cc_library {
933*333d2b36SAndroid Build Coastguard Worker			name: "mylib3",
934*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
935*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["mylib4"],
936*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
937*333d2b36SAndroid Build Coastguard Worker			stl: "none",
938*333d2b36SAndroid Build Coastguard Worker			stubs: {
939*333d2b36SAndroid Build Coastguard Worker				symbol_file: "mylib3.map.txt",
940*333d2b36SAndroid Build Coastguard Worker				versions: ["10", "11", "12"],
941*333d2b36SAndroid Build Coastguard Worker			},
942*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
943*333d2b36SAndroid Build Coastguard Worker		}
944*333d2b36SAndroid Build Coastguard Worker
945*333d2b36SAndroid Build Coastguard Worker		cc_library {
946*333d2b36SAndroid Build Coastguard Worker			name: "mylib4",
947*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
948*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
949*333d2b36SAndroid Build Coastguard Worker			stl: "none",
950*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
951*333d2b36SAndroid Build Coastguard Worker		}
952*333d2b36SAndroid Build Coastguard Worker
953*333d2b36SAndroid Build Coastguard Worker		cc_prebuilt_library_shared {
954*333d2b36SAndroid Build Coastguard Worker			name: "my_prebuilt_platform_lib",
955*333d2b36SAndroid Build Coastguard Worker			stubs: {
956*333d2b36SAndroid Build Coastguard Worker				symbol_file: "my_prebuilt_platform_lib.map.txt",
957*333d2b36SAndroid Build Coastguard Worker				versions: ["1", "2", "3"],
958*333d2b36SAndroid Build Coastguard Worker			},
959*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.so"],
960*333d2b36SAndroid Build Coastguard Worker		}
961*333d2b36SAndroid Build Coastguard Worker
962*333d2b36SAndroid Build Coastguard Worker		// Similar to my_prebuilt_platform_lib, but this library only provides stubs, i.e. srcs is empty
963*333d2b36SAndroid Build Coastguard Worker		cc_prebuilt_library_shared {
964*333d2b36SAndroid Build Coastguard Worker			name: "my_prebuilt_platform_stub_only_lib",
965*333d2b36SAndroid Build Coastguard Worker			stubs: {
966*333d2b36SAndroid Build Coastguard Worker				symbol_file: "my_prebuilt_platform_stub_only_lib.map.txt",
967*333d2b36SAndroid Build Coastguard Worker				versions: ["1", "2", "3"],
968*333d2b36SAndroid Build Coastguard Worker			}
969*333d2b36SAndroid Build Coastguard Worker		}
970*333d2b36SAndroid Build Coastguard Worker
971*333d2b36SAndroid Build Coastguard Worker		rust_binary {
972*333d2b36SAndroid Build Coastguard Worker			name: "foo.rust",
973*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
974*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libfoo.shared_from_rust"],
975*333d2b36SAndroid Build Coastguard Worker			prefer_rlib: true,
976*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
977*333d2b36SAndroid Build Coastguard Worker		}
978*333d2b36SAndroid Build Coastguard Worker
979*333d2b36SAndroid Build Coastguard Worker		cc_library_shared {
980*333d2b36SAndroid Build Coastguard Worker			name: "libfoo.shared_from_rust",
981*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
982*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
983*333d2b36SAndroid Build Coastguard Worker			stl: "none",
984*333d2b36SAndroid Build Coastguard Worker			stubs: {
985*333d2b36SAndroid Build Coastguard Worker				versions: ["10", "11", "12"],
986*333d2b36SAndroid Build Coastguard Worker			},
987*333d2b36SAndroid Build Coastguard Worker		}
988*333d2b36SAndroid Build Coastguard Worker
989*333d2b36SAndroid Build Coastguard Worker	`)
990*333d2b36SAndroid Build Coastguard Worker
991*333d2b36SAndroid Build Coastguard Worker	apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
992*333d2b36SAndroid Build Coastguard Worker	copyCmds := apexRule.Args["copy_commands"]
993*333d2b36SAndroid Build Coastguard Worker
994*333d2b36SAndroid Build Coastguard Worker	// Ensure that direct non-stubs dep is always included
995*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
996*333d2b36SAndroid Build Coastguard Worker
997*333d2b36SAndroid Build Coastguard Worker	// Ensure that indirect stubs dep is not included
998*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
999*333d2b36SAndroid Build Coastguard Worker
1000*333d2b36SAndroid Build Coastguard Worker	// Ensure that direct stubs dep is included
1001*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1002*333d2b36SAndroid Build Coastguard Worker
1003*333d2b36SAndroid Build Coastguard Worker	mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1004*333d2b36SAndroid Build Coastguard Worker
1005*333d2b36SAndroid Build Coastguard Worker	// Ensure that mylib is linking with the latest version of stubs for mylib2
1006*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1007*333d2b36SAndroid Build Coastguard Worker	// ... and not linking to the non-stub (impl) variant of mylib2
1008*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1009*333d2b36SAndroid Build Coastguard Worker
1010*333d2b36SAndroid Build Coastguard Worker	// Ensure that mylib is linking with the non-stub (impl) of mylib3 (because the dependency is added with mylib3#impl)
1011*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
1012*333d2b36SAndroid Build Coastguard Worker	// .. and not linking to the stubs variant of mylib3
1013*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
1014*333d2b36SAndroid Build Coastguard Worker
1015*333d2b36SAndroid Build Coastguard Worker	// Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
1016*333d2b36SAndroid Build Coastguard Worker	// is replaced by sharing of "cFlags" in cc/builder.go.
1017*333d2b36SAndroid Build Coastguard Worker	// The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1018*333d2b36SAndroid Build Coastguard Worker	// module variable representing "cflags". So it was not detected by ensureNotContains.
1019*333d2b36SAndroid Build Coastguard Worker	// Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1020*333d2b36SAndroid Build Coastguard Worker	// content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1021*333d2b36SAndroid Build Coastguard Worker	// including the original cflags's "-include mylib.h".
1022*333d2b36SAndroid Build Coastguard Worker	//
1023*333d2b36SAndroid Build Coastguard Worker	// Ensure that stubs libs are built without -include flags
1024*333d2b36SAndroid Build Coastguard Worker	// mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1025*333d2b36SAndroid Build Coastguard Worker	// ensureNotContains(t, mylib2Cflags, "-include ")
1026*333d2b36SAndroid Build Coastguard Worker
1027*333d2b36SAndroid Build Coastguard Worker	// Ensure that genstub for platform-provided lib is invoked with --systemapi
1028*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1029*333d2b36SAndroid Build Coastguard Worker	// Ensure that genstub for apex-provided lib is invoked with --apex
1030*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
1031*333d2b36SAndroid Build Coastguard Worker
1032*333d2b36SAndroid Build Coastguard Worker	ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
1033*333d2b36SAndroid Build Coastguard Worker		"lib64/mylib.so",
1034*333d2b36SAndroid Build Coastguard Worker		"lib64/mylib3.so",
1035*333d2b36SAndroid Build Coastguard Worker		"lib64/mylib4.so",
1036*333d2b36SAndroid Build Coastguard Worker		"bin/foo.rust",
1037*333d2b36SAndroid Build Coastguard Worker		"lib64/libc++.so", // by the implicit dependency from foo.rust
1038*333d2b36SAndroid Build Coastguard Worker		"lib64/liblog.so", // by the implicit dependency from foo.rust
1039*333d2b36SAndroid Build Coastguard Worker	})
1040*333d2b36SAndroid Build Coastguard Worker
1041*333d2b36SAndroid Build Coastguard Worker	// Ensure that stub dependency from a rust module is not included
1042*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1043*333d2b36SAndroid Build Coastguard Worker	// The rust module is linked to the stub cc library
1044*333d2b36SAndroid Build Coastguard Worker	rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
1045*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1046*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1047*333d2b36SAndroid Build Coastguard Worker
1048*333d2b36SAndroid Build Coastguard Worker	apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
1049*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
1050*333d2b36SAndroid Build Coastguard Worker
1051*333d2b36SAndroid Build Coastguard Worker	// Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1052*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_lib.so")
1053*333d2b36SAndroid Build Coastguard Worker	// ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1054*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_lib.so")
1055*333d2b36SAndroid Build Coastguard Worker	// Ensure that genstub for platform-provided lib is invoked with --systemapi
1056*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1057*333d2b36SAndroid Build Coastguard Worker
1058*333d2b36SAndroid Build Coastguard Worker	// Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1059*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_stub_only_lib.so")
1060*333d2b36SAndroid Build Coastguard Worker	// ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1061*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_stub_only_lib.so")
1062*333d2b36SAndroid Build Coastguard Worker	// Ensure that genstub for platform-provided lib is invoked with --systemapi
1063*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_stub_only_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1064*333d2b36SAndroid Build Coastguard Worker}
1065*333d2b36SAndroid Build Coastguard Worker
1066*333d2b36SAndroid Build Coastguard Workerfunc TestApexShouldNotEmbedStubVariant(t *testing.T) {
1067*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
1068*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1069*333d2b36SAndroid Build Coastguard Worker		apex {
1070*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
1071*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
1072*333d2b36SAndroid Build Coastguard Worker			vendor: true,
1073*333d2b36SAndroid Build Coastguard Worker			updatable: false,
1074*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1075*333d2b36SAndroid Build Coastguard Worker		}
1076*333d2b36SAndroid Build Coastguard Worker
1077*333d2b36SAndroid Build Coastguard Worker		apex_key {
1078*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
1079*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
1080*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
1081*333d2b36SAndroid Build Coastguard Worker		}
1082*333d2b36SAndroid Build Coastguard Worker
1083*333d2b36SAndroid Build Coastguard Worker		cc_library {
1084*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
1085*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1086*333d2b36SAndroid Build Coastguard Worker			llndk: {
1087*333d2b36SAndroid Build Coastguard Worker				symbol_file: "libbar.map.txt",
1088*333d2b36SAndroid Build Coastguard Worker			}
1089*333d2b36SAndroid Build Coastguard Worker		}
1090*333d2b36SAndroid Build Coastguard Worker	`)
1091*333d2b36SAndroid Build Coastguard Worker}
1092*333d2b36SAndroid Build Coastguard Worker
1093*333d2b36SAndroid Build Coastguard Workerfunc TestApexCanUsePrivateApis(t *testing.T) {
1094*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
1095*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
1096*333d2b36SAndroid Build Coastguard Worker		apex {
1097*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
1098*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
1099*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib"],
1100*333d2b36SAndroid Build Coastguard Worker			binaries: ["foo.rust"],
1101*333d2b36SAndroid Build Coastguard Worker			updatable: false,
1102*333d2b36SAndroid Build Coastguard Worker			platform_apis: true,
1103*333d2b36SAndroid Build Coastguard Worker		}
1104*333d2b36SAndroid Build Coastguard Worker
1105*333d2b36SAndroid Build Coastguard Worker		apex_key {
1106*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
1107*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
1108*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
1109*333d2b36SAndroid Build Coastguard Worker		}
1110*333d2b36SAndroid Build Coastguard Worker
1111*333d2b36SAndroid Build Coastguard Worker		cc_library {
1112*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
1113*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1114*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["mylib2"],
1115*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1116*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1117*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
1118*333d2b36SAndroid Build Coastguard Worker		}
1119*333d2b36SAndroid Build Coastguard Worker
1120*333d2b36SAndroid Build Coastguard Worker		cc_library {
1121*333d2b36SAndroid Build Coastguard Worker			name: "mylib2",
1122*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1123*333d2b36SAndroid Build Coastguard Worker			cflags: ["-include mylib.h"],
1124*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1125*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1126*333d2b36SAndroid Build Coastguard Worker			stubs: {
1127*333d2b36SAndroid Build Coastguard Worker				versions: ["1", "2", "3"],
1128*333d2b36SAndroid Build Coastguard Worker			},
1129*333d2b36SAndroid Build Coastguard Worker		}
1130*333d2b36SAndroid Build Coastguard Worker
1131*333d2b36SAndroid Build Coastguard Worker		rust_binary {
1132*333d2b36SAndroid Build Coastguard Worker			name: "foo.rust",
1133*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
1134*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libfoo.shared_from_rust"],
1135*333d2b36SAndroid Build Coastguard Worker			prefer_rlib: true,
1136*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
1137*333d2b36SAndroid Build Coastguard Worker		}
1138*333d2b36SAndroid Build Coastguard Worker
1139*333d2b36SAndroid Build Coastguard Worker		cc_library_shared {
1140*333d2b36SAndroid Build Coastguard Worker			name: "libfoo.shared_from_rust",
1141*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1142*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1143*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1144*333d2b36SAndroid Build Coastguard Worker			stubs: {
1145*333d2b36SAndroid Build Coastguard Worker				versions: ["10", "11", "12"],
1146*333d2b36SAndroid Build Coastguard Worker			},
1147*333d2b36SAndroid Build Coastguard Worker		}
1148*333d2b36SAndroid Build Coastguard Worker	`)
1149*333d2b36SAndroid Build Coastguard Worker
1150*333d2b36SAndroid Build Coastguard Worker	apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
1151*333d2b36SAndroid Build Coastguard Worker	copyCmds := apexRule.Args["copy_commands"]
1152*333d2b36SAndroid Build Coastguard Worker
1153*333d2b36SAndroid Build Coastguard Worker	// Ensure that indirect stubs dep is not included
1154*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1155*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1156*333d2b36SAndroid Build Coastguard Worker
1157*333d2b36SAndroid Build Coastguard Worker	// Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1158*333d2b36SAndroid Build Coastguard Worker	// of the platform_apis: true)
1159*333d2b36SAndroid Build Coastguard Worker	mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1160*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1161*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1162*333d2b36SAndroid Build Coastguard Worker	rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
1163*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1164*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1165*333d2b36SAndroid Build Coastguard Worker}
1166*333d2b36SAndroid Build Coastguard Worker
1167*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1168*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
1169*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
1170*333d2b36SAndroid Build Coastguard Worker		apex {
1171*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
1172*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
1173*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib", "mylib3"],
1174*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
1175*333d2b36SAndroid Build Coastguard Worker		}
1176*333d2b36SAndroid Build Coastguard Worker
1177*333d2b36SAndroid Build Coastguard Worker		apex_key {
1178*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
1179*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
1180*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
1181*333d2b36SAndroid Build Coastguard Worker		}
1182*333d2b36SAndroid Build Coastguard Worker
1183*333d2b36SAndroid Build Coastguard Worker		cc_library {
1184*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
1185*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1186*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["mylib2", "mylib3#impl"],
1187*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1188*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1189*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
1190*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "28",
1191*333d2b36SAndroid Build Coastguard Worker		}
1192*333d2b36SAndroid Build Coastguard Worker
1193*333d2b36SAndroid Build Coastguard Worker		cc_library {
1194*333d2b36SAndroid Build Coastguard Worker			name: "mylib2",
1195*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1196*333d2b36SAndroid Build Coastguard Worker			cflags: ["-include mylib.h"],
1197*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1198*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1199*333d2b36SAndroid Build Coastguard Worker			stubs: {
1200*333d2b36SAndroid Build Coastguard Worker				symbol_file: "mylib2.map.txt",
1201*333d2b36SAndroid Build Coastguard Worker				versions: ["28", "29", "30", "current"],
1202*333d2b36SAndroid Build Coastguard Worker			},
1203*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "28",
1204*333d2b36SAndroid Build Coastguard Worker		}
1205*333d2b36SAndroid Build Coastguard Worker
1206*333d2b36SAndroid Build Coastguard Worker		cc_library {
1207*333d2b36SAndroid Build Coastguard Worker			name: "mylib3",
1208*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1209*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["mylib4"],
1210*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1211*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1212*333d2b36SAndroid Build Coastguard Worker			stubs: {
1213*333d2b36SAndroid Build Coastguard Worker				symbol_file: "mylib3.map.txt",
1214*333d2b36SAndroid Build Coastguard Worker				versions: ["28", "29", "30", "current"],
1215*333d2b36SAndroid Build Coastguard Worker			},
1216*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
1217*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "28",
1218*333d2b36SAndroid Build Coastguard Worker		}
1219*333d2b36SAndroid Build Coastguard Worker
1220*333d2b36SAndroid Build Coastguard Worker		cc_library {
1221*333d2b36SAndroid Build Coastguard Worker			name: "mylib4",
1222*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1223*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1224*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1225*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
1226*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "28",
1227*333d2b36SAndroid Build Coastguard Worker		}
1228*333d2b36SAndroid Build Coastguard Worker	`)
1229*333d2b36SAndroid Build Coastguard Worker
1230*333d2b36SAndroid Build Coastguard Worker	apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
1231*333d2b36SAndroid Build Coastguard Worker	copyCmds := apexRule.Args["copy_commands"]
1232*333d2b36SAndroid Build Coastguard Worker
1233*333d2b36SAndroid Build Coastguard Worker	// Ensure that direct non-stubs dep is always included
1234*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1235*333d2b36SAndroid Build Coastguard Worker
1236*333d2b36SAndroid Build Coastguard Worker	// Ensure that indirect stubs dep is not included
1237*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1238*333d2b36SAndroid Build Coastguard Worker
1239*333d2b36SAndroid Build Coastguard Worker	// Ensure that direct stubs dep is included
1240*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1241*333d2b36SAndroid Build Coastguard Worker
1242*333d2b36SAndroid Build Coastguard Worker	mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1243*333d2b36SAndroid Build Coastguard Worker
1244*333d2b36SAndroid Build Coastguard Worker	// Ensure that mylib is linking with the latest version of stub for mylib2
1245*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1246*333d2b36SAndroid Build Coastguard Worker	// ... and not linking to the non-stub (impl) variant of mylib2
1247*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1248*333d2b36SAndroid Build Coastguard Worker
1249*333d2b36SAndroid Build Coastguard Worker	// Ensure that mylib is linking with the non-stub (impl) of mylib3 (because the dependency is added with mylib3#impl)
1250*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1251*333d2b36SAndroid Build Coastguard Worker	// .. and not linking to the stubs variant of mylib3
1252*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1253*333d2b36SAndroid Build Coastguard Worker
1254*333d2b36SAndroid Build Coastguard Worker	// Ensure that stubs libs are built without -include flags
1255*333d2b36SAndroid Build Coastguard Worker	mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
1256*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, mylib2Cflags, "-include ")
1257*333d2b36SAndroid Build Coastguard Worker
1258*333d2b36SAndroid Build Coastguard Worker	// Ensure that genstub is invoked with --systemapi
1259*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
1260*333d2b36SAndroid Build Coastguard Worker
1261*333d2b36SAndroid Build Coastguard Worker	ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
1262*333d2b36SAndroid Build Coastguard Worker		"lib64/mylib.so",
1263*333d2b36SAndroid Build Coastguard Worker		"lib64/mylib3.so",
1264*333d2b36SAndroid Build Coastguard Worker		"lib64/mylib4.so",
1265*333d2b36SAndroid Build Coastguard Worker	})
1266*333d2b36SAndroid Build Coastguard Worker}
1267*333d2b36SAndroid Build Coastguard Worker
1268*333d2b36SAndroid Build Coastguard Workerfunc TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1269*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
1270*333d2b36SAndroid Build Coastguard Worker	//   myapex (Z)
1271*333d2b36SAndroid Build Coastguard Worker	//      mylib -----------------.
1272*333d2b36SAndroid Build Coastguard Worker	//                             |
1273*333d2b36SAndroid Build Coastguard Worker	//   otherapex (29)            |
1274*333d2b36SAndroid Build Coastguard Worker	//      libstub's versions: 29 Z current
1275*333d2b36SAndroid Build Coastguard Worker	//                                  |
1276*333d2b36SAndroid Build Coastguard Worker	//   <platform>                     |
1277*333d2b36SAndroid Build Coastguard Worker	//      libplatform ----------------'
1278*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
1279*333d2b36SAndroid Build Coastguard Worker		apex {
1280*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
1281*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
1282*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib"],
1283*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "Z", // non-final
1284*333d2b36SAndroid Build Coastguard Worker		}
1285*333d2b36SAndroid Build Coastguard Worker
1286*333d2b36SAndroid Build Coastguard Worker		cc_library {
1287*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
1288*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1289*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libstub"],
1290*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
1291*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "Z",
1292*333d2b36SAndroid Build Coastguard Worker		}
1293*333d2b36SAndroid Build Coastguard Worker
1294*333d2b36SAndroid Build Coastguard Worker		apex_key {
1295*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
1296*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
1297*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
1298*333d2b36SAndroid Build Coastguard Worker		}
1299*333d2b36SAndroid Build Coastguard Worker
1300*333d2b36SAndroid Build Coastguard Worker		apex {
1301*333d2b36SAndroid Build Coastguard Worker			name: "otherapex",
1302*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
1303*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["libstub"],
1304*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
1305*333d2b36SAndroid Build Coastguard Worker		}
1306*333d2b36SAndroid Build Coastguard Worker
1307*333d2b36SAndroid Build Coastguard Worker		cc_library {
1308*333d2b36SAndroid Build Coastguard Worker			name: "libstub",
1309*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1310*333d2b36SAndroid Build Coastguard Worker			stubs: {
1311*333d2b36SAndroid Build Coastguard Worker				versions: ["29", "Z", "current"],
1312*333d2b36SAndroid Build Coastguard Worker			},
1313*333d2b36SAndroid Build Coastguard Worker			apex_available: ["otherapex"],
1314*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
1315*333d2b36SAndroid Build Coastguard Worker		}
1316*333d2b36SAndroid Build Coastguard Worker
1317*333d2b36SAndroid Build Coastguard Worker		// platform module depending on libstub from otherapex should use the latest stub("current")
1318*333d2b36SAndroid Build Coastguard Worker		cc_library {
1319*333d2b36SAndroid Build Coastguard Worker			name: "libplatform",
1320*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1321*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libstub"],
1322*333d2b36SAndroid Build Coastguard Worker		}
1323*333d2b36SAndroid Build Coastguard Worker	`,
1324*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1325*333d2b36SAndroid Build Coastguard Worker			variables.Platform_sdk_codename = proptools.StringPtr("Z")
1326*333d2b36SAndroid Build Coastguard Worker			variables.Platform_sdk_final = proptools.BoolPtr(false)
1327*333d2b36SAndroid Build Coastguard Worker			variables.Platform_version_active_codenames = []string{"Z"}
1328*333d2b36SAndroid Build Coastguard Worker		}),
1329*333d2b36SAndroid Build Coastguard Worker	)
1330*333d2b36SAndroid Build Coastguard Worker
1331*333d2b36SAndroid Build Coastguard Worker	// Ensure that mylib from myapex is built against the latest stub (current)
1332*333d2b36SAndroid Build Coastguard Worker	mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1333*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
1334*333d2b36SAndroid Build Coastguard Worker	mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1335*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1336*333d2b36SAndroid Build Coastguard Worker
1337*333d2b36SAndroid Build Coastguard Worker	// Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1338*333d2b36SAndroid Build Coastguard Worker	libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1339*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1340*333d2b36SAndroid Build Coastguard Worker	libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1341*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1342*333d2b36SAndroid Build Coastguard Worker}
1343*333d2b36SAndroid Build Coastguard Worker
1344*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithExplicitStubsDependency(t *testing.T) {
1345*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
1346*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
1347*333d2b36SAndroid Build Coastguard Worker		apex {
1348*333d2b36SAndroid Build Coastguard Worker			name: "myapex2",
1349*333d2b36SAndroid Build Coastguard Worker			key: "myapex2.key",
1350*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib"],
1351*333d2b36SAndroid Build Coastguard Worker			updatable: false,
1352*333d2b36SAndroid Build Coastguard Worker		}
1353*333d2b36SAndroid Build Coastguard Worker
1354*333d2b36SAndroid Build Coastguard Worker		apex_key {
1355*333d2b36SAndroid Build Coastguard Worker			name: "myapex2.key",
1356*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
1357*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
1358*333d2b36SAndroid Build Coastguard Worker		}
1359*333d2b36SAndroid Build Coastguard Worker
1360*333d2b36SAndroid Build Coastguard Worker		cc_library {
1361*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
1362*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1363*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libfoo#10"],
1364*333d2b36SAndroid Build Coastguard Worker			static_libs: ["libbaz"],
1365*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1366*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1367*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex2" ],
1368*333d2b36SAndroid Build Coastguard Worker		}
1369*333d2b36SAndroid Build Coastguard Worker
1370*333d2b36SAndroid Build Coastguard Worker		cc_library {
1371*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
1372*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1373*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libbar"],
1374*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1375*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1376*333d2b36SAndroid Build Coastguard Worker			stubs: {
1377*333d2b36SAndroid Build Coastguard Worker				versions: ["10", "20", "30"],
1378*333d2b36SAndroid Build Coastguard Worker			},
1379*333d2b36SAndroid Build Coastguard Worker		}
1380*333d2b36SAndroid Build Coastguard Worker
1381*333d2b36SAndroid Build Coastguard Worker		cc_library {
1382*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
1383*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1384*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1385*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1386*333d2b36SAndroid Build Coastguard Worker		}
1387*333d2b36SAndroid Build Coastguard Worker
1388*333d2b36SAndroid Build Coastguard Worker		cc_library_static {
1389*333d2b36SAndroid Build Coastguard Worker			name: "libbaz",
1390*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1391*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1392*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1393*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex2" ],
1394*333d2b36SAndroid Build Coastguard Worker		}
1395*333d2b36SAndroid Build Coastguard Worker
1396*333d2b36SAndroid Build Coastguard Worker	`)
1397*333d2b36SAndroid Build Coastguard Worker
1398*333d2b36SAndroid Build Coastguard Worker	apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
1399*333d2b36SAndroid Build Coastguard Worker	copyCmds := apexRule.Args["copy_commands"]
1400*333d2b36SAndroid Build Coastguard Worker
1401*333d2b36SAndroid Build Coastguard Worker	// Ensure that direct non-stubs dep is always included
1402*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1403*333d2b36SAndroid Build Coastguard Worker
1404*333d2b36SAndroid Build Coastguard Worker	// Ensure that indirect stubs dep is not included
1405*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1406*333d2b36SAndroid Build Coastguard Worker
1407*333d2b36SAndroid Build Coastguard Worker	// Ensure that dependency of stubs is not included
1408*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1409*333d2b36SAndroid Build Coastguard Worker
1410*333d2b36SAndroid Build Coastguard Worker	mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1411*333d2b36SAndroid Build Coastguard Worker
1412*333d2b36SAndroid Build Coastguard Worker	// Ensure that mylib is linking with version 10 of libfoo
1413*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
1414*333d2b36SAndroid Build Coastguard Worker	// ... and not linking to the non-stub (impl) variant of libfoo
1415*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
1416*333d2b36SAndroid Build Coastguard Worker
1417*333d2b36SAndroid Build Coastguard Worker	libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
1418*333d2b36SAndroid Build Coastguard Worker
1419*333d2b36SAndroid Build Coastguard Worker	// Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1420*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
1421*333d2b36SAndroid Build Coastguard Worker
1422*333d2b36SAndroid Build Coastguard Worker	fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1423*333d2b36SAndroid Build Coastguard Worker		ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
1424*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, fullDepsInfo, "  libfoo(minSdkVersion:(no version)) (external) <- mylib")
1425*333d2b36SAndroid Build Coastguard Worker
1426*333d2b36SAndroid Build Coastguard Worker	flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1427*333d2b36SAndroid Build Coastguard Worker		ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
1428*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
1429*333d2b36SAndroid Build Coastguard Worker}
1430*333d2b36SAndroid Build Coastguard Worker
1431*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithRuntimeLibsDependency(t *testing.T) {
1432*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
1433*333d2b36SAndroid Build Coastguard Worker	/*
1434*333d2b36SAndroid Build Coastguard Worker		myapex
1435*333d2b36SAndroid Build Coastguard Worker		  |
1436*333d2b36SAndroid Build Coastguard Worker		  v   (runtime_libs)
1437*333d2b36SAndroid Build Coastguard Worker		mylib ------+------> libfoo [provides stub]
1438*333d2b36SAndroid Build Coastguard Worker			    |
1439*333d2b36SAndroid Build Coastguard Worker			    `------> libbar
1440*333d2b36SAndroid Build Coastguard Worker	*/
1441*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
1442*333d2b36SAndroid Build Coastguard Worker		apex {
1443*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
1444*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
1445*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib"],
1446*333d2b36SAndroid Build Coastguard Worker			updatable: false,
1447*333d2b36SAndroid Build Coastguard Worker		}
1448*333d2b36SAndroid Build Coastguard Worker
1449*333d2b36SAndroid Build Coastguard Worker		apex_key {
1450*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
1451*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
1452*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
1453*333d2b36SAndroid Build Coastguard Worker		}
1454*333d2b36SAndroid Build Coastguard Worker
1455*333d2b36SAndroid Build Coastguard Worker		cc_library {
1456*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
1457*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1458*333d2b36SAndroid Build Coastguard Worker			static_libs: ["libstatic"],
1459*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libshared"],
1460*333d2b36SAndroid Build Coastguard Worker			runtime_libs: ["libfoo", "libbar"],
1461*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1462*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1463*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
1464*333d2b36SAndroid Build Coastguard Worker		}
1465*333d2b36SAndroid Build Coastguard Worker
1466*333d2b36SAndroid Build Coastguard Worker		cc_library {
1467*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
1468*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1469*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1470*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1471*333d2b36SAndroid Build Coastguard Worker			stubs: {
1472*333d2b36SAndroid Build Coastguard Worker				versions: ["10", "20", "30"],
1473*333d2b36SAndroid Build Coastguard Worker			},
1474*333d2b36SAndroid Build Coastguard Worker		}
1475*333d2b36SAndroid Build Coastguard Worker
1476*333d2b36SAndroid Build Coastguard Worker		cc_library {
1477*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
1478*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1479*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1480*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1481*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
1482*333d2b36SAndroid Build Coastguard Worker		}
1483*333d2b36SAndroid Build Coastguard Worker
1484*333d2b36SAndroid Build Coastguard Worker		cc_library {
1485*333d2b36SAndroid Build Coastguard Worker			name: "libstatic",
1486*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1487*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1488*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1489*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
1490*333d2b36SAndroid Build Coastguard Worker			runtime_libs: ["libstatic_to_runtime"],
1491*333d2b36SAndroid Build Coastguard Worker		}
1492*333d2b36SAndroid Build Coastguard Worker
1493*333d2b36SAndroid Build Coastguard Worker		cc_library {
1494*333d2b36SAndroid Build Coastguard Worker			name: "libshared",
1495*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1496*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1497*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1498*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
1499*333d2b36SAndroid Build Coastguard Worker			runtime_libs: ["libshared_to_runtime"],
1500*333d2b36SAndroid Build Coastguard Worker		}
1501*333d2b36SAndroid Build Coastguard Worker
1502*333d2b36SAndroid Build Coastguard Worker		cc_library {
1503*333d2b36SAndroid Build Coastguard Worker			name: "libstatic_to_runtime",
1504*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1505*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1506*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1507*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
1508*333d2b36SAndroid Build Coastguard Worker		}
1509*333d2b36SAndroid Build Coastguard Worker
1510*333d2b36SAndroid Build Coastguard Worker		cc_library {
1511*333d2b36SAndroid Build Coastguard Worker			name: "libshared_to_runtime",
1512*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1513*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1514*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1515*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
1516*333d2b36SAndroid Build Coastguard Worker		}
1517*333d2b36SAndroid Build Coastguard Worker	`)
1518*333d2b36SAndroid Build Coastguard Worker
1519*333d2b36SAndroid Build Coastguard Worker	apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
1520*333d2b36SAndroid Build Coastguard Worker	copyCmds := apexRule.Args["copy_commands"]
1521*333d2b36SAndroid Build Coastguard Worker
1522*333d2b36SAndroid Build Coastguard Worker	// Ensure that direct non-stubs dep is always included
1523*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1524*333d2b36SAndroid Build Coastguard Worker
1525*333d2b36SAndroid Build Coastguard Worker	// Ensure that indirect stubs dep is not included
1526*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1527*333d2b36SAndroid Build Coastguard Worker
1528*333d2b36SAndroid Build Coastguard Worker	// Ensure that runtime_libs dep in included
1529*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1530*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1531*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1532*333d2b36SAndroid Build Coastguard Worker
1533*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
1534*333d2b36SAndroid Build Coastguard Worker
1535*333d2b36SAndroid Build Coastguard Worker	apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
1536*333d2b36SAndroid Build Coastguard Worker	ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1537*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
1538*333d2b36SAndroid Build Coastguard Worker}
1539*333d2b36SAndroid Build Coastguard Worker
1540*333d2b36SAndroid Build Coastguard Workervar prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1541*333d2b36SAndroid Build Coastguard Worker	cc.PrepareForTestWithCcBuildComponents,
1542*333d2b36SAndroid Build Coastguard Worker	PrepareForTestWithApexBuildComponents,
1543*333d2b36SAndroid Build Coastguard Worker	android.FixtureAddTextFile("bionic/apex/Android.bp", `
1544*333d2b36SAndroid Build Coastguard Worker		apex {
1545*333d2b36SAndroid Build Coastguard Worker			name: "com.android.runtime",
1546*333d2b36SAndroid Build Coastguard Worker			key: "com.android.runtime.key",
1547*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["libc"],
1548*333d2b36SAndroid Build Coastguard Worker			updatable: false,
1549*333d2b36SAndroid Build Coastguard Worker		}
1550*333d2b36SAndroid Build Coastguard Worker
1551*333d2b36SAndroid Build Coastguard Worker		apex_key {
1552*333d2b36SAndroid Build Coastguard Worker			name: "com.android.runtime.key",
1553*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
1554*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
1555*333d2b36SAndroid Build Coastguard Worker		}
1556*333d2b36SAndroid Build Coastguard Worker	`),
1557*333d2b36SAndroid Build Coastguard Worker	android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1558*333d2b36SAndroid Build Coastguard Worker)
1559*333d2b36SAndroid Build Coastguard Worker
1560*333d2b36SAndroid Build Coastguard Workerfunc TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
1561*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
1562*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
1563*333d2b36SAndroid Build Coastguard Worker		cc_library {
1564*333d2b36SAndroid Build Coastguard Worker			name: "libc",
1565*333d2b36SAndroid Build Coastguard Worker			no_libcrt: true,
1566*333d2b36SAndroid Build Coastguard Worker			nocrt: true,
1567*333d2b36SAndroid Build Coastguard Worker			no_crt_pad_segment: true,
1568*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1569*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1570*333d2b36SAndroid Build Coastguard Worker			stubs: { versions: ["1"] },
1571*333d2b36SAndroid Build Coastguard Worker			apex_available: ["com.android.runtime"],
1572*333d2b36SAndroid Build Coastguard Worker
1573*333d2b36SAndroid Build Coastguard Worker			sanitize: {
1574*333d2b36SAndroid Build Coastguard Worker				hwaddress: true,
1575*333d2b36SAndroid Build Coastguard Worker			}
1576*333d2b36SAndroid Build Coastguard Worker		}
1577*333d2b36SAndroid Build Coastguard Worker
1578*333d2b36SAndroid Build Coastguard Worker		cc_prebuilt_library_shared {
1579*333d2b36SAndroid Build Coastguard Worker			name: "libclang_rt.hwasan",
1580*333d2b36SAndroid Build Coastguard Worker			no_libcrt: true,
1581*333d2b36SAndroid Build Coastguard Worker			nocrt: true,
1582*333d2b36SAndroid Build Coastguard Worker			no_crt_pad_segment: true,
1583*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1584*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1585*333d2b36SAndroid Build Coastguard Worker			srcs: [""],
1586*333d2b36SAndroid Build Coastguard Worker			stubs: { versions: ["1"] },
1587*333d2b36SAndroid Build Coastguard Worker			stem: "libclang_rt.hwasan-aarch64-android",
1588*333d2b36SAndroid Build Coastguard Worker
1589*333d2b36SAndroid Build Coastguard Worker			sanitize: {
1590*333d2b36SAndroid Build Coastguard Worker				never: true,
1591*333d2b36SAndroid Build Coastguard Worker			},
1592*333d2b36SAndroid Build Coastguard Worker			apex_available: [
1593*333d2b36SAndroid Build Coastguard Worker				"//apex_available:anyapex",
1594*333d2b36SAndroid Build Coastguard Worker				"//apex_available:platform",
1595*333d2b36SAndroid Build Coastguard Worker			],
1596*333d2b36SAndroid Build Coastguard Worker		}	`)
1597*333d2b36SAndroid Build Coastguard Worker	ctx := result.TestContext
1598*333d2b36SAndroid Build Coastguard Worker
1599*333d2b36SAndroid Build Coastguard Worker	ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
1600*333d2b36SAndroid Build Coastguard Worker		"lib64/bionic/libc.so",
1601*333d2b36SAndroid Build Coastguard Worker		"lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1602*333d2b36SAndroid Build Coastguard Worker	})
1603*333d2b36SAndroid Build Coastguard Worker
1604*333d2b36SAndroid Build Coastguard Worker	hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
1605*333d2b36SAndroid Build Coastguard Worker
1606*333d2b36SAndroid Build Coastguard Worker	installed := hwasan.Description("install libclang_rt.hwasan")
1607*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1608*333d2b36SAndroid Build Coastguard Worker
1609*333d2b36SAndroid Build Coastguard Worker	symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1610*333d2b36SAndroid Build Coastguard Worker	ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1611*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1612*333d2b36SAndroid Build Coastguard Worker}
1613*333d2b36SAndroid Build Coastguard Worker
1614*333d2b36SAndroid Build Coastguard Workerfunc TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1615*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
1616*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
1617*333d2b36SAndroid Build Coastguard Worker		prepareForTestOfRuntimeApexWithHwasan,
1618*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1619*333d2b36SAndroid Build Coastguard Worker			variables.SanitizeDevice = []string{"hwaddress"}
1620*333d2b36SAndroid Build Coastguard Worker		}),
1621*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
1622*333d2b36SAndroid Build Coastguard Worker		cc_library {
1623*333d2b36SAndroid Build Coastguard Worker			name: "libc",
1624*333d2b36SAndroid Build Coastguard Worker			no_libcrt: true,
1625*333d2b36SAndroid Build Coastguard Worker			nocrt: true,
1626*333d2b36SAndroid Build Coastguard Worker			no_crt_pad_segment: true,
1627*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1628*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1629*333d2b36SAndroid Build Coastguard Worker			stubs: { versions: ["1"] },
1630*333d2b36SAndroid Build Coastguard Worker			apex_available: ["com.android.runtime"],
1631*333d2b36SAndroid Build Coastguard Worker		}
1632*333d2b36SAndroid Build Coastguard Worker
1633*333d2b36SAndroid Build Coastguard Worker		cc_prebuilt_library_shared {
1634*333d2b36SAndroid Build Coastguard Worker			name: "libclang_rt.hwasan",
1635*333d2b36SAndroid Build Coastguard Worker			no_libcrt: true,
1636*333d2b36SAndroid Build Coastguard Worker			nocrt: true,
1637*333d2b36SAndroid Build Coastguard Worker			no_crt_pad_segment: true,
1638*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1639*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1640*333d2b36SAndroid Build Coastguard Worker			srcs: [""],
1641*333d2b36SAndroid Build Coastguard Worker			stubs: { versions: ["1"] },
1642*333d2b36SAndroid Build Coastguard Worker			stem: "libclang_rt.hwasan-aarch64-android",
1643*333d2b36SAndroid Build Coastguard Worker
1644*333d2b36SAndroid Build Coastguard Worker			sanitize: {
1645*333d2b36SAndroid Build Coastguard Worker				never: true,
1646*333d2b36SAndroid Build Coastguard Worker			},
1647*333d2b36SAndroid Build Coastguard Worker			apex_available: [
1648*333d2b36SAndroid Build Coastguard Worker				"//apex_available:anyapex",
1649*333d2b36SAndroid Build Coastguard Worker				"//apex_available:platform",
1650*333d2b36SAndroid Build Coastguard Worker			],
1651*333d2b36SAndroid Build Coastguard Worker		}
1652*333d2b36SAndroid Build Coastguard Worker		`)
1653*333d2b36SAndroid Build Coastguard Worker	ctx := result.TestContext
1654*333d2b36SAndroid Build Coastguard Worker
1655*333d2b36SAndroid Build Coastguard Worker	ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
1656*333d2b36SAndroid Build Coastguard Worker		"lib64/bionic/libc.so",
1657*333d2b36SAndroid Build Coastguard Worker		"lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1658*333d2b36SAndroid Build Coastguard Worker	})
1659*333d2b36SAndroid Build Coastguard Worker
1660*333d2b36SAndroid Build Coastguard Worker	hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
1661*333d2b36SAndroid Build Coastguard Worker
1662*333d2b36SAndroid Build Coastguard Worker	installed := hwasan.Description("install libclang_rt.hwasan")
1663*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1664*333d2b36SAndroid Build Coastguard Worker
1665*333d2b36SAndroid Build Coastguard Worker	symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1666*333d2b36SAndroid Build Coastguard Worker	ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1667*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1668*333d2b36SAndroid Build Coastguard Worker}
1669*333d2b36SAndroid Build Coastguard Worker
1670*333d2b36SAndroid Build Coastguard Workerfunc TestApexDependsOnLLNDKTransitively(t *testing.T) {
1671*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
1672*333d2b36SAndroid Build Coastguard Worker	testcases := []struct {
1673*333d2b36SAndroid Build Coastguard Worker		name          string
1674*333d2b36SAndroid Build Coastguard Worker		minSdkVersion string
1675*333d2b36SAndroid Build Coastguard Worker		apexVariant   string
1676*333d2b36SAndroid Build Coastguard Worker		shouldLink    string
1677*333d2b36SAndroid Build Coastguard Worker		shouldNotLink []string
1678*333d2b36SAndroid Build Coastguard Worker	}{
1679*333d2b36SAndroid Build Coastguard Worker		{
1680*333d2b36SAndroid Build Coastguard Worker			name:          "unspecified version links to the latest",
1681*333d2b36SAndroid Build Coastguard Worker			minSdkVersion: "",
1682*333d2b36SAndroid Build Coastguard Worker			apexVariant:   "apex10000",
1683*333d2b36SAndroid Build Coastguard Worker			shouldLink:    "current",
1684*333d2b36SAndroid Build Coastguard Worker			shouldNotLink: []string{"29", "30"},
1685*333d2b36SAndroid Build Coastguard Worker		},
1686*333d2b36SAndroid Build Coastguard Worker		{
1687*333d2b36SAndroid Build Coastguard Worker			name:          "always use the latest",
1688*333d2b36SAndroid Build Coastguard Worker			minSdkVersion: "min_sdk_version: \"29\",",
1689*333d2b36SAndroid Build Coastguard Worker			apexVariant:   "apex29",
1690*333d2b36SAndroid Build Coastguard Worker			shouldLink:    "current",
1691*333d2b36SAndroid Build Coastguard Worker			shouldNotLink: []string{"29", "30"},
1692*333d2b36SAndroid Build Coastguard Worker		},
1693*333d2b36SAndroid Build Coastguard Worker	}
1694*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testcases {
1695*333d2b36SAndroid Build Coastguard Worker		t.Run(tc.name, func(t *testing.T) {
1696*333d2b36SAndroid Build Coastguard Worker			t.Parallel()
1697*333d2b36SAndroid Build Coastguard Worker			ctx := testApex(t, `
1698*333d2b36SAndroid Build Coastguard Worker			apex {
1699*333d2b36SAndroid Build Coastguard Worker				name: "myapex",
1700*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
1701*333d2b36SAndroid Build Coastguard Worker				native_shared_libs: ["mylib"],
1702*333d2b36SAndroid Build Coastguard Worker				updatable: false,
1703*333d2b36SAndroid Build Coastguard Worker				`+tc.minSdkVersion+`
1704*333d2b36SAndroid Build Coastguard Worker			}
1705*333d2b36SAndroid Build Coastguard Worker
1706*333d2b36SAndroid Build Coastguard Worker			apex_key {
1707*333d2b36SAndroid Build Coastguard Worker				name: "myapex.key",
1708*333d2b36SAndroid Build Coastguard Worker				public_key: "testkey.avbpubkey",
1709*333d2b36SAndroid Build Coastguard Worker				private_key: "testkey.pem",
1710*333d2b36SAndroid Build Coastguard Worker			}
1711*333d2b36SAndroid Build Coastguard Worker
1712*333d2b36SAndroid Build Coastguard Worker			cc_library {
1713*333d2b36SAndroid Build Coastguard Worker				name: "mylib",
1714*333d2b36SAndroid Build Coastguard Worker				srcs: ["mylib.cpp"],
1715*333d2b36SAndroid Build Coastguard Worker				vendor_available: true,
1716*333d2b36SAndroid Build Coastguard Worker				shared_libs: ["libbar"],
1717*333d2b36SAndroid Build Coastguard Worker				system_shared_libs: [],
1718*333d2b36SAndroid Build Coastguard Worker				stl: "none",
1719*333d2b36SAndroid Build Coastguard Worker				apex_available: [ "myapex" ],
1720*333d2b36SAndroid Build Coastguard Worker				min_sdk_version: "29",
1721*333d2b36SAndroid Build Coastguard Worker			}
1722*333d2b36SAndroid Build Coastguard Worker
1723*333d2b36SAndroid Build Coastguard Worker			cc_library {
1724*333d2b36SAndroid Build Coastguard Worker				name: "libbar",
1725*333d2b36SAndroid Build Coastguard Worker				srcs: ["mylib.cpp"],
1726*333d2b36SAndroid Build Coastguard Worker				system_shared_libs: [],
1727*333d2b36SAndroid Build Coastguard Worker				stl: "none",
1728*333d2b36SAndroid Build Coastguard Worker				stubs: { versions: ["29","30"] },
1729*333d2b36SAndroid Build Coastguard Worker				llndk: {
1730*333d2b36SAndroid Build Coastguard Worker					symbol_file: "libbar.map.txt",
1731*333d2b36SAndroid Build Coastguard Worker				}
1732*333d2b36SAndroid Build Coastguard Worker			}
1733*333d2b36SAndroid Build Coastguard Worker			`,
1734*333d2b36SAndroid Build Coastguard Worker				withUnbundledBuild,
1735*333d2b36SAndroid Build Coastguard Worker			)
1736*333d2b36SAndroid Build Coastguard Worker
1737*333d2b36SAndroid Build Coastguard Worker			// Ensure that LLNDK dep is not included
1738*333d2b36SAndroid Build Coastguard Worker			ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
1739*333d2b36SAndroid Build Coastguard Worker				"lib64/mylib.so",
1740*333d2b36SAndroid Build Coastguard Worker			})
1741*333d2b36SAndroid Build Coastguard Worker
1742*333d2b36SAndroid Build Coastguard Worker			// Ensure that LLNDK dep is required
1743*333d2b36SAndroid Build Coastguard Worker			apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
1744*333d2b36SAndroid Build Coastguard Worker			ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1745*333d2b36SAndroid Build Coastguard Worker			ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
1746*333d2b36SAndroid Build Coastguard Worker
1747*333d2b36SAndroid Build Coastguard Worker			mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1748*333d2b36SAndroid Build Coastguard Worker			ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1749*333d2b36SAndroid Build Coastguard Worker			for _, ver := range tc.shouldNotLink {
1750*333d2b36SAndroid Build Coastguard Worker				ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
1751*333d2b36SAndroid Build Coastguard Worker			}
1752*333d2b36SAndroid Build Coastguard Worker
1753*333d2b36SAndroid Build Coastguard Worker			mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
1754*333d2b36SAndroid Build Coastguard Worker			ver := tc.shouldLink
1755*333d2b36SAndroid Build Coastguard Worker			if tc.shouldLink == "current" {
1756*333d2b36SAndroid Build Coastguard Worker				ver = strconv.Itoa(android.FutureApiLevelInt)
1757*333d2b36SAndroid Build Coastguard Worker			}
1758*333d2b36SAndroid Build Coastguard Worker			ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
1759*333d2b36SAndroid Build Coastguard Worker		})
1760*333d2b36SAndroid Build Coastguard Worker	}
1761*333d2b36SAndroid Build Coastguard Worker}
1762*333d2b36SAndroid Build Coastguard Worker
1763*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithSystemLibsStubs(t *testing.T) {
1764*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
1765*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
1766*333d2b36SAndroid Build Coastguard Worker		apex {
1767*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
1768*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
1769*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1770*333d2b36SAndroid Build Coastguard Worker			updatable: false,
1771*333d2b36SAndroid Build Coastguard Worker		}
1772*333d2b36SAndroid Build Coastguard Worker
1773*333d2b36SAndroid Build Coastguard Worker		apex_key {
1774*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
1775*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
1776*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
1777*333d2b36SAndroid Build Coastguard Worker		}
1778*333d2b36SAndroid Build Coastguard Worker
1779*333d2b36SAndroid Build Coastguard Worker		cc_library {
1780*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
1781*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1782*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: ["libc"],
1783*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libdl#27", "libm#impl"],
1784*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1785*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
1786*333d2b36SAndroid Build Coastguard Worker		}
1787*333d2b36SAndroid Build Coastguard Worker
1788*333d2b36SAndroid Build Coastguard Worker		cc_library_shared {
1789*333d2b36SAndroid Build Coastguard Worker			name: "mylib_shared",
1790*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1791*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libdl#27"],
1792*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1793*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
1794*333d2b36SAndroid Build Coastguard Worker		}
1795*333d2b36SAndroid Build Coastguard Worker
1796*333d2b36SAndroid Build Coastguard Worker		cc_library {
1797*333d2b36SAndroid Build Coastguard Worker			name: "libBootstrap",
1798*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
1799*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1800*333d2b36SAndroid Build Coastguard Worker			bootstrap: true,
1801*333d2b36SAndroid Build Coastguard Worker		}
1802*333d2b36SAndroid Build Coastguard Worker	`)
1803*333d2b36SAndroid Build Coastguard Worker
1804*333d2b36SAndroid Build Coastguard Worker	apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
1805*333d2b36SAndroid Build Coastguard Worker	copyCmds := apexRule.Args["copy_commands"]
1806*333d2b36SAndroid Build Coastguard Worker
1807*333d2b36SAndroid Build Coastguard Worker	// Ensure that mylib, libm, libdl are included.
1808*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1809*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1810*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
1811*333d2b36SAndroid Build Coastguard Worker
1812*333d2b36SAndroid Build Coastguard Worker	// Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
1813*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
1814*333d2b36SAndroid Build Coastguard Worker
1815*333d2b36SAndroid Build Coastguard Worker	mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1816*333d2b36SAndroid Build Coastguard Worker	mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1817*333d2b36SAndroid Build Coastguard Worker	mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
1818*333d2b36SAndroid Build Coastguard Worker
1819*333d2b36SAndroid Build Coastguard Worker	// For dependency to libc
1820*333d2b36SAndroid Build Coastguard Worker	// Ensure that mylib is linking with the latest version of stubs
1821*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
1822*333d2b36SAndroid Build Coastguard Worker	// ... and not linking to the non-stub (impl) variant
1823*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1824*333d2b36SAndroid Build Coastguard Worker	// ... Cflags from stub is correctly exported to mylib
1825*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1826*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
1827*333d2b36SAndroid Build Coastguard Worker
1828*333d2b36SAndroid Build Coastguard Worker	// For dependency to libm
1829*333d2b36SAndroid Build Coastguard Worker	// Ensure that mylib is linking with the non-stub (impl) variant
1830*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
1831*333d2b36SAndroid Build Coastguard Worker	// ... and not linking to the stub variant
1832*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
1833*333d2b36SAndroid Build Coastguard Worker	// ... and is not compiling with the stub
1834*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1835*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1836*333d2b36SAndroid Build Coastguard Worker
1837*333d2b36SAndroid Build Coastguard Worker	// For dependency to libdl
1838*333d2b36SAndroid Build Coastguard Worker	// Ensure that mylib is linking with the specified version of stubs
1839*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
1840*333d2b36SAndroid Build Coastguard Worker	// ... and not linking to the other versions of stubs
1841*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1842*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
1843*333d2b36SAndroid Build Coastguard Worker	// ... and not linking to the non-stub (impl) variant
1844*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
1845*333d2b36SAndroid Build Coastguard Worker	// ... Cflags from stub is correctly exported to mylib
1846*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1847*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
1848*333d2b36SAndroid Build Coastguard Worker
1849*333d2b36SAndroid Build Coastguard Worker	// Ensure that libBootstrap is depending on the platform variant of bionic libs
1850*333d2b36SAndroid Build Coastguard Worker	libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1851*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1852*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1853*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
1854*333d2b36SAndroid Build Coastguard Worker}
1855*333d2b36SAndroid Build Coastguard Worker
1856*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
1857*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
1858*333d2b36SAndroid Build Coastguard Worker	// there are three links between liba --> libz.
1859*333d2b36SAndroid Build Coastguard Worker	// 1) myapex -> libx -> liba -> libz    : this should be #30 link
1860*333d2b36SAndroid Build Coastguard Worker	// 2) otherapex -> liby -> liba -> libz : this should be #30 link
1861*333d2b36SAndroid Build Coastguard Worker	// 3) (platform) -> liba -> libz        : this should be non-stub link
1862*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
1863*333d2b36SAndroid Build Coastguard Worker		apex {
1864*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
1865*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
1866*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["libx"],
1867*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
1868*333d2b36SAndroid Build Coastguard Worker		}
1869*333d2b36SAndroid Build Coastguard Worker
1870*333d2b36SAndroid Build Coastguard Worker		apex {
1871*333d2b36SAndroid Build Coastguard Worker			name: "otherapex",
1872*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
1873*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["liby"],
1874*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "30",
1875*333d2b36SAndroid Build Coastguard Worker		}
1876*333d2b36SAndroid Build Coastguard Worker
1877*333d2b36SAndroid Build Coastguard Worker		apex_key {
1878*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
1879*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
1880*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
1881*333d2b36SAndroid Build Coastguard Worker		}
1882*333d2b36SAndroid Build Coastguard Worker
1883*333d2b36SAndroid Build Coastguard Worker		cc_library {
1884*333d2b36SAndroid Build Coastguard Worker			name: "libx",
1885*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["liba"],
1886*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1887*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1888*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
1889*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
1890*333d2b36SAndroid Build Coastguard Worker		}
1891*333d2b36SAndroid Build Coastguard Worker
1892*333d2b36SAndroid Build Coastguard Worker		cc_library {
1893*333d2b36SAndroid Build Coastguard Worker			name: "liby",
1894*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["liba"],
1895*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1896*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1897*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "otherapex" ],
1898*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
1899*333d2b36SAndroid Build Coastguard Worker		}
1900*333d2b36SAndroid Build Coastguard Worker
1901*333d2b36SAndroid Build Coastguard Worker		cc_library {
1902*333d2b36SAndroid Build Coastguard Worker			name: "liba",
1903*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libz"],
1904*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1905*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1906*333d2b36SAndroid Build Coastguard Worker			apex_available: [
1907*333d2b36SAndroid Build Coastguard Worker				"//apex_available:anyapex",
1908*333d2b36SAndroid Build Coastguard Worker				"//apex_available:platform",
1909*333d2b36SAndroid Build Coastguard Worker			],
1910*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
1911*333d2b36SAndroid Build Coastguard Worker		}
1912*333d2b36SAndroid Build Coastguard Worker
1913*333d2b36SAndroid Build Coastguard Worker		cc_library {
1914*333d2b36SAndroid Build Coastguard Worker			name: "libz",
1915*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1916*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1917*333d2b36SAndroid Build Coastguard Worker			stubs: {
1918*333d2b36SAndroid Build Coastguard Worker				versions: ["28", "30"],
1919*333d2b36SAndroid Build Coastguard Worker			},
1920*333d2b36SAndroid Build Coastguard Worker		}
1921*333d2b36SAndroid Build Coastguard Worker	`)
1922*333d2b36SAndroid Build Coastguard Worker
1923*333d2b36SAndroid Build Coastguard Worker	expectLink := func(from, from_variant, to, to_variant string) {
1924*333d2b36SAndroid Build Coastguard Worker		ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1925*333d2b36SAndroid Build Coastguard Worker		ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1926*333d2b36SAndroid Build Coastguard Worker	}
1927*333d2b36SAndroid Build Coastguard Worker	expectNoLink := func(from, from_variant, to, to_variant string) {
1928*333d2b36SAndroid Build Coastguard Worker		ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1929*333d2b36SAndroid Build Coastguard Worker		ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1930*333d2b36SAndroid Build Coastguard Worker	}
1931*333d2b36SAndroid Build Coastguard Worker	// platform liba is linked to non-stub version
1932*333d2b36SAndroid Build Coastguard Worker	expectLink("liba", "shared", "libz", "shared")
1933*333d2b36SAndroid Build Coastguard Worker	// liba in myapex is linked to current
1934*333d2b36SAndroid Build Coastguard Worker	expectLink("liba", "shared_apex29", "libz", "shared_current")
1935*333d2b36SAndroid Build Coastguard Worker	expectNoLink("liba", "shared_apex29", "libz", "shared_30")
1936*333d2b36SAndroid Build Coastguard Worker	expectNoLink("liba", "shared_apex29", "libz", "shared_28")
1937*333d2b36SAndroid Build Coastguard Worker	expectNoLink("liba", "shared_apex29", "libz", "shared")
1938*333d2b36SAndroid Build Coastguard Worker	// liba in otherapex is linked to current
1939*333d2b36SAndroid Build Coastguard Worker	expectLink("liba", "shared_apex30", "libz", "shared_current")
1940*333d2b36SAndroid Build Coastguard Worker	expectNoLink("liba", "shared_apex30", "libz", "shared_30")
1941*333d2b36SAndroid Build Coastguard Worker	expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1942*333d2b36SAndroid Build Coastguard Worker	expectNoLink("liba", "shared_apex30", "libz", "shared")
1943*333d2b36SAndroid Build Coastguard Worker}
1944*333d2b36SAndroid Build Coastguard Worker
1945*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1946*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
1947*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
1948*333d2b36SAndroid Build Coastguard Worker		apex {
1949*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
1950*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
1951*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["libx"],
1952*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "R",
1953*333d2b36SAndroid Build Coastguard Worker		}
1954*333d2b36SAndroid Build Coastguard Worker
1955*333d2b36SAndroid Build Coastguard Worker		apex_key {
1956*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
1957*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
1958*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
1959*333d2b36SAndroid Build Coastguard Worker		}
1960*333d2b36SAndroid Build Coastguard Worker
1961*333d2b36SAndroid Build Coastguard Worker		cc_library {
1962*333d2b36SAndroid Build Coastguard Worker			name: "libx",
1963*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libz"],
1964*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1965*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1966*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
1967*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "R",
1968*333d2b36SAndroid Build Coastguard Worker		}
1969*333d2b36SAndroid Build Coastguard Worker
1970*333d2b36SAndroid Build Coastguard Worker		cc_library {
1971*333d2b36SAndroid Build Coastguard Worker			name: "libz",
1972*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1973*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1974*333d2b36SAndroid Build Coastguard Worker			stubs: {
1975*333d2b36SAndroid Build Coastguard Worker				versions: ["29", "R"],
1976*333d2b36SAndroid Build Coastguard Worker			},
1977*333d2b36SAndroid Build Coastguard Worker		}
1978*333d2b36SAndroid Build Coastguard Worker	`,
1979*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1980*333d2b36SAndroid Build Coastguard Worker			variables.Platform_version_active_codenames = []string{"R"}
1981*333d2b36SAndroid Build Coastguard Worker		}),
1982*333d2b36SAndroid Build Coastguard Worker	)
1983*333d2b36SAndroid Build Coastguard Worker
1984*333d2b36SAndroid Build Coastguard Worker	expectLink := func(from, from_variant, to, to_variant string) {
1985*333d2b36SAndroid Build Coastguard Worker		ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1986*333d2b36SAndroid Build Coastguard Worker		ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1987*333d2b36SAndroid Build Coastguard Worker	}
1988*333d2b36SAndroid Build Coastguard Worker	expectNoLink := func(from, from_variant, to, to_variant string) {
1989*333d2b36SAndroid Build Coastguard Worker		ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1990*333d2b36SAndroid Build Coastguard Worker		ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1991*333d2b36SAndroid Build Coastguard Worker	}
1992*333d2b36SAndroid Build Coastguard Worker	expectLink("libx", "shared_apex10000", "libz", "shared_current")
1993*333d2b36SAndroid Build Coastguard Worker	expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
1994*333d2b36SAndroid Build Coastguard Worker	expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1995*333d2b36SAndroid Build Coastguard Worker	expectNoLink("libx", "shared_apex10000", "libz", "shared")
1996*333d2b36SAndroid Build Coastguard Worker}
1997*333d2b36SAndroid Build Coastguard Worker
1998*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1999*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
2000*333d2b36SAndroid Build Coastguard Worker	testApex(t, `
2001*333d2b36SAndroid Build Coastguard Worker		apex {
2002*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
2003*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
2004*333d2b36SAndroid Build Coastguard Worker			java_libs: ["libx"],
2005*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "S",
2006*333d2b36SAndroid Build Coastguard Worker		}
2007*333d2b36SAndroid Build Coastguard Worker
2008*333d2b36SAndroid Build Coastguard Worker		apex_key {
2009*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
2010*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
2011*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
2012*333d2b36SAndroid Build Coastguard Worker		}
2013*333d2b36SAndroid Build Coastguard Worker
2014*333d2b36SAndroid Build Coastguard Worker		java_library {
2015*333d2b36SAndroid Build Coastguard Worker			name: "libx",
2016*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
2017*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
2018*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2019*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "S", // should be okay
2020*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
2021*333d2b36SAndroid Build Coastguard Worker		}
2022*333d2b36SAndroid Build Coastguard Worker	`,
2023*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2024*333d2b36SAndroid Build Coastguard Worker			variables.Platform_version_active_codenames = []string{"S"}
2025*333d2b36SAndroid Build Coastguard Worker			variables.Platform_sdk_codename = proptools.StringPtr("S")
2026*333d2b36SAndroid Build Coastguard Worker		}),
2027*333d2b36SAndroid Build Coastguard Worker	)
2028*333d2b36SAndroid Build Coastguard Worker}
2029*333d2b36SAndroid Build Coastguard Worker
2030*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
2031*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
2032*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
2033*333d2b36SAndroid Build Coastguard Worker		apex {
2034*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
2035*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
2036*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["libx"],
2037*333d2b36SAndroid Build Coastguard Worker			updatable: false,
2038*333d2b36SAndroid Build Coastguard Worker		}
2039*333d2b36SAndroid Build Coastguard Worker
2040*333d2b36SAndroid Build Coastguard Worker		apex_key {
2041*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
2042*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
2043*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
2044*333d2b36SAndroid Build Coastguard Worker		}
2045*333d2b36SAndroid Build Coastguard Worker
2046*333d2b36SAndroid Build Coastguard Worker		cc_library {
2047*333d2b36SAndroid Build Coastguard Worker			name: "libx",
2048*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libz"],
2049*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
2050*333d2b36SAndroid Build Coastguard Worker			stl: "none",
2051*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
2052*333d2b36SAndroid Build Coastguard Worker		}
2053*333d2b36SAndroid Build Coastguard Worker
2054*333d2b36SAndroid Build Coastguard Worker		cc_library {
2055*333d2b36SAndroid Build Coastguard Worker			name: "libz",
2056*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
2057*333d2b36SAndroid Build Coastguard Worker			stl: "none",
2058*333d2b36SAndroid Build Coastguard Worker			stubs: {
2059*333d2b36SAndroid Build Coastguard Worker				versions: ["1", "2"],
2060*333d2b36SAndroid Build Coastguard Worker			},
2061*333d2b36SAndroid Build Coastguard Worker		}
2062*333d2b36SAndroid Build Coastguard Worker	`)
2063*333d2b36SAndroid Build Coastguard Worker
2064*333d2b36SAndroid Build Coastguard Worker	expectLink := func(from, from_variant, to, to_variant string) {
2065*333d2b36SAndroid Build Coastguard Worker		ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2066*333d2b36SAndroid Build Coastguard Worker		ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2067*333d2b36SAndroid Build Coastguard Worker	}
2068*333d2b36SAndroid Build Coastguard Worker	expectNoLink := func(from, from_variant, to, to_variant string) {
2069*333d2b36SAndroid Build Coastguard Worker		ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2070*333d2b36SAndroid Build Coastguard Worker		ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2071*333d2b36SAndroid Build Coastguard Worker	}
2072*333d2b36SAndroid Build Coastguard Worker	expectLink("libx", "shared_apex10000", "libz", "shared_current")
2073*333d2b36SAndroid Build Coastguard Worker	expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
2074*333d2b36SAndroid Build Coastguard Worker	expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
2075*333d2b36SAndroid Build Coastguard Worker	expectNoLink("libx", "shared_apex10000", "libz", "shared")
2076*333d2b36SAndroid Build Coastguard Worker}
2077*333d2b36SAndroid Build Coastguard Worker
2078*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_InVendorApex(t *testing.T) {
2079*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
2080*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
2081*333d2b36SAndroid Build Coastguard Worker		apex {
2082*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
2083*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
2084*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib"],
2085*333d2b36SAndroid Build Coastguard Worker			updatable: true,
2086*333d2b36SAndroid Build Coastguard Worker			vendor: true,
2087*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2088*333d2b36SAndroid Build Coastguard Worker		}
2089*333d2b36SAndroid Build Coastguard Worker
2090*333d2b36SAndroid Build Coastguard Worker		apex_key {
2091*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
2092*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
2093*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
2094*333d2b36SAndroid Build Coastguard Worker		}
2095*333d2b36SAndroid Build Coastguard Worker
2096*333d2b36SAndroid Build Coastguard Worker		cc_library {
2097*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
2098*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
2099*333d2b36SAndroid Build Coastguard Worker			vendor_available: true,
2100*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2101*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libbar"],
2102*333d2b36SAndroid Build Coastguard Worker		}
2103*333d2b36SAndroid Build Coastguard Worker
2104*333d2b36SAndroid Build Coastguard Worker		cc_library {
2105*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
2106*333d2b36SAndroid Build Coastguard Worker			stubs: { versions: ["29", "30"] },
2107*333d2b36SAndroid Build Coastguard Worker			llndk: { symbol_file: "libbar.map.txt" },
2108*333d2b36SAndroid Build Coastguard Worker		}
2109*333d2b36SAndroid Build Coastguard Worker	`)
2110*333d2b36SAndroid Build Coastguard Worker
2111*333d2b36SAndroid Build Coastguard Worker	vendorVariant := "android_vendor_arm64_armv8-a"
2112*333d2b36SAndroid Build Coastguard Worker
2113*333d2b36SAndroid Build Coastguard Worker	mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
2114*333d2b36SAndroid Build Coastguard Worker
2115*333d2b36SAndroid Build Coastguard Worker	// Ensure that mylib links with "current" LLNDK
2116*333d2b36SAndroid Build Coastguard Worker	libFlags := names(mylib.Rule("ld").Args["libFlags"])
2117*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
2118*333d2b36SAndroid Build Coastguard Worker
2119*333d2b36SAndroid Build Coastguard Worker	// Ensure that mylib is targeting 29
2120*333d2b36SAndroid Build Coastguard Worker	ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2121*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2122*333d2b36SAndroid Build Coastguard Worker
2123*333d2b36SAndroid Build Coastguard Worker	// Ensure that the correct variant of crtbegin_so is used.
2124*333d2b36SAndroid Build Coastguard Worker	crtBegin := mylib.Rule("ld").Args["crtBegin"]
2125*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
2126*333d2b36SAndroid Build Coastguard Worker
2127*333d2b36SAndroid Build Coastguard Worker	// Ensure that the crtbegin_so used by the APEX is targeting 29
2128*333d2b36SAndroid Build Coastguard Worker	cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2129*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2130*333d2b36SAndroid Build Coastguard Worker}
2131*333d2b36SAndroid Build Coastguard Worker
2132*333d2b36SAndroid Build Coastguard Workerfunc TestTrackAllowedDeps(t *testing.T) {
2133*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
2134*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
2135*333d2b36SAndroid Build Coastguard Worker		apex {
2136*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
2137*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
2138*333d2b36SAndroid Build Coastguard Worker			updatable: true,
2139*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: [
2140*333d2b36SAndroid Build Coastguard Worker				"mylib",
2141*333d2b36SAndroid Build Coastguard Worker				"yourlib",
2142*333d2b36SAndroid Build Coastguard Worker			],
2143*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2144*333d2b36SAndroid Build Coastguard Worker		}
2145*333d2b36SAndroid Build Coastguard Worker
2146*333d2b36SAndroid Build Coastguard Worker		apex {
2147*333d2b36SAndroid Build Coastguard Worker			name: "myapex2",
2148*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
2149*333d2b36SAndroid Build Coastguard Worker			updatable: false,
2150*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["yourlib"],
2151*333d2b36SAndroid Build Coastguard Worker		}
2152*333d2b36SAndroid Build Coastguard Worker
2153*333d2b36SAndroid Build Coastguard Worker		apex_key {
2154*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
2155*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
2156*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
2157*333d2b36SAndroid Build Coastguard Worker		}
2158*333d2b36SAndroid Build Coastguard Worker
2159*333d2b36SAndroid Build Coastguard Worker		cc_library {
2160*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
2161*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
2162*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libbar"],
2163*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2164*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
2165*333d2b36SAndroid Build Coastguard Worker		}
2166*333d2b36SAndroid Build Coastguard Worker
2167*333d2b36SAndroid Build Coastguard Worker		cc_library {
2168*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
2169*333d2b36SAndroid Build Coastguard Worker			stubs: { versions: ["29", "30"] },
2170*333d2b36SAndroid Build Coastguard Worker		}
2171*333d2b36SAndroid Build Coastguard Worker
2172*333d2b36SAndroid Build Coastguard Worker		cc_library {
2173*333d2b36SAndroid Build Coastguard Worker			name: "yourlib",
2174*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
2175*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2176*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2177*333d2b36SAndroid Build Coastguard Worker		}
2178*333d2b36SAndroid Build Coastguard Worker	`, withFiles(android.MockFS{
2179*333d2b36SAndroid Build Coastguard Worker		"packages/modules/common/build/allowed_deps.txt": nil,
2180*333d2b36SAndroid Build Coastguard Worker	}))
2181*333d2b36SAndroid Build Coastguard Worker
2182*333d2b36SAndroid Build Coastguard Worker	depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2183*333d2b36SAndroid Build Coastguard Worker	inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2184*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2185*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2186*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2187*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2188*333d2b36SAndroid Build Coastguard Worker
2189*333d2b36SAndroid Build Coastguard Worker	myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2190*333d2b36SAndroid Build Coastguard Worker	flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2191*333d2b36SAndroid Build Coastguard Worker		myapex.Output("depsinfo/flatlist.txt")), "\n")
2192*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2193*333d2b36SAndroid Build Coastguard Worker		flatlist, "libbar(minSdkVersion:(no version)) (external)")
2194*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2195*333d2b36SAndroid Build Coastguard Worker		flatlist, "mylib:(minSdkVersion:29)")
2196*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "track platform-available lib",
2197*333d2b36SAndroid Build Coastguard Worker		flatlist, "yourlib(minSdkVersion:29)")
2198*333d2b36SAndroid Build Coastguard Worker}
2199*333d2b36SAndroid Build Coastguard Worker
2200*333d2b36SAndroid Build Coastguard Workerfunc TestTrackCustomAllowedDepsInvalidDefaultTxt(t *testing.T) {
2201*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
2202*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
2203*333d2b36SAndroid Build Coastguard Worker		apex {
2204*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
2205*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
2206*333d2b36SAndroid Build Coastguard Worker			updatable: true,
2207*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: [
2208*333d2b36SAndroid Build Coastguard Worker				"mylib",
2209*333d2b36SAndroid Build Coastguard Worker				"yourlib",
2210*333d2b36SAndroid Build Coastguard Worker			],
2211*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2212*333d2b36SAndroid Build Coastguard Worker		}
2213*333d2b36SAndroid Build Coastguard Worker
2214*333d2b36SAndroid Build Coastguard Worker		apex {
2215*333d2b36SAndroid Build Coastguard Worker			name: "myapex2",
2216*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
2217*333d2b36SAndroid Build Coastguard Worker			updatable: false,
2218*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["yourlib"],
2219*333d2b36SAndroid Build Coastguard Worker		}
2220*333d2b36SAndroid Build Coastguard Worker
2221*333d2b36SAndroid Build Coastguard Worker		apex_key {
2222*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
2223*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
2224*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
2225*333d2b36SAndroid Build Coastguard Worker		}
2226*333d2b36SAndroid Build Coastguard Worker
2227*333d2b36SAndroid Build Coastguard Worker		cc_library {
2228*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
2229*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
2230*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libbar"],
2231*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2232*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
2233*333d2b36SAndroid Build Coastguard Worker		}
2234*333d2b36SAndroid Build Coastguard Worker
2235*333d2b36SAndroid Build Coastguard Worker		cc_library {
2236*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
2237*333d2b36SAndroid Build Coastguard Worker			stubs: { versions: ["29", "30"] },
2238*333d2b36SAndroid Build Coastguard Worker		}
2239*333d2b36SAndroid Build Coastguard Worker
2240*333d2b36SAndroid Build Coastguard Worker		cc_library {
2241*333d2b36SAndroid Build Coastguard Worker			name: "yourlib",
2242*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
2243*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2244*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2245*333d2b36SAndroid Build Coastguard Worker		}
2246*333d2b36SAndroid Build Coastguard Worker	`, withFiles(android.MockFS{
2247*333d2b36SAndroid Build Coastguard Worker		"packages/modules/common/build/custom_allowed_deps.txt": nil,
2248*333d2b36SAndroid Build Coastguard Worker	}),
2249*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(
2250*333d2b36SAndroid Build Coastguard Worker			func(variables android.FixtureProductVariables) {
2251*333d2b36SAndroid Build Coastguard Worker				variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2252*333d2b36SAndroid Build Coastguard Worker			},
2253*333d2b36SAndroid Build Coastguard Worker		))
2254*333d2b36SAndroid Build Coastguard Worker
2255*333d2b36SAndroid Build Coastguard Worker	depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2256*333d2b36SAndroid Build Coastguard Worker	inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2257*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2258*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2259*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2260*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2261*333d2b36SAndroid Build Coastguard Worker
2262*333d2b36SAndroid Build Coastguard Worker	myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2263*333d2b36SAndroid Build Coastguard Worker	flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2264*333d2b36SAndroid Build Coastguard Worker		myapex.Output("depsinfo/flatlist.txt")), "\n")
2265*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2266*333d2b36SAndroid Build Coastguard Worker		flatlist, "libbar(minSdkVersion:(no version)) (external)")
2267*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2268*333d2b36SAndroid Build Coastguard Worker		flatlist, "mylib:(minSdkVersion:29)")
2269*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "track platform-available lib",
2270*333d2b36SAndroid Build Coastguard Worker		flatlist, "yourlib(minSdkVersion:29)")
2271*333d2b36SAndroid Build Coastguard Worker}
2272*333d2b36SAndroid Build Coastguard Worker
2273*333d2b36SAndroid Build Coastguard Workerfunc TestTrackCustomAllowedDepsWithDefaultTxt(t *testing.T) {
2274*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
2275*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
2276*333d2b36SAndroid Build Coastguard Worker		apex {
2277*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
2278*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
2279*333d2b36SAndroid Build Coastguard Worker			updatable: true,
2280*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: [
2281*333d2b36SAndroid Build Coastguard Worker				"mylib",
2282*333d2b36SAndroid Build Coastguard Worker				"yourlib",
2283*333d2b36SAndroid Build Coastguard Worker			],
2284*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2285*333d2b36SAndroid Build Coastguard Worker		}
2286*333d2b36SAndroid Build Coastguard Worker
2287*333d2b36SAndroid Build Coastguard Worker		apex {
2288*333d2b36SAndroid Build Coastguard Worker			name: "myapex2",
2289*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
2290*333d2b36SAndroid Build Coastguard Worker			updatable: false,
2291*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["yourlib"],
2292*333d2b36SAndroid Build Coastguard Worker		}
2293*333d2b36SAndroid Build Coastguard Worker
2294*333d2b36SAndroid Build Coastguard Worker		apex_key {
2295*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
2296*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
2297*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
2298*333d2b36SAndroid Build Coastguard Worker		}
2299*333d2b36SAndroid Build Coastguard Worker
2300*333d2b36SAndroid Build Coastguard Worker		cc_library {
2301*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
2302*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
2303*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libbar"],
2304*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2305*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
2306*333d2b36SAndroid Build Coastguard Worker		}
2307*333d2b36SAndroid Build Coastguard Worker
2308*333d2b36SAndroid Build Coastguard Worker		cc_library {
2309*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
2310*333d2b36SAndroid Build Coastguard Worker			stubs: { versions: ["29", "30"] },
2311*333d2b36SAndroid Build Coastguard Worker		}
2312*333d2b36SAndroid Build Coastguard Worker
2313*333d2b36SAndroid Build Coastguard Worker		cc_library {
2314*333d2b36SAndroid Build Coastguard Worker			name: "yourlib",
2315*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
2316*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2317*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2318*333d2b36SAndroid Build Coastguard Worker		}
2319*333d2b36SAndroid Build Coastguard Worker	`, withFiles(android.MockFS{
2320*333d2b36SAndroid Build Coastguard Worker		"packages/modules/common/build/custom_allowed_deps.txt": nil,
2321*333d2b36SAndroid Build Coastguard Worker		"packages/modules/common/build/allowed_deps.txt":        nil,
2322*333d2b36SAndroid Build Coastguard Worker	}),
2323*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(
2324*333d2b36SAndroid Build Coastguard Worker			func(variables android.FixtureProductVariables) {
2325*333d2b36SAndroid Build Coastguard Worker				variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2326*333d2b36SAndroid Build Coastguard Worker			},
2327*333d2b36SAndroid Build Coastguard Worker		))
2328*333d2b36SAndroid Build Coastguard Worker
2329*333d2b36SAndroid Build Coastguard Worker	depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2330*333d2b36SAndroid Build Coastguard Worker	inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2331*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2332*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2333*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2334*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2335*333d2b36SAndroid Build Coastguard Worker
2336*333d2b36SAndroid Build Coastguard Worker	myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2337*333d2b36SAndroid Build Coastguard Worker	flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2338*333d2b36SAndroid Build Coastguard Worker		myapex.Output("depsinfo/flatlist.txt")), "\n")
2339*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2340*333d2b36SAndroid Build Coastguard Worker		flatlist, "libbar(minSdkVersion:(no version)) (external)")
2341*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2342*333d2b36SAndroid Build Coastguard Worker		flatlist, "mylib:(minSdkVersion:29)")
2343*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "track platform-available lib",
2344*333d2b36SAndroid Build Coastguard Worker		flatlist, "yourlib(minSdkVersion:29)")
2345*333d2b36SAndroid Build Coastguard Worker}
2346*333d2b36SAndroid Build Coastguard Worker
2347*333d2b36SAndroid Build Coastguard Workerfunc TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2348*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
2349*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
2350*333d2b36SAndroid Build Coastguard Worker		apex {
2351*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
2352*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
2353*333d2b36SAndroid Build Coastguard Worker			updatable: true,
2354*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2355*333d2b36SAndroid Build Coastguard Worker		}
2356*333d2b36SAndroid Build Coastguard Worker
2357*333d2b36SAndroid Build Coastguard Worker		apex_key {
2358*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
2359*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
2360*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
2361*333d2b36SAndroid Build Coastguard Worker		}
2362*333d2b36SAndroid Build Coastguard Worker	`)
2363*333d2b36SAndroid Build Coastguard Worker	depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2364*333d2b36SAndroid Build Coastguard Worker	if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2365*333d2b36SAndroid Build Coastguard Worker		t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2366*333d2b36SAndroid Build Coastguard Worker	}
2367*333d2b36SAndroid Build Coastguard Worker}
2368*333d2b36SAndroid Build Coastguard Worker
2369*333d2b36SAndroid Build Coastguard Workerfunc TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
2370*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
2371*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
2372*333d2b36SAndroid Build Coastguard Worker		apex {
2373*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
2374*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
2375*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["libx"],
2376*333d2b36SAndroid Build Coastguard Worker			updatable: false,
2377*333d2b36SAndroid Build Coastguard Worker		}
2378*333d2b36SAndroid Build Coastguard Worker
2379*333d2b36SAndroid Build Coastguard Worker		apex_key {
2380*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
2381*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
2382*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
2383*333d2b36SAndroid Build Coastguard Worker		}
2384*333d2b36SAndroid Build Coastguard Worker
2385*333d2b36SAndroid Build Coastguard Worker		cc_library {
2386*333d2b36SAndroid Build Coastguard Worker			name: "libx",
2387*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
2388*333d2b36SAndroid Build Coastguard Worker			stl: "none",
2389*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
2390*333d2b36SAndroid Build Coastguard Worker			stubs: {
2391*333d2b36SAndroid Build Coastguard Worker				versions: ["1", "2"],
2392*333d2b36SAndroid Build Coastguard Worker			},
2393*333d2b36SAndroid Build Coastguard Worker		}
2394*333d2b36SAndroid Build Coastguard Worker
2395*333d2b36SAndroid Build Coastguard Worker		cc_library {
2396*333d2b36SAndroid Build Coastguard Worker			name: "libz",
2397*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libx"],
2398*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
2399*333d2b36SAndroid Build Coastguard Worker			stl: "none",
2400*333d2b36SAndroid Build Coastguard Worker		}
2401*333d2b36SAndroid Build Coastguard Worker	`)
2402*333d2b36SAndroid Build Coastguard Worker
2403*333d2b36SAndroid Build Coastguard Worker	expectLink := func(from, from_variant, to, to_variant string) {
2404*333d2b36SAndroid Build Coastguard Worker		t.Helper()
2405*333d2b36SAndroid Build Coastguard Worker		ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2406*333d2b36SAndroid Build Coastguard Worker		ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2407*333d2b36SAndroid Build Coastguard Worker	}
2408*333d2b36SAndroid Build Coastguard Worker	expectNoLink := func(from, from_variant, to, to_variant string) {
2409*333d2b36SAndroid Build Coastguard Worker		t.Helper()
2410*333d2b36SAndroid Build Coastguard Worker		ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2411*333d2b36SAndroid Build Coastguard Worker		ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2412*333d2b36SAndroid Build Coastguard Worker	}
2413*333d2b36SAndroid Build Coastguard Worker	expectLink("libz", "shared", "libx", "shared_current")
2414*333d2b36SAndroid Build Coastguard Worker	expectNoLink("libz", "shared", "libx", "shared_2")
2415*333d2b36SAndroid Build Coastguard Worker	expectNoLink("libz", "shared", "libz", "shared_1")
2416*333d2b36SAndroid Build Coastguard Worker	expectNoLink("libz", "shared", "libz", "shared")
2417*333d2b36SAndroid Build Coastguard Worker}
2418*333d2b36SAndroid Build Coastguard Worker
2419*333d2b36SAndroid Build Coastguard Workervar prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2420*333d2b36SAndroid Build Coastguard Worker	func(variables android.FixtureProductVariables) {
2421*333d2b36SAndroid Build Coastguard Worker		variables.SanitizeDevice = []string{"hwaddress"}
2422*333d2b36SAndroid Build Coastguard Worker	},
2423*333d2b36SAndroid Build Coastguard Worker)
2424*333d2b36SAndroid Build Coastguard Worker
2425*333d2b36SAndroid Build Coastguard Workerfunc TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
2426*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
2427*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
2428*333d2b36SAndroid Build Coastguard Worker		apex {
2429*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
2430*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
2431*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["libx"],
2432*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2433*333d2b36SAndroid Build Coastguard Worker		}
2434*333d2b36SAndroid Build Coastguard Worker
2435*333d2b36SAndroid Build Coastguard Worker		apex_key {
2436*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
2437*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
2438*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
2439*333d2b36SAndroid Build Coastguard Worker		}
2440*333d2b36SAndroid Build Coastguard Worker
2441*333d2b36SAndroid Build Coastguard Worker		cc_library {
2442*333d2b36SAndroid Build Coastguard Worker			name: "libx",
2443*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libbar"],
2444*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
2445*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2446*333d2b36SAndroid Build Coastguard Worker		}
2447*333d2b36SAndroid Build Coastguard Worker
2448*333d2b36SAndroid Build Coastguard Worker		cc_library {
2449*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
2450*333d2b36SAndroid Build Coastguard Worker			stubs: {
2451*333d2b36SAndroid Build Coastguard Worker				versions: ["29", "30"],
2452*333d2b36SAndroid Build Coastguard Worker			},
2453*333d2b36SAndroid Build Coastguard Worker		}
2454*333d2b36SAndroid Build Coastguard Worker	`,
2455*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithSantitizeHwaddress,
2456*333d2b36SAndroid Build Coastguard Worker	)
2457*333d2b36SAndroid Build Coastguard Worker	expectLink := func(from, from_variant, to, to_variant string) {
2458*333d2b36SAndroid Build Coastguard Worker		ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2459*333d2b36SAndroid Build Coastguard Worker		libFlags := ld.Args["libFlags"]
2460*333d2b36SAndroid Build Coastguard Worker		ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2461*333d2b36SAndroid Build Coastguard Worker	}
2462*333d2b36SAndroid Build Coastguard Worker	expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
2463*333d2b36SAndroid Build Coastguard Worker}
2464*333d2b36SAndroid Build Coastguard Worker
2465*333d2b36SAndroid Build Coastguard Workerfunc TestQTargetApexUsesStaticUnwinder(t *testing.T) {
2466*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
2467*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
2468*333d2b36SAndroid Build Coastguard Worker		apex {
2469*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
2470*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
2471*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["libx"],
2472*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2473*333d2b36SAndroid Build Coastguard Worker		}
2474*333d2b36SAndroid Build Coastguard Worker
2475*333d2b36SAndroid Build Coastguard Worker		apex_key {
2476*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
2477*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
2478*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
2479*333d2b36SAndroid Build Coastguard Worker		}
2480*333d2b36SAndroid Build Coastguard Worker
2481*333d2b36SAndroid Build Coastguard Worker		cc_library {
2482*333d2b36SAndroid Build Coastguard Worker			name: "libx",
2483*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
2484*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2485*333d2b36SAndroid Build Coastguard Worker		}
2486*333d2b36SAndroid Build Coastguard Worker	`)
2487*333d2b36SAndroid Build Coastguard Worker
2488*333d2b36SAndroid Build Coastguard Worker	// ensure apex variant of c++ is linked with static unwinder
2489*333d2b36SAndroid Build Coastguard Worker	cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
2490*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
2491*333d2b36SAndroid Build Coastguard Worker	// note that platform variant is not.
2492*333d2b36SAndroid Build Coastguard Worker	cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
2493*333d2b36SAndroid Build Coastguard Worker	ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
2494*333d2b36SAndroid Build Coastguard Worker}
2495*333d2b36SAndroid Build Coastguard Worker
2496*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2497*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
2498*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
2499*333d2b36SAndroid Build Coastguard Worker		apex {
2500*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
2501*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
2502*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib"],
2503*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2504*333d2b36SAndroid Build Coastguard Worker		}
2505*333d2b36SAndroid Build Coastguard Worker
2506*333d2b36SAndroid Build Coastguard Worker		apex_key {
2507*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
2508*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
2509*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
2510*333d2b36SAndroid Build Coastguard Worker		}
2511*333d2b36SAndroid Build Coastguard Worker
2512*333d2b36SAndroid Build Coastguard Worker		cc_library {
2513*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
2514*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
2515*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
2516*333d2b36SAndroid Build Coastguard Worker			stl: "none",
2517*333d2b36SAndroid Build Coastguard Worker			apex_available: [
2518*333d2b36SAndroid Build Coastguard Worker				"myapex",
2519*333d2b36SAndroid Build Coastguard Worker			],
2520*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "30",
2521*333d2b36SAndroid Build Coastguard Worker		}
2522*333d2b36SAndroid Build Coastguard Worker	`)
2523*333d2b36SAndroid Build Coastguard Worker
2524*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2525*333d2b36SAndroid Build Coastguard Worker		apex {
2526*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
2527*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
2528*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["libfoo.ffi"],
2529*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2530*333d2b36SAndroid Build Coastguard Worker		}
2531*333d2b36SAndroid Build Coastguard Worker
2532*333d2b36SAndroid Build Coastguard Worker		apex_key {
2533*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
2534*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
2535*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
2536*333d2b36SAndroid Build Coastguard Worker		}
2537*333d2b36SAndroid Build Coastguard Worker
2538*333d2b36SAndroid Build Coastguard Worker		rust_ffi_shared {
2539*333d2b36SAndroid Build Coastguard Worker			name: "libfoo.ffi",
2540*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
2541*333d2b36SAndroid Build Coastguard Worker			crate_name: "foo",
2542*333d2b36SAndroid Build Coastguard Worker			apex_available: [
2543*333d2b36SAndroid Build Coastguard Worker				"myapex",
2544*333d2b36SAndroid Build Coastguard Worker			],
2545*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "30",
2546*333d2b36SAndroid Build Coastguard Worker		}
2547*333d2b36SAndroid Build Coastguard Worker	`)
2548*333d2b36SAndroid Build Coastguard Worker
2549*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2550*333d2b36SAndroid Build Coastguard Worker		apex {
2551*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
2552*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
2553*333d2b36SAndroid Build Coastguard Worker			java_libs: ["libfoo"],
2554*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2555*333d2b36SAndroid Build Coastguard Worker		}
2556*333d2b36SAndroid Build Coastguard Worker
2557*333d2b36SAndroid Build Coastguard Worker		apex_key {
2558*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
2559*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
2560*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
2561*333d2b36SAndroid Build Coastguard Worker		}
2562*333d2b36SAndroid Build Coastguard Worker
2563*333d2b36SAndroid Build Coastguard Worker		java_import {
2564*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
2565*333d2b36SAndroid Build Coastguard Worker			jars: ["libfoo.jar"],
2566*333d2b36SAndroid Build Coastguard Worker			apex_available: [
2567*333d2b36SAndroid Build Coastguard Worker				"myapex",
2568*333d2b36SAndroid Build Coastguard Worker			],
2569*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "30",
2570*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
2571*333d2b36SAndroid Build Coastguard Worker		}
2572*333d2b36SAndroid Build Coastguard Worker	`)
2573*333d2b36SAndroid Build Coastguard Worker
2574*333d2b36SAndroid Build Coastguard Worker	// Skip check for modules compiling against core API surface
2575*333d2b36SAndroid Build Coastguard Worker	testApex(t, `
2576*333d2b36SAndroid Build Coastguard Worker		apex {
2577*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
2578*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
2579*333d2b36SAndroid Build Coastguard Worker			java_libs: ["libfoo"],
2580*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2581*333d2b36SAndroid Build Coastguard Worker		}
2582*333d2b36SAndroid Build Coastguard Worker
2583*333d2b36SAndroid Build Coastguard Worker		apex_key {
2584*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
2585*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
2586*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
2587*333d2b36SAndroid Build Coastguard Worker		}
2588*333d2b36SAndroid Build Coastguard Worker
2589*333d2b36SAndroid Build Coastguard Worker		java_library {
2590*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
2591*333d2b36SAndroid Build Coastguard Worker			srcs: ["Foo.java"],
2592*333d2b36SAndroid Build Coastguard Worker			apex_available: [
2593*333d2b36SAndroid Build Coastguard Worker				"myapex",
2594*333d2b36SAndroid Build Coastguard Worker			],
2595*333d2b36SAndroid Build Coastguard Worker			// Compile against core API surface
2596*333d2b36SAndroid Build Coastguard Worker			sdk_version: "core_current",
2597*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "30",
2598*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
2599*333d2b36SAndroid Build Coastguard Worker		}
2600*333d2b36SAndroid Build Coastguard Worker	`)
2601*333d2b36SAndroid Build Coastguard Worker
2602*333d2b36SAndroid Build Coastguard Worker}
2603*333d2b36SAndroid Build Coastguard Worker
2604*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_Okay(t *testing.T) {
2605*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
2606*333d2b36SAndroid Build Coastguard Worker	testApex(t, `
2607*333d2b36SAndroid Build Coastguard Worker		apex {
2608*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
2609*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
2610*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["libfoo"],
2611*333d2b36SAndroid Build Coastguard Worker			java_libs: ["libbar"],
2612*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2613*333d2b36SAndroid Build Coastguard Worker		}
2614*333d2b36SAndroid Build Coastguard Worker
2615*333d2b36SAndroid Build Coastguard Worker		apex_key {
2616*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
2617*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
2618*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
2619*333d2b36SAndroid Build Coastguard Worker		}
2620*333d2b36SAndroid Build Coastguard Worker
2621*333d2b36SAndroid Build Coastguard Worker		cc_library {
2622*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
2623*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
2624*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libfoo_dep"],
2625*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
2626*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2627*333d2b36SAndroid Build Coastguard Worker		}
2628*333d2b36SAndroid Build Coastguard Worker
2629*333d2b36SAndroid Build Coastguard Worker		cc_library {
2630*333d2b36SAndroid Build Coastguard Worker			name: "libfoo_dep",
2631*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
2632*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
2633*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2634*333d2b36SAndroid Build Coastguard Worker		}
2635*333d2b36SAndroid Build Coastguard Worker
2636*333d2b36SAndroid Build Coastguard Worker		java_library {
2637*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
2638*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2639*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
2640*333d2b36SAndroid Build Coastguard Worker			static_libs: [
2641*333d2b36SAndroid Build Coastguard Worker				"libbar_dep",
2642*333d2b36SAndroid Build Coastguard Worker				"libbar_import_dep",
2643*333d2b36SAndroid Build Coastguard Worker			],
2644*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
2645*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2646*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
2647*333d2b36SAndroid Build Coastguard Worker		}
2648*333d2b36SAndroid Build Coastguard Worker
2649*333d2b36SAndroid Build Coastguard Worker		java_library {
2650*333d2b36SAndroid Build Coastguard Worker			name: "libbar_dep",
2651*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2652*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
2653*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
2654*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2655*333d2b36SAndroid Build Coastguard Worker		}
2656*333d2b36SAndroid Build Coastguard Worker
2657*333d2b36SAndroid Build Coastguard Worker		java_import {
2658*333d2b36SAndroid Build Coastguard Worker			name: "libbar_import_dep",
2659*333d2b36SAndroid Build Coastguard Worker			jars: ["libbar.jar"],
2660*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
2661*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2662*333d2b36SAndroid Build Coastguard Worker		}
2663*333d2b36SAndroid Build Coastguard Worker	`)
2664*333d2b36SAndroid Build Coastguard Worker}
2665*333d2b36SAndroid Build Coastguard Worker
2666*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2667*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
2668*333d2b36SAndroid Build Coastguard Worker	// Tests that an apex dependency with min_sdk_version higher than the
2669*333d2b36SAndroid Build Coastguard Worker	// min_sdk_version of the apex is allowed as long as the dependency's
2670*333d2b36SAndroid Build Coastguard Worker	// min_sdk_version is less than or equal to the api level that the
2671*333d2b36SAndroid Build Coastguard Worker	// architecture was introduced in.  In this case, arm64 didn't exist
2672*333d2b36SAndroid Build Coastguard Worker	// until api level 21, so the arm64 code will never need to run on
2673*333d2b36SAndroid Build Coastguard Worker	// an api level 20 device, even if other architectures of the apex
2674*333d2b36SAndroid Build Coastguard Worker	// will.
2675*333d2b36SAndroid Build Coastguard Worker	testApex(t, `
2676*333d2b36SAndroid Build Coastguard Worker		apex {
2677*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
2678*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
2679*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["libfoo"],
2680*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "20",
2681*333d2b36SAndroid Build Coastguard Worker		}
2682*333d2b36SAndroid Build Coastguard Worker
2683*333d2b36SAndroid Build Coastguard Worker		apex_key {
2684*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
2685*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
2686*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
2687*333d2b36SAndroid Build Coastguard Worker		}
2688*333d2b36SAndroid Build Coastguard Worker
2689*333d2b36SAndroid Build Coastguard Worker		cc_library {
2690*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
2691*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
2692*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
2693*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "21",
2694*333d2b36SAndroid Build Coastguard Worker			stl: "none",
2695*333d2b36SAndroid Build Coastguard Worker		}
2696*333d2b36SAndroid Build Coastguard Worker	`)
2697*333d2b36SAndroid Build Coastguard Worker}
2698*333d2b36SAndroid Build Coastguard Worker
2699*333d2b36SAndroid Build Coastguard Workerfunc TestJavaStableSdkVersion(t *testing.T) {
2700*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
2701*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
2702*333d2b36SAndroid Build Coastguard Worker		name          string
2703*333d2b36SAndroid Build Coastguard Worker		expectedError string
2704*333d2b36SAndroid Build Coastguard Worker		bp            string
2705*333d2b36SAndroid Build Coastguard Worker		preparer      android.FixturePreparer
2706*333d2b36SAndroid Build Coastguard Worker	}{
2707*333d2b36SAndroid Build Coastguard Worker		{
2708*333d2b36SAndroid Build Coastguard Worker			name: "Non-updatable apex with non-stable dep",
2709*333d2b36SAndroid Build Coastguard Worker			bp: `
2710*333d2b36SAndroid Build Coastguard Worker				apex {
2711*333d2b36SAndroid Build Coastguard Worker					name: "myapex",
2712*333d2b36SAndroid Build Coastguard Worker					java_libs: ["myjar"],
2713*333d2b36SAndroid Build Coastguard Worker					key: "myapex.key",
2714*333d2b36SAndroid Build Coastguard Worker					updatable: false,
2715*333d2b36SAndroid Build Coastguard Worker				}
2716*333d2b36SAndroid Build Coastguard Worker				apex_key {
2717*333d2b36SAndroid Build Coastguard Worker					name: "myapex.key",
2718*333d2b36SAndroid Build Coastguard Worker					public_key: "testkey.avbpubkey",
2719*333d2b36SAndroid Build Coastguard Worker					private_key: "testkey.pem",
2720*333d2b36SAndroid Build Coastguard Worker				}
2721*333d2b36SAndroid Build Coastguard Worker				java_library {
2722*333d2b36SAndroid Build Coastguard Worker					name: "myjar",
2723*333d2b36SAndroid Build Coastguard Worker					srcs: ["foo/bar/MyClass.java"],
2724*333d2b36SAndroid Build Coastguard Worker					sdk_version: "test_current",
2725*333d2b36SAndroid Build Coastguard Worker					apex_available: ["myapex"],
2726*333d2b36SAndroid Build Coastguard Worker					compile_dex: true,
2727*333d2b36SAndroid Build Coastguard Worker				}
2728*333d2b36SAndroid Build Coastguard Worker			`,
2729*333d2b36SAndroid Build Coastguard Worker		},
2730*333d2b36SAndroid Build Coastguard Worker		{
2731*333d2b36SAndroid Build Coastguard Worker			name: "Updatable apex with stable dep",
2732*333d2b36SAndroid Build Coastguard Worker			bp: `
2733*333d2b36SAndroid Build Coastguard Worker				apex {
2734*333d2b36SAndroid Build Coastguard Worker					name: "myapex",
2735*333d2b36SAndroid Build Coastguard Worker					java_libs: ["myjar"],
2736*333d2b36SAndroid Build Coastguard Worker					key: "myapex.key",
2737*333d2b36SAndroid Build Coastguard Worker					updatable: true,
2738*333d2b36SAndroid Build Coastguard Worker					min_sdk_version: "29",
2739*333d2b36SAndroid Build Coastguard Worker				}
2740*333d2b36SAndroid Build Coastguard Worker				apex_key {
2741*333d2b36SAndroid Build Coastguard Worker					name: "myapex.key",
2742*333d2b36SAndroid Build Coastguard Worker					public_key: "testkey.avbpubkey",
2743*333d2b36SAndroid Build Coastguard Worker					private_key: "testkey.pem",
2744*333d2b36SAndroid Build Coastguard Worker				}
2745*333d2b36SAndroid Build Coastguard Worker				java_library {
2746*333d2b36SAndroid Build Coastguard Worker					name: "myjar",
2747*333d2b36SAndroid Build Coastguard Worker					srcs: ["foo/bar/MyClass.java"],
2748*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
2749*333d2b36SAndroid Build Coastguard Worker					apex_available: ["myapex"],
2750*333d2b36SAndroid Build Coastguard Worker					min_sdk_version: "29",
2751*333d2b36SAndroid Build Coastguard Worker					compile_dex: true,
2752*333d2b36SAndroid Build Coastguard Worker				}
2753*333d2b36SAndroid Build Coastguard Worker			`,
2754*333d2b36SAndroid Build Coastguard Worker		},
2755*333d2b36SAndroid Build Coastguard Worker		{
2756*333d2b36SAndroid Build Coastguard Worker			name:          "Updatable apex with non-stable dep",
2757*333d2b36SAndroid Build Coastguard Worker			expectedError: "cannot depend on \"myjar\"",
2758*333d2b36SAndroid Build Coastguard Worker			bp: `
2759*333d2b36SAndroid Build Coastguard Worker				apex {
2760*333d2b36SAndroid Build Coastguard Worker					name: "myapex",
2761*333d2b36SAndroid Build Coastguard Worker					java_libs: ["myjar"],
2762*333d2b36SAndroid Build Coastguard Worker					key: "myapex.key",
2763*333d2b36SAndroid Build Coastguard Worker					updatable: true,
2764*333d2b36SAndroid Build Coastguard Worker				}
2765*333d2b36SAndroid Build Coastguard Worker				apex_key {
2766*333d2b36SAndroid Build Coastguard Worker					name: "myapex.key",
2767*333d2b36SAndroid Build Coastguard Worker					public_key: "testkey.avbpubkey",
2768*333d2b36SAndroid Build Coastguard Worker					private_key: "testkey.pem",
2769*333d2b36SAndroid Build Coastguard Worker				}
2770*333d2b36SAndroid Build Coastguard Worker				java_library {
2771*333d2b36SAndroid Build Coastguard Worker					name: "myjar",
2772*333d2b36SAndroid Build Coastguard Worker					srcs: ["foo/bar/MyClass.java"],
2773*333d2b36SAndroid Build Coastguard Worker					sdk_version: "test_current",
2774*333d2b36SAndroid Build Coastguard Worker					apex_available: ["myapex"],
2775*333d2b36SAndroid Build Coastguard Worker					compile_dex: true,
2776*333d2b36SAndroid Build Coastguard Worker				}
2777*333d2b36SAndroid Build Coastguard Worker			`,
2778*333d2b36SAndroid Build Coastguard Worker		},
2779*333d2b36SAndroid Build Coastguard Worker		{
2780*333d2b36SAndroid Build Coastguard Worker			name:          "Updatable apex with non-stable legacy core platform dep",
2781*333d2b36SAndroid Build Coastguard Worker			expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2782*333d2b36SAndroid Build Coastguard Worker			bp: `
2783*333d2b36SAndroid Build Coastguard Worker				apex {
2784*333d2b36SAndroid Build Coastguard Worker					name: "myapex",
2785*333d2b36SAndroid Build Coastguard Worker					java_libs: ["myjar-uses-legacy"],
2786*333d2b36SAndroid Build Coastguard Worker					key: "myapex.key",
2787*333d2b36SAndroid Build Coastguard Worker					updatable: true,
2788*333d2b36SAndroid Build Coastguard Worker				}
2789*333d2b36SAndroid Build Coastguard Worker				apex_key {
2790*333d2b36SAndroid Build Coastguard Worker					name: "myapex.key",
2791*333d2b36SAndroid Build Coastguard Worker					public_key: "testkey.avbpubkey",
2792*333d2b36SAndroid Build Coastguard Worker					private_key: "testkey.pem",
2793*333d2b36SAndroid Build Coastguard Worker				}
2794*333d2b36SAndroid Build Coastguard Worker				java_library {
2795*333d2b36SAndroid Build Coastguard Worker					name: "myjar-uses-legacy",
2796*333d2b36SAndroid Build Coastguard Worker					srcs: ["foo/bar/MyClass.java"],
2797*333d2b36SAndroid Build Coastguard Worker					sdk_version: "core_platform",
2798*333d2b36SAndroid Build Coastguard Worker					apex_available: ["myapex"],
2799*333d2b36SAndroid Build Coastguard Worker					compile_dex: true,
2800*333d2b36SAndroid Build Coastguard Worker				}
2801*333d2b36SAndroid Build Coastguard Worker			`,
2802*333d2b36SAndroid Build Coastguard Worker			preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2803*333d2b36SAndroid Build Coastguard Worker		},
2804*333d2b36SAndroid Build Coastguard Worker		{
2805*333d2b36SAndroid Build Coastguard Worker			name: "Updatable apex with non-stable transitive dep",
2806*333d2b36SAndroid Build Coastguard Worker			// This is not actually detecting that the transitive dependency is unstable, rather it is
2807*333d2b36SAndroid Build Coastguard Worker			// detecting that the transitive dependency is building against a wider API surface than the
2808*333d2b36SAndroid Build Coastguard Worker			// module that depends on it is using.
2809*333d2b36SAndroid Build Coastguard Worker			expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
2810*333d2b36SAndroid Build Coastguard Worker			bp: `
2811*333d2b36SAndroid Build Coastguard Worker				apex {
2812*333d2b36SAndroid Build Coastguard Worker					name: "myapex",
2813*333d2b36SAndroid Build Coastguard Worker					java_libs: ["myjar"],
2814*333d2b36SAndroid Build Coastguard Worker					key: "myapex.key",
2815*333d2b36SAndroid Build Coastguard Worker					updatable: true,
2816*333d2b36SAndroid Build Coastguard Worker				}
2817*333d2b36SAndroid Build Coastguard Worker				apex_key {
2818*333d2b36SAndroid Build Coastguard Worker					name: "myapex.key",
2819*333d2b36SAndroid Build Coastguard Worker					public_key: "testkey.avbpubkey",
2820*333d2b36SAndroid Build Coastguard Worker					private_key: "testkey.pem",
2821*333d2b36SAndroid Build Coastguard Worker				}
2822*333d2b36SAndroid Build Coastguard Worker				java_library {
2823*333d2b36SAndroid Build Coastguard Worker					name: "myjar",
2824*333d2b36SAndroid Build Coastguard Worker					srcs: ["foo/bar/MyClass.java"],
2825*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
2826*333d2b36SAndroid Build Coastguard Worker					apex_available: ["myapex"],
2827*333d2b36SAndroid Build Coastguard Worker					static_libs: ["transitive-jar"],
2828*333d2b36SAndroid Build Coastguard Worker					compile_dex: true,
2829*333d2b36SAndroid Build Coastguard Worker				}
2830*333d2b36SAndroid Build Coastguard Worker				java_library {
2831*333d2b36SAndroid Build Coastguard Worker					name: "transitive-jar",
2832*333d2b36SAndroid Build Coastguard Worker					srcs: ["foo/bar/MyClass.java"],
2833*333d2b36SAndroid Build Coastguard Worker					sdk_version: "core_platform",
2834*333d2b36SAndroid Build Coastguard Worker					apex_available: ["myapex"],
2835*333d2b36SAndroid Build Coastguard Worker				}
2836*333d2b36SAndroid Build Coastguard Worker			`,
2837*333d2b36SAndroid Build Coastguard Worker		},
2838*333d2b36SAndroid Build Coastguard Worker	}
2839*333d2b36SAndroid Build Coastguard Worker
2840*333d2b36SAndroid Build Coastguard Worker	for _, test := range testCases {
2841*333d2b36SAndroid Build Coastguard Worker		if test.name != "Updatable apex with non-stable legacy core platform dep" {
2842*333d2b36SAndroid Build Coastguard Worker			continue
2843*333d2b36SAndroid Build Coastguard Worker		}
2844*333d2b36SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
2845*333d2b36SAndroid Build Coastguard Worker			t.Parallel()
2846*333d2b36SAndroid Build Coastguard Worker			errorHandler := android.FixtureExpectsNoErrors
2847*333d2b36SAndroid Build Coastguard Worker			if test.expectedError != "" {
2848*333d2b36SAndroid Build Coastguard Worker				errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
2849*333d2b36SAndroid Build Coastguard Worker			}
2850*333d2b36SAndroid Build Coastguard Worker			android.GroupFixturePreparers(
2851*333d2b36SAndroid Build Coastguard Worker				java.PrepareForTestWithJavaDefaultModules,
2852*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithApexBuildComponents,
2853*333d2b36SAndroid Build Coastguard Worker				prepareForTestWithMyapex,
2854*333d2b36SAndroid Build Coastguard Worker				android.OptionalFixturePreparer(test.preparer),
2855*333d2b36SAndroid Build Coastguard Worker			).
2856*333d2b36SAndroid Build Coastguard Worker				ExtendWithErrorHandler(errorHandler).
2857*333d2b36SAndroid Build Coastguard Worker				RunTestWithBp(t, test.bp)
2858*333d2b36SAndroid Build Coastguard Worker		})
2859*333d2b36SAndroid Build Coastguard Worker	}
2860*333d2b36SAndroid Build Coastguard Worker}
2861*333d2b36SAndroid Build Coastguard Worker
2862*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2863*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2864*333d2b36SAndroid Build Coastguard Worker		apex {
2865*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
2866*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
2867*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib"],
2868*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2869*333d2b36SAndroid Build Coastguard Worker		}
2870*333d2b36SAndroid Build Coastguard Worker
2871*333d2b36SAndroid Build Coastguard Worker		apex_key {
2872*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
2873*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
2874*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
2875*333d2b36SAndroid Build Coastguard Worker		}
2876*333d2b36SAndroid Build Coastguard Worker
2877*333d2b36SAndroid Build Coastguard Worker		cc_library {
2878*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
2879*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
2880*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["mylib2"],
2881*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
2882*333d2b36SAndroid Build Coastguard Worker			stl: "none",
2883*333d2b36SAndroid Build Coastguard Worker			apex_available: [
2884*333d2b36SAndroid Build Coastguard Worker				"myapex",
2885*333d2b36SAndroid Build Coastguard Worker			],
2886*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2887*333d2b36SAndroid Build Coastguard Worker		}
2888*333d2b36SAndroid Build Coastguard Worker
2889*333d2b36SAndroid Build Coastguard Worker		// indirect part of the apex
2890*333d2b36SAndroid Build Coastguard Worker		cc_library {
2891*333d2b36SAndroid Build Coastguard Worker			name: "mylib2",
2892*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
2893*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
2894*333d2b36SAndroid Build Coastguard Worker			stl: "none",
2895*333d2b36SAndroid Build Coastguard Worker			apex_available: [
2896*333d2b36SAndroid Build Coastguard Worker				"myapex",
2897*333d2b36SAndroid Build Coastguard Worker			],
2898*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "30",
2899*333d2b36SAndroid Build Coastguard Worker		}
2900*333d2b36SAndroid Build Coastguard Worker	`)
2901*333d2b36SAndroid Build Coastguard Worker}
2902*333d2b36SAndroid Build Coastguard Worker
2903*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2904*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
2905*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2906*333d2b36SAndroid Build Coastguard Worker		apex {
2907*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
2908*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
2909*333d2b36SAndroid Build Coastguard Worker			apps: ["AppFoo"],
2910*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2911*333d2b36SAndroid Build Coastguard Worker			updatable: false,
2912*333d2b36SAndroid Build Coastguard Worker		}
2913*333d2b36SAndroid Build Coastguard Worker
2914*333d2b36SAndroid Build Coastguard Worker		apex_key {
2915*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
2916*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
2917*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
2918*333d2b36SAndroid Build Coastguard Worker		}
2919*333d2b36SAndroid Build Coastguard Worker
2920*333d2b36SAndroid Build Coastguard Worker		android_app {
2921*333d2b36SAndroid Build Coastguard Worker			name: "AppFoo",
2922*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
2923*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2924*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2925*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
2926*333d2b36SAndroid Build Coastguard Worker			stl: "none",
2927*333d2b36SAndroid Build Coastguard Worker			static_libs: ["bar"],
2928*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
2929*333d2b36SAndroid Build Coastguard Worker		}
2930*333d2b36SAndroid Build Coastguard Worker
2931*333d2b36SAndroid Build Coastguard Worker		java_library {
2932*333d2b36SAndroid Build Coastguard Worker			name: "bar",
2933*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2934*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
2935*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
2936*333d2b36SAndroid Build Coastguard Worker		}
2937*333d2b36SAndroid Build Coastguard Worker	`)
2938*333d2b36SAndroid Build Coastguard Worker}
2939*333d2b36SAndroid Build Coastguard Worker
2940*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
2941*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
2942*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
2943*333d2b36SAndroid Build Coastguard Worker		apex {
2944*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
2945*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
2946*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib"],
2947*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2948*333d2b36SAndroid Build Coastguard Worker		}
2949*333d2b36SAndroid Build Coastguard Worker
2950*333d2b36SAndroid Build Coastguard Worker		apex_key {
2951*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
2952*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
2953*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
2954*333d2b36SAndroid Build Coastguard Worker		}
2955*333d2b36SAndroid Build Coastguard Worker
2956*333d2b36SAndroid Build Coastguard Worker		// mylib will link to mylib2#current
2957*333d2b36SAndroid Build Coastguard Worker		cc_library {
2958*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
2959*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
2960*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["mylib2"],
2961*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
2962*333d2b36SAndroid Build Coastguard Worker			stl: "none",
2963*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex", "otherapex"],
2964*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
2965*333d2b36SAndroid Build Coastguard Worker		}
2966*333d2b36SAndroid Build Coastguard Worker
2967*333d2b36SAndroid Build Coastguard Worker		cc_library {
2968*333d2b36SAndroid Build Coastguard Worker			name: "mylib2",
2969*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
2970*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
2971*333d2b36SAndroid Build Coastguard Worker			stl: "none",
2972*333d2b36SAndroid Build Coastguard Worker			apex_available: ["otherapex"],
2973*333d2b36SAndroid Build Coastguard Worker			stubs: { versions: ["29", "30"] },
2974*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "30",
2975*333d2b36SAndroid Build Coastguard Worker		}
2976*333d2b36SAndroid Build Coastguard Worker
2977*333d2b36SAndroid Build Coastguard Worker		apex {
2978*333d2b36SAndroid Build Coastguard Worker			name: "otherapex",
2979*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
2980*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib", "mylib2"],
2981*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "30",
2982*333d2b36SAndroid Build Coastguard Worker		}
2983*333d2b36SAndroid Build Coastguard Worker	`)
2984*333d2b36SAndroid Build Coastguard Worker	expectLink := func(from, from_variant, to, to_variant string) {
2985*333d2b36SAndroid Build Coastguard Worker		ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2986*333d2b36SAndroid Build Coastguard Worker		libFlags := ld.Args["libFlags"]
2987*333d2b36SAndroid Build Coastguard Worker		ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2988*333d2b36SAndroid Build Coastguard Worker	}
2989*333d2b36SAndroid Build Coastguard Worker	expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
2990*333d2b36SAndroid Build Coastguard Worker	expectLink("mylib", "shared_apex30", "mylib2", "shared_current")
2991*333d2b36SAndroid Build Coastguard Worker}
2992*333d2b36SAndroid Build Coastguard Worker
2993*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
2994*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
2995*333d2b36SAndroid Build Coastguard Worker	withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2996*333d2b36SAndroid Build Coastguard Worker		func(variables android.FixtureProductVariables) {
2997*333d2b36SAndroid Build Coastguard Worker			variables.Platform_sdk_codename = proptools.StringPtr("S")
2998*333d2b36SAndroid Build Coastguard Worker			variables.Platform_version_active_codenames = []string{"S"}
2999*333d2b36SAndroid Build Coastguard Worker		},
3000*333d2b36SAndroid Build Coastguard Worker	)
3001*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
3002*333d2b36SAndroid Build Coastguard Worker		apex {
3003*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
3004*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
3005*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["libfoo"],
3006*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "S",
3007*333d2b36SAndroid Build Coastguard Worker		}
3008*333d2b36SAndroid Build Coastguard Worker		apex_key {
3009*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
3010*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
3011*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
3012*333d2b36SAndroid Build Coastguard Worker		}
3013*333d2b36SAndroid Build Coastguard Worker		cc_library {
3014*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
3015*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libbar"],
3016*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
3017*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
3018*333d2b36SAndroid Build Coastguard Worker		}
3019*333d2b36SAndroid Build Coastguard Worker		cc_library {
3020*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
3021*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
3022*333d2b36SAndroid Build Coastguard Worker		}
3023*333d2b36SAndroid Build Coastguard Worker	`, withSAsActiveCodeNames)
3024*333d2b36SAndroid Build Coastguard Worker}
3025*333d2b36SAndroid Build Coastguard Worker
3026*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
3027*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
3028*333d2b36SAndroid Build Coastguard Worker	withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3029*333d2b36SAndroid Build Coastguard Worker		variables.Platform_sdk_codename = proptools.StringPtr("S")
3030*333d2b36SAndroid Build Coastguard Worker		variables.Platform_version_active_codenames = []string{"S", "T"}
3031*333d2b36SAndroid Build Coastguard Worker	})
3032*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
3033*333d2b36SAndroid Build Coastguard Worker		apex {
3034*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
3035*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
3036*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["libfoo"],
3037*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "S",
3038*333d2b36SAndroid Build Coastguard Worker		}
3039*333d2b36SAndroid Build Coastguard Worker		apex_key {
3040*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
3041*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
3042*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
3043*333d2b36SAndroid Build Coastguard Worker		}
3044*333d2b36SAndroid Build Coastguard Worker		cc_library {
3045*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
3046*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libbar"],
3047*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
3048*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "S",
3049*333d2b36SAndroid Build Coastguard Worker		}
3050*333d2b36SAndroid Build Coastguard Worker		cc_library {
3051*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
3052*333d2b36SAndroid Build Coastguard Worker			stubs: {
3053*333d2b36SAndroid Build Coastguard Worker				symbol_file: "libbar.map.txt",
3054*333d2b36SAndroid Build Coastguard Worker				versions: ["30", "S", "T"],
3055*333d2b36SAndroid Build Coastguard Worker			},
3056*333d2b36SAndroid Build Coastguard Worker		}
3057*333d2b36SAndroid Build Coastguard Worker	`, withSAsActiveCodeNames)
3058*333d2b36SAndroid Build Coastguard Worker
3059*333d2b36SAndroid Build Coastguard Worker	// ensure libfoo is linked with current version of libbar stub
3060*333d2b36SAndroid Build Coastguard Worker	libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
3061*333d2b36SAndroid Build Coastguard Worker	libFlags := libfoo.Rule("ld").Args["libFlags"]
3062*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
3063*333d2b36SAndroid Build Coastguard Worker}
3064*333d2b36SAndroid Build Coastguard Worker
3065*333d2b36SAndroid Build Coastguard Workerfunc TestFilesInSubDir(t *testing.T) {
3066*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
3067*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
3068*333d2b36SAndroid Build Coastguard Worker		apex {
3069*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
3070*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
3071*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib"],
3072*333d2b36SAndroid Build Coastguard Worker			binaries: ["mybin", "mybin.rust"],
3073*333d2b36SAndroid Build Coastguard Worker			prebuilts: ["myetc"],
3074*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "both",
3075*333d2b36SAndroid Build Coastguard Worker			updatable: false,
3076*333d2b36SAndroid Build Coastguard Worker		}
3077*333d2b36SAndroid Build Coastguard Worker
3078*333d2b36SAndroid Build Coastguard Worker		apex_key {
3079*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
3080*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
3081*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
3082*333d2b36SAndroid Build Coastguard Worker		}
3083*333d2b36SAndroid Build Coastguard Worker
3084*333d2b36SAndroid Build Coastguard Worker		prebuilt_etc {
3085*333d2b36SAndroid Build Coastguard Worker			name: "myetc",
3086*333d2b36SAndroid Build Coastguard Worker			src: "myprebuilt",
3087*333d2b36SAndroid Build Coastguard Worker			sub_dir: "foo/bar",
3088*333d2b36SAndroid Build Coastguard Worker		}
3089*333d2b36SAndroid Build Coastguard Worker
3090*333d2b36SAndroid Build Coastguard Worker		cc_library {
3091*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
3092*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
3093*333d2b36SAndroid Build Coastguard Worker			relative_install_path: "foo/bar",
3094*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
3095*333d2b36SAndroid Build Coastguard Worker			stl: "none",
3096*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
3097*333d2b36SAndroid Build Coastguard Worker		}
3098*333d2b36SAndroid Build Coastguard Worker
3099*333d2b36SAndroid Build Coastguard Worker		cc_binary {
3100*333d2b36SAndroid Build Coastguard Worker			name: "mybin",
3101*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
3102*333d2b36SAndroid Build Coastguard Worker			relative_install_path: "foo/bar",
3103*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
3104*333d2b36SAndroid Build Coastguard Worker			stl: "none",
3105*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
3106*333d2b36SAndroid Build Coastguard Worker		}
3107*333d2b36SAndroid Build Coastguard Worker
3108*333d2b36SAndroid Build Coastguard Worker		rust_binary {
3109*333d2b36SAndroid Build Coastguard Worker			name: "mybin.rust",
3110*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
3111*333d2b36SAndroid Build Coastguard Worker			relative_install_path: "rust_subdir",
3112*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
3113*333d2b36SAndroid Build Coastguard Worker		}
3114*333d2b36SAndroid Build Coastguard Worker	`)
3115*333d2b36SAndroid Build Coastguard Worker
3116*333d2b36SAndroid Build Coastguard Worker	generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
3117*333d2b36SAndroid Build Coastguard Worker	cmd := generateFsRule.RuleParams.Command
3118*333d2b36SAndroid Build Coastguard Worker
3119*333d2b36SAndroid Build Coastguard Worker	// Ensure that the subdirectories are all listed
3120*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, cmd, "/etc ")
3121*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, cmd, "/etc/foo ")
3122*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, cmd, "/etc/foo/bar ")
3123*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, cmd, "/lib64 ")
3124*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, cmd, "/lib64/foo ")
3125*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, cmd, "/lib64/foo/bar ")
3126*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, cmd, "/lib ")
3127*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, cmd, "/lib/foo ")
3128*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, cmd, "/lib/foo/bar ")
3129*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, cmd, "/bin ")
3130*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, cmd, "/bin/foo ")
3131*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, cmd, "/bin/foo/bar ")
3132*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, cmd, "/bin/rust_subdir ")
3133*333d2b36SAndroid Build Coastguard Worker}
3134*333d2b36SAndroid Build Coastguard Worker
3135*333d2b36SAndroid Build Coastguard Workerfunc TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
3136*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
3137*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
3138*333d2b36SAndroid Build Coastguard Worker		apex {
3139*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
3140*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
3141*333d2b36SAndroid Build Coastguard Worker			multilib: {
3142*333d2b36SAndroid Build Coastguard Worker				both: {
3143*333d2b36SAndroid Build Coastguard Worker					native_shared_libs: ["mylib"],
3144*333d2b36SAndroid Build Coastguard Worker					binaries: ["mybin"],
3145*333d2b36SAndroid Build Coastguard Worker				},
3146*333d2b36SAndroid Build Coastguard Worker			},
3147*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "both",
3148*333d2b36SAndroid Build Coastguard Worker			native_bridge_supported: true,
3149*333d2b36SAndroid Build Coastguard Worker			updatable: false,
3150*333d2b36SAndroid Build Coastguard Worker		}
3151*333d2b36SAndroid Build Coastguard Worker
3152*333d2b36SAndroid Build Coastguard Worker		apex_key {
3153*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
3154*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
3155*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
3156*333d2b36SAndroid Build Coastguard Worker		}
3157*333d2b36SAndroid Build Coastguard Worker
3158*333d2b36SAndroid Build Coastguard Worker		cc_library {
3159*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
3160*333d2b36SAndroid Build Coastguard Worker			relative_install_path: "foo/bar",
3161*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
3162*333d2b36SAndroid Build Coastguard Worker			stl: "none",
3163*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
3164*333d2b36SAndroid Build Coastguard Worker			native_bridge_supported: true,
3165*333d2b36SAndroid Build Coastguard Worker		}
3166*333d2b36SAndroid Build Coastguard Worker
3167*333d2b36SAndroid Build Coastguard Worker		cc_binary {
3168*333d2b36SAndroid Build Coastguard Worker			name: "mybin",
3169*333d2b36SAndroid Build Coastguard Worker			relative_install_path: "foo/bar",
3170*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
3171*333d2b36SAndroid Build Coastguard Worker			stl: "none",
3172*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
3173*333d2b36SAndroid Build Coastguard Worker			native_bridge_supported: true,
3174*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "both", // default is "first" for binary
3175*333d2b36SAndroid Build Coastguard Worker			multilib: {
3176*333d2b36SAndroid Build Coastguard Worker				lib64: {
3177*333d2b36SAndroid Build Coastguard Worker					suffix: "64",
3178*333d2b36SAndroid Build Coastguard Worker				},
3179*333d2b36SAndroid Build Coastguard Worker			},
3180*333d2b36SAndroid Build Coastguard Worker		}
3181*333d2b36SAndroid Build Coastguard Worker	`, android.PrepareForNativeBridgeEnabled)
3182*333d2b36SAndroid Build Coastguard Worker	ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
3183*333d2b36SAndroid Build Coastguard Worker		"bin/foo/bar/mybin",
3184*333d2b36SAndroid Build Coastguard Worker		"bin/foo/bar/mybin64",
3185*333d2b36SAndroid Build Coastguard Worker		"bin/arm/foo/bar/mybin",
3186*333d2b36SAndroid Build Coastguard Worker		"bin/arm64/foo/bar/mybin64",
3187*333d2b36SAndroid Build Coastguard Worker		"lib/foo/bar/mylib.so",
3188*333d2b36SAndroid Build Coastguard Worker		"lib/arm/foo/bar/mylib.so",
3189*333d2b36SAndroid Build Coastguard Worker		"lib64/foo/bar/mylib.so",
3190*333d2b36SAndroid Build Coastguard Worker		"lib64/arm64/foo/bar/mylib.so",
3191*333d2b36SAndroid Build Coastguard Worker	})
3192*333d2b36SAndroid Build Coastguard Worker}
3193*333d2b36SAndroid Build Coastguard Worker
3194*333d2b36SAndroid Build Coastguard Workerfunc TestVendorApex(t *testing.T) {
3195*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
3196*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
3197*333d2b36SAndroid Build Coastguard Worker		prepareForApexTest,
3198*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyConfig(android.SetKatiEnabledForTests),
3199*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
3200*333d2b36SAndroid Build Coastguard Worker		apex {
3201*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
3202*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
3203*333d2b36SAndroid Build Coastguard Worker			binaries: ["mybin"],
3204*333d2b36SAndroid Build Coastguard Worker			vendor: true,
3205*333d2b36SAndroid Build Coastguard Worker			updatable: false,
3206*333d2b36SAndroid Build Coastguard Worker		}
3207*333d2b36SAndroid Build Coastguard Worker		apex_key {
3208*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
3209*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
3210*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
3211*333d2b36SAndroid Build Coastguard Worker		}
3212*333d2b36SAndroid Build Coastguard Worker		cc_binary {
3213*333d2b36SAndroid Build Coastguard Worker			name: "mybin",
3214*333d2b36SAndroid Build Coastguard Worker			vendor: true,
3215*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libfoo"],
3216*333d2b36SAndroid Build Coastguard Worker		}
3217*333d2b36SAndroid Build Coastguard Worker		cc_library {
3218*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
3219*333d2b36SAndroid Build Coastguard Worker			proprietary: true,
3220*333d2b36SAndroid Build Coastguard Worker		}
3221*333d2b36SAndroid Build Coastguard Worker	`)
3222*333d2b36SAndroid Build Coastguard Worker
3223*333d2b36SAndroid Build Coastguard Worker	ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
3224*333d2b36SAndroid Build Coastguard Worker		"bin/mybin",
3225*333d2b36SAndroid Build Coastguard Worker		"lib64/libfoo.so",
3226*333d2b36SAndroid Build Coastguard Worker		// TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3227*333d2b36SAndroid Build Coastguard Worker		"lib64/libc++.so",
3228*333d2b36SAndroid Build Coastguard Worker	})
3229*333d2b36SAndroid Build Coastguard Worker
3230*333d2b36SAndroid Build Coastguard Worker	apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
3231*333d2b36SAndroid Build Coastguard Worker	data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
3232*333d2b36SAndroid Build Coastguard Worker	name := apexBundle.BaseModuleName()
3233*333d2b36SAndroid Build Coastguard Worker	prefix := "TARGET_"
3234*333d2b36SAndroid Build Coastguard Worker	var builder strings.Builder
3235*333d2b36SAndroid Build Coastguard Worker	data.Custom(&builder, name, prefix, "", data)
3236*333d2b36SAndroid Build Coastguard Worker	androidMk := android.StringRelativeToTop(result.Config, builder.String())
3237*333d2b36SAndroid Build Coastguard Worker	installPath := "out/target/product/test_device/vendor/apex"
3238*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
3239*333d2b36SAndroid Build Coastguard Worker
3240*333d2b36SAndroid Build Coastguard Worker	apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
3241*333d2b36SAndroid Build Coastguard Worker	requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3242*333d2b36SAndroid Build Coastguard Worker	ensureListNotContains(t, requireNativeLibs, ":vndk")
3243*333d2b36SAndroid Build Coastguard Worker}
3244*333d2b36SAndroid Build Coastguard Worker
3245*333d2b36SAndroid Build Coastguard Workerfunc TestProductVariant(t *testing.T) {
3246*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
3247*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
3248*333d2b36SAndroid Build Coastguard Worker		apex {
3249*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
3250*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
3251*333d2b36SAndroid Build Coastguard Worker			updatable: false,
3252*333d2b36SAndroid Build Coastguard Worker			product_specific: true,
3253*333d2b36SAndroid Build Coastguard Worker			binaries: ["foo"],
3254*333d2b36SAndroid Build Coastguard Worker		}
3255*333d2b36SAndroid Build Coastguard Worker
3256*333d2b36SAndroid Build Coastguard Worker		apex_key {
3257*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
3258*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
3259*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
3260*333d2b36SAndroid Build Coastguard Worker		}
3261*333d2b36SAndroid Build Coastguard Worker
3262*333d2b36SAndroid Build Coastguard Worker		cc_binary {
3263*333d2b36SAndroid Build Coastguard Worker			name: "foo",
3264*333d2b36SAndroid Build Coastguard Worker			product_available: true,
3265*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
3266*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.cpp"],
3267*333d2b36SAndroid Build Coastguard Worker		}
3268*333d2b36SAndroid Build Coastguard Worker	`)
3269*333d2b36SAndroid Build Coastguard Worker
3270*333d2b36SAndroid Build Coastguard Worker	cflags := strings.Fields(
3271*333d2b36SAndroid Build Coastguard Worker		ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
3272*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3273*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3274*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3275*333d2b36SAndroid Build Coastguard Worker	ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3276*333d2b36SAndroid Build Coastguard Worker}
3277*333d2b36SAndroid Build Coastguard Worker
3278*333d2b36SAndroid Build Coastguard Workerfunc TestApex_withPrebuiltFirmware(t *testing.T) {
3279*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
3280*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
3281*333d2b36SAndroid Build Coastguard Worker		name           string
3282*333d2b36SAndroid Build Coastguard Worker		additionalProp string
3283*333d2b36SAndroid Build Coastguard Worker	}{
3284*333d2b36SAndroid Build Coastguard Worker		{"system apex with prebuilt_firmware", ""},
3285*333d2b36SAndroid Build Coastguard Worker		{"vendor apex with prebuilt_firmware", "vendor: true,"},
3286*333d2b36SAndroid Build Coastguard Worker	}
3287*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testCases {
3288*333d2b36SAndroid Build Coastguard Worker		t.Run(tc.name, func(t *testing.T) {
3289*333d2b36SAndroid Build Coastguard Worker			t.Parallel()
3290*333d2b36SAndroid Build Coastguard Worker			ctx := testApex(t, `
3291*333d2b36SAndroid Build Coastguard Worker				apex {
3292*333d2b36SAndroid Build Coastguard Worker					name: "myapex",
3293*333d2b36SAndroid Build Coastguard Worker					key: "myapex.key",
3294*333d2b36SAndroid Build Coastguard Worker					prebuilts: ["myfirmware"],
3295*333d2b36SAndroid Build Coastguard Worker					updatable: false,
3296*333d2b36SAndroid Build Coastguard Worker					`+tc.additionalProp+`
3297*333d2b36SAndroid Build Coastguard Worker				}
3298*333d2b36SAndroid Build Coastguard Worker				apex_key {
3299*333d2b36SAndroid Build Coastguard Worker					name: "myapex.key",
3300*333d2b36SAndroid Build Coastguard Worker					public_key: "testkey.avbpubkey",
3301*333d2b36SAndroid Build Coastguard Worker					private_key: "testkey.pem",
3302*333d2b36SAndroid Build Coastguard Worker				}
3303*333d2b36SAndroid Build Coastguard Worker				prebuilt_firmware {
3304*333d2b36SAndroid Build Coastguard Worker					name: "myfirmware",
3305*333d2b36SAndroid Build Coastguard Worker					src: "myfirmware.bin",
3306*333d2b36SAndroid Build Coastguard Worker					filename_from_src: true,
3307*333d2b36SAndroid Build Coastguard Worker					`+tc.additionalProp+`
3308*333d2b36SAndroid Build Coastguard Worker				}
3309*333d2b36SAndroid Build Coastguard Worker			`)
3310*333d2b36SAndroid Build Coastguard Worker			ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
3311*333d2b36SAndroid Build Coastguard Worker				"etc/firmware/myfirmware.bin",
3312*333d2b36SAndroid Build Coastguard Worker			})
3313*333d2b36SAndroid Build Coastguard Worker		})
3314*333d2b36SAndroid Build Coastguard Worker	}
3315*333d2b36SAndroid Build Coastguard Worker}
3316*333d2b36SAndroid Build Coastguard Worker
3317*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidMk_VendorApexRequired(t *testing.T) {
3318*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
3319*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
3320*333d2b36SAndroid Build Coastguard Worker		apex {
3321*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
3322*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
3323*333d2b36SAndroid Build Coastguard Worker			vendor: true,
3324*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib"],
3325*333d2b36SAndroid Build Coastguard Worker			updatable: false,
3326*333d2b36SAndroid Build Coastguard Worker		}
3327*333d2b36SAndroid Build Coastguard Worker
3328*333d2b36SAndroid Build Coastguard Worker		apex_key {
3329*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
3330*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
3331*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
3332*333d2b36SAndroid Build Coastguard Worker		}
3333*333d2b36SAndroid Build Coastguard Worker
3334*333d2b36SAndroid Build Coastguard Worker		cc_library {
3335*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
3336*333d2b36SAndroid Build Coastguard Worker			vendor_available: true,
3337*333d2b36SAndroid Build Coastguard Worker		}
3338*333d2b36SAndroid Build Coastguard Worker	`)
3339*333d2b36SAndroid Build Coastguard Worker
3340*333d2b36SAndroid Build Coastguard Worker	apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
3341*333d2b36SAndroid Build Coastguard Worker	data := android.AndroidMkDataForTest(t, ctx, apexBundle)
3342*333d2b36SAndroid Build Coastguard Worker	name := apexBundle.BaseModuleName()
3343*333d2b36SAndroid Build Coastguard Worker	prefix := "TARGET_"
3344*333d2b36SAndroid Build Coastguard Worker	var builder strings.Builder
3345*333d2b36SAndroid Build Coastguard Worker	data.Custom(&builder, name, prefix, "", data)
3346*333d2b36SAndroid Build Coastguard Worker	androidMk := builder.String()
3347*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 libc.vendor libm.vendor libdl.vendor\n")
3348*333d2b36SAndroid Build Coastguard Worker}
3349*333d2b36SAndroid Build Coastguard Worker
3350*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidMkWritesCommonProperties(t *testing.T) {
3351*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
3352*333d2b36SAndroid Build Coastguard Worker		apex {
3353*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
3354*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
3355*333d2b36SAndroid Build Coastguard Worker			vintf_fragments: ["fragment.xml"],
3356*333d2b36SAndroid Build Coastguard Worker			init_rc: ["init.rc"],
3357*333d2b36SAndroid Build Coastguard Worker			updatable: false,
3358*333d2b36SAndroid Build Coastguard Worker		}
3359*333d2b36SAndroid Build Coastguard Worker		apex_key {
3360*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
3361*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
3362*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
3363*333d2b36SAndroid Build Coastguard Worker		}
3364*333d2b36SAndroid Build Coastguard Worker		cc_binary {
3365*333d2b36SAndroid Build Coastguard Worker			name: "mybin",
3366*333d2b36SAndroid Build Coastguard Worker		}
3367*333d2b36SAndroid Build Coastguard Worker	`)
3368*333d2b36SAndroid Build Coastguard Worker
3369*333d2b36SAndroid Build Coastguard Worker	apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
3370*333d2b36SAndroid Build Coastguard Worker	data := android.AndroidMkDataForTest(t, ctx, apexBundle)
3371*333d2b36SAndroid Build Coastguard Worker	name := apexBundle.BaseModuleName()
3372*333d2b36SAndroid Build Coastguard Worker	prefix := "TARGET_"
3373*333d2b36SAndroid Build Coastguard Worker	var builder strings.Builder
3374*333d2b36SAndroid Build Coastguard Worker	data.Custom(&builder, name, prefix, "", data)
3375*333d2b36SAndroid Build Coastguard Worker	androidMk := builder.String()
3376*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
3377*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
3378*333d2b36SAndroid Build Coastguard Worker}
3379*333d2b36SAndroid Build Coastguard Worker
3380*333d2b36SAndroid Build Coastguard Workerfunc TestStaticLinking(t *testing.T) {
3381*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
3382*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
3383*333d2b36SAndroid Build Coastguard Worker		apex {
3384*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
3385*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
3386*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib"],
3387*333d2b36SAndroid Build Coastguard Worker			updatable: false,
3388*333d2b36SAndroid Build Coastguard Worker		}
3389*333d2b36SAndroid Build Coastguard Worker
3390*333d2b36SAndroid Build Coastguard Worker		apex_key {
3391*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
3392*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
3393*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
3394*333d2b36SAndroid Build Coastguard Worker		}
3395*333d2b36SAndroid Build Coastguard Worker
3396*333d2b36SAndroid Build Coastguard Worker		cc_library {
3397*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
3398*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
3399*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
3400*333d2b36SAndroid Build Coastguard Worker			stl: "none",
3401*333d2b36SAndroid Build Coastguard Worker			stubs: {
3402*333d2b36SAndroid Build Coastguard Worker				versions: ["1", "2", "3"],
3403*333d2b36SAndroid Build Coastguard Worker			},
3404*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
3405*333d2b36SAndroid Build Coastguard Worker		}
3406*333d2b36SAndroid Build Coastguard Worker
3407*333d2b36SAndroid Build Coastguard Worker		cc_binary {
3408*333d2b36SAndroid Build Coastguard Worker			name: "not_in_apex",
3409*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
3410*333d2b36SAndroid Build Coastguard Worker			static_libs: ["mylib"],
3411*333d2b36SAndroid Build Coastguard Worker			static_executable: true,
3412*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
3413*333d2b36SAndroid Build Coastguard Worker			stl: "none",
3414*333d2b36SAndroid Build Coastguard Worker		}
3415*333d2b36SAndroid Build Coastguard Worker	`)
3416*333d2b36SAndroid Build Coastguard Worker
3417*333d2b36SAndroid Build Coastguard Worker	ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
3418*333d2b36SAndroid Build Coastguard Worker
3419*333d2b36SAndroid Build Coastguard Worker	// Ensure that not_in_apex is linking with the static variant of mylib
3420*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
3421*333d2b36SAndroid Build Coastguard Worker}
3422*333d2b36SAndroid Build Coastguard Worker
3423*333d2b36SAndroid Build Coastguard Workerfunc TestKeys(t *testing.T) {
3424*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
3425*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
3426*333d2b36SAndroid Build Coastguard Worker		apex {
3427*333d2b36SAndroid Build Coastguard Worker			name: "myapex_keytest",
3428*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
3429*333d2b36SAndroid Build Coastguard Worker			certificate: ":myapex.certificate",
3430*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib"],
3431*333d2b36SAndroid Build Coastguard Worker			file_contexts: ":myapex-file_contexts",
3432*333d2b36SAndroid Build Coastguard Worker			updatable: false,
3433*333d2b36SAndroid Build Coastguard Worker		}
3434*333d2b36SAndroid Build Coastguard Worker
3435*333d2b36SAndroid Build Coastguard Worker		cc_library {
3436*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
3437*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
3438*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
3439*333d2b36SAndroid Build Coastguard Worker			stl: "none",
3440*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex_keytest" ],
3441*333d2b36SAndroid Build Coastguard Worker		}
3442*333d2b36SAndroid Build Coastguard Worker
3443*333d2b36SAndroid Build Coastguard Worker		apex_key {
3444*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
3445*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
3446*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
3447*333d2b36SAndroid Build Coastguard Worker		}
3448*333d2b36SAndroid Build Coastguard Worker
3449*333d2b36SAndroid Build Coastguard Worker		android_app_certificate {
3450*333d2b36SAndroid Build Coastguard Worker			name: "myapex.certificate",
3451*333d2b36SAndroid Build Coastguard Worker			certificate: "testkey",
3452*333d2b36SAndroid Build Coastguard Worker		}
3453*333d2b36SAndroid Build Coastguard Worker
3454*333d2b36SAndroid Build Coastguard Worker		android_app_certificate {
3455*333d2b36SAndroid Build Coastguard Worker			name: "myapex.certificate.override",
3456*333d2b36SAndroid Build Coastguard Worker			certificate: "testkey.override",
3457*333d2b36SAndroid Build Coastguard Worker		}
3458*333d2b36SAndroid Build Coastguard Worker
3459*333d2b36SAndroid Build Coastguard Worker	`)
3460*333d2b36SAndroid Build Coastguard Worker
3461*333d2b36SAndroid Build Coastguard Worker	// check the APEX keys
3462*333d2b36SAndroid Build Coastguard Worker	keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3463*333d2b36SAndroid Build Coastguard Worker
3464*333d2b36SAndroid Build Coastguard Worker	if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3465*333d2b36SAndroid Build Coastguard Worker		t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
3466*333d2b36SAndroid Build Coastguard Worker			"vendor/foo/devkeys/testkey.avbpubkey")
3467*333d2b36SAndroid Build Coastguard Worker	}
3468*333d2b36SAndroid Build Coastguard Worker	if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3469*333d2b36SAndroid Build Coastguard Worker		t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
3470*333d2b36SAndroid Build Coastguard Worker			"vendor/foo/devkeys/testkey.pem")
3471*333d2b36SAndroid Build Coastguard Worker	}
3472*333d2b36SAndroid Build Coastguard Worker
3473*333d2b36SAndroid Build Coastguard Worker	// check the APK certs. It should be overridden to myapex.certificate.override
3474*333d2b36SAndroid Build Coastguard Worker	certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
3475*333d2b36SAndroid Build Coastguard Worker	if certs != "testkey.override.x509.pem testkey.override.pk8" {
3476*333d2b36SAndroid Build Coastguard Worker		t.Errorf("cert and private key %q are not %q", certs,
3477*333d2b36SAndroid Build Coastguard Worker			"testkey.override.509.pem testkey.override.pk8")
3478*333d2b36SAndroid Build Coastguard Worker	}
3479*333d2b36SAndroid Build Coastguard Worker}
3480*333d2b36SAndroid Build Coastguard Worker
3481*333d2b36SAndroid Build Coastguard Workerfunc TestCertificate(t *testing.T) {
3482*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
3483*333d2b36SAndroid Build Coastguard Worker	t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
3484*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
3485*333d2b36SAndroid Build Coastguard Worker		ctx := testApex(t, `
3486*333d2b36SAndroid Build Coastguard Worker			apex {
3487*333d2b36SAndroid Build Coastguard Worker				name: "myapex",
3488*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
3489*333d2b36SAndroid Build Coastguard Worker				updatable: false,
3490*333d2b36SAndroid Build Coastguard Worker			}
3491*333d2b36SAndroid Build Coastguard Worker			apex_key {
3492*333d2b36SAndroid Build Coastguard Worker				name: "myapex.key",
3493*333d2b36SAndroid Build Coastguard Worker				public_key: "testkey.avbpubkey",
3494*333d2b36SAndroid Build Coastguard Worker				private_key: "testkey.pem",
3495*333d2b36SAndroid Build Coastguard Worker			}`)
3496*333d2b36SAndroid Build Coastguard Worker		rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
3497*333d2b36SAndroid Build Coastguard Worker		expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3498*333d2b36SAndroid Build Coastguard Worker		if actual := rule.Args["certificates"]; actual != expected {
3499*333d2b36SAndroid Build Coastguard Worker			t.Errorf("certificates should be %q, not %q", expected, actual)
3500*333d2b36SAndroid Build Coastguard Worker		}
3501*333d2b36SAndroid Build Coastguard Worker	})
3502*333d2b36SAndroid Build Coastguard Worker	t.Run("override when unspecified", func(t *testing.T) {
3503*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
3504*333d2b36SAndroid Build Coastguard Worker		ctx := testApex(t, `
3505*333d2b36SAndroid Build Coastguard Worker			apex {
3506*333d2b36SAndroid Build Coastguard Worker				name: "myapex_keytest",
3507*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
3508*333d2b36SAndroid Build Coastguard Worker				file_contexts: ":myapex-file_contexts",
3509*333d2b36SAndroid Build Coastguard Worker				updatable: false,
3510*333d2b36SAndroid Build Coastguard Worker			}
3511*333d2b36SAndroid Build Coastguard Worker			apex_key {
3512*333d2b36SAndroid Build Coastguard Worker				name: "myapex.key",
3513*333d2b36SAndroid Build Coastguard Worker				public_key: "testkey.avbpubkey",
3514*333d2b36SAndroid Build Coastguard Worker				private_key: "testkey.pem",
3515*333d2b36SAndroid Build Coastguard Worker			}
3516*333d2b36SAndroid Build Coastguard Worker			android_app_certificate {
3517*333d2b36SAndroid Build Coastguard Worker				name: "myapex.certificate.override",
3518*333d2b36SAndroid Build Coastguard Worker				certificate: "testkey.override",
3519*333d2b36SAndroid Build Coastguard Worker			}`)
3520*333d2b36SAndroid Build Coastguard Worker		rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
3521*333d2b36SAndroid Build Coastguard Worker		expected := "testkey.override.x509.pem testkey.override.pk8"
3522*333d2b36SAndroid Build Coastguard Worker		if actual := rule.Args["certificates"]; actual != expected {
3523*333d2b36SAndroid Build Coastguard Worker			t.Errorf("certificates should be %q, not %q", expected, actual)
3524*333d2b36SAndroid Build Coastguard Worker		}
3525*333d2b36SAndroid Build Coastguard Worker	})
3526*333d2b36SAndroid Build Coastguard Worker	t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
3527*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
3528*333d2b36SAndroid Build Coastguard Worker		ctx := testApex(t, `
3529*333d2b36SAndroid Build Coastguard Worker			apex {
3530*333d2b36SAndroid Build Coastguard Worker				name: "myapex",
3531*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
3532*333d2b36SAndroid Build Coastguard Worker				certificate: ":myapex.certificate",
3533*333d2b36SAndroid Build Coastguard Worker				updatable: false,
3534*333d2b36SAndroid Build Coastguard Worker			}
3535*333d2b36SAndroid Build Coastguard Worker			apex_key {
3536*333d2b36SAndroid Build Coastguard Worker				name: "myapex.key",
3537*333d2b36SAndroid Build Coastguard Worker				public_key: "testkey.avbpubkey",
3538*333d2b36SAndroid Build Coastguard Worker				private_key: "testkey.pem",
3539*333d2b36SAndroid Build Coastguard Worker			}
3540*333d2b36SAndroid Build Coastguard Worker			android_app_certificate {
3541*333d2b36SAndroid Build Coastguard Worker				name: "myapex.certificate",
3542*333d2b36SAndroid Build Coastguard Worker				certificate: "testkey",
3543*333d2b36SAndroid Build Coastguard Worker			}`)
3544*333d2b36SAndroid Build Coastguard Worker		rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
3545*333d2b36SAndroid Build Coastguard Worker		expected := "testkey.x509.pem testkey.pk8"
3546*333d2b36SAndroid Build Coastguard Worker		if actual := rule.Args["certificates"]; actual != expected {
3547*333d2b36SAndroid Build Coastguard Worker			t.Errorf("certificates should be %q, not %q", expected, actual)
3548*333d2b36SAndroid Build Coastguard Worker		}
3549*333d2b36SAndroid Build Coastguard Worker	})
3550*333d2b36SAndroid Build Coastguard Worker	t.Run("override when specifiec as <:module>", func(t *testing.T) {
3551*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
3552*333d2b36SAndroid Build Coastguard Worker		ctx := testApex(t, `
3553*333d2b36SAndroid Build Coastguard Worker			apex {
3554*333d2b36SAndroid Build Coastguard Worker				name: "myapex_keytest",
3555*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
3556*333d2b36SAndroid Build Coastguard Worker				file_contexts: ":myapex-file_contexts",
3557*333d2b36SAndroid Build Coastguard Worker				certificate: ":myapex.certificate",
3558*333d2b36SAndroid Build Coastguard Worker				updatable: false,
3559*333d2b36SAndroid Build Coastguard Worker			}
3560*333d2b36SAndroid Build Coastguard Worker			apex_key {
3561*333d2b36SAndroid Build Coastguard Worker				name: "myapex.key",
3562*333d2b36SAndroid Build Coastguard Worker				public_key: "testkey.avbpubkey",
3563*333d2b36SAndroid Build Coastguard Worker				private_key: "testkey.pem",
3564*333d2b36SAndroid Build Coastguard Worker			}
3565*333d2b36SAndroid Build Coastguard Worker			android_app_certificate {
3566*333d2b36SAndroid Build Coastguard Worker				name: "myapex.certificate.override",
3567*333d2b36SAndroid Build Coastguard Worker				certificate: "testkey.override",
3568*333d2b36SAndroid Build Coastguard Worker			}`)
3569*333d2b36SAndroid Build Coastguard Worker		rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
3570*333d2b36SAndroid Build Coastguard Worker		expected := "testkey.override.x509.pem testkey.override.pk8"
3571*333d2b36SAndroid Build Coastguard Worker		if actual := rule.Args["certificates"]; actual != expected {
3572*333d2b36SAndroid Build Coastguard Worker			t.Errorf("certificates should be %q, not %q", expected, actual)
3573*333d2b36SAndroid Build Coastguard Worker		}
3574*333d2b36SAndroid Build Coastguard Worker	})
3575*333d2b36SAndroid Build Coastguard Worker	t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
3576*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
3577*333d2b36SAndroid Build Coastguard Worker		ctx := testApex(t, `
3578*333d2b36SAndroid Build Coastguard Worker			apex {
3579*333d2b36SAndroid Build Coastguard Worker				name: "myapex",
3580*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
3581*333d2b36SAndroid Build Coastguard Worker				certificate: "testkey",
3582*333d2b36SAndroid Build Coastguard Worker				updatable: false,
3583*333d2b36SAndroid Build Coastguard Worker			}
3584*333d2b36SAndroid Build Coastguard Worker			apex_key {
3585*333d2b36SAndroid Build Coastguard Worker				name: "myapex.key",
3586*333d2b36SAndroid Build Coastguard Worker				public_key: "testkey.avbpubkey",
3587*333d2b36SAndroid Build Coastguard Worker				private_key: "testkey.pem",
3588*333d2b36SAndroid Build Coastguard Worker			}`)
3589*333d2b36SAndroid Build Coastguard Worker		rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
3590*333d2b36SAndroid Build Coastguard Worker		expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3591*333d2b36SAndroid Build Coastguard Worker		if actual := rule.Args["certificates"]; actual != expected {
3592*333d2b36SAndroid Build Coastguard Worker			t.Errorf("certificates should be %q, not %q", expected, actual)
3593*333d2b36SAndroid Build Coastguard Worker		}
3594*333d2b36SAndroid Build Coastguard Worker	})
3595*333d2b36SAndroid Build Coastguard Worker	t.Run("override when specified as <name>", func(t *testing.T) {
3596*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
3597*333d2b36SAndroid Build Coastguard Worker		ctx := testApex(t, `
3598*333d2b36SAndroid Build Coastguard Worker			apex {
3599*333d2b36SAndroid Build Coastguard Worker				name: "myapex_keytest",
3600*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
3601*333d2b36SAndroid Build Coastguard Worker				file_contexts: ":myapex-file_contexts",
3602*333d2b36SAndroid Build Coastguard Worker				certificate: "testkey",
3603*333d2b36SAndroid Build Coastguard Worker				updatable: false,
3604*333d2b36SAndroid Build Coastguard Worker			}
3605*333d2b36SAndroid Build Coastguard Worker			apex_key {
3606*333d2b36SAndroid Build Coastguard Worker				name: "myapex.key",
3607*333d2b36SAndroid Build Coastguard Worker				public_key: "testkey.avbpubkey",
3608*333d2b36SAndroid Build Coastguard Worker				private_key: "testkey.pem",
3609*333d2b36SAndroid Build Coastguard Worker			}
3610*333d2b36SAndroid Build Coastguard Worker			android_app_certificate {
3611*333d2b36SAndroid Build Coastguard Worker				name: "myapex.certificate.override",
3612*333d2b36SAndroid Build Coastguard Worker				certificate: "testkey.override",
3613*333d2b36SAndroid Build Coastguard Worker			}`)
3614*333d2b36SAndroid Build Coastguard Worker		rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
3615*333d2b36SAndroid Build Coastguard Worker		expected := "testkey.override.x509.pem testkey.override.pk8"
3616*333d2b36SAndroid Build Coastguard Worker		if actual := rule.Args["certificates"]; actual != expected {
3617*333d2b36SAndroid Build Coastguard Worker			t.Errorf("certificates should be %q, not %q", expected, actual)
3618*333d2b36SAndroid Build Coastguard Worker		}
3619*333d2b36SAndroid Build Coastguard Worker	})
3620*333d2b36SAndroid Build Coastguard Worker}
3621*333d2b36SAndroid Build Coastguard Worker
3622*333d2b36SAndroid Build Coastguard Workerfunc TestMacro(t *testing.T) {
3623*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
3624*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
3625*333d2b36SAndroid Build Coastguard Worker		apex {
3626*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
3627*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
3628*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib", "mylib2"],
3629*333d2b36SAndroid Build Coastguard Worker			updatable: false,
3630*333d2b36SAndroid Build Coastguard Worker		}
3631*333d2b36SAndroid Build Coastguard Worker
3632*333d2b36SAndroid Build Coastguard Worker		apex {
3633*333d2b36SAndroid Build Coastguard Worker			name: "otherapex",
3634*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
3635*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib", "mylib2"],
3636*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
3637*333d2b36SAndroid Build Coastguard Worker		}
3638*333d2b36SAndroid Build Coastguard Worker
3639*333d2b36SAndroid Build Coastguard Worker		apex_key {
3640*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
3641*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
3642*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
3643*333d2b36SAndroid Build Coastguard Worker		}
3644*333d2b36SAndroid Build Coastguard Worker
3645*333d2b36SAndroid Build Coastguard Worker		cc_library {
3646*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
3647*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
3648*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
3649*333d2b36SAndroid Build Coastguard Worker			stl: "none",
3650*333d2b36SAndroid Build Coastguard Worker			apex_available: [
3651*333d2b36SAndroid Build Coastguard Worker				"myapex",
3652*333d2b36SAndroid Build Coastguard Worker				"otherapex",
3653*333d2b36SAndroid Build Coastguard Worker			],
3654*333d2b36SAndroid Build Coastguard Worker			recovery_available: true,
3655*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
3656*333d2b36SAndroid Build Coastguard Worker		}
3657*333d2b36SAndroid Build Coastguard Worker		cc_library {
3658*333d2b36SAndroid Build Coastguard Worker			name: "mylib2",
3659*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
3660*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
3661*333d2b36SAndroid Build Coastguard Worker			stl: "none",
3662*333d2b36SAndroid Build Coastguard Worker			apex_available: [
3663*333d2b36SAndroid Build Coastguard Worker				"myapex",
3664*333d2b36SAndroid Build Coastguard Worker				"otherapex",
3665*333d2b36SAndroid Build Coastguard Worker			],
3666*333d2b36SAndroid Build Coastguard Worker			static_libs: ["mylib3"],
3667*333d2b36SAndroid Build Coastguard Worker			recovery_available: true,
3668*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
3669*333d2b36SAndroid Build Coastguard Worker		}
3670*333d2b36SAndroid Build Coastguard Worker		cc_library {
3671*333d2b36SAndroid Build Coastguard Worker			name: "mylib3",
3672*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
3673*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
3674*333d2b36SAndroid Build Coastguard Worker			stl: "none",
3675*333d2b36SAndroid Build Coastguard Worker			apex_available: [
3676*333d2b36SAndroid Build Coastguard Worker				"myapex",
3677*333d2b36SAndroid Build Coastguard Worker				"otherapex",
3678*333d2b36SAndroid Build Coastguard Worker			],
3679*333d2b36SAndroid Build Coastguard Worker			recovery_available: true,
3680*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
3681*333d2b36SAndroid Build Coastguard Worker		}
3682*333d2b36SAndroid Build Coastguard Worker	`)
3683*333d2b36SAndroid Build Coastguard Worker
3684*333d2b36SAndroid Build Coastguard Worker	// non-APEX variant does not have __ANDROID_APEX__ defined
3685*333d2b36SAndroid Build Coastguard Worker	mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3686*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3687*333d2b36SAndroid Build Coastguard Worker
3688*333d2b36SAndroid Build Coastguard Worker	// APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
3689*333d2b36SAndroid Build Coastguard Worker	mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
3690*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3691*333d2b36SAndroid Build Coastguard Worker
3692*333d2b36SAndroid Build Coastguard Worker	// APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
3693*333d2b36SAndroid Build Coastguard Worker	mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
3694*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3695*333d2b36SAndroid Build Coastguard Worker
3696*333d2b36SAndroid Build Coastguard Worker	// When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3697*333d2b36SAndroid Build Coastguard Worker	// each variant defines additional macros to distinguish which apex variant it is built for
3698*333d2b36SAndroid Build Coastguard Worker
3699*333d2b36SAndroid Build Coastguard Worker	// non-APEX variant does not have __ANDROID_APEX__ defined
3700*333d2b36SAndroid Build Coastguard Worker	mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3701*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3702*333d2b36SAndroid Build Coastguard Worker
3703*333d2b36SAndroid Build Coastguard Worker	// recovery variant does not set __ANDROID_APEX__
3704*333d2b36SAndroid Build Coastguard Worker	mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3705*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3706*333d2b36SAndroid Build Coastguard Worker
3707*333d2b36SAndroid Build Coastguard Worker	// non-APEX variant does not have __ANDROID_APEX__ defined
3708*333d2b36SAndroid Build Coastguard Worker	mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3709*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3710*333d2b36SAndroid Build Coastguard Worker
3711*333d2b36SAndroid Build Coastguard Worker	// recovery variant does not set __ANDROID_APEX__
3712*333d2b36SAndroid Build Coastguard Worker	mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3713*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3714*333d2b36SAndroid Build Coastguard Worker}
3715*333d2b36SAndroid Build Coastguard Worker
3716*333d2b36SAndroid Build Coastguard Workerfunc TestHeaderLibsDependency(t *testing.T) {
3717*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
3718*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
3719*333d2b36SAndroid Build Coastguard Worker		apex {
3720*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
3721*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
3722*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib"],
3723*333d2b36SAndroid Build Coastguard Worker			updatable: false,
3724*333d2b36SAndroid Build Coastguard Worker		}
3725*333d2b36SAndroid Build Coastguard Worker
3726*333d2b36SAndroid Build Coastguard Worker		apex_key {
3727*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
3728*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
3729*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
3730*333d2b36SAndroid Build Coastguard Worker		}
3731*333d2b36SAndroid Build Coastguard Worker
3732*333d2b36SAndroid Build Coastguard Worker		cc_library_headers {
3733*333d2b36SAndroid Build Coastguard Worker			name: "mylib_headers",
3734*333d2b36SAndroid Build Coastguard Worker			export_include_dirs: ["my_include"],
3735*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
3736*333d2b36SAndroid Build Coastguard Worker			stl: "none",
3737*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
3738*333d2b36SAndroid Build Coastguard Worker		}
3739*333d2b36SAndroid Build Coastguard Worker
3740*333d2b36SAndroid Build Coastguard Worker		cc_library {
3741*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
3742*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
3743*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
3744*333d2b36SAndroid Build Coastguard Worker			stl: "none",
3745*333d2b36SAndroid Build Coastguard Worker			header_libs: ["mylib_headers"],
3746*333d2b36SAndroid Build Coastguard Worker			export_header_lib_headers: ["mylib_headers"],
3747*333d2b36SAndroid Build Coastguard Worker			stubs: {
3748*333d2b36SAndroid Build Coastguard Worker				versions: ["1", "2", "3"],
3749*333d2b36SAndroid Build Coastguard Worker			},
3750*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
3751*333d2b36SAndroid Build Coastguard Worker		}
3752*333d2b36SAndroid Build Coastguard Worker
3753*333d2b36SAndroid Build Coastguard Worker		cc_library {
3754*333d2b36SAndroid Build Coastguard Worker			name: "otherlib",
3755*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
3756*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
3757*333d2b36SAndroid Build Coastguard Worker			stl: "none",
3758*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["mylib"],
3759*333d2b36SAndroid Build Coastguard Worker		}
3760*333d2b36SAndroid Build Coastguard Worker	`)
3761*333d2b36SAndroid Build Coastguard Worker
3762*333d2b36SAndroid Build Coastguard Worker	cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3763*333d2b36SAndroid Build Coastguard Worker
3764*333d2b36SAndroid Build Coastguard Worker	// Ensure that the include path of the header lib is exported to 'otherlib'
3765*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, cFlags, "-Imy_include")
3766*333d2b36SAndroid Build Coastguard Worker}
3767*333d2b36SAndroid Build Coastguard Worker
3768*333d2b36SAndroid Build Coastguard Workertype fileInApex struct {
3769*333d2b36SAndroid Build Coastguard Worker	path   string // path in apex
3770*333d2b36SAndroid Build Coastguard Worker	src    string // src path
3771*333d2b36SAndroid Build Coastguard Worker	isLink bool
3772*333d2b36SAndroid Build Coastguard Worker}
3773*333d2b36SAndroid Build Coastguard Worker
3774*333d2b36SAndroid Build Coastguard Workerfunc (f fileInApex) String() string {
3775*333d2b36SAndroid Build Coastguard Worker	return f.src + ":" + f.path
3776*333d2b36SAndroid Build Coastguard Worker}
3777*333d2b36SAndroid Build Coastguard Worker
3778*333d2b36SAndroid Build Coastguard Workerfunc (f fileInApex) match(expectation string) bool {
3779*333d2b36SAndroid Build Coastguard Worker	parts := strings.Split(expectation, ":")
3780*333d2b36SAndroid Build Coastguard Worker	if len(parts) == 1 {
3781*333d2b36SAndroid Build Coastguard Worker		match, _ := path.Match(parts[0], f.path)
3782*333d2b36SAndroid Build Coastguard Worker		return match
3783*333d2b36SAndroid Build Coastguard Worker	}
3784*333d2b36SAndroid Build Coastguard Worker	if len(parts) == 2 {
3785*333d2b36SAndroid Build Coastguard Worker		matchSrc, _ := path.Match(parts[0], f.src)
3786*333d2b36SAndroid Build Coastguard Worker		matchDst, _ := path.Match(parts[1], f.path)
3787*333d2b36SAndroid Build Coastguard Worker		return matchSrc && matchDst
3788*333d2b36SAndroid Build Coastguard Worker	}
3789*333d2b36SAndroid Build Coastguard Worker	panic("invalid expected file specification: " + expectation)
3790*333d2b36SAndroid Build Coastguard Worker}
3791*333d2b36SAndroid Build Coastguard Worker
3792*333d2b36SAndroid Build Coastguard Workerfunc getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
3793*333d2b36SAndroid Build Coastguard Worker	t.Helper()
3794*333d2b36SAndroid Build Coastguard Worker	module := ctx.ModuleForTests(moduleName, variant)
3795*333d2b36SAndroid Build Coastguard Worker	apexRule := module.MaybeRule("apexRule")
3796*333d2b36SAndroid Build Coastguard Worker	apexDir := "/image.apex/"
3797*333d2b36SAndroid Build Coastguard Worker	copyCmds := apexRule.Args["copy_commands"]
3798*333d2b36SAndroid Build Coastguard Worker	var ret []fileInApex
3799*333d2b36SAndroid Build Coastguard Worker	for _, cmd := range strings.Split(copyCmds, "&&") {
3800*333d2b36SAndroid Build Coastguard Worker		cmd = strings.TrimSpace(cmd)
3801*333d2b36SAndroid Build Coastguard Worker		if cmd == "" {
3802*333d2b36SAndroid Build Coastguard Worker			continue
3803*333d2b36SAndroid Build Coastguard Worker		}
3804*333d2b36SAndroid Build Coastguard Worker		terms := strings.Split(cmd, " ")
3805*333d2b36SAndroid Build Coastguard Worker		var dst, src string
3806*333d2b36SAndroid Build Coastguard Worker		var isLink bool
3807*333d2b36SAndroid Build Coastguard Worker		switch terms[0] {
3808*333d2b36SAndroid Build Coastguard Worker		case "mkdir":
3809*333d2b36SAndroid Build Coastguard Worker		case "cp":
3810*333d2b36SAndroid Build Coastguard Worker			if len(terms) != 3 && len(terms) != 4 {
3811*333d2b36SAndroid Build Coastguard Worker				t.Fatal("copyCmds contains invalid cp command", cmd)
3812*333d2b36SAndroid Build Coastguard Worker			}
3813*333d2b36SAndroid Build Coastguard Worker			dst = terms[len(terms)-1]
3814*333d2b36SAndroid Build Coastguard Worker			src = terms[len(terms)-2]
3815*333d2b36SAndroid Build Coastguard Worker			isLink = false
3816*333d2b36SAndroid Build Coastguard Worker		case "ln":
3817*333d2b36SAndroid Build Coastguard Worker			if len(terms) != 3 && len(terms) != 4 {
3818*333d2b36SAndroid Build Coastguard Worker				// ln LINK TARGET or ln -s LINK TARGET
3819*333d2b36SAndroid Build Coastguard Worker				t.Fatal("copyCmds contains invalid ln command", cmd)
3820*333d2b36SAndroid Build Coastguard Worker			}
3821*333d2b36SAndroid Build Coastguard Worker			dst = terms[len(terms)-1]
3822*333d2b36SAndroid Build Coastguard Worker			src = terms[len(terms)-2]
3823*333d2b36SAndroid Build Coastguard Worker			isLink = true
3824*333d2b36SAndroid Build Coastguard Worker		default:
3825*333d2b36SAndroid Build Coastguard Worker			t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3826*333d2b36SAndroid Build Coastguard Worker		}
3827*333d2b36SAndroid Build Coastguard Worker		if dst != "" {
3828*333d2b36SAndroid Build Coastguard Worker			index := strings.Index(dst, apexDir)
3829*333d2b36SAndroid Build Coastguard Worker			if index == -1 {
3830*333d2b36SAndroid Build Coastguard Worker				t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
3831*333d2b36SAndroid Build Coastguard Worker			}
3832*333d2b36SAndroid Build Coastguard Worker			dstFile := dst[index+len(apexDir):]
3833*333d2b36SAndroid Build Coastguard Worker			ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
3834*333d2b36SAndroid Build Coastguard Worker		}
3835*333d2b36SAndroid Build Coastguard Worker	}
3836*333d2b36SAndroid Build Coastguard Worker	return ret
3837*333d2b36SAndroid Build Coastguard Worker}
3838*333d2b36SAndroid Build Coastguard Worker
3839*333d2b36SAndroid Build Coastguard Workerfunc assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
3840*333d2b36SAndroid Build Coastguard Worker	t.Helper()
3841*333d2b36SAndroid Build Coastguard Worker	var failed bool
3842*333d2b36SAndroid Build Coastguard Worker	var surplus []string
3843*333d2b36SAndroid Build Coastguard Worker	filesMatched := make(map[string]bool)
3844*333d2b36SAndroid Build Coastguard Worker	for _, file := range actualFiles {
3845*333d2b36SAndroid Build Coastguard Worker		matchFound := false
3846*333d2b36SAndroid Build Coastguard Worker		for _, expected := range expectedFiles {
3847*333d2b36SAndroid Build Coastguard Worker			if file.match(expected) {
3848*333d2b36SAndroid Build Coastguard Worker				matchFound = true
3849*333d2b36SAndroid Build Coastguard Worker				filesMatched[expected] = true
3850*333d2b36SAndroid Build Coastguard Worker				break
3851*333d2b36SAndroid Build Coastguard Worker			}
3852*333d2b36SAndroid Build Coastguard Worker		}
3853*333d2b36SAndroid Build Coastguard Worker		if !matchFound {
3854*333d2b36SAndroid Build Coastguard Worker			surplus = append(surplus, file.String())
3855*333d2b36SAndroid Build Coastguard Worker		}
3856*333d2b36SAndroid Build Coastguard Worker	}
3857*333d2b36SAndroid Build Coastguard Worker
3858*333d2b36SAndroid Build Coastguard Worker	if len(surplus) > 0 {
3859*333d2b36SAndroid Build Coastguard Worker		sort.Strings(surplus)
3860*333d2b36SAndroid Build Coastguard Worker		t.Log("surplus files", surplus)
3861*333d2b36SAndroid Build Coastguard Worker		failed = true
3862*333d2b36SAndroid Build Coastguard Worker	}
3863*333d2b36SAndroid Build Coastguard Worker
3864*333d2b36SAndroid Build Coastguard Worker	if len(expectedFiles) > len(filesMatched) {
3865*333d2b36SAndroid Build Coastguard Worker		var missing []string
3866*333d2b36SAndroid Build Coastguard Worker		for _, expected := range expectedFiles {
3867*333d2b36SAndroid Build Coastguard Worker			if !filesMatched[expected] {
3868*333d2b36SAndroid Build Coastguard Worker				missing = append(missing, expected)
3869*333d2b36SAndroid Build Coastguard Worker			}
3870*333d2b36SAndroid Build Coastguard Worker		}
3871*333d2b36SAndroid Build Coastguard Worker		sort.Strings(missing)
3872*333d2b36SAndroid Build Coastguard Worker		t.Log("missing files", missing)
3873*333d2b36SAndroid Build Coastguard Worker		failed = true
3874*333d2b36SAndroid Build Coastguard Worker	}
3875*333d2b36SAndroid Build Coastguard Worker	if failed {
3876*333d2b36SAndroid Build Coastguard Worker		t.Fail()
3877*333d2b36SAndroid Build Coastguard Worker	}
3878*333d2b36SAndroid Build Coastguard Worker}
3879*333d2b36SAndroid Build Coastguard Worker
3880*333d2b36SAndroid Build Coastguard Workerfunc ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3881*333d2b36SAndroid Build Coastguard Worker	assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3882*333d2b36SAndroid Build Coastguard Worker}
3883*333d2b36SAndroid Build Coastguard Worker
3884*333d2b36SAndroid Build Coastguard Workerfunc ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
3885*333d2b36SAndroid Build Coastguard Worker	deapexer := ctx.ModuleForTests(moduleName, variant).Description("deapex")
3886*333d2b36SAndroid Build Coastguard Worker	outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3887*333d2b36SAndroid Build Coastguard Worker	if deapexer.Output != nil {
3888*333d2b36SAndroid Build Coastguard Worker		outputs = append(outputs, deapexer.Output.String())
3889*333d2b36SAndroid Build Coastguard Worker	}
3890*333d2b36SAndroid Build Coastguard Worker	for _, output := range deapexer.ImplicitOutputs {
3891*333d2b36SAndroid Build Coastguard Worker		outputs = append(outputs, output.String())
3892*333d2b36SAndroid Build Coastguard Worker	}
3893*333d2b36SAndroid Build Coastguard Worker	actualFiles := make([]fileInApex, 0, len(outputs))
3894*333d2b36SAndroid Build Coastguard Worker	for _, output := range outputs {
3895*333d2b36SAndroid Build Coastguard Worker		dir := "/deapexer/"
3896*333d2b36SAndroid Build Coastguard Worker		pos := strings.LastIndex(output, dir)
3897*333d2b36SAndroid Build Coastguard Worker		if pos == -1 {
3898*333d2b36SAndroid Build Coastguard Worker			t.Fatal("Unknown deapexer output ", output)
3899*333d2b36SAndroid Build Coastguard Worker		}
3900*333d2b36SAndroid Build Coastguard Worker		path := output[pos+len(dir):]
3901*333d2b36SAndroid Build Coastguard Worker		actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3902*333d2b36SAndroid Build Coastguard Worker	}
3903*333d2b36SAndroid Build Coastguard Worker	assertFileListEquals(t, files, actualFiles)
3904*333d2b36SAndroid Build Coastguard Worker}
3905*333d2b36SAndroid Build Coastguard Worker
3906*333d2b36SAndroid Build Coastguard Workerfunc vndkLibrariesTxtFiles(vers ...string) (result string) {
3907*333d2b36SAndroid Build Coastguard Worker	for _, v := range vers {
3908*333d2b36SAndroid Build Coastguard Worker		for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
3909*333d2b36SAndroid Build Coastguard Worker			result += `
3910*333d2b36SAndroid Build Coastguard Worker					prebuilt_etc {
3911*333d2b36SAndroid Build Coastguard Worker						name: "` + txt + `.libraries.` + v + `.txt",
3912*333d2b36SAndroid Build Coastguard Worker						src: "dummy.txt",
3913*333d2b36SAndroid Build Coastguard Worker					}
3914*333d2b36SAndroid Build Coastguard Worker				`
3915*333d2b36SAndroid Build Coastguard Worker		}
3916*333d2b36SAndroid Build Coastguard Worker	}
3917*333d2b36SAndroid Build Coastguard Worker	return
3918*333d2b36SAndroid Build Coastguard Worker}
3919*333d2b36SAndroid Build Coastguard Worker
3920*333d2b36SAndroid Build Coastguard Workerfunc TestVndkApexVersion(t *testing.T) {
3921*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
3922*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
3923*333d2b36SAndroid Build Coastguard Worker		apex_vndk {
3924*333d2b36SAndroid Build Coastguard Worker			name: "com.android.vndk.v27",
3925*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
3926*333d2b36SAndroid Build Coastguard Worker			file_contexts: ":myapex-file_contexts",
3927*333d2b36SAndroid Build Coastguard Worker			vndk_version: "27",
3928*333d2b36SAndroid Build Coastguard Worker			updatable: false,
3929*333d2b36SAndroid Build Coastguard Worker		}
3930*333d2b36SAndroid Build Coastguard Worker
3931*333d2b36SAndroid Build Coastguard Worker		apex_key {
3932*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
3933*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
3934*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
3935*333d2b36SAndroid Build Coastguard Worker		}
3936*333d2b36SAndroid Build Coastguard Worker
3937*333d2b36SAndroid Build Coastguard Worker		vndk_prebuilt_shared {
3938*333d2b36SAndroid Build Coastguard Worker			name: "libvndk27",
3939*333d2b36SAndroid Build Coastguard Worker			version: "27",
3940*333d2b36SAndroid Build Coastguard Worker			vendor_available: true,
3941*333d2b36SAndroid Build Coastguard Worker			product_available: true,
3942*333d2b36SAndroid Build Coastguard Worker			vndk: {
3943*333d2b36SAndroid Build Coastguard Worker				enabled: true,
3944*333d2b36SAndroid Build Coastguard Worker			},
3945*333d2b36SAndroid Build Coastguard Worker			target_arch: "arm64",
3946*333d2b36SAndroid Build Coastguard Worker			arch: {
3947*333d2b36SAndroid Build Coastguard Worker				arm: {
3948*333d2b36SAndroid Build Coastguard Worker					srcs: ["libvndk27_arm.so"],
3949*333d2b36SAndroid Build Coastguard Worker				},
3950*333d2b36SAndroid Build Coastguard Worker				arm64: {
3951*333d2b36SAndroid Build Coastguard Worker					srcs: ["libvndk27_arm64.so"],
3952*333d2b36SAndroid Build Coastguard Worker				},
3953*333d2b36SAndroid Build Coastguard Worker			},
3954*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "com.android.vndk.v27" ],
3955*333d2b36SAndroid Build Coastguard Worker		}
3956*333d2b36SAndroid Build Coastguard Worker
3957*333d2b36SAndroid Build Coastguard Worker		vndk_prebuilt_shared {
3958*333d2b36SAndroid Build Coastguard Worker			name: "libvndk27",
3959*333d2b36SAndroid Build Coastguard Worker			version: "27",
3960*333d2b36SAndroid Build Coastguard Worker			vendor_available: true,
3961*333d2b36SAndroid Build Coastguard Worker			product_available: true,
3962*333d2b36SAndroid Build Coastguard Worker			vndk: {
3963*333d2b36SAndroid Build Coastguard Worker				enabled: true,
3964*333d2b36SAndroid Build Coastguard Worker			},
3965*333d2b36SAndroid Build Coastguard Worker			target_arch: "x86_64",
3966*333d2b36SAndroid Build Coastguard Worker			arch: {
3967*333d2b36SAndroid Build Coastguard Worker				x86: {
3968*333d2b36SAndroid Build Coastguard Worker					srcs: ["libvndk27_x86.so"],
3969*333d2b36SAndroid Build Coastguard Worker				},
3970*333d2b36SAndroid Build Coastguard Worker				x86_64: {
3971*333d2b36SAndroid Build Coastguard Worker					srcs: ["libvndk27_x86_64.so"],
3972*333d2b36SAndroid Build Coastguard Worker				},
3973*333d2b36SAndroid Build Coastguard Worker			},
3974*333d2b36SAndroid Build Coastguard Worker		}
3975*333d2b36SAndroid Build Coastguard Worker		`+vndkLibrariesTxtFiles("27"),
3976*333d2b36SAndroid Build Coastguard Worker		withFiles(map[string][]byte{
3977*333d2b36SAndroid Build Coastguard Worker			"libvndk27_arm.so":    nil,
3978*333d2b36SAndroid Build Coastguard Worker			"libvndk27_arm64.so":  nil,
3979*333d2b36SAndroid Build Coastguard Worker			"libvndk27_x86.so":    nil,
3980*333d2b36SAndroid Build Coastguard Worker			"libvndk27_x86_64.so": nil,
3981*333d2b36SAndroid Build Coastguard Worker		}))
3982*333d2b36SAndroid Build Coastguard Worker
3983*333d2b36SAndroid Build Coastguard Worker	ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
3984*333d2b36SAndroid Build Coastguard Worker		"lib/libvndk27_arm.so",
3985*333d2b36SAndroid Build Coastguard Worker		"lib64/libvndk27_arm64.so",
3986*333d2b36SAndroid Build Coastguard Worker		"etc/*",
3987*333d2b36SAndroid Build Coastguard Worker	})
3988*333d2b36SAndroid Build Coastguard Worker}
3989*333d2b36SAndroid Build Coastguard Worker
3990*333d2b36SAndroid Build Coastguard Workerfunc TestVndkApexNameRule(t *testing.T) {
3991*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
3992*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
3993*333d2b36SAndroid Build Coastguard Worker		apex_vndk {
3994*333d2b36SAndroid Build Coastguard Worker			name: "com.android.vndk.v29",
3995*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
3996*333d2b36SAndroid Build Coastguard Worker			file_contexts: ":myapex-file_contexts",
3997*333d2b36SAndroid Build Coastguard Worker			vndk_version: "29",
3998*333d2b36SAndroid Build Coastguard Worker			updatable: false,
3999*333d2b36SAndroid Build Coastguard Worker		}
4000*333d2b36SAndroid Build Coastguard Worker		apex_vndk {
4001*333d2b36SAndroid Build Coastguard Worker			name: "com.android.vndk.v28",
4002*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
4003*333d2b36SAndroid Build Coastguard Worker			file_contexts: ":myapex-file_contexts",
4004*333d2b36SAndroid Build Coastguard Worker			vndk_version: "28",
4005*333d2b36SAndroid Build Coastguard Worker			updatable: false,
4006*333d2b36SAndroid Build Coastguard Worker		}
4007*333d2b36SAndroid Build Coastguard Worker		apex_key {
4008*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
4009*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
4010*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
4011*333d2b36SAndroid Build Coastguard Worker		}`+vndkLibrariesTxtFiles("28", "29"))
4012*333d2b36SAndroid Build Coastguard Worker
4013*333d2b36SAndroid Build Coastguard Worker	assertApexName := func(expected, moduleName string) {
4014*333d2b36SAndroid Build Coastguard Worker		module := ctx.ModuleForTests(moduleName, "android_common")
4015*333d2b36SAndroid Build Coastguard Worker		apexManifestRule := module.Rule("apexManifestRule")
4016*333d2b36SAndroid Build Coastguard Worker		ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
4017*333d2b36SAndroid Build Coastguard Worker	}
4018*333d2b36SAndroid Build Coastguard Worker
4019*333d2b36SAndroid Build Coastguard Worker	assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
4020*333d2b36SAndroid Build Coastguard Worker	assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
4021*333d2b36SAndroid Build Coastguard Worker}
4022*333d2b36SAndroid Build Coastguard Worker
4023*333d2b36SAndroid Build Coastguard Workerfunc TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
4024*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
4025*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
4026*333d2b36SAndroid Build Coastguard Worker		apex_vndk {
4027*333d2b36SAndroid Build Coastguard Worker			name: "com.android.vndk.v30",
4028*333d2b36SAndroid Build Coastguard Worker			key: "com.android.vndk.v30.key",
4029*333d2b36SAndroid Build Coastguard Worker			file_contexts: ":myapex-file_contexts",
4030*333d2b36SAndroid Build Coastguard Worker			native_bridge_supported: true,
4031*333d2b36SAndroid Build Coastguard Worker		}
4032*333d2b36SAndroid Build Coastguard Worker
4033*333d2b36SAndroid Build Coastguard Worker		apex_key {
4034*333d2b36SAndroid Build Coastguard Worker			name: "com.android.vndk.v30.key",
4035*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
4036*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
4037*333d2b36SAndroid Build Coastguard Worker		}
4038*333d2b36SAndroid Build Coastguard Worker
4039*333d2b36SAndroid Build Coastguard Worker		vndk_prebuilt_shared {
4040*333d2b36SAndroid Build Coastguard Worker			name: "libvndk",
4041*333d2b36SAndroid Build Coastguard Worker			version: "30",
4042*333d2b36SAndroid Build Coastguard Worker			target_arch: "arm",
4043*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
4044*333d2b36SAndroid Build Coastguard Worker			vendor_available: true,
4045*333d2b36SAndroid Build Coastguard Worker			product_available: true,
4046*333d2b36SAndroid Build Coastguard Worker			native_bridge_supported: true,
4047*333d2b36SAndroid Build Coastguard Worker			vndk: {
4048*333d2b36SAndroid Build Coastguard Worker				enabled: true,
4049*333d2b36SAndroid Build Coastguard Worker			},
4050*333d2b36SAndroid Build Coastguard Worker		}
4051*333d2b36SAndroid Build Coastguard Worker	`)
4052*333d2b36SAndroid Build Coastguard Worker}
4053*333d2b36SAndroid Build Coastguard Worker
4054*333d2b36SAndroid Build Coastguard Workerfunc TestVndkApexWithBinder32(t *testing.T) {
4055*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
4056*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
4057*333d2b36SAndroid Build Coastguard Worker		apex_vndk {
4058*333d2b36SAndroid Build Coastguard Worker			name: "com.android.vndk.v27",
4059*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
4060*333d2b36SAndroid Build Coastguard Worker			file_contexts: ":myapex-file_contexts",
4061*333d2b36SAndroid Build Coastguard Worker			vndk_version: "27",
4062*333d2b36SAndroid Build Coastguard Worker			updatable: false,
4063*333d2b36SAndroid Build Coastguard Worker		}
4064*333d2b36SAndroid Build Coastguard Worker
4065*333d2b36SAndroid Build Coastguard Worker		apex_key {
4066*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
4067*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
4068*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
4069*333d2b36SAndroid Build Coastguard Worker		}
4070*333d2b36SAndroid Build Coastguard Worker
4071*333d2b36SAndroid Build Coastguard Worker		vndk_prebuilt_shared {
4072*333d2b36SAndroid Build Coastguard Worker			name: "libvndk27",
4073*333d2b36SAndroid Build Coastguard Worker			version: "27",
4074*333d2b36SAndroid Build Coastguard Worker			target_arch: "arm",
4075*333d2b36SAndroid Build Coastguard Worker			vendor_available: true,
4076*333d2b36SAndroid Build Coastguard Worker			product_available: true,
4077*333d2b36SAndroid Build Coastguard Worker			vndk: {
4078*333d2b36SAndroid Build Coastguard Worker				enabled: true,
4079*333d2b36SAndroid Build Coastguard Worker			},
4080*333d2b36SAndroid Build Coastguard Worker			arch: {
4081*333d2b36SAndroid Build Coastguard Worker				arm: {
4082*333d2b36SAndroid Build Coastguard Worker					srcs: ["libvndk27.so"],
4083*333d2b36SAndroid Build Coastguard Worker				}
4084*333d2b36SAndroid Build Coastguard Worker			},
4085*333d2b36SAndroid Build Coastguard Worker		}
4086*333d2b36SAndroid Build Coastguard Worker
4087*333d2b36SAndroid Build Coastguard Worker		vndk_prebuilt_shared {
4088*333d2b36SAndroid Build Coastguard Worker			name: "libvndk27",
4089*333d2b36SAndroid Build Coastguard Worker			version: "27",
4090*333d2b36SAndroid Build Coastguard Worker			target_arch: "arm",
4091*333d2b36SAndroid Build Coastguard Worker			binder32bit: true,
4092*333d2b36SAndroid Build Coastguard Worker			vendor_available: true,
4093*333d2b36SAndroid Build Coastguard Worker			product_available: true,
4094*333d2b36SAndroid Build Coastguard Worker			vndk: {
4095*333d2b36SAndroid Build Coastguard Worker				enabled: true,
4096*333d2b36SAndroid Build Coastguard Worker			},
4097*333d2b36SAndroid Build Coastguard Worker			arch: {
4098*333d2b36SAndroid Build Coastguard Worker				arm: {
4099*333d2b36SAndroid Build Coastguard Worker					srcs: ["libvndk27binder32.so"],
4100*333d2b36SAndroid Build Coastguard Worker				}
4101*333d2b36SAndroid Build Coastguard Worker			},
4102*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "com.android.vndk.v27" ],
4103*333d2b36SAndroid Build Coastguard Worker		}
4104*333d2b36SAndroid Build Coastguard Worker		`+vndkLibrariesTxtFiles("27"),
4105*333d2b36SAndroid Build Coastguard Worker		withFiles(map[string][]byte{
4106*333d2b36SAndroid Build Coastguard Worker			"libvndk27.so":         nil,
4107*333d2b36SAndroid Build Coastguard Worker			"libvndk27binder32.so": nil,
4108*333d2b36SAndroid Build Coastguard Worker		}),
4109*333d2b36SAndroid Build Coastguard Worker		withBinder32bit,
4110*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyConfig(func(config android.Config) {
4111*333d2b36SAndroid Build Coastguard Worker			target := android.Target{
4112*333d2b36SAndroid Build Coastguard Worker				Os: android.Android,
4113*333d2b36SAndroid Build Coastguard Worker				Arch: android.Arch{
4114*333d2b36SAndroid Build Coastguard Worker					ArchType:    android.Arm,
4115*333d2b36SAndroid Build Coastguard Worker					ArchVariant: "armv7-a-neon",
4116*333d2b36SAndroid Build Coastguard Worker					Abi:         []string{"armeabi-v7a"},
4117*333d2b36SAndroid Build Coastguard Worker				},
4118*333d2b36SAndroid Build Coastguard Worker				NativeBridge:             android.NativeBridgeDisabled,
4119*333d2b36SAndroid Build Coastguard Worker				NativeBridgeHostArchName: "",
4120*333d2b36SAndroid Build Coastguard Worker				NativeBridgeRelativePath: "",
4121*333d2b36SAndroid Build Coastguard Worker			}
4122*333d2b36SAndroid Build Coastguard Worker			config.Targets[android.Android] = []android.Target{target}
4123*333d2b36SAndroid Build Coastguard Worker			config.AndroidFirstDeviceTarget = target
4124*333d2b36SAndroid Build Coastguard Worker		}),
4125*333d2b36SAndroid Build Coastguard Worker	)
4126*333d2b36SAndroid Build Coastguard Worker
4127*333d2b36SAndroid Build Coastguard Worker	ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
4128*333d2b36SAndroid Build Coastguard Worker		"lib/libvndk27binder32.so",
4129*333d2b36SAndroid Build Coastguard Worker		"etc/*",
4130*333d2b36SAndroid Build Coastguard Worker	})
4131*333d2b36SAndroid Build Coastguard Worker}
4132*333d2b36SAndroid Build Coastguard Worker
4133*333d2b36SAndroid Build Coastguard Workerfunc TestDependenciesInApexManifest(t *testing.T) {
4134*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
4135*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
4136*333d2b36SAndroid Build Coastguard Worker		apex {
4137*333d2b36SAndroid Build Coastguard Worker			name: "myapex_nodep",
4138*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
4139*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["lib_nodep"],
4140*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "both",
4141*333d2b36SAndroid Build Coastguard Worker			file_contexts: ":myapex-file_contexts",
4142*333d2b36SAndroid Build Coastguard Worker			updatable: false,
4143*333d2b36SAndroid Build Coastguard Worker		}
4144*333d2b36SAndroid Build Coastguard Worker
4145*333d2b36SAndroid Build Coastguard Worker		apex {
4146*333d2b36SAndroid Build Coastguard Worker			name: "myapex_dep",
4147*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
4148*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["lib_dep"],
4149*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "both",
4150*333d2b36SAndroid Build Coastguard Worker			file_contexts: ":myapex-file_contexts",
4151*333d2b36SAndroid Build Coastguard Worker			updatable: false,
4152*333d2b36SAndroid Build Coastguard Worker		}
4153*333d2b36SAndroid Build Coastguard Worker
4154*333d2b36SAndroid Build Coastguard Worker		apex {
4155*333d2b36SAndroid Build Coastguard Worker			name: "myapex_provider",
4156*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
4157*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["libfoo"],
4158*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "both",
4159*333d2b36SAndroid Build Coastguard Worker			file_contexts: ":myapex-file_contexts",
4160*333d2b36SAndroid Build Coastguard Worker			updatable: false,
4161*333d2b36SAndroid Build Coastguard Worker		}
4162*333d2b36SAndroid Build Coastguard Worker
4163*333d2b36SAndroid Build Coastguard Worker		apex {
4164*333d2b36SAndroid Build Coastguard Worker			name: "myapex_selfcontained",
4165*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
4166*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["lib_dep_on_bar", "libbar"],
4167*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "both",
4168*333d2b36SAndroid Build Coastguard Worker			file_contexts: ":myapex-file_contexts",
4169*333d2b36SAndroid Build Coastguard Worker			updatable: false,
4170*333d2b36SAndroid Build Coastguard Worker		}
4171*333d2b36SAndroid Build Coastguard Worker
4172*333d2b36SAndroid Build Coastguard Worker		apex_key {
4173*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
4174*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
4175*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
4176*333d2b36SAndroid Build Coastguard Worker		}
4177*333d2b36SAndroid Build Coastguard Worker
4178*333d2b36SAndroid Build Coastguard Worker		cc_library {
4179*333d2b36SAndroid Build Coastguard Worker			name: "lib_nodep",
4180*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
4181*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
4182*333d2b36SAndroid Build Coastguard Worker			stl: "none",
4183*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex_nodep" ],
4184*333d2b36SAndroid Build Coastguard Worker		}
4185*333d2b36SAndroid Build Coastguard Worker
4186*333d2b36SAndroid Build Coastguard Worker		cc_library {
4187*333d2b36SAndroid Build Coastguard Worker			name: "lib_dep",
4188*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
4189*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libfoo"],
4190*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
4191*333d2b36SAndroid Build Coastguard Worker			stl: "none",
4192*333d2b36SAndroid Build Coastguard Worker			apex_available: [
4193*333d2b36SAndroid Build Coastguard Worker				"myapex_dep",
4194*333d2b36SAndroid Build Coastguard Worker				"myapex_provider",
4195*333d2b36SAndroid Build Coastguard Worker				"myapex_selfcontained",
4196*333d2b36SAndroid Build Coastguard Worker			],
4197*333d2b36SAndroid Build Coastguard Worker		}
4198*333d2b36SAndroid Build Coastguard Worker
4199*333d2b36SAndroid Build Coastguard Worker		cc_library {
4200*333d2b36SAndroid Build Coastguard Worker			name: "lib_dep_on_bar",
4201*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
4202*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libbar"],
4203*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
4204*333d2b36SAndroid Build Coastguard Worker			stl: "none",
4205*333d2b36SAndroid Build Coastguard Worker			apex_available: [
4206*333d2b36SAndroid Build Coastguard Worker				"myapex_selfcontained",
4207*333d2b36SAndroid Build Coastguard Worker			],
4208*333d2b36SAndroid Build Coastguard Worker		}
4209*333d2b36SAndroid Build Coastguard Worker
4210*333d2b36SAndroid Build Coastguard Worker
4211*333d2b36SAndroid Build Coastguard Worker		cc_library {
4212*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
4213*333d2b36SAndroid Build Coastguard Worker			srcs: ["mytest.cpp"],
4214*333d2b36SAndroid Build Coastguard Worker			stubs: {
4215*333d2b36SAndroid Build Coastguard Worker				versions: ["1"],
4216*333d2b36SAndroid Build Coastguard Worker			},
4217*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
4218*333d2b36SAndroid Build Coastguard Worker			stl: "none",
4219*333d2b36SAndroid Build Coastguard Worker			apex_available: [
4220*333d2b36SAndroid Build Coastguard Worker				"myapex_provider",
4221*333d2b36SAndroid Build Coastguard Worker			],
4222*333d2b36SAndroid Build Coastguard Worker		}
4223*333d2b36SAndroid Build Coastguard Worker
4224*333d2b36SAndroid Build Coastguard Worker		cc_library {
4225*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
4226*333d2b36SAndroid Build Coastguard Worker			srcs: ["mytest.cpp"],
4227*333d2b36SAndroid Build Coastguard Worker			stubs: {
4228*333d2b36SAndroid Build Coastguard Worker				versions: ["1"],
4229*333d2b36SAndroid Build Coastguard Worker			},
4230*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
4231*333d2b36SAndroid Build Coastguard Worker			stl: "none",
4232*333d2b36SAndroid Build Coastguard Worker			apex_available: [
4233*333d2b36SAndroid Build Coastguard Worker				"myapex_selfcontained",
4234*333d2b36SAndroid Build Coastguard Worker			],
4235*333d2b36SAndroid Build Coastguard Worker		}
4236*333d2b36SAndroid Build Coastguard Worker
4237*333d2b36SAndroid Build Coastguard Worker	`)
4238*333d2b36SAndroid Build Coastguard Worker
4239*333d2b36SAndroid Build Coastguard Worker	var apexManifestRule android.TestingBuildParams
4240*333d2b36SAndroid Build Coastguard Worker	var provideNativeLibs, requireNativeLibs []string
4241*333d2b36SAndroid Build Coastguard Worker
4242*333d2b36SAndroid Build Coastguard Worker	apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
4243*333d2b36SAndroid Build Coastguard Worker	provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4244*333d2b36SAndroid Build Coastguard Worker	requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
4245*333d2b36SAndroid Build Coastguard Worker	ensureListEmpty(t, provideNativeLibs)
4246*333d2b36SAndroid Build Coastguard Worker	ensureListEmpty(t, requireNativeLibs)
4247*333d2b36SAndroid Build Coastguard Worker
4248*333d2b36SAndroid Build Coastguard Worker	apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
4249*333d2b36SAndroid Build Coastguard Worker	provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4250*333d2b36SAndroid Build Coastguard Worker	requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
4251*333d2b36SAndroid Build Coastguard Worker	ensureListEmpty(t, provideNativeLibs)
4252*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, requireNativeLibs, "libfoo.so")
4253*333d2b36SAndroid Build Coastguard Worker
4254*333d2b36SAndroid Build Coastguard Worker	apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
4255*333d2b36SAndroid Build Coastguard Worker	provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4256*333d2b36SAndroid Build Coastguard Worker	requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
4257*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, provideNativeLibs, "libfoo.so")
4258*333d2b36SAndroid Build Coastguard Worker	ensureListEmpty(t, requireNativeLibs)
4259*333d2b36SAndroid Build Coastguard Worker
4260*333d2b36SAndroid Build Coastguard Worker	apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
4261*333d2b36SAndroid Build Coastguard Worker	provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4262*333d2b36SAndroid Build Coastguard Worker	requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
4263*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, provideNativeLibs, "libbar.so")
4264*333d2b36SAndroid Build Coastguard Worker	ensureListEmpty(t, requireNativeLibs)
4265*333d2b36SAndroid Build Coastguard Worker}
4266*333d2b36SAndroid Build Coastguard Worker
4267*333d2b36SAndroid Build Coastguard Workerfunc TestOverrideApexManifestDefaultVersion(t *testing.T) {
4268*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
4269*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
4270*333d2b36SAndroid Build Coastguard Worker		apex {
4271*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
4272*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
4273*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib"],
4274*333d2b36SAndroid Build Coastguard Worker			updatable: false,
4275*333d2b36SAndroid Build Coastguard Worker		}
4276*333d2b36SAndroid Build Coastguard Worker
4277*333d2b36SAndroid Build Coastguard Worker		apex_key {
4278*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
4279*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
4280*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
4281*333d2b36SAndroid Build Coastguard Worker		}
4282*333d2b36SAndroid Build Coastguard Worker
4283*333d2b36SAndroid Build Coastguard Worker		cc_library {
4284*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
4285*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
4286*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
4287*333d2b36SAndroid Build Coastguard Worker			stl: "none",
4288*333d2b36SAndroid Build Coastguard Worker			apex_available: [
4289*333d2b36SAndroid Build Coastguard Worker				"//apex_available:platform",
4290*333d2b36SAndroid Build Coastguard Worker				"myapex",
4291*333d2b36SAndroid Build Coastguard Worker			],
4292*333d2b36SAndroid Build Coastguard Worker		}
4293*333d2b36SAndroid Build Coastguard Worker	`, android.FixtureMergeEnv(map[string]string{
4294*333d2b36SAndroid Build Coastguard Worker		"OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4295*333d2b36SAndroid Build Coastguard Worker	}))
4296*333d2b36SAndroid Build Coastguard Worker
4297*333d2b36SAndroid Build Coastguard Worker	module := ctx.ModuleForTests("myapex", "android_common_myapex")
4298*333d2b36SAndroid Build Coastguard Worker	apexManifestRule := module.Rule("apexManifestRule")
4299*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4300*333d2b36SAndroid Build Coastguard Worker}
4301*333d2b36SAndroid Build Coastguard Worker
4302*333d2b36SAndroid Build Coastguard Workerfunc TestCompileMultilibProp(t *testing.T) {
4303*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
4304*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
4305*333d2b36SAndroid Build Coastguard Worker		compileMultiLibProp string
4306*333d2b36SAndroid Build Coastguard Worker		containedLibs       []string
4307*333d2b36SAndroid Build Coastguard Worker		notContainedLibs    []string
4308*333d2b36SAndroid Build Coastguard Worker	}{
4309*333d2b36SAndroid Build Coastguard Worker		{
4310*333d2b36SAndroid Build Coastguard Worker			containedLibs: []string{
4311*333d2b36SAndroid Build Coastguard Worker				"image.apex/lib64/mylib.so",
4312*333d2b36SAndroid Build Coastguard Worker				"image.apex/lib/mylib.so",
4313*333d2b36SAndroid Build Coastguard Worker			},
4314*333d2b36SAndroid Build Coastguard Worker			compileMultiLibProp: `compile_multilib: "both",`,
4315*333d2b36SAndroid Build Coastguard Worker		},
4316*333d2b36SAndroid Build Coastguard Worker		{
4317*333d2b36SAndroid Build Coastguard Worker			containedLibs:       []string{"image.apex/lib64/mylib.so"},
4318*333d2b36SAndroid Build Coastguard Worker			notContainedLibs:    []string{"image.apex/lib/mylib.so"},
4319*333d2b36SAndroid Build Coastguard Worker			compileMultiLibProp: `compile_multilib: "first",`,
4320*333d2b36SAndroid Build Coastguard Worker		},
4321*333d2b36SAndroid Build Coastguard Worker		{
4322*333d2b36SAndroid Build Coastguard Worker			containedLibs:    []string{"image.apex/lib64/mylib.so"},
4323*333d2b36SAndroid Build Coastguard Worker			notContainedLibs: []string{"image.apex/lib/mylib.so"},
4324*333d2b36SAndroid Build Coastguard Worker			// compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4325*333d2b36SAndroid Build Coastguard Worker		},
4326*333d2b36SAndroid Build Coastguard Worker		{
4327*333d2b36SAndroid Build Coastguard Worker			containedLibs:       []string{"image.apex/lib64/mylib.so"},
4328*333d2b36SAndroid Build Coastguard Worker			notContainedLibs:    []string{"image.apex/lib/mylib.so"},
4329*333d2b36SAndroid Build Coastguard Worker			compileMultiLibProp: `compile_multilib: "64",`,
4330*333d2b36SAndroid Build Coastguard Worker		},
4331*333d2b36SAndroid Build Coastguard Worker		{
4332*333d2b36SAndroid Build Coastguard Worker			containedLibs:       []string{"image.apex/lib/mylib.so"},
4333*333d2b36SAndroid Build Coastguard Worker			notContainedLibs:    []string{"image.apex/lib64/mylib.so"},
4334*333d2b36SAndroid Build Coastguard Worker			compileMultiLibProp: `compile_multilib: "32",`,
4335*333d2b36SAndroid Build Coastguard Worker		},
4336*333d2b36SAndroid Build Coastguard Worker	}
4337*333d2b36SAndroid Build Coastguard Worker	for _, testCase := range testCases {
4338*333d2b36SAndroid Build Coastguard Worker		ctx := testApex(t, fmt.Sprintf(`
4339*333d2b36SAndroid Build Coastguard Worker			apex {
4340*333d2b36SAndroid Build Coastguard Worker				name: "myapex",
4341*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
4342*333d2b36SAndroid Build Coastguard Worker				%s
4343*333d2b36SAndroid Build Coastguard Worker				native_shared_libs: ["mylib"],
4344*333d2b36SAndroid Build Coastguard Worker				updatable: false,
4345*333d2b36SAndroid Build Coastguard Worker			}
4346*333d2b36SAndroid Build Coastguard Worker			apex_key {
4347*333d2b36SAndroid Build Coastguard Worker				name: "myapex.key",
4348*333d2b36SAndroid Build Coastguard Worker				public_key: "testkey.avbpubkey",
4349*333d2b36SAndroid Build Coastguard Worker				private_key: "testkey.pem",
4350*333d2b36SAndroid Build Coastguard Worker			}
4351*333d2b36SAndroid Build Coastguard Worker			cc_library {
4352*333d2b36SAndroid Build Coastguard Worker				name: "mylib",
4353*333d2b36SAndroid Build Coastguard Worker				srcs: ["mylib.cpp"],
4354*333d2b36SAndroid Build Coastguard Worker				apex_available: [
4355*333d2b36SAndroid Build Coastguard Worker					"//apex_available:platform",
4356*333d2b36SAndroid Build Coastguard Worker					"myapex",
4357*333d2b36SAndroid Build Coastguard Worker			],
4358*333d2b36SAndroid Build Coastguard Worker			}
4359*333d2b36SAndroid Build Coastguard Worker		`, testCase.compileMultiLibProp),
4360*333d2b36SAndroid Build Coastguard Worker		)
4361*333d2b36SAndroid Build Coastguard Worker		module := ctx.ModuleForTests("myapex", "android_common_myapex")
4362*333d2b36SAndroid Build Coastguard Worker		apexRule := module.Rule("apexRule")
4363*333d2b36SAndroid Build Coastguard Worker		copyCmds := apexRule.Args["copy_commands"]
4364*333d2b36SAndroid Build Coastguard Worker		for _, containedLib := range testCase.containedLibs {
4365*333d2b36SAndroid Build Coastguard Worker			ensureContains(t, copyCmds, containedLib)
4366*333d2b36SAndroid Build Coastguard Worker		}
4367*333d2b36SAndroid Build Coastguard Worker		for _, notContainedLib := range testCase.notContainedLibs {
4368*333d2b36SAndroid Build Coastguard Worker			ensureNotContains(t, copyCmds, notContainedLib)
4369*333d2b36SAndroid Build Coastguard Worker		}
4370*333d2b36SAndroid Build Coastguard Worker	}
4371*333d2b36SAndroid Build Coastguard Worker}
4372*333d2b36SAndroid Build Coastguard Worker
4373*333d2b36SAndroid Build Coastguard Workerfunc TestNonTestApex(t *testing.T) {
4374*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
4375*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
4376*333d2b36SAndroid Build Coastguard Worker		apex {
4377*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
4378*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
4379*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib_common"],
4380*333d2b36SAndroid Build Coastguard Worker			updatable: false,
4381*333d2b36SAndroid Build Coastguard Worker		}
4382*333d2b36SAndroid Build Coastguard Worker
4383*333d2b36SAndroid Build Coastguard Worker		apex_key {
4384*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
4385*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
4386*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
4387*333d2b36SAndroid Build Coastguard Worker		}
4388*333d2b36SAndroid Build Coastguard Worker
4389*333d2b36SAndroid Build Coastguard Worker		cc_library {
4390*333d2b36SAndroid Build Coastguard Worker			name: "mylib_common",
4391*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
4392*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
4393*333d2b36SAndroid Build Coastguard Worker			stl: "none",
4394*333d2b36SAndroid Build Coastguard Worker			apex_available: [
4395*333d2b36SAndroid Build Coastguard Worker					"//apex_available:platform",
4396*333d2b36SAndroid Build Coastguard Worker				  "myapex",
4397*333d2b36SAndroid Build Coastguard Worker		  ],
4398*333d2b36SAndroid Build Coastguard Worker		}
4399*333d2b36SAndroid Build Coastguard Worker	`)
4400*333d2b36SAndroid Build Coastguard Worker
4401*333d2b36SAndroid Build Coastguard Worker	module := ctx.ModuleForTests("myapex", "android_common_myapex")
4402*333d2b36SAndroid Build Coastguard Worker	apexRule := module.Rule("apexRule")
4403*333d2b36SAndroid Build Coastguard Worker	copyCmds := apexRule.Args["copy_commands"]
4404*333d2b36SAndroid Build Coastguard Worker
4405*333d2b36SAndroid Build Coastguard Worker	if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4406*333d2b36SAndroid Build Coastguard Worker		t.Log("Apex was a test apex!")
4407*333d2b36SAndroid Build Coastguard Worker		t.Fail()
4408*333d2b36SAndroid Build Coastguard Worker	}
4409*333d2b36SAndroid Build Coastguard Worker	// Ensure that main rule creates an output
4410*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4411*333d2b36SAndroid Build Coastguard Worker
4412*333d2b36SAndroid Build Coastguard Worker	// Ensure that apex variant is created for the direct dep
4413*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4414*333d2b36SAndroid Build Coastguard Worker
4415*333d2b36SAndroid Build Coastguard Worker	// Ensure that both direct and indirect deps are copied into apex
4416*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4417*333d2b36SAndroid Build Coastguard Worker
4418*333d2b36SAndroid Build Coastguard Worker	// Ensure that the platform variant ends with _shared
4419*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4420*333d2b36SAndroid Build Coastguard Worker
4421*333d2b36SAndroid Build Coastguard Worker	if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
4422*333d2b36SAndroid Build Coastguard Worker		t.Log("Found mylib_common not in any apex!")
4423*333d2b36SAndroid Build Coastguard Worker		t.Fail()
4424*333d2b36SAndroid Build Coastguard Worker	}
4425*333d2b36SAndroid Build Coastguard Worker}
4426*333d2b36SAndroid Build Coastguard Worker
4427*333d2b36SAndroid Build Coastguard Workerfunc TestTestApex(t *testing.T) {
4428*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
4429*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
4430*333d2b36SAndroid Build Coastguard Worker		apex_test {
4431*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
4432*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
4433*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib_common_test"],
4434*333d2b36SAndroid Build Coastguard Worker			updatable: false,
4435*333d2b36SAndroid Build Coastguard Worker		}
4436*333d2b36SAndroid Build Coastguard Worker
4437*333d2b36SAndroid Build Coastguard Worker		apex_key {
4438*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
4439*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
4440*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
4441*333d2b36SAndroid Build Coastguard Worker		}
4442*333d2b36SAndroid Build Coastguard Worker
4443*333d2b36SAndroid Build Coastguard Worker		cc_library {
4444*333d2b36SAndroid Build Coastguard Worker			name: "mylib_common_test",
4445*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
4446*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
4447*333d2b36SAndroid Build Coastguard Worker			stl: "none",
4448*333d2b36SAndroid Build Coastguard Worker			// TODO: remove //apex_available:platform
4449*333d2b36SAndroid Build Coastguard Worker			apex_available: [
4450*333d2b36SAndroid Build Coastguard Worker				"//apex_available:platform",
4451*333d2b36SAndroid Build Coastguard Worker				"myapex",
4452*333d2b36SAndroid Build Coastguard Worker			],
4453*333d2b36SAndroid Build Coastguard Worker		}
4454*333d2b36SAndroid Build Coastguard Worker	`)
4455*333d2b36SAndroid Build Coastguard Worker
4456*333d2b36SAndroid Build Coastguard Worker	module := ctx.ModuleForTests("myapex", "android_common_myapex")
4457*333d2b36SAndroid Build Coastguard Worker	apexRule := module.Rule("apexRule")
4458*333d2b36SAndroid Build Coastguard Worker	copyCmds := apexRule.Args["copy_commands"]
4459*333d2b36SAndroid Build Coastguard Worker
4460*333d2b36SAndroid Build Coastguard Worker	if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4461*333d2b36SAndroid Build Coastguard Worker		t.Log("Apex was not a test apex!")
4462*333d2b36SAndroid Build Coastguard Worker		t.Fail()
4463*333d2b36SAndroid Build Coastguard Worker	}
4464*333d2b36SAndroid Build Coastguard Worker	// Ensure that main rule creates an output
4465*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4466*333d2b36SAndroid Build Coastguard Worker
4467*333d2b36SAndroid Build Coastguard Worker	// Ensure that apex variant is created for the direct dep
4468*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
4469*333d2b36SAndroid Build Coastguard Worker
4470*333d2b36SAndroid Build Coastguard Worker	// Ensure that both direct and indirect deps are copied into apex
4471*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4472*333d2b36SAndroid Build Coastguard Worker
4473*333d2b36SAndroid Build Coastguard Worker	// Ensure that the platform variant ends with _shared
4474*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
4475*333d2b36SAndroid Build Coastguard Worker}
4476*333d2b36SAndroid Build Coastguard Worker
4477*333d2b36SAndroid Build Coastguard Workerfunc TestLibzVendorIsntStable(t *testing.T) {
4478*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
4479*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
4480*333d2b36SAndroid Build Coastguard Worker	apex {
4481*333d2b36SAndroid Build Coastguard Worker		name: "myapex",
4482*333d2b36SAndroid Build Coastguard Worker		key: "myapex.key",
4483*333d2b36SAndroid Build Coastguard Worker		updatable: false,
4484*333d2b36SAndroid Build Coastguard Worker		binaries: ["mybin"],
4485*333d2b36SAndroid Build Coastguard Worker	}
4486*333d2b36SAndroid Build Coastguard Worker	apex {
4487*333d2b36SAndroid Build Coastguard Worker		name: "myvendorapex",
4488*333d2b36SAndroid Build Coastguard Worker		key: "myapex.key",
4489*333d2b36SAndroid Build Coastguard Worker		file_contexts: "myvendorapex_file_contexts",
4490*333d2b36SAndroid Build Coastguard Worker		vendor: true,
4491*333d2b36SAndroid Build Coastguard Worker		updatable: false,
4492*333d2b36SAndroid Build Coastguard Worker		binaries: ["mybin"],
4493*333d2b36SAndroid Build Coastguard Worker	}
4494*333d2b36SAndroid Build Coastguard Worker	apex_key {
4495*333d2b36SAndroid Build Coastguard Worker		name: "myapex.key",
4496*333d2b36SAndroid Build Coastguard Worker		public_key: "testkey.avbpubkey",
4497*333d2b36SAndroid Build Coastguard Worker		private_key: "testkey.pem",
4498*333d2b36SAndroid Build Coastguard Worker	}
4499*333d2b36SAndroid Build Coastguard Worker	cc_binary {
4500*333d2b36SAndroid Build Coastguard Worker		name: "mybin",
4501*333d2b36SAndroid Build Coastguard Worker		vendor_available: true,
4502*333d2b36SAndroid Build Coastguard Worker		system_shared_libs: [],
4503*333d2b36SAndroid Build Coastguard Worker		stl: "none",
4504*333d2b36SAndroid Build Coastguard Worker		shared_libs: ["libz"],
4505*333d2b36SAndroid Build Coastguard Worker		apex_available: ["//apex_available:anyapex"],
4506*333d2b36SAndroid Build Coastguard Worker	}
4507*333d2b36SAndroid Build Coastguard Worker	cc_library {
4508*333d2b36SAndroid Build Coastguard Worker		name: "libz",
4509*333d2b36SAndroid Build Coastguard Worker		vendor_available: true,
4510*333d2b36SAndroid Build Coastguard Worker		system_shared_libs: [],
4511*333d2b36SAndroid Build Coastguard Worker		stl: "none",
4512*333d2b36SAndroid Build Coastguard Worker		stubs: {
4513*333d2b36SAndroid Build Coastguard Worker			versions: ["28", "30"],
4514*333d2b36SAndroid Build Coastguard Worker		},
4515*333d2b36SAndroid Build Coastguard Worker		target: {
4516*333d2b36SAndroid Build Coastguard Worker			vendor: {
4517*333d2b36SAndroid Build Coastguard Worker				no_stubs: true,
4518*333d2b36SAndroid Build Coastguard Worker			},
4519*333d2b36SAndroid Build Coastguard Worker		},
4520*333d2b36SAndroid Build Coastguard Worker	}
4521*333d2b36SAndroid Build Coastguard Worker	`, withFiles(map[string][]byte{
4522*333d2b36SAndroid Build Coastguard Worker		"myvendorapex_file_contexts": nil,
4523*333d2b36SAndroid Build Coastguard Worker	}))
4524*333d2b36SAndroid Build Coastguard Worker
4525*333d2b36SAndroid Build Coastguard Worker	// libz provides stubs for core variant.
4526*333d2b36SAndroid Build Coastguard Worker	{
4527*333d2b36SAndroid Build Coastguard Worker		ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4528*333d2b36SAndroid Build Coastguard Worker			"bin/mybin",
4529*333d2b36SAndroid Build Coastguard Worker		})
4530*333d2b36SAndroid Build Coastguard Worker		apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4531*333d2b36SAndroid Build Coastguard Worker		android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4532*333d2b36SAndroid Build Coastguard Worker	}
4533*333d2b36SAndroid Build Coastguard Worker	// libz doesn't provide stubs for vendor variant.
4534*333d2b36SAndroid Build Coastguard Worker	{
4535*333d2b36SAndroid Build Coastguard Worker		ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4536*333d2b36SAndroid Build Coastguard Worker			"bin/mybin",
4537*333d2b36SAndroid Build Coastguard Worker			"lib64/libz.so",
4538*333d2b36SAndroid Build Coastguard Worker		})
4539*333d2b36SAndroid Build Coastguard Worker		apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4540*333d2b36SAndroid Build Coastguard Worker		android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4541*333d2b36SAndroid Build Coastguard Worker	}
4542*333d2b36SAndroid Build Coastguard Worker}
4543*333d2b36SAndroid Build Coastguard Worker
4544*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithTarget(t *testing.T) {
4545*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
4546*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
4547*333d2b36SAndroid Build Coastguard Worker		apex {
4548*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
4549*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
4550*333d2b36SAndroid Build Coastguard Worker			updatable: false,
4551*333d2b36SAndroid Build Coastguard Worker			multilib: {
4552*333d2b36SAndroid Build Coastguard Worker				first: {
4553*333d2b36SAndroid Build Coastguard Worker					native_shared_libs: ["mylib_common"],
4554*333d2b36SAndroid Build Coastguard Worker				}
4555*333d2b36SAndroid Build Coastguard Worker			},
4556*333d2b36SAndroid Build Coastguard Worker			target: {
4557*333d2b36SAndroid Build Coastguard Worker				android: {
4558*333d2b36SAndroid Build Coastguard Worker					multilib: {
4559*333d2b36SAndroid Build Coastguard Worker						first: {
4560*333d2b36SAndroid Build Coastguard Worker							native_shared_libs: ["mylib"],
4561*333d2b36SAndroid Build Coastguard Worker						}
4562*333d2b36SAndroid Build Coastguard Worker					}
4563*333d2b36SAndroid Build Coastguard Worker				},
4564*333d2b36SAndroid Build Coastguard Worker				host: {
4565*333d2b36SAndroid Build Coastguard Worker					multilib: {
4566*333d2b36SAndroid Build Coastguard Worker						first: {
4567*333d2b36SAndroid Build Coastguard Worker							native_shared_libs: ["mylib2"],
4568*333d2b36SAndroid Build Coastguard Worker						}
4569*333d2b36SAndroid Build Coastguard Worker					}
4570*333d2b36SAndroid Build Coastguard Worker				}
4571*333d2b36SAndroid Build Coastguard Worker			}
4572*333d2b36SAndroid Build Coastguard Worker		}
4573*333d2b36SAndroid Build Coastguard Worker
4574*333d2b36SAndroid Build Coastguard Worker		apex_key {
4575*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
4576*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
4577*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
4578*333d2b36SAndroid Build Coastguard Worker		}
4579*333d2b36SAndroid Build Coastguard Worker
4580*333d2b36SAndroid Build Coastguard Worker		cc_library {
4581*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
4582*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
4583*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
4584*333d2b36SAndroid Build Coastguard Worker			stl: "none",
4585*333d2b36SAndroid Build Coastguard Worker			// TODO: remove //apex_available:platform
4586*333d2b36SAndroid Build Coastguard Worker			apex_available: [
4587*333d2b36SAndroid Build Coastguard Worker				"//apex_available:platform",
4588*333d2b36SAndroid Build Coastguard Worker				"myapex",
4589*333d2b36SAndroid Build Coastguard Worker			],
4590*333d2b36SAndroid Build Coastguard Worker		}
4591*333d2b36SAndroid Build Coastguard Worker
4592*333d2b36SAndroid Build Coastguard Worker		cc_library {
4593*333d2b36SAndroid Build Coastguard Worker			name: "mylib_common",
4594*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
4595*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
4596*333d2b36SAndroid Build Coastguard Worker			stl: "none",
4597*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "first",
4598*333d2b36SAndroid Build Coastguard Worker			// TODO: remove //apex_available:platform
4599*333d2b36SAndroid Build Coastguard Worker			apex_available: [
4600*333d2b36SAndroid Build Coastguard Worker				"//apex_available:platform",
4601*333d2b36SAndroid Build Coastguard Worker				"myapex",
4602*333d2b36SAndroid Build Coastguard Worker			],
4603*333d2b36SAndroid Build Coastguard Worker		}
4604*333d2b36SAndroid Build Coastguard Worker
4605*333d2b36SAndroid Build Coastguard Worker		cc_library {
4606*333d2b36SAndroid Build Coastguard Worker			name: "mylib2",
4607*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
4608*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
4609*333d2b36SAndroid Build Coastguard Worker			stl: "none",
4610*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "first",
4611*333d2b36SAndroid Build Coastguard Worker		}
4612*333d2b36SAndroid Build Coastguard Worker	`)
4613*333d2b36SAndroid Build Coastguard Worker
4614*333d2b36SAndroid Build Coastguard Worker	apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
4615*333d2b36SAndroid Build Coastguard Worker	copyCmds := apexRule.Args["copy_commands"]
4616*333d2b36SAndroid Build Coastguard Worker
4617*333d2b36SAndroid Build Coastguard Worker	// Ensure that main rule creates an output
4618*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4619*333d2b36SAndroid Build Coastguard Worker
4620*333d2b36SAndroid Build Coastguard Worker	// Ensure that apex variant is created for the direct dep
4621*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4622*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4623*333d2b36SAndroid Build Coastguard Worker	ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
4624*333d2b36SAndroid Build Coastguard Worker
4625*333d2b36SAndroid Build Coastguard Worker	// Ensure that both direct and indirect deps are copied into apex
4626*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4627*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4628*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4629*333d2b36SAndroid Build Coastguard Worker
4630*333d2b36SAndroid Build Coastguard Worker	// Ensure that the platform variant ends with _shared
4631*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4632*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4633*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
4634*333d2b36SAndroid Build Coastguard Worker}
4635*333d2b36SAndroid Build Coastguard Worker
4636*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithArch(t *testing.T) {
4637*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
4638*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
4639*333d2b36SAndroid Build Coastguard Worker		apex {
4640*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
4641*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
4642*333d2b36SAndroid Build Coastguard Worker			updatable: false,
4643*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib.generic"],
4644*333d2b36SAndroid Build Coastguard Worker			arch: {
4645*333d2b36SAndroid Build Coastguard Worker				arm64: {
4646*333d2b36SAndroid Build Coastguard Worker					native_shared_libs: ["mylib.arm64"],
4647*333d2b36SAndroid Build Coastguard Worker					exclude_native_shared_libs: ["mylib.generic"],
4648*333d2b36SAndroid Build Coastguard Worker				},
4649*333d2b36SAndroid Build Coastguard Worker				x86_64: {
4650*333d2b36SAndroid Build Coastguard Worker					native_shared_libs: ["mylib.x64"],
4651*333d2b36SAndroid Build Coastguard Worker					exclude_native_shared_libs: ["mylib.generic"],
4652*333d2b36SAndroid Build Coastguard Worker				},
4653*333d2b36SAndroid Build Coastguard Worker			}
4654*333d2b36SAndroid Build Coastguard Worker		}
4655*333d2b36SAndroid Build Coastguard Worker
4656*333d2b36SAndroid Build Coastguard Worker		apex_key {
4657*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
4658*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
4659*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
4660*333d2b36SAndroid Build Coastguard Worker		}
4661*333d2b36SAndroid Build Coastguard Worker
4662*333d2b36SAndroid Build Coastguard Worker		cc_library {
4663*333d2b36SAndroid Build Coastguard Worker			name: "mylib.generic",
4664*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
4665*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
4666*333d2b36SAndroid Build Coastguard Worker			stl: "none",
4667*333d2b36SAndroid Build Coastguard Worker			// TODO: remove //apex_available:platform
4668*333d2b36SAndroid Build Coastguard Worker			apex_available: [
4669*333d2b36SAndroid Build Coastguard Worker				"//apex_available:platform",
4670*333d2b36SAndroid Build Coastguard Worker				"myapex",
4671*333d2b36SAndroid Build Coastguard Worker			],
4672*333d2b36SAndroid Build Coastguard Worker		}
4673*333d2b36SAndroid Build Coastguard Worker
4674*333d2b36SAndroid Build Coastguard Worker		cc_library {
4675*333d2b36SAndroid Build Coastguard Worker			name: "mylib.arm64",
4676*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
4677*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
4678*333d2b36SAndroid Build Coastguard Worker			stl: "none",
4679*333d2b36SAndroid Build Coastguard Worker			// TODO: remove //apex_available:platform
4680*333d2b36SAndroid Build Coastguard Worker			apex_available: [
4681*333d2b36SAndroid Build Coastguard Worker				"//apex_available:platform",
4682*333d2b36SAndroid Build Coastguard Worker				"myapex",
4683*333d2b36SAndroid Build Coastguard Worker			],
4684*333d2b36SAndroid Build Coastguard Worker		}
4685*333d2b36SAndroid Build Coastguard Worker
4686*333d2b36SAndroid Build Coastguard Worker		cc_library {
4687*333d2b36SAndroid Build Coastguard Worker			name: "mylib.x64",
4688*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
4689*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
4690*333d2b36SAndroid Build Coastguard Worker			stl: "none",
4691*333d2b36SAndroid Build Coastguard Worker			// TODO: remove //apex_available:platform
4692*333d2b36SAndroid Build Coastguard Worker			apex_available: [
4693*333d2b36SAndroid Build Coastguard Worker				"//apex_available:platform",
4694*333d2b36SAndroid Build Coastguard Worker				"myapex",
4695*333d2b36SAndroid Build Coastguard Worker			],
4696*333d2b36SAndroid Build Coastguard Worker		}
4697*333d2b36SAndroid Build Coastguard Worker	`)
4698*333d2b36SAndroid Build Coastguard Worker
4699*333d2b36SAndroid Build Coastguard Worker	apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
4700*333d2b36SAndroid Build Coastguard Worker	copyCmds := apexRule.Args["copy_commands"]
4701*333d2b36SAndroid Build Coastguard Worker
4702*333d2b36SAndroid Build Coastguard Worker	// Ensure that apex variant is created for the direct dep
4703*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4704*333d2b36SAndroid Build Coastguard Worker	ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
4705*333d2b36SAndroid Build Coastguard Worker	ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4706*333d2b36SAndroid Build Coastguard Worker
4707*333d2b36SAndroid Build Coastguard Worker	// Ensure that both direct and indirect deps are copied into apex
4708*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4709*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4710*333d2b36SAndroid Build Coastguard Worker}
4711*333d2b36SAndroid Build Coastguard Worker
4712*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithShBinary(t *testing.T) {
4713*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
4714*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
4715*333d2b36SAndroid Build Coastguard Worker		apex {
4716*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
4717*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
4718*333d2b36SAndroid Build Coastguard Worker			sh_binaries: ["myscript"],
4719*333d2b36SAndroid Build Coastguard Worker			updatable: false,
4720*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "both",
4721*333d2b36SAndroid Build Coastguard Worker		}
4722*333d2b36SAndroid Build Coastguard Worker
4723*333d2b36SAndroid Build Coastguard Worker		apex_key {
4724*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
4725*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
4726*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
4727*333d2b36SAndroid Build Coastguard Worker		}
4728*333d2b36SAndroid Build Coastguard Worker
4729*333d2b36SAndroid Build Coastguard Worker		sh_binary {
4730*333d2b36SAndroid Build Coastguard Worker			name: "myscript",
4731*333d2b36SAndroid Build Coastguard Worker			src: "mylib.cpp",
4732*333d2b36SAndroid Build Coastguard Worker			filename: "myscript.sh",
4733*333d2b36SAndroid Build Coastguard Worker			sub_dir: "script",
4734*333d2b36SAndroid Build Coastguard Worker		}
4735*333d2b36SAndroid Build Coastguard Worker	`)
4736*333d2b36SAndroid Build Coastguard Worker
4737*333d2b36SAndroid Build Coastguard Worker	apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
4738*333d2b36SAndroid Build Coastguard Worker	copyCmds := apexRule.Args["copy_commands"]
4739*333d2b36SAndroid Build Coastguard Worker
4740*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4741*333d2b36SAndroid Build Coastguard Worker}
4742*333d2b36SAndroid Build Coastguard Worker
4743*333d2b36SAndroid Build Coastguard Workerfunc TestApexInVariousPartition(t *testing.T) {
4744*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
4745*333d2b36SAndroid Build Coastguard Worker	testcases := []struct {
4746*333d2b36SAndroid Build Coastguard Worker		propName, partition string
4747*333d2b36SAndroid Build Coastguard Worker	}{
4748*333d2b36SAndroid Build Coastguard Worker		{"", "system"},
4749*333d2b36SAndroid Build Coastguard Worker		{"product_specific: true", "product"},
4750*333d2b36SAndroid Build Coastguard Worker		{"soc_specific: true", "vendor"},
4751*333d2b36SAndroid Build Coastguard Worker		{"proprietary: true", "vendor"},
4752*333d2b36SAndroid Build Coastguard Worker		{"vendor: true", "vendor"},
4753*333d2b36SAndroid Build Coastguard Worker		{"system_ext_specific: true", "system_ext"},
4754*333d2b36SAndroid Build Coastguard Worker	}
4755*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testcases {
4756*333d2b36SAndroid Build Coastguard Worker		t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
4757*333d2b36SAndroid Build Coastguard Worker			t.Parallel()
4758*333d2b36SAndroid Build Coastguard Worker			ctx := testApex(t, `
4759*333d2b36SAndroid Build Coastguard Worker				apex {
4760*333d2b36SAndroid Build Coastguard Worker					name: "myapex",
4761*333d2b36SAndroid Build Coastguard Worker					key: "myapex.key",
4762*333d2b36SAndroid Build Coastguard Worker					updatable: false,
4763*333d2b36SAndroid Build Coastguard Worker					`+tc.propName+`
4764*333d2b36SAndroid Build Coastguard Worker				}
4765*333d2b36SAndroid Build Coastguard Worker
4766*333d2b36SAndroid Build Coastguard Worker				apex_key {
4767*333d2b36SAndroid Build Coastguard Worker					name: "myapex.key",
4768*333d2b36SAndroid Build Coastguard Worker					public_key: "testkey.avbpubkey",
4769*333d2b36SAndroid Build Coastguard Worker					private_key: "testkey.pem",
4770*333d2b36SAndroid Build Coastguard Worker				}
4771*333d2b36SAndroid Build Coastguard Worker			`)
4772*333d2b36SAndroid Build Coastguard Worker
4773*333d2b36SAndroid Build Coastguard Worker			apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
4774*333d2b36SAndroid Build Coastguard Worker			expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
4775*333d2b36SAndroid Build Coastguard Worker			actual := apex.installDir.RelativeToTop().String()
4776*333d2b36SAndroid Build Coastguard Worker			if actual != expected {
4777*333d2b36SAndroid Build Coastguard Worker				t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4778*333d2b36SAndroid Build Coastguard Worker			}
4779*333d2b36SAndroid Build Coastguard Worker		})
4780*333d2b36SAndroid Build Coastguard Worker	}
4781*333d2b36SAndroid Build Coastguard Worker}
4782*333d2b36SAndroid Build Coastguard Worker
4783*333d2b36SAndroid Build Coastguard Workerfunc TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
4784*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
4785*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
4786*333d2b36SAndroid Build Coastguard Worker		apex {
4787*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
4788*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
4789*333d2b36SAndroid Build Coastguard Worker			updatable: false,
4790*333d2b36SAndroid Build Coastguard Worker		}
4791*333d2b36SAndroid Build Coastguard Worker
4792*333d2b36SAndroid Build Coastguard Worker		apex_key {
4793*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
4794*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
4795*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
4796*333d2b36SAndroid Build Coastguard Worker		}
4797*333d2b36SAndroid Build Coastguard Worker	`)
4798*333d2b36SAndroid Build Coastguard Worker	module := ctx.ModuleForTests("myapex", "android_common_myapex")
4799*333d2b36SAndroid Build Coastguard Worker	rule := module.Output("file_contexts")
4800*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4801*333d2b36SAndroid Build Coastguard Worker}
4802*333d2b36SAndroid Build Coastguard Worker
4803*333d2b36SAndroid Build Coastguard Workerfunc TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
4804*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
4805*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
4806*333d2b36SAndroid Build Coastguard Worker		apex {
4807*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
4808*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
4809*333d2b36SAndroid Build Coastguard Worker			file_contexts: "my_own_file_contexts",
4810*333d2b36SAndroid Build Coastguard Worker			updatable: false,
4811*333d2b36SAndroid Build Coastguard Worker		}
4812*333d2b36SAndroid Build Coastguard Worker
4813*333d2b36SAndroid Build Coastguard Worker		apex_key {
4814*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
4815*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
4816*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
4817*333d2b36SAndroid Build Coastguard Worker		}
4818*333d2b36SAndroid Build Coastguard Worker	`, withFiles(map[string][]byte{
4819*333d2b36SAndroid Build Coastguard Worker		"my_own_file_contexts": nil,
4820*333d2b36SAndroid Build Coastguard Worker	}))
4821*333d2b36SAndroid Build Coastguard Worker}
4822*333d2b36SAndroid Build Coastguard Worker
4823*333d2b36SAndroid Build Coastguard Workerfunc TestFileContexts_ProductSpecificApexes(t *testing.T) {
4824*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
4825*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
4826*333d2b36SAndroid Build Coastguard Worker		apex {
4827*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
4828*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
4829*333d2b36SAndroid Build Coastguard Worker			product_specific: true,
4830*333d2b36SAndroid Build Coastguard Worker			file_contexts: "product_specific_file_contexts",
4831*333d2b36SAndroid Build Coastguard Worker			updatable: false,
4832*333d2b36SAndroid Build Coastguard Worker		}
4833*333d2b36SAndroid Build Coastguard Worker
4834*333d2b36SAndroid Build Coastguard Worker		apex_key {
4835*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
4836*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
4837*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
4838*333d2b36SAndroid Build Coastguard Worker		}
4839*333d2b36SAndroid Build Coastguard Worker	`)
4840*333d2b36SAndroid Build Coastguard Worker
4841*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
4842*333d2b36SAndroid Build Coastguard Worker		apex {
4843*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
4844*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
4845*333d2b36SAndroid Build Coastguard Worker			product_specific: true,
4846*333d2b36SAndroid Build Coastguard Worker			file_contexts: "product_specific_file_contexts",
4847*333d2b36SAndroid Build Coastguard Worker			updatable: false,
4848*333d2b36SAndroid Build Coastguard Worker		}
4849*333d2b36SAndroid Build Coastguard Worker
4850*333d2b36SAndroid Build Coastguard Worker		apex_key {
4851*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
4852*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
4853*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
4854*333d2b36SAndroid Build Coastguard Worker		}
4855*333d2b36SAndroid Build Coastguard Worker	`, withFiles(map[string][]byte{
4856*333d2b36SAndroid Build Coastguard Worker		"product_specific_file_contexts": nil,
4857*333d2b36SAndroid Build Coastguard Worker	}))
4858*333d2b36SAndroid Build Coastguard Worker	module := ctx.ModuleForTests("myapex", "android_common_myapex")
4859*333d2b36SAndroid Build Coastguard Worker	rule := module.Output("file_contexts")
4860*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4861*333d2b36SAndroid Build Coastguard Worker}
4862*333d2b36SAndroid Build Coastguard Worker
4863*333d2b36SAndroid Build Coastguard Workerfunc TestFileContexts_SetViaFileGroup(t *testing.T) {
4864*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
4865*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
4866*333d2b36SAndroid Build Coastguard Worker		apex {
4867*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
4868*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
4869*333d2b36SAndroid Build Coastguard Worker			product_specific: true,
4870*333d2b36SAndroid Build Coastguard Worker			file_contexts: ":my-file-contexts",
4871*333d2b36SAndroid Build Coastguard Worker			updatable: false,
4872*333d2b36SAndroid Build Coastguard Worker		}
4873*333d2b36SAndroid Build Coastguard Worker
4874*333d2b36SAndroid Build Coastguard Worker		apex_key {
4875*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
4876*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
4877*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
4878*333d2b36SAndroid Build Coastguard Worker		}
4879*333d2b36SAndroid Build Coastguard Worker
4880*333d2b36SAndroid Build Coastguard Worker		filegroup {
4881*333d2b36SAndroid Build Coastguard Worker			name: "my-file-contexts",
4882*333d2b36SAndroid Build Coastguard Worker			srcs: ["product_specific_file_contexts"],
4883*333d2b36SAndroid Build Coastguard Worker		}
4884*333d2b36SAndroid Build Coastguard Worker	`, withFiles(map[string][]byte{
4885*333d2b36SAndroid Build Coastguard Worker		"product_specific_file_contexts": nil,
4886*333d2b36SAndroid Build Coastguard Worker	}))
4887*333d2b36SAndroid Build Coastguard Worker	module := ctx.ModuleForTests("myapex", "android_common_myapex")
4888*333d2b36SAndroid Build Coastguard Worker	rule := module.Output("file_contexts")
4889*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4890*333d2b36SAndroid Build Coastguard Worker}
4891*333d2b36SAndroid Build Coastguard Worker
4892*333d2b36SAndroid Build Coastguard Workerfunc TestApexKeyFromOtherModule(t *testing.T) {
4893*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
4894*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
4895*333d2b36SAndroid Build Coastguard Worker		apex_key {
4896*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
4897*333d2b36SAndroid Build Coastguard Worker			public_key: ":my.avbpubkey",
4898*333d2b36SAndroid Build Coastguard Worker			private_key: ":my.pem",
4899*333d2b36SAndroid Build Coastguard Worker			product_specific: true,
4900*333d2b36SAndroid Build Coastguard Worker		}
4901*333d2b36SAndroid Build Coastguard Worker
4902*333d2b36SAndroid Build Coastguard Worker		filegroup {
4903*333d2b36SAndroid Build Coastguard Worker			name: "my.avbpubkey",
4904*333d2b36SAndroid Build Coastguard Worker			srcs: ["testkey2.avbpubkey"],
4905*333d2b36SAndroid Build Coastguard Worker		}
4906*333d2b36SAndroid Build Coastguard Worker
4907*333d2b36SAndroid Build Coastguard Worker		filegroup {
4908*333d2b36SAndroid Build Coastguard Worker			name: "my.pem",
4909*333d2b36SAndroid Build Coastguard Worker			srcs: ["testkey2.pem"],
4910*333d2b36SAndroid Build Coastguard Worker		}
4911*333d2b36SAndroid Build Coastguard Worker	`)
4912*333d2b36SAndroid Build Coastguard Worker
4913*333d2b36SAndroid Build Coastguard Worker	apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4914*333d2b36SAndroid Build Coastguard Worker	expected_pubkey := "testkey2.avbpubkey"
4915*333d2b36SAndroid Build Coastguard Worker	actual_pubkey := apex_key.publicKeyFile.String()
4916*333d2b36SAndroid Build Coastguard Worker	if actual_pubkey != expected_pubkey {
4917*333d2b36SAndroid Build Coastguard Worker		t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4918*333d2b36SAndroid Build Coastguard Worker	}
4919*333d2b36SAndroid Build Coastguard Worker	expected_privkey := "testkey2.pem"
4920*333d2b36SAndroid Build Coastguard Worker	actual_privkey := apex_key.privateKeyFile.String()
4921*333d2b36SAndroid Build Coastguard Worker	if actual_privkey != expected_privkey {
4922*333d2b36SAndroid Build Coastguard Worker		t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4923*333d2b36SAndroid Build Coastguard Worker	}
4924*333d2b36SAndroid Build Coastguard Worker}
4925*333d2b36SAndroid Build Coastguard Worker
4926*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuilt(t *testing.T) {
4927*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
4928*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
4929*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
4930*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
4931*333d2b36SAndroid Build Coastguard Worker			arch: {
4932*333d2b36SAndroid Build Coastguard Worker				arm64: {
4933*333d2b36SAndroid Build Coastguard Worker					src: "myapex-arm64.apex",
4934*333d2b36SAndroid Build Coastguard Worker				},
4935*333d2b36SAndroid Build Coastguard Worker				arm: {
4936*333d2b36SAndroid Build Coastguard Worker					src: "myapex-arm.apex",
4937*333d2b36SAndroid Build Coastguard Worker				},
4938*333d2b36SAndroid Build Coastguard Worker			},
4939*333d2b36SAndroid Build Coastguard Worker		}
4940*333d2b36SAndroid Build Coastguard Worker	`)
4941*333d2b36SAndroid Build Coastguard Worker
4942*333d2b36SAndroid Build Coastguard Worker	testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4943*333d2b36SAndroid Build Coastguard Worker	prebuilt := testingModule.Module().(*Prebuilt)
4944*333d2b36SAndroid Build Coastguard Worker
4945*333d2b36SAndroid Build Coastguard Worker	expectedInput := "myapex-arm64.apex"
4946*333d2b36SAndroid Build Coastguard Worker	if prebuilt.inputApex.String() != expectedInput {
4947*333d2b36SAndroid Build Coastguard Worker		t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4948*333d2b36SAndroid Build Coastguard Worker	}
4949*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4950*333d2b36SAndroid Build Coastguard Worker		prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4951*333d2b36SAndroid Build Coastguard Worker	rule := testingModule.Rule("genProvenanceMetaData")
4952*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4953*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4954*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4955*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
4956*333d2b36SAndroid Build Coastguard Worker
4957*333d2b36SAndroid Build Coastguard Worker	entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4958*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
4959*333d2b36SAndroid Build Coastguard Worker}
4960*333d2b36SAndroid Build Coastguard Worker
4961*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltMissingSrc(t *testing.T) {
4962*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
4963*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
4964*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
4965*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
4966*333d2b36SAndroid Build Coastguard Worker		}
4967*333d2b36SAndroid Build Coastguard Worker	`)
4968*333d2b36SAndroid Build Coastguard Worker}
4969*333d2b36SAndroid Build Coastguard Worker
4970*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltFilenameOverride(t *testing.T) {
4971*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
4972*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
4973*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
4974*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
4975*333d2b36SAndroid Build Coastguard Worker			src: "myapex-arm.apex",
4976*333d2b36SAndroid Build Coastguard Worker			filename: "notmyapex.apex",
4977*333d2b36SAndroid Build Coastguard Worker		}
4978*333d2b36SAndroid Build Coastguard Worker	`)
4979*333d2b36SAndroid Build Coastguard Worker
4980*333d2b36SAndroid Build Coastguard Worker	testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4981*333d2b36SAndroid Build Coastguard Worker	p := testingModule.Module().(*Prebuilt)
4982*333d2b36SAndroid Build Coastguard Worker
4983*333d2b36SAndroid Build Coastguard Worker	expected := "notmyapex.apex"
4984*333d2b36SAndroid Build Coastguard Worker	if p.installFilename != expected {
4985*333d2b36SAndroid Build Coastguard Worker		t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4986*333d2b36SAndroid Build Coastguard Worker	}
4987*333d2b36SAndroid Build Coastguard Worker	rule := testingModule.Rule("genProvenanceMetaData")
4988*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4989*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4990*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4991*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
4992*333d2b36SAndroid Build Coastguard Worker}
4993*333d2b36SAndroid Build Coastguard Worker
4994*333d2b36SAndroid Build Coastguard Workerfunc TestApexSetFilenameOverride(t *testing.T) {
4995*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
4996*333d2b36SAndroid Build Coastguard Worker	testApex(t, `
4997*333d2b36SAndroid Build Coastguard Worker		apex_set {
4998*333d2b36SAndroid Build Coastguard Worker 			name: "com.company.android.myapex",
4999*333d2b36SAndroid Build Coastguard Worker			apex_name: "com.android.myapex",
5000*333d2b36SAndroid Build Coastguard Worker			set: "company-myapex.apks",
5001*333d2b36SAndroid Build Coastguard Worker      filename: "com.company.android.myapex.apex"
5002*333d2b36SAndroid Build Coastguard Worker		}
5003*333d2b36SAndroid Build Coastguard Worker	`).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5004*333d2b36SAndroid Build Coastguard Worker
5005*333d2b36SAndroid Build Coastguard Worker	testApex(t, `
5006*333d2b36SAndroid Build Coastguard Worker		apex_set {
5007*333d2b36SAndroid Build Coastguard Worker 			name: "com.company.android.myapex",
5008*333d2b36SAndroid Build Coastguard Worker			apex_name: "com.android.myapex",
5009*333d2b36SAndroid Build Coastguard Worker			set: "company-myapex.apks",
5010*333d2b36SAndroid Build Coastguard Worker      filename: "com.company.android.myapex.capex"
5011*333d2b36SAndroid Build Coastguard Worker		}
5012*333d2b36SAndroid Build Coastguard Worker	`).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5013*333d2b36SAndroid Build Coastguard Worker
5014*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5015*333d2b36SAndroid Build Coastguard Worker		apex_set {
5016*333d2b36SAndroid Build Coastguard Worker 			name: "com.company.android.myapex",
5017*333d2b36SAndroid Build Coastguard Worker			apex_name: "com.android.myapex",
5018*333d2b36SAndroid Build Coastguard Worker			set: "company-myapex.apks",
5019*333d2b36SAndroid Build Coastguard Worker      filename: "some-random-suffix"
5020*333d2b36SAndroid Build Coastguard Worker		}
5021*333d2b36SAndroid Build Coastguard Worker	`)
5022*333d2b36SAndroid Build Coastguard Worker}
5023*333d2b36SAndroid Build Coastguard Worker
5024*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltOverrides(t *testing.T) {
5025*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
5026*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
5027*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
5028*333d2b36SAndroid Build Coastguard Worker			name: "myapex.prebuilt",
5029*333d2b36SAndroid Build Coastguard Worker			src: "myapex-arm.apex",
5030*333d2b36SAndroid Build Coastguard Worker			overrides: [
5031*333d2b36SAndroid Build Coastguard Worker				"myapex",
5032*333d2b36SAndroid Build Coastguard Worker			],
5033*333d2b36SAndroid Build Coastguard Worker		}
5034*333d2b36SAndroid Build Coastguard Worker	`)
5035*333d2b36SAndroid Build Coastguard Worker
5036*333d2b36SAndroid Build Coastguard Worker	testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5037*333d2b36SAndroid Build Coastguard Worker	p := testingModule.Module().(*Prebuilt)
5038*333d2b36SAndroid Build Coastguard Worker
5039*333d2b36SAndroid Build Coastguard Worker	expected := []string{"myapex"}
5040*333d2b36SAndroid Build Coastguard Worker	actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
5041*333d2b36SAndroid Build Coastguard Worker	if !reflect.DeepEqual(actual, expected) {
5042*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
5043*333d2b36SAndroid Build Coastguard Worker	}
5044*333d2b36SAndroid Build Coastguard Worker	rule := testingModule.Rule("genProvenanceMetaData")
5045*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5046*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5047*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5048*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
5049*333d2b36SAndroid Build Coastguard Worker}
5050*333d2b36SAndroid Build Coastguard Worker
5051*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltApexName(t *testing.T) {
5052*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
5053*333d2b36SAndroid Build Coastguard Worker	testApex(t, `
5054*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
5055*333d2b36SAndroid Build Coastguard Worker			name: "com.company.android.myapex",
5056*333d2b36SAndroid Build Coastguard Worker			apex_name: "com.android.myapex",
5057*333d2b36SAndroid Build Coastguard Worker			src: "company-myapex-arm.apex",
5058*333d2b36SAndroid Build Coastguard Worker		}
5059*333d2b36SAndroid Build Coastguard Worker	`).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5060*333d2b36SAndroid Build Coastguard Worker
5061*333d2b36SAndroid Build Coastguard Worker	testApex(t, `
5062*333d2b36SAndroid Build Coastguard Worker		apex_set {
5063*333d2b36SAndroid Build Coastguard Worker			name: "com.company.android.myapex",
5064*333d2b36SAndroid Build Coastguard Worker			apex_name: "com.android.myapex",
5065*333d2b36SAndroid Build Coastguard Worker			set: "company-myapex.apks",
5066*333d2b36SAndroid Build Coastguard Worker		}
5067*333d2b36SAndroid Build Coastguard Worker	`).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5068*333d2b36SAndroid Build Coastguard Worker}
5069*333d2b36SAndroid Build Coastguard Worker
5070*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5071*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
5072*333d2b36SAndroid Build Coastguard Worker	_ = android.GroupFixturePreparers(
5073*333d2b36SAndroid Build Coastguard Worker		java.PrepareForTestWithJavaDefaultModules,
5074*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithApexBuildComponents,
5075*333d2b36SAndroid Build Coastguard Worker		android.FixtureWithRootAndroidBp(`
5076*333d2b36SAndroid Build Coastguard Worker			platform_bootclasspath {
5077*333d2b36SAndroid Build Coastguard Worker				name: "platform-bootclasspath",
5078*333d2b36SAndroid Build Coastguard Worker				fragments: [
5079*333d2b36SAndroid Build Coastguard Worker					{
5080*333d2b36SAndroid Build Coastguard Worker						apex: "com.android.art",
5081*333d2b36SAndroid Build Coastguard Worker						module: "art-bootclasspath-fragment",
5082*333d2b36SAndroid Build Coastguard Worker					},
5083*333d2b36SAndroid Build Coastguard Worker				],
5084*333d2b36SAndroid Build Coastguard Worker			}
5085*333d2b36SAndroid Build Coastguard Worker
5086*333d2b36SAndroid Build Coastguard Worker			prebuilt_apex {
5087*333d2b36SAndroid Build Coastguard Worker				name: "com.company.android.art",
5088*333d2b36SAndroid Build Coastguard Worker				apex_name: "com.android.art",
5089*333d2b36SAndroid Build Coastguard Worker				src: "com.company.android.art-arm.apex",
5090*333d2b36SAndroid Build Coastguard Worker				exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5091*333d2b36SAndroid Build Coastguard Worker			}
5092*333d2b36SAndroid Build Coastguard Worker
5093*333d2b36SAndroid Build Coastguard Worker			prebuilt_bootclasspath_fragment {
5094*333d2b36SAndroid Build Coastguard Worker				name: "art-bootclasspath-fragment",
5095*333d2b36SAndroid Build Coastguard Worker				image_name: "art",
5096*333d2b36SAndroid Build Coastguard Worker				contents: ["core-oj"],
5097*333d2b36SAndroid Build Coastguard Worker				hidden_api: {
5098*333d2b36SAndroid Build Coastguard Worker					annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5099*333d2b36SAndroid Build Coastguard Worker					metadata: "my-bootclasspath-fragment/metadata.csv",
5100*333d2b36SAndroid Build Coastguard Worker					index: "my-bootclasspath-fragment/index.csv",
5101*333d2b36SAndroid Build Coastguard Worker					stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5102*333d2b36SAndroid Build Coastguard Worker					all_flags: "my-bootclasspath-fragment/all-flags.csv",
5103*333d2b36SAndroid Build Coastguard Worker				},
5104*333d2b36SAndroid Build Coastguard Worker			}
5105*333d2b36SAndroid Build Coastguard Worker
5106*333d2b36SAndroid Build Coastguard Worker			java_import {
5107*333d2b36SAndroid Build Coastguard Worker				name: "core-oj",
5108*333d2b36SAndroid Build Coastguard Worker				jars: ["prebuilt.jar"],
5109*333d2b36SAndroid Build Coastguard Worker			}
5110*333d2b36SAndroid Build Coastguard Worker		`),
5111*333d2b36SAndroid Build Coastguard Worker	).RunTest(t)
5112*333d2b36SAndroid Build Coastguard Worker}
5113*333d2b36SAndroid Build Coastguard Worker
5114*333d2b36SAndroid Build Coastguard Worker// A minimal context object for use with DexJarBuildPath
5115*333d2b36SAndroid Build Coastguard Workertype moduleErrorfTestCtx struct {
5116*333d2b36SAndroid Build Coastguard Worker}
5117*333d2b36SAndroid Build Coastguard Worker
5118*333d2b36SAndroid Build Coastguard Workerfunc (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5119*333d2b36SAndroid Build Coastguard Worker}
5120*333d2b36SAndroid Build Coastguard Worker
5121*333d2b36SAndroid Build Coastguard Workerfunc TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
5122*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
5123*333d2b36SAndroid Build Coastguard Worker	preparer := android.GroupFixturePreparers(
5124*333d2b36SAndroid Build Coastguard Worker		java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
5125*333d2b36SAndroid Build Coastguard Worker		// Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5126*333d2b36SAndroid Build Coastguard Worker		// is disabled.
5127*333d2b36SAndroid Build Coastguard Worker		android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5128*333d2b36SAndroid Build Coastguard Worker
5129*333d2b36SAndroid Build Coastguard Worker		// Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5130*333d2b36SAndroid Build Coastguard Worker		// file creation.
5131*333d2b36SAndroid Build Coastguard Worker		java.FixtureConfigureBootJars("platform:foo"),
5132*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyMockFS(func(fs android.MockFS) {
5133*333d2b36SAndroid Build Coastguard Worker			fs["platform/Android.bp"] = []byte(`
5134*333d2b36SAndroid Build Coastguard Worker		java_library {
5135*333d2b36SAndroid Build Coastguard Worker			name: "foo",
5136*333d2b36SAndroid Build Coastguard Worker			srcs: ["Test.java"],
5137*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
5138*333d2b36SAndroid Build Coastguard Worker		}
5139*333d2b36SAndroid Build Coastguard Worker		`)
5140*333d2b36SAndroid Build Coastguard Worker			fs["platform/Test.java"] = nil
5141*333d2b36SAndroid Build Coastguard Worker		}),
5142*333d2b36SAndroid Build Coastguard Worker	)
5143*333d2b36SAndroid Build Coastguard Worker
5144*333d2b36SAndroid Build Coastguard Worker	checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5145*333d2b36SAndroid Build Coastguard Worker		t.Helper()
5146*333d2b36SAndroid Build Coastguard Worker		platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5147*333d2b36SAndroid Build Coastguard Worker		var rule android.TestingBuildParams
5148*333d2b36SAndroid Build Coastguard Worker
5149*333d2b36SAndroid Build Coastguard Worker		rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5150*333d2b36SAndroid Build Coastguard Worker		java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
5151*333d2b36SAndroid Build Coastguard Worker	}
5152*333d2b36SAndroid Build Coastguard Worker
5153*333d2b36SAndroid Build Coastguard Worker	checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5154*333d2b36SAndroid Build Coastguard Worker		t.Helper()
5155*333d2b36SAndroid Build Coastguard Worker		platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5156*333d2b36SAndroid Build Coastguard Worker		var rule android.TestingBuildParams
5157*333d2b36SAndroid Build Coastguard Worker
5158*333d2b36SAndroid Build Coastguard Worker		rule = platformBootclasspath.Output("hiddenapi-index.csv")
5159*333d2b36SAndroid Build Coastguard Worker		java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5160*333d2b36SAndroid Build Coastguard Worker	}
5161*333d2b36SAndroid Build Coastguard Worker
5162*333d2b36SAndroid Build Coastguard Worker	fragment := java.ApexVariantReference{
5163*333d2b36SAndroid Build Coastguard Worker		Apex:   proptools.StringPtr("myapex"),
5164*333d2b36SAndroid Build Coastguard Worker		Module: proptools.StringPtr("my-bootclasspath-fragment"),
5165*333d2b36SAndroid Build Coastguard Worker	}
5166*333d2b36SAndroid Build Coastguard Worker
5167*333d2b36SAndroid Build Coastguard Worker	t.Run("prebuilt only", func(t *testing.T) {
5168*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
5169*333d2b36SAndroid Build Coastguard Worker		bp := `
5170*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
5171*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
5172*333d2b36SAndroid Build Coastguard Worker			arch: {
5173*333d2b36SAndroid Build Coastguard Worker				arm64: {
5174*333d2b36SAndroid Build Coastguard Worker					src: "myapex-arm64.apex",
5175*333d2b36SAndroid Build Coastguard Worker				},
5176*333d2b36SAndroid Build Coastguard Worker				arm: {
5177*333d2b36SAndroid Build Coastguard Worker					src: "myapex-arm.apex",
5178*333d2b36SAndroid Build Coastguard Worker				},
5179*333d2b36SAndroid Build Coastguard Worker			},
5180*333d2b36SAndroid Build Coastguard Worker			exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5181*333d2b36SAndroid Build Coastguard Worker		}
5182*333d2b36SAndroid Build Coastguard Worker
5183*333d2b36SAndroid Build Coastguard Worker		prebuilt_bootclasspath_fragment {
5184*333d2b36SAndroid Build Coastguard Worker			name: "my-bootclasspath-fragment",
5185*333d2b36SAndroid Build Coastguard Worker			contents: ["libfoo", "libbar"],
5186*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5187*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
5188*333d2b36SAndroid Build Coastguard Worker				annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5189*333d2b36SAndroid Build Coastguard Worker				metadata: "my-bootclasspath-fragment/metadata.csv",
5190*333d2b36SAndroid Build Coastguard Worker				index: "my-bootclasspath-fragment/index.csv",
5191*333d2b36SAndroid Build Coastguard Worker				signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5192*333d2b36SAndroid Build Coastguard Worker				filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5193*333d2b36SAndroid Build Coastguard Worker				filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
5194*333d2b36SAndroid Build Coastguard Worker			},
5195*333d2b36SAndroid Build Coastguard Worker		}
5196*333d2b36SAndroid Build Coastguard Worker
5197*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
5198*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
5199*333d2b36SAndroid Build Coastguard Worker			public: {
5200*333d2b36SAndroid Build Coastguard Worker				jars: ["libfoo.jar"],
5201*333d2b36SAndroid Build Coastguard Worker			},
5202*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5203*333d2b36SAndroid Build Coastguard Worker			shared_library: false,
5204*333d2b36SAndroid Build Coastguard Worker			permitted_packages: ["foo"],
5205*333d2b36SAndroid Build Coastguard Worker		}
5206*333d2b36SAndroid Build Coastguard Worker
5207*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
5208*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
5209*333d2b36SAndroid Build Coastguard Worker			public: {
5210*333d2b36SAndroid Build Coastguard Worker				jars: ["libbar.jar"],
5211*333d2b36SAndroid Build Coastguard Worker			},
5212*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5213*333d2b36SAndroid Build Coastguard Worker			shared_library: false,
5214*333d2b36SAndroid Build Coastguard Worker			permitted_packages: ["bar"],
5215*333d2b36SAndroid Build Coastguard Worker		}
5216*333d2b36SAndroid Build Coastguard Worker	`
5217*333d2b36SAndroid Build Coastguard Worker
5218*333d2b36SAndroid Build Coastguard Worker		ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
5219*333d2b36SAndroid Build Coastguard Worker
5220*333d2b36SAndroid Build Coastguard Worker		// Verify the correct module jars contribute to the hiddenapi index file.
5221*333d2b36SAndroid Build Coastguard Worker		checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
5222*333d2b36SAndroid Build Coastguard Worker		checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5223*333d2b36SAndroid Build Coastguard Worker			my-bootclasspath-fragment/index.csv
5224*333d2b36SAndroid Build Coastguard Worker			out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5225*333d2b36SAndroid Build Coastguard Worker			out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
5226*333d2b36SAndroid Build Coastguard Worker		`)
5227*333d2b36SAndroid Build Coastguard Worker	})
5228*333d2b36SAndroid Build Coastguard Worker
5229*333d2b36SAndroid Build Coastguard Worker	t.Run("apex_set only", func(t *testing.T) {
5230*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
5231*333d2b36SAndroid Build Coastguard Worker		bp := `
5232*333d2b36SAndroid Build Coastguard Worker		apex_set {
5233*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
5234*333d2b36SAndroid Build Coastguard Worker			set: "myapex.apks",
5235*333d2b36SAndroid Build Coastguard Worker			exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5236*333d2b36SAndroid Build Coastguard Worker			exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5237*333d2b36SAndroid Build Coastguard Worker		}
5238*333d2b36SAndroid Build Coastguard Worker
5239*333d2b36SAndroid Build Coastguard Worker		prebuilt_bootclasspath_fragment {
5240*333d2b36SAndroid Build Coastguard Worker			name: "my-bootclasspath-fragment",
5241*333d2b36SAndroid Build Coastguard Worker			contents: ["libfoo", "libbar"],
5242*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5243*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
5244*333d2b36SAndroid Build Coastguard Worker				annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5245*333d2b36SAndroid Build Coastguard Worker				metadata: "my-bootclasspath-fragment/metadata.csv",
5246*333d2b36SAndroid Build Coastguard Worker				index: "my-bootclasspath-fragment/index.csv",
5247*333d2b36SAndroid Build Coastguard Worker				signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5248*333d2b36SAndroid Build Coastguard Worker				filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5249*333d2b36SAndroid Build Coastguard Worker				filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
5250*333d2b36SAndroid Build Coastguard Worker			},
5251*333d2b36SAndroid Build Coastguard Worker		}
5252*333d2b36SAndroid Build Coastguard Worker
5253*333d2b36SAndroid Build Coastguard Worker		prebuilt_systemserverclasspath_fragment {
5254*333d2b36SAndroid Build Coastguard Worker			name: "my-systemserverclasspath-fragment",
5255*333d2b36SAndroid Build Coastguard Worker			contents: ["libbaz"],
5256*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5257*333d2b36SAndroid Build Coastguard Worker		}
5258*333d2b36SAndroid Build Coastguard Worker
5259*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
5260*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
5261*333d2b36SAndroid Build Coastguard Worker			public: {
5262*333d2b36SAndroid Build Coastguard Worker				jars: ["libfoo.jar"],
5263*333d2b36SAndroid Build Coastguard Worker			},
5264*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5265*333d2b36SAndroid Build Coastguard Worker			shared_library: false,
5266*333d2b36SAndroid Build Coastguard Worker			permitted_packages: ["libfoo"],
5267*333d2b36SAndroid Build Coastguard Worker		}
5268*333d2b36SAndroid Build Coastguard Worker
5269*333d2b36SAndroid Build Coastguard Worker
5270*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
5271*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
5272*333d2b36SAndroid Build Coastguard Worker			public: {
5273*333d2b36SAndroid Build Coastguard Worker				jars: ["libbar.jar"],
5274*333d2b36SAndroid Build Coastguard Worker			},
5275*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5276*333d2b36SAndroid Build Coastguard Worker			shared_library: false,
5277*333d2b36SAndroid Build Coastguard Worker			permitted_packages: ["bar"],
5278*333d2b36SAndroid Build Coastguard Worker		}
5279*333d2b36SAndroid Build Coastguard Worker
5280*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
5281*333d2b36SAndroid Build Coastguard Worker			name: "libbaz",
5282*333d2b36SAndroid Build Coastguard Worker			public: {
5283*333d2b36SAndroid Build Coastguard Worker				jars: ["libbaz.jar"],
5284*333d2b36SAndroid Build Coastguard Worker			},
5285*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5286*333d2b36SAndroid Build Coastguard Worker			shared_library: false,
5287*333d2b36SAndroid Build Coastguard Worker			permitted_packages: ["baz"],
5288*333d2b36SAndroid Build Coastguard Worker		}
5289*333d2b36SAndroid Build Coastguard Worker	`
5290*333d2b36SAndroid Build Coastguard Worker
5291*333d2b36SAndroid Build Coastguard Worker		ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
5292*333d2b36SAndroid Build Coastguard Worker
5293*333d2b36SAndroid Build Coastguard Worker		// Verify the correct module jars contribute to the hiddenapi index file.
5294*333d2b36SAndroid Build Coastguard Worker		checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
5295*333d2b36SAndroid Build Coastguard Worker		checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5296*333d2b36SAndroid Build Coastguard Worker			my-bootclasspath-fragment/index.csv
5297*333d2b36SAndroid Build Coastguard Worker			out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5298*333d2b36SAndroid Build Coastguard Worker			out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
5299*333d2b36SAndroid Build Coastguard Worker		`)
5300*333d2b36SAndroid Build Coastguard Worker
5301*333d2b36SAndroid Build Coastguard Worker		myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5302*333d2b36SAndroid Build Coastguard Worker
5303*333d2b36SAndroid Build Coastguard Worker		overrideNames := []string{
5304*333d2b36SAndroid Build Coastguard Worker			"",
5305*333d2b36SAndroid Build Coastguard Worker			"myjavalib.myapex",
5306*333d2b36SAndroid Build Coastguard Worker			"libfoo.myapex",
5307*333d2b36SAndroid Build Coastguard Worker			"libbar.myapex",
5308*333d2b36SAndroid Build Coastguard Worker			"libbaz.myapex",
5309*333d2b36SAndroid Build Coastguard Worker		}
5310*333d2b36SAndroid Build Coastguard Worker		mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5311*333d2b36SAndroid Build Coastguard Worker		for i, e := range mkEntries {
5312*333d2b36SAndroid Build Coastguard Worker			g := e.OverrideName
5313*333d2b36SAndroid Build Coastguard Worker			if w := overrideNames[i]; w != g {
5314*333d2b36SAndroid Build Coastguard Worker				t.Errorf("Expected override name %q, got %q", w, g)
5315*333d2b36SAndroid Build Coastguard Worker			}
5316*333d2b36SAndroid Build Coastguard Worker		}
5317*333d2b36SAndroid Build Coastguard Worker
5318*333d2b36SAndroid Build Coastguard Worker	})
5319*333d2b36SAndroid Build Coastguard Worker
5320*333d2b36SAndroid Build Coastguard Worker	t.Run("prebuilt with source library preferred", func(t *testing.T) {
5321*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
5322*333d2b36SAndroid Build Coastguard Worker		bp := `
5323*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
5324*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
5325*333d2b36SAndroid Build Coastguard Worker			arch: {
5326*333d2b36SAndroid Build Coastguard Worker				arm64: {
5327*333d2b36SAndroid Build Coastguard Worker					src: "myapex-arm64.apex",
5328*333d2b36SAndroid Build Coastguard Worker				},
5329*333d2b36SAndroid Build Coastguard Worker				arm: {
5330*333d2b36SAndroid Build Coastguard Worker					src: "myapex-arm.apex",
5331*333d2b36SAndroid Build Coastguard Worker				},
5332*333d2b36SAndroid Build Coastguard Worker			},
5333*333d2b36SAndroid Build Coastguard Worker			exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5334*333d2b36SAndroid Build Coastguard Worker		}
5335*333d2b36SAndroid Build Coastguard Worker
5336*333d2b36SAndroid Build Coastguard Worker		prebuilt_bootclasspath_fragment {
5337*333d2b36SAndroid Build Coastguard Worker			name: "my-bootclasspath-fragment",
5338*333d2b36SAndroid Build Coastguard Worker			contents: ["libfoo", "libbar"],
5339*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5340*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
5341*333d2b36SAndroid Build Coastguard Worker				annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5342*333d2b36SAndroid Build Coastguard Worker				metadata: "my-bootclasspath-fragment/metadata.csv",
5343*333d2b36SAndroid Build Coastguard Worker				index: "my-bootclasspath-fragment/index.csv",
5344*333d2b36SAndroid Build Coastguard Worker				stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5345*333d2b36SAndroid Build Coastguard Worker				all_flags: "my-bootclasspath-fragment/all-flags.csv",
5346*333d2b36SAndroid Build Coastguard Worker			},
5347*333d2b36SAndroid Build Coastguard Worker		}
5348*333d2b36SAndroid Build Coastguard Worker
5349*333d2b36SAndroid Build Coastguard Worker		java_import {
5350*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
5351*333d2b36SAndroid Build Coastguard Worker			jars: ["libfoo.jar"],
5352*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5353*333d2b36SAndroid Build Coastguard Worker			sdk_version: "core_current",
5354*333d2b36SAndroid Build Coastguard Worker		}
5355*333d2b36SAndroid Build Coastguard Worker
5356*333d2b36SAndroid Build Coastguard Worker		java_library {
5357*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
5358*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
5359*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5360*333d2b36SAndroid Build Coastguard Worker			sdk_version: "core_current",
5361*333d2b36SAndroid Build Coastguard Worker		}
5362*333d2b36SAndroid Build Coastguard Worker
5363*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
5364*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
5365*333d2b36SAndroid Build Coastguard Worker			public: {
5366*333d2b36SAndroid Build Coastguard Worker				jars: ["libbar.jar"],
5367*333d2b36SAndroid Build Coastguard Worker			},
5368*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5369*333d2b36SAndroid Build Coastguard Worker			shared_library: false,
5370*333d2b36SAndroid Build Coastguard Worker		}
5371*333d2b36SAndroid Build Coastguard Worker
5372*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
5373*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
5374*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
5375*333d2b36SAndroid Build Coastguard Worker			unsafe_ignore_missing_latest_api: true,
5376*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5377*333d2b36SAndroid Build Coastguard Worker		}
5378*333d2b36SAndroid Build Coastguard Worker	`
5379*333d2b36SAndroid Build Coastguard Worker
5380*333d2b36SAndroid Build Coastguard Worker		// In this test the source (java_library) libfoo is active since the
5381*333d2b36SAndroid Build Coastguard Worker		// prebuilt (java_import) defaults to prefer:false. However the
5382*333d2b36SAndroid Build Coastguard Worker		// prebuilt_apex module always depends on the prebuilt, and so it doesn't
5383*333d2b36SAndroid Build Coastguard Worker		// find the dex boot jar in it. We either need to disable the source libfoo
5384*333d2b36SAndroid Build Coastguard Worker		// or make the prebuilt libfoo preferred.
5385*333d2b36SAndroid Build Coastguard Worker		testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
5386*333d2b36SAndroid Build Coastguard Worker		// dexbootjar check is skipped if AllowMissingDependencies is true
5387*333d2b36SAndroid Build Coastguard Worker		preparerAllowMissingDeps := android.GroupFixturePreparers(
5388*333d2b36SAndroid Build Coastguard Worker			preparer,
5389*333d2b36SAndroid Build Coastguard Worker			android.PrepareForTestWithAllowMissingDependencies,
5390*333d2b36SAndroid Build Coastguard Worker		)
5391*333d2b36SAndroid Build Coastguard Worker		testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
5392*333d2b36SAndroid Build Coastguard Worker	})
5393*333d2b36SAndroid Build Coastguard Worker
5394*333d2b36SAndroid Build Coastguard Worker	t.Run("prebuilt library preferred with source", func(t *testing.T) {
5395*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
5396*333d2b36SAndroid Build Coastguard Worker		bp := `
5397*333d2b36SAndroid Build Coastguard Worker		apex {
5398*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
5399*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
5400*333d2b36SAndroid Build Coastguard Worker			updatable: false,
5401*333d2b36SAndroid Build Coastguard Worker			bootclasspath_fragments: ["my-bootclasspath-fragment"],
5402*333d2b36SAndroid Build Coastguard Worker		}
5403*333d2b36SAndroid Build Coastguard Worker
5404*333d2b36SAndroid Build Coastguard Worker		apex_key {
5405*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
5406*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
5407*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
5408*333d2b36SAndroid Build Coastguard Worker		}
5409*333d2b36SAndroid Build Coastguard Worker
5410*333d2b36SAndroid Build Coastguard Worker		bootclasspath_fragment {
5411*333d2b36SAndroid Build Coastguard Worker			name: "my-bootclasspath-fragment",
5412*333d2b36SAndroid Build Coastguard Worker			contents: ["libfoo", "libbar"],
5413*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5414*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
5415*333d2b36SAndroid Build Coastguard Worker				split_packages: ["*"],
5416*333d2b36SAndroid Build Coastguard Worker			},
5417*333d2b36SAndroid Build Coastguard Worker		}
5418*333d2b36SAndroid Build Coastguard Worker
5419*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
5420*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
5421*333d2b36SAndroid Build Coastguard Worker			arch: {
5422*333d2b36SAndroid Build Coastguard Worker				arm64: {
5423*333d2b36SAndroid Build Coastguard Worker					src: "myapex-arm64.apex",
5424*333d2b36SAndroid Build Coastguard Worker				},
5425*333d2b36SAndroid Build Coastguard Worker				arm: {
5426*333d2b36SAndroid Build Coastguard Worker					src: "myapex-arm.apex",
5427*333d2b36SAndroid Build Coastguard Worker				},
5428*333d2b36SAndroid Build Coastguard Worker			},
5429*333d2b36SAndroid Build Coastguard Worker			exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5430*333d2b36SAndroid Build Coastguard Worker		}
5431*333d2b36SAndroid Build Coastguard Worker
5432*333d2b36SAndroid Build Coastguard Worker		prebuilt_bootclasspath_fragment {
5433*333d2b36SAndroid Build Coastguard Worker			name: "my-bootclasspath-fragment",
5434*333d2b36SAndroid Build Coastguard Worker			prefer: true,
5435*333d2b36SAndroid Build Coastguard Worker			contents: ["libfoo", "libbar"],
5436*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5437*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
5438*333d2b36SAndroid Build Coastguard Worker				annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5439*333d2b36SAndroid Build Coastguard Worker				metadata: "my-bootclasspath-fragment/metadata.csv",
5440*333d2b36SAndroid Build Coastguard Worker				index: "my-bootclasspath-fragment/index.csv",
5441*333d2b36SAndroid Build Coastguard Worker				signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5442*333d2b36SAndroid Build Coastguard Worker				filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5443*333d2b36SAndroid Build Coastguard Worker				filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
5444*333d2b36SAndroid Build Coastguard Worker			},
5445*333d2b36SAndroid Build Coastguard Worker		}
5446*333d2b36SAndroid Build Coastguard Worker
5447*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
5448*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
5449*333d2b36SAndroid Build Coastguard Worker			prefer: true,
5450*333d2b36SAndroid Build Coastguard Worker			public: {
5451*333d2b36SAndroid Build Coastguard Worker				jars: ["libfoo.jar"],
5452*333d2b36SAndroid Build Coastguard Worker			},
5453*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5454*333d2b36SAndroid Build Coastguard Worker			shared_library: false,
5455*333d2b36SAndroid Build Coastguard Worker			permitted_packages: ["libfoo"],
5456*333d2b36SAndroid Build Coastguard Worker		}
5457*333d2b36SAndroid Build Coastguard Worker
5458*333d2b36SAndroid Build Coastguard Worker		java_library {
5459*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
5460*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
5461*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5462*333d2b36SAndroid Build Coastguard Worker			installable: true,
5463*333d2b36SAndroid Build Coastguard Worker			sdk_version: "core_current",
5464*333d2b36SAndroid Build Coastguard Worker		}
5465*333d2b36SAndroid Build Coastguard Worker
5466*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
5467*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
5468*333d2b36SAndroid Build Coastguard Worker			prefer: true,
5469*333d2b36SAndroid Build Coastguard Worker			public: {
5470*333d2b36SAndroid Build Coastguard Worker				jars: ["libbar.jar"],
5471*333d2b36SAndroid Build Coastguard Worker			},
5472*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5473*333d2b36SAndroid Build Coastguard Worker			shared_library: false,
5474*333d2b36SAndroid Build Coastguard Worker			permitted_packages: ["bar"],
5475*333d2b36SAndroid Build Coastguard Worker		}
5476*333d2b36SAndroid Build Coastguard Worker
5477*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
5478*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
5479*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
5480*333d2b36SAndroid Build Coastguard Worker			unsafe_ignore_missing_latest_api: true,
5481*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5482*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
5483*333d2b36SAndroid Build Coastguard Worker		}
5484*333d2b36SAndroid Build Coastguard Worker	`
5485*333d2b36SAndroid Build Coastguard Worker
5486*333d2b36SAndroid Build Coastguard Worker		ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
5487*333d2b36SAndroid Build Coastguard Worker
5488*333d2b36SAndroid Build Coastguard Worker		// Verify the correct module jars contribute to the hiddenapi index file.
5489*333d2b36SAndroid Build Coastguard Worker		checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
5490*333d2b36SAndroid Build Coastguard Worker		checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5491*333d2b36SAndroid Build Coastguard Worker			my-bootclasspath-fragment/index.csv
5492*333d2b36SAndroid Build Coastguard Worker			out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5493*333d2b36SAndroid Build Coastguard Worker			out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
5494*333d2b36SAndroid Build Coastguard Worker		`)
5495*333d2b36SAndroid Build Coastguard Worker	})
5496*333d2b36SAndroid Build Coastguard Worker
5497*333d2b36SAndroid Build Coastguard Worker	t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5498*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
5499*333d2b36SAndroid Build Coastguard Worker		bp := `
5500*333d2b36SAndroid Build Coastguard Worker		apex {
5501*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
5502*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
5503*333d2b36SAndroid Build Coastguard Worker			updatable: false,
5504*333d2b36SAndroid Build Coastguard Worker			bootclasspath_fragments: ["my-bootclasspath-fragment"],
5505*333d2b36SAndroid Build Coastguard Worker		}
5506*333d2b36SAndroid Build Coastguard Worker
5507*333d2b36SAndroid Build Coastguard Worker		apex_key {
5508*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
5509*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
5510*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
5511*333d2b36SAndroid Build Coastguard Worker		}
5512*333d2b36SAndroid Build Coastguard Worker
5513*333d2b36SAndroid Build Coastguard Worker		bootclasspath_fragment {
5514*333d2b36SAndroid Build Coastguard Worker			name: "my-bootclasspath-fragment",
5515*333d2b36SAndroid Build Coastguard Worker			contents: ["libfoo", "libbar"],
5516*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5517*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
5518*333d2b36SAndroid Build Coastguard Worker				split_packages: ["*"],
5519*333d2b36SAndroid Build Coastguard Worker			},
5520*333d2b36SAndroid Build Coastguard Worker		}
5521*333d2b36SAndroid Build Coastguard Worker
5522*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
5523*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
5524*333d2b36SAndroid Build Coastguard Worker			arch: {
5525*333d2b36SAndroid Build Coastguard Worker				arm64: {
5526*333d2b36SAndroid Build Coastguard Worker					src: "myapex-arm64.apex",
5527*333d2b36SAndroid Build Coastguard Worker				},
5528*333d2b36SAndroid Build Coastguard Worker				arm: {
5529*333d2b36SAndroid Build Coastguard Worker					src: "myapex-arm.apex",
5530*333d2b36SAndroid Build Coastguard Worker				},
5531*333d2b36SAndroid Build Coastguard Worker			},
5532*333d2b36SAndroid Build Coastguard Worker			exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5533*333d2b36SAndroid Build Coastguard Worker		}
5534*333d2b36SAndroid Build Coastguard Worker
5535*333d2b36SAndroid Build Coastguard Worker		prebuilt_bootclasspath_fragment {
5536*333d2b36SAndroid Build Coastguard Worker			name: "my-bootclasspath-fragment",
5537*333d2b36SAndroid Build Coastguard Worker			contents: ["libfoo", "libbar"],
5538*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5539*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
5540*333d2b36SAndroid Build Coastguard Worker				annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5541*333d2b36SAndroid Build Coastguard Worker				metadata: "my-bootclasspath-fragment/metadata.csv",
5542*333d2b36SAndroid Build Coastguard Worker				index: "my-bootclasspath-fragment/index.csv",
5543*333d2b36SAndroid Build Coastguard Worker				signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5544*333d2b36SAndroid Build Coastguard Worker				filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5545*333d2b36SAndroid Build Coastguard Worker				filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
5546*333d2b36SAndroid Build Coastguard Worker			},
5547*333d2b36SAndroid Build Coastguard Worker		}
5548*333d2b36SAndroid Build Coastguard Worker
5549*333d2b36SAndroid Build Coastguard Worker		java_import {
5550*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
5551*333d2b36SAndroid Build Coastguard Worker			jars: ["libfoo.jar"],
5552*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5553*333d2b36SAndroid Build Coastguard Worker			sdk_version: "core_current",
5554*333d2b36SAndroid Build Coastguard Worker		}
5555*333d2b36SAndroid Build Coastguard Worker
5556*333d2b36SAndroid Build Coastguard Worker		java_library {
5557*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
5558*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
5559*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5560*333d2b36SAndroid Build Coastguard Worker			permitted_packages: ["foo"],
5561*333d2b36SAndroid Build Coastguard Worker			installable: true,
5562*333d2b36SAndroid Build Coastguard Worker			sdk_version: "core_current",
5563*333d2b36SAndroid Build Coastguard Worker		}
5564*333d2b36SAndroid Build Coastguard Worker
5565*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
5566*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
5567*333d2b36SAndroid Build Coastguard Worker			public: {
5568*333d2b36SAndroid Build Coastguard Worker				jars: ["libbar.jar"],
5569*333d2b36SAndroid Build Coastguard Worker			},
5570*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5571*333d2b36SAndroid Build Coastguard Worker			shared_library: false,
5572*333d2b36SAndroid Build Coastguard Worker		}
5573*333d2b36SAndroid Build Coastguard Worker
5574*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
5575*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
5576*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
5577*333d2b36SAndroid Build Coastguard Worker			unsafe_ignore_missing_latest_api: true,
5578*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5579*333d2b36SAndroid Build Coastguard Worker			permitted_packages: ["bar"],
5580*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
5581*333d2b36SAndroid Build Coastguard Worker			sdk_version: "core_current",
5582*333d2b36SAndroid Build Coastguard Worker		}
5583*333d2b36SAndroid Build Coastguard Worker	`
5584*333d2b36SAndroid Build Coastguard Worker
5585*333d2b36SAndroid Build Coastguard Worker		ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
5586*333d2b36SAndroid Build Coastguard Worker
5587*333d2b36SAndroid Build Coastguard Worker		// Verify the correct module jars contribute to the hiddenapi index file.
5588*333d2b36SAndroid Build Coastguard Worker		checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
5589*333d2b36SAndroid Build Coastguard Worker		checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5590*333d2b36SAndroid Build Coastguard Worker			out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5591*333d2b36SAndroid Build Coastguard Worker			out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5592*333d2b36SAndroid Build Coastguard Worker			out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
5593*333d2b36SAndroid Build Coastguard Worker		`)
5594*333d2b36SAndroid Build Coastguard Worker	})
5595*333d2b36SAndroid Build Coastguard Worker
5596*333d2b36SAndroid Build Coastguard Worker	t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5597*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
5598*333d2b36SAndroid Build Coastguard Worker		bp := `
5599*333d2b36SAndroid Build Coastguard Worker		apex {
5600*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
5601*333d2b36SAndroid Build Coastguard Worker			enabled: false,
5602*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
5603*333d2b36SAndroid Build Coastguard Worker			bootclasspath_fragments: ["my-bootclasspath-fragment"],
5604*333d2b36SAndroid Build Coastguard Worker		}
5605*333d2b36SAndroid Build Coastguard Worker
5606*333d2b36SAndroid Build Coastguard Worker		apex_key {
5607*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
5608*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
5609*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
5610*333d2b36SAndroid Build Coastguard Worker		}
5611*333d2b36SAndroid Build Coastguard Worker
5612*333d2b36SAndroid Build Coastguard Worker		bootclasspath_fragment {
5613*333d2b36SAndroid Build Coastguard Worker			name: "my-bootclasspath-fragment",
5614*333d2b36SAndroid Build Coastguard Worker			enabled: false,
5615*333d2b36SAndroid Build Coastguard Worker			contents: ["libfoo", "libbar"],
5616*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5617*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
5618*333d2b36SAndroid Build Coastguard Worker				split_packages: ["*"],
5619*333d2b36SAndroid Build Coastguard Worker			},
5620*333d2b36SAndroid Build Coastguard Worker		}
5621*333d2b36SAndroid Build Coastguard Worker
5622*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
5623*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
5624*333d2b36SAndroid Build Coastguard Worker			arch: {
5625*333d2b36SAndroid Build Coastguard Worker				arm64: {
5626*333d2b36SAndroid Build Coastguard Worker					src: "myapex-arm64.apex",
5627*333d2b36SAndroid Build Coastguard Worker				},
5628*333d2b36SAndroid Build Coastguard Worker				arm: {
5629*333d2b36SAndroid Build Coastguard Worker					src: "myapex-arm.apex",
5630*333d2b36SAndroid Build Coastguard Worker				},
5631*333d2b36SAndroid Build Coastguard Worker			},
5632*333d2b36SAndroid Build Coastguard Worker			exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5633*333d2b36SAndroid Build Coastguard Worker		}
5634*333d2b36SAndroid Build Coastguard Worker
5635*333d2b36SAndroid Build Coastguard Worker		prebuilt_bootclasspath_fragment {
5636*333d2b36SAndroid Build Coastguard Worker			name: "my-bootclasspath-fragment",
5637*333d2b36SAndroid Build Coastguard Worker			contents: ["libfoo", "libbar"],
5638*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5639*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
5640*333d2b36SAndroid Build Coastguard Worker				annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5641*333d2b36SAndroid Build Coastguard Worker				metadata: "my-bootclasspath-fragment/metadata.csv",
5642*333d2b36SAndroid Build Coastguard Worker				index: "my-bootclasspath-fragment/index.csv",
5643*333d2b36SAndroid Build Coastguard Worker				signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5644*333d2b36SAndroid Build Coastguard Worker				filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5645*333d2b36SAndroid Build Coastguard Worker				filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
5646*333d2b36SAndroid Build Coastguard Worker			},
5647*333d2b36SAndroid Build Coastguard Worker		}
5648*333d2b36SAndroid Build Coastguard Worker
5649*333d2b36SAndroid Build Coastguard Worker		java_import {
5650*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
5651*333d2b36SAndroid Build Coastguard Worker			jars: ["libfoo.jar"],
5652*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5653*333d2b36SAndroid Build Coastguard Worker			permitted_packages: ["foo"],
5654*333d2b36SAndroid Build Coastguard Worker		}
5655*333d2b36SAndroid Build Coastguard Worker
5656*333d2b36SAndroid Build Coastguard Worker		java_library {
5657*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
5658*333d2b36SAndroid Build Coastguard Worker			enabled: false,
5659*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
5660*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5661*333d2b36SAndroid Build Coastguard Worker			installable: true,
5662*333d2b36SAndroid Build Coastguard Worker		}
5663*333d2b36SAndroid Build Coastguard Worker
5664*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
5665*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
5666*333d2b36SAndroid Build Coastguard Worker			public: {
5667*333d2b36SAndroid Build Coastguard Worker				jars: ["libbar.jar"],
5668*333d2b36SAndroid Build Coastguard Worker			},
5669*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5670*333d2b36SAndroid Build Coastguard Worker			shared_library: false,
5671*333d2b36SAndroid Build Coastguard Worker			permitted_packages: ["bar"],
5672*333d2b36SAndroid Build Coastguard Worker			prefer: true,
5673*333d2b36SAndroid Build Coastguard Worker		}
5674*333d2b36SAndroid Build Coastguard Worker
5675*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
5676*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
5677*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
5678*333d2b36SAndroid Build Coastguard Worker			unsafe_ignore_missing_latest_api: true,
5679*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5680*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
5681*333d2b36SAndroid Build Coastguard Worker		}
5682*333d2b36SAndroid Build Coastguard Worker	`
5683*333d2b36SAndroid Build Coastguard Worker		// This test disables libbar, which causes the ComponentDepsMutator to add
5684*333d2b36SAndroid Build Coastguard Worker		// deps on libbar.stubs and other sub-modules that don't exist. We can
5685*333d2b36SAndroid Build Coastguard Worker		// enable AllowMissingDependencies to work around that, but enabling that
5686*333d2b36SAndroid Build Coastguard Worker		// causes extra checks for missing source files to dex_bootjars, so add those
5687*333d2b36SAndroid Build Coastguard Worker		// to the mock fs as well.
5688*333d2b36SAndroid Build Coastguard Worker		preparer2 := android.GroupFixturePreparers(
5689*333d2b36SAndroid Build Coastguard Worker			preparer,
5690*333d2b36SAndroid Build Coastguard Worker			android.PrepareForTestWithAllowMissingDependencies,
5691*333d2b36SAndroid Build Coastguard Worker			android.FixtureMergeMockFs(map[string][]byte{
5692*333d2b36SAndroid Build Coastguard Worker				"build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
5693*333d2b36SAndroid Build Coastguard Worker				"frameworks/base/boot/boot-profile.txt":                        nil,
5694*333d2b36SAndroid Build Coastguard Worker			}),
5695*333d2b36SAndroid Build Coastguard Worker		)
5696*333d2b36SAndroid Build Coastguard Worker
5697*333d2b36SAndroid Build Coastguard Worker		ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
5698*333d2b36SAndroid Build Coastguard Worker
5699*333d2b36SAndroid Build Coastguard Worker		// Verify the correct module jars contribute to the hiddenapi index file.
5700*333d2b36SAndroid Build Coastguard Worker		checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
5701*333d2b36SAndroid Build Coastguard Worker		checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5702*333d2b36SAndroid Build Coastguard Worker			my-bootclasspath-fragment/index.csv
5703*333d2b36SAndroid Build Coastguard Worker			out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5704*333d2b36SAndroid Build Coastguard Worker			out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
5705*333d2b36SAndroid Build Coastguard Worker		`)
5706*333d2b36SAndroid Build Coastguard Worker	})
5707*333d2b36SAndroid Build Coastguard Worker
5708*333d2b36SAndroid Build Coastguard Worker	t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
5709*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
5710*333d2b36SAndroid Build Coastguard Worker		bp := `
5711*333d2b36SAndroid Build Coastguard Worker		// Source
5712*333d2b36SAndroid Build Coastguard Worker		apex {
5713*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
5714*333d2b36SAndroid Build Coastguard Worker			enabled: false,
5715*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
5716*333d2b36SAndroid Build Coastguard Worker			bootclasspath_fragments: ["my-bootclasspath-fragment"],
5717*333d2b36SAndroid Build Coastguard Worker		}
5718*333d2b36SAndroid Build Coastguard Worker
5719*333d2b36SAndroid Build Coastguard Worker		apex_key {
5720*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
5721*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
5722*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
5723*333d2b36SAndroid Build Coastguard Worker		}
5724*333d2b36SAndroid Build Coastguard Worker
5725*333d2b36SAndroid Build Coastguard Worker		// Prebuilt
5726*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
5727*333d2b36SAndroid Build Coastguard Worker			name: "myapex.v1",
5728*333d2b36SAndroid Build Coastguard Worker			source_apex_name: "myapex",
5729*333d2b36SAndroid Build Coastguard Worker			arch: {
5730*333d2b36SAndroid Build Coastguard Worker				arm64: {
5731*333d2b36SAndroid Build Coastguard Worker					src: "myapex-arm64.apex",
5732*333d2b36SAndroid Build Coastguard Worker				},
5733*333d2b36SAndroid Build Coastguard Worker				arm: {
5734*333d2b36SAndroid Build Coastguard Worker					src: "myapex-arm.apex",
5735*333d2b36SAndroid Build Coastguard Worker				},
5736*333d2b36SAndroid Build Coastguard Worker			},
5737*333d2b36SAndroid Build Coastguard Worker			exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5738*333d2b36SAndroid Build Coastguard Worker			prefer: true,
5739*333d2b36SAndroid Build Coastguard Worker		}
5740*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
5741*333d2b36SAndroid Build Coastguard Worker			name: "myapex.v2",
5742*333d2b36SAndroid Build Coastguard Worker			source_apex_name: "myapex",
5743*333d2b36SAndroid Build Coastguard Worker			arch: {
5744*333d2b36SAndroid Build Coastguard Worker				arm64: {
5745*333d2b36SAndroid Build Coastguard Worker					src: "myapex-arm64.apex",
5746*333d2b36SAndroid Build Coastguard Worker				},
5747*333d2b36SAndroid Build Coastguard Worker				arm: {
5748*333d2b36SAndroid Build Coastguard Worker					src: "myapex-arm.apex",
5749*333d2b36SAndroid Build Coastguard Worker				},
5750*333d2b36SAndroid Build Coastguard Worker			},
5751*333d2b36SAndroid Build Coastguard Worker			exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5752*333d2b36SAndroid Build Coastguard Worker			prefer: true,
5753*333d2b36SAndroid Build Coastguard Worker		}
5754*333d2b36SAndroid Build Coastguard Worker
5755*333d2b36SAndroid Build Coastguard Worker		prebuilt_bootclasspath_fragment {
5756*333d2b36SAndroid Build Coastguard Worker			name: "my-bootclasspath-fragment",
5757*333d2b36SAndroid Build Coastguard Worker			contents: ["libfoo", "libbar"],
5758*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5759*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
5760*333d2b36SAndroid Build Coastguard Worker				annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5761*333d2b36SAndroid Build Coastguard Worker				metadata: "my-bootclasspath-fragment/metadata.csv",
5762*333d2b36SAndroid Build Coastguard Worker				index: "my-bootclasspath-fragment/index.csv",
5763*333d2b36SAndroid Build Coastguard Worker				stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5764*333d2b36SAndroid Build Coastguard Worker				all_flags: "my-bootclasspath-fragment/all-flags.csv",
5765*333d2b36SAndroid Build Coastguard Worker			},
5766*333d2b36SAndroid Build Coastguard Worker			prefer: true,
5767*333d2b36SAndroid Build Coastguard Worker		}
5768*333d2b36SAndroid Build Coastguard Worker
5769*333d2b36SAndroid Build Coastguard Worker		java_import {
5770*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
5771*333d2b36SAndroid Build Coastguard Worker			jars: ["libfoo.jar"],
5772*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5773*333d2b36SAndroid Build Coastguard Worker			prefer: true,
5774*333d2b36SAndroid Build Coastguard Worker		}
5775*333d2b36SAndroid Build Coastguard Worker		java_import {
5776*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
5777*333d2b36SAndroid Build Coastguard Worker			jars: ["libbar.jar"],
5778*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5779*333d2b36SAndroid Build Coastguard Worker			prefer: true,
5780*333d2b36SAndroid Build Coastguard Worker		}
5781*333d2b36SAndroid Build Coastguard Worker	`
5782*333d2b36SAndroid Build Coastguard Worker
5783*333d2b36SAndroid Build Coastguard Worker		testDexpreoptWithApexes(t, bp, "Multiple prebuilt modules prebuilt_myapex.v1 and prebuilt_myapex.v2 have been marked as preferred for this source module", preparer, fragment)
5784*333d2b36SAndroid Build Coastguard Worker	})
5785*333d2b36SAndroid Build Coastguard Worker
5786*333d2b36SAndroid Build Coastguard Worker}
5787*333d2b36SAndroid Build Coastguard Worker
5788*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithTests(t *testing.T) {
5789*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
5790*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
5791*333d2b36SAndroid Build Coastguard Worker		apex_test {
5792*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
5793*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
5794*333d2b36SAndroid Build Coastguard Worker			updatable: false,
5795*333d2b36SAndroid Build Coastguard Worker			tests: [
5796*333d2b36SAndroid Build Coastguard Worker				"mytest",
5797*333d2b36SAndroid Build Coastguard Worker			],
5798*333d2b36SAndroid Build Coastguard Worker		}
5799*333d2b36SAndroid Build Coastguard Worker
5800*333d2b36SAndroid Build Coastguard Worker		apex_key {
5801*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
5802*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
5803*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
5804*333d2b36SAndroid Build Coastguard Worker		}
5805*333d2b36SAndroid Build Coastguard Worker
5806*333d2b36SAndroid Build Coastguard Worker		filegroup {
5807*333d2b36SAndroid Build Coastguard Worker			name: "fg",
5808*333d2b36SAndroid Build Coastguard Worker			srcs: [
5809*333d2b36SAndroid Build Coastguard Worker				"baz",
5810*333d2b36SAndroid Build Coastguard Worker				"bar/baz"
5811*333d2b36SAndroid Build Coastguard Worker			],
5812*333d2b36SAndroid Build Coastguard Worker		}
5813*333d2b36SAndroid Build Coastguard Worker
5814*333d2b36SAndroid Build Coastguard Worker		cc_test {
5815*333d2b36SAndroid Build Coastguard Worker			name: "mytest",
5816*333d2b36SAndroid Build Coastguard Worker			gtest: false,
5817*333d2b36SAndroid Build Coastguard Worker			srcs: ["mytest.cpp"],
5818*333d2b36SAndroid Build Coastguard Worker			relative_install_path: "test",
5819*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["mylib"],
5820*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
5821*333d2b36SAndroid Build Coastguard Worker			static_executable: true,
5822*333d2b36SAndroid Build Coastguard Worker			stl: "none",
5823*333d2b36SAndroid Build Coastguard Worker			data: [":fg"],
5824*333d2b36SAndroid Build Coastguard Worker		}
5825*333d2b36SAndroid Build Coastguard Worker
5826*333d2b36SAndroid Build Coastguard Worker		cc_library {
5827*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
5828*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
5829*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
5830*333d2b36SAndroid Build Coastguard Worker			stl: "none",
5831*333d2b36SAndroid Build Coastguard Worker		}
5832*333d2b36SAndroid Build Coastguard Worker
5833*333d2b36SAndroid Build Coastguard Worker		filegroup {
5834*333d2b36SAndroid Build Coastguard Worker			name: "fg2",
5835*333d2b36SAndroid Build Coastguard Worker			srcs: [
5836*333d2b36SAndroid Build Coastguard Worker				"testdata/baz"
5837*333d2b36SAndroid Build Coastguard Worker			],
5838*333d2b36SAndroid Build Coastguard Worker		}
5839*333d2b36SAndroid Build Coastguard Worker	`)
5840*333d2b36SAndroid Build Coastguard Worker
5841*333d2b36SAndroid Build Coastguard Worker	apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
5842*333d2b36SAndroid Build Coastguard Worker	copyCmds := apexRule.Args["copy_commands"]
5843*333d2b36SAndroid Build Coastguard Worker
5844*333d2b36SAndroid Build Coastguard Worker	// Ensure that test dep (and their transitive dependencies) are copied into apex.
5845*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
5846*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
5847*333d2b36SAndroid Build Coastguard Worker
5848*333d2b36SAndroid Build Coastguard Worker	//Ensure that test data are copied into apex.
5849*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5850*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5851*333d2b36SAndroid Build Coastguard Worker
5852*333d2b36SAndroid Build Coastguard Worker	// Ensure the module is correctly translated.
5853*333d2b36SAndroid Build Coastguard Worker	bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
5854*333d2b36SAndroid Build Coastguard Worker	data := android.AndroidMkDataForTest(t, ctx, bundle)
5855*333d2b36SAndroid Build Coastguard Worker	name := bundle.BaseModuleName()
5856*333d2b36SAndroid Build Coastguard Worker	prefix := "TARGET_"
5857*333d2b36SAndroid Build Coastguard Worker	var builder strings.Builder
5858*333d2b36SAndroid Build Coastguard Worker	data.Custom(&builder, name, prefix, "", data)
5859*333d2b36SAndroid Build Coastguard Worker	androidMk := builder.String()
5860*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5861*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
5862*333d2b36SAndroid Build Coastguard Worker}
5863*333d2b36SAndroid Build Coastguard Worker
5864*333d2b36SAndroid Build Coastguard Workerfunc TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5865*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
5866*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5867*333d2b36SAndroid Build Coastguard Worker		apex {
5868*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
5869*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
5870*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["libfoo"],
5871*333d2b36SAndroid Build Coastguard Worker		}
5872*333d2b36SAndroid Build Coastguard Worker
5873*333d2b36SAndroid Build Coastguard Worker		apex_key {
5874*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
5875*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
5876*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
5877*333d2b36SAndroid Build Coastguard Worker		}
5878*333d2b36SAndroid Build Coastguard Worker
5879*333d2b36SAndroid Build Coastguard Worker		cc_library {
5880*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
5881*333d2b36SAndroid Build Coastguard Worker			stl: "none",
5882*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
5883*333d2b36SAndroid Build Coastguard Worker			enabled: false,
5884*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5885*333d2b36SAndroid Build Coastguard Worker		}
5886*333d2b36SAndroid Build Coastguard Worker	`)
5887*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5888*333d2b36SAndroid Build Coastguard Worker		apex {
5889*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
5890*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
5891*333d2b36SAndroid Build Coastguard Worker			java_libs: ["myjar"],
5892*333d2b36SAndroid Build Coastguard Worker		}
5893*333d2b36SAndroid Build Coastguard Worker
5894*333d2b36SAndroid Build Coastguard Worker		apex_key {
5895*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
5896*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
5897*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
5898*333d2b36SAndroid Build Coastguard Worker		}
5899*333d2b36SAndroid Build Coastguard Worker
5900*333d2b36SAndroid Build Coastguard Worker		java_library {
5901*333d2b36SAndroid Build Coastguard Worker			name: "myjar",
5902*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
5903*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
5904*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
5905*333d2b36SAndroid Build Coastguard Worker			enabled: false,
5906*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5907*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
5908*333d2b36SAndroid Build Coastguard Worker		}
5909*333d2b36SAndroid Build Coastguard Worker	`)
5910*333d2b36SAndroid Build Coastguard Worker}
5911*333d2b36SAndroid Build Coastguard Worker
5912*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithJavaImport(t *testing.T) {
5913*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
5914*333d2b36SAndroid Build Coastguard Worker		apex {
5915*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
5916*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
5917*333d2b36SAndroid Build Coastguard Worker			java_libs: ["myjavaimport"],
5918*333d2b36SAndroid Build Coastguard Worker			updatable: false,
5919*333d2b36SAndroid Build Coastguard Worker		}
5920*333d2b36SAndroid Build Coastguard Worker
5921*333d2b36SAndroid Build Coastguard Worker		apex_key {
5922*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
5923*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
5924*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
5925*333d2b36SAndroid Build Coastguard Worker		}
5926*333d2b36SAndroid Build Coastguard Worker
5927*333d2b36SAndroid Build Coastguard Worker		java_import {
5928*333d2b36SAndroid Build Coastguard Worker			name: "myjavaimport",
5929*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
5930*333d2b36SAndroid Build Coastguard Worker			jars: ["my.jar"],
5931*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
5932*333d2b36SAndroid Build Coastguard Worker		}
5933*333d2b36SAndroid Build Coastguard Worker	`)
5934*333d2b36SAndroid Build Coastguard Worker
5935*333d2b36SAndroid Build Coastguard Worker	module := ctx.ModuleForTests("myapex", "android_common_myapex")
5936*333d2b36SAndroid Build Coastguard Worker	apexRule := module.Rule("apexRule")
5937*333d2b36SAndroid Build Coastguard Worker	copyCmds := apexRule.Args["copy_commands"]
5938*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5939*333d2b36SAndroid Build Coastguard Worker}
5940*333d2b36SAndroid Build Coastguard Worker
5941*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithApps(t *testing.T) {
5942*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
5943*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
5944*333d2b36SAndroid Build Coastguard Worker		apex {
5945*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
5946*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
5947*333d2b36SAndroid Build Coastguard Worker			apps: [
5948*333d2b36SAndroid Build Coastguard Worker				"AppFoo",
5949*333d2b36SAndroid Build Coastguard Worker				"AppFooPriv",
5950*333d2b36SAndroid Build Coastguard Worker			],
5951*333d2b36SAndroid Build Coastguard Worker			updatable: false,
5952*333d2b36SAndroid Build Coastguard Worker		}
5953*333d2b36SAndroid Build Coastguard Worker
5954*333d2b36SAndroid Build Coastguard Worker		apex_key {
5955*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
5956*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
5957*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
5958*333d2b36SAndroid Build Coastguard Worker		}
5959*333d2b36SAndroid Build Coastguard Worker
5960*333d2b36SAndroid Build Coastguard Worker		android_app {
5961*333d2b36SAndroid Build Coastguard Worker			name: "AppFoo",
5962*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
5963*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
5964*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
5965*333d2b36SAndroid Build Coastguard Worker			use_embedded_native_libs: true,
5966*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
5967*333d2b36SAndroid Build Coastguard Worker			stl: "none",
5968*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
5969*333d2b36SAndroid Build Coastguard Worker		}
5970*333d2b36SAndroid Build Coastguard Worker
5971*333d2b36SAndroid Build Coastguard Worker		android_app {
5972*333d2b36SAndroid Build Coastguard Worker			name: "AppFooPriv",
5973*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
5974*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
5975*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
5976*333d2b36SAndroid Build Coastguard Worker			privileged: true,
5977*333d2b36SAndroid Build Coastguard Worker			privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
5978*333d2b36SAndroid Build Coastguard Worker			stl: "none",
5979*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
5980*333d2b36SAndroid Build Coastguard Worker		}
5981*333d2b36SAndroid Build Coastguard Worker
5982*333d2b36SAndroid Build Coastguard Worker		cc_library_shared {
5983*333d2b36SAndroid Build Coastguard Worker			name: "libjni",
5984*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
5985*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libfoo"],
5986*333d2b36SAndroid Build Coastguard Worker			stl: "none",
5987*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
5988*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
5989*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
5990*333d2b36SAndroid Build Coastguard Worker		}
5991*333d2b36SAndroid Build Coastguard Worker
5992*333d2b36SAndroid Build Coastguard Worker		cc_library_shared {
5993*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
5994*333d2b36SAndroid Build Coastguard Worker			stl: "none",
5995*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
5996*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
5997*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
5998*333d2b36SAndroid Build Coastguard Worker		}
5999*333d2b36SAndroid Build Coastguard Worker	`)
6000*333d2b36SAndroid Build Coastguard Worker
6001*333d2b36SAndroid Build Coastguard Worker	module := ctx.ModuleForTests("myapex", "android_common_myapex")
6002*333d2b36SAndroid Build Coastguard Worker	apexRule := module.Rule("apexRule")
6003*333d2b36SAndroid Build Coastguard Worker	copyCmds := apexRule.Args["copy_commands"]
6004*333d2b36SAndroid Build Coastguard Worker
6005*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6006*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
6007*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
6008*333d2b36SAndroid Build Coastguard Worker
6009*333d2b36SAndroid Build Coastguard Worker	appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
6010*333d2b36SAndroid Build Coastguard Worker	// JNI libraries are uncompressed
6011*333d2b36SAndroid Build Coastguard Worker	if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
6012*333d2b36SAndroid Build Coastguard Worker		t.Errorf("jni libs are not uncompressed for AppFoo")
6013*333d2b36SAndroid Build Coastguard Worker	}
6014*333d2b36SAndroid Build Coastguard Worker	// JNI libraries including transitive deps are
6015*333d2b36SAndroid Build Coastguard Worker	for _, jni := range []string{"libjni", "libfoo"} {
6016*333d2b36SAndroid Build Coastguard Worker		jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
6017*333d2b36SAndroid Build Coastguard Worker		// ... embedded inside APK (jnilibs.zip)
6018*333d2b36SAndroid Build Coastguard Worker		ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6019*333d2b36SAndroid Build Coastguard Worker		// ... and not directly inside the APEX
6020*333d2b36SAndroid Build Coastguard Worker		ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6021*333d2b36SAndroid Build Coastguard Worker	}
6022*333d2b36SAndroid Build Coastguard Worker
6023*333d2b36SAndroid Build Coastguard Worker	apexBundle := module.Module().(*apexBundle)
6024*333d2b36SAndroid Build Coastguard Worker	data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6025*333d2b36SAndroid Build Coastguard Worker	var builder strings.Builder
6026*333d2b36SAndroid Build Coastguard Worker	data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6027*333d2b36SAndroid Build Coastguard Worker	androidMk := builder.String()
6028*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6029*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6030*333d2b36SAndroid Build Coastguard Worker	ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6031*333d2b36SAndroid Build Coastguard Worker	ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6032*333d2b36SAndroid Build Coastguard Worker	ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6033*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := privapp_allowlist_com.android.AppFooPriv.xml:$(PRODUCT_OUT)/apex/myapex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
6034*333d2b36SAndroid Build Coastguard Worker}
6035*333d2b36SAndroid Build Coastguard Worker
6036*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithAppImportBuildId(t *testing.T) {
6037*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
6038*333d2b36SAndroid Build Coastguard Worker	invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6039*333d2b36SAndroid Build Coastguard Worker	for _, id := range invalidBuildIds {
6040*333d2b36SAndroid Build Coastguard Worker		message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6041*333d2b36SAndroid Build Coastguard Worker		fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6042*333d2b36SAndroid Build Coastguard Worker			variables.BuildId = proptools.StringPtr(id)
6043*333d2b36SAndroid Build Coastguard Worker		})
6044*333d2b36SAndroid Build Coastguard Worker		testApexError(t, message, `apex {
6045*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
6046*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
6047*333d2b36SAndroid Build Coastguard Worker			apps: ["AppFooPrebuilt"],
6048*333d2b36SAndroid Build Coastguard Worker			updatable: false,
6049*333d2b36SAndroid Build Coastguard Worker		}
6050*333d2b36SAndroid Build Coastguard Worker
6051*333d2b36SAndroid Build Coastguard Worker		apex_key {
6052*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
6053*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
6054*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
6055*333d2b36SAndroid Build Coastguard Worker		}
6056*333d2b36SAndroid Build Coastguard Worker
6057*333d2b36SAndroid Build Coastguard Worker		android_app_import {
6058*333d2b36SAndroid Build Coastguard Worker			name: "AppFooPrebuilt",
6059*333d2b36SAndroid Build Coastguard Worker			apk: "PrebuiltAppFoo.apk",
6060*333d2b36SAndroid Build Coastguard Worker			presigned: true,
6061*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
6062*333d2b36SAndroid Build Coastguard Worker		}
6063*333d2b36SAndroid Build Coastguard Worker	`, fixture)
6064*333d2b36SAndroid Build Coastguard Worker	}
6065*333d2b36SAndroid Build Coastguard Worker}
6066*333d2b36SAndroid Build Coastguard Worker
6067*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithAppImports(t *testing.T) {
6068*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
6069*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
6070*333d2b36SAndroid Build Coastguard Worker		apex {
6071*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
6072*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
6073*333d2b36SAndroid Build Coastguard Worker			apps: [
6074*333d2b36SAndroid Build Coastguard Worker				"AppFooPrebuilt",
6075*333d2b36SAndroid Build Coastguard Worker				"AppFooPrivPrebuilt",
6076*333d2b36SAndroid Build Coastguard Worker			],
6077*333d2b36SAndroid Build Coastguard Worker			updatable: false,
6078*333d2b36SAndroid Build Coastguard Worker		}
6079*333d2b36SAndroid Build Coastguard Worker
6080*333d2b36SAndroid Build Coastguard Worker		apex_key {
6081*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
6082*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
6083*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
6084*333d2b36SAndroid Build Coastguard Worker		}
6085*333d2b36SAndroid Build Coastguard Worker
6086*333d2b36SAndroid Build Coastguard Worker		android_app_import {
6087*333d2b36SAndroid Build Coastguard Worker			name: "AppFooPrebuilt",
6088*333d2b36SAndroid Build Coastguard Worker			apk: "PrebuiltAppFoo.apk",
6089*333d2b36SAndroid Build Coastguard Worker			presigned: true,
6090*333d2b36SAndroid Build Coastguard Worker			dex_preopt: {
6091*333d2b36SAndroid Build Coastguard Worker				enabled: false,
6092*333d2b36SAndroid Build Coastguard Worker			},
6093*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
6094*333d2b36SAndroid Build Coastguard Worker		}
6095*333d2b36SAndroid Build Coastguard Worker
6096*333d2b36SAndroid Build Coastguard Worker		android_app_import {
6097*333d2b36SAndroid Build Coastguard Worker			name: "AppFooPrivPrebuilt",
6098*333d2b36SAndroid Build Coastguard Worker			apk: "PrebuiltAppFooPriv.apk",
6099*333d2b36SAndroid Build Coastguard Worker			privileged: true,
6100*333d2b36SAndroid Build Coastguard Worker			presigned: true,
6101*333d2b36SAndroid Build Coastguard Worker			dex_preopt: {
6102*333d2b36SAndroid Build Coastguard Worker				enabled: false,
6103*333d2b36SAndroid Build Coastguard Worker			},
6104*333d2b36SAndroid Build Coastguard Worker			filename: "AwesomePrebuiltAppFooPriv.apk",
6105*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
6106*333d2b36SAndroid Build Coastguard Worker		}
6107*333d2b36SAndroid Build Coastguard Worker	`)
6108*333d2b36SAndroid Build Coastguard Worker
6109*333d2b36SAndroid Build Coastguard Worker	module := ctx.ModuleForTests("myapex", "android_common_myapex")
6110*333d2b36SAndroid Build Coastguard Worker	apexRule := module.Rule("apexRule")
6111*333d2b36SAndroid Build Coastguard Worker	copyCmds := apexRule.Args["copy_commands"]
6112*333d2b36SAndroid Build Coastguard Worker
6113*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6114*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
6115*333d2b36SAndroid Build Coastguard Worker}
6116*333d2b36SAndroid Build Coastguard Worker
6117*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithAppImportsPrefer(t *testing.T) {
6118*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
6119*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
6120*333d2b36SAndroid Build Coastguard Worker		apex {
6121*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
6122*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
6123*333d2b36SAndroid Build Coastguard Worker			apps: [
6124*333d2b36SAndroid Build Coastguard Worker				"AppFoo",
6125*333d2b36SAndroid Build Coastguard Worker			],
6126*333d2b36SAndroid Build Coastguard Worker			updatable: false,
6127*333d2b36SAndroid Build Coastguard Worker		}
6128*333d2b36SAndroid Build Coastguard Worker
6129*333d2b36SAndroid Build Coastguard Worker		apex_key {
6130*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
6131*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
6132*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
6133*333d2b36SAndroid Build Coastguard Worker		}
6134*333d2b36SAndroid Build Coastguard Worker
6135*333d2b36SAndroid Build Coastguard Worker		android_app {
6136*333d2b36SAndroid Build Coastguard Worker			name: "AppFoo",
6137*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
6138*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
6139*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
6140*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
6141*333d2b36SAndroid Build Coastguard Worker		}
6142*333d2b36SAndroid Build Coastguard Worker
6143*333d2b36SAndroid Build Coastguard Worker		android_app_import {
6144*333d2b36SAndroid Build Coastguard Worker			name: "AppFoo",
6145*333d2b36SAndroid Build Coastguard Worker			apk: "AppFooPrebuilt.apk",
6146*333d2b36SAndroid Build Coastguard Worker			filename: "AppFooPrebuilt.apk",
6147*333d2b36SAndroid Build Coastguard Worker			presigned: true,
6148*333d2b36SAndroid Build Coastguard Worker			prefer: true,
6149*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
6150*333d2b36SAndroid Build Coastguard Worker		}
6151*333d2b36SAndroid Build Coastguard Worker	`, withFiles(map[string][]byte{
6152*333d2b36SAndroid Build Coastguard Worker		"AppFooPrebuilt.apk": nil,
6153*333d2b36SAndroid Build Coastguard Worker	}))
6154*333d2b36SAndroid Build Coastguard Worker
6155*333d2b36SAndroid Build Coastguard Worker	ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
6156*333d2b36SAndroid Build Coastguard Worker		"app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
6157*333d2b36SAndroid Build Coastguard Worker	})
6158*333d2b36SAndroid Build Coastguard Worker}
6159*333d2b36SAndroid Build Coastguard Worker
6160*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithTestHelperApp(t *testing.T) {
6161*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
6162*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
6163*333d2b36SAndroid Build Coastguard Worker		apex {
6164*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
6165*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
6166*333d2b36SAndroid Build Coastguard Worker			apps: [
6167*333d2b36SAndroid Build Coastguard Worker				"TesterHelpAppFoo",
6168*333d2b36SAndroid Build Coastguard Worker			],
6169*333d2b36SAndroid Build Coastguard Worker			updatable: false,
6170*333d2b36SAndroid Build Coastguard Worker		}
6171*333d2b36SAndroid Build Coastguard Worker
6172*333d2b36SAndroid Build Coastguard Worker		apex_key {
6173*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
6174*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
6175*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
6176*333d2b36SAndroid Build Coastguard Worker		}
6177*333d2b36SAndroid Build Coastguard Worker
6178*333d2b36SAndroid Build Coastguard Worker		android_test_helper_app {
6179*333d2b36SAndroid Build Coastguard Worker			name: "TesterHelpAppFoo",
6180*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
6181*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
6182*333d2b36SAndroid Build Coastguard Worker			sdk_version: "test_current",
6183*333d2b36SAndroid Build Coastguard Worker		}
6184*333d2b36SAndroid Build Coastguard Worker
6185*333d2b36SAndroid Build Coastguard Worker	`)
6186*333d2b36SAndroid Build Coastguard Worker
6187*333d2b36SAndroid Build Coastguard Worker	module := ctx.ModuleForTests("myapex", "android_common_myapex")
6188*333d2b36SAndroid Build Coastguard Worker	apexRule := module.Rule("apexRule")
6189*333d2b36SAndroid Build Coastguard Worker	copyCmds := apexRule.Args["copy_commands"]
6190*333d2b36SAndroid Build Coastguard Worker
6191*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
6192*333d2b36SAndroid Build Coastguard Worker}
6193*333d2b36SAndroid Build Coastguard Worker
6194*333d2b36SAndroid Build Coastguard Workerfunc TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6195*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
6196*333d2b36SAndroid Build Coastguard Worker	// libfoo's apex_available comes from cc_defaults
6197*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
6198*333d2b36SAndroid Build Coastguard Worker	apex {
6199*333d2b36SAndroid Build Coastguard Worker		name: "myapex",
6200*333d2b36SAndroid Build Coastguard Worker		key: "myapex.key",
6201*333d2b36SAndroid Build Coastguard Worker		native_shared_libs: ["libfoo"],
6202*333d2b36SAndroid Build Coastguard Worker		updatable: false,
6203*333d2b36SAndroid Build Coastguard Worker	}
6204*333d2b36SAndroid Build Coastguard Worker
6205*333d2b36SAndroid Build Coastguard Worker	apex_key {
6206*333d2b36SAndroid Build Coastguard Worker		name: "myapex.key",
6207*333d2b36SAndroid Build Coastguard Worker		public_key: "testkey.avbpubkey",
6208*333d2b36SAndroid Build Coastguard Worker		private_key: "testkey.pem",
6209*333d2b36SAndroid Build Coastguard Worker	}
6210*333d2b36SAndroid Build Coastguard Worker
6211*333d2b36SAndroid Build Coastguard Worker	apex {
6212*333d2b36SAndroid Build Coastguard Worker		name: "otherapex",
6213*333d2b36SAndroid Build Coastguard Worker		key: "myapex.key",
6214*333d2b36SAndroid Build Coastguard Worker		native_shared_libs: ["libfoo"],
6215*333d2b36SAndroid Build Coastguard Worker		updatable: false,
6216*333d2b36SAndroid Build Coastguard Worker	}
6217*333d2b36SAndroid Build Coastguard Worker
6218*333d2b36SAndroid Build Coastguard Worker	cc_defaults {
6219*333d2b36SAndroid Build Coastguard Worker		name: "libfoo-defaults",
6220*333d2b36SAndroid Build Coastguard Worker		apex_available: ["otherapex"],
6221*333d2b36SAndroid Build Coastguard Worker	}
6222*333d2b36SAndroid Build Coastguard Worker
6223*333d2b36SAndroid Build Coastguard Worker	cc_library {
6224*333d2b36SAndroid Build Coastguard Worker		name: "libfoo",
6225*333d2b36SAndroid Build Coastguard Worker		defaults: ["libfoo-defaults"],
6226*333d2b36SAndroid Build Coastguard Worker		stl: "none",
6227*333d2b36SAndroid Build Coastguard Worker		system_shared_libs: [],
6228*333d2b36SAndroid Build Coastguard Worker	}`)
6229*333d2b36SAndroid Build Coastguard Worker}
6230*333d2b36SAndroid Build Coastguard Worker
6231*333d2b36SAndroid Build Coastguard Workerfunc TestApexAvailable_DirectDep(t *testing.T) {
6232*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
6233*333d2b36SAndroid Build Coastguard Worker	// libfoo is not available to myapex, but only to otherapex
6234*333d2b36SAndroid Build Coastguard Worker	testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6235*333d2b36SAndroid Build Coastguard Worker	apex {
6236*333d2b36SAndroid Build Coastguard Worker		name: "myapex",
6237*333d2b36SAndroid Build Coastguard Worker		key: "myapex.key",
6238*333d2b36SAndroid Build Coastguard Worker		native_shared_libs: ["libfoo"],
6239*333d2b36SAndroid Build Coastguard Worker		updatable: false,
6240*333d2b36SAndroid Build Coastguard Worker	}
6241*333d2b36SAndroid Build Coastguard Worker
6242*333d2b36SAndroid Build Coastguard Worker	apex_key {
6243*333d2b36SAndroid Build Coastguard Worker		name: "myapex.key",
6244*333d2b36SAndroid Build Coastguard Worker		public_key: "testkey.avbpubkey",
6245*333d2b36SAndroid Build Coastguard Worker		private_key: "testkey.pem",
6246*333d2b36SAndroid Build Coastguard Worker	}
6247*333d2b36SAndroid Build Coastguard Worker
6248*333d2b36SAndroid Build Coastguard Worker	apex {
6249*333d2b36SAndroid Build Coastguard Worker		name: "otherapex",
6250*333d2b36SAndroid Build Coastguard Worker		key: "otherapex.key",
6251*333d2b36SAndroid Build Coastguard Worker		native_shared_libs: ["libfoo"],
6252*333d2b36SAndroid Build Coastguard Worker		updatable: false,
6253*333d2b36SAndroid Build Coastguard Worker	}
6254*333d2b36SAndroid Build Coastguard Worker
6255*333d2b36SAndroid Build Coastguard Worker	apex_key {
6256*333d2b36SAndroid Build Coastguard Worker		name: "otherapex.key",
6257*333d2b36SAndroid Build Coastguard Worker		public_key: "testkey.avbpubkey",
6258*333d2b36SAndroid Build Coastguard Worker		private_key: "testkey.pem",
6259*333d2b36SAndroid Build Coastguard Worker	}
6260*333d2b36SAndroid Build Coastguard Worker
6261*333d2b36SAndroid Build Coastguard Worker	cc_library {
6262*333d2b36SAndroid Build Coastguard Worker		name: "libfoo",
6263*333d2b36SAndroid Build Coastguard Worker		stl: "none",
6264*333d2b36SAndroid Build Coastguard Worker		system_shared_libs: [],
6265*333d2b36SAndroid Build Coastguard Worker		apex_available: ["otherapex"],
6266*333d2b36SAndroid Build Coastguard Worker	}`)
6267*333d2b36SAndroid Build Coastguard Worker
6268*333d2b36SAndroid Build Coastguard Worker	// 'apex_available' check is bypassed for /product apex with a specific prefix.
6269*333d2b36SAndroid Build Coastguard Worker	// TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6270*333d2b36SAndroid Build Coastguard Worker	testApex(t, `
6271*333d2b36SAndroid Build Coastguard Worker	apex {
6272*333d2b36SAndroid Build Coastguard Worker		name: "com.sdv.myapex",
6273*333d2b36SAndroid Build Coastguard Worker		key: "myapex.key",
6274*333d2b36SAndroid Build Coastguard Worker		native_shared_libs: ["libfoo"],
6275*333d2b36SAndroid Build Coastguard Worker		updatable: false,
6276*333d2b36SAndroid Build Coastguard Worker		product_specific: true,
6277*333d2b36SAndroid Build Coastguard Worker	}
6278*333d2b36SAndroid Build Coastguard Worker
6279*333d2b36SAndroid Build Coastguard Worker	apex_key {
6280*333d2b36SAndroid Build Coastguard Worker		name: "myapex.key",
6281*333d2b36SAndroid Build Coastguard Worker		public_key: "testkey.avbpubkey",
6282*333d2b36SAndroid Build Coastguard Worker		private_key: "testkey.pem",
6283*333d2b36SAndroid Build Coastguard Worker	}
6284*333d2b36SAndroid Build Coastguard Worker
6285*333d2b36SAndroid Build Coastguard Worker	apex {
6286*333d2b36SAndroid Build Coastguard Worker		name: "com.any.otherapex",
6287*333d2b36SAndroid Build Coastguard Worker		key: "otherapex.key",
6288*333d2b36SAndroid Build Coastguard Worker		native_shared_libs: ["libfoo"],
6289*333d2b36SAndroid Build Coastguard Worker		updatable: false,
6290*333d2b36SAndroid Build Coastguard Worker	}
6291*333d2b36SAndroid Build Coastguard Worker
6292*333d2b36SAndroid Build Coastguard Worker	apex_key {
6293*333d2b36SAndroid Build Coastguard Worker		name: "otherapex.key",
6294*333d2b36SAndroid Build Coastguard Worker		public_key: "testkey.avbpubkey",
6295*333d2b36SAndroid Build Coastguard Worker		private_key: "testkey.pem",
6296*333d2b36SAndroid Build Coastguard Worker	}
6297*333d2b36SAndroid Build Coastguard Worker
6298*333d2b36SAndroid Build Coastguard Worker	cc_library {
6299*333d2b36SAndroid Build Coastguard Worker		name: "libfoo",
6300*333d2b36SAndroid Build Coastguard Worker		stl: "none",
6301*333d2b36SAndroid Build Coastguard Worker		system_shared_libs: [],
6302*333d2b36SAndroid Build Coastguard Worker		apex_available: ["com.any.otherapex"],
6303*333d2b36SAndroid Build Coastguard Worker		product_specific: true,
6304*333d2b36SAndroid Build Coastguard Worker	}`,
6305*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(android.MockFS{
6306*333d2b36SAndroid Build Coastguard Worker			"system/sepolicy/apex/com.sdv.myapex-file_contexts":    nil,
6307*333d2b36SAndroid Build Coastguard Worker			"system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6308*333d2b36SAndroid Build Coastguard Worker		}))
6309*333d2b36SAndroid Build Coastguard Worker
6310*333d2b36SAndroid Build Coastguard Worker	// 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6311*333d2b36SAndroid Build Coastguard Worker	testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6312*333d2b36SAndroid Build Coastguard Worker	apex {
6313*333d2b36SAndroid Build Coastguard Worker		name: "com.sdv.myapex",
6314*333d2b36SAndroid Build Coastguard Worker		key: "myapex.key",
6315*333d2b36SAndroid Build Coastguard Worker		native_shared_libs: ["libfoo"],
6316*333d2b36SAndroid Build Coastguard Worker		updatable: false,
6317*333d2b36SAndroid Build Coastguard Worker	}
6318*333d2b36SAndroid Build Coastguard Worker
6319*333d2b36SAndroid Build Coastguard Worker	apex_key {
6320*333d2b36SAndroid Build Coastguard Worker		name: "myapex.key",
6321*333d2b36SAndroid Build Coastguard Worker		public_key: "testkey.avbpubkey",
6322*333d2b36SAndroid Build Coastguard Worker		private_key: "testkey.pem",
6323*333d2b36SAndroid Build Coastguard Worker	}
6324*333d2b36SAndroid Build Coastguard Worker
6325*333d2b36SAndroid Build Coastguard Worker	apex {
6326*333d2b36SAndroid Build Coastguard Worker		name: "com.any.otherapex",
6327*333d2b36SAndroid Build Coastguard Worker		key: "otherapex.key",
6328*333d2b36SAndroid Build Coastguard Worker		native_shared_libs: ["libfoo"],
6329*333d2b36SAndroid Build Coastguard Worker		updatable: false,
6330*333d2b36SAndroid Build Coastguard Worker	}
6331*333d2b36SAndroid Build Coastguard Worker
6332*333d2b36SAndroid Build Coastguard Worker	apex_key {
6333*333d2b36SAndroid Build Coastguard Worker		name: "otherapex.key",
6334*333d2b36SAndroid Build Coastguard Worker		public_key: "testkey.avbpubkey",
6335*333d2b36SAndroid Build Coastguard Worker		private_key: "testkey.pem",
6336*333d2b36SAndroid Build Coastguard Worker	}
6337*333d2b36SAndroid Build Coastguard Worker
6338*333d2b36SAndroid Build Coastguard Worker	cc_library {
6339*333d2b36SAndroid Build Coastguard Worker		name: "libfoo",
6340*333d2b36SAndroid Build Coastguard Worker		stl: "none",
6341*333d2b36SAndroid Build Coastguard Worker		system_shared_libs: [],
6342*333d2b36SAndroid Build Coastguard Worker		apex_available: ["com.any.otherapex"],
6343*333d2b36SAndroid Build Coastguard Worker	}`,
6344*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(android.MockFS{
6345*333d2b36SAndroid Build Coastguard Worker			"system/sepolicy/apex/com.sdv.myapex-file_contexts":    nil,
6346*333d2b36SAndroid Build Coastguard Worker			"system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6347*333d2b36SAndroid Build Coastguard Worker		}))
6348*333d2b36SAndroid Build Coastguard Worker}
6349*333d2b36SAndroid Build Coastguard Worker
6350*333d2b36SAndroid Build Coastguard Workerfunc TestApexAvailable_IndirectDep(t *testing.T) {
6351*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
6352*333d2b36SAndroid Build Coastguard Worker	// libbbaz is an indirect dep
6353*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
6354*333d2b36SAndroid Build Coastguard Worker.*via tag apex\.dependencyTag\{"sharedLib"\}
6355*333d2b36SAndroid Build Coastguard Worker.*-> libfoo.*link:shared.*
6356*333d2b36SAndroid Build Coastguard Worker.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
6357*333d2b36SAndroid Build Coastguard Worker.*-> libbar.*link:shared.*
6358*333d2b36SAndroid Build Coastguard Worker.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
6359*333d2b36SAndroid Build Coastguard Worker.*-> libbaz.*link:shared.*`, `
6360*333d2b36SAndroid Build Coastguard Worker	apex {
6361*333d2b36SAndroid Build Coastguard Worker		name: "myapex",
6362*333d2b36SAndroid Build Coastguard Worker		key: "myapex.key",
6363*333d2b36SAndroid Build Coastguard Worker		native_shared_libs: ["libfoo"],
6364*333d2b36SAndroid Build Coastguard Worker		updatable: false,
6365*333d2b36SAndroid Build Coastguard Worker	}
6366*333d2b36SAndroid Build Coastguard Worker
6367*333d2b36SAndroid Build Coastguard Worker	apex_key {
6368*333d2b36SAndroid Build Coastguard Worker		name: "myapex.key",
6369*333d2b36SAndroid Build Coastguard Worker		public_key: "testkey.avbpubkey",
6370*333d2b36SAndroid Build Coastguard Worker		private_key: "testkey.pem",
6371*333d2b36SAndroid Build Coastguard Worker	}
6372*333d2b36SAndroid Build Coastguard Worker
6373*333d2b36SAndroid Build Coastguard Worker	cc_library {
6374*333d2b36SAndroid Build Coastguard Worker		name: "libfoo",
6375*333d2b36SAndroid Build Coastguard Worker		stl: "none",
6376*333d2b36SAndroid Build Coastguard Worker		shared_libs: ["libbar"],
6377*333d2b36SAndroid Build Coastguard Worker		system_shared_libs: [],
6378*333d2b36SAndroid Build Coastguard Worker		apex_available: ["myapex"],
6379*333d2b36SAndroid Build Coastguard Worker	}
6380*333d2b36SAndroid Build Coastguard Worker
6381*333d2b36SAndroid Build Coastguard Worker	cc_library {
6382*333d2b36SAndroid Build Coastguard Worker		name: "libbar",
6383*333d2b36SAndroid Build Coastguard Worker		stl: "none",
6384*333d2b36SAndroid Build Coastguard Worker		shared_libs: ["libbaz"],
6385*333d2b36SAndroid Build Coastguard Worker		system_shared_libs: [],
6386*333d2b36SAndroid Build Coastguard Worker		apex_available: ["myapex"],
6387*333d2b36SAndroid Build Coastguard Worker	}
6388*333d2b36SAndroid Build Coastguard Worker
6389*333d2b36SAndroid Build Coastguard Worker	cc_library {
6390*333d2b36SAndroid Build Coastguard Worker		name: "libbaz",
6391*333d2b36SAndroid Build Coastguard Worker		stl: "none",
6392*333d2b36SAndroid Build Coastguard Worker		system_shared_libs: [],
6393*333d2b36SAndroid Build Coastguard Worker	}`)
6394*333d2b36SAndroid Build Coastguard Worker
6395*333d2b36SAndroid Build Coastguard Worker	// 'apex_available' check is bypassed for /product apex with a specific prefix.
6396*333d2b36SAndroid Build Coastguard Worker	// TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6397*333d2b36SAndroid Build Coastguard Worker	testApex(t, `
6398*333d2b36SAndroid Build Coastguard Worker		apex {
6399*333d2b36SAndroid Build Coastguard Worker			name: "com.sdv.myapex",
6400*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
6401*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["libfoo"],
6402*333d2b36SAndroid Build Coastguard Worker			updatable: false,
6403*333d2b36SAndroid Build Coastguard Worker			product_specific: true,
6404*333d2b36SAndroid Build Coastguard Worker		}
6405*333d2b36SAndroid Build Coastguard Worker
6406*333d2b36SAndroid Build Coastguard Worker		apex_key {
6407*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
6408*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
6409*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
6410*333d2b36SAndroid Build Coastguard Worker		}
6411*333d2b36SAndroid Build Coastguard Worker
6412*333d2b36SAndroid Build Coastguard Worker		cc_library {
6413*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
6414*333d2b36SAndroid Build Coastguard Worker			stl: "none",
6415*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libbar"],
6416*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
6417*333d2b36SAndroid Build Coastguard Worker			apex_available: ["com.sdv.myapex"],
6418*333d2b36SAndroid Build Coastguard Worker			product_specific: true,
6419*333d2b36SAndroid Build Coastguard Worker		}
6420*333d2b36SAndroid Build Coastguard Worker
6421*333d2b36SAndroid Build Coastguard Worker		cc_library {
6422*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
6423*333d2b36SAndroid Build Coastguard Worker			stl: "none",
6424*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libbaz"],
6425*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
6426*333d2b36SAndroid Build Coastguard Worker			apex_available: ["com.sdv.myapex"],
6427*333d2b36SAndroid Build Coastguard Worker			product_specific: true,
6428*333d2b36SAndroid Build Coastguard Worker		}
6429*333d2b36SAndroid Build Coastguard Worker
6430*333d2b36SAndroid Build Coastguard Worker		cc_library {
6431*333d2b36SAndroid Build Coastguard Worker			name: "libbaz",
6432*333d2b36SAndroid Build Coastguard Worker			stl: "none",
6433*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
6434*333d2b36SAndroid Build Coastguard Worker			product_specific: true,
6435*333d2b36SAndroid Build Coastguard Worker		}`,
6436*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(android.MockFS{
6437*333d2b36SAndroid Build Coastguard Worker			"system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6438*333d2b36SAndroid Build Coastguard Worker		}))
6439*333d2b36SAndroid Build Coastguard Worker
6440*333d2b36SAndroid Build Coastguard Worker	// 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6441*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, `
6442*333d2b36SAndroid Build Coastguard Worker		apex {
6443*333d2b36SAndroid Build Coastguard Worker			name: "com.sdv.myapex",
6444*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
6445*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["libfoo"],
6446*333d2b36SAndroid Build Coastguard Worker			updatable: false,
6447*333d2b36SAndroid Build Coastguard Worker		}
6448*333d2b36SAndroid Build Coastguard Worker
6449*333d2b36SAndroid Build Coastguard Worker		apex_key {
6450*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
6451*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
6452*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
6453*333d2b36SAndroid Build Coastguard Worker		}
6454*333d2b36SAndroid Build Coastguard Worker
6455*333d2b36SAndroid Build Coastguard Worker		cc_library {
6456*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
6457*333d2b36SAndroid Build Coastguard Worker			stl: "none",
6458*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libbar"],
6459*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
6460*333d2b36SAndroid Build Coastguard Worker			apex_available: ["com.sdv.myapex"],
6461*333d2b36SAndroid Build Coastguard Worker		}
6462*333d2b36SAndroid Build Coastguard Worker
6463*333d2b36SAndroid Build Coastguard Worker		cc_library {
6464*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
6465*333d2b36SAndroid Build Coastguard Worker			stl: "none",
6466*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libbaz"],
6467*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
6468*333d2b36SAndroid Build Coastguard Worker			apex_available: ["com.sdv.myapex"],
6469*333d2b36SAndroid Build Coastguard Worker		}
6470*333d2b36SAndroid Build Coastguard Worker
6471*333d2b36SAndroid Build Coastguard Worker		cc_library {
6472*333d2b36SAndroid Build Coastguard Worker			name: "libbaz",
6473*333d2b36SAndroid Build Coastguard Worker			stl: "none",
6474*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
6475*333d2b36SAndroid Build Coastguard Worker		}`,
6476*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(android.MockFS{
6477*333d2b36SAndroid Build Coastguard Worker			"system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6478*333d2b36SAndroid Build Coastguard Worker		}))
6479*333d2b36SAndroid Build Coastguard Worker}
6480*333d2b36SAndroid Build Coastguard Worker
6481*333d2b36SAndroid Build Coastguard Workerfunc TestApexAvailable_IndirectStaticDep(t *testing.T) {
6482*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
6483*333d2b36SAndroid Build Coastguard Worker	testApex(t, `
6484*333d2b36SAndroid Build Coastguard Worker	apex {
6485*333d2b36SAndroid Build Coastguard Worker		name: "myapex",
6486*333d2b36SAndroid Build Coastguard Worker		key: "myapex.key",
6487*333d2b36SAndroid Build Coastguard Worker		native_shared_libs: ["libfoo"],
6488*333d2b36SAndroid Build Coastguard Worker		updatable: false,
6489*333d2b36SAndroid Build Coastguard Worker	}
6490*333d2b36SAndroid Build Coastguard Worker
6491*333d2b36SAndroid Build Coastguard Worker	apex_key {
6492*333d2b36SAndroid Build Coastguard Worker		name: "myapex.key",
6493*333d2b36SAndroid Build Coastguard Worker		public_key: "testkey.avbpubkey",
6494*333d2b36SAndroid Build Coastguard Worker		private_key: "testkey.pem",
6495*333d2b36SAndroid Build Coastguard Worker	}
6496*333d2b36SAndroid Build Coastguard Worker
6497*333d2b36SAndroid Build Coastguard Worker	cc_library {
6498*333d2b36SAndroid Build Coastguard Worker		name: "libfoo",
6499*333d2b36SAndroid Build Coastguard Worker		stl: "none",
6500*333d2b36SAndroid Build Coastguard Worker		static_libs: ["libbar"],
6501*333d2b36SAndroid Build Coastguard Worker		system_shared_libs: [],
6502*333d2b36SAndroid Build Coastguard Worker		apex_available: ["myapex"],
6503*333d2b36SAndroid Build Coastguard Worker	}
6504*333d2b36SAndroid Build Coastguard Worker
6505*333d2b36SAndroid Build Coastguard Worker	cc_library {
6506*333d2b36SAndroid Build Coastguard Worker		name: "libbar",
6507*333d2b36SAndroid Build Coastguard Worker		stl: "none",
6508*333d2b36SAndroid Build Coastguard Worker		shared_libs: ["libbaz"],
6509*333d2b36SAndroid Build Coastguard Worker		system_shared_libs: [],
6510*333d2b36SAndroid Build Coastguard Worker		apex_available: ["myapex"],
6511*333d2b36SAndroid Build Coastguard Worker	}
6512*333d2b36SAndroid Build Coastguard Worker
6513*333d2b36SAndroid Build Coastguard Worker	cc_library {
6514*333d2b36SAndroid Build Coastguard Worker		name: "libbaz",
6515*333d2b36SAndroid Build Coastguard Worker		stl: "none",
6516*333d2b36SAndroid Build Coastguard Worker		system_shared_libs: [],
6517*333d2b36SAndroid Build Coastguard Worker	}`)
6518*333d2b36SAndroid Build Coastguard Worker
6519*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6520*333d2b36SAndroid Build Coastguard Worker	apex {
6521*333d2b36SAndroid Build Coastguard Worker		name: "myapex",
6522*333d2b36SAndroid Build Coastguard Worker		key: "myapex.key",
6523*333d2b36SAndroid Build Coastguard Worker		native_shared_libs: ["libfoo"],
6524*333d2b36SAndroid Build Coastguard Worker		updatable: false,
6525*333d2b36SAndroid Build Coastguard Worker	}
6526*333d2b36SAndroid Build Coastguard Worker
6527*333d2b36SAndroid Build Coastguard Worker	apex_key {
6528*333d2b36SAndroid Build Coastguard Worker		name: "myapex.key",
6529*333d2b36SAndroid Build Coastguard Worker		public_key: "testkey.avbpubkey",
6530*333d2b36SAndroid Build Coastguard Worker		private_key: "testkey.pem",
6531*333d2b36SAndroid Build Coastguard Worker	}
6532*333d2b36SAndroid Build Coastguard Worker
6533*333d2b36SAndroid Build Coastguard Worker	cc_library {
6534*333d2b36SAndroid Build Coastguard Worker		name: "libfoo",
6535*333d2b36SAndroid Build Coastguard Worker		stl: "none",
6536*333d2b36SAndroid Build Coastguard Worker		static_libs: ["libbar"],
6537*333d2b36SAndroid Build Coastguard Worker		system_shared_libs: [],
6538*333d2b36SAndroid Build Coastguard Worker		apex_available: ["myapex"],
6539*333d2b36SAndroid Build Coastguard Worker	}
6540*333d2b36SAndroid Build Coastguard Worker
6541*333d2b36SAndroid Build Coastguard Worker	cc_library {
6542*333d2b36SAndroid Build Coastguard Worker		name: "libbar",
6543*333d2b36SAndroid Build Coastguard Worker		stl: "none",
6544*333d2b36SAndroid Build Coastguard Worker		system_shared_libs: [],
6545*333d2b36SAndroid Build Coastguard Worker	}`)
6546*333d2b36SAndroid Build Coastguard Worker}
6547*333d2b36SAndroid Build Coastguard Worker
6548*333d2b36SAndroid Build Coastguard Workerfunc TestApexAvailable_InvalidApexName(t *testing.T) {
6549*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
6550*333d2b36SAndroid Build Coastguard Worker	testApexError(t, "\"otherapex\" is not a valid module name", `
6551*333d2b36SAndroid Build Coastguard Worker	apex {
6552*333d2b36SAndroid Build Coastguard Worker		name: "myapex",
6553*333d2b36SAndroid Build Coastguard Worker		key: "myapex.key",
6554*333d2b36SAndroid Build Coastguard Worker		native_shared_libs: ["libfoo"],
6555*333d2b36SAndroid Build Coastguard Worker		updatable: false,
6556*333d2b36SAndroid Build Coastguard Worker	}
6557*333d2b36SAndroid Build Coastguard Worker
6558*333d2b36SAndroid Build Coastguard Worker	apex_key {
6559*333d2b36SAndroid Build Coastguard Worker		name: "myapex.key",
6560*333d2b36SAndroid Build Coastguard Worker		public_key: "testkey.avbpubkey",
6561*333d2b36SAndroid Build Coastguard Worker		private_key: "testkey.pem",
6562*333d2b36SAndroid Build Coastguard Worker	}
6563*333d2b36SAndroid Build Coastguard Worker
6564*333d2b36SAndroid Build Coastguard Worker	cc_library {
6565*333d2b36SAndroid Build Coastguard Worker		name: "libfoo",
6566*333d2b36SAndroid Build Coastguard Worker		stl: "none",
6567*333d2b36SAndroid Build Coastguard Worker		system_shared_libs: [],
6568*333d2b36SAndroid Build Coastguard Worker		apex_available: ["otherapex"],
6569*333d2b36SAndroid Build Coastguard Worker	}`)
6570*333d2b36SAndroid Build Coastguard Worker
6571*333d2b36SAndroid Build Coastguard Worker	testApex(t, `
6572*333d2b36SAndroid Build Coastguard Worker	apex {
6573*333d2b36SAndroid Build Coastguard Worker		name: "myapex",
6574*333d2b36SAndroid Build Coastguard Worker		key: "myapex.key",
6575*333d2b36SAndroid Build Coastguard Worker		native_shared_libs: ["libfoo", "libbar"],
6576*333d2b36SAndroid Build Coastguard Worker		updatable: false,
6577*333d2b36SAndroid Build Coastguard Worker	}
6578*333d2b36SAndroid Build Coastguard Worker
6579*333d2b36SAndroid Build Coastguard Worker	apex_key {
6580*333d2b36SAndroid Build Coastguard Worker		name: "myapex.key",
6581*333d2b36SAndroid Build Coastguard Worker		public_key: "testkey.avbpubkey",
6582*333d2b36SAndroid Build Coastguard Worker		private_key: "testkey.pem",
6583*333d2b36SAndroid Build Coastguard Worker	}
6584*333d2b36SAndroid Build Coastguard Worker
6585*333d2b36SAndroid Build Coastguard Worker	cc_library {
6586*333d2b36SAndroid Build Coastguard Worker		name: "libfoo",
6587*333d2b36SAndroid Build Coastguard Worker		stl: "none",
6588*333d2b36SAndroid Build Coastguard Worker		system_shared_libs: [],
6589*333d2b36SAndroid Build Coastguard Worker		runtime_libs: ["libbaz"],
6590*333d2b36SAndroid Build Coastguard Worker		apex_available: ["myapex"],
6591*333d2b36SAndroid Build Coastguard Worker	}
6592*333d2b36SAndroid Build Coastguard Worker
6593*333d2b36SAndroid Build Coastguard Worker	cc_library {
6594*333d2b36SAndroid Build Coastguard Worker		name: "libbar",
6595*333d2b36SAndroid Build Coastguard Worker		stl: "none",
6596*333d2b36SAndroid Build Coastguard Worker		system_shared_libs: [],
6597*333d2b36SAndroid Build Coastguard Worker		apex_available: ["//apex_available:anyapex"],
6598*333d2b36SAndroid Build Coastguard Worker	}
6599*333d2b36SAndroid Build Coastguard Worker
6600*333d2b36SAndroid Build Coastguard Worker	cc_library {
6601*333d2b36SAndroid Build Coastguard Worker		name: "libbaz",
6602*333d2b36SAndroid Build Coastguard Worker		stl: "none",
6603*333d2b36SAndroid Build Coastguard Worker		system_shared_libs: [],
6604*333d2b36SAndroid Build Coastguard Worker		stubs: {
6605*333d2b36SAndroid Build Coastguard Worker			versions: ["10", "20", "30"],
6606*333d2b36SAndroid Build Coastguard Worker		},
6607*333d2b36SAndroid Build Coastguard Worker	}`)
6608*333d2b36SAndroid Build Coastguard Worker}
6609*333d2b36SAndroid Build Coastguard Worker
6610*333d2b36SAndroid Build Coastguard Workerfunc TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6611*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
6612*333d2b36SAndroid Build Coastguard Worker	t.Run("negative variant_version produces error", func(t *testing.T) {
6613*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
6614*333d2b36SAndroid Build Coastguard Worker		testApexError(t, "expected an integer between 0-9; got -1", `
6615*333d2b36SAndroid Build Coastguard Worker			apex {
6616*333d2b36SAndroid Build Coastguard Worker				name: "myapex",
6617*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
6618*333d2b36SAndroid Build Coastguard Worker				apex_available_name: "com.android.foo",
6619*333d2b36SAndroid Build Coastguard Worker				variant_version: "-1",
6620*333d2b36SAndroid Build Coastguard Worker				updatable: false,
6621*333d2b36SAndroid Build Coastguard Worker			}
6622*333d2b36SAndroid Build Coastguard Worker			apex_key {
6623*333d2b36SAndroid Build Coastguard Worker				name: "myapex.key",
6624*333d2b36SAndroid Build Coastguard Worker				public_key: "testkey.avbpubkey",
6625*333d2b36SAndroid Build Coastguard Worker				private_key: "testkey.pem",
6626*333d2b36SAndroid Build Coastguard Worker			}
6627*333d2b36SAndroid Build Coastguard Worker		`)
6628*333d2b36SAndroid Build Coastguard Worker	})
6629*333d2b36SAndroid Build Coastguard Worker
6630*333d2b36SAndroid Build Coastguard Worker	t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6631*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
6632*333d2b36SAndroid Build Coastguard Worker		testApexError(t, "expected an integer between 0-9; got 10", `
6633*333d2b36SAndroid Build Coastguard Worker			apex {
6634*333d2b36SAndroid Build Coastguard Worker				name: "myapex",
6635*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
6636*333d2b36SAndroid Build Coastguard Worker				apex_available_name: "com.android.foo",
6637*333d2b36SAndroid Build Coastguard Worker				variant_version: "10",
6638*333d2b36SAndroid Build Coastguard Worker				updatable: false,
6639*333d2b36SAndroid Build Coastguard Worker			}
6640*333d2b36SAndroid Build Coastguard Worker			apex_key {
6641*333d2b36SAndroid Build Coastguard Worker				name: "myapex.key",
6642*333d2b36SAndroid Build Coastguard Worker				public_key: "testkey.avbpubkey",
6643*333d2b36SAndroid Build Coastguard Worker				private_key: "testkey.pem",
6644*333d2b36SAndroid Build Coastguard Worker			}
6645*333d2b36SAndroid Build Coastguard Worker		`)
6646*333d2b36SAndroid Build Coastguard Worker	})
6647*333d2b36SAndroid Build Coastguard Worker}
6648*333d2b36SAndroid Build Coastguard Worker
6649*333d2b36SAndroid Build Coastguard Workerfunc TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6650*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
6651*333d2b36SAndroid Build Coastguard Worker	context := android.GroupFixturePreparers(
6652*333d2b36SAndroid Build Coastguard Worker		android.PrepareForIntegrationTestWithAndroid,
6653*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithApexBuildComponents,
6654*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(android.MockFS{
6655*333d2b36SAndroid Build Coastguard Worker			"system/sepolicy/apex/foo-file_contexts": nil,
6656*333d2b36SAndroid Build Coastguard Worker			"system/sepolicy/apex/bar-file_contexts": nil,
6657*333d2b36SAndroid Build Coastguard Worker		}),
6658*333d2b36SAndroid Build Coastguard Worker	)
6659*333d2b36SAndroid Build Coastguard Worker	result := context.RunTestWithBp(t, `
6660*333d2b36SAndroid Build Coastguard Worker		apex {
6661*333d2b36SAndroid Build Coastguard Worker			name: "foo",
6662*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
6663*333d2b36SAndroid Build Coastguard Worker			apex_available_name: "com.android.foo",
6664*333d2b36SAndroid Build Coastguard Worker			variant_version: "0",
6665*333d2b36SAndroid Build Coastguard Worker			updatable: false,
6666*333d2b36SAndroid Build Coastguard Worker		}
6667*333d2b36SAndroid Build Coastguard Worker		apex {
6668*333d2b36SAndroid Build Coastguard Worker			name: "bar",
6669*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
6670*333d2b36SAndroid Build Coastguard Worker			apex_available_name: "com.android.foo",
6671*333d2b36SAndroid Build Coastguard Worker			variant_version: "3",
6672*333d2b36SAndroid Build Coastguard Worker			updatable: false,
6673*333d2b36SAndroid Build Coastguard Worker		}
6674*333d2b36SAndroid Build Coastguard Worker		apex_key {
6675*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
6676*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
6677*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
6678*333d2b36SAndroid Build Coastguard Worker		}
6679*333d2b36SAndroid Build Coastguard Worker		override_apex {
6680*333d2b36SAndroid Build Coastguard Worker			name: "myoverrideapex",
6681*333d2b36SAndroid Build Coastguard Worker			base: "bar",
6682*333d2b36SAndroid Build Coastguard Worker		}
6683*333d2b36SAndroid Build Coastguard Worker	`)
6684*333d2b36SAndroid Build Coastguard Worker
6685*333d2b36SAndroid Build Coastguard Worker	fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
6686*333d2b36SAndroid Build Coastguard Worker	fooExpectedDefaultVersion := testDefaultUpdatableModuleVersion
6687*333d2b36SAndroid Build Coastguard Worker	fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6688*333d2b36SAndroid Build Coastguard Worker	if fooActualDefaultVersion != fooExpectedDefaultVersion {
6689*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6690*333d2b36SAndroid Build Coastguard Worker	}
6691*333d2b36SAndroid Build Coastguard Worker
6692*333d2b36SAndroid Build Coastguard Worker	barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
6693*333d2b36SAndroid Build Coastguard Worker	defaultVersionInt, _ := strconv.Atoi(testDefaultUpdatableModuleVersion)
6694*333d2b36SAndroid Build Coastguard Worker	barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6695*333d2b36SAndroid Build Coastguard Worker	barActualDefaultVersion := barManifestRule.Args["default_version"]
6696*333d2b36SAndroid Build Coastguard Worker	if barActualDefaultVersion != barExpectedDefaultVersion {
6697*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6698*333d2b36SAndroid Build Coastguard Worker	}
6699*333d2b36SAndroid Build Coastguard Worker
6700*333d2b36SAndroid Build Coastguard Worker	overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
6701*333d2b36SAndroid Build Coastguard Worker	overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6702*333d2b36SAndroid Build Coastguard Worker	if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6703*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6704*333d2b36SAndroid Build Coastguard Worker	}
6705*333d2b36SAndroid Build Coastguard Worker}
6706*333d2b36SAndroid Build Coastguard Worker
6707*333d2b36SAndroid Build Coastguard Workerfunc TestApexAvailable_ApexAvailableName(t *testing.T) {
6708*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
6709*333d2b36SAndroid Build Coastguard Worker	t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6710*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
6711*333d2b36SAndroid Build Coastguard Worker		testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6712*333d2b36SAndroid Build Coastguard Worker			apex {
6713*333d2b36SAndroid Build Coastguard Worker				name: "myapex_sminus",
6714*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
6715*333d2b36SAndroid Build Coastguard Worker				apps: ["AppFoo"],
6716*333d2b36SAndroid Build Coastguard Worker				apex_available_name: "myapex",
6717*333d2b36SAndroid Build Coastguard Worker				updatable: false,
6718*333d2b36SAndroid Build Coastguard Worker			}
6719*333d2b36SAndroid Build Coastguard Worker			apex {
6720*333d2b36SAndroid Build Coastguard Worker				name: "myapex",
6721*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
6722*333d2b36SAndroid Build Coastguard Worker				apps: ["AppFoo"],
6723*333d2b36SAndroid Build Coastguard Worker				updatable: false,
6724*333d2b36SAndroid Build Coastguard Worker			}
6725*333d2b36SAndroid Build Coastguard Worker			apex_key {
6726*333d2b36SAndroid Build Coastguard Worker				name: "myapex.key",
6727*333d2b36SAndroid Build Coastguard Worker				public_key: "testkey.avbpubkey",
6728*333d2b36SAndroid Build Coastguard Worker				private_key: "testkey.pem",
6729*333d2b36SAndroid Build Coastguard Worker			}
6730*333d2b36SAndroid Build Coastguard Worker			android_app {
6731*333d2b36SAndroid Build Coastguard Worker				name: "AppFoo",
6732*333d2b36SAndroid Build Coastguard Worker				srcs: ["foo/bar/MyClass.java"],
6733*333d2b36SAndroid Build Coastguard Worker				sdk_version: "none",
6734*333d2b36SAndroid Build Coastguard Worker				system_modules: "none",
6735*333d2b36SAndroid Build Coastguard Worker				apex_available: [ "myapex_sminus" ],
6736*333d2b36SAndroid Build Coastguard Worker			}`,
6737*333d2b36SAndroid Build Coastguard Worker			android.FixtureMergeMockFs(android.MockFS{
6738*333d2b36SAndroid Build Coastguard Worker				"system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6739*333d2b36SAndroid Build Coastguard Worker			}),
6740*333d2b36SAndroid Build Coastguard Worker		)
6741*333d2b36SAndroid Build Coastguard Worker	})
6742*333d2b36SAndroid Build Coastguard Worker
6743*333d2b36SAndroid Build Coastguard Worker	t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6744*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
6745*333d2b36SAndroid Build Coastguard Worker		testApex(t, `
6746*333d2b36SAndroid Build Coastguard Worker			apex {
6747*333d2b36SAndroid Build Coastguard Worker				name: "myapex_sminus",
6748*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
6749*333d2b36SAndroid Build Coastguard Worker				apps: ["AppFoo"],
6750*333d2b36SAndroid Build Coastguard Worker				apex_available_name: "myapex",
6751*333d2b36SAndroid Build Coastguard Worker				updatable: false,
6752*333d2b36SAndroid Build Coastguard Worker			}
6753*333d2b36SAndroid Build Coastguard Worker			apex {
6754*333d2b36SAndroid Build Coastguard Worker				name: "myapex",
6755*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
6756*333d2b36SAndroid Build Coastguard Worker				apps: ["AppFoo"],
6757*333d2b36SAndroid Build Coastguard Worker				updatable: false,
6758*333d2b36SAndroid Build Coastguard Worker			}
6759*333d2b36SAndroid Build Coastguard Worker			apex_key {
6760*333d2b36SAndroid Build Coastguard Worker				name: "myapex.key",
6761*333d2b36SAndroid Build Coastguard Worker				public_key: "testkey.avbpubkey",
6762*333d2b36SAndroid Build Coastguard Worker				private_key: "testkey.pem",
6763*333d2b36SAndroid Build Coastguard Worker			}
6764*333d2b36SAndroid Build Coastguard Worker			android_app {
6765*333d2b36SAndroid Build Coastguard Worker				name: "AppFoo",
6766*333d2b36SAndroid Build Coastguard Worker				srcs: ["foo/bar/MyClass.java"],
6767*333d2b36SAndroid Build Coastguard Worker				sdk_version: "none",
6768*333d2b36SAndroid Build Coastguard Worker				system_modules: "none",
6769*333d2b36SAndroid Build Coastguard Worker				apex_available: [ "myapex" ],
6770*333d2b36SAndroid Build Coastguard Worker			}`,
6771*333d2b36SAndroid Build Coastguard Worker			android.FixtureMergeMockFs(android.MockFS{
6772*333d2b36SAndroid Build Coastguard Worker				"system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6773*333d2b36SAndroid Build Coastguard Worker			}),
6774*333d2b36SAndroid Build Coastguard Worker		)
6775*333d2b36SAndroid Build Coastguard Worker	})
6776*333d2b36SAndroid Build Coastguard Worker
6777*333d2b36SAndroid Build Coastguard Worker	t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6778*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
6779*333d2b36SAndroid Build Coastguard Worker		testApex(t, `
6780*333d2b36SAndroid Build Coastguard Worker			override_apex {
6781*333d2b36SAndroid Build Coastguard Worker				name: "myoverrideapex_sminus",
6782*333d2b36SAndroid Build Coastguard Worker				base: "myapex_sminus",
6783*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
6784*333d2b36SAndroid Build Coastguard Worker				apps: ["AppFooOverride"],
6785*333d2b36SAndroid Build Coastguard Worker			}
6786*333d2b36SAndroid Build Coastguard Worker			override_apex {
6787*333d2b36SAndroid Build Coastguard Worker				name: "myoverrideapex",
6788*333d2b36SAndroid Build Coastguard Worker				base: "myapex",
6789*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
6790*333d2b36SAndroid Build Coastguard Worker				apps: ["AppFooOverride"],
6791*333d2b36SAndroid Build Coastguard Worker			}
6792*333d2b36SAndroid Build Coastguard Worker			apex {
6793*333d2b36SAndroid Build Coastguard Worker				name: "myapex_sminus",
6794*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
6795*333d2b36SAndroid Build Coastguard Worker				apps: ["AppFoo"],
6796*333d2b36SAndroid Build Coastguard Worker				apex_available_name: "myapex",
6797*333d2b36SAndroid Build Coastguard Worker				updatable: false,
6798*333d2b36SAndroid Build Coastguard Worker			}
6799*333d2b36SAndroid Build Coastguard Worker			apex {
6800*333d2b36SAndroid Build Coastguard Worker				name: "myapex",
6801*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
6802*333d2b36SAndroid Build Coastguard Worker				apps: ["AppFoo"],
6803*333d2b36SAndroid Build Coastguard Worker				updatable: false,
6804*333d2b36SAndroid Build Coastguard Worker			}
6805*333d2b36SAndroid Build Coastguard Worker			apex_key {
6806*333d2b36SAndroid Build Coastguard Worker				name: "myapex.key",
6807*333d2b36SAndroid Build Coastguard Worker				public_key: "testkey.avbpubkey",
6808*333d2b36SAndroid Build Coastguard Worker				private_key: "testkey.pem",
6809*333d2b36SAndroid Build Coastguard Worker			}
6810*333d2b36SAndroid Build Coastguard Worker			android_app {
6811*333d2b36SAndroid Build Coastguard Worker				name: "AppFooOverride",
6812*333d2b36SAndroid Build Coastguard Worker				srcs: ["foo/bar/MyClass.java"],
6813*333d2b36SAndroid Build Coastguard Worker				sdk_version: "none",
6814*333d2b36SAndroid Build Coastguard Worker				system_modules: "none",
6815*333d2b36SAndroid Build Coastguard Worker				apex_available: [ "myapex" ],
6816*333d2b36SAndroid Build Coastguard Worker			}
6817*333d2b36SAndroid Build Coastguard Worker			android_app {
6818*333d2b36SAndroid Build Coastguard Worker				name: "AppFoo",
6819*333d2b36SAndroid Build Coastguard Worker				srcs: ["foo/bar/MyClass.java"],
6820*333d2b36SAndroid Build Coastguard Worker				sdk_version: "none",
6821*333d2b36SAndroid Build Coastguard Worker				system_modules: "none",
6822*333d2b36SAndroid Build Coastguard Worker				apex_available: [ "myapex" ],
6823*333d2b36SAndroid Build Coastguard Worker			}`,
6824*333d2b36SAndroid Build Coastguard Worker			android.FixtureMergeMockFs(android.MockFS{
6825*333d2b36SAndroid Build Coastguard Worker				"system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6826*333d2b36SAndroid Build Coastguard Worker			}),
6827*333d2b36SAndroid Build Coastguard Worker		)
6828*333d2b36SAndroid Build Coastguard Worker	})
6829*333d2b36SAndroid Build Coastguard Worker}
6830*333d2b36SAndroid Build Coastguard Worker
6831*333d2b36SAndroid Build Coastguard Workerfunc TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6832*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
6833*333d2b36SAndroid Build Coastguard Worker	context := android.GroupFixturePreparers(
6834*333d2b36SAndroid Build Coastguard Worker		android.PrepareForIntegrationTestWithAndroid,
6835*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithApexBuildComponents,
6836*333d2b36SAndroid Build Coastguard Worker		java.PrepareForTestWithDexpreopt,
6837*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(android.MockFS{
6838*333d2b36SAndroid Build Coastguard Worker			"system/sepolicy/apex/myapex-file_contexts":        nil,
6839*333d2b36SAndroid Build Coastguard Worker			"system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6840*333d2b36SAndroid Build Coastguard Worker		}),
6841*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6842*333d2b36SAndroid Build Coastguard Worker			variables.BuildId = proptools.StringPtr("buildid")
6843*333d2b36SAndroid Build Coastguard Worker		}),
6844*333d2b36SAndroid Build Coastguard Worker	)
6845*333d2b36SAndroid Build Coastguard Worker	context.RunTestWithBp(t, `
6846*333d2b36SAndroid Build Coastguard Worker	override_apex {
6847*333d2b36SAndroid Build Coastguard Worker		name: "myoverrideapex_sminus",
6848*333d2b36SAndroid Build Coastguard Worker		base: "myapex_sminus",
6849*333d2b36SAndroid Build Coastguard Worker	}
6850*333d2b36SAndroid Build Coastguard Worker	override_apex {
6851*333d2b36SAndroid Build Coastguard Worker		name: "myoverrideapex",
6852*333d2b36SAndroid Build Coastguard Worker		base: "myapex",
6853*333d2b36SAndroid Build Coastguard Worker	}
6854*333d2b36SAndroid Build Coastguard Worker	apex {
6855*333d2b36SAndroid Build Coastguard Worker		name: "myapex",
6856*333d2b36SAndroid Build Coastguard Worker		key: "myapex.key",
6857*333d2b36SAndroid Build Coastguard Worker		apps: ["AppFoo"],
6858*333d2b36SAndroid Build Coastguard Worker		updatable: false,
6859*333d2b36SAndroid Build Coastguard Worker	}
6860*333d2b36SAndroid Build Coastguard Worker	apex {
6861*333d2b36SAndroid Build Coastguard Worker		name: "myapex_sminus",
6862*333d2b36SAndroid Build Coastguard Worker		apex_available_name: "myapex",
6863*333d2b36SAndroid Build Coastguard Worker		key: "myapex.key",
6864*333d2b36SAndroid Build Coastguard Worker		apps: ["AppFoo_sminus"],
6865*333d2b36SAndroid Build Coastguard Worker		updatable: false,
6866*333d2b36SAndroid Build Coastguard Worker	}
6867*333d2b36SAndroid Build Coastguard Worker	apex_key {
6868*333d2b36SAndroid Build Coastguard Worker		name: "myapex.key",
6869*333d2b36SAndroid Build Coastguard Worker		public_key: "testkey.avbpubkey",
6870*333d2b36SAndroid Build Coastguard Worker		private_key: "testkey.pem",
6871*333d2b36SAndroid Build Coastguard Worker	}
6872*333d2b36SAndroid Build Coastguard Worker	android_app {
6873*333d2b36SAndroid Build Coastguard Worker		name: "AppFoo",
6874*333d2b36SAndroid Build Coastguard Worker		srcs: ["foo/bar/MyClass.java"],
6875*333d2b36SAndroid Build Coastguard Worker		sdk_version: "none",
6876*333d2b36SAndroid Build Coastguard Worker		system_modules: "none",
6877*333d2b36SAndroid Build Coastguard Worker		apex_available: [ "myapex" ],
6878*333d2b36SAndroid Build Coastguard Worker	}
6879*333d2b36SAndroid Build Coastguard Worker	android_app {
6880*333d2b36SAndroid Build Coastguard Worker		name: "AppFoo_sminus",
6881*333d2b36SAndroid Build Coastguard Worker		srcs: ["foo/bar/MyClass.java"],
6882*333d2b36SAndroid Build Coastguard Worker		sdk_version: "none",
6883*333d2b36SAndroid Build Coastguard Worker		min_sdk_version: "29",
6884*333d2b36SAndroid Build Coastguard Worker		system_modules: "none",
6885*333d2b36SAndroid Build Coastguard Worker		apex_available: [ "myapex" ],
6886*333d2b36SAndroid Build Coastguard Worker	}`)
6887*333d2b36SAndroid Build Coastguard Worker}
6888*333d2b36SAndroid Build Coastguard Worker
6889*333d2b36SAndroid Build Coastguard Workerfunc TestApexAvailable_CheckForPlatform(t *testing.T) {
6890*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
6891*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
6892*333d2b36SAndroid Build Coastguard Worker	apex {
6893*333d2b36SAndroid Build Coastguard Worker		name: "myapex",
6894*333d2b36SAndroid Build Coastguard Worker		key: "myapex.key",
6895*333d2b36SAndroid Build Coastguard Worker		native_shared_libs: ["libbar", "libbaz"],
6896*333d2b36SAndroid Build Coastguard Worker		updatable: false,
6897*333d2b36SAndroid Build Coastguard Worker	}
6898*333d2b36SAndroid Build Coastguard Worker
6899*333d2b36SAndroid Build Coastguard Worker	apex_key {
6900*333d2b36SAndroid Build Coastguard Worker		name: "myapex.key",
6901*333d2b36SAndroid Build Coastguard Worker		public_key: "testkey.avbpubkey",
6902*333d2b36SAndroid Build Coastguard Worker		private_key: "testkey.pem",
6903*333d2b36SAndroid Build Coastguard Worker	}
6904*333d2b36SAndroid Build Coastguard Worker
6905*333d2b36SAndroid Build Coastguard Worker	cc_library {
6906*333d2b36SAndroid Build Coastguard Worker		name: "libfoo",
6907*333d2b36SAndroid Build Coastguard Worker		stl: "none",
6908*333d2b36SAndroid Build Coastguard Worker		system_shared_libs: [],
6909*333d2b36SAndroid Build Coastguard Worker		shared_libs: ["libbar"],
6910*333d2b36SAndroid Build Coastguard Worker		apex_available: ["//apex_available:platform"],
6911*333d2b36SAndroid Build Coastguard Worker	}
6912*333d2b36SAndroid Build Coastguard Worker
6913*333d2b36SAndroid Build Coastguard Worker	cc_library {
6914*333d2b36SAndroid Build Coastguard Worker		name: "libfoo2",
6915*333d2b36SAndroid Build Coastguard Worker		stl: "none",
6916*333d2b36SAndroid Build Coastguard Worker		system_shared_libs: [],
6917*333d2b36SAndroid Build Coastguard Worker		shared_libs: ["libbaz"],
6918*333d2b36SAndroid Build Coastguard Worker		apex_available: ["//apex_available:platform"],
6919*333d2b36SAndroid Build Coastguard Worker	}
6920*333d2b36SAndroid Build Coastguard Worker
6921*333d2b36SAndroid Build Coastguard Worker	cc_library {
6922*333d2b36SAndroid Build Coastguard Worker		name: "libbar",
6923*333d2b36SAndroid Build Coastguard Worker		stl: "none",
6924*333d2b36SAndroid Build Coastguard Worker		system_shared_libs: [],
6925*333d2b36SAndroid Build Coastguard Worker		apex_available: ["myapex"],
6926*333d2b36SAndroid Build Coastguard Worker	}
6927*333d2b36SAndroid Build Coastguard Worker
6928*333d2b36SAndroid Build Coastguard Worker	cc_library {
6929*333d2b36SAndroid Build Coastguard Worker		name: "libbaz",
6930*333d2b36SAndroid Build Coastguard Worker		stl: "none",
6931*333d2b36SAndroid Build Coastguard Worker		system_shared_libs: [],
6932*333d2b36SAndroid Build Coastguard Worker		apex_available: ["myapex"],
6933*333d2b36SAndroid Build Coastguard Worker		stubs: {
6934*333d2b36SAndroid Build Coastguard Worker			versions: ["1"],
6935*333d2b36SAndroid Build Coastguard Worker		},
6936*333d2b36SAndroid Build Coastguard Worker	}`)
6937*333d2b36SAndroid Build Coastguard Worker
6938*333d2b36SAndroid Build Coastguard Worker	// libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6939*333d2b36SAndroid Build Coastguard Worker	// because it depends on libbar which isn't available to platform
6940*333d2b36SAndroid Build Coastguard Worker	libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6941*333d2b36SAndroid Build Coastguard Worker	if libfoo.NotAvailableForPlatform() != true {
6942*333d2b36SAndroid Build Coastguard Worker		t.Errorf("%q shouldn't be available to platform", libfoo.String())
6943*333d2b36SAndroid Build Coastguard Worker	}
6944*333d2b36SAndroid Build Coastguard Worker
6945*333d2b36SAndroid Build Coastguard Worker	// libfoo2 however can be available to platform because it depends on libbaz which provides
6946*333d2b36SAndroid Build Coastguard Worker	// stubs
6947*333d2b36SAndroid Build Coastguard Worker	libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6948*333d2b36SAndroid Build Coastguard Worker	if libfoo2.NotAvailableForPlatform() == true {
6949*333d2b36SAndroid Build Coastguard Worker		t.Errorf("%q should be available to platform", libfoo2.String())
6950*333d2b36SAndroid Build Coastguard Worker	}
6951*333d2b36SAndroid Build Coastguard Worker}
6952*333d2b36SAndroid Build Coastguard Worker
6953*333d2b36SAndroid Build Coastguard Workerfunc TestApexAvailable_CreatedForApex(t *testing.T) {
6954*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
6955*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
6956*333d2b36SAndroid Build Coastguard Worker	apex {
6957*333d2b36SAndroid Build Coastguard Worker		name: "myapex",
6958*333d2b36SAndroid Build Coastguard Worker		key: "myapex.key",
6959*333d2b36SAndroid Build Coastguard Worker		native_shared_libs: ["libfoo"],
6960*333d2b36SAndroid Build Coastguard Worker		updatable: false,
6961*333d2b36SAndroid Build Coastguard Worker	}
6962*333d2b36SAndroid Build Coastguard Worker
6963*333d2b36SAndroid Build Coastguard Worker	apex_key {
6964*333d2b36SAndroid Build Coastguard Worker		name: "myapex.key",
6965*333d2b36SAndroid Build Coastguard Worker		public_key: "testkey.avbpubkey",
6966*333d2b36SAndroid Build Coastguard Worker		private_key: "testkey.pem",
6967*333d2b36SAndroid Build Coastguard Worker	}
6968*333d2b36SAndroid Build Coastguard Worker
6969*333d2b36SAndroid Build Coastguard Worker	cc_library {
6970*333d2b36SAndroid Build Coastguard Worker		name: "libfoo",
6971*333d2b36SAndroid Build Coastguard Worker		stl: "none",
6972*333d2b36SAndroid Build Coastguard Worker		system_shared_libs: [],
6973*333d2b36SAndroid Build Coastguard Worker		apex_available: ["myapex"],
6974*333d2b36SAndroid Build Coastguard Worker		static: {
6975*333d2b36SAndroid Build Coastguard Worker			apex_available: ["//apex_available:platform"],
6976*333d2b36SAndroid Build Coastguard Worker		},
6977*333d2b36SAndroid Build Coastguard Worker	}`)
6978*333d2b36SAndroid Build Coastguard Worker
6979*333d2b36SAndroid Build Coastguard Worker	libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6980*333d2b36SAndroid Build Coastguard Worker	if libfooShared.NotAvailableForPlatform() != true {
6981*333d2b36SAndroid Build Coastguard Worker		t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6982*333d2b36SAndroid Build Coastguard Worker	}
6983*333d2b36SAndroid Build Coastguard Worker	libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6984*333d2b36SAndroid Build Coastguard Worker	if libfooStatic.NotAvailableForPlatform() != false {
6985*333d2b36SAndroid Build Coastguard Worker		t.Errorf("%q should be available to platform", libfooStatic.String())
6986*333d2b36SAndroid Build Coastguard Worker	}
6987*333d2b36SAndroid Build Coastguard Worker}
6988*333d2b36SAndroid Build Coastguard Worker
6989*333d2b36SAndroid Build Coastguard Workerfunc TestApexAvailable_PrefixMatch(t *testing.T) {
6990*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
6991*333d2b36SAndroid Build Coastguard Worker
6992*333d2b36SAndroid Build Coastguard Worker	for _, tc := range []struct {
6993*333d2b36SAndroid Build Coastguard Worker		name          string
6994*333d2b36SAndroid Build Coastguard Worker		apexAvailable string
6995*333d2b36SAndroid Build Coastguard Worker		expectedError string
6996*333d2b36SAndroid Build Coastguard Worker	}{
6997*333d2b36SAndroid Build Coastguard Worker		{
6998*333d2b36SAndroid Build Coastguard Worker			name:          "prefix matches correctly",
6999*333d2b36SAndroid Build Coastguard Worker			apexAvailable: "com.foo.*",
7000*333d2b36SAndroid Build Coastguard Worker		},
7001*333d2b36SAndroid Build Coastguard Worker		{
7002*333d2b36SAndroid Build Coastguard Worker			name:          "prefix doesn't match",
7003*333d2b36SAndroid Build Coastguard Worker			apexAvailable: "com.bar.*",
7004*333d2b36SAndroid Build Coastguard Worker			expectedError: `Consider .* "com.foo\.\*"`,
7005*333d2b36SAndroid Build Coastguard Worker		},
7006*333d2b36SAndroid Build Coastguard Worker		{
7007*333d2b36SAndroid Build Coastguard Worker			name:          "short prefix",
7008*333d2b36SAndroid Build Coastguard Worker			apexAvailable: "com.*",
7009*333d2b36SAndroid Build Coastguard Worker			expectedError: "requires two or more components",
7010*333d2b36SAndroid Build Coastguard Worker		},
7011*333d2b36SAndroid Build Coastguard Worker		{
7012*333d2b36SAndroid Build Coastguard Worker			name:          "wildcard not in the end",
7013*333d2b36SAndroid Build Coastguard Worker			apexAvailable: "com.*.foo",
7014*333d2b36SAndroid Build Coastguard Worker			expectedError: "should end with .*",
7015*333d2b36SAndroid Build Coastguard Worker		},
7016*333d2b36SAndroid Build Coastguard Worker		{
7017*333d2b36SAndroid Build Coastguard Worker			name:          "wildcard in the middle",
7018*333d2b36SAndroid Build Coastguard Worker			apexAvailable: "com.foo*.*",
7019*333d2b36SAndroid Build Coastguard Worker			expectedError: "not allowed in the middle",
7020*333d2b36SAndroid Build Coastguard Worker		},
7021*333d2b36SAndroid Build Coastguard Worker		{
7022*333d2b36SAndroid Build Coastguard Worker			name:          "hint with prefix pattern",
7023*333d2b36SAndroid Build Coastguard Worker			apexAvailable: "//apex_available:platform",
7024*333d2b36SAndroid Build Coastguard Worker			expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
7025*333d2b36SAndroid Build Coastguard Worker		},
7026*333d2b36SAndroid Build Coastguard Worker	} {
7027*333d2b36SAndroid Build Coastguard Worker		t.Run(tc.name, func(t *testing.T) {
7028*333d2b36SAndroid Build Coastguard Worker			t.Parallel()
7029*333d2b36SAndroid Build Coastguard Worker			errorHandler := android.FixtureExpectsNoErrors
7030*333d2b36SAndroid Build Coastguard Worker			if tc.expectedError != "" {
7031*333d2b36SAndroid Build Coastguard Worker				errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
7032*333d2b36SAndroid Build Coastguard Worker			}
7033*333d2b36SAndroid Build Coastguard Worker			context := android.GroupFixturePreparers(
7034*333d2b36SAndroid Build Coastguard Worker				prepareForApexTest,
7035*333d2b36SAndroid Build Coastguard Worker				android.FixtureMergeMockFs(android.MockFS{
7036*333d2b36SAndroid Build Coastguard Worker					"system/sepolicy/apex/com.foo.bar-file_contexts": nil,
7037*333d2b36SAndroid Build Coastguard Worker				}),
7038*333d2b36SAndroid Build Coastguard Worker			).ExtendWithErrorHandler(errorHandler)
7039*333d2b36SAndroid Build Coastguard Worker
7040*333d2b36SAndroid Build Coastguard Worker			context.RunTestWithBp(t, `
7041*333d2b36SAndroid Build Coastguard Worker				apex {
7042*333d2b36SAndroid Build Coastguard Worker					name: "com.foo.bar",
7043*333d2b36SAndroid Build Coastguard Worker					key: "myapex.key",
7044*333d2b36SAndroid Build Coastguard Worker					native_shared_libs: ["libfoo"],
7045*333d2b36SAndroid Build Coastguard Worker					updatable: false,
7046*333d2b36SAndroid Build Coastguard Worker				}
7047*333d2b36SAndroid Build Coastguard Worker
7048*333d2b36SAndroid Build Coastguard Worker				apex_key {
7049*333d2b36SAndroid Build Coastguard Worker					name: "myapex.key",
7050*333d2b36SAndroid Build Coastguard Worker					public_key: "testkey.avbpubkey",
7051*333d2b36SAndroid Build Coastguard Worker					private_key: "testkey.pem",
7052*333d2b36SAndroid Build Coastguard Worker				}
7053*333d2b36SAndroid Build Coastguard Worker
7054*333d2b36SAndroid Build Coastguard Worker				cc_library {
7055*333d2b36SAndroid Build Coastguard Worker					name: "libfoo",
7056*333d2b36SAndroid Build Coastguard Worker					stl: "none",
7057*333d2b36SAndroid Build Coastguard Worker					system_shared_libs: [],
7058*333d2b36SAndroid Build Coastguard Worker					apex_available: ["`+tc.apexAvailable+`"],
7059*333d2b36SAndroid Build Coastguard Worker				}`)
7060*333d2b36SAndroid Build Coastguard Worker		})
7061*333d2b36SAndroid Build Coastguard Worker	}
7062*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `Consider adding "com.foo" to`, `
7063*333d2b36SAndroid Build Coastguard Worker		apex {
7064*333d2b36SAndroid Build Coastguard Worker			name: "com.foo", // too short for a partner apex
7065*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
7066*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["libfoo"],
7067*333d2b36SAndroid Build Coastguard Worker			updatable: false,
7068*333d2b36SAndroid Build Coastguard Worker		}
7069*333d2b36SAndroid Build Coastguard Worker
7070*333d2b36SAndroid Build Coastguard Worker		apex_key {
7071*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
7072*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
7073*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
7074*333d2b36SAndroid Build Coastguard Worker		}
7075*333d2b36SAndroid Build Coastguard Worker
7076*333d2b36SAndroid Build Coastguard Worker		cc_library {
7077*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
7078*333d2b36SAndroid Build Coastguard Worker			stl: "none",
7079*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
7080*333d2b36SAndroid Build Coastguard Worker		}
7081*333d2b36SAndroid Build Coastguard Worker	`)
7082*333d2b36SAndroid Build Coastguard Worker}
7083*333d2b36SAndroid Build Coastguard Worker
7084*333d2b36SAndroid Build Coastguard Workerfunc TestApexValidation_TestApexCanSkipInitRcCheck(t *testing.T) {
7085*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
7086*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
7087*333d2b36SAndroid Build Coastguard Worker		apex_test {
7088*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
7089*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
7090*333d2b36SAndroid Build Coastguard Worker			skip_validations: {
7091*333d2b36SAndroid Build Coastguard Worker				host_apex_verifier: true,
7092*333d2b36SAndroid Build Coastguard Worker			},
7093*333d2b36SAndroid Build Coastguard Worker			updatable: false,
7094*333d2b36SAndroid Build Coastguard Worker		}
7095*333d2b36SAndroid Build Coastguard Worker		apex_key {
7096*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
7097*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
7098*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
7099*333d2b36SAndroid Build Coastguard Worker		}
7100*333d2b36SAndroid Build Coastguard Worker	`)
7101*333d2b36SAndroid Build Coastguard Worker
7102*333d2b36SAndroid Build Coastguard Worker	validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7103*333d2b36SAndroid Build Coastguard Worker	if android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7104*333d2b36SAndroid Build Coastguard Worker		t.Error("should not run host_apex_verifier")
7105*333d2b36SAndroid Build Coastguard Worker	}
7106*333d2b36SAndroid Build Coastguard Worker}
7107*333d2b36SAndroid Build Coastguard Worker
7108*333d2b36SAndroid Build Coastguard Workerfunc TestApexValidation_TestApexCheckInitRc(t *testing.T) {
7109*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
7110*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
7111*333d2b36SAndroid Build Coastguard Worker		apex_test {
7112*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
7113*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
7114*333d2b36SAndroid Build Coastguard Worker			updatable: false,
7115*333d2b36SAndroid Build Coastguard Worker		}
7116*333d2b36SAndroid Build Coastguard Worker		apex_key {
7117*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
7118*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
7119*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
7120*333d2b36SAndroid Build Coastguard Worker		}
7121*333d2b36SAndroid Build Coastguard Worker	`)
7122*333d2b36SAndroid Build Coastguard Worker
7123*333d2b36SAndroid Build Coastguard Worker	validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7124*333d2b36SAndroid Build Coastguard Worker	if !android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7125*333d2b36SAndroid Build Coastguard Worker		t.Error("should run host_apex_verifier")
7126*333d2b36SAndroid Build Coastguard Worker	}
7127*333d2b36SAndroid Build Coastguard Worker}
7128*333d2b36SAndroid Build Coastguard Worker
7129*333d2b36SAndroid Build Coastguard Workerfunc TestOverrideApex(t *testing.T) {
7130*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
7131*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
7132*333d2b36SAndroid Build Coastguard Worker		apex {
7133*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
7134*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
7135*333d2b36SAndroid Build Coastguard Worker			apps: ["app"],
7136*333d2b36SAndroid Build Coastguard Worker			bpfs: ["bpf"],
7137*333d2b36SAndroid Build Coastguard Worker			prebuilts: ["myetc"],
7138*333d2b36SAndroid Build Coastguard Worker			overrides: ["oldapex"],
7139*333d2b36SAndroid Build Coastguard Worker			updatable: false,
7140*333d2b36SAndroid Build Coastguard Worker		}
7141*333d2b36SAndroid Build Coastguard Worker
7142*333d2b36SAndroid Build Coastguard Worker		override_apex {
7143*333d2b36SAndroid Build Coastguard Worker			name: "override_myapex",
7144*333d2b36SAndroid Build Coastguard Worker			base: "myapex",
7145*333d2b36SAndroid Build Coastguard Worker			apps: ["override_app"],
7146*333d2b36SAndroid Build Coastguard Worker			bpfs: ["overrideBpf"],
7147*333d2b36SAndroid Build Coastguard Worker			prebuilts: ["override_myetc"],
7148*333d2b36SAndroid Build Coastguard Worker			overrides: ["unknownapex"],
7149*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "first",
7150*333d2b36SAndroid Build Coastguard Worker			multilib: {
7151*333d2b36SAndroid Build Coastguard Worker				lib32: {
7152*333d2b36SAndroid Build Coastguard Worker					native_shared_libs: ["mylib32"],
7153*333d2b36SAndroid Build Coastguard Worker				},
7154*333d2b36SAndroid Build Coastguard Worker				lib64: {
7155*333d2b36SAndroid Build Coastguard Worker					native_shared_libs: ["mylib64"],
7156*333d2b36SAndroid Build Coastguard Worker				},
7157*333d2b36SAndroid Build Coastguard Worker			},
7158*333d2b36SAndroid Build Coastguard Worker			logging_parent: "com.foo.bar",
7159*333d2b36SAndroid Build Coastguard Worker			package_name: "test.overridden.package",
7160*333d2b36SAndroid Build Coastguard Worker			key: "mynewapex.key",
7161*333d2b36SAndroid Build Coastguard Worker			certificate: ":myapex.certificate",
7162*333d2b36SAndroid Build Coastguard Worker		}
7163*333d2b36SAndroid Build Coastguard Worker
7164*333d2b36SAndroid Build Coastguard Worker		apex_key {
7165*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
7166*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
7167*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
7168*333d2b36SAndroid Build Coastguard Worker		}
7169*333d2b36SAndroid Build Coastguard Worker
7170*333d2b36SAndroid Build Coastguard Worker		apex_key {
7171*333d2b36SAndroid Build Coastguard Worker			name: "mynewapex.key",
7172*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey2.avbpubkey",
7173*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey2.pem",
7174*333d2b36SAndroid Build Coastguard Worker		}
7175*333d2b36SAndroid Build Coastguard Worker
7176*333d2b36SAndroid Build Coastguard Worker		android_app_certificate {
7177*333d2b36SAndroid Build Coastguard Worker			name: "myapex.certificate",
7178*333d2b36SAndroid Build Coastguard Worker			certificate: "testkey",
7179*333d2b36SAndroid Build Coastguard Worker		}
7180*333d2b36SAndroid Build Coastguard Worker
7181*333d2b36SAndroid Build Coastguard Worker		android_app {
7182*333d2b36SAndroid Build Coastguard Worker			name: "app",
7183*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
7184*333d2b36SAndroid Build Coastguard Worker			package_name: "foo",
7185*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
7186*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
7187*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
7188*333d2b36SAndroid Build Coastguard Worker		}
7189*333d2b36SAndroid Build Coastguard Worker
7190*333d2b36SAndroid Build Coastguard Worker		override_android_app {
7191*333d2b36SAndroid Build Coastguard Worker			name: "override_app",
7192*333d2b36SAndroid Build Coastguard Worker			base: "app",
7193*333d2b36SAndroid Build Coastguard Worker			package_name: "bar",
7194*333d2b36SAndroid Build Coastguard Worker		}
7195*333d2b36SAndroid Build Coastguard Worker
7196*333d2b36SAndroid Build Coastguard Worker		bpf {
7197*333d2b36SAndroid Build Coastguard Worker			name: "bpf",
7198*333d2b36SAndroid Build Coastguard Worker			srcs: ["bpf.c"],
7199*333d2b36SAndroid Build Coastguard Worker		}
7200*333d2b36SAndroid Build Coastguard Worker
7201*333d2b36SAndroid Build Coastguard Worker		bpf {
7202*333d2b36SAndroid Build Coastguard Worker			name: "overrideBpf",
7203*333d2b36SAndroid Build Coastguard Worker			srcs: ["overrideBpf.c"],
7204*333d2b36SAndroid Build Coastguard Worker		}
7205*333d2b36SAndroid Build Coastguard Worker
7206*333d2b36SAndroid Build Coastguard Worker		prebuilt_etc {
7207*333d2b36SAndroid Build Coastguard Worker			name: "myetc",
7208*333d2b36SAndroid Build Coastguard Worker			src: "myprebuilt",
7209*333d2b36SAndroid Build Coastguard Worker		}
7210*333d2b36SAndroid Build Coastguard Worker
7211*333d2b36SAndroid Build Coastguard Worker		prebuilt_etc {
7212*333d2b36SAndroid Build Coastguard Worker			name: "override_myetc",
7213*333d2b36SAndroid Build Coastguard Worker			src: "override_myprebuilt",
7214*333d2b36SAndroid Build Coastguard Worker		}
7215*333d2b36SAndroid Build Coastguard Worker
7216*333d2b36SAndroid Build Coastguard Worker		cc_library {
7217*333d2b36SAndroid Build Coastguard Worker			name: "mylib32",
7218*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
7219*333d2b36SAndroid Build Coastguard Worker		}
7220*333d2b36SAndroid Build Coastguard Worker
7221*333d2b36SAndroid Build Coastguard Worker		cc_library {
7222*333d2b36SAndroid Build Coastguard Worker			name: "mylib64",
7223*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
7224*333d2b36SAndroid Build Coastguard Worker		}
7225*333d2b36SAndroid Build Coastguard Worker	`, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
7226*333d2b36SAndroid Build Coastguard Worker
7227*333d2b36SAndroid Build Coastguard Worker	originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
7228*333d2b36SAndroid Build Coastguard Worker	overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
7229*333d2b36SAndroid Build Coastguard Worker	if originalVariant.GetOverriddenBy() != "" {
7230*333d2b36SAndroid Build Coastguard Worker		t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7231*333d2b36SAndroid Build Coastguard Worker	}
7232*333d2b36SAndroid Build Coastguard Worker	if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7233*333d2b36SAndroid Build Coastguard Worker		t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7234*333d2b36SAndroid Build Coastguard Worker	}
7235*333d2b36SAndroid Build Coastguard Worker
7236*333d2b36SAndroid Build Coastguard Worker	module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
7237*333d2b36SAndroid Build Coastguard Worker	apexRule := module.Rule("apexRule")
7238*333d2b36SAndroid Build Coastguard Worker	copyCmds := apexRule.Args["copy_commands"]
7239*333d2b36SAndroid Build Coastguard Worker
7240*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7241*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
7242*333d2b36SAndroid Build Coastguard Worker
7243*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
7244*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
7245*333d2b36SAndroid Build Coastguard Worker
7246*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7247*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7248*333d2b36SAndroid Build Coastguard Worker
7249*333d2b36SAndroid Build Coastguard Worker	apexBundle := module.Module().(*apexBundle)
7250*333d2b36SAndroid Build Coastguard Worker	name := apexBundle.Name()
7251*333d2b36SAndroid Build Coastguard Worker	if name != "override_myapex" {
7252*333d2b36SAndroid Build Coastguard Worker		t.Errorf("name should be \"override_myapex\", but was %q", name)
7253*333d2b36SAndroid Build Coastguard Worker	}
7254*333d2b36SAndroid Build Coastguard Worker
7255*333d2b36SAndroid Build Coastguard Worker	if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7256*333d2b36SAndroid Build Coastguard Worker		t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7257*333d2b36SAndroid Build Coastguard Worker	}
7258*333d2b36SAndroid Build Coastguard Worker
7259*333d2b36SAndroid Build Coastguard Worker	optFlags := apexRule.Args["opt_flags"]
7260*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
7261*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7262*333d2b36SAndroid Build Coastguard Worker
7263*333d2b36SAndroid Build Coastguard Worker	signApkRule := module.Rule("signapk")
7264*333d2b36SAndroid Build Coastguard Worker	ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
7265*333d2b36SAndroid Build Coastguard Worker
7266*333d2b36SAndroid Build Coastguard Worker	data := android.AndroidMkDataForTest(t, ctx, apexBundle)
7267*333d2b36SAndroid Build Coastguard Worker	var builder strings.Builder
7268*333d2b36SAndroid Build Coastguard Worker	data.Custom(&builder, name, "TARGET_", "", data)
7269*333d2b36SAndroid Build Coastguard Worker	androidMk := builder.String()
7270*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7271*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
7272*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
7273*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
7274*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
7275*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
7276*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
7277*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
7278*333d2b36SAndroid Build Coastguard Worker}
7279*333d2b36SAndroid Build Coastguard Worker
7280*333d2b36SAndroid Build Coastguard Workerfunc TestMinSdkVersionOverride(t *testing.T) {
7281*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
7282*333d2b36SAndroid Build Coastguard Worker	// Override from 29 to 31
7283*333d2b36SAndroid Build Coastguard Worker	minSdkOverride31 := "31"
7284*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
7285*333d2b36SAndroid Build Coastguard Worker			apex {
7286*333d2b36SAndroid Build Coastguard Worker					name: "myapex",
7287*333d2b36SAndroid Build Coastguard Worker					key: "myapex.key",
7288*333d2b36SAndroid Build Coastguard Worker					native_shared_libs: ["mylib"],
7289*333d2b36SAndroid Build Coastguard Worker					updatable: true,
7290*333d2b36SAndroid Build Coastguard Worker					min_sdk_version: "29"
7291*333d2b36SAndroid Build Coastguard Worker			}
7292*333d2b36SAndroid Build Coastguard Worker
7293*333d2b36SAndroid Build Coastguard Worker			override_apex {
7294*333d2b36SAndroid Build Coastguard Worker					name: "override_myapex",
7295*333d2b36SAndroid Build Coastguard Worker					base: "myapex",
7296*333d2b36SAndroid Build Coastguard Worker					logging_parent: "com.foo.bar",
7297*333d2b36SAndroid Build Coastguard Worker					package_name: "test.overridden.package"
7298*333d2b36SAndroid Build Coastguard Worker			}
7299*333d2b36SAndroid Build Coastguard Worker
7300*333d2b36SAndroid Build Coastguard Worker			apex_key {
7301*333d2b36SAndroid Build Coastguard Worker					name: "myapex.key",
7302*333d2b36SAndroid Build Coastguard Worker					public_key: "testkey.avbpubkey",
7303*333d2b36SAndroid Build Coastguard Worker					private_key: "testkey.pem",
7304*333d2b36SAndroid Build Coastguard Worker			}
7305*333d2b36SAndroid Build Coastguard Worker
7306*333d2b36SAndroid Build Coastguard Worker			cc_library {
7307*333d2b36SAndroid Build Coastguard Worker					name: "mylib",
7308*333d2b36SAndroid Build Coastguard Worker					srcs: ["mylib.cpp"],
7309*333d2b36SAndroid Build Coastguard Worker					runtime_libs: ["libbar"],
7310*333d2b36SAndroid Build Coastguard Worker					system_shared_libs: [],
7311*333d2b36SAndroid Build Coastguard Worker					stl: "none",
7312*333d2b36SAndroid Build Coastguard Worker					apex_available: [ "myapex" ],
7313*333d2b36SAndroid Build Coastguard Worker					min_sdk_version: "apex_inherit"
7314*333d2b36SAndroid Build Coastguard Worker			}
7315*333d2b36SAndroid Build Coastguard Worker
7316*333d2b36SAndroid Build Coastguard Worker			cc_library {
7317*333d2b36SAndroid Build Coastguard Worker					name: "libbar",
7318*333d2b36SAndroid Build Coastguard Worker					srcs: ["mylib.cpp"],
7319*333d2b36SAndroid Build Coastguard Worker					system_shared_libs: [],
7320*333d2b36SAndroid Build Coastguard Worker					stl: "none",
7321*333d2b36SAndroid Build Coastguard Worker					apex_available: [ "myapex" ],
7322*333d2b36SAndroid Build Coastguard Worker					min_sdk_version: "apex_inherit"
7323*333d2b36SAndroid Build Coastguard Worker			}
7324*333d2b36SAndroid Build Coastguard Worker
7325*333d2b36SAndroid Build Coastguard Worker	`, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7326*333d2b36SAndroid Build Coastguard Worker
7327*333d2b36SAndroid Build Coastguard Worker	apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
7328*333d2b36SAndroid Build Coastguard Worker	copyCmds := apexRule.Args["copy_commands"]
7329*333d2b36SAndroid Build Coastguard Worker
7330*333d2b36SAndroid Build Coastguard Worker	// Ensure that direct non-stubs dep is always included
7331*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7332*333d2b36SAndroid Build Coastguard Worker
7333*333d2b36SAndroid Build Coastguard Worker	// Ensure that runtime_libs dep in included
7334*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7335*333d2b36SAndroid Build Coastguard Worker
7336*333d2b36SAndroid Build Coastguard Worker	// Ensure libraries target overridden min_sdk_version value
7337*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7338*333d2b36SAndroid Build Coastguard Worker}
7339*333d2b36SAndroid Build Coastguard Worker
7340*333d2b36SAndroid Build Coastguard Workerfunc TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7341*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
7342*333d2b36SAndroid Build Coastguard Worker	// Attempt to override from 31 to 29, should be a NOOP
7343*333d2b36SAndroid Build Coastguard Worker	minSdkOverride29 := "29"
7344*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
7345*333d2b36SAndroid Build Coastguard Worker			apex {
7346*333d2b36SAndroid Build Coastguard Worker					name: "myapex",
7347*333d2b36SAndroid Build Coastguard Worker					key: "myapex.key",
7348*333d2b36SAndroid Build Coastguard Worker					native_shared_libs: ["mylib"],
7349*333d2b36SAndroid Build Coastguard Worker					updatable: true,
7350*333d2b36SAndroid Build Coastguard Worker					min_sdk_version: "31"
7351*333d2b36SAndroid Build Coastguard Worker			}
7352*333d2b36SAndroid Build Coastguard Worker
7353*333d2b36SAndroid Build Coastguard Worker			override_apex {
7354*333d2b36SAndroid Build Coastguard Worker					name: "override_myapex",
7355*333d2b36SAndroid Build Coastguard Worker					base: "myapex",
7356*333d2b36SAndroid Build Coastguard Worker					logging_parent: "com.foo.bar",
7357*333d2b36SAndroid Build Coastguard Worker					package_name: "test.overridden.package"
7358*333d2b36SAndroid Build Coastguard Worker			}
7359*333d2b36SAndroid Build Coastguard Worker
7360*333d2b36SAndroid Build Coastguard Worker			apex_key {
7361*333d2b36SAndroid Build Coastguard Worker					name: "myapex.key",
7362*333d2b36SAndroid Build Coastguard Worker					public_key: "testkey.avbpubkey",
7363*333d2b36SAndroid Build Coastguard Worker					private_key: "testkey.pem",
7364*333d2b36SAndroid Build Coastguard Worker			}
7365*333d2b36SAndroid Build Coastguard Worker
7366*333d2b36SAndroid Build Coastguard Worker			cc_library {
7367*333d2b36SAndroid Build Coastguard Worker					name: "mylib",
7368*333d2b36SAndroid Build Coastguard Worker					srcs: ["mylib.cpp"],
7369*333d2b36SAndroid Build Coastguard Worker					runtime_libs: ["libbar"],
7370*333d2b36SAndroid Build Coastguard Worker					system_shared_libs: [],
7371*333d2b36SAndroid Build Coastguard Worker					stl: "none",
7372*333d2b36SAndroid Build Coastguard Worker					apex_available: [ "myapex" ],
7373*333d2b36SAndroid Build Coastguard Worker					min_sdk_version: "apex_inherit"
7374*333d2b36SAndroid Build Coastguard Worker			}
7375*333d2b36SAndroid Build Coastguard Worker
7376*333d2b36SAndroid Build Coastguard Worker			cc_library {
7377*333d2b36SAndroid Build Coastguard Worker					name: "libbar",
7378*333d2b36SAndroid Build Coastguard Worker					srcs: ["mylib.cpp"],
7379*333d2b36SAndroid Build Coastguard Worker					system_shared_libs: [],
7380*333d2b36SAndroid Build Coastguard Worker					stl: "none",
7381*333d2b36SAndroid Build Coastguard Worker					apex_available: [ "myapex" ],
7382*333d2b36SAndroid Build Coastguard Worker					min_sdk_version: "apex_inherit"
7383*333d2b36SAndroid Build Coastguard Worker			}
7384*333d2b36SAndroid Build Coastguard Worker
7385*333d2b36SAndroid Build Coastguard Worker	`, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7386*333d2b36SAndroid Build Coastguard Worker
7387*333d2b36SAndroid Build Coastguard Worker	apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
7388*333d2b36SAndroid Build Coastguard Worker	copyCmds := apexRule.Args["copy_commands"]
7389*333d2b36SAndroid Build Coastguard Worker
7390*333d2b36SAndroid Build Coastguard Worker	// Ensure that direct non-stubs dep is always included
7391*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7392*333d2b36SAndroid Build Coastguard Worker
7393*333d2b36SAndroid Build Coastguard Worker	// Ensure that runtime_libs dep in included
7394*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7395*333d2b36SAndroid Build Coastguard Worker
7396*333d2b36SAndroid Build Coastguard Worker	// Ensure libraries target the original min_sdk_version value rather than the overridden
7397*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7398*333d2b36SAndroid Build Coastguard Worker}
7399*333d2b36SAndroid Build Coastguard Worker
7400*333d2b36SAndroid Build Coastguard Workerfunc TestLegacyAndroid10Support(t *testing.T) {
7401*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
7402*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
7403*333d2b36SAndroid Build Coastguard Worker		apex {
7404*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
7405*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
7406*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib"],
7407*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
7408*333d2b36SAndroid Build Coastguard Worker		}
7409*333d2b36SAndroid Build Coastguard Worker
7410*333d2b36SAndroid Build Coastguard Worker		apex_key {
7411*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
7412*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
7413*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
7414*333d2b36SAndroid Build Coastguard Worker		}
7415*333d2b36SAndroid Build Coastguard Worker
7416*333d2b36SAndroid Build Coastguard Worker		cc_library {
7417*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
7418*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
7419*333d2b36SAndroid Build Coastguard Worker			stl: "libc++",
7420*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
7421*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
7422*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
7423*333d2b36SAndroid Build Coastguard Worker		}
7424*333d2b36SAndroid Build Coastguard Worker	`, withUnbundledBuild)
7425*333d2b36SAndroid Build Coastguard Worker
7426*333d2b36SAndroid Build Coastguard Worker	module := ctx.ModuleForTests("myapex", "android_common_myapex")
7427*333d2b36SAndroid Build Coastguard Worker	args := module.Rule("apexRule").Args
7428*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
7429*333d2b36SAndroid Build Coastguard Worker
7430*333d2b36SAndroid Build Coastguard Worker	// The copies of the libraries in the apex should have one more dependency than
7431*333d2b36SAndroid Build Coastguard Worker	// the ones outside the apex, namely the unwinder. Ideally we should check
7432*333d2b36SAndroid Build Coastguard Worker	// the dependency names directly here but for some reason the names are blank in
7433*333d2b36SAndroid Build Coastguard Worker	// this test.
7434*333d2b36SAndroid Build Coastguard Worker	for _, lib := range []string{"libc++", "mylib"} {
7435*333d2b36SAndroid Build Coastguard Worker		apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
7436*333d2b36SAndroid Build Coastguard Worker		nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7437*333d2b36SAndroid Build Coastguard Worker		if len(apexImplicits) != len(nonApexImplicits)+1 {
7438*333d2b36SAndroid Build Coastguard Worker			t.Errorf("%q missing unwinder dep", lib)
7439*333d2b36SAndroid Build Coastguard Worker		}
7440*333d2b36SAndroid Build Coastguard Worker	}
7441*333d2b36SAndroid Build Coastguard Worker}
7442*333d2b36SAndroid Build Coastguard Worker
7443*333d2b36SAndroid Build Coastguard Workervar filesForSdkLibrary = android.MockFS{
7444*333d2b36SAndroid Build Coastguard Worker	"api/current.txt":        nil,
7445*333d2b36SAndroid Build Coastguard Worker	"api/removed.txt":        nil,
7446*333d2b36SAndroid Build Coastguard Worker	"api/system-current.txt": nil,
7447*333d2b36SAndroid Build Coastguard Worker	"api/system-removed.txt": nil,
7448*333d2b36SAndroid Build Coastguard Worker	"api/test-current.txt":   nil,
7449*333d2b36SAndroid Build Coastguard Worker	"api/test-removed.txt":   nil,
7450*333d2b36SAndroid Build Coastguard Worker
7451*333d2b36SAndroid Build Coastguard Worker	"100/public/api/foo.txt":         nil,
7452*333d2b36SAndroid Build Coastguard Worker	"100/public/api/foo-removed.txt": nil,
7453*333d2b36SAndroid Build Coastguard Worker	"100/system/api/foo.txt":         nil,
7454*333d2b36SAndroid Build Coastguard Worker	"100/system/api/foo-removed.txt": nil,
7455*333d2b36SAndroid Build Coastguard Worker
7456*333d2b36SAndroid Build Coastguard Worker	// For java_sdk_library_import
7457*333d2b36SAndroid Build Coastguard Worker	"a.jar": nil,
7458*333d2b36SAndroid Build Coastguard Worker}
7459*333d2b36SAndroid Build Coastguard Worker
7460*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSDKLibrary(t *testing.T) {
7461*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
7462*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
7463*333d2b36SAndroid Build Coastguard Worker		apex {
7464*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
7465*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
7466*333d2b36SAndroid Build Coastguard Worker			java_libs: ["foo"],
7467*333d2b36SAndroid Build Coastguard Worker			updatable: false,
7468*333d2b36SAndroid Build Coastguard Worker		}
7469*333d2b36SAndroid Build Coastguard Worker
7470*333d2b36SAndroid Build Coastguard Worker		apex_key {
7471*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
7472*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
7473*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
7474*333d2b36SAndroid Build Coastguard Worker		}
7475*333d2b36SAndroid Build Coastguard Worker
7476*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
7477*333d2b36SAndroid Build Coastguard Worker			name: "foo",
7478*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
7479*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
7480*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
7481*333d2b36SAndroid Build Coastguard Worker		}
7482*333d2b36SAndroid Build Coastguard Worker
7483*333d2b36SAndroid Build Coastguard Worker		prebuilt_apis {
7484*333d2b36SAndroid Build Coastguard Worker			name: "sdk",
7485*333d2b36SAndroid Build Coastguard Worker			api_dirs: ["100"],
7486*333d2b36SAndroid Build Coastguard Worker		}
7487*333d2b36SAndroid Build Coastguard Worker	`, withFiles(filesForSdkLibrary))
7488*333d2b36SAndroid Build Coastguard Worker
7489*333d2b36SAndroid Build Coastguard Worker	// java_sdk_library installs both impl jar and permission XML
7490*333d2b36SAndroid Build Coastguard Worker	ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7491*333d2b36SAndroid Build Coastguard Worker		"javalib/foo.jar",
7492*333d2b36SAndroid Build Coastguard Worker		"etc/permissions/foo.xml",
7493*333d2b36SAndroid Build Coastguard Worker	})
7494*333d2b36SAndroid Build Coastguard Worker	// Permission XML should point to the activated path of impl jar of java_sdk_library
7495*333d2b36SAndroid Build Coastguard Worker	sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7496*333d2b36SAndroid Build Coastguard Worker	contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7497*333d2b36SAndroid Build Coastguard Worker	ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7498*333d2b36SAndroid Build Coastguard Worker}
7499*333d2b36SAndroid Build Coastguard Worker
7500*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSDKLibraryOverrideApexes(t *testing.T) {
7501*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
7502*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
7503*333d2b36SAndroid Build Coastguard Worker		override_apex {
7504*333d2b36SAndroid Build Coastguard Worker			name: "mycompanyapex",
7505*333d2b36SAndroid Build Coastguard Worker			base: "myapex",
7506*333d2b36SAndroid Build Coastguard Worker		}
7507*333d2b36SAndroid Build Coastguard Worker		apex {
7508*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
7509*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
7510*333d2b36SAndroid Build Coastguard Worker			java_libs: ["foo"],
7511*333d2b36SAndroid Build Coastguard Worker			updatable: false,
7512*333d2b36SAndroid Build Coastguard Worker		}
7513*333d2b36SAndroid Build Coastguard Worker
7514*333d2b36SAndroid Build Coastguard Worker		apex_key {
7515*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
7516*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
7517*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
7518*333d2b36SAndroid Build Coastguard Worker		}
7519*333d2b36SAndroid Build Coastguard Worker
7520*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
7521*333d2b36SAndroid Build Coastguard Worker			name: "foo",
7522*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
7523*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
7524*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
7525*333d2b36SAndroid Build Coastguard Worker		}
7526*333d2b36SAndroid Build Coastguard Worker
7527*333d2b36SAndroid Build Coastguard Worker		prebuilt_apis {
7528*333d2b36SAndroid Build Coastguard Worker			name: "sdk",
7529*333d2b36SAndroid Build Coastguard Worker			api_dirs: ["100"],
7530*333d2b36SAndroid Build Coastguard Worker		}
7531*333d2b36SAndroid Build Coastguard Worker	`, withFiles(filesForSdkLibrary))
7532*333d2b36SAndroid Build Coastguard Worker
7533*333d2b36SAndroid Build Coastguard Worker	// Permission XML should point to the activated path of impl jar of java_sdk_library.
7534*333d2b36SAndroid Build Coastguard Worker	// Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7535*333d2b36SAndroid Build Coastguard Worker	// (com.android.foo), the filepath should not contain override apex name.
7536*333d2b36SAndroid Build Coastguard Worker	sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7537*333d2b36SAndroid Build Coastguard Worker	contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7538*333d2b36SAndroid Build Coastguard Worker	ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7539*333d2b36SAndroid Build Coastguard Worker}
7540*333d2b36SAndroid Build Coastguard Worker
7541*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSDKLibrary_WithinApex(t *testing.T) {
7542*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
7543*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
7544*333d2b36SAndroid Build Coastguard Worker		apex {
7545*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
7546*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
7547*333d2b36SAndroid Build Coastguard Worker			java_libs: ["foo", "bar"],
7548*333d2b36SAndroid Build Coastguard Worker			updatable: false,
7549*333d2b36SAndroid Build Coastguard Worker		}
7550*333d2b36SAndroid Build Coastguard Worker
7551*333d2b36SAndroid Build Coastguard Worker		apex_key {
7552*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
7553*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
7554*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
7555*333d2b36SAndroid Build Coastguard Worker		}
7556*333d2b36SAndroid Build Coastguard Worker
7557*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
7558*333d2b36SAndroid Build Coastguard Worker			name: "foo",
7559*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
7560*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
7561*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
7562*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
7563*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
7564*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
7565*333d2b36SAndroid Build Coastguard Worker		}
7566*333d2b36SAndroid Build Coastguard Worker
7567*333d2b36SAndroid Build Coastguard Worker		java_library {
7568*333d2b36SAndroid Build Coastguard Worker			name: "bar",
7569*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
7570*333d2b36SAndroid Build Coastguard Worker			libs: ["foo.impl"],
7571*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
7572*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
7573*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
7574*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
7575*333d2b36SAndroid Build Coastguard Worker		}
7576*333d2b36SAndroid Build Coastguard Worker
7577*333d2b36SAndroid Build Coastguard Worker		prebuilt_apis {
7578*333d2b36SAndroid Build Coastguard Worker			name: "sdk",
7579*333d2b36SAndroid Build Coastguard Worker			api_dirs: ["100"],
7580*333d2b36SAndroid Build Coastguard Worker		}
7581*333d2b36SAndroid Build Coastguard Worker	`, withFiles(filesForSdkLibrary))
7582*333d2b36SAndroid Build Coastguard Worker
7583*333d2b36SAndroid Build Coastguard Worker	// java_sdk_library installs both impl jar and permission XML
7584*333d2b36SAndroid Build Coastguard Worker	ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7585*333d2b36SAndroid Build Coastguard Worker		"javalib/bar.jar",
7586*333d2b36SAndroid Build Coastguard Worker		"javalib/foo.jar",
7587*333d2b36SAndroid Build Coastguard Worker		"etc/permissions/foo.xml",
7588*333d2b36SAndroid Build Coastguard Worker	})
7589*333d2b36SAndroid Build Coastguard Worker
7590*333d2b36SAndroid Build Coastguard Worker	// The bar library should depend on the implementation jar.
7591*333d2b36SAndroid Build Coastguard Worker	barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
7592*333d2b36SAndroid Build Coastguard Worker	if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
7593*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected %q, found %#q", expected, actual)
7594*333d2b36SAndroid Build Coastguard Worker	}
7595*333d2b36SAndroid Build Coastguard Worker}
7596*333d2b36SAndroid Build Coastguard Worker
7597*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
7598*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
7599*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
7600*333d2b36SAndroid Build Coastguard Worker		apex {
7601*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
7602*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
7603*333d2b36SAndroid Build Coastguard Worker			java_libs: ["foo"],
7604*333d2b36SAndroid Build Coastguard Worker			updatable: false,
7605*333d2b36SAndroid Build Coastguard Worker		}
7606*333d2b36SAndroid Build Coastguard Worker
7607*333d2b36SAndroid Build Coastguard Worker		apex_key {
7608*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
7609*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
7610*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
7611*333d2b36SAndroid Build Coastguard Worker		}
7612*333d2b36SAndroid Build Coastguard Worker
7613*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
7614*333d2b36SAndroid Build Coastguard Worker			name: "foo",
7615*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
7616*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
7617*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
7618*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
7619*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
7620*333d2b36SAndroid Build Coastguard Worker		}
7621*333d2b36SAndroid Build Coastguard Worker
7622*333d2b36SAndroid Build Coastguard Worker		java_library {
7623*333d2b36SAndroid Build Coastguard Worker			name: "bar",
7624*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
7625*333d2b36SAndroid Build Coastguard Worker			libs: ["foo.stubs"],
7626*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
7627*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
7628*333d2b36SAndroid Build Coastguard Worker		}
7629*333d2b36SAndroid Build Coastguard Worker
7630*333d2b36SAndroid Build Coastguard Worker		prebuilt_apis {
7631*333d2b36SAndroid Build Coastguard Worker			name: "sdk",
7632*333d2b36SAndroid Build Coastguard Worker			api_dirs: ["100"],
7633*333d2b36SAndroid Build Coastguard Worker		}
7634*333d2b36SAndroid Build Coastguard Worker	`, withFiles(filesForSdkLibrary))
7635*333d2b36SAndroid Build Coastguard Worker
7636*333d2b36SAndroid Build Coastguard Worker	// java_sdk_library installs both impl jar and permission XML
7637*333d2b36SAndroid Build Coastguard Worker	ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7638*333d2b36SAndroid Build Coastguard Worker		"javalib/foo.jar",
7639*333d2b36SAndroid Build Coastguard Worker		"etc/permissions/foo.xml",
7640*333d2b36SAndroid Build Coastguard Worker	})
7641*333d2b36SAndroid Build Coastguard Worker
7642*333d2b36SAndroid Build Coastguard Worker	// The bar library should depend on the stubs jar.
7643*333d2b36SAndroid Build Coastguard Worker	barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
7644*333d2b36SAndroid Build Coastguard Worker	if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
7645*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected %q, found %#q", expected, actual)
7646*333d2b36SAndroid Build Coastguard Worker	}
7647*333d2b36SAndroid Build Coastguard Worker}
7648*333d2b36SAndroid Build Coastguard Worker
7649*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
7650*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
7651*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
7652*333d2b36SAndroid Build Coastguard Worker		prebuilt_apis {
7653*333d2b36SAndroid Build Coastguard Worker			name: "sdk",
7654*333d2b36SAndroid Build Coastguard Worker			api_dirs: ["100"],
7655*333d2b36SAndroid Build Coastguard Worker		}`,
7656*333d2b36SAndroid Build Coastguard Worker		withFiles(map[string][]byte{
7657*333d2b36SAndroid Build Coastguard Worker			"apex/a.java":             nil,
7658*333d2b36SAndroid Build Coastguard Worker			"apex/apex_manifest.json": nil,
7659*333d2b36SAndroid Build Coastguard Worker			"apex/Android.bp": []byte(`
7660*333d2b36SAndroid Build Coastguard Worker		package {
7661*333d2b36SAndroid Build Coastguard Worker			default_visibility: ["//visibility:private"],
7662*333d2b36SAndroid Build Coastguard Worker		}
7663*333d2b36SAndroid Build Coastguard Worker
7664*333d2b36SAndroid Build Coastguard Worker		apex {
7665*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
7666*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
7667*333d2b36SAndroid Build Coastguard Worker			java_libs: ["foo", "bar"],
7668*333d2b36SAndroid Build Coastguard Worker			updatable: false,
7669*333d2b36SAndroid Build Coastguard Worker		}
7670*333d2b36SAndroid Build Coastguard Worker
7671*333d2b36SAndroid Build Coastguard Worker		apex_key {
7672*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
7673*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
7674*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
7675*333d2b36SAndroid Build Coastguard Worker		}
7676*333d2b36SAndroid Build Coastguard Worker
7677*333d2b36SAndroid Build Coastguard Worker		java_library {
7678*333d2b36SAndroid Build Coastguard Worker			name: "bar",
7679*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
7680*333d2b36SAndroid Build Coastguard Worker			libs: ["foo.impl"],
7681*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
7682*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
7683*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
7684*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
7685*333d2b36SAndroid Build Coastguard Worker		}
7686*333d2b36SAndroid Build Coastguard Worker`),
7687*333d2b36SAndroid Build Coastguard Worker			"source/a.java":          nil,
7688*333d2b36SAndroid Build Coastguard Worker			"source/api/current.txt": nil,
7689*333d2b36SAndroid Build Coastguard Worker			"source/api/removed.txt": nil,
7690*333d2b36SAndroid Build Coastguard Worker			"source/Android.bp": []byte(`
7691*333d2b36SAndroid Build Coastguard Worker		package {
7692*333d2b36SAndroid Build Coastguard Worker			default_visibility: ["//visibility:private"],
7693*333d2b36SAndroid Build Coastguard Worker		}
7694*333d2b36SAndroid Build Coastguard Worker
7695*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
7696*333d2b36SAndroid Build Coastguard Worker			name: "foo",
7697*333d2b36SAndroid Build Coastguard Worker			visibility: ["//apex"],
7698*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
7699*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
7700*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
7701*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
7702*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
7703*333d2b36SAndroid Build Coastguard Worker			public: {
7704*333d2b36SAndroid Build Coastguard Worker				enabled: true,
7705*333d2b36SAndroid Build Coastguard Worker			},
7706*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
7707*333d2b36SAndroid Build Coastguard Worker		}
7708*333d2b36SAndroid Build Coastguard Worker`),
7709*333d2b36SAndroid Build Coastguard Worker			"prebuilt/a.jar": nil,
7710*333d2b36SAndroid Build Coastguard Worker			"prebuilt/Android.bp": []byte(`
7711*333d2b36SAndroid Build Coastguard Worker		package {
7712*333d2b36SAndroid Build Coastguard Worker			default_visibility: ["//visibility:private"],
7713*333d2b36SAndroid Build Coastguard Worker		}
7714*333d2b36SAndroid Build Coastguard Worker
7715*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
7716*333d2b36SAndroid Build Coastguard Worker			name: "foo",
7717*333d2b36SAndroid Build Coastguard Worker			visibility: ["//apex", "//source"],
7718*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
7719*333d2b36SAndroid Build Coastguard Worker			prefer: true,
7720*333d2b36SAndroid Build Coastguard Worker			public: {
7721*333d2b36SAndroid Build Coastguard Worker				jars: ["a.jar"],
7722*333d2b36SAndroid Build Coastguard Worker			},
7723*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
7724*333d2b36SAndroid Build Coastguard Worker		}
7725*333d2b36SAndroid Build Coastguard Worker`),
7726*333d2b36SAndroid Build Coastguard Worker		}), withFiles(filesForSdkLibrary),
7727*333d2b36SAndroid Build Coastguard Worker	)
7728*333d2b36SAndroid Build Coastguard Worker
7729*333d2b36SAndroid Build Coastguard Worker	// java_sdk_library installs both impl jar and permission XML
7730*333d2b36SAndroid Build Coastguard Worker	ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7731*333d2b36SAndroid Build Coastguard Worker		"javalib/bar.jar",
7732*333d2b36SAndroid Build Coastguard Worker		"javalib/foo.jar",
7733*333d2b36SAndroid Build Coastguard Worker		"etc/permissions/foo.xml",
7734*333d2b36SAndroid Build Coastguard Worker	})
7735*333d2b36SAndroid Build Coastguard Worker
7736*333d2b36SAndroid Build Coastguard Worker	// The bar library should depend on the implementation jar.
7737*333d2b36SAndroid Build Coastguard Worker	barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
7738*333d2b36SAndroid Build Coastguard Worker	if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
7739*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected %q, found %#q", expected, actual)
7740*333d2b36SAndroid Build Coastguard Worker	}
7741*333d2b36SAndroid Build Coastguard Worker}
7742*333d2b36SAndroid Build Coastguard Worker
7743*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7744*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
7745*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7746*333d2b36SAndroid Build Coastguard Worker		apex {
7747*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
7748*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
7749*333d2b36SAndroid Build Coastguard Worker			java_libs: ["foo"],
7750*333d2b36SAndroid Build Coastguard Worker			updatable: false,
7751*333d2b36SAndroid Build Coastguard Worker		}
7752*333d2b36SAndroid Build Coastguard Worker
7753*333d2b36SAndroid Build Coastguard Worker		apex_key {
7754*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
7755*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
7756*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
7757*333d2b36SAndroid Build Coastguard Worker		}
7758*333d2b36SAndroid Build Coastguard Worker
7759*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
7760*333d2b36SAndroid Build Coastguard Worker			name: "foo",
7761*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
7762*333d2b36SAndroid Build Coastguard Worker			prefer: true,
7763*333d2b36SAndroid Build Coastguard Worker			public: {
7764*333d2b36SAndroid Build Coastguard Worker				jars: ["a.jar"],
7765*333d2b36SAndroid Build Coastguard Worker			},
7766*333d2b36SAndroid Build Coastguard Worker		}
7767*333d2b36SAndroid Build Coastguard Worker
7768*333d2b36SAndroid Build Coastguard Worker	`, withFiles(filesForSdkLibrary))
7769*333d2b36SAndroid Build Coastguard Worker}
7770*333d2b36SAndroid Build Coastguard Worker
7771*333d2b36SAndroid Build Coastguard Workerfunc TestCompatConfig(t *testing.T) {
7772*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
7773*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
7774*333d2b36SAndroid Build Coastguard Worker		prepareForApexTest,
7775*333d2b36SAndroid Build Coastguard Worker		java.PrepareForTestWithPlatformCompatConfig,
7776*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
7777*333d2b36SAndroid Build Coastguard Worker		apex {
7778*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
7779*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
7780*333d2b36SAndroid Build Coastguard Worker			compat_configs: ["myjar-platform-compat-config"],
7781*333d2b36SAndroid Build Coastguard Worker			java_libs: ["myjar"],
7782*333d2b36SAndroid Build Coastguard Worker			updatable: false,
7783*333d2b36SAndroid Build Coastguard Worker		}
7784*333d2b36SAndroid Build Coastguard Worker
7785*333d2b36SAndroid Build Coastguard Worker		apex_key {
7786*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
7787*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
7788*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
7789*333d2b36SAndroid Build Coastguard Worker		}
7790*333d2b36SAndroid Build Coastguard Worker
7791*333d2b36SAndroid Build Coastguard Worker		platform_compat_config {
7792*333d2b36SAndroid Build Coastguard Worker		    name: "myjar-platform-compat-config",
7793*333d2b36SAndroid Build Coastguard Worker		    src: ":myjar",
7794*333d2b36SAndroid Build Coastguard Worker		}
7795*333d2b36SAndroid Build Coastguard Worker
7796*333d2b36SAndroid Build Coastguard Worker		java_library {
7797*333d2b36SAndroid Build Coastguard Worker			name: "myjar",
7798*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
7799*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
7800*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
7801*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
7802*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
7803*333d2b36SAndroid Build Coastguard Worker		}
7804*333d2b36SAndroid Build Coastguard Worker
7805*333d2b36SAndroid Build Coastguard Worker		// Make sure that a preferred prebuilt does not affect the apex contents.
7806*333d2b36SAndroid Build Coastguard Worker		prebuilt_platform_compat_config {
7807*333d2b36SAndroid Build Coastguard Worker			name: "myjar-platform-compat-config",
7808*333d2b36SAndroid Build Coastguard Worker			metadata: "compat-config/metadata.xml",
7809*333d2b36SAndroid Build Coastguard Worker			prefer: true,
7810*333d2b36SAndroid Build Coastguard Worker		}
7811*333d2b36SAndroid Build Coastguard Worker	`)
7812*333d2b36SAndroid Build Coastguard Worker	ctx := result.TestContext
7813*333d2b36SAndroid Build Coastguard Worker	ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7814*333d2b36SAndroid Build Coastguard Worker		"etc/compatconfig/myjar-platform-compat-config.xml",
7815*333d2b36SAndroid Build Coastguard Worker		"javalib/myjar.jar",
7816*333d2b36SAndroid Build Coastguard Worker	})
7817*333d2b36SAndroid Build Coastguard Worker}
7818*333d2b36SAndroid Build Coastguard Worker
7819*333d2b36SAndroid Build Coastguard Workerfunc TestNoDupeApexFiles(t *testing.T) {
7820*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
7821*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
7822*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithAndroidBuildComponents,
7823*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithApexBuildComponents,
7824*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithMyapex,
7825*333d2b36SAndroid Build Coastguard Worker		prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7826*333d2b36SAndroid Build Coastguard Worker	).
7827*333d2b36SAndroid Build Coastguard Worker		ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7828*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, `
7829*333d2b36SAndroid Build Coastguard Worker			apex {
7830*333d2b36SAndroid Build Coastguard Worker				name: "myapex",
7831*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
7832*333d2b36SAndroid Build Coastguard Worker				prebuilts: ["foo", "bar"],
7833*333d2b36SAndroid Build Coastguard Worker				updatable: false,
7834*333d2b36SAndroid Build Coastguard Worker			}
7835*333d2b36SAndroid Build Coastguard Worker
7836*333d2b36SAndroid Build Coastguard Worker			apex_key {
7837*333d2b36SAndroid Build Coastguard Worker				name: "myapex.key",
7838*333d2b36SAndroid Build Coastguard Worker				public_key: "testkey.avbpubkey",
7839*333d2b36SAndroid Build Coastguard Worker				private_key: "testkey.pem",
7840*333d2b36SAndroid Build Coastguard Worker			}
7841*333d2b36SAndroid Build Coastguard Worker
7842*333d2b36SAndroid Build Coastguard Worker			prebuilt_etc {
7843*333d2b36SAndroid Build Coastguard Worker				name: "foo",
7844*333d2b36SAndroid Build Coastguard Worker				src: "myprebuilt",
7845*333d2b36SAndroid Build Coastguard Worker				filename_from_src: true,
7846*333d2b36SAndroid Build Coastguard Worker			}
7847*333d2b36SAndroid Build Coastguard Worker
7848*333d2b36SAndroid Build Coastguard Worker			prebuilt_etc {
7849*333d2b36SAndroid Build Coastguard Worker				name: "bar",
7850*333d2b36SAndroid Build Coastguard Worker				src: "myprebuilt",
7851*333d2b36SAndroid Build Coastguard Worker				filename_from_src: true,
7852*333d2b36SAndroid Build Coastguard Worker			}
7853*333d2b36SAndroid Build Coastguard Worker		`)
7854*333d2b36SAndroid Build Coastguard Worker}
7855*333d2b36SAndroid Build Coastguard Worker
7856*333d2b36SAndroid Build Coastguard Workerfunc TestApexUnwantedTransitiveDeps(t *testing.T) {
7857*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
7858*333d2b36SAndroid Build Coastguard Worker	bp := `
7859*333d2b36SAndroid Build Coastguard Worker	apex {
7860*333d2b36SAndroid Build Coastguard Worker		name: "myapex",
7861*333d2b36SAndroid Build Coastguard Worker		key: "myapex.key",
7862*333d2b36SAndroid Build Coastguard Worker		native_shared_libs: ["libfoo"],
7863*333d2b36SAndroid Build Coastguard Worker		updatable: false,
7864*333d2b36SAndroid Build Coastguard Worker		unwanted_transitive_deps: ["libbar"],
7865*333d2b36SAndroid Build Coastguard Worker	}
7866*333d2b36SAndroid Build Coastguard Worker
7867*333d2b36SAndroid Build Coastguard Worker	apex_key {
7868*333d2b36SAndroid Build Coastguard Worker		name: "myapex.key",
7869*333d2b36SAndroid Build Coastguard Worker		public_key: "testkey.avbpubkey",
7870*333d2b36SAndroid Build Coastguard Worker		private_key: "testkey.pem",
7871*333d2b36SAndroid Build Coastguard Worker	}
7872*333d2b36SAndroid Build Coastguard Worker
7873*333d2b36SAndroid Build Coastguard Worker	cc_library {
7874*333d2b36SAndroid Build Coastguard Worker		name: "libfoo",
7875*333d2b36SAndroid Build Coastguard Worker		srcs: ["foo.cpp"],
7876*333d2b36SAndroid Build Coastguard Worker		shared_libs: ["libbar"],
7877*333d2b36SAndroid Build Coastguard Worker		apex_available: ["myapex"],
7878*333d2b36SAndroid Build Coastguard Worker	}
7879*333d2b36SAndroid Build Coastguard Worker
7880*333d2b36SAndroid Build Coastguard Worker	cc_library {
7881*333d2b36SAndroid Build Coastguard Worker		name: "libbar",
7882*333d2b36SAndroid Build Coastguard Worker		srcs: ["bar.cpp"],
7883*333d2b36SAndroid Build Coastguard Worker		apex_available: ["myapex"],
7884*333d2b36SAndroid Build Coastguard Worker	}`
7885*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, bp)
7886*333d2b36SAndroid Build Coastguard Worker	ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7887*333d2b36SAndroid Build Coastguard Worker		"*/libc++.so",
7888*333d2b36SAndroid Build Coastguard Worker		"*/libfoo.so",
7889*333d2b36SAndroid Build Coastguard Worker		// not libbar.so
7890*333d2b36SAndroid Build Coastguard Worker	})
7891*333d2b36SAndroid Build Coastguard Worker}
7892*333d2b36SAndroid Build Coastguard Worker
7893*333d2b36SAndroid Build Coastguard Workerfunc TestRejectNonInstallableJavaLibrary(t *testing.T) {
7894*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
7895*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7896*333d2b36SAndroid Build Coastguard Worker		apex {
7897*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
7898*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
7899*333d2b36SAndroid Build Coastguard Worker			java_libs: ["myjar"],
7900*333d2b36SAndroid Build Coastguard Worker			updatable: false,
7901*333d2b36SAndroid Build Coastguard Worker		}
7902*333d2b36SAndroid Build Coastguard Worker
7903*333d2b36SAndroid Build Coastguard Worker		apex_key {
7904*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
7905*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
7906*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
7907*333d2b36SAndroid Build Coastguard Worker		}
7908*333d2b36SAndroid Build Coastguard Worker
7909*333d2b36SAndroid Build Coastguard Worker		java_library {
7910*333d2b36SAndroid Build Coastguard Worker			name: "myjar",
7911*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
7912*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
7913*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
7914*333d2b36SAndroid Build Coastguard Worker			compile_dex: false,
7915*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
7916*333d2b36SAndroid Build Coastguard Worker		}
7917*333d2b36SAndroid Build Coastguard Worker	`)
7918*333d2b36SAndroid Build Coastguard Worker}
7919*333d2b36SAndroid Build Coastguard Worker
7920*333d2b36SAndroid Build Coastguard Workerfunc TestSymlinksFromApexToSystem(t *testing.T) {
7921*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
7922*333d2b36SAndroid Build Coastguard Worker	bp := `
7923*333d2b36SAndroid Build Coastguard Worker		apex {
7924*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
7925*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
7926*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib"],
7927*333d2b36SAndroid Build Coastguard Worker			java_libs: ["myjar"],
7928*333d2b36SAndroid Build Coastguard Worker			updatable: false,
7929*333d2b36SAndroid Build Coastguard Worker		}
7930*333d2b36SAndroid Build Coastguard Worker
7931*333d2b36SAndroid Build Coastguard Worker		apex {
7932*333d2b36SAndroid Build Coastguard Worker			name: "myapex.updatable",
7933*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
7934*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib"],
7935*333d2b36SAndroid Build Coastguard Worker			java_libs: ["myjar"],
7936*333d2b36SAndroid Build Coastguard Worker			updatable: true,
7937*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "33",
7938*333d2b36SAndroid Build Coastguard Worker		}
7939*333d2b36SAndroid Build Coastguard Worker
7940*333d2b36SAndroid Build Coastguard Worker		apex_key {
7941*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
7942*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
7943*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
7944*333d2b36SAndroid Build Coastguard Worker		}
7945*333d2b36SAndroid Build Coastguard Worker
7946*333d2b36SAndroid Build Coastguard Worker		cc_library {
7947*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
7948*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
7949*333d2b36SAndroid Build Coastguard Worker			shared_libs: [
7950*333d2b36SAndroid Build Coastguard Worker				"myotherlib",
7951*333d2b36SAndroid Build Coastguard Worker				"myotherlib_ext",
7952*333d2b36SAndroid Build Coastguard Worker			],
7953*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
7954*333d2b36SAndroid Build Coastguard Worker			stl: "none",
7955*333d2b36SAndroid Build Coastguard Worker			apex_available: [
7956*333d2b36SAndroid Build Coastguard Worker				"myapex",
7957*333d2b36SAndroid Build Coastguard Worker				"myapex.updatable",
7958*333d2b36SAndroid Build Coastguard Worker				"//apex_available:platform",
7959*333d2b36SAndroid Build Coastguard Worker			],
7960*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "33",
7961*333d2b36SAndroid Build Coastguard Worker		}
7962*333d2b36SAndroid Build Coastguard Worker
7963*333d2b36SAndroid Build Coastguard Worker		cc_library {
7964*333d2b36SAndroid Build Coastguard Worker			name: "myotherlib",
7965*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
7966*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
7967*333d2b36SAndroid Build Coastguard Worker			stl: "none",
7968*333d2b36SAndroid Build Coastguard Worker			apex_available: [
7969*333d2b36SAndroid Build Coastguard Worker				"myapex",
7970*333d2b36SAndroid Build Coastguard Worker				"myapex.updatable",
7971*333d2b36SAndroid Build Coastguard Worker				"//apex_available:platform",
7972*333d2b36SAndroid Build Coastguard Worker			],
7973*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "33",
7974*333d2b36SAndroid Build Coastguard Worker		}
7975*333d2b36SAndroid Build Coastguard Worker
7976*333d2b36SAndroid Build Coastguard Worker		cc_library {
7977*333d2b36SAndroid Build Coastguard Worker			name: "myotherlib_ext",
7978*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
7979*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
7980*333d2b36SAndroid Build Coastguard Worker			system_ext_specific: true,
7981*333d2b36SAndroid Build Coastguard Worker			stl: "none",
7982*333d2b36SAndroid Build Coastguard Worker			apex_available: [
7983*333d2b36SAndroid Build Coastguard Worker				"myapex",
7984*333d2b36SAndroid Build Coastguard Worker				"myapex.updatable",
7985*333d2b36SAndroid Build Coastguard Worker				"//apex_available:platform",
7986*333d2b36SAndroid Build Coastguard Worker			],
7987*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "33",
7988*333d2b36SAndroid Build Coastguard Worker		}
7989*333d2b36SAndroid Build Coastguard Worker
7990*333d2b36SAndroid Build Coastguard Worker		java_library {
7991*333d2b36SAndroid Build Coastguard Worker			name: "myjar",
7992*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
7993*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
7994*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
7995*333d2b36SAndroid Build Coastguard Worker			static_libs: ["myotherjar"],
7996*333d2b36SAndroid Build Coastguard Worker			apex_available: [
7997*333d2b36SAndroid Build Coastguard Worker				"myapex",
7998*333d2b36SAndroid Build Coastguard Worker				"myapex.updatable",
7999*333d2b36SAndroid Build Coastguard Worker				"//apex_available:platform",
8000*333d2b36SAndroid Build Coastguard Worker			],
8001*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "33",
8002*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
8003*333d2b36SAndroid Build Coastguard Worker		}
8004*333d2b36SAndroid Build Coastguard Worker
8005*333d2b36SAndroid Build Coastguard Worker		java_library {
8006*333d2b36SAndroid Build Coastguard Worker			name: "myotherjar",
8007*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
8008*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
8009*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
8010*333d2b36SAndroid Build Coastguard Worker			apex_available: [
8011*333d2b36SAndroid Build Coastguard Worker				"myapex",
8012*333d2b36SAndroid Build Coastguard Worker				"myapex.updatable",
8013*333d2b36SAndroid Build Coastguard Worker				"//apex_available:platform",
8014*333d2b36SAndroid Build Coastguard Worker			],
8015*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "33",
8016*333d2b36SAndroid Build Coastguard Worker		}
8017*333d2b36SAndroid Build Coastguard Worker	`
8018*333d2b36SAndroid Build Coastguard Worker
8019*333d2b36SAndroid Build Coastguard Worker	ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8020*333d2b36SAndroid Build Coastguard Worker		for _, f := range files {
8021*333d2b36SAndroid Build Coastguard Worker			if f.path == file {
8022*333d2b36SAndroid Build Coastguard Worker				if f.isLink {
8023*333d2b36SAndroid Build Coastguard Worker					t.Errorf("%q is not a real file", file)
8024*333d2b36SAndroid Build Coastguard Worker				}
8025*333d2b36SAndroid Build Coastguard Worker				return
8026*333d2b36SAndroid Build Coastguard Worker			}
8027*333d2b36SAndroid Build Coastguard Worker		}
8028*333d2b36SAndroid Build Coastguard Worker		t.Errorf("%q is not found", file)
8029*333d2b36SAndroid Build Coastguard Worker	}
8030*333d2b36SAndroid Build Coastguard Worker
8031*333d2b36SAndroid Build Coastguard Worker	ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
8032*333d2b36SAndroid Build Coastguard Worker		for _, f := range files {
8033*333d2b36SAndroid Build Coastguard Worker			if f.path == file {
8034*333d2b36SAndroid Build Coastguard Worker				if !f.isLink {
8035*333d2b36SAndroid Build Coastguard Worker					t.Errorf("%q is not a symlink", file)
8036*333d2b36SAndroid Build Coastguard Worker				}
8037*333d2b36SAndroid Build Coastguard Worker				if f.src != target {
8038*333d2b36SAndroid Build Coastguard Worker					t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8039*333d2b36SAndroid Build Coastguard Worker				}
8040*333d2b36SAndroid Build Coastguard Worker				return
8041*333d2b36SAndroid Build Coastguard Worker			}
8042*333d2b36SAndroid Build Coastguard Worker		}
8043*333d2b36SAndroid Build Coastguard Worker		t.Errorf("%q is not found", file)
8044*333d2b36SAndroid Build Coastguard Worker	}
8045*333d2b36SAndroid Build Coastguard Worker
8046*333d2b36SAndroid Build Coastguard Worker	// For unbundled build, symlink shouldn't exist regardless of whether an APEX
8047*333d2b36SAndroid Build Coastguard Worker	// is updatable or not
8048*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, bp, withUnbundledBuild)
8049*333d2b36SAndroid Build Coastguard Worker	files := getFiles(t, ctx, "myapex", "android_common_myapex")
8050*333d2b36SAndroid Build Coastguard Worker	ensureRealfileExists(t, files, "javalib/myjar.jar")
8051*333d2b36SAndroid Build Coastguard Worker	ensureRealfileExists(t, files, "lib64/mylib.so")
8052*333d2b36SAndroid Build Coastguard Worker	ensureRealfileExists(t, files, "lib64/myotherlib.so")
8053*333d2b36SAndroid Build Coastguard Worker	ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
8054*333d2b36SAndroid Build Coastguard Worker
8055*333d2b36SAndroid Build Coastguard Worker	files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
8056*333d2b36SAndroid Build Coastguard Worker	ensureRealfileExists(t, files, "javalib/myjar.jar")
8057*333d2b36SAndroid Build Coastguard Worker	ensureRealfileExists(t, files, "lib64/mylib.so")
8058*333d2b36SAndroid Build Coastguard Worker	ensureRealfileExists(t, files, "lib64/myotherlib.so")
8059*333d2b36SAndroid Build Coastguard Worker	ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
8060*333d2b36SAndroid Build Coastguard Worker
8061*333d2b36SAndroid Build Coastguard Worker	// For bundled build, symlink to the system for the non-updatable APEXes only
8062*333d2b36SAndroid Build Coastguard Worker	ctx = testApex(t, bp)
8063*333d2b36SAndroid Build Coastguard Worker	files = getFiles(t, ctx, "myapex", "android_common_myapex")
8064*333d2b36SAndroid Build Coastguard Worker	ensureRealfileExists(t, files, "javalib/myjar.jar")
8065*333d2b36SAndroid Build Coastguard Worker	ensureRealfileExists(t, files, "lib64/mylib.so")
8066*333d2b36SAndroid Build Coastguard Worker	ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so")             // this is symlink
8067*333d2b36SAndroid Build Coastguard Worker	ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
8068*333d2b36SAndroid Build Coastguard Worker
8069*333d2b36SAndroid Build Coastguard Worker	files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
8070*333d2b36SAndroid Build Coastguard Worker	ensureRealfileExists(t, files, "javalib/myjar.jar")
8071*333d2b36SAndroid Build Coastguard Worker	ensureRealfileExists(t, files, "lib64/mylib.so")
8072*333d2b36SAndroid Build Coastguard Worker	ensureRealfileExists(t, files, "lib64/myotherlib.so")     // this is a real file
8073*333d2b36SAndroid Build Coastguard Worker	ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
8074*333d2b36SAndroid Build Coastguard Worker}
8075*333d2b36SAndroid Build Coastguard Worker
8076*333d2b36SAndroid Build Coastguard Workerfunc TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
8077*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
8078*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
8079*333d2b36SAndroid Build Coastguard Worker		apex {
8080*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
8081*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
8082*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib"],
8083*333d2b36SAndroid Build Coastguard Worker			updatable: false,
8084*333d2b36SAndroid Build Coastguard Worker		}
8085*333d2b36SAndroid Build Coastguard Worker
8086*333d2b36SAndroid Build Coastguard Worker		apex_key {
8087*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
8088*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
8089*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
8090*333d2b36SAndroid Build Coastguard Worker		}
8091*333d2b36SAndroid Build Coastguard Worker
8092*333d2b36SAndroid Build Coastguard Worker		cc_library_shared {
8093*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
8094*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
8095*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["myotherlib"],
8096*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
8097*333d2b36SAndroid Build Coastguard Worker			stl: "none",
8098*333d2b36SAndroid Build Coastguard Worker			apex_available: [
8099*333d2b36SAndroid Build Coastguard Worker				"myapex",
8100*333d2b36SAndroid Build Coastguard Worker				"//apex_available:platform",
8101*333d2b36SAndroid Build Coastguard Worker			],
8102*333d2b36SAndroid Build Coastguard Worker		}
8103*333d2b36SAndroid Build Coastguard Worker
8104*333d2b36SAndroid Build Coastguard Worker		cc_prebuilt_library_shared {
8105*333d2b36SAndroid Build Coastguard Worker			name: "myotherlib",
8106*333d2b36SAndroid Build Coastguard Worker			srcs: ["prebuilt.so"],
8107*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
8108*333d2b36SAndroid Build Coastguard Worker			stl: "none",
8109*333d2b36SAndroid Build Coastguard Worker			apex_available: [
8110*333d2b36SAndroid Build Coastguard Worker				"myapex",
8111*333d2b36SAndroid Build Coastguard Worker				"//apex_available:platform",
8112*333d2b36SAndroid Build Coastguard Worker			],
8113*333d2b36SAndroid Build Coastguard Worker		}
8114*333d2b36SAndroid Build Coastguard Worker	`)
8115*333d2b36SAndroid Build Coastguard Worker
8116*333d2b36SAndroid Build Coastguard Worker	apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
8117*333d2b36SAndroid Build Coastguard Worker	data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8118*333d2b36SAndroid Build Coastguard Worker	var builder strings.Builder
8119*333d2b36SAndroid Build Coastguard Worker	data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8120*333d2b36SAndroid Build Coastguard Worker	androidMk := builder.String()
8121*333d2b36SAndroid Build Coastguard Worker	// `myotherlib` is added to `myapex` as symlink
8122*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
8123*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8124*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8125*333d2b36SAndroid Build Coastguard Worker	// `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
8126*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
8127*333d2b36SAndroid Build Coastguard Worker}
8128*333d2b36SAndroid Build Coastguard Worker
8129*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithJniLibs(t *testing.T) {
8130*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
8131*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
8132*333d2b36SAndroid Build Coastguard Worker		apex {
8133*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
8134*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
8135*333d2b36SAndroid Build Coastguard Worker			binaries: ["mybin"],
8136*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["mylib", "mylib3", "libfoo.rust"],
8137*333d2b36SAndroid Build Coastguard Worker			updatable: false,
8138*333d2b36SAndroid Build Coastguard Worker		}
8139*333d2b36SAndroid Build Coastguard Worker
8140*333d2b36SAndroid Build Coastguard Worker		apex_key {
8141*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
8142*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
8143*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
8144*333d2b36SAndroid Build Coastguard Worker		}
8145*333d2b36SAndroid Build Coastguard Worker
8146*333d2b36SAndroid Build Coastguard Worker		cc_library {
8147*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
8148*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
8149*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["mylib2"],
8150*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
8151*333d2b36SAndroid Build Coastguard Worker			stl: "none",
8152*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
8153*333d2b36SAndroid Build Coastguard Worker		}
8154*333d2b36SAndroid Build Coastguard Worker
8155*333d2b36SAndroid Build Coastguard Worker		cc_library {
8156*333d2b36SAndroid Build Coastguard Worker			name: "mylib2",
8157*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
8158*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
8159*333d2b36SAndroid Build Coastguard Worker			stl: "none",
8160*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
8161*333d2b36SAndroid Build Coastguard Worker		}
8162*333d2b36SAndroid Build Coastguard Worker
8163*333d2b36SAndroid Build Coastguard Worker		// Used as both a JNI library and a regular shared library.
8164*333d2b36SAndroid Build Coastguard Worker		cc_library {
8165*333d2b36SAndroid Build Coastguard Worker			name: "mylib3",
8166*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
8167*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
8168*333d2b36SAndroid Build Coastguard Worker			stl: "none",
8169*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
8170*333d2b36SAndroid Build Coastguard Worker		}
8171*333d2b36SAndroid Build Coastguard Worker
8172*333d2b36SAndroid Build Coastguard Worker		cc_binary {
8173*333d2b36SAndroid Build Coastguard Worker			name: "mybin",
8174*333d2b36SAndroid Build Coastguard Worker			srcs: ["mybin.cpp"],
8175*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["mylib3"],
8176*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
8177*333d2b36SAndroid Build Coastguard Worker			stl: "none",
8178*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
8179*333d2b36SAndroid Build Coastguard Worker		}
8180*333d2b36SAndroid Build Coastguard Worker
8181*333d2b36SAndroid Build Coastguard Worker		rust_ffi_shared {
8182*333d2b36SAndroid Build Coastguard Worker			name: "libfoo.rust",
8183*333d2b36SAndroid Build Coastguard Worker			crate_name: "foo",
8184*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
8185*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libfoo.shared_from_rust"],
8186*333d2b36SAndroid Build Coastguard Worker			prefer_rlib: true,
8187*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
8188*333d2b36SAndroid Build Coastguard Worker		}
8189*333d2b36SAndroid Build Coastguard Worker
8190*333d2b36SAndroid Build Coastguard Worker		cc_library_shared {
8191*333d2b36SAndroid Build Coastguard Worker			name: "libfoo.shared_from_rust",
8192*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
8193*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
8194*333d2b36SAndroid Build Coastguard Worker			stl: "none",
8195*333d2b36SAndroid Build Coastguard Worker			stubs: {
8196*333d2b36SAndroid Build Coastguard Worker				versions: ["10", "11", "12"],
8197*333d2b36SAndroid Build Coastguard Worker			},
8198*333d2b36SAndroid Build Coastguard Worker		}
8199*333d2b36SAndroid Build Coastguard Worker
8200*333d2b36SAndroid Build Coastguard Worker	`)
8201*333d2b36SAndroid Build Coastguard Worker
8202*333d2b36SAndroid Build Coastguard Worker	rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
8203*333d2b36SAndroid Build Coastguard Worker	// Notice mylib2.so (transitive dep) is not added as a jni_lib
8204*333d2b36SAndroid Build Coastguard Worker	ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
8205*333d2b36SAndroid Build Coastguard Worker	ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
8206*333d2b36SAndroid Build Coastguard Worker		"bin/mybin",
8207*333d2b36SAndroid Build Coastguard Worker		"lib64/mylib.so",
8208*333d2b36SAndroid Build Coastguard Worker		"lib64/mylib2.so",
8209*333d2b36SAndroid Build Coastguard Worker		"lib64/mylib3.so",
8210*333d2b36SAndroid Build Coastguard Worker		"lib64/libfoo.rust.so",
8211*333d2b36SAndroid Build Coastguard Worker		"lib64/libc++.so", // auto-added to libfoo.rust by Soong
8212*333d2b36SAndroid Build Coastguard Worker		"lib64/liblog.so", // auto-added to libfoo.rust by Soong
8213*333d2b36SAndroid Build Coastguard Worker	})
8214*333d2b36SAndroid Build Coastguard Worker
8215*333d2b36SAndroid Build Coastguard Worker	// b/220397949
8216*333d2b36SAndroid Build Coastguard Worker	ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
8217*333d2b36SAndroid Build Coastguard Worker}
8218*333d2b36SAndroid Build Coastguard Worker
8219*333d2b36SAndroid Build Coastguard Workerfunc TestApexMutatorsDontRunIfDisabled(t *testing.T) {
8220*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
8221*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
8222*333d2b36SAndroid Build Coastguard Worker		apex {
8223*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
8224*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
8225*333d2b36SAndroid Build Coastguard Worker			updatable: false,
8226*333d2b36SAndroid Build Coastguard Worker		}
8227*333d2b36SAndroid Build Coastguard Worker		apex_key {
8228*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
8229*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
8230*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
8231*333d2b36SAndroid Build Coastguard Worker		}
8232*333d2b36SAndroid Build Coastguard Worker	`,
8233*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyConfig(func(config android.Config) {
8234*333d2b36SAndroid Build Coastguard Worker			delete(config.Targets, android.Android)
8235*333d2b36SAndroid Build Coastguard Worker			config.AndroidCommonTarget = android.Target{}
8236*333d2b36SAndroid Build Coastguard Worker		}),
8237*333d2b36SAndroid Build Coastguard Worker	)
8238*333d2b36SAndroid Build Coastguard Worker
8239*333d2b36SAndroid Build Coastguard Worker	if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8240*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected variants: %v, but got: %v", expected, got)
8241*333d2b36SAndroid Build Coastguard Worker	}
8242*333d2b36SAndroid Build Coastguard Worker}
8243*333d2b36SAndroid Build Coastguard Worker
8244*333d2b36SAndroid Build Coastguard Workerfunc TestAppBundle(t *testing.T) {
8245*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
8246*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
8247*333d2b36SAndroid Build Coastguard Worker		apex {
8248*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
8249*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
8250*333d2b36SAndroid Build Coastguard Worker			apps: ["AppFoo"],
8251*333d2b36SAndroid Build Coastguard Worker			updatable: false,
8252*333d2b36SAndroid Build Coastguard Worker		}
8253*333d2b36SAndroid Build Coastguard Worker
8254*333d2b36SAndroid Build Coastguard Worker		apex_key {
8255*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
8256*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
8257*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
8258*333d2b36SAndroid Build Coastguard Worker		}
8259*333d2b36SAndroid Build Coastguard Worker
8260*333d2b36SAndroid Build Coastguard Worker		android_app {
8261*333d2b36SAndroid Build Coastguard Worker			name: "AppFoo",
8262*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
8263*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
8264*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
8265*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
8266*333d2b36SAndroid Build Coastguard Worker		}
8267*333d2b36SAndroid Build Coastguard Worker		`, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
8268*333d2b36SAndroid Build Coastguard Worker
8269*333d2b36SAndroid Build Coastguard Worker	bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
8270*333d2b36SAndroid Build Coastguard Worker	content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
8271*333d2b36SAndroid Build Coastguard Worker
8272*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8273*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, content, `"apex_config":{"apex_embedded_apk_config":[{"package_name":"com.android.foo","path":"app/AppFoo@TEST.BUILD_ID/AppFoo.apk"}]}`)
8274*333d2b36SAndroid Build Coastguard Worker}
8275*333d2b36SAndroid Build Coastguard Worker
8276*333d2b36SAndroid Build Coastguard Workerfunc TestAppSetBundle(t *testing.T) {
8277*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
8278*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
8279*333d2b36SAndroid Build Coastguard Worker		apex {
8280*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
8281*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
8282*333d2b36SAndroid Build Coastguard Worker			apps: ["AppSet"],
8283*333d2b36SAndroid Build Coastguard Worker			updatable: false,
8284*333d2b36SAndroid Build Coastguard Worker		}
8285*333d2b36SAndroid Build Coastguard Worker
8286*333d2b36SAndroid Build Coastguard Worker		apex_key {
8287*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
8288*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
8289*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
8290*333d2b36SAndroid Build Coastguard Worker		}
8291*333d2b36SAndroid Build Coastguard Worker
8292*333d2b36SAndroid Build Coastguard Worker		android_app_set {
8293*333d2b36SAndroid Build Coastguard Worker			name: "AppSet",
8294*333d2b36SAndroid Build Coastguard Worker			set: "AppSet.apks",
8295*333d2b36SAndroid Build Coastguard Worker		}`)
8296*333d2b36SAndroid Build Coastguard Worker	mod := ctx.ModuleForTests("myapex", "android_common_myapex")
8297*333d2b36SAndroid Build Coastguard Worker	bundleConfigRule := mod.Output("bundle_config.json")
8298*333d2b36SAndroid Build Coastguard Worker	content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
8299*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8300*333d2b36SAndroid Build Coastguard Worker	s := mod.Rule("apexRule").Args["copy_commands"]
8301*333d2b36SAndroid Build Coastguard Worker	copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
8302*333d2b36SAndroid Build Coastguard Worker	if len(copyCmds) != 4 {
8303*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
8304*333d2b36SAndroid Build Coastguard Worker	}
8305*333d2b36SAndroid Build Coastguard Worker	ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8306*333d2b36SAndroid Build Coastguard Worker	ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
8307*333d2b36SAndroid Build Coastguard Worker	ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8308*333d2b36SAndroid Build Coastguard Worker	ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
8309*333d2b36SAndroid Build Coastguard Worker
8310*333d2b36SAndroid Build Coastguard Worker	// Ensure that canned_fs_config has an entry for the app set zip file
8311*333d2b36SAndroid Build Coastguard Worker	generateFsRule := mod.Rule("generateFsConfig")
8312*333d2b36SAndroid Build Coastguard Worker	cmd := generateFsRule.RuleParams.Command
8313*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, cmd, "AppSet.zip")
8314*333d2b36SAndroid Build Coastguard Worker}
8315*333d2b36SAndroid Build Coastguard Worker
8316*333d2b36SAndroid Build Coastguard Workerfunc TestAppSetBundlePrebuilt(t *testing.T) {
8317*333d2b36SAndroid Build Coastguard Worker	bp := `
8318*333d2b36SAndroid Build Coastguard Worker		apex_set {
8319*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
8320*333d2b36SAndroid Build Coastguard Worker			filename: "foo_v2.apex",
8321*333d2b36SAndroid Build Coastguard Worker			sanitized: {
8322*333d2b36SAndroid Build Coastguard Worker				none: { set: "myapex.apks", },
8323*333d2b36SAndroid Build Coastguard Worker				hwaddress: { set: "myapex.hwasan.apks", },
8324*333d2b36SAndroid Build Coastguard Worker			},
8325*333d2b36SAndroid Build Coastguard Worker		}
8326*333d2b36SAndroid Build Coastguard Worker	`
8327*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
8328*333d2b36SAndroid Build Coastguard Worker
8329*333d2b36SAndroid Build Coastguard Worker	// Check that the extractor produces the correct output file from the correct input file.
8330*333d2b36SAndroid Build Coastguard Worker	extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
8331*333d2b36SAndroid Build Coastguard Worker
8332*333d2b36SAndroid Build Coastguard Worker	m := ctx.ModuleForTests("myapex", "android_common_myapex")
8333*333d2b36SAndroid Build Coastguard Worker	extractedApex := m.Output(extractorOutput)
8334*333d2b36SAndroid Build Coastguard Worker
8335*333d2b36SAndroid Build Coastguard Worker	android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8336*333d2b36SAndroid Build Coastguard Worker
8337*333d2b36SAndroid Build Coastguard Worker	// Ditto for the apex.
8338*333d2b36SAndroid Build Coastguard Worker	m = ctx.ModuleForTests("myapex", "android_common_myapex")
8339*333d2b36SAndroid Build Coastguard Worker	copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
8340*333d2b36SAndroid Build Coastguard Worker
8341*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
8342*333d2b36SAndroid Build Coastguard Worker}
8343*333d2b36SAndroid Build Coastguard Worker
8344*333d2b36SAndroid Build Coastguard Workerfunc TestApexSetApksModuleAssignment(t *testing.T) {
8345*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
8346*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
8347*333d2b36SAndroid Build Coastguard Worker		apex_set {
8348*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
8349*333d2b36SAndroid Build Coastguard Worker			set: ":myapex_apks_file",
8350*333d2b36SAndroid Build Coastguard Worker		}
8351*333d2b36SAndroid Build Coastguard Worker
8352*333d2b36SAndroid Build Coastguard Worker		filegroup {
8353*333d2b36SAndroid Build Coastguard Worker			name: "myapex_apks_file",
8354*333d2b36SAndroid Build Coastguard Worker			srcs: ["myapex.apks"],
8355*333d2b36SAndroid Build Coastguard Worker		}
8356*333d2b36SAndroid Build Coastguard Worker	`)
8357*333d2b36SAndroid Build Coastguard Worker
8358*333d2b36SAndroid Build Coastguard Worker	m := ctx.ModuleForTests("myapex", "android_common_myapex")
8359*333d2b36SAndroid Build Coastguard Worker
8360*333d2b36SAndroid Build Coastguard Worker	// Check that the extractor produces the correct apks file from the input module
8361*333d2b36SAndroid Build Coastguard Worker	extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
8362*333d2b36SAndroid Build Coastguard Worker	extractedApex := m.Output(extractorOutput)
8363*333d2b36SAndroid Build Coastguard Worker
8364*333d2b36SAndroid Build Coastguard Worker	android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8365*333d2b36SAndroid Build Coastguard Worker}
8366*333d2b36SAndroid Build Coastguard Worker
8367*333d2b36SAndroid Build Coastguard Workerfunc testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
8368*333d2b36SAndroid Build Coastguard Worker	t.Helper()
8369*333d2b36SAndroid Build Coastguard Worker
8370*333d2b36SAndroid Build Coastguard Worker	fs := android.MockFS{
8371*333d2b36SAndroid Build Coastguard Worker		"a.java":              nil,
8372*333d2b36SAndroid Build Coastguard Worker		"a.jar":               nil,
8373*333d2b36SAndroid Build Coastguard Worker		"apex_manifest.json":  nil,
8374*333d2b36SAndroid Build Coastguard Worker		"AndroidManifest.xml": nil,
8375*333d2b36SAndroid Build Coastguard Worker		"system/sepolicy/apex/myapex-file_contexts":                  nil,
8376*333d2b36SAndroid Build Coastguard Worker		"system/sepolicy/apex/some-updatable-apex-file_contexts":     nil,
8377*333d2b36SAndroid Build Coastguard Worker		"system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8378*333d2b36SAndroid Build Coastguard Worker		"system/sepolicy/apex/com.android.art.debug-file_contexts":   nil,
8379*333d2b36SAndroid Build Coastguard Worker		"framework/aidl/a.aidl":                                      nil,
8380*333d2b36SAndroid Build Coastguard Worker	}
8381*333d2b36SAndroid Build Coastguard Worker
8382*333d2b36SAndroid Build Coastguard Worker	errorHandler := android.FixtureExpectsNoErrors
8383*333d2b36SAndroid Build Coastguard Worker	if errmsg != "" {
8384*333d2b36SAndroid Build Coastguard Worker		errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
8385*333d2b36SAndroid Build Coastguard Worker	}
8386*333d2b36SAndroid Build Coastguard Worker
8387*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
8388*333d2b36SAndroid Build Coastguard Worker		cc.PrepareForTestWithCcDefaultModules,
8389*333d2b36SAndroid Build Coastguard Worker		java.PrepareForTestWithHiddenApiBuildComponents,
8390*333d2b36SAndroid Build Coastguard Worker		java.PrepareForTestWithDexpreopt,
8391*333d2b36SAndroid Build Coastguard Worker		java.PrepareForTestWithJavaSdkLibraryFiles,
8392*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithApexBuildComponents,
8393*333d2b36SAndroid Build Coastguard Worker		preparer,
8394*333d2b36SAndroid Build Coastguard Worker		fs.AddToFixture(),
8395*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyMockFS(func(fs android.MockFS) {
8396*333d2b36SAndroid Build Coastguard Worker			if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8397*333d2b36SAndroid Build Coastguard Worker				insert := ""
8398*333d2b36SAndroid Build Coastguard Worker				for _, fragment := range fragments {
8399*333d2b36SAndroid Build Coastguard Worker					insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8400*333d2b36SAndroid Build Coastguard Worker				}
8401*333d2b36SAndroid Build Coastguard Worker				fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8402*333d2b36SAndroid Build Coastguard Worker					platform_bootclasspath {
8403*333d2b36SAndroid Build Coastguard Worker						name: "platform-bootclasspath",
8404*333d2b36SAndroid Build Coastguard Worker						fragments: [
8405*333d2b36SAndroid Build Coastguard Worker							{apex: "com.android.art", module: "art-bootclasspath-fragment"},
8406*333d2b36SAndroid Build Coastguard Worker  						%s
8407*333d2b36SAndroid Build Coastguard Worker						],
8408*333d2b36SAndroid Build Coastguard Worker					}
8409*333d2b36SAndroid Build Coastguard Worker				`, insert))
8410*333d2b36SAndroid Build Coastguard Worker			}
8411*333d2b36SAndroid Build Coastguard Worker		}),
8412*333d2b36SAndroid Build Coastguard Worker		// Dexpreopt for boot jars requires the ART boot image profile.
8413*333d2b36SAndroid Build Coastguard Worker		java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8414*333d2b36SAndroid Build Coastguard Worker		dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
8415*333d2b36SAndroid Build Coastguard Worker		dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
8416*333d2b36SAndroid Build Coastguard Worker	).
8417*333d2b36SAndroid Build Coastguard Worker		ExtendWithErrorHandler(errorHandler).
8418*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, bp)
8419*333d2b36SAndroid Build Coastguard Worker
8420*333d2b36SAndroid Build Coastguard Worker	return result.TestContext
8421*333d2b36SAndroid Build Coastguard Worker}
8422*333d2b36SAndroid Build Coastguard Worker
8423*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8424*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
8425*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8426*333d2b36SAndroid Build Coastguard Worker		apex {
8427*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
8428*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
8429*333d2b36SAndroid Build Coastguard Worker			updatable: true,
8430*333d2b36SAndroid Build Coastguard Worker		}
8431*333d2b36SAndroid Build Coastguard Worker
8432*333d2b36SAndroid Build Coastguard Worker		apex_key {
8433*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
8434*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
8435*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
8436*333d2b36SAndroid Build Coastguard Worker		}
8437*333d2b36SAndroid Build Coastguard Worker	`)
8438*333d2b36SAndroid Build Coastguard Worker}
8439*333d2b36SAndroid Build Coastguard Worker
8440*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8441*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
8442*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8443*333d2b36SAndroid Build Coastguard Worker		apex {
8444*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
8445*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
8446*333d2b36SAndroid Build Coastguard Worker		}
8447*333d2b36SAndroid Build Coastguard Worker
8448*333d2b36SAndroid Build Coastguard Worker		apex_key {
8449*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
8450*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
8451*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
8452*333d2b36SAndroid Build Coastguard Worker		}
8453*333d2b36SAndroid Build Coastguard Worker	`)
8454*333d2b36SAndroid Build Coastguard Worker}
8455*333d2b36SAndroid Build Coastguard Worker
8456*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8457*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
8458*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8459*333d2b36SAndroid Build Coastguard Worker		apex {
8460*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
8461*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
8462*333d2b36SAndroid Build Coastguard Worker			systemserverclasspath_fragments: [
8463*333d2b36SAndroid Build Coastguard Worker				"mysystemserverclasspathfragment",
8464*333d2b36SAndroid Build Coastguard Worker			],
8465*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
8466*333d2b36SAndroid Build Coastguard Worker			updatable: true,
8467*333d2b36SAndroid Build Coastguard Worker		}
8468*333d2b36SAndroid Build Coastguard Worker
8469*333d2b36SAndroid Build Coastguard Worker		apex_key {
8470*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
8471*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
8472*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
8473*333d2b36SAndroid Build Coastguard Worker		}
8474*333d2b36SAndroid Build Coastguard Worker
8475*333d2b36SAndroid Build Coastguard Worker		java_library {
8476*333d2b36SAndroid Build Coastguard Worker			name: "foo",
8477*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
8478*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
8479*333d2b36SAndroid Build Coastguard Worker			installable: true,
8480*333d2b36SAndroid Build Coastguard Worker			apex_available: [
8481*333d2b36SAndroid Build Coastguard Worker				"myapex",
8482*333d2b36SAndroid Build Coastguard Worker			],
8483*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
8484*333d2b36SAndroid Build Coastguard Worker		}
8485*333d2b36SAndroid Build Coastguard Worker
8486*333d2b36SAndroid Build Coastguard Worker		systemserverclasspath_fragment {
8487*333d2b36SAndroid Build Coastguard Worker			name: "mysystemserverclasspathfragment",
8488*333d2b36SAndroid Build Coastguard Worker			generate_classpaths_proto: false,
8489*333d2b36SAndroid Build Coastguard Worker			contents: [
8490*333d2b36SAndroid Build Coastguard Worker				"foo",
8491*333d2b36SAndroid Build Coastguard Worker			],
8492*333d2b36SAndroid Build Coastguard Worker			apex_available: [
8493*333d2b36SAndroid Build Coastguard Worker				"myapex",
8494*333d2b36SAndroid Build Coastguard Worker			],
8495*333d2b36SAndroid Build Coastguard Worker		}
8496*333d2b36SAndroid Build Coastguard Worker	`,
8497*333d2b36SAndroid Build Coastguard Worker		dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8498*333d2b36SAndroid Build Coastguard Worker	)
8499*333d2b36SAndroid Build Coastguard Worker}
8500*333d2b36SAndroid Build Coastguard Worker
8501*333d2b36SAndroid Build Coastguard Workerfunc TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
8502*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
8503*333d2b36SAndroid Build Coastguard Worker	preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
8504*333d2b36SAndroid Build Coastguard Worker	t.Run("prebuilt no source", func(t *testing.T) {
8505*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
8506*333d2b36SAndroid Build Coastguard Worker		fragment := java.ApexVariantReference{
8507*333d2b36SAndroid Build Coastguard Worker			Apex:   proptools.StringPtr("myapex"),
8508*333d2b36SAndroid Build Coastguard Worker			Module: proptools.StringPtr("my-bootclasspath-fragment"),
8509*333d2b36SAndroid Build Coastguard Worker		}
8510*333d2b36SAndroid Build Coastguard Worker
8511*333d2b36SAndroid Build Coastguard Worker		testDexpreoptWithApexes(t, `
8512*333d2b36SAndroid Build Coastguard Worker			prebuilt_apex {
8513*333d2b36SAndroid Build Coastguard Worker				name: "myapex" ,
8514*333d2b36SAndroid Build Coastguard Worker				arch: {
8515*333d2b36SAndroid Build Coastguard Worker					arm64: {
8516*333d2b36SAndroid Build Coastguard Worker						src: "myapex-arm64.apex",
8517*333d2b36SAndroid Build Coastguard Worker					},
8518*333d2b36SAndroid Build Coastguard Worker					arm: {
8519*333d2b36SAndroid Build Coastguard Worker						src: "myapex-arm.apex",
8520*333d2b36SAndroid Build Coastguard Worker					},
8521*333d2b36SAndroid Build Coastguard Worker				},
8522*333d2b36SAndroid Build Coastguard Worker				exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8523*333d2b36SAndroid Build Coastguard Worker			}
8524*333d2b36SAndroid Build Coastguard Worker
8525*333d2b36SAndroid Build Coastguard Worker			prebuilt_bootclasspath_fragment {
8526*333d2b36SAndroid Build Coastguard Worker				name: "my-bootclasspath-fragment",
8527*333d2b36SAndroid Build Coastguard Worker				contents: ["libfoo"],
8528*333d2b36SAndroid Build Coastguard Worker				apex_available: ["myapex"],
8529*333d2b36SAndroid Build Coastguard Worker				hidden_api: {
8530*333d2b36SAndroid Build Coastguard Worker					annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8531*333d2b36SAndroid Build Coastguard Worker					metadata: "my-bootclasspath-fragment/metadata.csv",
8532*333d2b36SAndroid Build Coastguard Worker					index: "my-bootclasspath-fragment/index.csv",
8533*333d2b36SAndroid Build Coastguard Worker					signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8534*333d2b36SAndroid Build Coastguard Worker					filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8535*333d2b36SAndroid Build Coastguard Worker					filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
8536*333d2b36SAndroid Build Coastguard Worker				},
8537*333d2b36SAndroid Build Coastguard Worker			}
8538*333d2b36SAndroid Build Coastguard Worker
8539*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
8540*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
8541*333d2b36SAndroid Build Coastguard Worker			prefer: true,
8542*333d2b36SAndroid Build Coastguard Worker			public: {
8543*333d2b36SAndroid Build Coastguard Worker				jars: ["libfoo.jar"],
8544*333d2b36SAndroid Build Coastguard Worker			},
8545*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
8546*333d2b36SAndroid Build Coastguard Worker			shared_library: false,
8547*333d2b36SAndroid Build Coastguard Worker			permitted_packages: ["libfoo"],
8548*333d2b36SAndroid Build Coastguard Worker		}
8549*333d2b36SAndroid Build Coastguard Worker		`, "", preparer, fragment)
8550*333d2b36SAndroid Build Coastguard Worker	})
8551*333d2b36SAndroid Build Coastguard Worker}
8552*333d2b36SAndroid Build Coastguard Worker
8553*333d2b36SAndroid Build Coastguard Workerfunc testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
8554*333d2b36SAndroid Build Coastguard Worker	t.Helper()
8555*333d2b36SAndroid Build Coastguard Worker	bp += `
8556*333d2b36SAndroid Build Coastguard Worker	apex_key {
8557*333d2b36SAndroid Build Coastguard Worker		name: "myapex.key",
8558*333d2b36SAndroid Build Coastguard Worker		public_key: "testkey.avbpubkey",
8559*333d2b36SAndroid Build Coastguard Worker		private_key: "testkey.pem",
8560*333d2b36SAndroid Build Coastguard Worker	}`
8561*333d2b36SAndroid Build Coastguard Worker	fs := android.MockFS{
8562*333d2b36SAndroid Build Coastguard Worker		"lib1/src/A.java": nil,
8563*333d2b36SAndroid Build Coastguard Worker		"lib2/src/B.java": nil,
8564*333d2b36SAndroid Build Coastguard Worker		"system/sepolicy/apex/myapex-file_contexts": nil,
8565*333d2b36SAndroid Build Coastguard Worker	}
8566*333d2b36SAndroid Build Coastguard Worker
8567*333d2b36SAndroid Build Coastguard Worker	errorHandler := android.FixtureExpectsNoErrors
8568*333d2b36SAndroid Build Coastguard Worker	if errmsg != "" {
8569*333d2b36SAndroid Build Coastguard Worker		errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
8570*333d2b36SAndroid Build Coastguard Worker	}
8571*333d2b36SAndroid Build Coastguard Worker
8572*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
8573*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithAndroidBuildComponents,
8574*333d2b36SAndroid Build Coastguard Worker		java.PrepareForTestWithJavaBuildComponents,
8575*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithApexBuildComponents,
8576*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithNeverallowRules(rules),
8577*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8578*333d2b36SAndroid Build Coastguard Worker			apexBootJars := make([]string, 0, len(bootJars))
8579*333d2b36SAndroid Build Coastguard Worker			for _, apexBootJar := range bootJars {
8580*333d2b36SAndroid Build Coastguard Worker				apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
8581*333d2b36SAndroid Build Coastguard Worker			}
8582*333d2b36SAndroid Build Coastguard Worker			variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
8583*333d2b36SAndroid Build Coastguard Worker		}),
8584*333d2b36SAndroid Build Coastguard Worker		fs.AddToFixture(),
8585*333d2b36SAndroid Build Coastguard Worker	).
8586*333d2b36SAndroid Build Coastguard Worker		ExtendWithErrorHandler(errorHandler).
8587*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, bp)
8588*333d2b36SAndroid Build Coastguard Worker}
8589*333d2b36SAndroid Build Coastguard Worker
8590*333d2b36SAndroid Build Coastguard Workerfunc TestApexPermittedPackagesRules(t *testing.T) {
8591*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
8592*333d2b36SAndroid Build Coastguard Worker	testcases := []struct {
8593*333d2b36SAndroid Build Coastguard Worker		name                 string
8594*333d2b36SAndroid Build Coastguard Worker		expectedError        string
8595*333d2b36SAndroid Build Coastguard Worker		bp                   string
8596*333d2b36SAndroid Build Coastguard Worker		bootJars             []string
8597*333d2b36SAndroid Build Coastguard Worker		bcpPermittedPackages map[string][]string
8598*333d2b36SAndroid Build Coastguard Worker	}{
8599*333d2b36SAndroid Build Coastguard Worker
8600*333d2b36SAndroid Build Coastguard Worker		{
8601*333d2b36SAndroid Build Coastguard Worker			name:          "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8602*333d2b36SAndroid Build Coastguard Worker			expectedError: "",
8603*333d2b36SAndroid Build Coastguard Worker			bp: `
8604*333d2b36SAndroid Build Coastguard Worker				java_library {
8605*333d2b36SAndroid Build Coastguard Worker					name: "bcp_lib1",
8606*333d2b36SAndroid Build Coastguard Worker					srcs: ["lib1/src/*.java"],
8607*333d2b36SAndroid Build Coastguard Worker					permitted_packages: ["foo.bar"],
8608*333d2b36SAndroid Build Coastguard Worker					apex_available: ["myapex"],
8609*333d2b36SAndroid Build Coastguard Worker					sdk_version: "none",
8610*333d2b36SAndroid Build Coastguard Worker					system_modules: "none",
8611*333d2b36SAndroid Build Coastguard Worker					compile_dex: true,
8612*333d2b36SAndroid Build Coastguard Worker				}
8613*333d2b36SAndroid Build Coastguard Worker				java_library {
8614*333d2b36SAndroid Build Coastguard Worker					name: "nonbcp_lib2",
8615*333d2b36SAndroid Build Coastguard Worker					srcs: ["lib2/src/*.java"],
8616*333d2b36SAndroid Build Coastguard Worker					apex_available: ["myapex"],
8617*333d2b36SAndroid Build Coastguard Worker					permitted_packages: ["a.b"],
8618*333d2b36SAndroid Build Coastguard Worker					sdk_version: "none",
8619*333d2b36SAndroid Build Coastguard Worker					system_modules: "none",
8620*333d2b36SAndroid Build Coastguard Worker					compile_dex: true,
8621*333d2b36SAndroid Build Coastguard Worker				}
8622*333d2b36SAndroid Build Coastguard Worker				apex {
8623*333d2b36SAndroid Build Coastguard Worker					name: "myapex",
8624*333d2b36SAndroid Build Coastguard Worker					key: "myapex.key",
8625*333d2b36SAndroid Build Coastguard Worker					java_libs: ["bcp_lib1", "nonbcp_lib2"],
8626*333d2b36SAndroid Build Coastguard Worker					updatable: false,
8627*333d2b36SAndroid Build Coastguard Worker				}`,
8628*333d2b36SAndroid Build Coastguard Worker			bootJars: []string{"bcp_lib1"},
8629*333d2b36SAndroid Build Coastguard Worker			bcpPermittedPackages: map[string][]string{
8630*333d2b36SAndroid Build Coastguard Worker				"bcp_lib1": []string{
8631*333d2b36SAndroid Build Coastguard Worker					"foo.bar",
8632*333d2b36SAndroid Build Coastguard Worker				},
8633*333d2b36SAndroid Build Coastguard Worker			},
8634*333d2b36SAndroid Build Coastguard Worker		},
8635*333d2b36SAndroid Build Coastguard Worker		{
8636*333d2b36SAndroid Build Coastguard Worker			name:          "Bootclasspath apex jar not satisfying allowed module packages.",
8637*333d2b36SAndroid Build Coastguard Worker			expectedError: `(?s)module "bcp_lib2" .* which is restricted because bcp_lib2 bootjar may only use these package prefixes: foo.bar. Please consider the following alternatives:\n    1. If the offending code is from a statically linked library, consider removing that dependency and using an alternative already in the bootclasspath, or perhaps a shared library.    2. Move the offending code into an allowed package.\n    3. Jarjar the offending code. Please be mindful of the potential system health implications of bundling that code, particularly if the offending jar is part of the bootclasspath.`,
8638*333d2b36SAndroid Build Coastguard Worker			bp: `
8639*333d2b36SAndroid Build Coastguard Worker				java_library {
8640*333d2b36SAndroid Build Coastguard Worker					name: "bcp_lib1",
8641*333d2b36SAndroid Build Coastguard Worker					srcs: ["lib1/src/*.java"],
8642*333d2b36SAndroid Build Coastguard Worker					apex_available: ["myapex"],
8643*333d2b36SAndroid Build Coastguard Worker					permitted_packages: ["foo.bar"],
8644*333d2b36SAndroid Build Coastguard Worker					sdk_version: "none",
8645*333d2b36SAndroid Build Coastguard Worker					system_modules: "none",
8646*333d2b36SAndroid Build Coastguard Worker					compile_dex: true,
8647*333d2b36SAndroid Build Coastguard Worker				}
8648*333d2b36SAndroid Build Coastguard Worker				java_library {
8649*333d2b36SAndroid Build Coastguard Worker					name: "bcp_lib2",
8650*333d2b36SAndroid Build Coastguard Worker					srcs: ["lib2/src/*.java"],
8651*333d2b36SAndroid Build Coastguard Worker					apex_available: ["myapex"],
8652*333d2b36SAndroid Build Coastguard Worker					permitted_packages: ["foo.bar", "bar.baz"],
8653*333d2b36SAndroid Build Coastguard Worker					sdk_version: "none",
8654*333d2b36SAndroid Build Coastguard Worker					system_modules: "none",
8655*333d2b36SAndroid Build Coastguard Worker					compile_dex: true,
8656*333d2b36SAndroid Build Coastguard Worker				}
8657*333d2b36SAndroid Build Coastguard Worker				apex {
8658*333d2b36SAndroid Build Coastguard Worker					name: "myapex",
8659*333d2b36SAndroid Build Coastguard Worker					key: "myapex.key",
8660*333d2b36SAndroid Build Coastguard Worker					java_libs: ["bcp_lib1", "bcp_lib2"],
8661*333d2b36SAndroid Build Coastguard Worker					updatable: false,
8662*333d2b36SAndroid Build Coastguard Worker				}
8663*333d2b36SAndroid Build Coastguard Worker			`,
8664*333d2b36SAndroid Build Coastguard Worker			bootJars: []string{"bcp_lib1", "bcp_lib2"},
8665*333d2b36SAndroid Build Coastguard Worker			bcpPermittedPackages: map[string][]string{
8666*333d2b36SAndroid Build Coastguard Worker				"bcp_lib1": []string{
8667*333d2b36SAndroid Build Coastguard Worker					"foo.bar",
8668*333d2b36SAndroid Build Coastguard Worker				},
8669*333d2b36SAndroid Build Coastguard Worker				"bcp_lib2": []string{
8670*333d2b36SAndroid Build Coastguard Worker					"foo.bar",
8671*333d2b36SAndroid Build Coastguard Worker				},
8672*333d2b36SAndroid Build Coastguard Worker			},
8673*333d2b36SAndroid Build Coastguard Worker		},
8674*333d2b36SAndroid Build Coastguard Worker		{
8675*333d2b36SAndroid Build Coastguard Worker			name:          "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8676*333d2b36SAndroid Build Coastguard Worker			expectedError: "",
8677*333d2b36SAndroid Build Coastguard Worker			bp: `
8678*333d2b36SAndroid Build Coastguard Worker				java_library {
8679*333d2b36SAndroid Build Coastguard Worker					name: "bcp_lib_restricted",
8680*333d2b36SAndroid Build Coastguard Worker					srcs: ["lib1/src/*.java"],
8681*333d2b36SAndroid Build Coastguard Worker					apex_available: ["myapex"],
8682*333d2b36SAndroid Build Coastguard Worker					permitted_packages: ["foo.bar"],
8683*333d2b36SAndroid Build Coastguard Worker					sdk_version: "none",
8684*333d2b36SAndroid Build Coastguard Worker					min_sdk_version: "29",
8685*333d2b36SAndroid Build Coastguard Worker					system_modules: "none",
8686*333d2b36SAndroid Build Coastguard Worker					compile_dex: true,
8687*333d2b36SAndroid Build Coastguard Worker				}
8688*333d2b36SAndroid Build Coastguard Worker				java_library {
8689*333d2b36SAndroid Build Coastguard Worker					name: "bcp_lib_unrestricted",
8690*333d2b36SAndroid Build Coastguard Worker					srcs: ["lib2/src/*.java"],
8691*333d2b36SAndroid Build Coastguard Worker					apex_available: ["myapex"],
8692*333d2b36SAndroid Build Coastguard Worker					permitted_packages: ["foo.bar", "bar.baz"],
8693*333d2b36SAndroid Build Coastguard Worker					sdk_version: "none",
8694*333d2b36SAndroid Build Coastguard Worker					min_sdk_version: "29",
8695*333d2b36SAndroid Build Coastguard Worker					system_modules: "none",
8696*333d2b36SAndroid Build Coastguard Worker					compile_dex: true,
8697*333d2b36SAndroid Build Coastguard Worker				}
8698*333d2b36SAndroid Build Coastguard Worker				apex {
8699*333d2b36SAndroid Build Coastguard Worker					name: "myapex",
8700*333d2b36SAndroid Build Coastguard Worker					key: "myapex.key",
8701*333d2b36SAndroid Build Coastguard Worker					java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8702*333d2b36SAndroid Build Coastguard Worker					updatable: true,
8703*333d2b36SAndroid Build Coastguard Worker					min_sdk_version: "29",
8704*333d2b36SAndroid Build Coastguard Worker				}
8705*333d2b36SAndroid Build Coastguard Worker			`,
8706*333d2b36SAndroid Build Coastguard Worker			bootJars: []string{"bcp_lib1", "bcp_lib2"},
8707*333d2b36SAndroid Build Coastguard Worker			bcpPermittedPackages: map[string][]string{
8708*333d2b36SAndroid Build Coastguard Worker				"bcp_lib1_non_updateable": []string{
8709*333d2b36SAndroid Build Coastguard Worker					"foo.bar",
8710*333d2b36SAndroid Build Coastguard Worker				},
8711*333d2b36SAndroid Build Coastguard Worker				// bcp_lib2_updateable has no entry here since updateable bcp can contain new packages - tracking via an allowlist is not necessary
8712*333d2b36SAndroid Build Coastguard Worker			},
8713*333d2b36SAndroid Build Coastguard Worker		},
8714*333d2b36SAndroid Build Coastguard Worker	}
8715*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testcases {
8716*333d2b36SAndroid Build Coastguard Worker		t.Run(tc.name, func(t *testing.T) {
8717*333d2b36SAndroid Build Coastguard Worker			t.Parallel()
8718*333d2b36SAndroid Build Coastguard Worker			rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8719*333d2b36SAndroid Build Coastguard Worker			testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
8720*333d2b36SAndroid Build Coastguard Worker		})
8721*333d2b36SAndroid Build Coastguard Worker	}
8722*333d2b36SAndroid Build Coastguard Worker}
8723*333d2b36SAndroid Build Coastguard Worker
8724*333d2b36SAndroid Build Coastguard Worker// TODO(jungjw): Move this to proptools
8725*333d2b36SAndroid Build Coastguard Workerfunc intPtr(i int) *int {
8726*333d2b36SAndroid Build Coastguard Worker	return &i
8727*333d2b36SAndroid Build Coastguard Worker}
8728*333d2b36SAndroid Build Coastguard Worker
8729*333d2b36SAndroid Build Coastguard Workerfunc TestApexSet(t *testing.T) {
8730*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
8731*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
8732*333d2b36SAndroid Build Coastguard Worker		apex_set {
8733*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
8734*333d2b36SAndroid Build Coastguard Worker			set: "myapex.apks",
8735*333d2b36SAndroid Build Coastguard Worker			filename: "foo_v2.apex",
8736*333d2b36SAndroid Build Coastguard Worker			overrides: ["foo"],
8737*333d2b36SAndroid Build Coastguard Worker		}
8738*333d2b36SAndroid Build Coastguard Worker	`,
8739*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8740*333d2b36SAndroid Build Coastguard Worker			variables.Platform_sdk_version = intPtr(30)
8741*333d2b36SAndroid Build Coastguard Worker		}),
8742*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyConfig(func(config android.Config) {
8743*333d2b36SAndroid Build Coastguard Worker			config.Targets[android.Android] = []android.Target{
8744*333d2b36SAndroid Build Coastguard Worker				{Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8745*333d2b36SAndroid Build Coastguard Worker				{Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8746*333d2b36SAndroid Build Coastguard Worker			}
8747*333d2b36SAndroid Build Coastguard Worker		}),
8748*333d2b36SAndroid Build Coastguard Worker	)
8749*333d2b36SAndroid Build Coastguard Worker
8750*333d2b36SAndroid Build Coastguard Worker	m := ctx.ModuleForTests("myapex", "android_common_myapex")
8751*333d2b36SAndroid Build Coastguard Worker
8752*333d2b36SAndroid Build Coastguard Worker	// Check extract_apks tool parameters.
8753*333d2b36SAndroid Build Coastguard Worker	extractedApex := m.Output("extracted/myapex.apks")
8754*333d2b36SAndroid Build Coastguard Worker	actual := extractedApex.Args["abis"]
8755*333d2b36SAndroid Build Coastguard Worker	expected := "ARMEABI_V7A,ARM64_V8A"
8756*333d2b36SAndroid Build Coastguard Worker	if actual != expected {
8757*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8758*333d2b36SAndroid Build Coastguard Worker	}
8759*333d2b36SAndroid Build Coastguard Worker	actual = extractedApex.Args["sdk-version"]
8760*333d2b36SAndroid Build Coastguard Worker	expected = "30"
8761*333d2b36SAndroid Build Coastguard Worker	if actual != expected {
8762*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8763*333d2b36SAndroid Build Coastguard Worker	}
8764*333d2b36SAndroid Build Coastguard Worker
8765*333d2b36SAndroid Build Coastguard Worker	m = ctx.ModuleForTests("myapex", "android_common_myapex")
8766*333d2b36SAndroid Build Coastguard Worker	a := m.Module().(*ApexSet)
8767*333d2b36SAndroid Build Coastguard Worker	expectedOverrides := []string{"foo"}
8768*333d2b36SAndroid Build Coastguard Worker	actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
8769*333d2b36SAndroid Build Coastguard Worker	if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8770*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8771*333d2b36SAndroid Build Coastguard Worker	}
8772*333d2b36SAndroid Build Coastguard Worker}
8773*333d2b36SAndroid Build Coastguard Worker
8774*333d2b36SAndroid Build Coastguard Workerfunc TestApexSet_NativeBridge(t *testing.T) {
8775*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
8776*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
8777*333d2b36SAndroid Build Coastguard Worker		apex_set {
8778*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
8779*333d2b36SAndroid Build Coastguard Worker			set: "myapex.apks",
8780*333d2b36SAndroid Build Coastguard Worker			filename: "foo_v2.apex",
8781*333d2b36SAndroid Build Coastguard Worker			overrides: ["foo"],
8782*333d2b36SAndroid Build Coastguard Worker		}
8783*333d2b36SAndroid Build Coastguard Worker	`,
8784*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyConfig(func(config android.Config) {
8785*333d2b36SAndroid Build Coastguard Worker			config.Targets[android.Android] = []android.Target{
8786*333d2b36SAndroid Build Coastguard Worker				{Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8787*333d2b36SAndroid Build Coastguard Worker				{Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8788*333d2b36SAndroid Build Coastguard Worker			}
8789*333d2b36SAndroid Build Coastguard Worker		}),
8790*333d2b36SAndroid Build Coastguard Worker	)
8791*333d2b36SAndroid Build Coastguard Worker
8792*333d2b36SAndroid Build Coastguard Worker	m := ctx.ModuleForTests("myapex", "android_common_myapex")
8793*333d2b36SAndroid Build Coastguard Worker
8794*333d2b36SAndroid Build Coastguard Worker	// Check extract_apks tool parameters. No native bridge arch expected
8795*333d2b36SAndroid Build Coastguard Worker	extractedApex := m.Output("extracted/myapex.apks")
8796*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8797*333d2b36SAndroid Build Coastguard Worker}
8798*333d2b36SAndroid Build Coastguard Worker
8799*333d2b36SAndroid Build Coastguard Workerfunc TestNoStaticLinkingToStubsLib(t *testing.T) {
8800*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
8801*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8802*333d2b36SAndroid Build Coastguard Worker		apex {
8803*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
8804*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
8805*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib"],
8806*333d2b36SAndroid Build Coastguard Worker			updatable: false,
8807*333d2b36SAndroid Build Coastguard Worker		}
8808*333d2b36SAndroid Build Coastguard Worker
8809*333d2b36SAndroid Build Coastguard Worker		apex_key {
8810*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
8811*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
8812*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
8813*333d2b36SAndroid Build Coastguard Worker		}
8814*333d2b36SAndroid Build Coastguard Worker
8815*333d2b36SAndroid Build Coastguard Worker		cc_library {
8816*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
8817*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
8818*333d2b36SAndroid Build Coastguard Worker			static_libs: ["otherlib"],
8819*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
8820*333d2b36SAndroid Build Coastguard Worker			stl: "none",
8821*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
8822*333d2b36SAndroid Build Coastguard Worker		}
8823*333d2b36SAndroid Build Coastguard Worker
8824*333d2b36SAndroid Build Coastguard Worker		cc_library {
8825*333d2b36SAndroid Build Coastguard Worker			name: "otherlib",
8826*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
8827*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
8828*333d2b36SAndroid Build Coastguard Worker			stl: "none",
8829*333d2b36SAndroid Build Coastguard Worker			stubs: {
8830*333d2b36SAndroid Build Coastguard Worker				versions: ["1", "2", "3"],
8831*333d2b36SAndroid Build Coastguard Worker			},
8832*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
8833*333d2b36SAndroid Build Coastguard Worker		}
8834*333d2b36SAndroid Build Coastguard Worker	`)
8835*333d2b36SAndroid Build Coastguard Worker}
8836*333d2b36SAndroid Build Coastguard Worker
8837*333d2b36SAndroid Build Coastguard Workerfunc TestApexKeysTxt(t *testing.T) {
8838*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
8839*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
8840*333d2b36SAndroid Build Coastguard Worker		apex {
8841*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
8842*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
8843*333d2b36SAndroid Build Coastguard Worker			updatable: false,
8844*333d2b36SAndroid Build Coastguard Worker			custom_sign_tool: "sign_myapex",
8845*333d2b36SAndroid Build Coastguard Worker		}
8846*333d2b36SAndroid Build Coastguard Worker
8847*333d2b36SAndroid Build Coastguard Worker		apex_key {
8848*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
8849*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
8850*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
8851*333d2b36SAndroid Build Coastguard Worker		}
8852*333d2b36SAndroid Build Coastguard Worker	`)
8853*333d2b36SAndroid Build Coastguard Worker
8854*333d2b36SAndroid Build Coastguard Worker	myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
8855*333d2b36SAndroid Build Coastguard Worker	content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
8856*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system" sign_tool="sign_myapex"`)
8857*333d2b36SAndroid Build Coastguard Worker}
8858*333d2b36SAndroid Build Coastguard Worker
8859*333d2b36SAndroid Build Coastguard Workerfunc TestApexKeysTxtOverrides(t *testing.T) {
8860*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
8861*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
8862*333d2b36SAndroid Build Coastguard Worker		apex {
8863*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
8864*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
8865*333d2b36SAndroid Build Coastguard Worker			updatable: false,
8866*333d2b36SAndroid Build Coastguard Worker			custom_sign_tool: "sign_myapex",
8867*333d2b36SAndroid Build Coastguard Worker		}
8868*333d2b36SAndroid Build Coastguard Worker
8869*333d2b36SAndroid Build Coastguard Worker		apex_key {
8870*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
8871*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
8872*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
8873*333d2b36SAndroid Build Coastguard Worker		}
8874*333d2b36SAndroid Build Coastguard Worker
8875*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
8876*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
8877*333d2b36SAndroid Build Coastguard Worker			prefer: true,
8878*333d2b36SAndroid Build Coastguard Worker			arch: {
8879*333d2b36SAndroid Build Coastguard Worker				arm64: {
8880*333d2b36SAndroid Build Coastguard Worker					src: "myapex-arm64.apex",
8881*333d2b36SAndroid Build Coastguard Worker				},
8882*333d2b36SAndroid Build Coastguard Worker				arm: {
8883*333d2b36SAndroid Build Coastguard Worker					src: "myapex-arm.apex",
8884*333d2b36SAndroid Build Coastguard Worker				},
8885*333d2b36SAndroid Build Coastguard Worker			},
8886*333d2b36SAndroid Build Coastguard Worker		}
8887*333d2b36SAndroid Build Coastguard Worker
8888*333d2b36SAndroid Build Coastguard Worker		apex_set {
8889*333d2b36SAndroid Build Coastguard Worker			name: "myapex_set",
8890*333d2b36SAndroid Build Coastguard Worker			set: "myapex.apks",
8891*333d2b36SAndroid Build Coastguard Worker			filename: "myapex_set.apex",
8892*333d2b36SAndroid Build Coastguard Worker			overrides: ["myapex"],
8893*333d2b36SAndroid Build Coastguard Worker		}
8894*333d2b36SAndroid Build Coastguard Worker	`)
8895*333d2b36SAndroid Build Coastguard Worker
8896*333d2b36SAndroid Build Coastguard Worker	content := android.ContentFromFileRuleForTests(t, ctx,
8897*333d2b36SAndroid Build Coastguard Worker		ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
8898*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system" sign_tool="sign_myapex"`)
8899*333d2b36SAndroid Build Coastguard Worker	content = android.ContentFromFileRuleForTests(t, ctx,
8900*333d2b36SAndroid Build Coastguard Worker		ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
8901*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, content, `name="myapex_set.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`)
8902*333d2b36SAndroid Build Coastguard Worker}
8903*333d2b36SAndroid Build Coastguard Worker
8904*333d2b36SAndroid Build Coastguard Workerfunc TestAllowedFiles(t *testing.T) {
8905*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
8906*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
8907*333d2b36SAndroid Build Coastguard Worker		apex {
8908*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
8909*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
8910*333d2b36SAndroid Build Coastguard Worker			apps: ["app"],
8911*333d2b36SAndroid Build Coastguard Worker			allowed_files: "allowed.txt",
8912*333d2b36SAndroid Build Coastguard Worker			updatable: false,
8913*333d2b36SAndroid Build Coastguard Worker		}
8914*333d2b36SAndroid Build Coastguard Worker
8915*333d2b36SAndroid Build Coastguard Worker		apex_key {
8916*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
8917*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
8918*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
8919*333d2b36SAndroid Build Coastguard Worker		}
8920*333d2b36SAndroid Build Coastguard Worker
8921*333d2b36SAndroid Build Coastguard Worker		android_app {
8922*333d2b36SAndroid Build Coastguard Worker			name: "app",
8923*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
8924*333d2b36SAndroid Build Coastguard Worker			package_name: "foo",
8925*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
8926*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
8927*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
8928*333d2b36SAndroid Build Coastguard Worker		}
8929*333d2b36SAndroid Build Coastguard Worker	`, withFiles(map[string][]byte{
8930*333d2b36SAndroid Build Coastguard Worker		"sub/Android.bp": []byte(`
8931*333d2b36SAndroid Build Coastguard Worker			override_apex {
8932*333d2b36SAndroid Build Coastguard Worker				name: "override_myapex",
8933*333d2b36SAndroid Build Coastguard Worker				base: "myapex",
8934*333d2b36SAndroid Build Coastguard Worker				apps: ["override_app"],
8935*333d2b36SAndroid Build Coastguard Worker				allowed_files: ":allowed",
8936*333d2b36SAndroid Build Coastguard Worker			}
8937*333d2b36SAndroid Build Coastguard Worker			// Overridable "path" property should be referenced indirectly
8938*333d2b36SAndroid Build Coastguard Worker			filegroup {
8939*333d2b36SAndroid Build Coastguard Worker				name: "allowed",
8940*333d2b36SAndroid Build Coastguard Worker				srcs: ["allowed.txt"],
8941*333d2b36SAndroid Build Coastguard Worker			}
8942*333d2b36SAndroid Build Coastguard Worker			override_android_app {
8943*333d2b36SAndroid Build Coastguard Worker				name: "override_app",
8944*333d2b36SAndroid Build Coastguard Worker				base: "app",
8945*333d2b36SAndroid Build Coastguard Worker				package_name: "bar",
8946*333d2b36SAndroid Build Coastguard Worker			}
8947*333d2b36SAndroid Build Coastguard Worker			`),
8948*333d2b36SAndroid Build Coastguard Worker	}))
8949*333d2b36SAndroid Build Coastguard Worker
8950*333d2b36SAndroid Build Coastguard Worker	rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
8951*333d2b36SAndroid Build Coastguard Worker	if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8952*333d2b36SAndroid Build Coastguard Worker		t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8953*333d2b36SAndroid Build Coastguard Worker	}
8954*333d2b36SAndroid Build Coastguard Worker
8955*333d2b36SAndroid Build Coastguard Worker	rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
8956*333d2b36SAndroid Build Coastguard Worker	if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8957*333d2b36SAndroid Build Coastguard Worker		t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8958*333d2b36SAndroid Build Coastguard Worker	}
8959*333d2b36SAndroid Build Coastguard Worker}
8960*333d2b36SAndroid Build Coastguard Worker
8961*333d2b36SAndroid Build Coastguard Workerfunc TestNonPreferredPrebuiltDependency(t *testing.T) {
8962*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
8963*333d2b36SAndroid Build Coastguard Worker	testApex(t, `
8964*333d2b36SAndroid Build Coastguard Worker		apex {
8965*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
8966*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
8967*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib"],
8968*333d2b36SAndroid Build Coastguard Worker			updatable: false,
8969*333d2b36SAndroid Build Coastguard Worker		}
8970*333d2b36SAndroid Build Coastguard Worker
8971*333d2b36SAndroid Build Coastguard Worker		apex_key {
8972*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
8973*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
8974*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
8975*333d2b36SAndroid Build Coastguard Worker		}
8976*333d2b36SAndroid Build Coastguard Worker
8977*333d2b36SAndroid Build Coastguard Worker		cc_library {
8978*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
8979*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
8980*333d2b36SAndroid Build Coastguard Worker			stubs: {
8981*333d2b36SAndroid Build Coastguard Worker				versions: ["current"],
8982*333d2b36SAndroid Build Coastguard Worker			},
8983*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
8984*333d2b36SAndroid Build Coastguard Worker		}
8985*333d2b36SAndroid Build Coastguard Worker
8986*333d2b36SAndroid Build Coastguard Worker		cc_prebuilt_library_shared {
8987*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
8988*333d2b36SAndroid Build Coastguard Worker			prefer: false,
8989*333d2b36SAndroid Build Coastguard Worker			srcs: ["prebuilt.so"],
8990*333d2b36SAndroid Build Coastguard Worker			stubs: {
8991*333d2b36SAndroid Build Coastguard Worker				versions: ["current"],
8992*333d2b36SAndroid Build Coastguard Worker			},
8993*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
8994*333d2b36SAndroid Build Coastguard Worker		}
8995*333d2b36SAndroid Build Coastguard Worker	`)
8996*333d2b36SAndroid Build Coastguard Worker}
8997*333d2b36SAndroid Build Coastguard Worker
8998*333d2b36SAndroid Build Coastguard Workerfunc TestCompressedApex(t *testing.T) {
8999*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
9000*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
9001*333d2b36SAndroid Build Coastguard Worker		apex {
9002*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
9003*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
9004*333d2b36SAndroid Build Coastguard Worker			compressible: true,
9005*333d2b36SAndroid Build Coastguard Worker			updatable: false,
9006*333d2b36SAndroid Build Coastguard Worker		}
9007*333d2b36SAndroid Build Coastguard Worker		apex_key {
9008*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
9009*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
9010*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
9011*333d2b36SAndroid Build Coastguard Worker		}
9012*333d2b36SAndroid Build Coastguard Worker	`,
9013*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9014*333d2b36SAndroid Build Coastguard Worker			variables.CompressedApex = proptools.BoolPtr(true)
9015*333d2b36SAndroid Build Coastguard Worker		}),
9016*333d2b36SAndroid Build Coastguard Worker	)
9017*333d2b36SAndroid Build Coastguard Worker
9018*333d2b36SAndroid Build Coastguard Worker	compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
9019*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9020*333d2b36SAndroid Build Coastguard Worker
9021*333d2b36SAndroid Build Coastguard Worker	signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
9022*333d2b36SAndroid Build Coastguard Worker	ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9023*333d2b36SAndroid Build Coastguard Worker
9024*333d2b36SAndroid Build Coastguard Worker	// Make sure output of bundle is .capex
9025*333d2b36SAndroid Build Coastguard Worker	ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
9026*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, ab.outputFile.String(), "myapex.capex")
9027*333d2b36SAndroid Build Coastguard Worker
9028*333d2b36SAndroid Build Coastguard Worker	// Verify android.mk rules
9029*333d2b36SAndroid Build Coastguard Worker	data := android.AndroidMkDataForTest(t, ctx, ab)
9030*333d2b36SAndroid Build Coastguard Worker	var builder strings.Builder
9031*333d2b36SAndroid Build Coastguard Worker	data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9032*333d2b36SAndroid Build Coastguard Worker	androidMk := builder.String()
9033*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9034*333d2b36SAndroid Build Coastguard Worker}
9035*333d2b36SAndroid Build Coastguard Worker
9036*333d2b36SAndroid Build Coastguard Workerfunc TestCompressedApexIsDisabledWhenUsingErofs(t *testing.T) {
9037*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
9038*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
9039*333d2b36SAndroid Build Coastguard Worker		apex {
9040*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
9041*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
9042*333d2b36SAndroid Build Coastguard Worker			compressible: true,
9043*333d2b36SAndroid Build Coastguard Worker			updatable: false,
9044*333d2b36SAndroid Build Coastguard Worker			payload_fs_type: "erofs",
9045*333d2b36SAndroid Build Coastguard Worker		}
9046*333d2b36SAndroid Build Coastguard Worker		apex_key {
9047*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
9048*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
9049*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
9050*333d2b36SAndroid Build Coastguard Worker		}
9051*333d2b36SAndroid Build Coastguard Worker	`,
9052*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9053*333d2b36SAndroid Build Coastguard Worker			variables.CompressedApex = proptools.BoolPtr(true)
9054*333d2b36SAndroid Build Coastguard Worker		}),
9055*333d2b36SAndroid Build Coastguard Worker	)
9056*333d2b36SAndroid Build Coastguard Worker
9057*333d2b36SAndroid Build Coastguard Worker	compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").MaybeRule("compressRule")
9058*333d2b36SAndroid Build Coastguard Worker	if compressRule.Rule != nil {
9059*333d2b36SAndroid Build Coastguard Worker		t.Error("erofs apex should not be compressed")
9060*333d2b36SAndroid Build Coastguard Worker	}
9061*333d2b36SAndroid Build Coastguard Worker}
9062*333d2b36SAndroid Build Coastguard Worker
9063*333d2b36SAndroid Build Coastguard Workerfunc TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
9064*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
9065*333d2b36SAndroid Build Coastguard Worker	for _, compressionEnabled := range []bool{true, false} {
9066*333d2b36SAndroid Build Coastguard Worker		t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
9067*333d2b36SAndroid Build Coastguard Worker			t.Parallel()
9068*333d2b36SAndroid Build Coastguard Worker			ctx := testApex(t, `
9069*333d2b36SAndroid Build Coastguard Worker				apex_set {
9070*333d2b36SAndroid Build Coastguard Worker					name: "com.company.android.myapex",
9071*333d2b36SAndroid Build Coastguard Worker					apex_name: "com.android.myapex",
9072*333d2b36SAndroid Build Coastguard Worker					set: "company-myapex.apks",
9073*333d2b36SAndroid Build Coastguard Worker				}
9074*333d2b36SAndroid Build Coastguard Worker			`, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9075*333d2b36SAndroid Build Coastguard Worker				variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9076*333d2b36SAndroid Build Coastguard Worker			}),
9077*333d2b36SAndroid Build Coastguard Worker			)
9078*333d2b36SAndroid Build Coastguard Worker
9079*333d2b36SAndroid Build Coastguard Worker			build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9080*333d2b36SAndroid Build Coastguard Worker			if compressionEnabled {
9081*333d2b36SAndroid Build Coastguard Worker				ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9082*333d2b36SAndroid Build Coastguard Worker			} else {
9083*333d2b36SAndroid Build Coastguard Worker				ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9084*333d2b36SAndroid Build Coastguard Worker			}
9085*333d2b36SAndroid Build Coastguard Worker		})
9086*333d2b36SAndroid Build Coastguard Worker	}
9087*333d2b36SAndroid Build Coastguard Worker}
9088*333d2b36SAndroid Build Coastguard Worker
9089*333d2b36SAndroid Build Coastguard Workerfunc TestPreferredPrebuiltSharedLibDep(t *testing.T) {
9090*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
9091*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
9092*333d2b36SAndroid Build Coastguard Worker		apex {
9093*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
9094*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
9095*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib"],
9096*333d2b36SAndroid Build Coastguard Worker			updatable: false,
9097*333d2b36SAndroid Build Coastguard Worker		}
9098*333d2b36SAndroid Build Coastguard Worker
9099*333d2b36SAndroid Build Coastguard Worker		apex_key {
9100*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
9101*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
9102*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
9103*333d2b36SAndroid Build Coastguard Worker		}
9104*333d2b36SAndroid Build Coastguard Worker
9105*333d2b36SAndroid Build Coastguard Worker		cc_library {
9106*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
9107*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
9108*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
9109*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["otherlib"],
9110*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
9111*333d2b36SAndroid Build Coastguard Worker		}
9112*333d2b36SAndroid Build Coastguard Worker
9113*333d2b36SAndroid Build Coastguard Worker		cc_library {
9114*333d2b36SAndroid Build Coastguard Worker			name: "otherlib",
9115*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
9116*333d2b36SAndroid Build Coastguard Worker			stubs: {
9117*333d2b36SAndroid Build Coastguard Worker				versions: ["current"],
9118*333d2b36SAndroid Build Coastguard Worker			},
9119*333d2b36SAndroid Build Coastguard Worker		}
9120*333d2b36SAndroid Build Coastguard Worker
9121*333d2b36SAndroid Build Coastguard Worker		cc_prebuilt_library_shared {
9122*333d2b36SAndroid Build Coastguard Worker			name: "otherlib",
9123*333d2b36SAndroid Build Coastguard Worker			prefer: true,
9124*333d2b36SAndroid Build Coastguard Worker			srcs: ["prebuilt.so"],
9125*333d2b36SAndroid Build Coastguard Worker			stubs: {
9126*333d2b36SAndroid Build Coastguard Worker				versions: ["current"],
9127*333d2b36SAndroid Build Coastguard Worker			},
9128*333d2b36SAndroid Build Coastguard Worker		}
9129*333d2b36SAndroid Build Coastguard Worker	`)
9130*333d2b36SAndroid Build Coastguard Worker
9131*333d2b36SAndroid Build Coastguard Worker	ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
9132*333d2b36SAndroid Build Coastguard Worker	data := android.AndroidMkDataForTest(t, ctx, ab)
9133*333d2b36SAndroid Build Coastguard Worker	var builder strings.Builder
9134*333d2b36SAndroid Build Coastguard Worker	data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9135*333d2b36SAndroid Build Coastguard Worker	androidMk := builder.String()
9136*333d2b36SAndroid Build Coastguard Worker
9137*333d2b36SAndroid Build Coastguard Worker	// The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9138*333d2b36SAndroid Build Coastguard Worker	// a thing there.
9139*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
9140*333d2b36SAndroid Build Coastguard Worker}
9141*333d2b36SAndroid Build Coastguard Worker
9142*333d2b36SAndroid Build Coastguard Workerfunc TestExcludeDependency(t *testing.T) {
9143*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
9144*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
9145*333d2b36SAndroid Build Coastguard Worker		apex {
9146*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
9147*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
9148*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib"],
9149*333d2b36SAndroid Build Coastguard Worker			updatable: false,
9150*333d2b36SAndroid Build Coastguard Worker		}
9151*333d2b36SAndroid Build Coastguard Worker
9152*333d2b36SAndroid Build Coastguard Worker		apex_key {
9153*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
9154*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
9155*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
9156*333d2b36SAndroid Build Coastguard Worker		}
9157*333d2b36SAndroid Build Coastguard Worker
9158*333d2b36SAndroid Build Coastguard Worker		cc_library {
9159*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
9160*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
9161*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
9162*333d2b36SAndroid Build Coastguard Worker			stl: "none",
9163*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
9164*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["mylib2"],
9165*333d2b36SAndroid Build Coastguard Worker			target: {
9166*333d2b36SAndroid Build Coastguard Worker				apex: {
9167*333d2b36SAndroid Build Coastguard Worker					exclude_shared_libs: ["mylib2"],
9168*333d2b36SAndroid Build Coastguard Worker				},
9169*333d2b36SAndroid Build Coastguard Worker			},
9170*333d2b36SAndroid Build Coastguard Worker		}
9171*333d2b36SAndroid Build Coastguard Worker
9172*333d2b36SAndroid Build Coastguard Worker		cc_library {
9173*333d2b36SAndroid Build Coastguard Worker			name: "mylib2",
9174*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
9175*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
9176*333d2b36SAndroid Build Coastguard Worker			stl: "none",
9177*333d2b36SAndroid Build Coastguard Worker		}
9178*333d2b36SAndroid Build Coastguard Worker	`)
9179*333d2b36SAndroid Build Coastguard Worker
9180*333d2b36SAndroid Build Coastguard Worker	// Check if mylib is linked to mylib2 for the non-apex target
9181*333d2b36SAndroid Build Coastguard Worker	ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9182*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9183*333d2b36SAndroid Build Coastguard Worker
9184*333d2b36SAndroid Build Coastguard Worker	// Make sure that the link doesn't occur for the apex target
9185*333d2b36SAndroid Build Coastguard Worker	ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9186*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9187*333d2b36SAndroid Build Coastguard Worker
9188*333d2b36SAndroid Build Coastguard Worker	// It shouldn't appear in the copy cmd as well.
9189*333d2b36SAndroid Build Coastguard Worker	copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
9190*333d2b36SAndroid Build Coastguard Worker	ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9191*333d2b36SAndroid Build Coastguard Worker}
9192*333d2b36SAndroid Build Coastguard Worker
9193*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltStubLibDep(t *testing.T) {
9194*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
9195*333d2b36SAndroid Build Coastguard Worker	bpBase := `
9196*333d2b36SAndroid Build Coastguard Worker		apex {
9197*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
9198*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
9199*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["mylib"],
9200*333d2b36SAndroid Build Coastguard Worker			updatable: false,
9201*333d2b36SAndroid Build Coastguard Worker		}
9202*333d2b36SAndroid Build Coastguard Worker		apex_key {
9203*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
9204*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
9205*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
9206*333d2b36SAndroid Build Coastguard Worker		}
9207*333d2b36SAndroid Build Coastguard Worker		cc_library {
9208*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
9209*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
9210*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
9211*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["stublib"],
9212*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
9213*333d2b36SAndroid Build Coastguard Worker		}
9214*333d2b36SAndroid Build Coastguard Worker		apex {
9215*333d2b36SAndroid Build Coastguard Worker			name: "otherapex",
9216*333d2b36SAndroid Build Coastguard Worker			enabled: %s,
9217*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
9218*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["stublib"],
9219*333d2b36SAndroid Build Coastguard Worker			updatable: false,
9220*333d2b36SAndroid Build Coastguard Worker		}
9221*333d2b36SAndroid Build Coastguard Worker	`
9222*333d2b36SAndroid Build Coastguard Worker
9223*333d2b36SAndroid Build Coastguard Worker	stublibSourceBp := `
9224*333d2b36SAndroid Build Coastguard Worker		cc_library {
9225*333d2b36SAndroid Build Coastguard Worker			name: "stublib",
9226*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
9227*333d2b36SAndroid Build Coastguard Worker			apex_available: ["otherapex"],
9228*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
9229*333d2b36SAndroid Build Coastguard Worker			stl: "none",
9230*333d2b36SAndroid Build Coastguard Worker			stubs: {
9231*333d2b36SAndroid Build Coastguard Worker				versions: ["1"],
9232*333d2b36SAndroid Build Coastguard Worker			},
9233*333d2b36SAndroid Build Coastguard Worker		}
9234*333d2b36SAndroid Build Coastguard Worker	`
9235*333d2b36SAndroid Build Coastguard Worker
9236*333d2b36SAndroid Build Coastguard Worker	stublibPrebuiltBp := `
9237*333d2b36SAndroid Build Coastguard Worker		cc_prebuilt_library_shared {
9238*333d2b36SAndroid Build Coastguard Worker			name: "stublib",
9239*333d2b36SAndroid Build Coastguard Worker			srcs: ["prebuilt.so"],
9240*333d2b36SAndroid Build Coastguard Worker			apex_available: ["otherapex"],
9241*333d2b36SAndroid Build Coastguard Worker			stubs: {
9242*333d2b36SAndroid Build Coastguard Worker				versions: ["1"],
9243*333d2b36SAndroid Build Coastguard Worker			},
9244*333d2b36SAndroid Build Coastguard Worker			%s
9245*333d2b36SAndroid Build Coastguard Worker		}
9246*333d2b36SAndroid Build Coastguard Worker	`
9247*333d2b36SAndroid Build Coastguard Worker
9248*333d2b36SAndroid Build Coastguard Worker	tests := []struct {
9249*333d2b36SAndroid Build Coastguard Worker		name             string
9250*333d2b36SAndroid Build Coastguard Worker		stublibBp        string
9251*333d2b36SAndroid Build Coastguard Worker		usePrebuilt      bool
9252*333d2b36SAndroid Build Coastguard Worker		modNames         []string // Modules to collect AndroidMkEntries for
9253*333d2b36SAndroid Build Coastguard Worker		otherApexEnabled []string
9254*333d2b36SAndroid Build Coastguard Worker	}{
9255*333d2b36SAndroid Build Coastguard Worker		{
9256*333d2b36SAndroid Build Coastguard Worker			name:             "only_source",
9257*333d2b36SAndroid Build Coastguard Worker			stublibBp:        stublibSourceBp,
9258*333d2b36SAndroid Build Coastguard Worker			usePrebuilt:      false,
9259*333d2b36SAndroid Build Coastguard Worker			modNames:         []string{"stublib"},
9260*333d2b36SAndroid Build Coastguard Worker			otherApexEnabled: []string{"true", "false"},
9261*333d2b36SAndroid Build Coastguard Worker		},
9262*333d2b36SAndroid Build Coastguard Worker		{
9263*333d2b36SAndroid Build Coastguard Worker			name:             "source_preferred",
9264*333d2b36SAndroid Build Coastguard Worker			stublibBp:        stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9265*333d2b36SAndroid Build Coastguard Worker			usePrebuilt:      false,
9266*333d2b36SAndroid Build Coastguard Worker			modNames:         []string{"stublib", "prebuilt_stublib"},
9267*333d2b36SAndroid Build Coastguard Worker			otherApexEnabled: []string{"true", "false"},
9268*333d2b36SAndroid Build Coastguard Worker		},
9269*333d2b36SAndroid Build Coastguard Worker		{
9270*333d2b36SAndroid Build Coastguard Worker			name:             "prebuilt_preferred",
9271*333d2b36SAndroid Build Coastguard Worker			stublibBp:        stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9272*333d2b36SAndroid Build Coastguard Worker			usePrebuilt:      true,
9273*333d2b36SAndroid Build Coastguard Worker			modNames:         []string{"stublib", "prebuilt_stublib"},
9274*333d2b36SAndroid Build Coastguard Worker			otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9275*333d2b36SAndroid Build Coastguard Worker		},
9276*333d2b36SAndroid Build Coastguard Worker		{
9277*333d2b36SAndroid Build Coastguard Worker			name:             "only_prebuilt",
9278*333d2b36SAndroid Build Coastguard Worker			stublibBp:        fmt.Sprintf(stublibPrebuiltBp, ""),
9279*333d2b36SAndroid Build Coastguard Worker			usePrebuilt:      true,
9280*333d2b36SAndroid Build Coastguard Worker			modNames:         []string{"stublib"},
9281*333d2b36SAndroid Build Coastguard Worker			otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9282*333d2b36SAndroid Build Coastguard Worker		},
9283*333d2b36SAndroid Build Coastguard Worker	}
9284*333d2b36SAndroid Build Coastguard Worker
9285*333d2b36SAndroid Build Coastguard Worker	for _, test := range tests {
9286*333d2b36SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
9287*333d2b36SAndroid Build Coastguard Worker			t.Parallel()
9288*333d2b36SAndroid Build Coastguard Worker			for _, otherApexEnabled := range test.otherApexEnabled {
9289*333d2b36SAndroid Build Coastguard Worker				t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
9290*333d2b36SAndroid Build Coastguard Worker					t.Parallel()
9291*333d2b36SAndroid Build Coastguard Worker					ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
9292*333d2b36SAndroid Build Coastguard Worker
9293*333d2b36SAndroid Build Coastguard Worker					type modAndMkEntries struct {
9294*333d2b36SAndroid Build Coastguard Worker						mod       *cc.Module
9295*333d2b36SAndroid Build Coastguard Worker						mkEntries android.AndroidMkInfo
9296*333d2b36SAndroid Build Coastguard Worker					}
9297*333d2b36SAndroid Build Coastguard Worker					entries := []*modAndMkEntries{}
9298*333d2b36SAndroid Build Coastguard Worker
9299*333d2b36SAndroid Build Coastguard Worker					// Gather shared lib modules that are installable
9300*333d2b36SAndroid Build Coastguard Worker					for _, modName := range test.modNames {
9301*333d2b36SAndroid Build Coastguard Worker						for _, variant := range ctx.ModuleVariantsForTests(modName) {
9302*333d2b36SAndroid Build Coastguard Worker							if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9303*333d2b36SAndroid Build Coastguard Worker								continue
9304*333d2b36SAndroid Build Coastguard Worker							}
9305*333d2b36SAndroid Build Coastguard Worker							mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
9306*333d2b36SAndroid Build Coastguard Worker							if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
9307*333d2b36SAndroid Build Coastguard Worker								continue
9308*333d2b36SAndroid Build Coastguard Worker							}
9309*333d2b36SAndroid Build Coastguard Worker							info := android.AndroidMkInfoForTest(t, ctx, mod)
9310*333d2b36SAndroid Build Coastguard Worker							ents := []android.AndroidMkInfo{info.PrimaryInfo}
9311*333d2b36SAndroid Build Coastguard Worker							ents = append(ents, info.ExtraInfo...)
9312*333d2b36SAndroid Build Coastguard Worker							for _, ent := range ents {
9313*333d2b36SAndroid Build Coastguard Worker								if ent.Disabled {
9314*333d2b36SAndroid Build Coastguard Worker									continue
9315*333d2b36SAndroid Build Coastguard Worker								}
9316*333d2b36SAndroid Build Coastguard Worker								entries = append(entries, &modAndMkEntries{
9317*333d2b36SAndroid Build Coastguard Worker									mod:       mod,
9318*333d2b36SAndroid Build Coastguard Worker									mkEntries: ent,
9319*333d2b36SAndroid Build Coastguard Worker								})
9320*333d2b36SAndroid Build Coastguard Worker							}
9321*333d2b36SAndroid Build Coastguard Worker						}
9322*333d2b36SAndroid Build Coastguard Worker					}
9323*333d2b36SAndroid Build Coastguard Worker
9324*333d2b36SAndroid Build Coastguard Worker					var entry *modAndMkEntries = nil
9325*333d2b36SAndroid Build Coastguard Worker					for _, ent := range entries {
9326*333d2b36SAndroid Build Coastguard Worker						if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9327*333d2b36SAndroid Build Coastguard Worker							if entry != nil {
9328*333d2b36SAndroid Build Coastguard Worker								t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9329*333d2b36SAndroid Build Coastguard Worker							} else {
9330*333d2b36SAndroid Build Coastguard Worker								entry = ent
9331*333d2b36SAndroid Build Coastguard Worker							}
9332*333d2b36SAndroid Build Coastguard Worker						}
9333*333d2b36SAndroid Build Coastguard Worker					}
9334*333d2b36SAndroid Build Coastguard Worker
9335*333d2b36SAndroid Build Coastguard Worker					if entry == nil {
9336*333d2b36SAndroid Build Coastguard Worker						t.Errorf("AndroidMk entry for \"stublib\" missing")
9337*333d2b36SAndroid Build Coastguard Worker					} else {
9338*333d2b36SAndroid Build Coastguard Worker						isPrebuilt := entry.mod.Prebuilt() != nil
9339*333d2b36SAndroid Build Coastguard Worker						if isPrebuilt != test.usePrebuilt {
9340*333d2b36SAndroid Build Coastguard Worker							t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9341*333d2b36SAndroid Build Coastguard Worker						}
9342*333d2b36SAndroid Build Coastguard Worker						if !entry.mod.IsStubs() {
9343*333d2b36SAndroid Build Coastguard Worker							t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9344*333d2b36SAndroid Build Coastguard Worker						}
9345*333d2b36SAndroid Build Coastguard Worker						if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9346*333d2b36SAndroid Build Coastguard Worker							t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9347*333d2b36SAndroid Build Coastguard Worker						}
9348*333d2b36SAndroid Build Coastguard Worker						cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
9349*333d2b36SAndroid Build Coastguard Worker						expected := "-D__STUBLIB_API__=10000"
9350*333d2b36SAndroid Build Coastguard Worker						if !android.InList(expected, cflags) {
9351*333d2b36SAndroid Build Coastguard Worker							t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9352*333d2b36SAndroid Build Coastguard Worker						}
9353*333d2b36SAndroid Build Coastguard Worker					}
9354*333d2b36SAndroid Build Coastguard Worker				})
9355*333d2b36SAndroid Build Coastguard Worker			}
9356*333d2b36SAndroid Build Coastguard Worker		})
9357*333d2b36SAndroid Build Coastguard Worker	}
9358*333d2b36SAndroid Build Coastguard Worker}
9359*333d2b36SAndroid Build Coastguard Worker
9360*333d2b36SAndroid Build Coastguard Workerfunc TestApexJavaCoverage(t *testing.T) {
9361*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
9362*333d2b36SAndroid Build Coastguard Worker	bp := `
9363*333d2b36SAndroid Build Coastguard Worker		apex {
9364*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
9365*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
9366*333d2b36SAndroid Build Coastguard Worker			java_libs: ["mylib"],
9367*333d2b36SAndroid Build Coastguard Worker			bootclasspath_fragments: ["mybootclasspathfragment"],
9368*333d2b36SAndroid Build Coastguard Worker			systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9369*333d2b36SAndroid Build Coastguard Worker			updatable: false,
9370*333d2b36SAndroid Build Coastguard Worker		}
9371*333d2b36SAndroid Build Coastguard Worker
9372*333d2b36SAndroid Build Coastguard Worker		apex_key {
9373*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
9374*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
9375*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
9376*333d2b36SAndroid Build Coastguard Worker		}
9377*333d2b36SAndroid Build Coastguard Worker
9378*333d2b36SAndroid Build Coastguard Worker		java_library {
9379*333d2b36SAndroid Build Coastguard Worker			name: "mylib",
9380*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.java"],
9381*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
9382*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
9383*333d2b36SAndroid Build Coastguard Worker		}
9384*333d2b36SAndroid Build Coastguard Worker
9385*333d2b36SAndroid Build Coastguard Worker		bootclasspath_fragment {
9386*333d2b36SAndroid Build Coastguard Worker			name: "mybootclasspathfragment",
9387*333d2b36SAndroid Build Coastguard Worker			contents: ["mybootclasspathlib"],
9388*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
9389*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
9390*333d2b36SAndroid Build Coastguard Worker				split_packages: ["*"],
9391*333d2b36SAndroid Build Coastguard Worker			},
9392*333d2b36SAndroid Build Coastguard Worker		}
9393*333d2b36SAndroid Build Coastguard Worker
9394*333d2b36SAndroid Build Coastguard Worker		java_library {
9395*333d2b36SAndroid Build Coastguard Worker			name: "mybootclasspathlib",
9396*333d2b36SAndroid Build Coastguard Worker			srcs: ["mybootclasspathlib.java"],
9397*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
9398*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
9399*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
9400*333d2b36SAndroid Build Coastguard Worker		}
9401*333d2b36SAndroid Build Coastguard Worker
9402*333d2b36SAndroid Build Coastguard Worker		systemserverclasspath_fragment {
9403*333d2b36SAndroid Build Coastguard Worker			name: "mysystemserverclasspathfragment",
9404*333d2b36SAndroid Build Coastguard Worker			contents: ["mysystemserverclasspathlib"],
9405*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
9406*333d2b36SAndroid Build Coastguard Worker		}
9407*333d2b36SAndroid Build Coastguard Worker
9408*333d2b36SAndroid Build Coastguard Worker		java_library {
9409*333d2b36SAndroid Build Coastguard Worker			name: "mysystemserverclasspathlib",
9410*333d2b36SAndroid Build Coastguard Worker			srcs: ["mysystemserverclasspathlib.java"],
9411*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
9412*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
9413*333d2b36SAndroid Build Coastguard Worker		}
9414*333d2b36SAndroid Build Coastguard Worker	`
9415*333d2b36SAndroid Build Coastguard Worker
9416*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
9417*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithApexBuildComponents,
9418*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithMyapex,
9419*333d2b36SAndroid Build Coastguard Worker		java.PrepareForTestWithJavaDefaultModules,
9420*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithAndroidBuildComponents,
9421*333d2b36SAndroid Build Coastguard Worker		android.FixtureWithRootAndroidBp(bp),
9422*333d2b36SAndroid Build Coastguard Worker		dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9423*333d2b36SAndroid Build Coastguard Worker		dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9424*333d2b36SAndroid Build Coastguard Worker		java.PrepareForTestWithJacocoInstrumentation,
9425*333d2b36SAndroid Build Coastguard Worker	).RunTest(t)
9426*333d2b36SAndroid Build Coastguard Worker
9427*333d2b36SAndroid Build Coastguard Worker	// Make sure jacoco ran on both mylib and mybootclasspathlib
9428*333d2b36SAndroid Build Coastguard Worker	if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9429*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Failed to find jacoco rule for mylib")
9430*333d2b36SAndroid Build Coastguard Worker	}
9431*333d2b36SAndroid Build Coastguard Worker	if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9432*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9433*333d2b36SAndroid Build Coastguard Worker	}
9434*333d2b36SAndroid Build Coastguard Worker	if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9435*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9436*333d2b36SAndroid Build Coastguard Worker	}
9437*333d2b36SAndroid Build Coastguard Worker}
9438*333d2b36SAndroid Build Coastguard Worker
9439*333d2b36SAndroid Build Coastguard Workerfunc TestProhibitStaticExecutable(t *testing.T) {
9440*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
9441*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `executable mybin is static`, `
9442*333d2b36SAndroid Build Coastguard Worker		apex {
9443*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
9444*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
9445*333d2b36SAndroid Build Coastguard Worker			binaries: ["mybin"],
9446*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
9447*333d2b36SAndroid Build Coastguard Worker		}
9448*333d2b36SAndroid Build Coastguard Worker
9449*333d2b36SAndroid Build Coastguard Worker		apex_key {
9450*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
9451*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
9452*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
9453*333d2b36SAndroid Build Coastguard Worker		}
9454*333d2b36SAndroid Build Coastguard Worker
9455*333d2b36SAndroid Build Coastguard Worker		cc_binary {
9456*333d2b36SAndroid Build Coastguard Worker			name: "mybin",
9457*333d2b36SAndroid Build Coastguard Worker			srcs: ["mylib.cpp"],
9458*333d2b36SAndroid Build Coastguard Worker			relative_install_path: "foo/bar",
9459*333d2b36SAndroid Build Coastguard Worker			static_executable: true,
9460*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
9461*333d2b36SAndroid Build Coastguard Worker			stl: "none",
9462*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
9463*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
9464*333d2b36SAndroid Build Coastguard Worker		}
9465*333d2b36SAndroid Build Coastguard Worker	`)
9466*333d2b36SAndroid Build Coastguard Worker
9467*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `executable mybin.rust is static`, `
9468*333d2b36SAndroid Build Coastguard Worker		apex {
9469*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
9470*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
9471*333d2b36SAndroid Build Coastguard Worker			binaries: ["mybin.rust"],
9472*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
9473*333d2b36SAndroid Build Coastguard Worker		}
9474*333d2b36SAndroid Build Coastguard Worker
9475*333d2b36SAndroid Build Coastguard Worker		apex_key {
9476*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
9477*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
9478*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
9479*333d2b36SAndroid Build Coastguard Worker		}
9480*333d2b36SAndroid Build Coastguard Worker
9481*333d2b36SAndroid Build Coastguard Worker		rust_binary {
9482*333d2b36SAndroid Build Coastguard Worker			name: "mybin.rust",
9483*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
9484*333d2b36SAndroid Build Coastguard Worker			static_executable: true,
9485*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
9486*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
9487*333d2b36SAndroid Build Coastguard Worker		}
9488*333d2b36SAndroid Build Coastguard Worker	`)
9489*333d2b36SAndroid Build Coastguard Worker}
9490*333d2b36SAndroid Build Coastguard Worker
9491*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9492*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
9493*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
9494*333d2b36SAndroid Build Coastguard Worker		apex {
9495*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
9496*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
9497*333d2b36SAndroid Build Coastguard Worker			updatable: false,
9498*333d2b36SAndroid Build Coastguard Worker			java_libs: ["foo"],
9499*333d2b36SAndroid Build Coastguard Worker		}
9500*333d2b36SAndroid Build Coastguard Worker
9501*333d2b36SAndroid Build Coastguard Worker		apex_key {
9502*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
9503*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
9504*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
9505*333d2b36SAndroid Build Coastguard Worker		}
9506*333d2b36SAndroid Build Coastguard Worker
9507*333d2b36SAndroid Build Coastguard Worker		java_library {
9508*333d2b36SAndroid Build Coastguard Worker			name: "foo",
9509*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
9510*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
9511*333d2b36SAndroid Build Coastguard Worker			installable: true,
9512*333d2b36SAndroid Build Coastguard Worker		}
9513*333d2b36SAndroid Build Coastguard Worker	`,
9514*333d2b36SAndroid Build Coastguard Worker		dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9515*333d2b36SAndroid Build Coastguard Worker	)
9516*333d2b36SAndroid Build Coastguard Worker
9517*333d2b36SAndroid Build Coastguard Worker	apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
9518*333d2b36SAndroid Build Coastguard Worker	data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9519*333d2b36SAndroid Build Coastguard Worker	var builder strings.Builder
9520*333d2b36SAndroid Build Coastguard Worker	data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9521*333d2b36SAndroid Build Coastguard Worker	androidMk := builder.String()
9522*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex foo-dexpreopt-arm64-apex@myapex@[email protected]@classes.odex foo-dexpreopt-arm64-apex@myapex@[email protected]@classes.vdex\n")
9523*333d2b36SAndroid Build Coastguard Worker}
9524*333d2b36SAndroid Build Coastguard Worker
9525*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidMk_RequiredModules(t *testing.T) {
9526*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
9527*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
9528*333d2b36SAndroid Build Coastguard Worker		apex {
9529*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
9530*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
9531*333d2b36SAndroid Build Coastguard Worker			updatable: false,
9532*333d2b36SAndroid Build Coastguard Worker			java_libs: ["foo"],
9533*333d2b36SAndroid Build Coastguard Worker			required: ["otherapex"],
9534*333d2b36SAndroid Build Coastguard Worker		}
9535*333d2b36SAndroid Build Coastguard Worker
9536*333d2b36SAndroid Build Coastguard Worker		apex {
9537*333d2b36SAndroid Build Coastguard Worker			name: "otherapex",
9538*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
9539*333d2b36SAndroid Build Coastguard Worker			updatable: false,
9540*333d2b36SAndroid Build Coastguard Worker			java_libs: ["foo"],
9541*333d2b36SAndroid Build Coastguard Worker		}
9542*333d2b36SAndroid Build Coastguard Worker
9543*333d2b36SAndroid Build Coastguard Worker		apex_key {
9544*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
9545*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
9546*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
9547*333d2b36SAndroid Build Coastguard Worker		}
9548*333d2b36SAndroid Build Coastguard Worker
9549*333d2b36SAndroid Build Coastguard Worker		java_library {
9550*333d2b36SAndroid Build Coastguard Worker			name: "foo",
9551*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
9552*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex", "otherapex"],
9553*333d2b36SAndroid Build Coastguard Worker			installable: true,
9554*333d2b36SAndroid Build Coastguard Worker		}
9555*333d2b36SAndroid Build Coastguard Worker	`)
9556*333d2b36SAndroid Build Coastguard Worker
9557*333d2b36SAndroid Build Coastguard Worker	apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
9558*333d2b36SAndroid Build Coastguard Worker	data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9559*333d2b36SAndroid Build Coastguard Worker	var builder strings.Builder
9560*333d2b36SAndroid Build Coastguard Worker	data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9561*333d2b36SAndroid Build Coastguard Worker	androidMk := builder.String()
9562*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
9563*333d2b36SAndroid Build Coastguard Worker}
9564*333d2b36SAndroid Build Coastguard Worker
9565*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidMk_RequiredDeps(t *testing.T) {
9566*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
9567*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
9568*333d2b36SAndroid Build Coastguard Worker		apex {
9569*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
9570*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
9571*333d2b36SAndroid Build Coastguard Worker			updatable: false,
9572*333d2b36SAndroid Build Coastguard Worker		}
9573*333d2b36SAndroid Build Coastguard Worker
9574*333d2b36SAndroid Build Coastguard Worker		apex_key {
9575*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
9576*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
9577*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
9578*333d2b36SAndroid Build Coastguard Worker		}
9579*333d2b36SAndroid Build Coastguard Worker	`)
9580*333d2b36SAndroid Build Coastguard Worker
9581*333d2b36SAndroid Build Coastguard Worker	bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
9582*333d2b36SAndroid Build Coastguard Worker	bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
9583*333d2b36SAndroid Build Coastguard Worker	data := android.AndroidMkDataForTest(t, ctx, bundle)
9584*333d2b36SAndroid Build Coastguard Worker	var builder strings.Builder
9585*333d2b36SAndroid Build Coastguard Worker	data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9586*333d2b36SAndroid Build Coastguard Worker	androidMk := builder.String()
9587*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
9588*333d2b36SAndroid Build Coastguard Worker}
9589*333d2b36SAndroid Build Coastguard Worker
9590*333d2b36SAndroid Build Coastguard Workerfunc TestApexOutputFileProducer(t *testing.T) {
9591*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
9592*333d2b36SAndroid Build Coastguard Worker	for _, tc := range []struct {
9593*333d2b36SAndroid Build Coastguard Worker		name          string
9594*333d2b36SAndroid Build Coastguard Worker		ref           string
9595*333d2b36SAndroid Build Coastguard Worker		expected_data []string
9596*333d2b36SAndroid Build Coastguard Worker	}{
9597*333d2b36SAndroid Build Coastguard Worker		{
9598*333d2b36SAndroid Build Coastguard Worker			name:          "test_using_output",
9599*333d2b36SAndroid Build Coastguard Worker			ref:           ":myapex",
9600*333d2b36SAndroid Build Coastguard Worker			expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
9601*333d2b36SAndroid Build Coastguard Worker		},
9602*333d2b36SAndroid Build Coastguard Worker		{
9603*333d2b36SAndroid Build Coastguard Worker			name:          "test_using_apex",
9604*333d2b36SAndroid Build Coastguard Worker			ref:           ":myapex{.apex}",
9605*333d2b36SAndroid Build Coastguard Worker			expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
9606*333d2b36SAndroid Build Coastguard Worker		},
9607*333d2b36SAndroid Build Coastguard Worker	} {
9608*333d2b36SAndroid Build Coastguard Worker		t.Run(tc.name, func(t *testing.T) {
9609*333d2b36SAndroid Build Coastguard Worker			t.Parallel()
9610*333d2b36SAndroid Build Coastguard Worker			ctx := testApex(t, `
9611*333d2b36SAndroid Build Coastguard Worker					apex {
9612*333d2b36SAndroid Build Coastguard Worker						name: "myapex",
9613*333d2b36SAndroid Build Coastguard Worker						key: "myapex.key",
9614*333d2b36SAndroid Build Coastguard Worker						compressible: true,
9615*333d2b36SAndroid Build Coastguard Worker						updatable: false,
9616*333d2b36SAndroid Build Coastguard Worker					}
9617*333d2b36SAndroid Build Coastguard Worker
9618*333d2b36SAndroid Build Coastguard Worker					apex_key {
9619*333d2b36SAndroid Build Coastguard Worker						name: "myapex.key",
9620*333d2b36SAndroid Build Coastguard Worker						public_key: "testkey.avbpubkey",
9621*333d2b36SAndroid Build Coastguard Worker						private_key: "testkey.pem",
9622*333d2b36SAndroid Build Coastguard Worker					}
9623*333d2b36SAndroid Build Coastguard Worker
9624*333d2b36SAndroid Build Coastguard Worker					java_test {
9625*333d2b36SAndroid Build Coastguard Worker						name: "`+tc.name+`",
9626*333d2b36SAndroid Build Coastguard Worker						srcs: ["a.java"],
9627*333d2b36SAndroid Build Coastguard Worker						data: ["`+tc.ref+`"],
9628*333d2b36SAndroid Build Coastguard Worker					}
9629*333d2b36SAndroid Build Coastguard Worker				`,
9630*333d2b36SAndroid Build Coastguard Worker				android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9631*333d2b36SAndroid Build Coastguard Worker					variables.CompressedApex = proptools.BoolPtr(true)
9632*333d2b36SAndroid Build Coastguard Worker				}))
9633*333d2b36SAndroid Build Coastguard Worker			javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9634*333d2b36SAndroid Build Coastguard Worker			data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9635*333d2b36SAndroid Build Coastguard Worker			android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9636*333d2b36SAndroid Build Coastguard Worker		})
9637*333d2b36SAndroid Build Coastguard Worker	}
9638*333d2b36SAndroid Build Coastguard Worker}
9639*333d2b36SAndroid Build Coastguard Worker
9640*333d2b36SAndroid Build Coastguard Workerfunc TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9641*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
9642*333d2b36SAndroid Build Coastguard Worker	preparer := android.GroupFixturePreparers(
9643*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithApexBuildComponents,
9644*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithMyapex,
9645*333d2b36SAndroid Build Coastguard Worker		java.PrepareForTestWithJavaSdkLibraryFiles,
9646*333d2b36SAndroid Build Coastguard Worker		java.PrepareForTestWithJavaDefaultModules,
9647*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithAndroidBuildComponents,
9648*333d2b36SAndroid Build Coastguard Worker		dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9649*333d2b36SAndroid Build Coastguard Worker		dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9650*333d2b36SAndroid Build Coastguard Worker	)
9651*333d2b36SAndroid Build Coastguard Worker
9652*333d2b36SAndroid Build Coastguard Worker	// Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9653*333d2b36SAndroid Build Coastguard Worker	t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9654*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
9655*333d2b36SAndroid Build Coastguard Worker		preparer.RunTestWithBp(t, `
9656*333d2b36SAndroid Build Coastguard Worker			apex {
9657*333d2b36SAndroid Build Coastguard Worker				name: "myapex",
9658*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
9659*333d2b36SAndroid Build Coastguard Worker				bootclasspath_fragments: ["mybootclasspathfragment"],
9660*333d2b36SAndroid Build Coastguard Worker				min_sdk_version: "30",
9661*333d2b36SAndroid Build Coastguard Worker				updatable: false,
9662*333d2b36SAndroid Build Coastguard Worker			}
9663*333d2b36SAndroid Build Coastguard Worker
9664*333d2b36SAndroid Build Coastguard Worker			apex_key {
9665*333d2b36SAndroid Build Coastguard Worker				name: "myapex.key",
9666*333d2b36SAndroid Build Coastguard Worker				public_key: "testkey.avbpubkey",
9667*333d2b36SAndroid Build Coastguard Worker				private_key: "testkey.pem",
9668*333d2b36SAndroid Build Coastguard Worker			}
9669*333d2b36SAndroid Build Coastguard Worker
9670*333d2b36SAndroid Build Coastguard Worker			bootclasspath_fragment {
9671*333d2b36SAndroid Build Coastguard Worker				name: "mybootclasspathfragment",
9672*333d2b36SAndroid Build Coastguard Worker				contents: ["mybootclasspathlib"],
9673*333d2b36SAndroid Build Coastguard Worker				apex_available: ["myapex"],
9674*333d2b36SAndroid Build Coastguard Worker				hidden_api: {
9675*333d2b36SAndroid Build Coastguard Worker					split_packages: ["*"],
9676*333d2b36SAndroid Build Coastguard Worker				},
9677*333d2b36SAndroid Build Coastguard Worker			}
9678*333d2b36SAndroid Build Coastguard Worker
9679*333d2b36SAndroid Build Coastguard Worker			java_sdk_library {
9680*333d2b36SAndroid Build Coastguard Worker				name: "mybootclasspathlib",
9681*333d2b36SAndroid Build Coastguard Worker				srcs: ["mybootclasspathlib.java"],
9682*333d2b36SAndroid Build Coastguard Worker				apex_available: ["myapex"],
9683*333d2b36SAndroid Build Coastguard Worker				compile_dex: true,
9684*333d2b36SAndroid Build Coastguard Worker				unsafe_ignore_missing_latest_api: true,
9685*333d2b36SAndroid Build Coastguard Worker				min_sdk_version: "31",
9686*333d2b36SAndroid Build Coastguard Worker				static_libs: ["util"],
9687*333d2b36SAndroid Build Coastguard Worker				sdk_version: "core_current",
9688*333d2b36SAndroid Build Coastguard Worker			}
9689*333d2b36SAndroid Build Coastguard Worker
9690*333d2b36SAndroid Build Coastguard Worker			java_library {
9691*333d2b36SAndroid Build Coastguard Worker				name: "util",
9692*333d2b36SAndroid Build Coastguard Worker                srcs: ["a.java"],
9693*333d2b36SAndroid Build Coastguard Worker				apex_available: ["myapex"],
9694*333d2b36SAndroid Build Coastguard Worker				min_sdk_version: "31",
9695*333d2b36SAndroid Build Coastguard Worker				static_libs: ["another_util"],
9696*333d2b36SAndroid Build Coastguard Worker				sdk_version: "core_current",
9697*333d2b36SAndroid Build Coastguard Worker			}
9698*333d2b36SAndroid Build Coastguard Worker
9699*333d2b36SAndroid Build Coastguard Worker			java_library {
9700*333d2b36SAndroid Build Coastguard Worker				name: "another_util",
9701*333d2b36SAndroid Build Coastguard Worker                srcs: ["a.java"],
9702*333d2b36SAndroid Build Coastguard Worker				min_sdk_version: "31",
9703*333d2b36SAndroid Build Coastguard Worker				apex_available: ["myapex"],
9704*333d2b36SAndroid Build Coastguard Worker				sdk_version: "core_current",
9705*333d2b36SAndroid Build Coastguard Worker			}
9706*333d2b36SAndroid Build Coastguard Worker		`)
9707*333d2b36SAndroid Build Coastguard Worker	})
9708*333d2b36SAndroid Build Coastguard Worker
9709*333d2b36SAndroid Build Coastguard Worker	// Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9710*333d2b36SAndroid Build Coastguard Worker	t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9711*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
9712*333d2b36SAndroid Build Coastguard Worker		preparer.RunTestWithBp(t, `
9713*333d2b36SAndroid Build Coastguard Worker			apex {
9714*333d2b36SAndroid Build Coastguard Worker				name: "myapex",
9715*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
9716*333d2b36SAndroid Build Coastguard Worker				systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9717*333d2b36SAndroid Build Coastguard Worker				min_sdk_version: "30",
9718*333d2b36SAndroid Build Coastguard Worker				updatable: false,
9719*333d2b36SAndroid Build Coastguard Worker			}
9720*333d2b36SAndroid Build Coastguard Worker
9721*333d2b36SAndroid Build Coastguard Worker			apex_key {
9722*333d2b36SAndroid Build Coastguard Worker				name: "myapex.key",
9723*333d2b36SAndroid Build Coastguard Worker				public_key: "testkey.avbpubkey",
9724*333d2b36SAndroid Build Coastguard Worker				private_key: "testkey.pem",
9725*333d2b36SAndroid Build Coastguard Worker			}
9726*333d2b36SAndroid Build Coastguard Worker
9727*333d2b36SAndroid Build Coastguard Worker			systemserverclasspath_fragment {
9728*333d2b36SAndroid Build Coastguard Worker				name: "mysystemserverclasspathfragment",
9729*333d2b36SAndroid Build Coastguard Worker				contents: ["mysystemserverclasspathlib"],
9730*333d2b36SAndroid Build Coastguard Worker				apex_available: ["myapex"],
9731*333d2b36SAndroid Build Coastguard Worker			}
9732*333d2b36SAndroid Build Coastguard Worker
9733*333d2b36SAndroid Build Coastguard Worker			java_sdk_library {
9734*333d2b36SAndroid Build Coastguard Worker				name: "mysystemserverclasspathlib",
9735*333d2b36SAndroid Build Coastguard Worker				srcs: ["mysystemserverclasspathlib.java"],
9736*333d2b36SAndroid Build Coastguard Worker				apex_available: ["myapex"],
9737*333d2b36SAndroid Build Coastguard Worker				compile_dex: true,
9738*333d2b36SAndroid Build Coastguard Worker				min_sdk_version: "32",
9739*333d2b36SAndroid Build Coastguard Worker				unsafe_ignore_missing_latest_api: true,
9740*333d2b36SAndroid Build Coastguard Worker				static_libs: ["util"],
9741*333d2b36SAndroid Build Coastguard Worker			}
9742*333d2b36SAndroid Build Coastguard Worker
9743*333d2b36SAndroid Build Coastguard Worker			java_library {
9744*333d2b36SAndroid Build Coastguard Worker				name: "util",
9745*333d2b36SAndroid Build Coastguard Worker                srcs: ["a.java"],
9746*333d2b36SAndroid Build Coastguard Worker				apex_available: ["myapex"],
9747*333d2b36SAndroid Build Coastguard Worker				min_sdk_version: "31",
9748*333d2b36SAndroid Build Coastguard Worker				static_libs: ["another_util"],
9749*333d2b36SAndroid Build Coastguard Worker			}
9750*333d2b36SAndroid Build Coastguard Worker
9751*333d2b36SAndroid Build Coastguard Worker			java_library {
9752*333d2b36SAndroid Build Coastguard Worker				name: "another_util",
9753*333d2b36SAndroid Build Coastguard Worker                srcs: ["a.java"],
9754*333d2b36SAndroid Build Coastguard Worker				min_sdk_version: "31",
9755*333d2b36SAndroid Build Coastguard Worker				apex_available: ["myapex"],
9756*333d2b36SAndroid Build Coastguard Worker			}
9757*333d2b36SAndroid Build Coastguard Worker		`)
9758*333d2b36SAndroid Build Coastguard Worker	})
9759*333d2b36SAndroid Build Coastguard Worker
9760*333d2b36SAndroid Build Coastguard Worker	t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9761*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
9762*333d2b36SAndroid Build Coastguard Worker		preparer.
9763*333d2b36SAndroid Build Coastguard Worker			RunTestWithBp(t, `
9764*333d2b36SAndroid Build Coastguard Worker				apex {
9765*333d2b36SAndroid Build Coastguard Worker					name: "myapex",
9766*333d2b36SAndroid Build Coastguard Worker					key: "myapex.key",
9767*333d2b36SAndroid Build Coastguard Worker					bootclasspath_fragments: ["mybootclasspathfragment"],
9768*333d2b36SAndroid Build Coastguard Worker					min_sdk_version: "30",
9769*333d2b36SAndroid Build Coastguard Worker					updatable: false,
9770*333d2b36SAndroid Build Coastguard Worker				}
9771*333d2b36SAndroid Build Coastguard Worker
9772*333d2b36SAndroid Build Coastguard Worker				apex_key {
9773*333d2b36SAndroid Build Coastguard Worker					name: "myapex.key",
9774*333d2b36SAndroid Build Coastguard Worker					public_key: "testkey.avbpubkey",
9775*333d2b36SAndroid Build Coastguard Worker					private_key: "testkey.pem",
9776*333d2b36SAndroid Build Coastguard Worker				}
9777*333d2b36SAndroid Build Coastguard Worker
9778*333d2b36SAndroid Build Coastguard Worker				bootclasspath_fragment {
9779*333d2b36SAndroid Build Coastguard Worker					name: "mybootclasspathfragment",
9780*333d2b36SAndroid Build Coastguard Worker					contents: ["mybootclasspathlib"],
9781*333d2b36SAndroid Build Coastguard Worker					apex_available: ["myapex"],
9782*333d2b36SAndroid Build Coastguard Worker					hidden_api: {
9783*333d2b36SAndroid Build Coastguard Worker						split_packages: ["*"],
9784*333d2b36SAndroid Build Coastguard Worker					},
9785*333d2b36SAndroid Build Coastguard Worker				}
9786*333d2b36SAndroid Build Coastguard Worker
9787*333d2b36SAndroid Build Coastguard Worker				java_sdk_library {
9788*333d2b36SAndroid Build Coastguard Worker					name: "mybootclasspathlib",
9789*333d2b36SAndroid Build Coastguard Worker					srcs: ["mybootclasspathlib.java"],
9790*333d2b36SAndroid Build Coastguard Worker					apex_available: ["myapex"],
9791*333d2b36SAndroid Build Coastguard Worker					compile_dex: true,
9792*333d2b36SAndroid Build Coastguard Worker					unsafe_ignore_missing_latest_api: true,
9793*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
9794*333d2b36SAndroid Build Coastguard Worker					min_sdk_version: "30",
9795*333d2b36SAndroid Build Coastguard Worker				}
9796*333d2b36SAndroid Build Coastguard Worker		`)
9797*333d2b36SAndroid Build Coastguard Worker	})
9798*333d2b36SAndroid Build Coastguard Worker
9799*333d2b36SAndroid Build Coastguard Worker	t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9800*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
9801*333d2b36SAndroid Build Coastguard Worker		preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9802*333d2b36SAndroid Build Coastguard Worker			RunTestWithBp(t, `
9803*333d2b36SAndroid Build Coastguard Worker				apex {
9804*333d2b36SAndroid Build Coastguard Worker					name: "myapex",
9805*333d2b36SAndroid Build Coastguard Worker					key: "myapex.key",
9806*333d2b36SAndroid Build Coastguard Worker					systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9807*333d2b36SAndroid Build Coastguard Worker					min_sdk_version: "30",
9808*333d2b36SAndroid Build Coastguard Worker					updatable: false,
9809*333d2b36SAndroid Build Coastguard Worker				}
9810*333d2b36SAndroid Build Coastguard Worker
9811*333d2b36SAndroid Build Coastguard Worker				apex_key {
9812*333d2b36SAndroid Build Coastguard Worker					name: "myapex.key",
9813*333d2b36SAndroid Build Coastguard Worker					public_key: "testkey.avbpubkey",
9814*333d2b36SAndroid Build Coastguard Worker					private_key: "testkey.pem",
9815*333d2b36SAndroid Build Coastguard Worker				}
9816*333d2b36SAndroid Build Coastguard Worker
9817*333d2b36SAndroid Build Coastguard Worker				systemserverclasspath_fragment {
9818*333d2b36SAndroid Build Coastguard Worker					name: "mysystemserverclasspathfragment",
9819*333d2b36SAndroid Build Coastguard Worker					contents: ["mysystemserverclasspathlib"],
9820*333d2b36SAndroid Build Coastguard Worker					apex_available: ["myapex"],
9821*333d2b36SAndroid Build Coastguard Worker				}
9822*333d2b36SAndroid Build Coastguard Worker
9823*333d2b36SAndroid Build Coastguard Worker				java_sdk_library {
9824*333d2b36SAndroid Build Coastguard Worker					name: "mysystemserverclasspathlib",
9825*333d2b36SAndroid Build Coastguard Worker					srcs: ["mysystemserverclasspathlib.java"],
9826*333d2b36SAndroid Build Coastguard Worker					apex_available: ["myapex"],
9827*333d2b36SAndroid Build Coastguard Worker					compile_dex: true,
9828*333d2b36SAndroid Build Coastguard Worker					unsafe_ignore_missing_latest_api: true,
9829*333d2b36SAndroid Build Coastguard Worker				}
9830*333d2b36SAndroid Build Coastguard Worker		`)
9831*333d2b36SAndroid Build Coastguard Worker	})
9832*333d2b36SAndroid Build Coastguard Worker}
9833*333d2b36SAndroid Build Coastguard Worker
9834*333d2b36SAndroid Build Coastguard Worker// Verifies that the APEX depends on all the Make modules in the list.
9835*333d2b36SAndroid Build Coastguard Workerfunc ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9836*333d2b36SAndroid Build Coastguard Worker	a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9837*333d2b36SAndroid Build Coastguard Worker	for _, dep := range deps {
9838*333d2b36SAndroid Build Coastguard Worker		android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
9839*333d2b36SAndroid Build Coastguard Worker	}
9840*333d2b36SAndroid Build Coastguard Worker}
9841*333d2b36SAndroid Build Coastguard Worker
9842*333d2b36SAndroid Build Coastguard Worker// Verifies that the APEX does not depend on any of the Make modules in the list.
9843*333d2b36SAndroid Build Coastguard Workerfunc ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9844*333d2b36SAndroid Build Coastguard Worker	a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9845*333d2b36SAndroid Build Coastguard Worker	for _, dep := range deps {
9846*333d2b36SAndroid Build Coastguard Worker		android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
9847*333d2b36SAndroid Build Coastguard Worker	}
9848*333d2b36SAndroid Build Coastguard Worker}
9849*333d2b36SAndroid Build Coastguard Worker
9850*333d2b36SAndroid Build Coastguard Workerfunc TestApexStrictUpdtabilityLint(t *testing.T) {
9851*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
9852*333d2b36SAndroid Build Coastguard Worker	bpTemplate := `
9853*333d2b36SAndroid Build Coastguard Worker		apex {
9854*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
9855*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
9856*333d2b36SAndroid Build Coastguard Worker			java_libs: ["myjavalib"],
9857*333d2b36SAndroid Build Coastguard Worker			updatable: %v,
9858*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
9859*333d2b36SAndroid Build Coastguard Worker		}
9860*333d2b36SAndroid Build Coastguard Worker		apex_key {
9861*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
9862*333d2b36SAndroid Build Coastguard Worker		}
9863*333d2b36SAndroid Build Coastguard Worker		java_library {
9864*333d2b36SAndroid Build Coastguard Worker			name: "myjavalib",
9865*333d2b36SAndroid Build Coastguard Worker			srcs: ["MyClass.java"],
9866*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
9867*333d2b36SAndroid Build Coastguard Worker			lint: {
9868*333d2b36SAndroid Build Coastguard Worker				strict_updatability_linting: %v,
9869*333d2b36SAndroid Build Coastguard Worker				%s
9870*333d2b36SAndroid Build Coastguard Worker			},
9871*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
9872*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
9873*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
9874*333d2b36SAndroid Build Coastguard Worker		}
9875*333d2b36SAndroid Build Coastguard Worker		`
9876*333d2b36SAndroid Build Coastguard Worker	fs := android.MockFS{
9877*333d2b36SAndroid Build Coastguard Worker		"lint-baseline.xml": nil,
9878*333d2b36SAndroid Build Coastguard Worker	}
9879*333d2b36SAndroid Build Coastguard Worker
9880*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
9881*333d2b36SAndroid Build Coastguard Worker		testCaseName                    string
9882*333d2b36SAndroid Build Coastguard Worker		apexUpdatable                   bool
9883*333d2b36SAndroid Build Coastguard Worker		javaStrictUpdtabilityLint       bool
9884*333d2b36SAndroid Build Coastguard Worker		lintFileExists                  bool
9885*333d2b36SAndroid Build Coastguard Worker		disallowedFlagExpectedOnApex    bool
9886*333d2b36SAndroid Build Coastguard Worker		disallowedFlagExpectedOnJavalib bool
9887*333d2b36SAndroid Build Coastguard Worker	}{
9888*333d2b36SAndroid Build Coastguard Worker		{
9889*333d2b36SAndroid Build Coastguard Worker			testCaseName:                    "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9890*333d2b36SAndroid Build Coastguard Worker			apexUpdatable:                   true,
9891*333d2b36SAndroid Build Coastguard Worker			javaStrictUpdtabilityLint:       true,
9892*333d2b36SAndroid Build Coastguard Worker			lintFileExists:                  false,
9893*333d2b36SAndroid Build Coastguard Worker			disallowedFlagExpectedOnApex:    false,
9894*333d2b36SAndroid Build Coastguard Worker			disallowedFlagExpectedOnJavalib: false,
9895*333d2b36SAndroid Build Coastguard Worker		},
9896*333d2b36SAndroid Build Coastguard Worker		{
9897*333d2b36SAndroid Build Coastguard Worker			testCaseName:                    "non-updatable apex respects strict_updatability of javalib",
9898*333d2b36SAndroid Build Coastguard Worker			apexUpdatable:                   false,
9899*333d2b36SAndroid Build Coastguard Worker			javaStrictUpdtabilityLint:       false,
9900*333d2b36SAndroid Build Coastguard Worker			lintFileExists:                  true,
9901*333d2b36SAndroid Build Coastguard Worker			disallowedFlagExpectedOnApex:    false,
9902*333d2b36SAndroid Build Coastguard Worker			disallowedFlagExpectedOnJavalib: false,
9903*333d2b36SAndroid Build Coastguard Worker		},
9904*333d2b36SAndroid Build Coastguard Worker		{
9905*333d2b36SAndroid Build Coastguard Worker			testCaseName:                    "non-updatable apex respects strict updatability of javalib",
9906*333d2b36SAndroid Build Coastguard Worker			apexUpdatable:                   false,
9907*333d2b36SAndroid Build Coastguard Worker			javaStrictUpdtabilityLint:       true,
9908*333d2b36SAndroid Build Coastguard Worker			lintFileExists:                  true,
9909*333d2b36SAndroid Build Coastguard Worker			disallowedFlagExpectedOnApex:    false,
9910*333d2b36SAndroid Build Coastguard Worker			disallowedFlagExpectedOnJavalib: true,
9911*333d2b36SAndroid Build Coastguard Worker		},
9912*333d2b36SAndroid Build Coastguard Worker		{
9913*333d2b36SAndroid Build Coastguard Worker			testCaseName:                    "updatable apex checks strict updatability of javalib",
9914*333d2b36SAndroid Build Coastguard Worker			apexUpdatable:                   true,
9915*333d2b36SAndroid Build Coastguard Worker			javaStrictUpdtabilityLint:       false,
9916*333d2b36SAndroid Build Coastguard Worker			lintFileExists:                  true,
9917*333d2b36SAndroid Build Coastguard Worker			disallowedFlagExpectedOnApex:    true,
9918*333d2b36SAndroid Build Coastguard Worker			disallowedFlagExpectedOnJavalib: false,
9919*333d2b36SAndroid Build Coastguard Worker		},
9920*333d2b36SAndroid Build Coastguard Worker	}
9921*333d2b36SAndroid Build Coastguard Worker
9922*333d2b36SAndroid Build Coastguard Worker	for _, testCase := range testCases {
9923*333d2b36SAndroid Build Coastguard Worker		t.Run(testCase.testCaseName, func(t *testing.T) {
9924*333d2b36SAndroid Build Coastguard Worker			t.Parallel()
9925*333d2b36SAndroid Build Coastguard Worker			fixtures := []android.FixturePreparer{}
9926*333d2b36SAndroid Build Coastguard Worker			baselineProperty := ""
9927*333d2b36SAndroid Build Coastguard Worker			if testCase.lintFileExists {
9928*333d2b36SAndroid Build Coastguard Worker				fixtures = append(fixtures, fs.AddToFixture())
9929*333d2b36SAndroid Build Coastguard Worker				baselineProperty = "baseline_filename: \"lint-baseline.xml\""
9930*333d2b36SAndroid Build Coastguard Worker			}
9931*333d2b36SAndroid Build Coastguard Worker			bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
9932*333d2b36SAndroid Build Coastguard Worker
9933*333d2b36SAndroid Build Coastguard Worker			result := testApex(t, bp, fixtures...)
9934*333d2b36SAndroid Build Coastguard Worker
9935*333d2b36SAndroid Build Coastguard Worker			checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
9936*333d2b36SAndroid Build Coastguard Worker				if expectStrictUpdatability {
9937*333d2b36SAndroid Build Coastguard Worker					if m.Rule == nil {
9938*333d2b36SAndroid Build Coastguard Worker						t.Errorf("expected strict updatability check rule on %s", name)
9939*333d2b36SAndroid Build Coastguard Worker					} else {
9940*333d2b36SAndroid Build Coastguard Worker						android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
9941*333d2b36SAndroid Build Coastguard Worker							m.RuleParams.Command, "--disallowed_issues NewApi")
9942*333d2b36SAndroid Build Coastguard Worker						android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
9943*333d2b36SAndroid Build Coastguard Worker							m.Inputs.Strings(), "lint-baseline.xml")
9944*333d2b36SAndroid Build Coastguard Worker					}
9945*333d2b36SAndroid Build Coastguard Worker				} else {
9946*333d2b36SAndroid Build Coastguard Worker					if m.Rule != nil {
9947*333d2b36SAndroid Build Coastguard Worker						t.Errorf("expected no strict updatability check rule on %s", name)
9948*333d2b36SAndroid Build Coastguard Worker					}
9949*333d2b36SAndroid Build Coastguard Worker				}
9950*333d2b36SAndroid Build Coastguard Worker			}
9951*333d2b36SAndroid Build Coastguard Worker
9952*333d2b36SAndroid Build Coastguard Worker			myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9953*333d2b36SAndroid Build Coastguard Worker			apex := result.ModuleForTests("myapex", "android_common_myapex")
9954*333d2b36SAndroid Build Coastguard Worker			apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
9955*333d2b36SAndroid Build Coastguard Worker			javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
9956*333d2b36SAndroid Build Coastguard Worker
9957*333d2b36SAndroid Build Coastguard Worker			checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
9958*333d2b36SAndroid Build Coastguard Worker			checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
9959*333d2b36SAndroid Build Coastguard Worker		})
9960*333d2b36SAndroid Build Coastguard Worker	}
9961*333d2b36SAndroid Build Coastguard Worker}
9962*333d2b36SAndroid Build Coastguard Worker
9963*333d2b36SAndroid Build Coastguard Worker// checks transtive deps of an apex coming from bootclasspath_fragment
9964*333d2b36SAndroid Build Coastguard Workerfunc TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9965*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
9966*333d2b36SAndroid Build Coastguard Worker	bp := `
9967*333d2b36SAndroid Build Coastguard Worker		apex {
9968*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
9969*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
9970*333d2b36SAndroid Build Coastguard Worker			bootclasspath_fragments: ["mybootclasspathfragment"],
9971*333d2b36SAndroid Build Coastguard Worker			updatable: true,
9972*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
9973*333d2b36SAndroid Build Coastguard Worker		}
9974*333d2b36SAndroid Build Coastguard Worker		apex_key {
9975*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
9976*333d2b36SAndroid Build Coastguard Worker		}
9977*333d2b36SAndroid Build Coastguard Worker		bootclasspath_fragment {
9978*333d2b36SAndroid Build Coastguard Worker			name: "mybootclasspathfragment",
9979*333d2b36SAndroid Build Coastguard Worker			contents: ["myjavalib"],
9980*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
9981*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
9982*333d2b36SAndroid Build Coastguard Worker				split_packages: ["*"],
9983*333d2b36SAndroid Build Coastguard Worker			},
9984*333d2b36SAndroid Build Coastguard Worker		}
9985*333d2b36SAndroid Build Coastguard Worker		java_library {
9986*333d2b36SAndroid Build Coastguard Worker			name: "myjavalib",
9987*333d2b36SAndroid Build Coastguard Worker			srcs: ["MyClass.java"],
9988*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
9989*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
9990*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
9991*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
9992*333d2b36SAndroid Build Coastguard Worker			lint: {
9993*333d2b36SAndroid Build Coastguard Worker				baseline_filename: "lint-baseline.xml",
9994*333d2b36SAndroid Build Coastguard Worker			}
9995*333d2b36SAndroid Build Coastguard Worker		}
9996*333d2b36SAndroid Build Coastguard Worker		`
9997*333d2b36SAndroid Build Coastguard Worker	fs := android.MockFS{
9998*333d2b36SAndroid Build Coastguard Worker		"lint-baseline.xml": nil,
9999*333d2b36SAndroid Build Coastguard Worker	}
10000*333d2b36SAndroid Build Coastguard Worker
10001*333d2b36SAndroid Build Coastguard Worker	result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10002*333d2b36SAndroid Build Coastguard Worker	apex := result.ModuleForTests("myapex", "android_common_myapex")
10003*333d2b36SAndroid Build Coastguard Worker	apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
10004*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
10005*333d2b36SAndroid Build Coastguard Worker		apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
10006*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "strict updatability check baselines for myapex",
10007*333d2b36SAndroid Build Coastguard Worker		apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
10008*333d2b36SAndroid Build Coastguard Worker}
10009*333d2b36SAndroid Build Coastguard Worker
10010*333d2b36SAndroid Build Coastguard Workerfunc TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
10011*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
10012*333d2b36SAndroid Build Coastguard Worker	bp := `
10013*333d2b36SAndroid Build Coastguard Worker		apex {
10014*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
10015*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
10016*333d2b36SAndroid Build Coastguard Worker			bootclasspath_fragments: ["mybootclasspathfragment"],
10017*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
10018*333d2b36SAndroid Build Coastguard Worker			java_libs: [
10019*333d2b36SAndroid Build Coastguard Worker				"jacocoagent",
10020*333d2b36SAndroid Build Coastguard Worker			],
10021*333d2b36SAndroid Build Coastguard Worker		}
10022*333d2b36SAndroid Build Coastguard Worker		apex_key {
10023*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
10024*333d2b36SAndroid Build Coastguard Worker		}
10025*333d2b36SAndroid Build Coastguard Worker		bootclasspath_fragment {
10026*333d2b36SAndroid Build Coastguard Worker			name: "mybootclasspathfragment",
10027*333d2b36SAndroid Build Coastguard Worker			contents: ["foo"],
10028*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
10029*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
10030*333d2b36SAndroid Build Coastguard Worker				split_packages: ["*"],
10031*333d2b36SAndroid Build Coastguard Worker			},
10032*333d2b36SAndroid Build Coastguard Worker		}
10033*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
10034*333d2b36SAndroid Build Coastguard Worker			name: "foo",
10035*333d2b36SAndroid Build Coastguard Worker			srcs: ["MyClass.java"],
10036*333d2b36SAndroid Build Coastguard Worker			apex_available: [ "myapex" ],
10037*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
10038*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
10039*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
10040*333d2b36SAndroid Build Coastguard Worker		}
10041*333d2b36SAndroid Build Coastguard Worker		`
10042*333d2b36SAndroid Build Coastguard Worker	fs := android.MockFS{
10043*333d2b36SAndroid Build Coastguard Worker		"lint-baseline.xml": nil,
10044*333d2b36SAndroid Build Coastguard Worker	}
10045*333d2b36SAndroid Build Coastguard Worker
10046*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
10047*333d2b36SAndroid Build Coastguard Worker		prepareForApexTest,
10048*333d2b36SAndroid Build Coastguard Worker		java.PrepareForTestWithJavaSdkLibraryFiles,
10049*333d2b36SAndroid Build Coastguard Worker		java.PrepareForTestWithJacocoInstrumentation,
10050*333d2b36SAndroid Build Coastguard Worker		java.FixtureWithLastReleaseApis("foo"),
10051*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(fs),
10052*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, bp)
10053*333d2b36SAndroid Build Coastguard Worker
10054*333d2b36SAndroid Build Coastguard Worker	myapex := result.ModuleForTests("myapex", "android_common_myapex")
10055*333d2b36SAndroid Build Coastguard Worker	lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10056*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t,
10057*333d2b36SAndroid Build Coastguard Worker		"myapex lint report expected to contain that of the sdk library impl lib as an input",
10058*333d2b36SAndroid Build Coastguard Worker		lintReportInputs, "foo.impl")
10059*333d2b36SAndroid Build Coastguard Worker}
10060*333d2b36SAndroid Build Coastguard Worker
10061*333d2b36SAndroid Build Coastguard Worker// updatable apexes should propagate updatable=true to its apps
10062*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10063*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
10064*333d2b36SAndroid Build Coastguard Worker	bp := `
10065*333d2b36SAndroid Build Coastguard Worker		apex {
10066*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
10067*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
10068*333d2b36SAndroid Build Coastguard Worker			updatable: true,
10069*333d2b36SAndroid Build Coastguard Worker			apps: [
10070*333d2b36SAndroid Build Coastguard Worker				"myapp",
10071*333d2b36SAndroid Build Coastguard Worker			],
10072*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "30",
10073*333d2b36SAndroid Build Coastguard Worker		}
10074*333d2b36SAndroid Build Coastguard Worker		apex_key {
10075*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
10076*333d2b36SAndroid Build Coastguard Worker		}
10077*333d2b36SAndroid Build Coastguard Worker		android_app {
10078*333d2b36SAndroid Build Coastguard Worker			name: "myapp",
10079*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10080*333d2b36SAndroid Build Coastguard Worker				"myapex",
10081*333d2b36SAndroid Build Coastguard Worker			],
10082*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
10083*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "30",
10084*333d2b36SAndroid Build Coastguard Worker		}
10085*333d2b36SAndroid Build Coastguard Worker		`
10086*333d2b36SAndroid Build Coastguard Worker	_ = android.GroupFixturePreparers(
10087*333d2b36SAndroid Build Coastguard Worker		prepareForApexTest,
10088*333d2b36SAndroid Build Coastguard Worker	).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
10089*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, bp)
10090*333d2b36SAndroid Build Coastguard Worker}
10091*333d2b36SAndroid Build Coastguard Worker
10092*333d2b36SAndroid Build Coastguard Workerfunc TestCannedFsConfig(t *testing.T) {
10093*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
10094*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
10095*333d2b36SAndroid Build Coastguard Worker		apex {
10096*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
10097*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
10098*333d2b36SAndroid Build Coastguard Worker			updatable: false,
10099*333d2b36SAndroid Build Coastguard Worker		}
10100*333d2b36SAndroid Build Coastguard Worker
10101*333d2b36SAndroid Build Coastguard Worker		apex_key {
10102*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
10103*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
10104*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
10105*333d2b36SAndroid Build Coastguard Worker		}`)
10106*333d2b36SAndroid Build Coastguard Worker	mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10107*333d2b36SAndroid Build Coastguard Worker	generateFsRule := mod.Rule("generateFsConfig")
10108*333d2b36SAndroid Build Coastguard Worker	cmd := generateFsRule.RuleParams.Command
10109*333d2b36SAndroid Build Coastguard Worker
10110*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10111*333d2b36SAndroid Build Coastguard Worker}
10112*333d2b36SAndroid Build Coastguard Worker
10113*333d2b36SAndroid Build Coastguard Workerfunc TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10114*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
10115*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
10116*333d2b36SAndroid Build Coastguard Worker		apex {
10117*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
10118*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
10119*333d2b36SAndroid Build Coastguard Worker			canned_fs_config: "my_config",
10120*333d2b36SAndroid Build Coastguard Worker			updatable: false,
10121*333d2b36SAndroid Build Coastguard Worker		}
10122*333d2b36SAndroid Build Coastguard Worker
10123*333d2b36SAndroid Build Coastguard Worker		apex_key {
10124*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
10125*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
10126*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
10127*333d2b36SAndroid Build Coastguard Worker		}`)
10128*333d2b36SAndroid Build Coastguard Worker	mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10129*333d2b36SAndroid Build Coastguard Worker	generateFsRule := mod.Rule("generateFsConfig")
10130*333d2b36SAndroid Build Coastguard Worker	cmd := generateFsRule.RuleParams.Command
10131*333d2b36SAndroid Build Coastguard Worker
10132*333d2b36SAndroid Build Coastguard Worker	// Ensure that canned_fs_config has "cat my_config" at the end
10133*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10134*333d2b36SAndroid Build Coastguard Worker}
10135*333d2b36SAndroid Build Coastguard Worker
10136*333d2b36SAndroid Build Coastguard Workerfunc TestStubLibrariesMultipleApexViolation(t *testing.T) {
10137*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
10138*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
10139*333d2b36SAndroid Build Coastguard Worker		desc          string
10140*333d2b36SAndroid Build Coastguard Worker		hasStubs      bool
10141*333d2b36SAndroid Build Coastguard Worker		apexAvailable string
10142*333d2b36SAndroid Build Coastguard Worker		expectedError string
10143*333d2b36SAndroid Build Coastguard Worker	}{
10144*333d2b36SAndroid Build Coastguard Worker		{
10145*333d2b36SAndroid Build Coastguard Worker			desc:          "non-stub library can have multiple apex_available",
10146*333d2b36SAndroid Build Coastguard Worker			hasStubs:      false,
10147*333d2b36SAndroid Build Coastguard Worker			apexAvailable: `["myapex", "otherapex"]`,
10148*333d2b36SAndroid Build Coastguard Worker		},
10149*333d2b36SAndroid Build Coastguard Worker		{
10150*333d2b36SAndroid Build Coastguard Worker			desc:          "stub library should not be available to anyapex",
10151*333d2b36SAndroid Build Coastguard Worker			hasStubs:      true,
10152*333d2b36SAndroid Build Coastguard Worker			apexAvailable: `["//apex_available:anyapex"]`,
10153*333d2b36SAndroid Build Coastguard Worker			expectedError: "Stub libraries should have a single apex_available.*anyapex",
10154*333d2b36SAndroid Build Coastguard Worker		},
10155*333d2b36SAndroid Build Coastguard Worker		{
10156*333d2b36SAndroid Build Coastguard Worker			desc:          "stub library should not be available to multiple apexes",
10157*333d2b36SAndroid Build Coastguard Worker			hasStubs:      true,
10158*333d2b36SAndroid Build Coastguard Worker			apexAvailable: `["myapex", "otherapex"]`,
10159*333d2b36SAndroid Build Coastguard Worker			expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10160*333d2b36SAndroid Build Coastguard Worker		},
10161*333d2b36SAndroid Build Coastguard Worker		{
10162*333d2b36SAndroid Build Coastguard Worker			desc:          "stub library can be available to a core apex and a test apex",
10163*333d2b36SAndroid Build Coastguard Worker			hasStubs:      true,
10164*333d2b36SAndroid Build Coastguard Worker			apexAvailable: `["myapex", "test_myapex"]`,
10165*333d2b36SAndroid Build Coastguard Worker		},
10166*333d2b36SAndroid Build Coastguard Worker	}
10167*333d2b36SAndroid Build Coastguard Worker	bpTemplate := `
10168*333d2b36SAndroid Build Coastguard Worker		cc_library {
10169*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
10170*333d2b36SAndroid Build Coastguard Worker			%v
10171*333d2b36SAndroid Build Coastguard Worker			apex_available: %v,
10172*333d2b36SAndroid Build Coastguard Worker		}
10173*333d2b36SAndroid Build Coastguard Worker		apex {
10174*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
10175*333d2b36SAndroid Build Coastguard Worker			key: "apex.key",
10176*333d2b36SAndroid Build Coastguard Worker			updatable: false,
10177*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["libfoo"],
10178*333d2b36SAndroid Build Coastguard Worker		}
10179*333d2b36SAndroid Build Coastguard Worker		apex {
10180*333d2b36SAndroid Build Coastguard Worker			name: "otherapex",
10181*333d2b36SAndroid Build Coastguard Worker			key: "apex.key",
10182*333d2b36SAndroid Build Coastguard Worker			updatable: false,
10183*333d2b36SAndroid Build Coastguard Worker		}
10184*333d2b36SAndroid Build Coastguard Worker		apex_test {
10185*333d2b36SAndroid Build Coastguard Worker			name: "test_myapex",
10186*333d2b36SAndroid Build Coastguard Worker			key: "apex.key",
10187*333d2b36SAndroid Build Coastguard Worker			updatable: false,
10188*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["libfoo"],
10189*333d2b36SAndroid Build Coastguard Worker		}
10190*333d2b36SAndroid Build Coastguard Worker		apex_key {
10191*333d2b36SAndroid Build Coastguard Worker			name: "apex.key",
10192*333d2b36SAndroid Build Coastguard Worker		}
10193*333d2b36SAndroid Build Coastguard Worker	`
10194*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testCases {
10195*333d2b36SAndroid Build Coastguard Worker		stubs := ""
10196*333d2b36SAndroid Build Coastguard Worker		if tc.hasStubs {
10197*333d2b36SAndroid Build Coastguard Worker			stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10198*333d2b36SAndroid Build Coastguard Worker		}
10199*333d2b36SAndroid Build Coastguard Worker		bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10200*333d2b36SAndroid Build Coastguard Worker		mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10201*333d2b36SAndroid Build Coastguard Worker			fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10202*333d2b36SAndroid Build Coastguard Worker		})
10203*333d2b36SAndroid Build Coastguard Worker		if tc.expectedError == "" {
10204*333d2b36SAndroid Build Coastguard Worker			testApex(t, bp, mockFsFixturePreparer)
10205*333d2b36SAndroid Build Coastguard Worker		} else {
10206*333d2b36SAndroid Build Coastguard Worker			testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10207*333d2b36SAndroid Build Coastguard Worker		}
10208*333d2b36SAndroid Build Coastguard Worker	}
10209*333d2b36SAndroid Build Coastguard Worker}
10210*333d2b36SAndroid Build Coastguard Worker
10211*333d2b36SAndroid Build Coastguard Workerfunc TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10212*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
10213*333d2b36SAndroid Build Coastguard Worker	context := android.GroupFixturePreparers(
10214*333d2b36SAndroid Build Coastguard Worker		android.PrepareForIntegrationTestWithAndroid,
10215*333d2b36SAndroid Build Coastguard Worker		cc.PrepareForIntegrationTestWithCc,
10216*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithApexBuildComponents,
10217*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithMyapex,
10218*333d2b36SAndroid Build Coastguard Worker		filesystem.PrepareForTestWithFilesystemBuildComponents,
10219*333d2b36SAndroid Build Coastguard Worker	)
10220*333d2b36SAndroid Build Coastguard Worker	result := context.RunTestWithBp(t, `
10221*333d2b36SAndroid Build Coastguard Worker		android_system_image {
10222*333d2b36SAndroid Build Coastguard Worker			name: "myfilesystem",
10223*333d2b36SAndroid Build Coastguard Worker			deps: [
10224*333d2b36SAndroid Build Coastguard Worker				"libfoo",
10225*333d2b36SAndroid Build Coastguard Worker			],
10226*333d2b36SAndroid Build Coastguard Worker			linker_config: {
10227*333d2b36SAndroid Build Coastguard Worker				gen_linker_config: true,
10228*333d2b36SAndroid Build Coastguard Worker				linker_config_srcs: ["linker.config.json"],
10229*333d2b36SAndroid Build Coastguard Worker			},
10230*333d2b36SAndroid Build Coastguard Worker		}
10231*333d2b36SAndroid Build Coastguard Worker
10232*333d2b36SAndroid Build Coastguard Worker		cc_library {
10233*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
10234*333d2b36SAndroid Build Coastguard Worker			shared_libs: [
10235*333d2b36SAndroid Build Coastguard Worker				"libbar",
10236*333d2b36SAndroid Build Coastguard Worker			],
10237*333d2b36SAndroid Build Coastguard Worker			stl: "none",
10238*333d2b36SAndroid Build Coastguard Worker		}
10239*333d2b36SAndroid Build Coastguard Worker
10240*333d2b36SAndroid Build Coastguard Worker		cc_library {
10241*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
10242*333d2b36SAndroid Build Coastguard Worker			stl: "none",
10243*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
10244*333d2b36SAndroid Build Coastguard Worker		}
10245*333d2b36SAndroid Build Coastguard Worker
10246*333d2b36SAndroid Build Coastguard Worker		apex {
10247*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
10248*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["libbar"],
10249*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
10250*333d2b36SAndroid Build Coastguard Worker			updatable: false,
10251*333d2b36SAndroid Build Coastguard Worker		}
10252*333d2b36SAndroid Build Coastguard Worker
10253*333d2b36SAndroid Build Coastguard Worker		apex_key {
10254*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
10255*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
10256*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
10257*333d2b36SAndroid Build Coastguard Worker		}
10258*333d2b36SAndroid Build Coastguard Worker	`)
10259*333d2b36SAndroid Build Coastguard Worker
10260*333d2b36SAndroid Build Coastguard Worker	inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
10261*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10262*333d2b36SAndroid Build Coastguard Worker		inputs.Strings(),
10263*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10264*333d2b36SAndroid Build Coastguard Worker}
10265*333d2b36SAndroid Build Coastguard Worker
10266*333d2b36SAndroid Build Coastguard Workervar apex_default_bp = `
10267*333d2b36SAndroid Build Coastguard Worker		apex_key {
10268*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
10269*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
10270*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
10271*333d2b36SAndroid Build Coastguard Worker		}
10272*333d2b36SAndroid Build Coastguard Worker
10273*333d2b36SAndroid Build Coastguard Worker		filegroup {
10274*333d2b36SAndroid Build Coastguard Worker			name: "myapex.manifest",
10275*333d2b36SAndroid Build Coastguard Worker			srcs: ["apex_manifest.json"],
10276*333d2b36SAndroid Build Coastguard Worker		}
10277*333d2b36SAndroid Build Coastguard Worker
10278*333d2b36SAndroid Build Coastguard Worker		filegroup {
10279*333d2b36SAndroid Build Coastguard Worker			name: "myapex.androidmanifest",
10280*333d2b36SAndroid Build Coastguard Worker			srcs: ["AndroidManifest.xml"],
10281*333d2b36SAndroid Build Coastguard Worker		}
10282*333d2b36SAndroid Build Coastguard Worker`
10283*333d2b36SAndroid Build Coastguard Worker
10284*333d2b36SAndroid Build Coastguard Workerfunc TestAconfigFilesJavaDeps(t *testing.T) {
10285*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
10286*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, apex_default_bp+`
10287*333d2b36SAndroid Build Coastguard Worker		apex {
10288*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
10289*333d2b36SAndroid Build Coastguard Worker			manifest: ":myapex.manifest",
10290*333d2b36SAndroid Build Coastguard Worker			androidManifest: ":myapex.androidmanifest",
10291*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
10292*333d2b36SAndroid Build Coastguard Worker			java_libs: [
10293*333d2b36SAndroid Build Coastguard Worker				"my_java_library_foo",
10294*333d2b36SAndroid Build Coastguard Worker				"my_java_library_bar",
10295*333d2b36SAndroid Build Coastguard Worker			],
10296*333d2b36SAndroid Build Coastguard Worker			updatable: false,
10297*333d2b36SAndroid Build Coastguard Worker		}
10298*333d2b36SAndroid Build Coastguard Worker
10299*333d2b36SAndroid Build Coastguard Worker		java_library {
10300*333d2b36SAndroid Build Coastguard Worker			name: "my_java_library_foo",
10301*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
10302*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
10303*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
10304*333d2b36SAndroid Build Coastguard Worker			static_libs: ["my_java_aconfig_library_foo"],
10305*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10306*333d2b36SAndroid Build Coastguard Worker				"myapex",
10307*333d2b36SAndroid Build Coastguard Worker			],
10308*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
10309*333d2b36SAndroid Build Coastguard Worker		}
10310*333d2b36SAndroid Build Coastguard Worker
10311*333d2b36SAndroid Build Coastguard Worker		java_library {
10312*333d2b36SAndroid Build Coastguard Worker			name: "my_java_library_bar",
10313*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
10314*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
10315*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
10316*333d2b36SAndroid Build Coastguard Worker			static_libs: ["my_java_aconfig_library_bar"],
10317*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10318*333d2b36SAndroid Build Coastguard Worker				"myapex",
10319*333d2b36SAndroid Build Coastguard Worker			],
10320*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
10321*333d2b36SAndroid Build Coastguard Worker		}
10322*333d2b36SAndroid Build Coastguard Worker
10323*333d2b36SAndroid Build Coastguard Worker		aconfig_declarations {
10324*333d2b36SAndroid Build Coastguard Worker			name: "my_aconfig_declarations_foo",
10325*333d2b36SAndroid Build Coastguard Worker			package: "com.example.package",
10326*333d2b36SAndroid Build Coastguard Worker			container: "myapex",
10327*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.aconfig"],
10328*333d2b36SAndroid Build Coastguard Worker		}
10329*333d2b36SAndroid Build Coastguard Worker
10330*333d2b36SAndroid Build Coastguard Worker		java_aconfig_library {
10331*333d2b36SAndroid Build Coastguard Worker			name: "my_java_aconfig_library_foo",
10332*333d2b36SAndroid Build Coastguard Worker			aconfig_declarations: "my_aconfig_declarations_foo",
10333*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10334*333d2b36SAndroid Build Coastguard Worker				"myapex",
10335*333d2b36SAndroid Build Coastguard Worker			],
10336*333d2b36SAndroid Build Coastguard Worker		}
10337*333d2b36SAndroid Build Coastguard Worker
10338*333d2b36SAndroid Build Coastguard Worker		aconfig_declarations {
10339*333d2b36SAndroid Build Coastguard Worker			name: "my_aconfig_declarations_bar",
10340*333d2b36SAndroid Build Coastguard Worker			package: "com.example.package",
10341*333d2b36SAndroid Build Coastguard Worker			container: "myapex",
10342*333d2b36SAndroid Build Coastguard Worker			srcs: ["bar.aconfig"],
10343*333d2b36SAndroid Build Coastguard Worker		}
10344*333d2b36SAndroid Build Coastguard Worker
10345*333d2b36SAndroid Build Coastguard Worker		java_aconfig_library {
10346*333d2b36SAndroid Build Coastguard Worker			name: "my_java_aconfig_library_bar",
10347*333d2b36SAndroid Build Coastguard Worker			aconfig_declarations: "my_aconfig_declarations_bar",
10348*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10349*333d2b36SAndroid Build Coastguard Worker				"myapex",
10350*333d2b36SAndroid Build Coastguard Worker			],
10351*333d2b36SAndroid Build Coastguard Worker		}
10352*333d2b36SAndroid Build Coastguard Worker	`)
10353*333d2b36SAndroid Build Coastguard Worker
10354*333d2b36SAndroid Build Coastguard Worker	mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10355*333d2b36SAndroid Build Coastguard Worker	s := mod.Rule("apexRule").Args["copy_commands"]
10356*333d2b36SAndroid Build Coastguard Worker	copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
10357*333d2b36SAndroid Build Coastguard Worker	if len(copyCmds) != 14 {
10358*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
10359*333d2b36SAndroid Build Coastguard Worker	}
10360*333d2b36SAndroid Build Coastguard Worker
10361*333d2b36SAndroid Build Coastguard Worker	ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10362*333d2b36SAndroid Build Coastguard Worker	ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10363*333d2b36SAndroid Build Coastguard Worker	ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10364*333d2b36SAndroid Build Coastguard Worker	ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
10365*333d2b36SAndroid Build Coastguard Worker	ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
10366*333d2b36SAndroid Build Coastguard Worker
10367*333d2b36SAndroid Build Coastguard Worker	inputs := []string{
10368*333d2b36SAndroid Build Coastguard Worker		"my_aconfig_declarations_foo/intermediate.pb",
10369*333d2b36SAndroid Build Coastguard Worker		"my_aconfig_declarations_bar/intermediate.pb",
10370*333d2b36SAndroid Build Coastguard Worker	}
10371*333d2b36SAndroid Build Coastguard Worker	VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10372*333d2b36SAndroid Build Coastguard Worker	VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10373*333d2b36SAndroid Build Coastguard Worker	VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10374*333d2b36SAndroid Build Coastguard Worker	VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
10375*333d2b36SAndroid Build Coastguard Worker	VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
10376*333d2b36SAndroid Build Coastguard Worker}
10377*333d2b36SAndroid Build Coastguard Worker
10378*333d2b36SAndroid Build Coastguard Workerfunc TestAconfigFilesJavaAndCcDeps(t *testing.T) {
10379*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
10380*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, apex_default_bp+`
10381*333d2b36SAndroid Build Coastguard Worker		apex {
10382*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
10383*333d2b36SAndroid Build Coastguard Worker			manifest: ":myapex.manifest",
10384*333d2b36SAndroid Build Coastguard Worker			androidManifest: ":myapex.androidmanifest",
10385*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
10386*333d2b36SAndroid Build Coastguard Worker			java_libs: [
10387*333d2b36SAndroid Build Coastguard Worker				"my_java_library_foo",
10388*333d2b36SAndroid Build Coastguard Worker			],
10389*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: [
10390*333d2b36SAndroid Build Coastguard Worker				"my_cc_library_bar",
10391*333d2b36SAndroid Build Coastguard Worker			],
10392*333d2b36SAndroid Build Coastguard Worker			binaries: [
10393*333d2b36SAndroid Build Coastguard Worker				"my_cc_binary_baz",
10394*333d2b36SAndroid Build Coastguard Worker			],
10395*333d2b36SAndroid Build Coastguard Worker			updatable: false,
10396*333d2b36SAndroid Build Coastguard Worker		}
10397*333d2b36SAndroid Build Coastguard Worker
10398*333d2b36SAndroid Build Coastguard Worker		java_library {
10399*333d2b36SAndroid Build Coastguard Worker			name: "my_java_library_foo",
10400*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
10401*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
10402*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
10403*333d2b36SAndroid Build Coastguard Worker			static_libs: ["my_java_aconfig_library_foo"],
10404*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10405*333d2b36SAndroid Build Coastguard Worker				"myapex",
10406*333d2b36SAndroid Build Coastguard Worker			],
10407*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
10408*333d2b36SAndroid Build Coastguard Worker		}
10409*333d2b36SAndroid Build Coastguard Worker
10410*333d2b36SAndroid Build Coastguard Worker		cc_library {
10411*333d2b36SAndroid Build Coastguard Worker			name: "my_cc_library_bar",
10412*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.cc"],
10413*333d2b36SAndroid Build Coastguard Worker			static_libs: [
10414*333d2b36SAndroid Build Coastguard Worker				"my_cc_aconfig_library_bar",
10415*333d2b36SAndroid Build Coastguard Worker				"my_cc_aconfig_library_baz",
10416*333d2b36SAndroid Build Coastguard Worker			],
10417*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10418*333d2b36SAndroid Build Coastguard Worker				"myapex",
10419*333d2b36SAndroid Build Coastguard Worker			],
10420*333d2b36SAndroid Build Coastguard Worker		}
10421*333d2b36SAndroid Build Coastguard Worker
10422*333d2b36SAndroid Build Coastguard Worker		cc_binary {
10423*333d2b36SAndroid Build Coastguard Worker			name: "my_cc_binary_baz",
10424*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.cc"],
10425*333d2b36SAndroid Build Coastguard Worker			static_libs: ["my_cc_aconfig_library_baz"],
10426*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10427*333d2b36SAndroid Build Coastguard Worker				"myapex",
10428*333d2b36SAndroid Build Coastguard Worker			],
10429*333d2b36SAndroid Build Coastguard Worker		}
10430*333d2b36SAndroid Build Coastguard Worker
10431*333d2b36SAndroid Build Coastguard Worker		aconfig_declarations {
10432*333d2b36SAndroid Build Coastguard Worker			name: "my_aconfig_declarations_foo",
10433*333d2b36SAndroid Build Coastguard Worker			package: "com.example.package",
10434*333d2b36SAndroid Build Coastguard Worker			container: "myapex",
10435*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.aconfig"],
10436*333d2b36SAndroid Build Coastguard Worker		}
10437*333d2b36SAndroid Build Coastguard Worker
10438*333d2b36SAndroid Build Coastguard Worker		java_aconfig_library {
10439*333d2b36SAndroid Build Coastguard Worker			name: "my_java_aconfig_library_foo",
10440*333d2b36SAndroid Build Coastguard Worker			aconfig_declarations: "my_aconfig_declarations_foo",
10441*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10442*333d2b36SAndroid Build Coastguard Worker				"myapex",
10443*333d2b36SAndroid Build Coastguard Worker			],
10444*333d2b36SAndroid Build Coastguard Worker		}
10445*333d2b36SAndroid Build Coastguard Worker
10446*333d2b36SAndroid Build Coastguard Worker		aconfig_declarations {
10447*333d2b36SAndroid Build Coastguard Worker			name: "my_aconfig_declarations_bar",
10448*333d2b36SAndroid Build Coastguard Worker			package: "com.example.package",
10449*333d2b36SAndroid Build Coastguard Worker			container: "myapex",
10450*333d2b36SAndroid Build Coastguard Worker			srcs: ["bar.aconfig"],
10451*333d2b36SAndroid Build Coastguard Worker		}
10452*333d2b36SAndroid Build Coastguard Worker
10453*333d2b36SAndroid Build Coastguard Worker		cc_aconfig_library {
10454*333d2b36SAndroid Build Coastguard Worker			name: "my_cc_aconfig_library_bar",
10455*333d2b36SAndroid Build Coastguard Worker			aconfig_declarations: "my_aconfig_declarations_bar",
10456*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10457*333d2b36SAndroid Build Coastguard Worker				"myapex",
10458*333d2b36SAndroid Build Coastguard Worker			],
10459*333d2b36SAndroid Build Coastguard Worker		}
10460*333d2b36SAndroid Build Coastguard Worker
10461*333d2b36SAndroid Build Coastguard Worker		aconfig_declarations {
10462*333d2b36SAndroid Build Coastguard Worker			name: "my_aconfig_declarations_baz",
10463*333d2b36SAndroid Build Coastguard Worker			package: "com.example.package",
10464*333d2b36SAndroid Build Coastguard Worker			container: "myapex",
10465*333d2b36SAndroid Build Coastguard Worker			srcs: ["baz.aconfig"],
10466*333d2b36SAndroid Build Coastguard Worker		}
10467*333d2b36SAndroid Build Coastguard Worker
10468*333d2b36SAndroid Build Coastguard Worker		cc_aconfig_library {
10469*333d2b36SAndroid Build Coastguard Worker			name: "my_cc_aconfig_library_baz",
10470*333d2b36SAndroid Build Coastguard Worker			aconfig_declarations: "my_aconfig_declarations_baz",
10471*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10472*333d2b36SAndroid Build Coastguard Worker				"myapex",
10473*333d2b36SAndroid Build Coastguard Worker			],
10474*333d2b36SAndroid Build Coastguard Worker		}
10475*333d2b36SAndroid Build Coastguard Worker
10476*333d2b36SAndroid Build Coastguard Worker		cc_library {
10477*333d2b36SAndroid Build Coastguard Worker			name: "server_configurable_flags",
10478*333d2b36SAndroid Build Coastguard Worker			srcs: ["server_configurable_flags.cc"],
10479*333d2b36SAndroid Build Coastguard Worker		}
10480*333d2b36SAndroid Build Coastguard Worker		cc_library {
10481*333d2b36SAndroid Build Coastguard Worker			name: "libbase",
10482*333d2b36SAndroid Build Coastguard Worker			srcs: ["libbase.cc"],
10483*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10484*333d2b36SAndroid Build Coastguard Worker				"myapex",
10485*333d2b36SAndroid Build Coastguard Worker			],
10486*333d2b36SAndroid Build Coastguard Worker		}
10487*333d2b36SAndroid Build Coastguard Worker		cc_library {
10488*333d2b36SAndroid Build Coastguard Worker			name: "libaconfig_storage_read_api_cc",
10489*333d2b36SAndroid Build Coastguard Worker			srcs: ["libaconfig_storage_read_api_cc.cc"],
10490*333d2b36SAndroid Build Coastguard Worker		}
10491*333d2b36SAndroid Build Coastguard Worker	`)
10492*333d2b36SAndroid Build Coastguard Worker
10493*333d2b36SAndroid Build Coastguard Worker	mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10494*333d2b36SAndroid Build Coastguard Worker	s := mod.Rule("apexRule").Args["copy_commands"]
10495*333d2b36SAndroid Build Coastguard Worker	copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
10496*333d2b36SAndroid Build Coastguard Worker	if len(copyCmds) != 18 {
10497*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
10498*333d2b36SAndroid Build Coastguard Worker	}
10499*333d2b36SAndroid Build Coastguard Worker
10500*333d2b36SAndroid Build Coastguard Worker	ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10501*333d2b36SAndroid Build Coastguard Worker	ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10502*333d2b36SAndroid Build Coastguard Worker	ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10503*333d2b36SAndroid Build Coastguard Worker	ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
10504*333d2b36SAndroid Build Coastguard Worker	ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
10505*333d2b36SAndroid Build Coastguard Worker
10506*333d2b36SAndroid Build Coastguard Worker	inputs := []string{
10507*333d2b36SAndroid Build Coastguard Worker		"my_aconfig_declarations_foo/intermediate.pb",
10508*333d2b36SAndroid Build Coastguard Worker		"my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10509*333d2b36SAndroid Build Coastguard Worker		"my_aconfig_declarations_baz/intermediate.pb",
10510*333d2b36SAndroid Build Coastguard Worker	}
10511*333d2b36SAndroid Build Coastguard Worker	VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10512*333d2b36SAndroid Build Coastguard Worker	VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10513*333d2b36SAndroid Build Coastguard Worker	VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10514*333d2b36SAndroid Build Coastguard Worker	VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
10515*333d2b36SAndroid Build Coastguard Worker	VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
10516*333d2b36SAndroid Build Coastguard Worker}
10517*333d2b36SAndroid Build Coastguard Worker
10518*333d2b36SAndroid Build Coastguard Workerfunc TestAconfigFilesRustDeps(t *testing.T) {
10519*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
10520*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, apex_default_bp+`
10521*333d2b36SAndroid Build Coastguard Worker		apex {
10522*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
10523*333d2b36SAndroid Build Coastguard Worker			manifest: ":myapex.manifest",
10524*333d2b36SAndroid Build Coastguard Worker			androidManifest: ":myapex.androidmanifest",
10525*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
10526*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: [
10527*333d2b36SAndroid Build Coastguard Worker				"libmy_rust_library",
10528*333d2b36SAndroid Build Coastguard Worker			],
10529*333d2b36SAndroid Build Coastguard Worker			binaries: [
10530*333d2b36SAndroid Build Coastguard Worker				"my_rust_binary",
10531*333d2b36SAndroid Build Coastguard Worker			],
10532*333d2b36SAndroid Build Coastguard Worker			rust_dyn_libs: [
10533*333d2b36SAndroid Build Coastguard Worker				"libmy_rust_dylib",
10534*333d2b36SAndroid Build Coastguard Worker			],
10535*333d2b36SAndroid Build Coastguard Worker			updatable: false,
10536*333d2b36SAndroid Build Coastguard Worker		}
10537*333d2b36SAndroid Build Coastguard Worker
10538*333d2b36SAndroid Build Coastguard Worker		rust_library {
10539*333d2b36SAndroid Build Coastguard Worker			name: "libflags_rust", // test mock
10540*333d2b36SAndroid Build Coastguard Worker			crate_name: "flags_rust",
10541*333d2b36SAndroid Build Coastguard Worker			srcs: ["lib.rs"],
10542*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10543*333d2b36SAndroid Build Coastguard Worker				"myapex",
10544*333d2b36SAndroid Build Coastguard Worker			],
10545*333d2b36SAndroid Build Coastguard Worker		}
10546*333d2b36SAndroid Build Coastguard Worker
10547*333d2b36SAndroid Build Coastguard Worker		rust_library {
10548*333d2b36SAndroid Build Coastguard Worker			name: "liblazy_static", // test mock
10549*333d2b36SAndroid Build Coastguard Worker			crate_name: "lazy_static",
10550*333d2b36SAndroid Build Coastguard Worker			srcs: ["src/lib.rs"],
10551*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10552*333d2b36SAndroid Build Coastguard Worker				"myapex",
10553*333d2b36SAndroid Build Coastguard Worker			],
10554*333d2b36SAndroid Build Coastguard Worker		}
10555*333d2b36SAndroid Build Coastguard Worker
10556*333d2b36SAndroid Build Coastguard Worker		rust_library {
10557*333d2b36SAndroid Build Coastguard Worker			name: "libaconfig_storage_read_api", // test mock
10558*333d2b36SAndroid Build Coastguard Worker			crate_name: "aconfig_storage_read_api",
10559*333d2b36SAndroid Build Coastguard Worker			srcs: ["src/lib.rs"],
10560*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10561*333d2b36SAndroid Build Coastguard Worker				"myapex",
10562*333d2b36SAndroid Build Coastguard Worker			],
10563*333d2b36SAndroid Build Coastguard Worker		}
10564*333d2b36SAndroid Build Coastguard Worker
10565*333d2b36SAndroid Build Coastguard Worker		rust_library {
10566*333d2b36SAndroid Build Coastguard Worker			name: "liblogger", // test mock
10567*333d2b36SAndroid Build Coastguard Worker			crate_name: "logger",
10568*333d2b36SAndroid Build Coastguard Worker			srcs: ["src/lib.rs"],
10569*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10570*333d2b36SAndroid Build Coastguard Worker				"myapex",
10571*333d2b36SAndroid Build Coastguard Worker			],
10572*333d2b36SAndroid Build Coastguard Worker		}
10573*333d2b36SAndroid Build Coastguard Worker
10574*333d2b36SAndroid Build Coastguard Worker		rust_library {
10575*333d2b36SAndroid Build Coastguard Worker			name: "liblog_rust", // test mock
10576*333d2b36SAndroid Build Coastguard Worker			crate_name: "log_rust",
10577*333d2b36SAndroid Build Coastguard Worker			srcs: ["src/lib.rs"],
10578*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10579*333d2b36SAndroid Build Coastguard Worker				"myapex",
10580*333d2b36SAndroid Build Coastguard Worker			],
10581*333d2b36SAndroid Build Coastguard Worker		}
10582*333d2b36SAndroid Build Coastguard Worker
10583*333d2b36SAndroid Build Coastguard Worker		rust_ffi_shared {
10584*333d2b36SAndroid Build Coastguard Worker			name: "libmy_rust_library",
10585*333d2b36SAndroid Build Coastguard Worker			srcs: ["src/lib.rs"],
10586*333d2b36SAndroid Build Coastguard Worker			rustlibs: ["libmy_rust_aconfig_library_foo"],
10587*333d2b36SAndroid Build Coastguard Worker			crate_name: "my_rust_library",
10588*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10589*333d2b36SAndroid Build Coastguard Worker				"myapex",
10590*333d2b36SAndroid Build Coastguard Worker			],
10591*333d2b36SAndroid Build Coastguard Worker		}
10592*333d2b36SAndroid Build Coastguard Worker
10593*333d2b36SAndroid Build Coastguard Worker		rust_library_dylib {
10594*333d2b36SAndroid Build Coastguard Worker			name: "libmy_rust_dylib",
10595*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.rs"],
10596*333d2b36SAndroid Build Coastguard Worker			rustlibs: ["libmy_rust_aconfig_library_bar"],
10597*333d2b36SAndroid Build Coastguard Worker			crate_name: "my_rust_dylib",
10598*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10599*333d2b36SAndroid Build Coastguard Worker				"myapex",
10600*333d2b36SAndroid Build Coastguard Worker			],
10601*333d2b36SAndroid Build Coastguard Worker		}
10602*333d2b36SAndroid Build Coastguard Worker
10603*333d2b36SAndroid Build Coastguard Worker		rust_binary {
10604*333d2b36SAndroid Build Coastguard Worker			name: "my_rust_binary",
10605*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.rs"],
10606*333d2b36SAndroid Build Coastguard Worker			rustlibs: [
10607*333d2b36SAndroid Build Coastguard Worker				"libmy_rust_aconfig_library_baz",
10608*333d2b36SAndroid Build Coastguard Worker				"libmy_rust_dylib",
10609*333d2b36SAndroid Build Coastguard Worker			],
10610*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10611*333d2b36SAndroid Build Coastguard Worker				"myapex",
10612*333d2b36SAndroid Build Coastguard Worker			],
10613*333d2b36SAndroid Build Coastguard Worker		}
10614*333d2b36SAndroid Build Coastguard Worker
10615*333d2b36SAndroid Build Coastguard Worker		aconfig_declarations {
10616*333d2b36SAndroid Build Coastguard Worker			name: "my_aconfig_declarations_foo",
10617*333d2b36SAndroid Build Coastguard Worker			package: "com.example.package",
10618*333d2b36SAndroid Build Coastguard Worker			container: "myapex",
10619*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.aconfig"],
10620*333d2b36SAndroid Build Coastguard Worker		}
10621*333d2b36SAndroid Build Coastguard Worker
10622*333d2b36SAndroid Build Coastguard Worker		aconfig_declarations {
10623*333d2b36SAndroid Build Coastguard Worker			name: "my_aconfig_declarations_bar",
10624*333d2b36SAndroid Build Coastguard Worker			package: "com.example.package",
10625*333d2b36SAndroid Build Coastguard Worker			container: "myapex",
10626*333d2b36SAndroid Build Coastguard Worker			srcs: ["bar.aconfig"],
10627*333d2b36SAndroid Build Coastguard Worker		}
10628*333d2b36SAndroid Build Coastguard Worker
10629*333d2b36SAndroid Build Coastguard Worker		aconfig_declarations {
10630*333d2b36SAndroid Build Coastguard Worker			name: "my_aconfig_declarations_baz",
10631*333d2b36SAndroid Build Coastguard Worker			package: "com.example.package",
10632*333d2b36SAndroid Build Coastguard Worker			container: "myapex",
10633*333d2b36SAndroid Build Coastguard Worker			srcs: ["baz.aconfig"],
10634*333d2b36SAndroid Build Coastguard Worker		}
10635*333d2b36SAndroid Build Coastguard Worker
10636*333d2b36SAndroid Build Coastguard Worker		rust_aconfig_library {
10637*333d2b36SAndroid Build Coastguard Worker			name: "libmy_rust_aconfig_library_foo",
10638*333d2b36SAndroid Build Coastguard Worker			aconfig_declarations: "my_aconfig_declarations_foo",
10639*333d2b36SAndroid Build Coastguard Worker			crate_name: "my_rust_aconfig_library_foo",
10640*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10641*333d2b36SAndroid Build Coastguard Worker				"myapex",
10642*333d2b36SAndroid Build Coastguard Worker			],
10643*333d2b36SAndroid Build Coastguard Worker		}
10644*333d2b36SAndroid Build Coastguard Worker
10645*333d2b36SAndroid Build Coastguard Worker		rust_aconfig_library {
10646*333d2b36SAndroid Build Coastguard Worker			name: "libmy_rust_aconfig_library_bar",
10647*333d2b36SAndroid Build Coastguard Worker			aconfig_declarations: "my_aconfig_declarations_bar",
10648*333d2b36SAndroid Build Coastguard Worker			crate_name: "my_rust_aconfig_library_bar",
10649*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10650*333d2b36SAndroid Build Coastguard Worker				"myapex",
10651*333d2b36SAndroid Build Coastguard Worker			],
10652*333d2b36SAndroid Build Coastguard Worker		}
10653*333d2b36SAndroid Build Coastguard Worker
10654*333d2b36SAndroid Build Coastguard Worker		rust_aconfig_library {
10655*333d2b36SAndroid Build Coastguard Worker			name: "libmy_rust_aconfig_library_baz",
10656*333d2b36SAndroid Build Coastguard Worker			aconfig_declarations: "my_aconfig_declarations_baz",
10657*333d2b36SAndroid Build Coastguard Worker			crate_name: "my_rust_aconfig_library_baz",
10658*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10659*333d2b36SAndroid Build Coastguard Worker				"myapex",
10660*333d2b36SAndroid Build Coastguard Worker			],
10661*333d2b36SAndroid Build Coastguard Worker		}
10662*333d2b36SAndroid Build Coastguard Worker	`)
10663*333d2b36SAndroid Build Coastguard Worker
10664*333d2b36SAndroid Build Coastguard Worker	mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10665*333d2b36SAndroid Build Coastguard Worker	s := mod.Rule("apexRule").Args["copy_commands"]
10666*333d2b36SAndroid Build Coastguard Worker	copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
10667*333d2b36SAndroid Build Coastguard Worker	if len(copyCmds) != 38 {
10668*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("Expected 38 commands, got %d in:\n%s", len(copyCmds), s)
10669*333d2b36SAndroid Build Coastguard Worker	}
10670*333d2b36SAndroid Build Coastguard Worker
10671*333d2b36SAndroid Build Coastguard Worker	ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10672*333d2b36SAndroid Build Coastguard Worker	ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10673*333d2b36SAndroid Build Coastguard Worker	ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10674*333d2b36SAndroid Build Coastguard Worker	ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
10675*333d2b36SAndroid Build Coastguard Worker	ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
10676*333d2b36SAndroid Build Coastguard Worker
10677*333d2b36SAndroid Build Coastguard Worker	inputs := []string{
10678*333d2b36SAndroid Build Coastguard Worker		"my_aconfig_declarations_foo/intermediate.pb",
10679*333d2b36SAndroid Build Coastguard Worker		"my_aconfig_declarations_bar/intermediate.pb",
10680*333d2b36SAndroid Build Coastguard Worker		"my_aconfig_declarations_baz/intermediate.pb",
10681*333d2b36SAndroid Build Coastguard Worker		"my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10682*333d2b36SAndroid Build Coastguard Worker	}
10683*333d2b36SAndroid Build Coastguard Worker	VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10684*333d2b36SAndroid Build Coastguard Worker	VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10685*333d2b36SAndroid Build Coastguard Worker	VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10686*333d2b36SAndroid Build Coastguard Worker	VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
10687*333d2b36SAndroid Build Coastguard Worker	VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
10688*333d2b36SAndroid Build Coastguard Worker}
10689*333d2b36SAndroid Build Coastguard Worker
10690*333d2b36SAndroid Build Coastguard Workerfunc VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10691*333d2b36SAndroid Build Coastguard Worker	aconfigRule := mod.Description(desc)
10692*333d2b36SAndroid Build Coastguard Worker	s := " " + aconfigRule.Args["cache_files"]
10693*333d2b36SAndroid Build Coastguard Worker	aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10694*333d2b36SAndroid Build Coastguard Worker	if len(aconfigArgs) != len(inputs) {
10695*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
10696*333d2b36SAndroid Build Coastguard Worker	}
10697*333d2b36SAndroid Build Coastguard Worker
10698*333d2b36SAndroid Build Coastguard Worker	ensureEquals(t, container, aconfigRule.Args["container"])
10699*333d2b36SAndroid Build Coastguard Worker	ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10700*333d2b36SAndroid Build Coastguard Worker
10701*333d2b36SAndroid Build Coastguard Worker	buildParams := aconfigRule.BuildParams
10702*333d2b36SAndroid Build Coastguard Worker	for _, input := range inputs {
10703*333d2b36SAndroid Build Coastguard Worker		android.EnsureListContainsSuffix(t, aconfigArgs, input)
10704*333d2b36SAndroid Build Coastguard Worker		android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
10705*333d2b36SAndroid Build Coastguard Worker	}
10706*333d2b36SAndroid Build Coastguard Worker
10707*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, buildParams.Output.String(), output)
10708*333d2b36SAndroid Build Coastguard Worker}
10709*333d2b36SAndroid Build Coastguard Worker
10710*333d2b36SAndroid Build Coastguard Workerfunc TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
10711*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
10712*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, apex_default_bp+`
10713*333d2b36SAndroid Build Coastguard Worker		apex {
10714*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
10715*333d2b36SAndroid Build Coastguard Worker			manifest: ":myapex.manifest",
10716*333d2b36SAndroid Build Coastguard Worker			androidManifest: ":myapex.androidmanifest",
10717*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
10718*333d2b36SAndroid Build Coastguard Worker			java_libs: [
10719*333d2b36SAndroid Build Coastguard Worker				"my_java_library_foo",
10720*333d2b36SAndroid Build Coastguard Worker				"other_java_library_bar",
10721*333d2b36SAndroid Build Coastguard Worker			],
10722*333d2b36SAndroid Build Coastguard Worker			updatable: false,
10723*333d2b36SAndroid Build Coastguard Worker		}
10724*333d2b36SAndroid Build Coastguard Worker
10725*333d2b36SAndroid Build Coastguard Worker		java_library {
10726*333d2b36SAndroid Build Coastguard Worker			name: "my_java_library_foo",
10727*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
10728*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
10729*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
10730*333d2b36SAndroid Build Coastguard Worker			static_libs: ["my_java_aconfig_library_foo"],
10731*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10732*333d2b36SAndroid Build Coastguard Worker				"myapex",
10733*333d2b36SAndroid Build Coastguard Worker			],
10734*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
10735*333d2b36SAndroid Build Coastguard Worker		}
10736*333d2b36SAndroid Build Coastguard Worker
10737*333d2b36SAndroid Build Coastguard Worker		java_library {
10738*333d2b36SAndroid Build Coastguard Worker			name: "other_java_library_bar",
10739*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
10740*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
10741*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
10742*333d2b36SAndroid Build Coastguard Worker			static_libs: ["other_java_aconfig_library_bar"],
10743*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10744*333d2b36SAndroid Build Coastguard Worker				"myapex",
10745*333d2b36SAndroid Build Coastguard Worker			],
10746*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
10747*333d2b36SAndroid Build Coastguard Worker		}
10748*333d2b36SAndroid Build Coastguard Worker
10749*333d2b36SAndroid Build Coastguard Worker		aconfig_declarations {
10750*333d2b36SAndroid Build Coastguard Worker			name: "my_aconfig_declarations_foo",
10751*333d2b36SAndroid Build Coastguard Worker			package: "com.example.package",
10752*333d2b36SAndroid Build Coastguard Worker			container: "myapex",
10753*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.aconfig"],
10754*333d2b36SAndroid Build Coastguard Worker		}
10755*333d2b36SAndroid Build Coastguard Worker
10756*333d2b36SAndroid Build Coastguard Worker		java_aconfig_library {
10757*333d2b36SAndroid Build Coastguard Worker			name: "my_java_aconfig_library_foo",
10758*333d2b36SAndroid Build Coastguard Worker			aconfig_declarations: "my_aconfig_declarations_foo",
10759*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10760*333d2b36SAndroid Build Coastguard Worker				"myapex",
10761*333d2b36SAndroid Build Coastguard Worker			],
10762*333d2b36SAndroid Build Coastguard Worker		}
10763*333d2b36SAndroid Build Coastguard Worker
10764*333d2b36SAndroid Build Coastguard Worker		aconfig_declarations {
10765*333d2b36SAndroid Build Coastguard Worker			name: "other_aconfig_declarations_bar",
10766*333d2b36SAndroid Build Coastguard Worker			package: "com.example.package",
10767*333d2b36SAndroid Build Coastguard Worker			container: "otherapex",
10768*333d2b36SAndroid Build Coastguard Worker			srcs: ["bar.aconfig"],
10769*333d2b36SAndroid Build Coastguard Worker		}
10770*333d2b36SAndroid Build Coastguard Worker
10771*333d2b36SAndroid Build Coastguard Worker		java_aconfig_library {
10772*333d2b36SAndroid Build Coastguard Worker			name: "other_java_aconfig_library_bar",
10773*333d2b36SAndroid Build Coastguard Worker			aconfig_declarations: "other_aconfig_declarations_bar",
10774*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10775*333d2b36SAndroid Build Coastguard Worker				"myapex",
10776*333d2b36SAndroid Build Coastguard Worker			],
10777*333d2b36SAndroid Build Coastguard Worker		}
10778*333d2b36SAndroid Build Coastguard Worker	`)
10779*333d2b36SAndroid Build Coastguard Worker
10780*333d2b36SAndroid Build Coastguard Worker	mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10781*333d2b36SAndroid Build Coastguard Worker	combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10782*333d2b36SAndroid Build Coastguard Worker	s := " " + combineAconfigRule.Args["cache_files"]
10783*333d2b36SAndroid Build Coastguard Worker	aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10784*333d2b36SAndroid Build Coastguard Worker	if len(aconfigArgs) != 1 {
10785*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10786*333d2b36SAndroid Build Coastguard Worker	}
10787*333d2b36SAndroid Build Coastguard Worker	android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10788*333d2b36SAndroid Build Coastguard Worker
10789*333d2b36SAndroid Build Coastguard Worker	buildParams := combineAconfigRule.BuildParams
10790*333d2b36SAndroid Build Coastguard Worker	if len(buildParams.Inputs) != 1 {
10791*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10792*333d2b36SAndroid Build Coastguard Worker	}
10793*333d2b36SAndroid Build Coastguard Worker	android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10794*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10795*333d2b36SAndroid Build Coastguard Worker}
10796*333d2b36SAndroid Build Coastguard Worker
10797*333d2b36SAndroid Build Coastguard Workerfunc TestAconfigFilesRemoveDuplicates(t *testing.T) {
10798*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
10799*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, apex_default_bp+`
10800*333d2b36SAndroid Build Coastguard Worker		apex {
10801*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
10802*333d2b36SAndroid Build Coastguard Worker			manifest: ":myapex.manifest",
10803*333d2b36SAndroid Build Coastguard Worker			androidManifest: ":myapex.androidmanifest",
10804*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
10805*333d2b36SAndroid Build Coastguard Worker			java_libs: [
10806*333d2b36SAndroid Build Coastguard Worker				"my_java_library_foo",
10807*333d2b36SAndroid Build Coastguard Worker				"my_java_library_bar",
10808*333d2b36SAndroid Build Coastguard Worker			],
10809*333d2b36SAndroid Build Coastguard Worker			updatable: false,
10810*333d2b36SAndroid Build Coastguard Worker		}
10811*333d2b36SAndroid Build Coastguard Worker
10812*333d2b36SAndroid Build Coastguard Worker		java_library {
10813*333d2b36SAndroid Build Coastguard Worker			name: "my_java_library_foo",
10814*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
10815*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
10816*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
10817*333d2b36SAndroid Build Coastguard Worker			static_libs: ["my_java_aconfig_library_foo"],
10818*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10819*333d2b36SAndroid Build Coastguard Worker				"myapex",
10820*333d2b36SAndroid Build Coastguard Worker			],
10821*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
10822*333d2b36SAndroid Build Coastguard Worker		}
10823*333d2b36SAndroid Build Coastguard Worker
10824*333d2b36SAndroid Build Coastguard Worker		java_library {
10825*333d2b36SAndroid Build Coastguard Worker			name: "my_java_library_bar",
10826*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo/bar/MyClass.java"],
10827*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
10828*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
10829*333d2b36SAndroid Build Coastguard Worker			static_libs: ["my_java_aconfig_library_bar"],
10830*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10831*333d2b36SAndroid Build Coastguard Worker				"myapex",
10832*333d2b36SAndroid Build Coastguard Worker			],
10833*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
10834*333d2b36SAndroid Build Coastguard Worker		}
10835*333d2b36SAndroid Build Coastguard Worker
10836*333d2b36SAndroid Build Coastguard Worker		aconfig_declarations {
10837*333d2b36SAndroid Build Coastguard Worker			name: "my_aconfig_declarations_foo",
10838*333d2b36SAndroid Build Coastguard Worker			package: "com.example.package",
10839*333d2b36SAndroid Build Coastguard Worker			container: "myapex",
10840*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.aconfig"],
10841*333d2b36SAndroid Build Coastguard Worker		}
10842*333d2b36SAndroid Build Coastguard Worker
10843*333d2b36SAndroid Build Coastguard Worker		java_aconfig_library {
10844*333d2b36SAndroid Build Coastguard Worker			name: "my_java_aconfig_library_foo",
10845*333d2b36SAndroid Build Coastguard Worker			aconfig_declarations: "my_aconfig_declarations_foo",
10846*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10847*333d2b36SAndroid Build Coastguard Worker				"myapex",
10848*333d2b36SAndroid Build Coastguard Worker			],
10849*333d2b36SAndroid Build Coastguard Worker		}
10850*333d2b36SAndroid Build Coastguard Worker
10851*333d2b36SAndroid Build Coastguard Worker		java_aconfig_library {
10852*333d2b36SAndroid Build Coastguard Worker			name: "my_java_aconfig_library_bar",
10853*333d2b36SAndroid Build Coastguard Worker			aconfig_declarations: "my_aconfig_declarations_foo",
10854*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10855*333d2b36SAndroid Build Coastguard Worker				"myapex",
10856*333d2b36SAndroid Build Coastguard Worker			],
10857*333d2b36SAndroid Build Coastguard Worker		}
10858*333d2b36SAndroid Build Coastguard Worker	`)
10859*333d2b36SAndroid Build Coastguard Worker
10860*333d2b36SAndroid Build Coastguard Worker	mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10861*333d2b36SAndroid Build Coastguard Worker	combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10862*333d2b36SAndroid Build Coastguard Worker	s := " " + combineAconfigRule.Args["cache_files"]
10863*333d2b36SAndroid Build Coastguard Worker	aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10864*333d2b36SAndroid Build Coastguard Worker	if len(aconfigArgs) != 1 {
10865*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10866*333d2b36SAndroid Build Coastguard Worker	}
10867*333d2b36SAndroid Build Coastguard Worker	android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10868*333d2b36SAndroid Build Coastguard Worker
10869*333d2b36SAndroid Build Coastguard Worker	buildParams := combineAconfigRule.BuildParams
10870*333d2b36SAndroid Build Coastguard Worker	if len(buildParams.Inputs) != 1 {
10871*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10872*333d2b36SAndroid Build Coastguard Worker	}
10873*333d2b36SAndroid Build Coastguard Worker	android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10874*333d2b36SAndroid Build Coastguard Worker	ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10875*333d2b36SAndroid Build Coastguard Worker}
10876*333d2b36SAndroid Build Coastguard Worker
10877*333d2b36SAndroid Build Coastguard Worker// Test that the boot jars come from the _selected_ apex prebuilt
10878*333d2b36SAndroid Build Coastguard Worker// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10879*333d2b36SAndroid Build Coastguard Workerfunc TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
10880*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
10881*333d2b36SAndroid Build Coastguard Worker	checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
10882*333d2b36SAndroid Build Coastguard Worker		t.Helper()
10883*333d2b36SAndroid Build Coastguard Worker		s := ctx.ModuleForTests("dex_bootjars", "android_common")
10884*333d2b36SAndroid Build Coastguard Worker		foundLibfooJar := false
10885*333d2b36SAndroid Build Coastguard Worker		base := stem + ".jar"
10886*333d2b36SAndroid Build Coastguard Worker		for _, output := range s.AllOutputs() {
10887*333d2b36SAndroid Build Coastguard Worker			if filepath.Base(output) == base {
10888*333d2b36SAndroid Build Coastguard Worker				foundLibfooJar = true
10889*333d2b36SAndroid Build Coastguard Worker				buildRule := s.Output(output)
10890*333d2b36SAndroid Build Coastguard Worker				android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
10891*333d2b36SAndroid Build Coastguard Worker			}
10892*333d2b36SAndroid Build Coastguard Worker		}
10893*333d2b36SAndroid Build Coastguard Worker		if !foundLibfooJar {
10894*333d2b36SAndroid Build Coastguard Worker			t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
10895*333d2b36SAndroid Build Coastguard Worker		}
10896*333d2b36SAndroid Build Coastguard Worker	}
10897*333d2b36SAndroid Build Coastguard Worker
10898*333d2b36SAndroid Build Coastguard Worker	// Check that the boot jars of the selected apex are run through boot_jars_package_check
10899*333d2b36SAndroid Build Coastguard Worker	// This validates that the jars on the bootclasspath do not contain packages outside an allowlist
10900*333d2b36SAndroid Build Coastguard Worker	checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10901*333d2b36SAndroid Build Coastguard Worker		platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
10902*333d2b36SAndroid Build Coastguard Worker		bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
10903*333d2b36SAndroid Build Coastguard Worker		android.AssertStringMatches(t, "Could not find the correct boot dex jar in package check rule", bootJarsCheckRule.RuleParams.Command, "build/soong/scripts/check_boot_jars/package_allowed_list.txt.*"+expectedBootJar)
10904*333d2b36SAndroid Build Coastguard Worker	}
10905*333d2b36SAndroid Build Coastguard Worker
10906*333d2b36SAndroid Build Coastguard Worker	// Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
10907*333d2b36SAndroid Build Coastguard Worker	checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10908*333d2b36SAndroid Build Coastguard Worker		monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
10909*333d2b36SAndroid Build Coastguard Worker		android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
10910*333d2b36SAndroid Build Coastguard Worker	}
10911*333d2b36SAndroid Build Coastguard Worker
10912*333d2b36SAndroid Build Coastguard Worker	bp := `
10913*333d2b36SAndroid Build Coastguard Worker		// Source APEX.
10914*333d2b36SAndroid Build Coastguard Worker
10915*333d2b36SAndroid Build Coastguard Worker		java_library {
10916*333d2b36SAndroid Build Coastguard Worker			name: "framework-foo",
10917*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
10918*333d2b36SAndroid Build Coastguard Worker			installable: true,
10919*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10920*333d2b36SAndroid Build Coastguard Worker				"com.android.foo",
10921*333d2b36SAndroid Build Coastguard Worker			],
10922*333d2b36SAndroid Build Coastguard Worker		}
10923*333d2b36SAndroid Build Coastguard Worker
10924*333d2b36SAndroid Build Coastguard Worker		bootclasspath_fragment {
10925*333d2b36SAndroid Build Coastguard Worker			name: "foo-bootclasspath-fragment",
10926*333d2b36SAndroid Build Coastguard Worker			contents: ["framework-foo"],
10927*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10928*333d2b36SAndroid Build Coastguard Worker				"com.android.foo",
10929*333d2b36SAndroid Build Coastguard Worker			],
10930*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
10931*333d2b36SAndroid Build Coastguard Worker				split_packages: ["*"],
10932*333d2b36SAndroid Build Coastguard Worker			},
10933*333d2b36SAndroid Build Coastguard Worker		}
10934*333d2b36SAndroid Build Coastguard Worker
10935*333d2b36SAndroid Build Coastguard Worker		apex_key {
10936*333d2b36SAndroid Build Coastguard Worker			name: "com.android.foo.key",
10937*333d2b36SAndroid Build Coastguard Worker			public_key: "com.android.foo.avbpubkey",
10938*333d2b36SAndroid Build Coastguard Worker			private_key: "com.android.foo.pem",
10939*333d2b36SAndroid Build Coastguard Worker		}
10940*333d2b36SAndroid Build Coastguard Worker
10941*333d2b36SAndroid Build Coastguard Worker		apex {
10942*333d2b36SAndroid Build Coastguard Worker			name: "com.android.foo",
10943*333d2b36SAndroid Build Coastguard Worker			key: "com.android.foo.key",
10944*333d2b36SAndroid Build Coastguard Worker			bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10945*333d2b36SAndroid Build Coastguard Worker			updatable: false,
10946*333d2b36SAndroid Build Coastguard Worker		}
10947*333d2b36SAndroid Build Coastguard Worker
10948*333d2b36SAndroid Build Coastguard Worker		// Prebuilt APEX.
10949*333d2b36SAndroid Build Coastguard Worker
10950*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
10951*333d2b36SAndroid Build Coastguard Worker			name: "framework-foo",
10952*333d2b36SAndroid Build Coastguard Worker			public: {
10953*333d2b36SAndroid Build Coastguard Worker				jars: ["foo.jar"],
10954*333d2b36SAndroid Build Coastguard Worker			},
10955*333d2b36SAndroid Build Coastguard Worker			apex_available: ["com.android.foo"],
10956*333d2b36SAndroid Build Coastguard Worker			shared_library: false,
10957*333d2b36SAndroid Build Coastguard Worker		}
10958*333d2b36SAndroid Build Coastguard Worker
10959*333d2b36SAndroid Build Coastguard Worker		prebuilt_bootclasspath_fragment {
10960*333d2b36SAndroid Build Coastguard Worker			name: "foo-bootclasspath-fragment",
10961*333d2b36SAndroid Build Coastguard Worker			contents: ["framework-foo"],
10962*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
10963*333d2b36SAndroid Build Coastguard Worker				annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
10964*333d2b36SAndroid Build Coastguard Worker				metadata: "my-bootclasspath-fragment/metadata.csv",
10965*333d2b36SAndroid Build Coastguard Worker				index: "my-bootclasspath-fragment/index.csv",
10966*333d2b36SAndroid Build Coastguard Worker				stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
10967*333d2b36SAndroid Build Coastguard Worker				all_flags: "my-bootclasspath-fragment/all-flags.csv",
10968*333d2b36SAndroid Build Coastguard Worker			},
10969*333d2b36SAndroid Build Coastguard Worker			apex_available: [
10970*333d2b36SAndroid Build Coastguard Worker				"com.android.foo",
10971*333d2b36SAndroid Build Coastguard Worker			],
10972*333d2b36SAndroid Build Coastguard Worker		}
10973*333d2b36SAndroid Build Coastguard Worker
10974*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
10975*333d2b36SAndroid Build Coastguard Worker			name: "com.android.foo",
10976*333d2b36SAndroid Build Coastguard Worker			apex_name: "com.android.foo",
10977*333d2b36SAndroid Build Coastguard Worker			src: "com.android.foo-arm.apex",
10978*333d2b36SAndroid Build Coastguard Worker			exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10979*333d2b36SAndroid Build Coastguard Worker		}
10980*333d2b36SAndroid Build Coastguard Worker
10981*333d2b36SAndroid Build Coastguard Worker		// Another Prebuilt ART APEX
10982*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
10983*333d2b36SAndroid Build Coastguard Worker			name: "com.android.foo.v2",
10984*333d2b36SAndroid Build Coastguard Worker			apex_name: "com.android.foo", // Used to determine the API domain
10985*333d2b36SAndroid Build Coastguard Worker			src: "com.android.foo-arm.apex",
10986*333d2b36SAndroid Build Coastguard Worker			exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10987*333d2b36SAndroid Build Coastguard Worker		}
10988*333d2b36SAndroid Build Coastguard Worker
10989*333d2b36SAndroid Build Coastguard Worker		// APEX contribution modules
10990*333d2b36SAndroid Build Coastguard Worker
10991*333d2b36SAndroid Build Coastguard Worker		apex_contributions {
10992*333d2b36SAndroid Build Coastguard Worker			name: "foo.source.contributions",
10993*333d2b36SAndroid Build Coastguard Worker			api_domain: "com.android.foo",
10994*333d2b36SAndroid Build Coastguard Worker			contents: ["com.android.foo"],
10995*333d2b36SAndroid Build Coastguard Worker		}
10996*333d2b36SAndroid Build Coastguard Worker
10997*333d2b36SAndroid Build Coastguard Worker		apex_contributions {
10998*333d2b36SAndroid Build Coastguard Worker			name: "foo.prebuilt.contributions",
10999*333d2b36SAndroid Build Coastguard Worker			api_domain: "com.android.foo",
11000*333d2b36SAndroid Build Coastguard Worker			contents: ["prebuilt_com.android.foo"],
11001*333d2b36SAndroid Build Coastguard Worker		}
11002*333d2b36SAndroid Build Coastguard Worker
11003*333d2b36SAndroid Build Coastguard Worker		apex_contributions {
11004*333d2b36SAndroid Build Coastguard Worker			name: "foo.prebuilt.v2.contributions",
11005*333d2b36SAndroid Build Coastguard Worker			api_domain: "com.android.foo",
11006*333d2b36SAndroid Build Coastguard Worker			contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
11007*333d2b36SAndroid Build Coastguard Worker		}
11008*333d2b36SAndroid Build Coastguard Worker	`
11009*333d2b36SAndroid Build Coastguard Worker
11010*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
11011*333d2b36SAndroid Build Coastguard Worker		desc                      string
11012*333d2b36SAndroid Build Coastguard Worker		selectedApexContributions string
11013*333d2b36SAndroid Build Coastguard Worker		expectedBootJar           string
11014*333d2b36SAndroid Build Coastguard Worker	}{
11015*333d2b36SAndroid Build Coastguard Worker		{
11016*333d2b36SAndroid Build Coastguard Worker			desc:                      "Source apex com.android.foo is selected, bootjar should come from source java library",
11017*333d2b36SAndroid Build Coastguard Worker			selectedApexContributions: "foo.source.contributions",
11018*333d2b36SAndroid Build Coastguard Worker			expectedBootJar:           "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
11019*333d2b36SAndroid Build Coastguard Worker		},
11020*333d2b36SAndroid Build Coastguard Worker		{
11021*333d2b36SAndroid Build Coastguard Worker			desc:                      "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11022*333d2b36SAndroid Build Coastguard Worker			selectedApexContributions: "foo.prebuilt.contributions",
11023*333d2b36SAndroid Build Coastguard Worker			expectedBootJar:           "out/soong/.intermediates/prebuilt_com.android.foo/android_common_com.android.foo/deapexer/javalib/framework-foo.jar",
11024*333d2b36SAndroid Build Coastguard Worker		},
11025*333d2b36SAndroid Build Coastguard Worker		{
11026*333d2b36SAndroid Build Coastguard Worker			desc:                      "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11027*333d2b36SAndroid Build Coastguard Worker			selectedApexContributions: "foo.prebuilt.v2.contributions",
11028*333d2b36SAndroid Build Coastguard Worker			expectedBootJar:           "out/soong/.intermediates/com.android.foo.v2/android_common_com.android.foo/deapexer/javalib/framework-foo.jar",
11029*333d2b36SAndroid Build Coastguard Worker		},
11030*333d2b36SAndroid Build Coastguard Worker	}
11031*333d2b36SAndroid Build Coastguard Worker
11032*333d2b36SAndroid Build Coastguard Worker	fragment := java.ApexVariantReference{
11033*333d2b36SAndroid Build Coastguard Worker		Apex:   proptools.StringPtr("com.android.foo"),
11034*333d2b36SAndroid Build Coastguard Worker		Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11035*333d2b36SAndroid Build Coastguard Worker	}
11036*333d2b36SAndroid Build Coastguard Worker
11037*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testCases {
11038*333d2b36SAndroid Build Coastguard Worker		preparer := android.GroupFixturePreparers(
11039*333d2b36SAndroid Build Coastguard Worker			java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11040*333d2b36SAndroid Build Coastguard Worker			android.FixtureMergeMockFs(map[string][]byte{
11041*333d2b36SAndroid Build Coastguard Worker				"system/sepolicy/apex/com.android.foo-file_contexts": nil,
11042*333d2b36SAndroid Build Coastguard Worker			}),
11043*333d2b36SAndroid Build Coastguard Worker			// Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11044*333d2b36SAndroid Build Coastguard Worker			// file creation.
11045*333d2b36SAndroid Build Coastguard Worker			java.FixtureConfigureBootJars("platform:foo"),
11046*333d2b36SAndroid Build Coastguard Worker			android.FixtureModifyMockFS(func(fs android.MockFS) {
11047*333d2b36SAndroid Build Coastguard Worker				fs["platform/Android.bp"] = []byte(`
11048*333d2b36SAndroid Build Coastguard Worker		java_library {
11049*333d2b36SAndroid Build Coastguard Worker			name: "foo",
11050*333d2b36SAndroid Build Coastguard Worker			srcs: ["Test.java"],
11051*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
11052*333d2b36SAndroid Build Coastguard Worker		}
11053*333d2b36SAndroid Build Coastguard Worker		`)
11054*333d2b36SAndroid Build Coastguard Worker				fs["platform/Test.java"] = nil
11055*333d2b36SAndroid Build Coastguard Worker			}),
11056*333d2b36SAndroid Build Coastguard Worker
11057*333d2b36SAndroid Build Coastguard Worker			android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
11058*333d2b36SAndroid Build Coastguard Worker		)
11059*333d2b36SAndroid Build Coastguard Worker		ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
11060*333d2b36SAndroid Build Coastguard Worker		checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
11061*333d2b36SAndroid Build Coastguard Worker		checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11062*333d2b36SAndroid Build Coastguard Worker		checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
11063*333d2b36SAndroid Build Coastguard Worker	}
11064*333d2b36SAndroid Build Coastguard Worker}
11065*333d2b36SAndroid Build Coastguard Worker
11066*333d2b36SAndroid Build Coastguard Worker// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11067*333d2b36SAndroid Build Coastguard Worker// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11068*333d2b36SAndroid Build Coastguard Workerfunc TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
11069*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
11070*333d2b36SAndroid Build Coastguard Worker	// for a mainline module family, check that only the flagged soong module is visible to make
11071*333d2b36SAndroid Build Coastguard Worker	checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11072*333d2b36SAndroid Build Coastguard Worker		variation := func(moduleName string) string {
11073*333d2b36SAndroid Build Coastguard Worker			ret := "android_common_com.android.foo"
11074*333d2b36SAndroid Build Coastguard Worker			if moduleName == "com.google.android.foo" {
11075*333d2b36SAndroid Build Coastguard Worker				ret = "android_common_com.google.android.foo_com.google.android.foo"
11076*333d2b36SAndroid Build Coastguard Worker			}
11077*333d2b36SAndroid Build Coastguard Worker			return ret
11078*333d2b36SAndroid Build Coastguard Worker		}
11079*333d2b36SAndroid Build Coastguard Worker
11080*333d2b36SAndroid Build Coastguard Worker		visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11081*333d2b36SAndroid Build Coastguard Worker		android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11082*333d2b36SAndroid Build Coastguard Worker
11083*333d2b36SAndroid Build Coastguard Worker		for _, hiddenModuleName := range hiddenModuleNames {
11084*333d2b36SAndroid Build Coastguard Worker			hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11085*333d2b36SAndroid Build Coastguard Worker			android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11086*333d2b36SAndroid Build Coastguard Worker
11087*333d2b36SAndroid Build Coastguard Worker		}
11088*333d2b36SAndroid Build Coastguard Worker	}
11089*333d2b36SAndroid Build Coastguard Worker
11090*333d2b36SAndroid Build Coastguard Worker	bp := `
11091*333d2b36SAndroid Build Coastguard Worker		apex_key {
11092*333d2b36SAndroid Build Coastguard Worker			name: "com.android.foo.key",
11093*333d2b36SAndroid Build Coastguard Worker			public_key: "com.android.foo.avbpubkey",
11094*333d2b36SAndroid Build Coastguard Worker			private_key: "com.android.foo.pem",
11095*333d2b36SAndroid Build Coastguard Worker		}
11096*333d2b36SAndroid Build Coastguard Worker
11097*333d2b36SAndroid Build Coastguard Worker		// AOSP source apex
11098*333d2b36SAndroid Build Coastguard Worker		apex {
11099*333d2b36SAndroid Build Coastguard Worker			name: "com.android.foo",
11100*333d2b36SAndroid Build Coastguard Worker			key: "com.android.foo.key",
11101*333d2b36SAndroid Build Coastguard Worker			updatable: false,
11102*333d2b36SAndroid Build Coastguard Worker		}
11103*333d2b36SAndroid Build Coastguard Worker
11104*333d2b36SAndroid Build Coastguard Worker		// Google source apex
11105*333d2b36SAndroid Build Coastguard Worker		override_apex {
11106*333d2b36SAndroid Build Coastguard Worker			name: "com.google.android.foo",
11107*333d2b36SAndroid Build Coastguard Worker			base: "com.android.foo",
11108*333d2b36SAndroid Build Coastguard Worker			key: "com.android.foo.key",
11109*333d2b36SAndroid Build Coastguard Worker		}
11110*333d2b36SAndroid Build Coastguard Worker
11111*333d2b36SAndroid Build Coastguard Worker		// Prebuilt Google APEX.
11112*333d2b36SAndroid Build Coastguard Worker
11113*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
11114*333d2b36SAndroid Build Coastguard Worker			name: "com.google.android.foo",
11115*333d2b36SAndroid Build Coastguard Worker			apex_name: "com.android.foo",
11116*333d2b36SAndroid Build Coastguard Worker			src: "com.android.foo-arm.apex",
11117*333d2b36SAndroid Build Coastguard Worker			prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11118*333d2b36SAndroid Build Coastguard Worker		}
11119*333d2b36SAndroid Build Coastguard Worker
11120*333d2b36SAndroid Build Coastguard Worker		// Another Prebuilt Google APEX
11121*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
11122*333d2b36SAndroid Build Coastguard Worker			name: "com.google.android.foo.v2",
11123*333d2b36SAndroid Build Coastguard Worker			apex_name: "com.android.foo",
11124*333d2b36SAndroid Build Coastguard Worker			source_apex_name: "com.google.android.foo",
11125*333d2b36SAndroid Build Coastguard Worker			src: "com.android.foo-arm.apex",
11126*333d2b36SAndroid Build Coastguard Worker			prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11127*333d2b36SAndroid Build Coastguard Worker		}
11128*333d2b36SAndroid Build Coastguard Worker
11129*333d2b36SAndroid Build Coastguard Worker		// APEX contribution modules
11130*333d2b36SAndroid Build Coastguard Worker
11131*333d2b36SAndroid Build Coastguard Worker		apex_contributions {
11132*333d2b36SAndroid Build Coastguard Worker			name: "foo.source.contributions",
11133*333d2b36SAndroid Build Coastguard Worker			api_domain: "com.android.foo",
11134*333d2b36SAndroid Build Coastguard Worker			contents: ["com.google.android.foo"],
11135*333d2b36SAndroid Build Coastguard Worker		}
11136*333d2b36SAndroid Build Coastguard Worker
11137*333d2b36SAndroid Build Coastguard Worker		apex_contributions {
11138*333d2b36SAndroid Build Coastguard Worker			name: "foo.prebuilt.contributions",
11139*333d2b36SAndroid Build Coastguard Worker			api_domain: "com.android.foo",
11140*333d2b36SAndroid Build Coastguard Worker			contents: ["prebuilt_com.google.android.foo"],
11141*333d2b36SAndroid Build Coastguard Worker		}
11142*333d2b36SAndroid Build Coastguard Worker
11143*333d2b36SAndroid Build Coastguard Worker		apex_contributions {
11144*333d2b36SAndroid Build Coastguard Worker			name: "foo.prebuilt.v2.contributions",
11145*333d2b36SAndroid Build Coastguard Worker			api_domain: "com.android.foo",
11146*333d2b36SAndroid Build Coastguard Worker			contents: ["prebuilt_com.google.android.foo.v2"],
11147*333d2b36SAndroid Build Coastguard Worker		}
11148*333d2b36SAndroid Build Coastguard Worker
11149*333d2b36SAndroid Build Coastguard Worker		// This is an incompatible module because it selects multiple versions of the same mainline module
11150*333d2b36SAndroid Build Coastguard Worker		apex_contributions {
11151*333d2b36SAndroid Build Coastguard Worker			name: "foo.prebuilt.duplicate.contributions",
11152*333d2b36SAndroid Build Coastguard Worker			api_domain: "com.android.foo",
11153*333d2b36SAndroid Build Coastguard Worker			contents: [
11154*333d2b36SAndroid Build Coastguard Worker			    "prebuilt_com.google.android.foo",
11155*333d2b36SAndroid Build Coastguard Worker			    "prebuilt_com.google.android.foo.v2",
11156*333d2b36SAndroid Build Coastguard Worker			],
11157*333d2b36SAndroid Build Coastguard Worker		}
11158*333d2b36SAndroid Build Coastguard Worker	`
11159*333d2b36SAndroid Build Coastguard Worker
11160*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
11161*333d2b36SAndroid Build Coastguard Worker		desc                      string
11162*333d2b36SAndroid Build Coastguard Worker		selectedApexContributions string
11163*333d2b36SAndroid Build Coastguard Worker		expectedVisibleModuleName string
11164*333d2b36SAndroid Build Coastguard Worker		expectedHiddenModuleNames []string
11165*333d2b36SAndroid Build Coastguard Worker		expectedError             string
11166*333d2b36SAndroid Build Coastguard Worker	}{
11167*333d2b36SAndroid Build Coastguard Worker		{
11168*333d2b36SAndroid Build Coastguard Worker			desc:                      "Source apex is selected, prebuilts should be hidden from make",
11169*333d2b36SAndroid Build Coastguard Worker			selectedApexContributions: "foo.source.contributions",
11170*333d2b36SAndroid Build Coastguard Worker			expectedVisibleModuleName: "com.google.android.foo",
11171*333d2b36SAndroid Build Coastguard Worker			expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11172*333d2b36SAndroid Build Coastguard Worker		},
11173*333d2b36SAndroid Build Coastguard Worker		{
11174*333d2b36SAndroid Build Coastguard Worker			desc:                      "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11175*333d2b36SAndroid Build Coastguard Worker			selectedApexContributions: "foo.prebuilt.contributions",
11176*333d2b36SAndroid Build Coastguard Worker			expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11177*333d2b36SAndroid Build Coastguard Worker			expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11178*333d2b36SAndroid Build Coastguard Worker		},
11179*333d2b36SAndroid Build Coastguard Worker		{
11180*333d2b36SAndroid Build Coastguard Worker			desc:                      "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11181*333d2b36SAndroid Build Coastguard Worker			selectedApexContributions: "foo.prebuilt.v2.contributions",
11182*333d2b36SAndroid Build Coastguard Worker			expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11183*333d2b36SAndroid Build Coastguard Worker			expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11184*333d2b36SAndroid Build Coastguard Worker		},
11185*333d2b36SAndroid Build Coastguard Worker		{
11186*333d2b36SAndroid Build Coastguard Worker			desc:                      "Multiple versions of a prebuilt apex is selected in the same release config",
11187*333d2b36SAndroid Build Coastguard Worker			selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11188*333d2b36SAndroid Build Coastguard Worker			expectedError:             "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11189*333d2b36SAndroid Build Coastguard Worker		},
11190*333d2b36SAndroid Build Coastguard Worker	}
11191*333d2b36SAndroid Build Coastguard Worker
11192*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testCases {
11193*333d2b36SAndroid Build Coastguard Worker		preparer := android.GroupFixturePreparers(
11194*333d2b36SAndroid Build Coastguard Worker			android.FixtureMergeMockFs(map[string][]byte{
11195*333d2b36SAndroid Build Coastguard Worker				"system/sepolicy/apex/com.android.foo-file_contexts": nil,
11196*333d2b36SAndroid Build Coastguard Worker			}),
11197*333d2b36SAndroid Build Coastguard Worker			android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
11198*333d2b36SAndroid Build Coastguard Worker		)
11199*333d2b36SAndroid Build Coastguard Worker		if tc.expectedError != "" {
11200*333d2b36SAndroid Build Coastguard Worker			preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11201*333d2b36SAndroid Build Coastguard Worker			testApex(t, bp, preparer)
11202*333d2b36SAndroid Build Coastguard Worker			return
11203*333d2b36SAndroid Build Coastguard Worker		}
11204*333d2b36SAndroid Build Coastguard Worker		ctx := testApex(t, bp, preparer)
11205*333d2b36SAndroid Build Coastguard Worker
11206*333d2b36SAndroid Build Coastguard Worker		// Check that
11207*333d2b36SAndroid Build Coastguard Worker		// 1. The contents of the selected apex_contributions are visible to make
11208*333d2b36SAndroid Build Coastguard Worker		// 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11209*333d2b36SAndroid Build Coastguard Worker		checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11210*333d2b36SAndroid Build Coastguard Worker	}
11211*333d2b36SAndroid Build Coastguard Worker}
11212*333d2b36SAndroid Build Coastguard Worker
11213*333d2b36SAndroid Build Coastguard Worker// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11214*333d2b36SAndroid Build Coastguard Workerfunc TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
11215*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
11216*333d2b36SAndroid Build Coastguard Worker	// for a mainline module family, check that only the flagged soong module is visible to make
11217*333d2b36SAndroid Build Coastguard Worker	checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11218*333d2b36SAndroid Build Coastguard Worker		variation := func(moduleName string) string {
11219*333d2b36SAndroid Build Coastguard Worker			ret := "android_common_com.android.adservices"
11220*333d2b36SAndroid Build Coastguard Worker			if moduleName == "com.google.android.foo" {
11221*333d2b36SAndroid Build Coastguard Worker				ret = "android_common_com.google.android.foo_com.google.android.foo"
11222*333d2b36SAndroid Build Coastguard Worker			}
11223*333d2b36SAndroid Build Coastguard Worker			return ret
11224*333d2b36SAndroid Build Coastguard Worker		}
11225*333d2b36SAndroid Build Coastguard Worker
11226*333d2b36SAndroid Build Coastguard Worker		for _, visibleModuleName := range visibleModuleNames {
11227*333d2b36SAndroid Build Coastguard Worker			visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11228*333d2b36SAndroid Build Coastguard Worker			android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11229*333d2b36SAndroid Build Coastguard Worker		}
11230*333d2b36SAndroid Build Coastguard Worker
11231*333d2b36SAndroid Build Coastguard Worker		for _, hiddenModuleName := range hiddenModuleNames {
11232*333d2b36SAndroid Build Coastguard Worker			hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11233*333d2b36SAndroid Build Coastguard Worker			android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11234*333d2b36SAndroid Build Coastguard Worker
11235*333d2b36SAndroid Build Coastguard Worker		}
11236*333d2b36SAndroid Build Coastguard Worker	}
11237*333d2b36SAndroid Build Coastguard Worker
11238*333d2b36SAndroid Build Coastguard Worker	bp := `
11239*333d2b36SAndroid Build Coastguard Worker		apex_key {
11240*333d2b36SAndroid Build Coastguard Worker			name: "com.android.adservices.key",
11241*333d2b36SAndroid Build Coastguard Worker			public_key: "com.android.adservices.avbpubkey",
11242*333d2b36SAndroid Build Coastguard Worker			private_key: "com.android.adservices.pem",
11243*333d2b36SAndroid Build Coastguard Worker		}
11244*333d2b36SAndroid Build Coastguard Worker
11245*333d2b36SAndroid Build Coastguard Worker		// AOSP source apex
11246*333d2b36SAndroid Build Coastguard Worker		apex {
11247*333d2b36SAndroid Build Coastguard Worker			name: "com.android.adservices",
11248*333d2b36SAndroid Build Coastguard Worker			key: "com.android.adservices.key",
11249*333d2b36SAndroid Build Coastguard Worker			updatable: false,
11250*333d2b36SAndroid Build Coastguard Worker		}
11251*333d2b36SAndroid Build Coastguard Worker
11252*333d2b36SAndroid Build Coastguard Worker		// Prebuilt Google APEX.
11253*333d2b36SAndroid Build Coastguard Worker
11254*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
11255*333d2b36SAndroid Build Coastguard Worker			name: "com.google.android.adservices",
11256*333d2b36SAndroid Build Coastguard Worker			apex_name: "com.android.adservices",
11257*333d2b36SAndroid Build Coastguard Worker			src: "com.android.foo-arm.apex",
11258*333d2b36SAndroid Build Coastguard Worker		}
11259*333d2b36SAndroid Build Coastguard Worker
11260*333d2b36SAndroid Build Coastguard Worker		// Another Prebuilt Google APEX
11261*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
11262*333d2b36SAndroid Build Coastguard Worker			name: "com.google.android.adservices.v2",
11263*333d2b36SAndroid Build Coastguard Worker			apex_name: "com.android.adservices",
11264*333d2b36SAndroid Build Coastguard Worker			src: "com.android.foo-arm.apex",
11265*333d2b36SAndroid Build Coastguard Worker		}
11266*333d2b36SAndroid Build Coastguard Worker
11267*333d2b36SAndroid Build Coastguard Worker		// APEX contribution modules
11268*333d2b36SAndroid Build Coastguard Worker
11269*333d2b36SAndroid Build Coastguard Worker
11270*333d2b36SAndroid Build Coastguard Worker		apex_contributions {
11271*333d2b36SAndroid Build Coastguard Worker			name: "adservices.prebuilt.contributions",
11272*333d2b36SAndroid Build Coastguard Worker			api_domain: "com.android.adservices",
11273*333d2b36SAndroid Build Coastguard Worker			contents: ["prebuilt_com.google.android.adservices"],
11274*333d2b36SAndroid Build Coastguard Worker		}
11275*333d2b36SAndroid Build Coastguard Worker
11276*333d2b36SAndroid Build Coastguard Worker		apex_contributions {
11277*333d2b36SAndroid Build Coastguard Worker			name: "adservices.prebuilt.v2.contributions",
11278*333d2b36SAndroid Build Coastguard Worker			api_domain: "com.android.adservices",
11279*333d2b36SAndroid Build Coastguard Worker			contents: ["prebuilt_com.google.android.adservices.v2"],
11280*333d2b36SAndroid Build Coastguard Worker		}
11281*333d2b36SAndroid Build Coastguard Worker	`
11282*333d2b36SAndroid Build Coastguard Worker
11283*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
11284*333d2b36SAndroid Build Coastguard Worker		desc                       string
11285*333d2b36SAndroid Build Coastguard Worker		selectedApexContributions  string
11286*333d2b36SAndroid Build Coastguard Worker		expectedVisibleModuleNames []string
11287*333d2b36SAndroid Build Coastguard Worker		expectedHiddenModuleNames  []string
11288*333d2b36SAndroid Build Coastguard Worker	}{
11289*333d2b36SAndroid Build Coastguard Worker		{
11290*333d2b36SAndroid Build Coastguard Worker			desc:                       "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11291*333d2b36SAndroid Build Coastguard Worker			selectedApexContributions:  "",
11292*333d2b36SAndroid Build Coastguard Worker			expectedVisibleModuleNames: []string{"com.android.adservices"},
11293*333d2b36SAndroid Build Coastguard Worker			expectedHiddenModuleNames:  []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11294*333d2b36SAndroid Build Coastguard Worker		},
11295*333d2b36SAndroid Build Coastguard Worker		{
11296*333d2b36SAndroid Build Coastguard Worker			desc:                       "Prebuilt apex prebuilt_com.android.foo is selected",
11297*333d2b36SAndroid Build Coastguard Worker			selectedApexContributions:  "adservices.prebuilt.contributions",
11298*333d2b36SAndroid Build Coastguard Worker			expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11299*333d2b36SAndroid Build Coastguard Worker			expectedHiddenModuleNames:  []string{"com.google.android.adservices.v2"},
11300*333d2b36SAndroid Build Coastguard Worker		},
11301*333d2b36SAndroid Build Coastguard Worker		{
11302*333d2b36SAndroid Build Coastguard Worker			desc:                       "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11303*333d2b36SAndroid Build Coastguard Worker			selectedApexContributions:  "adservices.prebuilt.v2.contributions",
11304*333d2b36SAndroid Build Coastguard Worker			expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11305*333d2b36SAndroid Build Coastguard Worker			expectedHiddenModuleNames:  []string{"com.google.android.adservices"},
11306*333d2b36SAndroid Build Coastguard Worker		},
11307*333d2b36SAndroid Build Coastguard Worker	}
11308*333d2b36SAndroid Build Coastguard Worker
11309*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testCases {
11310*333d2b36SAndroid Build Coastguard Worker		preparer := android.GroupFixturePreparers(
11311*333d2b36SAndroid Build Coastguard Worker			android.FixtureMergeMockFs(map[string][]byte{
11312*333d2b36SAndroid Build Coastguard Worker				"system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11313*333d2b36SAndroid Build Coastguard Worker			}),
11314*333d2b36SAndroid Build Coastguard Worker			android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
11315*333d2b36SAndroid Build Coastguard Worker		)
11316*333d2b36SAndroid Build Coastguard Worker		ctx := testApex(t, bp, preparer)
11317*333d2b36SAndroid Build Coastguard Worker
11318*333d2b36SAndroid Build Coastguard Worker		checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11319*333d2b36SAndroid Build Coastguard Worker	}
11320*333d2b36SAndroid Build Coastguard Worker}
11321*333d2b36SAndroid Build Coastguard Worker
11322*333d2b36SAndroid Build Coastguard Workerfunc TestAconfifDeclarationsValidation(t *testing.T) {
11323*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
11324*333d2b36SAndroid Build Coastguard Worker	aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11325*333d2b36SAndroid Build Coastguard Worker		for _, moduleName := range moduleNames {
11326*333d2b36SAndroid Build Coastguard Worker			ret += fmt.Sprintf(`
11327*333d2b36SAndroid Build Coastguard Worker			aconfig_declarations {
11328*333d2b36SAndroid Build Coastguard Worker				name: "%[1]s",
11329*333d2b36SAndroid Build Coastguard Worker				package: "com.example.package",
11330*333d2b36SAndroid Build Coastguard Worker				container: "system",
11331*333d2b36SAndroid Build Coastguard Worker				srcs: [
11332*333d2b36SAndroid Build Coastguard Worker					"%[1]s.aconfig",
11333*333d2b36SAndroid Build Coastguard Worker				],
11334*333d2b36SAndroid Build Coastguard Worker			}
11335*333d2b36SAndroid Build Coastguard Worker			java_aconfig_library {
11336*333d2b36SAndroid Build Coastguard Worker				name: "%[1]s-lib",
11337*333d2b36SAndroid Build Coastguard Worker				aconfig_declarations: "%[1]s",
11338*333d2b36SAndroid Build Coastguard Worker			}
11339*333d2b36SAndroid Build Coastguard Worker			`, moduleName)
11340*333d2b36SAndroid Build Coastguard Worker		}
11341*333d2b36SAndroid Build Coastguard Worker		return ret
11342*333d2b36SAndroid Build Coastguard Worker	}
11343*333d2b36SAndroid Build Coastguard Worker
11344*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
11345*333d2b36SAndroid Build Coastguard Worker		prepareForApexTest,
11346*333d2b36SAndroid Build Coastguard Worker		java.PrepareForTestWithJavaSdkLibraryFiles,
11347*333d2b36SAndroid Build Coastguard Worker		java.FixtureWithLastReleaseApis("foo"),
11348*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
11349*333d2b36SAndroid Build Coastguard Worker		java_library {
11350*333d2b36SAndroid Build Coastguard Worker			name: "baz-java-lib",
11351*333d2b36SAndroid Build Coastguard Worker			static_libs: [
11352*333d2b36SAndroid Build Coastguard Worker				"baz-lib",
11353*333d2b36SAndroid Build Coastguard Worker			],
11354*333d2b36SAndroid Build Coastguard Worker		}
11355*333d2b36SAndroid Build Coastguard Worker		filegroup {
11356*333d2b36SAndroid Build Coastguard Worker			name: "qux-filegroup",
11357*333d2b36SAndroid Build Coastguard Worker			device_common_srcs: [
11358*333d2b36SAndroid Build Coastguard Worker				":qux-lib{.generated_srcjars}",
11359*333d2b36SAndroid Build Coastguard Worker			],
11360*333d2b36SAndroid Build Coastguard Worker		}
11361*333d2b36SAndroid Build Coastguard Worker		filegroup {
11362*333d2b36SAndroid Build Coastguard Worker			name: "qux-another-filegroup",
11363*333d2b36SAndroid Build Coastguard Worker			srcs: [
11364*333d2b36SAndroid Build Coastguard Worker				":qux-filegroup",
11365*333d2b36SAndroid Build Coastguard Worker			],
11366*333d2b36SAndroid Build Coastguard Worker		}
11367*333d2b36SAndroid Build Coastguard Worker		java_library {
11368*333d2b36SAndroid Build Coastguard Worker			name: "quux-java-lib",
11369*333d2b36SAndroid Build Coastguard Worker			srcs: [
11370*333d2b36SAndroid Build Coastguard Worker				"a.java",
11371*333d2b36SAndroid Build Coastguard Worker			],
11372*333d2b36SAndroid Build Coastguard Worker			libs: [
11373*333d2b36SAndroid Build Coastguard Worker				"quux-lib",
11374*333d2b36SAndroid Build Coastguard Worker			],
11375*333d2b36SAndroid Build Coastguard Worker		}
11376*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
11377*333d2b36SAndroid Build Coastguard Worker			name: "foo",
11378*333d2b36SAndroid Build Coastguard Worker			srcs: [
11379*333d2b36SAndroid Build Coastguard Worker				":qux-another-filegroup",
11380*333d2b36SAndroid Build Coastguard Worker			],
11381*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
11382*333d2b36SAndroid Build Coastguard Worker			system: {
11383*333d2b36SAndroid Build Coastguard Worker				enabled: true,
11384*333d2b36SAndroid Build Coastguard Worker			},
11385*333d2b36SAndroid Build Coastguard Worker			module_lib: {
11386*333d2b36SAndroid Build Coastguard Worker				enabled: true,
11387*333d2b36SAndroid Build Coastguard Worker			},
11388*333d2b36SAndroid Build Coastguard Worker			test: {
11389*333d2b36SAndroid Build Coastguard Worker				enabled: true,
11390*333d2b36SAndroid Build Coastguard Worker			},
11391*333d2b36SAndroid Build Coastguard Worker			static_libs: [
11392*333d2b36SAndroid Build Coastguard Worker				"bar-lib",
11393*333d2b36SAndroid Build Coastguard Worker			],
11394*333d2b36SAndroid Build Coastguard Worker			libs: [
11395*333d2b36SAndroid Build Coastguard Worker				"baz-java-lib",
11396*333d2b36SAndroid Build Coastguard Worker				"quux-java-lib",
11397*333d2b36SAndroid Build Coastguard Worker			],
11398*333d2b36SAndroid Build Coastguard Worker			aconfig_declarations: [
11399*333d2b36SAndroid Build Coastguard Worker				"bar",
11400*333d2b36SAndroid Build Coastguard Worker			],
11401*333d2b36SAndroid Build Coastguard Worker		}
11402*333d2b36SAndroid Build Coastguard Worker	`+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11403*333d2b36SAndroid Build Coastguard Worker
11404*333d2b36SAndroid Build Coastguard Worker	m := result.ModuleForTests("foo.stubs.source", "android_common")
11405*333d2b36SAndroid Build Coastguard Worker	outDir := "out/soong/.intermediates"
11406*333d2b36SAndroid Build Coastguard Worker
11407*333d2b36SAndroid Build Coastguard Worker	// Arguments passed to aconfig to retrieve the state of the flags defined in the
11408*333d2b36SAndroid Build Coastguard Worker	// textproto files
11409*333d2b36SAndroid Build Coastguard Worker	aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11410*333d2b36SAndroid Build Coastguard Worker
11411*333d2b36SAndroid Build Coastguard Worker	// "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11412*333d2b36SAndroid Build Coastguard Worker	// cache file provided by the associated aconfig_declarations module "bar" should be passed
11413*333d2b36SAndroid Build Coastguard Worker	// to aconfig.
11414*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11415*333d2b36SAndroid Build Coastguard Worker		"passed as an input",
11416*333d2b36SAndroid Build Coastguard Worker		aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11417*333d2b36SAndroid Build Coastguard Worker
11418*333d2b36SAndroid Build Coastguard Worker	// "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11419*333d2b36SAndroid Build Coastguard Worker	// to metalava as classpath. Thus the cache file provided by the associated
11420*333d2b36SAndroid Build Coastguard Worker	// aconfig_declarations module "baz" should be passed to aconfig.
11421*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11422*333d2b36SAndroid Build Coastguard Worker		"java_aconfig_library passed as an input",
11423*333d2b36SAndroid Build Coastguard Worker		aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11424*333d2b36SAndroid Build Coastguard Worker
11425*333d2b36SAndroid Build Coastguard Worker	// "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11426*333d2b36SAndroid Build Coastguard Worker	// the associated aconfig_declarations module "qux" should be passed to aconfig.
11427*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11428*333d2b36SAndroid Build Coastguard Worker		"input",
11429*333d2b36SAndroid Build Coastguard Worker		aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11430*333d2b36SAndroid Build Coastguard Worker
11431*333d2b36SAndroid Build Coastguard Worker	// "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11432*333d2b36SAndroid Build Coastguard Worker	// statically depend on "quux-lib". Therefore, the cache file provided by the associated
11433*333d2b36SAndroid Build Coastguard Worker	// aconfig_declarations module "quux" should not be passed to aconfig.
11434*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11435*333d2b36SAndroid Build Coastguard Worker		"depend on java_aconfig_library not passed as an input",
11436*333d2b36SAndroid Build Coastguard Worker		aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11437*333d2b36SAndroid Build Coastguard Worker}
11438*333d2b36SAndroid Build Coastguard Worker
11439*333d2b36SAndroid Build Coastguard Workerfunc TestMultiplePrebuiltsWithSameBase(t *testing.T) {
11440*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
11441*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
11442*333d2b36SAndroid Build Coastguard Worker		apex {
11443*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
11444*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
11445*333d2b36SAndroid Build Coastguard Worker			prebuilts: ["myetc", "myetc2"],
11446*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
11447*333d2b36SAndroid Build Coastguard Worker		}
11448*333d2b36SAndroid Build Coastguard Worker		apex_key {
11449*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
11450*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
11451*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
11452*333d2b36SAndroid Build Coastguard Worker		}
11453*333d2b36SAndroid Build Coastguard Worker
11454*333d2b36SAndroid Build Coastguard Worker		prebuilt_etc {
11455*333d2b36SAndroid Build Coastguard Worker			name: "myetc",
11456*333d2b36SAndroid Build Coastguard Worker			src: "myprebuilt",
11457*333d2b36SAndroid Build Coastguard Worker			filename: "myfilename",
11458*333d2b36SAndroid Build Coastguard Worker		}
11459*333d2b36SAndroid Build Coastguard Worker		prebuilt_etc {
11460*333d2b36SAndroid Build Coastguard Worker			name: "myetc2",
11461*333d2b36SAndroid Build Coastguard Worker			sub_dir: "mysubdir",
11462*333d2b36SAndroid Build Coastguard Worker			src: "myprebuilt",
11463*333d2b36SAndroid Build Coastguard Worker			filename: "myfilename",
11464*333d2b36SAndroid Build Coastguard Worker		}
11465*333d2b36SAndroid Build Coastguard Worker	`, withFiles(android.MockFS{
11466*333d2b36SAndroid Build Coastguard Worker		"packages/modules/common/build/allowed_deps.txt": nil,
11467*333d2b36SAndroid Build Coastguard Worker	}))
11468*333d2b36SAndroid Build Coastguard Worker
11469*333d2b36SAndroid Build Coastguard Worker	ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11470*333d2b36SAndroid Build Coastguard Worker	data := android.AndroidMkDataForTest(t, ctx, ab)
11471*333d2b36SAndroid Build Coastguard Worker	var builder strings.Builder
11472*333d2b36SAndroid Build Coastguard Worker	data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11473*333d2b36SAndroid Build Coastguard Worker	androidMk := builder.String()
11474*333d2b36SAndroid Build Coastguard Worker
11475*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11476*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11477*333d2b36SAndroid Build Coastguard Worker}
11478*333d2b36SAndroid Build Coastguard Worker
11479*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersionOverride(t *testing.T) {
11480*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
11481*333d2b36SAndroid Build Coastguard Worker	checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11482*333d2b36SAndroid Build Coastguard Worker		args := module.Rule("apexRule").Args
11483*333d2b36SAndroid Build Coastguard Worker		optFlags := args["opt_flags"]
11484*333d2b36SAndroid Build Coastguard Worker		if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11485*333d2b36SAndroid Build Coastguard Worker			t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11486*333d2b36SAndroid Build Coastguard Worker		}
11487*333d2b36SAndroid Build Coastguard Worker	}
11488*333d2b36SAndroid Build Coastguard Worker
11489*333d2b36SAndroid Build Coastguard Worker	checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11490*333d2b36SAndroid Build Coastguard Worker		t.Helper()
11491*333d2b36SAndroid Build Coastguard Worker		found := false
11492*333d2b36SAndroid Build Coastguard Worker		ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11493*333d2b36SAndroid Build Coastguard Worker			if dep == wantDep {
11494*333d2b36SAndroid Build Coastguard Worker				found = true
11495*333d2b36SAndroid Build Coastguard Worker			}
11496*333d2b36SAndroid Build Coastguard Worker		})
11497*333d2b36SAndroid Build Coastguard Worker		if !found {
11498*333d2b36SAndroid Build Coastguard Worker			t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11499*333d2b36SAndroid Build Coastguard Worker		}
11500*333d2b36SAndroid Build Coastguard Worker	}
11501*333d2b36SAndroid Build Coastguard Worker
11502*333d2b36SAndroid Build Coastguard Worker	ctx := testApex(t, `
11503*333d2b36SAndroid Build Coastguard Worker		apex {
11504*333d2b36SAndroid Build Coastguard Worker			name: "com.android.apex30",
11505*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "30",
11506*333d2b36SAndroid Build Coastguard Worker			key: "apex30.key",
11507*333d2b36SAndroid Build Coastguard Worker			java_libs: ["javalib"],
11508*333d2b36SAndroid Build Coastguard Worker		}
11509*333d2b36SAndroid Build Coastguard Worker
11510*333d2b36SAndroid Build Coastguard Worker		java_library {
11511*333d2b36SAndroid Build Coastguard Worker			name: "javalib",
11512*333d2b36SAndroid Build Coastguard Worker			srcs: ["A.java"],
11513*333d2b36SAndroid Build Coastguard Worker			apex_available: ["com.android.apex30"],
11514*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "30",
11515*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
11516*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
11517*333d2b36SAndroid Build Coastguard Worker		}
11518*333d2b36SAndroid Build Coastguard Worker
11519*333d2b36SAndroid Build Coastguard Worker		override_apex {
11520*333d2b36SAndroid Build Coastguard Worker			name: "com.mycompany.android.apex30",
11521*333d2b36SAndroid Build Coastguard Worker			base: "com.android.apex30",
11522*333d2b36SAndroid Build Coastguard Worker		}
11523*333d2b36SAndroid Build Coastguard Worker
11524*333d2b36SAndroid Build Coastguard Worker		override_apex {
11525*333d2b36SAndroid Build Coastguard Worker			name: "com.mycompany.android.apex31",
11526*333d2b36SAndroid Build Coastguard Worker			base: "com.android.apex30",
11527*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "31",
11528*333d2b36SAndroid Build Coastguard Worker		}
11529*333d2b36SAndroid Build Coastguard Worker
11530*333d2b36SAndroid Build Coastguard Worker		apex_key {
11531*333d2b36SAndroid Build Coastguard Worker			name: "apex30.key",
11532*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
11533*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
11534*333d2b36SAndroid Build Coastguard Worker		}
11535*333d2b36SAndroid Build Coastguard Worker
11536*333d2b36SAndroid Build Coastguard Worker	`, android.FixtureMergeMockFs(android.MockFS{
11537*333d2b36SAndroid Build Coastguard Worker		"system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11538*333d2b36SAndroid Build Coastguard Worker	}),
11539*333d2b36SAndroid Build Coastguard Worker	)
11540*333d2b36SAndroid Build Coastguard Worker
11541*333d2b36SAndroid Build Coastguard Worker	baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11542*333d2b36SAndroid Build Coastguard Worker	checkMinSdkVersion(t, baseModule, "30")
11543*333d2b36SAndroid Build Coastguard Worker
11544*333d2b36SAndroid Build Coastguard Worker	// Override module, but uses same min_sdk_version
11545*333d2b36SAndroid Build Coastguard Worker	overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11546*333d2b36SAndroid Build Coastguard Worker	javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11547*333d2b36SAndroid Build Coastguard Worker	checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11548*333d2b36SAndroid Build Coastguard Worker	checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11549*333d2b36SAndroid Build Coastguard Worker
11550*333d2b36SAndroid Build Coastguard Worker	// Override module, uses different min_sdk_version
11551*333d2b36SAndroid Build Coastguard Worker	overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11552*333d2b36SAndroid Build Coastguard Worker	javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11553*333d2b36SAndroid Build Coastguard Worker	checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11554*333d2b36SAndroid Build Coastguard Worker	checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11555*333d2b36SAndroid Build Coastguard Worker}
11556*333d2b36SAndroid Build Coastguard Worker
11557*333d2b36SAndroid Build Coastguard Workerfunc TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
11558*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
11559*333d2b36SAndroid Build Coastguard Worker	context := android.GroupFixturePreparers(
11560*333d2b36SAndroid Build Coastguard Worker		android.PrepareForIntegrationTestWithAndroid,
11561*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithApexBuildComponents,
11562*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(android.MockFS{
11563*333d2b36SAndroid Build Coastguard Worker			"system/sepolicy/apex/foo-file_contexts": nil,
11564*333d2b36SAndroid Build Coastguard Worker		}),
11565*333d2b36SAndroid Build Coastguard Worker	)
11566*333d2b36SAndroid Build Coastguard Worker	res := context.RunTestWithBp(t, `
11567*333d2b36SAndroid Build Coastguard Worker		apex {
11568*333d2b36SAndroid Build Coastguard Worker			name: "foo",
11569*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
11570*333d2b36SAndroid Build Coastguard Worker			apex_available_name: "com.android.foo",
11571*333d2b36SAndroid Build Coastguard Worker			variant_version: "0",
11572*333d2b36SAndroid Build Coastguard Worker			updatable: false,
11573*333d2b36SAndroid Build Coastguard Worker		}
11574*333d2b36SAndroid Build Coastguard Worker		apex_key {
11575*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
11576*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
11577*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
11578*333d2b36SAndroid Build Coastguard Worker		}
11579*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
11580*333d2b36SAndroid Build Coastguard Worker			name: "foo",
11581*333d2b36SAndroid Build Coastguard Worker			src: "foo.apex",
11582*333d2b36SAndroid Build Coastguard Worker			prefer: true,
11583*333d2b36SAndroid Build Coastguard Worker		}
11584*333d2b36SAndroid Build Coastguard Worker		override_apex {
11585*333d2b36SAndroid Build Coastguard Worker			name: "myoverrideapex",
11586*333d2b36SAndroid Build Coastguard Worker			base: "foo",
11587*333d2b36SAndroid Build Coastguard Worker		}
11588*333d2b36SAndroid Build Coastguard Worker	`)
11589*333d2b36SAndroid Build Coastguard Worker
11590*333d2b36SAndroid Build Coastguard Worker	java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11591*333d2b36SAndroid Build Coastguard Worker}
11592*333d2b36SAndroid Build Coastguard Worker
11593*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
11594*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
11595*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `"myapex" .*: updatable: updatable APEXes should not set min_sdk_version to current. Please use a finalized API level or a recognized in-development codename`, `
11596*333d2b36SAndroid Build Coastguard Worker		apex {
11597*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
11598*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
11599*333d2b36SAndroid Build Coastguard Worker			updatable: true,
11600*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "current",
11601*333d2b36SAndroid Build Coastguard Worker		}
11602*333d2b36SAndroid Build Coastguard Worker
11603*333d2b36SAndroid Build Coastguard Worker		apex_key {
11604*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
11605*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
11606*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
11607*333d2b36SAndroid Build Coastguard Worker		}
11608*333d2b36SAndroid Build Coastguard Worker	`)
11609*333d2b36SAndroid Build Coastguard Worker}
11610*333d2b36SAndroid Build Coastguard Worker
11611*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltStubNoinstall(t *testing.T) {
11612*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
11613*333d2b36SAndroid Build Coastguard Worker	testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11614*333d2b36SAndroid Build Coastguard Worker		result := android.GroupFixturePreparers(
11615*333d2b36SAndroid Build Coastguard Worker			prepareForApexTest,
11616*333d2b36SAndroid Build Coastguard Worker			android.PrepareForTestWithAndroidMk,
11617*333d2b36SAndroid Build Coastguard Worker			android.PrepareForTestWithMakevars,
11618*333d2b36SAndroid Build Coastguard Worker			android.FixtureMergeMockFs(fs),
11619*333d2b36SAndroid Build Coastguard Worker		).RunTest(t)
11620*333d2b36SAndroid Build Coastguard Worker
11621*333d2b36SAndroid Build Coastguard Worker		ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
11622*333d2b36SAndroid Build Coastguard Worker		android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
11623*333d2b36SAndroid Build Coastguard Worker
11624*333d2b36SAndroid Build Coastguard Worker		installRules := result.InstallMakeRulesForTesting(t)
11625*333d2b36SAndroid Build Coastguard Worker
11626*333d2b36SAndroid Build Coastguard Worker		var installedlibRule *android.InstallMakeRule
11627*333d2b36SAndroid Build Coastguard Worker		for i, rule := range installRules {
11628*333d2b36SAndroid Build Coastguard Worker			if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11629*333d2b36SAndroid Build Coastguard Worker				if installedlibRule != nil {
11630*333d2b36SAndroid Build Coastguard Worker					t.Errorf("Duplicate install rules for %s", rule.Target)
11631*333d2b36SAndroid Build Coastguard Worker				}
11632*333d2b36SAndroid Build Coastguard Worker				installedlibRule = &installRules[i]
11633*333d2b36SAndroid Build Coastguard Worker			}
11634*333d2b36SAndroid Build Coastguard Worker		}
11635*333d2b36SAndroid Build Coastguard Worker		if installedlibRule == nil {
11636*333d2b36SAndroid Build Coastguard Worker			t.Errorf("No install rule found for installedlib")
11637*333d2b36SAndroid Build Coastguard Worker			return
11638*333d2b36SAndroid Build Coastguard Worker		}
11639*333d2b36SAndroid Build Coastguard Worker
11640*333d2b36SAndroid Build Coastguard Worker		if expectLibfooOnSystemLib {
11641*333d2b36SAndroid Build Coastguard Worker			android.AssertStringListContains(t,
11642*333d2b36SAndroid Build Coastguard Worker				"installedlib doesn't have install dependency on libfoo impl",
11643*333d2b36SAndroid Build Coastguard Worker				installedlibRule.OrderOnlyDeps,
11644*333d2b36SAndroid Build Coastguard Worker				"out/target/product/test_device/system/lib/libfoo.so")
11645*333d2b36SAndroid Build Coastguard Worker		} else {
11646*333d2b36SAndroid Build Coastguard Worker			android.AssertStringListDoesNotContain(t,
11647*333d2b36SAndroid Build Coastguard Worker				"installedlib has install dependency on libfoo stub",
11648*333d2b36SAndroid Build Coastguard Worker				installedlibRule.Deps,
11649*333d2b36SAndroid Build Coastguard Worker				"out/target/product/test_device/system/lib/libfoo.so")
11650*333d2b36SAndroid Build Coastguard Worker			android.AssertStringListDoesNotContain(t,
11651*333d2b36SAndroid Build Coastguard Worker				"installedlib has order-only install dependency on libfoo stub",
11652*333d2b36SAndroid Build Coastguard Worker				installedlibRule.OrderOnlyDeps,
11653*333d2b36SAndroid Build Coastguard Worker				"out/target/product/test_device/system/lib/libfoo.so")
11654*333d2b36SAndroid Build Coastguard Worker		}
11655*333d2b36SAndroid Build Coastguard Worker	}
11656*333d2b36SAndroid Build Coastguard Worker
11657*333d2b36SAndroid Build Coastguard Worker	prebuiltLibfooBp := []byte(`
11658*333d2b36SAndroid Build Coastguard Worker		cc_prebuilt_library {
11659*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
11660*333d2b36SAndroid Build Coastguard Worker			prefer: true,
11661*333d2b36SAndroid Build Coastguard Worker			srcs: ["libfoo.so"],
11662*333d2b36SAndroid Build Coastguard Worker			stubs: {
11663*333d2b36SAndroid Build Coastguard Worker				versions: ["1"],
11664*333d2b36SAndroid Build Coastguard Worker			},
11665*333d2b36SAndroid Build Coastguard Worker			apex_available: ["apexfoo"],
11666*333d2b36SAndroid Build Coastguard Worker		}
11667*333d2b36SAndroid Build Coastguard Worker	`)
11668*333d2b36SAndroid Build Coastguard Worker
11669*333d2b36SAndroid Build Coastguard Worker	apexfooBp := []byte(`
11670*333d2b36SAndroid Build Coastguard Worker		apex {
11671*333d2b36SAndroid Build Coastguard Worker			name: "apexfoo",
11672*333d2b36SAndroid Build Coastguard Worker			key: "apexfoo.key",
11673*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["libfoo"],
11674*333d2b36SAndroid Build Coastguard Worker			updatable: false,
11675*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "both",
11676*333d2b36SAndroid Build Coastguard Worker		}
11677*333d2b36SAndroid Build Coastguard Worker		apex_key {
11678*333d2b36SAndroid Build Coastguard Worker			name: "apexfoo.key",
11679*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
11680*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
11681*333d2b36SAndroid Build Coastguard Worker		}
11682*333d2b36SAndroid Build Coastguard Worker	`)
11683*333d2b36SAndroid Build Coastguard Worker
11684*333d2b36SAndroid Build Coastguard Worker	installedlibBp := []byte(`
11685*333d2b36SAndroid Build Coastguard Worker		cc_library {
11686*333d2b36SAndroid Build Coastguard Worker			name: "installedlib",
11687*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libfoo"],
11688*333d2b36SAndroid Build Coastguard Worker		}
11689*333d2b36SAndroid Build Coastguard Worker	`)
11690*333d2b36SAndroid Build Coastguard Worker
11691*333d2b36SAndroid Build Coastguard Worker	t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
11692*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
11693*333d2b36SAndroid Build Coastguard Worker		testFunc(
11694*333d2b36SAndroid Build Coastguard Worker			t,
11695*333d2b36SAndroid Build Coastguard Worker			/*expectLibfooOnSystemLib=*/ false,
11696*333d2b36SAndroid Build Coastguard Worker			android.MockFS{
11697*333d2b36SAndroid Build Coastguard Worker				"prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11698*333d2b36SAndroid Build Coastguard Worker				"apexfoo/Android.bp":                          apexfooBp,
11699*333d2b36SAndroid Build Coastguard Worker				"system/sepolicy/apex/apexfoo-file_contexts":  nil,
11700*333d2b36SAndroid Build Coastguard Worker				"Android.bp": installedlibBp,
11701*333d2b36SAndroid Build Coastguard Worker			},
11702*333d2b36SAndroid Build Coastguard Worker		)
11703*333d2b36SAndroid Build Coastguard Worker	})
11704*333d2b36SAndroid Build Coastguard Worker
11705*333d2b36SAndroid Build Coastguard Worker	disabledSourceLibfooBp := []byte(`
11706*333d2b36SAndroid Build Coastguard Worker		cc_library {
11707*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
11708*333d2b36SAndroid Build Coastguard Worker			enabled: false,
11709*333d2b36SAndroid Build Coastguard Worker			stubs: {
11710*333d2b36SAndroid Build Coastguard Worker				versions: ["1"],
11711*333d2b36SAndroid Build Coastguard Worker			},
11712*333d2b36SAndroid Build Coastguard Worker			apex_available: ["apexfoo"],
11713*333d2b36SAndroid Build Coastguard Worker		}
11714*333d2b36SAndroid Build Coastguard Worker	`)
11715*333d2b36SAndroid Build Coastguard Worker
11716*333d2b36SAndroid Build Coastguard Worker	t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
11717*333d2b36SAndroid Build Coastguard Worker		t.Parallel()
11718*333d2b36SAndroid Build Coastguard Worker		testFunc(
11719*333d2b36SAndroid Build Coastguard Worker			t,
11720*333d2b36SAndroid Build Coastguard Worker			/*expectLibfooOnSystemLib=*/ false,
11721*333d2b36SAndroid Build Coastguard Worker			android.MockFS{
11722*333d2b36SAndroid Build Coastguard Worker				"prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11723*333d2b36SAndroid Build Coastguard Worker				"impl/Android.bp":                            disabledSourceLibfooBp,
11724*333d2b36SAndroid Build Coastguard Worker				"apexfoo/Android.bp":                         apexfooBp,
11725*333d2b36SAndroid Build Coastguard Worker				"system/sepolicy/apex/apexfoo-file_contexts": nil,
11726*333d2b36SAndroid Build Coastguard Worker				"Android.bp":                                 installedlibBp,
11727*333d2b36SAndroid Build Coastguard Worker			},
11728*333d2b36SAndroid Build Coastguard Worker		)
11729*333d2b36SAndroid Build Coastguard Worker	})
11730*333d2b36SAndroid Build Coastguard Worker}
11731*333d2b36SAndroid Build Coastguard Worker
11732*333d2b36SAndroid Build Coastguard Workerfunc TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
11733*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
11734*333d2b36SAndroid Build Coastguard Worker	// This test case tests that listing the impl lib instead of the top level java_sdk_library
11735*333d2b36SAndroid Build Coastguard Worker	// in libs of android_app and java_library does not lead to class loader context device/host
11736*333d2b36SAndroid Build Coastguard Worker	// path mismatch errors.
11737*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
11738*333d2b36SAndroid Build Coastguard Worker		prepareForApexTest,
11739*333d2b36SAndroid Build Coastguard Worker		android.PrepareForIntegrationTestWithAndroid,
11740*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithApexBuildComponents,
11741*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyEnv(func(env map[string]string) {
11742*333d2b36SAndroid Build Coastguard Worker			env["DISABLE_CONTAINER_CHECK"] = "true"
11743*333d2b36SAndroid Build Coastguard Worker		}),
11744*333d2b36SAndroid Build Coastguard Worker		withFiles(filesForSdkLibrary),
11745*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(android.MockFS{
11746*333d2b36SAndroid Build Coastguard Worker			"system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11747*333d2b36SAndroid Build Coastguard Worker		}),
11748*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
11749*333d2b36SAndroid Build Coastguard Worker		apex {
11750*333d2b36SAndroid Build Coastguard Worker		name: "com.android.foo30",
11751*333d2b36SAndroid Build Coastguard Worker		key: "myapex.key",
11752*333d2b36SAndroid Build Coastguard Worker		updatable: true,
11753*333d2b36SAndroid Build Coastguard Worker		bootclasspath_fragments: [
11754*333d2b36SAndroid Build Coastguard Worker			"foo-bootclasspath-fragment",
11755*333d2b36SAndroid Build Coastguard Worker		],
11756*333d2b36SAndroid Build Coastguard Worker		java_libs: [
11757*333d2b36SAndroid Build Coastguard Worker			"bar",
11758*333d2b36SAndroid Build Coastguard Worker		],
11759*333d2b36SAndroid Build Coastguard Worker		apps: [
11760*333d2b36SAndroid Build Coastguard Worker			"bar-app",
11761*333d2b36SAndroid Build Coastguard Worker		],
11762*333d2b36SAndroid Build Coastguard Worker		min_sdk_version: "30",
11763*333d2b36SAndroid Build Coastguard Worker		}
11764*333d2b36SAndroid Build Coastguard Worker		apex_key {
11765*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
11766*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
11767*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
11768*333d2b36SAndroid Build Coastguard Worker		}
11769*333d2b36SAndroid Build Coastguard Worker		bootclasspath_fragment {
11770*333d2b36SAndroid Build Coastguard Worker			name: "foo-bootclasspath-fragment",
11771*333d2b36SAndroid Build Coastguard Worker			contents: [
11772*333d2b36SAndroid Build Coastguard Worker				"framework-foo",
11773*333d2b36SAndroid Build Coastguard Worker			],
11774*333d2b36SAndroid Build Coastguard Worker			apex_available: [
11775*333d2b36SAndroid Build Coastguard Worker				"com.android.foo30",
11776*333d2b36SAndroid Build Coastguard Worker			],
11777*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
11778*333d2b36SAndroid Build Coastguard Worker				split_packages: ["*"]
11779*333d2b36SAndroid Build Coastguard Worker			},
11780*333d2b36SAndroid Build Coastguard Worker		}
11781*333d2b36SAndroid Build Coastguard Worker
11782*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
11783*333d2b36SAndroid Build Coastguard Worker			name: "framework-foo",
11784*333d2b36SAndroid Build Coastguard Worker			srcs: [
11785*333d2b36SAndroid Build Coastguard Worker				"A.java"
11786*333d2b36SAndroid Build Coastguard Worker			],
11787*333d2b36SAndroid Build Coastguard Worker			unsafe_ignore_missing_latest_api: true,
11788*333d2b36SAndroid Build Coastguard Worker			apex_available: [
11789*333d2b36SAndroid Build Coastguard Worker				"com.android.foo30",
11790*333d2b36SAndroid Build Coastguard Worker			],
11791*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
11792*333d2b36SAndroid Build Coastguard Worker			sdk_version: "core_current",
11793*333d2b36SAndroid Build Coastguard Worker			shared_library: false,
11794*333d2b36SAndroid Build Coastguard Worker		}
11795*333d2b36SAndroid Build Coastguard Worker
11796*333d2b36SAndroid Build Coastguard Worker		java_library {
11797*333d2b36SAndroid Build Coastguard Worker			name: "bar",
11798*333d2b36SAndroid Build Coastguard Worker			srcs: [
11799*333d2b36SAndroid Build Coastguard Worker				"A.java"
11800*333d2b36SAndroid Build Coastguard Worker			],
11801*333d2b36SAndroid Build Coastguard Worker			libs: [
11802*333d2b36SAndroid Build Coastguard Worker				"framework-foo.impl",
11803*333d2b36SAndroid Build Coastguard Worker			],
11804*333d2b36SAndroid Build Coastguard Worker			apex_available: [
11805*333d2b36SAndroid Build Coastguard Worker				"com.android.foo30",
11806*333d2b36SAndroid Build Coastguard Worker			],
11807*333d2b36SAndroid Build Coastguard Worker			sdk_version: "core_current",
11808*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
11809*333d2b36SAndroid Build Coastguard Worker		}
11810*333d2b36SAndroid Build Coastguard Worker
11811*333d2b36SAndroid Build Coastguard Worker		java_library {
11812*333d2b36SAndroid Build Coastguard Worker			name: "baz",
11813*333d2b36SAndroid Build Coastguard Worker			srcs: [
11814*333d2b36SAndroid Build Coastguard Worker				"A.java"
11815*333d2b36SAndroid Build Coastguard Worker			],
11816*333d2b36SAndroid Build Coastguard Worker			libs: [
11817*333d2b36SAndroid Build Coastguard Worker				"bar",
11818*333d2b36SAndroid Build Coastguard Worker			],
11819*333d2b36SAndroid Build Coastguard Worker			sdk_version: "core_current",
11820*333d2b36SAndroid Build Coastguard Worker		}
11821*333d2b36SAndroid Build Coastguard Worker
11822*333d2b36SAndroid Build Coastguard Worker		android_app {
11823*333d2b36SAndroid Build Coastguard Worker			name: "bar-app",
11824*333d2b36SAndroid Build Coastguard Worker			srcs: [
11825*333d2b36SAndroid Build Coastguard Worker				"A.java"
11826*333d2b36SAndroid Build Coastguard Worker			],
11827*333d2b36SAndroid Build Coastguard Worker			libs: [
11828*333d2b36SAndroid Build Coastguard Worker				"baz",
11829*333d2b36SAndroid Build Coastguard Worker				"framework-foo.impl",
11830*333d2b36SAndroid Build Coastguard Worker			],
11831*333d2b36SAndroid Build Coastguard Worker			apex_available: [
11832*333d2b36SAndroid Build Coastguard Worker				"com.android.foo30",
11833*333d2b36SAndroid Build Coastguard Worker			],
11834*333d2b36SAndroid Build Coastguard Worker			sdk_version: "core_current",
11835*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "30",
11836*333d2b36SAndroid Build Coastguard Worker			manifest: "AndroidManifest.xml",
11837*333d2b36SAndroid Build Coastguard Worker			updatable: true,
11838*333d2b36SAndroid Build Coastguard Worker		}
11839*333d2b36SAndroid Build Coastguard Worker       `)
11840*333d2b36SAndroid Build Coastguard Worker}
11841*333d2b36SAndroid Build Coastguard Worker
11842*333d2b36SAndroid Build Coastguard Worker// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
11843*333d2b36SAndroid Build Coastguard Workerfunc TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
11844*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
11845*333d2b36SAndroid Build Coastguard Worker	testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
11846*333d2b36SAndroid Build Coastguard Worker		apex {
11847*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
11848*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
11849*333d2b36SAndroid Build Coastguard Worker			systemserverclasspath_fragments: [
11850*333d2b36SAndroid Build Coastguard Worker				"mysystemserverclasspathfragment",
11851*333d2b36SAndroid Build Coastguard Worker			],
11852*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
11853*333d2b36SAndroid Build Coastguard Worker			updatable: true,
11854*333d2b36SAndroid Build Coastguard Worker			system_ext_specific: true,
11855*333d2b36SAndroid Build Coastguard Worker		}
11856*333d2b36SAndroid Build Coastguard Worker
11857*333d2b36SAndroid Build Coastguard Worker		apex_key {
11858*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
11859*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
11860*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
11861*333d2b36SAndroid Build Coastguard Worker		}
11862*333d2b36SAndroid Build Coastguard Worker
11863*333d2b36SAndroid Build Coastguard Worker		java_library {
11864*333d2b36SAndroid Build Coastguard Worker			name: "foo",
11865*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
11866*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
11867*333d2b36SAndroid Build Coastguard Worker			installable: true,
11868*333d2b36SAndroid Build Coastguard Worker			apex_available: [
11869*333d2b36SAndroid Build Coastguard Worker				"myapex",
11870*333d2b36SAndroid Build Coastguard Worker			],
11871*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
11872*333d2b36SAndroid Build Coastguard Worker		}
11873*333d2b36SAndroid Build Coastguard Worker
11874*333d2b36SAndroid Build Coastguard Worker		systemserverclasspath_fragment {
11875*333d2b36SAndroid Build Coastguard Worker			name: "mysystemserverclasspathfragment",
11876*333d2b36SAndroid Build Coastguard Worker			contents: [
11877*333d2b36SAndroid Build Coastguard Worker				"foo",
11878*333d2b36SAndroid Build Coastguard Worker			],
11879*333d2b36SAndroid Build Coastguard Worker			apex_available: [
11880*333d2b36SAndroid Build Coastguard Worker				"myapex",
11881*333d2b36SAndroid Build Coastguard Worker			],
11882*333d2b36SAndroid Build Coastguard Worker		}
11883*333d2b36SAndroid Build Coastguard Worker	`,
11884*333d2b36SAndroid Build Coastguard Worker		dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
11885*333d2b36SAndroid Build Coastguard Worker	)
11886*333d2b36SAndroid Build Coastguard Worker}
11887*333d2b36SAndroid Build Coastguard Worker
11888*333d2b36SAndroid Build Coastguard Worker// partitions should not package the artifacts that are included inside the apex.
11889*333d2b36SAndroid Build Coastguard Workerfunc TestFilesystemWithApexDeps(t *testing.T) {
11890*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
11891*333d2b36SAndroid Build Coastguard Worker	result := testApex(t, `
11892*333d2b36SAndroid Build Coastguard Worker		android_filesystem {
11893*333d2b36SAndroid Build Coastguard Worker			name: "myfilesystem",
11894*333d2b36SAndroid Build Coastguard Worker			deps: ["myapex"],
11895*333d2b36SAndroid Build Coastguard Worker		}
11896*333d2b36SAndroid Build Coastguard Worker		apex {
11897*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
11898*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
11899*333d2b36SAndroid Build Coastguard Worker			binaries: ["binfoo"],
11900*333d2b36SAndroid Build Coastguard Worker			native_shared_libs: ["libfoo"],
11901*333d2b36SAndroid Build Coastguard Worker			apps: ["appfoo"],
11902*333d2b36SAndroid Build Coastguard Worker			updatable: false,
11903*333d2b36SAndroid Build Coastguard Worker		}
11904*333d2b36SAndroid Build Coastguard Worker		apex_key {
11905*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
11906*333d2b36SAndroid Build Coastguard Worker		}
11907*333d2b36SAndroid Build Coastguard Worker		cc_binary {
11908*333d2b36SAndroid Build Coastguard Worker			name: "binfoo",
11909*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
11910*333d2b36SAndroid Build Coastguard Worker		}
11911*333d2b36SAndroid Build Coastguard Worker		cc_library {
11912*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
11913*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
11914*333d2b36SAndroid Build Coastguard Worker		}
11915*333d2b36SAndroid Build Coastguard Worker		android_app {
11916*333d2b36SAndroid Build Coastguard Worker			name: "appfoo",
11917*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
11918*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
11919*333d2b36SAndroid Build Coastguard Worker		}
11920*333d2b36SAndroid Build Coastguard Worker	`, filesystem.PrepareForTestWithFilesystemBuildComponents)
11921*333d2b36SAndroid Build Coastguard Worker
11922*333d2b36SAndroid Build Coastguard Worker	partition := result.ModuleForTests("myfilesystem", "android_common")
11923*333d2b36SAndroid Build Coastguard Worker	fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
11924*333d2b36SAndroid Build Coastguard Worker	android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
11925*333d2b36SAndroid Build Coastguard Worker}
11926*333d2b36SAndroid Build Coastguard Worker
11927*333d2b36SAndroid Build Coastguard Workerfunc TestApexVerifyNativeImplementationLibs(t *testing.T) {
11928*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
11929*333d2b36SAndroid Build Coastguard Worker
11930*333d2b36SAndroid Build Coastguard Worker	extractDepenencyPathFromErrors := func(errs []error) []string {
11931*333d2b36SAndroid Build Coastguard Worker		i := slices.IndexFunc(errs, func(err error) bool {
11932*333d2b36SAndroid Build Coastguard Worker			return strings.Contains(err.Error(), "dependency path:")
11933*333d2b36SAndroid Build Coastguard Worker		})
11934*333d2b36SAndroid Build Coastguard Worker		if i < 0 {
11935*333d2b36SAndroid Build Coastguard Worker			return nil
11936*333d2b36SAndroid Build Coastguard Worker		}
11937*333d2b36SAndroid Build Coastguard Worker		var dependencyPath []string
11938*333d2b36SAndroid Build Coastguard Worker		for _, err := range errs[i+1:] {
11939*333d2b36SAndroid Build Coastguard Worker			s := err.Error()
11940*333d2b36SAndroid Build Coastguard Worker			lastSpace := strings.LastIndexByte(s, ' ')
11941*333d2b36SAndroid Build Coastguard Worker			if lastSpace >= 0 {
11942*333d2b36SAndroid Build Coastguard Worker				dependencyPath = append(dependencyPath, s[lastSpace+1:])
11943*333d2b36SAndroid Build Coastguard Worker			}
11944*333d2b36SAndroid Build Coastguard Worker		}
11945*333d2b36SAndroid Build Coastguard Worker		return dependencyPath
11946*333d2b36SAndroid Build Coastguard Worker	}
11947*333d2b36SAndroid Build Coastguard Worker
11948*333d2b36SAndroid Build Coastguard Worker	checkErrors := func(wantDependencyPath []string) func(t *testing.T, result *android.TestResult) {
11949*333d2b36SAndroid Build Coastguard Worker		return func(t *testing.T, result *android.TestResult) {
11950*333d2b36SAndroid Build Coastguard Worker			t.Helper()
11951*333d2b36SAndroid Build Coastguard Worker			if len(result.Errs) == 0 {
11952*333d2b36SAndroid Build Coastguard Worker				t.Fatalf("expected errors")
11953*333d2b36SAndroid Build Coastguard Worker			}
11954*333d2b36SAndroid Build Coastguard Worker			t.Log("found errors:")
11955*333d2b36SAndroid Build Coastguard Worker			for _, err := range result.Errs {
11956*333d2b36SAndroid Build Coastguard Worker				t.Log(err)
11957*333d2b36SAndroid Build Coastguard Worker			}
11958*333d2b36SAndroid Build Coastguard Worker			if g, w := result.Errs[0].Error(), "library in apex transitively linked against implementation library"; !strings.Contains(g, w) {
11959*333d2b36SAndroid Build Coastguard Worker				t.Fatalf("expected error %q, got %q", w, g)
11960*333d2b36SAndroid Build Coastguard Worker			}
11961*333d2b36SAndroid Build Coastguard Worker			dependencyPath := extractDepenencyPathFromErrors(result.Errs)
11962*333d2b36SAndroid Build Coastguard Worker			if g, w := dependencyPath, wantDependencyPath; !slices.Equal(g, w) {
11963*333d2b36SAndroid Build Coastguard Worker				t.Errorf("expected dependency path %q, got %q", w, g)
11964*333d2b36SAndroid Build Coastguard Worker			}
11965*333d2b36SAndroid Build Coastguard Worker		}
11966*333d2b36SAndroid Build Coastguard Worker	}
11967*333d2b36SAndroid Build Coastguard Worker
11968*333d2b36SAndroid Build Coastguard Worker	addToSharedLibs := func(module, lib string) func(bp *bpmodify.Blueprint) {
11969*333d2b36SAndroid Build Coastguard Worker		return func(bp *bpmodify.Blueprint) {
11970*333d2b36SAndroid Build Coastguard Worker			m := bp.ModulesByName(module)
11971*333d2b36SAndroid Build Coastguard Worker			props, err := m.GetOrCreateProperty(bpmodify.List, "shared_libs")
11972*333d2b36SAndroid Build Coastguard Worker			if err != nil {
11973*333d2b36SAndroid Build Coastguard Worker				panic(err)
11974*333d2b36SAndroid Build Coastguard Worker			}
11975*333d2b36SAndroid Build Coastguard Worker			props.AddStringToList(lib)
11976*333d2b36SAndroid Build Coastguard Worker		}
11977*333d2b36SAndroid Build Coastguard Worker	}
11978*333d2b36SAndroid Build Coastguard Worker
11979*333d2b36SAndroid Build Coastguard Worker	bpTemplate := `
11980*333d2b36SAndroid Build Coastguard Worker	apex {
11981*333d2b36SAndroid Build Coastguard Worker		name: "myapex",
11982*333d2b36SAndroid Build Coastguard Worker		key: "myapex.key",
11983*333d2b36SAndroid Build Coastguard Worker		native_shared_libs: ["mylib"],
11984*333d2b36SAndroid Build Coastguard Worker		rust_dyn_libs: ["libmyrust"],
11985*333d2b36SAndroid Build Coastguard Worker		binaries: ["mybin", "myrustbin"],
11986*333d2b36SAndroid Build Coastguard Worker		jni_libs: ["libjni"],
11987*333d2b36SAndroid Build Coastguard Worker		apps: ["myapp"],
11988*333d2b36SAndroid Build Coastguard Worker		updatable: false,
11989*333d2b36SAndroid Build Coastguard Worker	}
11990*333d2b36SAndroid Build Coastguard Worker
11991*333d2b36SAndroid Build Coastguard Worker	apex {
11992*333d2b36SAndroid Build Coastguard Worker		name: "otherapex",
11993*333d2b36SAndroid Build Coastguard Worker		key: "myapex.key",
11994*333d2b36SAndroid Build Coastguard Worker		native_shared_libs: ["libotherapex"],
11995*333d2b36SAndroid Build Coastguard Worker		updatable: false,
11996*333d2b36SAndroid Build Coastguard Worker	}
11997*333d2b36SAndroid Build Coastguard Worker
11998*333d2b36SAndroid Build Coastguard Worker	apex_key {
11999*333d2b36SAndroid Build Coastguard Worker		name: "myapex.key",
12000*333d2b36SAndroid Build Coastguard Worker		public_key: "testkey.avbpubkey",
12001*333d2b36SAndroid Build Coastguard Worker		private_key: "testkey.pem",
12002*333d2b36SAndroid Build Coastguard Worker	}
12003*333d2b36SAndroid Build Coastguard Worker
12004*333d2b36SAndroid Build Coastguard Worker	cc_library {
12005*333d2b36SAndroid Build Coastguard Worker		name: "mylib",
12006*333d2b36SAndroid Build Coastguard Worker		srcs: ["foo.cpp"],
12007*333d2b36SAndroid Build Coastguard Worker		apex_available: ["myapex"],
12008*333d2b36SAndroid Build Coastguard Worker	}
12009*333d2b36SAndroid Build Coastguard Worker
12010*333d2b36SAndroid Build Coastguard Worker	cc_binary {
12011*333d2b36SAndroid Build Coastguard Worker		name: "mybin",
12012*333d2b36SAndroid Build Coastguard Worker		srcs: ["foo.cpp"],
12013*333d2b36SAndroid Build Coastguard Worker		apex_available: ["myapex"],
12014*333d2b36SAndroid Build Coastguard Worker	}
12015*333d2b36SAndroid Build Coastguard Worker
12016*333d2b36SAndroid Build Coastguard Worker	rust_library {
12017*333d2b36SAndroid Build Coastguard Worker		name: "libmyrust",
12018*333d2b36SAndroid Build Coastguard Worker		crate_name: "myrust",
12019*333d2b36SAndroid Build Coastguard Worker		srcs: ["src/lib.rs"],
12020*333d2b36SAndroid Build Coastguard Worker		rustlibs: ["libmyrust_transitive_dylib"],
12021*333d2b36SAndroid Build Coastguard Worker		rlibs: ["libmyrust_transitive_rlib"],
12022*333d2b36SAndroid Build Coastguard Worker		apex_available: ["myapex"],
12023*333d2b36SAndroid Build Coastguard Worker	}
12024*333d2b36SAndroid Build Coastguard Worker
12025*333d2b36SAndroid Build Coastguard Worker	rust_library{
12026*333d2b36SAndroid Build Coastguard Worker		name: "libmyrust_transitive_dylib",
12027*333d2b36SAndroid Build Coastguard Worker		crate_name: "myrust_transitive_dylib",
12028*333d2b36SAndroid Build Coastguard Worker		srcs: ["src/lib.rs"],
12029*333d2b36SAndroid Build Coastguard Worker		apex_available: ["myapex"],
12030*333d2b36SAndroid Build Coastguard Worker	}
12031*333d2b36SAndroid Build Coastguard Worker
12032*333d2b36SAndroid Build Coastguard Worker	rust_library {
12033*333d2b36SAndroid Build Coastguard Worker		name: "libmyrust_transitive_rlib",
12034*333d2b36SAndroid Build Coastguard Worker		crate_name: "myrust_transitive_rlib",
12035*333d2b36SAndroid Build Coastguard Worker		srcs: ["src/lib.rs"],
12036*333d2b36SAndroid Build Coastguard Worker		apex_available: ["myapex"],
12037*333d2b36SAndroid Build Coastguard Worker	}
12038*333d2b36SAndroid Build Coastguard Worker
12039*333d2b36SAndroid Build Coastguard Worker	rust_binary {
12040*333d2b36SAndroid Build Coastguard Worker		name: "myrustbin",
12041*333d2b36SAndroid Build Coastguard Worker		srcs: ["src/main.rs"],
12042*333d2b36SAndroid Build Coastguard Worker		apex_available: ["myapex"],
12043*333d2b36SAndroid Build Coastguard Worker	}
12044*333d2b36SAndroid Build Coastguard Worker
12045*333d2b36SAndroid Build Coastguard Worker	cc_library {
12046*333d2b36SAndroid Build Coastguard Worker		name: "libbar",
12047*333d2b36SAndroid Build Coastguard Worker		sdk_version: "current",
12048*333d2b36SAndroid Build Coastguard Worker		srcs: ["bar.cpp"],
12049*333d2b36SAndroid Build Coastguard Worker		apex_available: ["myapex"],
12050*333d2b36SAndroid Build Coastguard Worker		stl: "none",
12051*333d2b36SAndroid Build Coastguard Worker	}
12052*333d2b36SAndroid Build Coastguard Worker
12053*333d2b36SAndroid Build Coastguard Worker	android_app {
12054*333d2b36SAndroid Build Coastguard Worker		name: "myapp",
12055*333d2b36SAndroid Build Coastguard Worker		jni_libs: ["libembeddedjni"],
12056*333d2b36SAndroid Build Coastguard Worker		use_embedded_native_libs: true,
12057*333d2b36SAndroid Build Coastguard Worker		sdk_version: "current",
12058*333d2b36SAndroid Build Coastguard Worker		apex_available: ["myapex"],
12059*333d2b36SAndroid Build Coastguard Worker	}
12060*333d2b36SAndroid Build Coastguard Worker
12061*333d2b36SAndroid Build Coastguard Worker	cc_library {
12062*333d2b36SAndroid Build Coastguard Worker		name: "libembeddedjni",
12063*333d2b36SAndroid Build Coastguard Worker		sdk_version: "current",
12064*333d2b36SAndroid Build Coastguard Worker		srcs: ["bar.cpp"],
12065*333d2b36SAndroid Build Coastguard Worker		apex_available: ["myapex"],
12066*333d2b36SAndroid Build Coastguard Worker		stl: "none",
12067*333d2b36SAndroid Build Coastguard Worker	}
12068*333d2b36SAndroid Build Coastguard Worker
12069*333d2b36SAndroid Build Coastguard Worker	cc_library {
12070*333d2b36SAndroid Build Coastguard Worker		name: "libjni",
12071*333d2b36SAndroid Build Coastguard Worker		sdk_version: "current",
12072*333d2b36SAndroid Build Coastguard Worker		srcs: ["bar.cpp"],
12073*333d2b36SAndroid Build Coastguard Worker		apex_available: ["myapex"],
12074*333d2b36SAndroid Build Coastguard Worker		stl: "none",
12075*333d2b36SAndroid Build Coastguard Worker	}
12076*333d2b36SAndroid Build Coastguard Worker
12077*333d2b36SAndroid Build Coastguard Worker	cc_library {
12078*333d2b36SAndroid Build Coastguard Worker		name: "libotherapex",
12079*333d2b36SAndroid Build Coastguard Worker		sdk_version: "current",
12080*333d2b36SAndroid Build Coastguard Worker		srcs: ["otherapex.cpp"],
12081*333d2b36SAndroid Build Coastguard Worker		apex_available: ["otherapex"],
12082*333d2b36SAndroid Build Coastguard Worker		stubs: {
12083*333d2b36SAndroid Build Coastguard Worker			symbol_file: "libotherapex.map.txt",
12084*333d2b36SAndroid Build Coastguard Worker			versions: ["1", "2", "3"],
12085*333d2b36SAndroid Build Coastguard Worker		},
12086*333d2b36SAndroid Build Coastguard Worker		stl: "none",
12087*333d2b36SAndroid Build Coastguard Worker	}
12088*333d2b36SAndroid Build Coastguard Worker
12089*333d2b36SAndroid Build Coastguard Worker	cc_library {
12090*333d2b36SAndroid Build Coastguard Worker		name: "libplatform",
12091*333d2b36SAndroid Build Coastguard Worker		sdk_version: "current",
12092*333d2b36SAndroid Build Coastguard Worker		srcs: ["libplatform.cpp"],
12093*333d2b36SAndroid Build Coastguard Worker		stubs: {
12094*333d2b36SAndroid Build Coastguard Worker			symbol_file: "libplatform.map.txt",
12095*333d2b36SAndroid Build Coastguard Worker			versions: ["1", "2", "3"],
12096*333d2b36SAndroid Build Coastguard Worker		},
12097*333d2b36SAndroid Build Coastguard Worker		stl: "none",
12098*333d2b36SAndroid Build Coastguard Worker		system_shared_libs: [],
12099*333d2b36SAndroid Build Coastguard Worker	}
12100*333d2b36SAndroid Build Coastguard Worker	`
12101*333d2b36SAndroid Build Coastguard Worker
12102*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
12103*333d2b36SAndroid Build Coastguard Worker		name           string
12104*333d2b36SAndroid Build Coastguard Worker		bpModifier     func(bp *bpmodify.Blueprint)
12105*333d2b36SAndroid Build Coastguard Worker		dependencyPath []string
12106*333d2b36SAndroid Build Coastguard Worker	}{
12107*333d2b36SAndroid Build Coastguard Worker		{
12108*333d2b36SAndroid Build Coastguard Worker			name:           "library dependency in other apex",
12109*333d2b36SAndroid Build Coastguard Worker			bpModifier:     addToSharedLibs("mylib", "libotherapex#impl"),
12110*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "mylib", "libotherapex"},
12111*333d2b36SAndroid Build Coastguard Worker		},
12112*333d2b36SAndroid Build Coastguard Worker		{
12113*333d2b36SAndroid Build Coastguard Worker			name: "transitive library dependency in other apex",
12114*333d2b36SAndroid Build Coastguard Worker			bpModifier: func(bp *bpmodify.Blueprint) {
12115*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("mylib", "libbar")(bp)
12116*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("libbar", "libotherapex#impl")(bp)
12117*333d2b36SAndroid Build Coastguard Worker			},
12118*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "mylib", "libbar", "libotherapex"},
12119*333d2b36SAndroid Build Coastguard Worker		},
12120*333d2b36SAndroid Build Coastguard Worker		{
12121*333d2b36SAndroid Build Coastguard Worker			name:           "library dependency in platform",
12122*333d2b36SAndroid Build Coastguard Worker			bpModifier:     addToSharedLibs("mylib", "libplatform#impl"),
12123*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "mylib", "libplatform"},
12124*333d2b36SAndroid Build Coastguard Worker		},
12125*333d2b36SAndroid Build Coastguard Worker		{
12126*333d2b36SAndroid Build Coastguard Worker			name:           "jni library dependency in other apex",
12127*333d2b36SAndroid Build Coastguard Worker			bpModifier:     addToSharedLibs("libjni", "libotherapex#impl"),
12128*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "libjni", "libotherapex"},
12129*333d2b36SAndroid Build Coastguard Worker		},
12130*333d2b36SAndroid Build Coastguard Worker		{
12131*333d2b36SAndroid Build Coastguard Worker			name: "transitive jni library dependency in other apex",
12132*333d2b36SAndroid Build Coastguard Worker			bpModifier: func(bp *bpmodify.Blueprint) {
12133*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("libjni", "libbar")(bp)
12134*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("libbar", "libotherapex#impl")(bp)
12135*333d2b36SAndroid Build Coastguard Worker			},
12136*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "libjni", "libbar", "libotherapex"},
12137*333d2b36SAndroid Build Coastguard Worker		},
12138*333d2b36SAndroid Build Coastguard Worker		{
12139*333d2b36SAndroid Build Coastguard Worker			name:           "jni library dependency in platform",
12140*333d2b36SAndroid Build Coastguard Worker			bpModifier:     addToSharedLibs("libjni", "libplatform#impl"),
12141*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "libjni", "libplatform"},
12142*333d2b36SAndroid Build Coastguard Worker		},
12143*333d2b36SAndroid Build Coastguard Worker		{
12144*333d2b36SAndroid Build Coastguard Worker			name: "transitive jni library dependency in platform",
12145*333d2b36SAndroid Build Coastguard Worker			bpModifier: func(bp *bpmodify.Blueprint) {
12146*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("libjni", "libbar")(bp)
12147*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("libbar", "libplatform#impl")(bp)
12148*333d2b36SAndroid Build Coastguard Worker			},
12149*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "libjni", "libbar", "libplatform"},
12150*333d2b36SAndroid Build Coastguard Worker		},
12151*333d2b36SAndroid Build Coastguard Worker		{
12152*333d2b36SAndroid Build Coastguard Worker			name:           "app jni library dependency in other apex",
12153*333d2b36SAndroid Build Coastguard Worker			bpModifier:     addToSharedLibs("libembeddedjni", "libotherapex#impl"),
12154*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"},
12155*333d2b36SAndroid Build Coastguard Worker		},
12156*333d2b36SAndroid Build Coastguard Worker		{
12157*333d2b36SAndroid Build Coastguard Worker			name: "transitive app jni library dependency in other apex",
12158*333d2b36SAndroid Build Coastguard Worker			bpModifier: func(bp *bpmodify.Blueprint) {
12159*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("libembeddedjni", "libbar")(bp)
12160*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("libbar", "libotherapex#impl")(bp)
12161*333d2b36SAndroid Build Coastguard Worker			},
12162*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"},
12163*333d2b36SAndroid Build Coastguard Worker		},
12164*333d2b36SAndroid Build Coastguard Worker		{
12165*333d2b36SAndroid Build Coastguard Worker			name:           "app jni library dependency in platform",
12166*333d2b36SAndroid Build Coastguard Worker			bpModifier:     addToSharedLibs("libembeddedjni", "libplatform#impl"),
12167*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"},
12168*333d2b36SAndroid Build Coastguard Worker		},
12169*333d2b36SAndroid Build Coastguard Worker		{
12170*333d2b36SAndroid Build Coastguard Worker			name: "transitive app jni library dependency in platform",
12171*333d2b36SAndroid Build Coastguard Worker			bpModifier: func(bp *bpmodify.Blueprint) {
12172*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("libembeddedjni", "libbar")(bp)
12173*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("libbar", "libplatform#impl")(bp)
12174*333d2b36SAndroid Build Coastguard Worker			},
12175*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"},
12176*333d2b36SAndroid Build Coastguard Worker		},
12177*333d2b36SAndroid Build Coastguard Worker		{
12178*333d2b36SAndroid Build Coastguard Worker			name:           "binary dependency in other apex",
12179*333d2b36SAndroid Build Coastguard Worker			bpModifier:     addToSharedLibs("mybin", "libotherapex#impl"),
12180*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "mybin", "libotherapex"},
12181*333d2b36SAndroid Build Coastguard Worker		},
12182*333d2b36SAndroid Build Coastguard Worker		{
12183*333d2b36SAndroid Build Coastguard Worker			name: "transitive binary dependency in other apex",
12184*333d2b36SAndroid Build Coastguard Worker			bpModifier: func(bp *bpmodify.Blueprint) {
12185*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("mybin", "libbar")(bp)
12186*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("libbar", "libotherapex#impl")(bp)
12187*333d2b36SAndroid Build Coastguard Worker			},
12188*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "mybin", "libbar", "libotherapex"},
12189*333d2b36SAndroid Build Coastguard Worker		},
12190*333d2b36SAndroid Build Coastguard Worker		{
12191*333d2b36SAndroid Build Coastguard Worker			name:           "binary dependency in platform",
12192*333d2b36SAndroid Build Coastguard Worker			bpModifier:     addToSharedLibs("mybin", "libplatform#impl"),
12193*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "mybin", "libplatform"},
12194*333d2b36SAndroid Build Coastguard Worker		},
12195*333d2b36SAndroid Build Coastguard Worker		{
12196*333d2b36SAndroid Build Coastguard Worker			name: "transitive binary dependency in platform",
12197*333d2b36SAndroid Build Coastguard Worker			bpModifier: func(bp *bpmodify.Blueprint) {
12198*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("mybin", "libbar")(bp)
12199*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("libbar", "libplatform#impl")(bp)
12200*333d2b36SAndroid Build Coastguard Worker			},
12201*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "mybin", "libbar", "libplatform"},
12202*333d2b36SAndroid Build Coastguard Worker		},
12203*333d2b36SAndroid Build Coastguard Worker
12204*333d2b36SAndroid Build Coastguard Worker		{
12205*333d2b36SAndroid Build Coastguard Worker			name:           "rust library dependency in other apex",
12206*333d2b36SAndroid Build Coastguard Worker			bpModifier:     addToSharedLibs("libmyrust", "libotherapex#impl"),
12207*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "libmyrust", "libotherapex"},
12208*333d2b36SAndroid Build Coastguard Worker		},
12209*333d2b36SAndroid Build Coastguard Worker		{
12210*333d2b36SAndroid Build Coastguard Worker			name: "transitive rust library dependency in other apex",
12211*333d2b36SAndroid Build Coastguard Worker			bpModifier: func(bp *bpmodify.Blueprint) {
12212*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("libmyrust", "libbar")(bp)
12213*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("libbar", "libotherapex#impl")(bp)
12214*333d2b36SAndroid Build Coastguard Worker			},
12215*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "libmyrust", "libbar", "libotherapex"},
12216*333d2b36SAndroid Build Coastguard Worker		},
12217*333d2b36SAndroid Build Coastguard Worker		{
12218*333d2b36SAndroid Build Coastguard Worker			name:           "rust library dependency in platform",
12219*333d2b36SAndroid Build Coastguard Worker			bpModifier:     addToSharedLibs("libmyrust", "libplatform#impl"),
12220*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "libmyrust", "libplatform"},
12221*333d2b36SAndroid Build Coastguard Worker		},
12222*333d2b36SAndroid Build Coastguard Worker		{
12223*333d2b36SAndroid Build Coastguard Worker			name: "transitive rust library dependency in platform",
12224*333d2b36SAndroid Build Coastguard Worker			bpModifier: func(bp *bpmodify.Blueprint) {
12225*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("libmyrust", "libbar")(bp)
12226*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("libbar", "libplatform#impl")(bp)
12227*333d2b36SAndroid Build Coastguard Worker			},
12228*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "libmyrust", "libbar", "libplatform"},
12229*333d2b36SAndroid Build Coastguard Worker		},
12230*333d2b36SAndroid Build Coastguard Worker		{
12231*333d2b36SAndroid Build Coastguard Worker			name: "transitive rust library dylib dependency in other apex",
12232*333d2b36SAndroid Build Coastguard Worker			bpModifier: func(bp *bpmodify.Blueprint) {
12233*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("libmyrust_transitive_dylib", "libotherapex#impl")(bp)
12234*333d2b36SAndroid Build Coastguard Worker			},
12235*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libotherapex"},
12236*333d2b36SAndroid Build Coastguard Worker		},
12237*333d2b36SAndroid Build Coastguard Worker		{
12238*333d2b36SAndroid Build Coastguard Worker			name: "transitive rust library dylib dependency in platform",
12239*333d2b36SAndroid Build Coastguard Worker			bpModifier: func(bp *bpmodify.Blueprint) {
12240*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("libmyrust_transitive_dylib", "libplatform#impl")(bp)
12241*333d2b36SAndroid Build Coastguard Worker			},
12242*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libplatform"},
12243*333d2b36SAndroid Build Coastguard Worker		},
12244*333d2b36SAndroid Build Coastguard Worker		{
12245*333d2b36SAndroid Build Coastguard Worker			name: "transitive rust library rlib dependency in other apex",
12246*333d2b36SAndroid Build Coastguard Worker			bpModifier: func(bp *bpmodify.Blueprint) {
12247*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("libmyrust_transitive_rlib", "libotherapex#impl")(bp)
12248*333d2b36SAndroid Build Coastguard Worker			},
12249*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libotherapex"},
12250*333d2b36SAndroid Build Coastguard Worker		},
12251*333d2b36SAndroid Build Coastguard Worker		{
12252*333d2b36SAndroid Build Coastguard Worker			name: "transitive rust library rlib dependency in platform",
12253*333d2b36SAndroid Build Coastguard Worker			bpModifier: func(bp *bpmodify.Blueprint) {
12254*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("libmyrust_transitive_rlib", "libplatform#impl")(bp)
12255*333d2b36SAndroid Build Coastguard Worker			},
12256*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libplatform"},
12257*333d2b36SAndroid Build Coastguard Worker		},
12258*333d2b36SAndroid Build Coastguard Worker		{
12259*333d2b36SAndroid Build Coastguard Worker			name:           "rust binary dependency in other apex",
12260*333d2b36SAndroid Build Coastguard Worker			bpModifier:     addToSharedLibs("myrustbin", "libotherapex#impl"),
12261*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "myrustbin", "libotherapex"},
12262*333d2b36SAndroid Build Coastguard Worker		},
12263*333d2b36SAndroid Build Coastguard Worker		{
12264*333d2b36SAndroid Build Coastguard Worker			name: "transitive rust binary dependency in other apex",
12265*333d2b36SAndroid Build Coastguard Worker			bpModifier: func(bp *bpmodify.Blueprint) {
12266*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("myrustbin", "libbar")(bp)
12267*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("libbar", "libotherapex#impl")(bp)
12268*333d2b36SAndroid Build Coastguard Worker			},
12269*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "myrustbin", "libbar", "libotherapex"},
12270*333d2b36SAndroid Build Coastguard Worker		},
12271*333d2b36SAndroid Build Coastguard Worker		{
12272*333d2b36SAndroid Build Coastguard Worker			name:           "rust binary dependency in platform",
12273*333d2b36SAndroid Build Coastguard Worker			bpModifier:     addToSharedLibs("myrustbin", "libplatform#impl"),
12274*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "myrustbin", "libplatform"},
12275*333d2b36SAndroid Build Coastguard Worker		},
12276*333d2b36SAndroid Build Coastguard Worker		{
12277*333d2b36SAndroid Build Coastguard Worker			name: "transitive rust binary dependency in platform",
12278*333d2b36SAndroid Build Coastguard Worker			bpModifier: func(bp *bpmodify.Blueprint) {
12279*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("myrustbin", "libbar")(bp)
12280*333d2b36SAndroid Build Coastguard Worker				addToSharedLibs("libbar", "libplatform#impl")(bp)
12281*333d2b36SAndroid Build Coastguard Worker			},
12282*333d2b36SAndroid Build Coastguard Worker			dependencyPath: []string{"myapex", "myrustbin", "libbar", "libplatform"},
12283*333d2b36SAndroid Build Coastguard Worker		},
12284*333d2b36SAndroid Build Coastguard Worker	}
12285*333d2b36SAndroid Build Coastguard Worker
12286*333d2b36SAndroid Build Coastguard Worker	for _, testCase := range testCases {
12287*333d2b36SAndroid Build Coastguard Worker		t.Run(testCase.name, func(t *testing.T) {
12288*333d2b36SAndroid Build Coastguard Worker			t.Parallel()
12289*333d2b36SAndroid Build Coastguard Worker			bp, err := bpmodify.NewBlueprint("", []byte(bpTemplate))
12290*333d2b36SAndroid Build Coastguard Worker			if err != nil {
12291*333d2b36SAndroid Build Coastguard Worker				t.Fatal(err)
12292*333d2b36SAndroid Build Coastguard Worker			}
12293*333d2b36SAndroid Build Coastguard Worker			if testCase.bpModifier != nil {
12294*333d2b36SAndroid Build Coastguard Worker				func() {
12295*333d2b36SAndroid Build Coastguard Worker					defer func() {
12296*333d2b36SAndroid Build Coastguard Worker						if r := recover(); r != nil {
12297*333d2b36SAndroid Build Coastguard Worker							t.Fatalf("panic in bpModifier: %v", r)
12298*333d2b36SAndroid Build Coastguard Worker						}
12299*333d2b36SAndroid Build Coastguard Worker					}()
12300*333d2b36SAndroid Build Coastguard Worker					testCase.bpModifier(bp)
12301*333d2b36SAndroid Build Coastguard Worker				}()
12302*333d2b36SAndroid Build Coastguard Worker			}
12303*333d2b36SAndroid Build Coastguard Worker			android.GroupFixturePreparers(
12304*333d2b36SAndroid Build Coastguard Worker				android.PrepareForTestWithAndroidBuildComponents,
12305*333d2b36SAndroid Build Coastguard Worker				cc.PrepareForTestWithCcBuildComponents,
12306*333d2b36SAndroid Build Coastguard Worker				java.PrepareForTestWithDexpreopt,
12307*333d2b36SAndroid Build Coastguard Worker				rust.PrepareForTestWithRustDefaultModules,
12308*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithApexBuildComponents,
12309*333d2b36SAndroid Build Coastguard Worker				prepareForTestWithMyapex,
12310*333d2b36SAndroid Build Coastguard Worker				prepareForTestWithOtherapex,
12311*333d2b36SAndroid Build Coastguard Worker				android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
12312*333d2b36SAndroid Build Coastguard Worker					variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
12313*333d2b36SAndroid Build Coastguard Worker				}),
12314*333d2b36SAndroid Build Coastguard Worker			).ExtendWithErrorHandler(android.FixtureCustomErrorHandler(checkErrors(testCase.dependencyPath))).
12315*333d2b36SAndroid Build Coastguard Worker				RunTestWithBp(t, bp.String())
12316*333d2b36SAndroid Build Coastguard Worker		})
12317*333d2b36SAndroid Build Coastguard Worker	}
12318*333d2b36SAndroid Build Coastguard Worker}
12319