xref: /aosp_15_r20/build/soong/java/rro_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2020 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage java
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"reflect"
19*333d2b36SAndroid Build Coastguard Worker	"strings"
20*333d2b36SAndroid Build Coastguard Worker	"testing"
21*333d2b36SAndroid Build Coastguard Worker
22*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
23*333d2b36SAndroid Build Coastguard Worker	"android/soong/shared"
24*333d2b36SAndroid Build Coastguard Worker)
25*333d2b36SAndroid Build Coastguard Worker
26*333d2b36SAndroid Build Coastguard Workerfunc TestRuntimeResourceOverlay(t *testing.T) {
27*333d2b36SAndroid Build Coastguard Worker	fs := android.MockFS{
28*333d2b36SAndroid Build Coastguard Worker		"baz/res/res/values/strings.xml": nil,
29*333d2b36SAndroid Build Coastguard Worker		"bar/res/res/values/strings.xml": nil,
30*333d2b36SAndroid Build Coastguard Worker	}
31*333d2b36SAndroid Build Coastguard Worker	bp := `
32*333d2b36SAndroid Build Coastguard Worker		runtime_resource_overlay {
33*333d2b36SAndroid Build Coastguard Worker			name: "foo",
34*333d2b36SAndroid Build Coastguard Worker			certificate: "platform",
35*333d2b36SAndroid Build Coastguard Worker			lineage: "lineage.bin",
36*333d2b36SAndroid Build Coastguard Worker			rotationMinSdkVersion: "32",
37*333d2b36SAndroid Build Coastguard Worker			product_specific: true,
38*333d2b36SAndroid Build Coastguard Worker			static_libs: ["bar"],
39*333d2b36SAndroid Build Coastguard Worker			resource_libs: ["baz"],
40*333d2b36SAndroid Build Coastguard Worker			aaptflags: ["--keep-raw-values"],
41*333d2b36SAndroid Build Coastguard Worker		}
42*333d2b36SAndroid Build Coastguard Worker
43*333d2b36SAndroid Build Coastguard Worker		runtime_resource_overlay {
44*333d2b36SAndroid Build Coastguard Worker			name: "foo_themed",
45*333d2b36SAndroid Build Coastguard Worker			certificate: "platform",
46*333d2b36SAndroid Build Coastguard Worker			product_specific: true,
47*333d2b36SAndroid Build Coastguard Worker			theme: "faza",
48*333d2b36SAndroid Build Coastguard Worker			overrides: ["foo"],
49*333d2b36SAndroid Build Coastguard Worker		}
50*333d2b36SAndroid Build Coastguard Worker
51*333d2b36SAndroid Build Coastguard Worker		android_library {
52*333d2b36SAndroid Build Coastguard Worker			name: "bar",
53*333d2b36SAndroid Build Coastguard Worker			resource_dirs: ["bar/res"],
54*333d2b36SAndroid Build Coastguard Worker		}
55*333d2b36SAndroid Build Coastguard Worker
56*333d2b36SAndroid Build Coastguard Worker		android_app {
57*333d2b36SAndroid Build Coastguard Worker			name: "baz",
58*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
59*333d2b36SAndroid Build Coastguard Worker			resource_dirs: ["baz/res"],
60*333d2b36SAndroid Build Coastguard Worker		}
61*333d2b36SAndroid Build Coastguard Worker	`
62*333d2b36SAndroid Build Coastguard Worker
63*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
64*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
65*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyConfig(android.SetKatiEnabledForTests),
66*333d2b36SAndroid Build Coastguard Worker		fs.AddToFixture(),
67*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, bp)
68*333d2b36SAndroid Build Coastguard Worker
69*333d2b36SAndroid Build Coastguard Worker	m := result.ModuleForTests("foo", "android_common")
70*333d2b36SAndroid Build Coastguard Worker
71*333d2b36SAndroid Build Coastguard Worker	// Check AAPT2 link flags.
72*333d2b36SAndroid Build Coastguard Worker	aapt2Flags := m.Output("package-res.apk").Args["flags"]
73*333d2b36SAndroid Build Coastguard Worker	expectedFlags := []string{"--keep-raw-values", "--no-resource-deduping", "--no-resource-removal"}
74*333d2b36SAndroid Build Coastguard Worker	absentFlags := android.RemoveListFromList(expectedFlags, strings.Split(aapt2Flags, " "))
75*333d2b36SAndroid Build Coastguard Worker	if len(absentFlags) > 0 {
76*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected values, %q are missing in aapt2 link flags, %q", absentFlags, aapt2Flags)
77*333d2b36SAndroid Build Coastguard Worker	}
78*333d2b36SAndroid Build Coastguard Worker
79*333d2b36SAndroid Build Coastguard Worker	// Check overlay.list output for static_libs dependency.
80*333d2b36SAndroid Build Coastguard Worker	overlayList := android.PathsRelativeToTop(m.Output("aapt2/overlay.list").Inputs)
81*333d2b36SAndroid Build Coastguard Worker	staticLibPackage := "out/soong/.intermediates/bar/android_common/package-res.apk"
82*333d2b36SAndroid Build Coastguard Worker	if !inList(staticLibPackage, overlayList) {
83*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Stactic lib res package %q missing in overlay list: %q", staticLibPackage, overlayList)
84*333d2b36SAndroid Build Coastguard Worker	}
85*333d2b36SAndroid Build Coastguard Worker
86*333d2b36SAndroid Build Coastguard Worker	// Check AAPT2 link flags for resource_libs dependency.
87*333d2b36SAndroid Build Coastguard Worker	resourceLibFlag := "-I " + "out/soong/.intermediates/baz/android_common/package-res.apk"
88*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(aapt2Flags, resourceLibFlag) {
89*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Resource lib flag %q missing in aapt2 link flags: %q", resourceLibFlag, aapt2Flags)
90*333d2b36SAndroid Build Coastguard Worker	}
91*333d2b36SAndroid Build Coastguard Worker
92*333d2b36SAndroid Build Coastguard Worker	// Check cert signing flags.
93*333d2b36SAndroid Build Coastguard Worker	signedApk := m.Output("signed/foo.apk")
94*333d2b36SAndroid Build Coastguard Worker	actualCertSigningFlags := signedApk.Args["flags"]
95*333d2b36SAndroid Build Coastguard Worker	expectedCertSigningFlags := "--lineage lineage.bin --rotation-min-sdk-version 32"
96*333d2b36SAndroid Build Coastguard Worker	if expectedCertSigningFlags != actualCertSigningFlags {
97*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Incorrect cert signing flags, expected: %q, got: %q", expectedCertSigningFlags, actualCertSigningFlags)
98*333d2b36SAndroid Build Coastguard Worker	}
99*333d2b36SAndroid Build Coastguard Worker
100*333d2b36SAndroid Build Coastguard Worker	signingFlag := signedApk.Args["certificates"]
101*333d2b36SAndroid Build Coastguard Worker	expected := "build/make/target/product/security/platform.x509.pem build/make/target/product/security/platform.pk8"
102*333d2b36SAndroid Build Coastguard Worker	if expected != signingFlag {
103*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected, signingFlag)
104*333d2b36SAndroid Build Coastguard Worker	}
105*333d2b36SAndroid Build Coastguard Worker	androidMkEntries := android.AndroidMkEntriesForTest(t, result.TestContext, m.Module())[0]
106*333d2b36SAndroid Build Coastguard Worker	path := androidMkEntries.EntryMap["LOCAL_CERTIFICATE"]
107*333d2b36SAndroid Build Coastguard Worker	expectedPath := []string{"build/make/target/product/security/platform.x509.pem"}
108*333d2b36SAndroid Build Coastguard Worker	if !reflect.DeepEqual(path, expectedPath) {
109*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Unexpected LOCAL_CERTIFICATE value: %v, expected: %v", path, expectedPath)
110*333d2b36SAndroid Build Coastguard Worker	}
111*333d2b36SAndroid Build Coastguard Worker
112*333d2b36SAndroid Build Coastguard Worker	// Check device location.
113*333d2b36SAndroid Build Coastguard Worker	path = androidMkEntries.EntryMap["LOCAL_MODULE_PATH"]
114*333d2b36SAndroid Build Coastguard Worker	expectedPath = []string{shared.JoinPath("out/target/product/test_device/product/overlay")}
115*333d2b36SAndroid Build Coastguard Worker	android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_MODULE_PATH", result.Config, expectedPath, path)
116*333d2b36SAndroid Build Coastguard Worker
117*333d2b36SAndroid Build Coastguard Worker	// A themed module has a different device location
118*333d2b36SAndroid Build Coastguard Worker	m = result.ModuleForTests("foo_themed", "android_common")
119*333d2b36SAndroid Build Coastguard Worker	androidMkEntries = android.AndroidMkEntriesForTest(t, result.TestContext, m.Module())[0]
120*333d2b36SAndroid Build Coastguard Worker	path = androidMkEntries.EntryMap["LOCAL_MODULE_PATH"]
121*333d2b36SAndroid Build Coastguard Worker	expectedPath = []string{shared.JoinPath("out/target/product/test_device/product/overlay/faza")}
122*333d2b36SAndroid Build Coastguard Worker	android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_MODULE_PATH", result.Config, expectedPath, path)
123*333d2b36SAndroid Build Coastguard Worker
124*333d2b36SAndroid Build Coastguard Worker	overrides := androidMkEntries.EntryMap["LOCAL_OVERRIDES_PACKAGES"]
125*333d2b36SAndroid Build Coastguard Worker	expectedOverrides := []string{"foo"}
126*333d2b36SAndroid Build Coastguard Worker	if !reflect.DeepEqual(overrides, expectedOverrides) {
127*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Unexpected LOCAL_OVERRIDES_PACKAGES value: %v, expected: %v", overrides, expectedOverrides)
128*333d2b36SAndroid Build Coastguard Worker	}
129*333d2b36SAndroid Build Coastguard Worker}
130*333d2b36SAndroid Build Coastguard Worker
131*333d2b36SAndroid Build Coastguard Workerfunc TestRuntimeResourceOverlay_JavaDefaults(t *testing.T) {
132*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
133*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
134*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyConfig(android.SetKatiEnabledForTests),
135*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
136*333d2b36SAndroid Build Coastguard Worker		java_defaults {
137*333d2b36SAndroid Build Coastguard Worker			name: "rro_defaults",
138*333d2b36SAndroid Build Coastguard Worker			theme: "default_theme",
139*333d2b36SAndroid Build Coastguard Worker			product_specific: true,
140*333d2b36SAndroid Build Coastguard Worker			aaptflags: ["--keep-raw-values"],
141*333d2b36SAndroid Build Coastguard Worker		}
142*333d2b36SAndroid Build Coastguard Worker
143*333d2b36SAndroid Build Coastguard Worker		runtime_resource_overlay {
144*333d2b36SAndroid Build Coastguard Worker			name: "foo_with_defaults",
145*333d2b36SAndroid Build Coastguard Worker			defaults: ["rro_defaults"],
146*333d2b36SAndroid Build Coastguard Worker		}
147*333d2b36SAndroid Build Coastguard Worker
148*333d2b36SAndroid Build Coastguard Worker		runtime_resource_overlay {
149*333d2b36SAndroid Build Coastguard Worker			name: "foo_barebones",
150*333d2b36SAndroid Build Coastguard Worker		}
151*333d2b36SAndroid Build Coastguard Worker		`)
152*333d2b36SAndroid Build Coastguard Worker
153*333d2b36SAndroid Build Coastguard Worker	//
154*333d2b36SAndroid Build Coastguard Worker	// RRO module with defaults
155*333d2b36SAndroid Build Coastguard Worker	//
156*333d2b36SAndroid Build Coastguard Worker	m := result.ModuleForTests("foo_with_defaults", "android_common")
157*333d2b36SAndroid Build Coastguard Worker
158*333d2b36SAndroid Build Coastguard Worker	// Check AAPT2 link flags.
159*333d2b36SAndroid Build Coastguard Worker	aapt2Flags := strings.Split(m.Output("package-res.apk").Args["flags"], " ")
160*333d2b36SAndroid Build Coastguard Worker	expectedFlags := []string{"--keep-raw-values", "--no-resource-deduping", "--no-resource-removal"}
161*333d2b36SAndroid Build Coastguard Worker	absentFlags := android.RemoveListFromList(expectedFlags, aapt2Flags)
162*333d2b36SAndroid Build Coastguard Worker	if len(absentFlags) > 0 {
163*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected values, %q are missing in aapt2 link flags, %q", absentFlags, aapt2Flags)
164*333d2b36SAndroid Build Coastguard Worker	}
165*333d2b36SAndroid Build Coastguard Worker
166*333d2b36SAndroid Build Coastguard Worker	// Check device location.
167*333d2b36SAndroid Build Coastguard Worker	path := android.AndroidMkEntriesForTest(t, result.TestContext, m.Module())[0].EntryMap["LOCAL_MODULE_PATH"]
168*333d2b36SAndroid Build Coastguard Worker	expectedPath := []string{shared.JoinPath("out/target/product/test_device/product/overlay/default_theme")}
169*333d2b36SAndroid Build Coastguard Worker	android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_MODULE_PATH", result.Config, expectedPath, path)
170*333d2b36SAndroid Build Coastguard Worker
171*333d2b36SAndroid Build Coastguard Worker	//
172*333d2b36SAndroid Build Coastguard Worker	// RRO module without defaults
173*333d2b36SAndroid Build Coastguard Worker	//
174*333d2b36SAndroid Build Coastguard Worker	m = result.ModuleForTests("foo_barebones", "android_common")
175*333d2b36SAndroid Build Coastguard Worker
176*333d2b36SAndroid Build Coastguard Worker	// Check AAPT2 link flags.
177*333d2b36SAndroid Build Coastguard Worker	aapt2Flags = strings.Split(m.Output("package-res.apk").Args["flags"], " ")
178*333d2b36SAndroid Build Coastguard Worker	unexpectedFlags := "--keep-raw-values"
179*333d2b36SAndroid Build Coastguard Worker	if inList(unexpectedFlags, aapt2Flags) {
180*333d2b36SAndroid Build Coastguard Worker		t.Errorf("unexpected value, %q is present in aapt2 link flags, %q", unexpectedFlags, aapt2Flags)
181*333d2b36SAndroid Build Coastguard Worker	}
182*333d2b36SAndroid Build Coastguard Worker
183*333d2b36SAndroid Build Coastguard Worker	// Check device location.
184*333d2b36SAndroid Build Coastguard Worker	path = android.AndroidMkEntriesForTest(t, result.TestContext, m.Module())[0].EntryMap["LOCAL_MODULE_PATH"]
185*333d2b36SAndroid Build Coastguard Worker	expectedPath = []string{shared.JoinPath("out/target/product/test_device/product/overlay")}
186*333d2b36SAndroid Build Coastguard Worker	android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_MODULE_PATH", result.Config, expectedPath, path)
187*333d2b36SAndroid Build Coastguard Worker}
188*333d2b36SAndroid Build Coastguard Worker
189*333d2b36SAndroid Build Coastguard Workerfunc TestOverrideRuntimeResourceOverlay(t *testing.T) {
190*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
191*333d2b36SAndroid Build Coastguard Worker		runtime_resource_overlay {
192*333d2b36SAndroid Build Coastguard Worker			name: "foo_overlay",
193*333d2b36SAndroid Build Coastguard Worker			certificate: "platform",
194*333d2b36SAndroid Build Coastguard Worker			product_specific: true,
195*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
196*333d2b36SAndroid Build Coastguard Worker		}
197*333d2b36SAndroid Build Coastguard Worker
198*333d2b36SAndroid Build Coastguard Worker		override_runtime_resource_overlay {
199*333d2b36SAndroid Build Coastguard Worker			name: "bar_overlay",
200*333d2b36SAndroid Build Coastguard Worker			base: "foo_overlay",
201*333d2b36SAndroid Build Coastguard Worker			package_name: "com.android.bar.overlay",
202*333d2b36SAndroid Build Coastguard Worker			target_package_name: "com.android.bar",
203*333d2b36SAndroid Build Coastguard Worker			category: "mycategory",
204*333d2b36SAndroid Build Coastguard Worker		}
205*333d2b36SAndroid Build Coastguard Worker		`)
206*333d2b36SAndroid Build Coastguard Worker
207*333d2b36SAndroid Build Coastguard Worker	expectedVariants := []struct {
208*333d2b36SAndroid Build Coastguard Worker		moduleName        string
209*333d2b36SAndroid Build Coastguard Worker		variantName       string
210*333d2b36SAndroid Build Coastguard Worker		apkPath           string
211*333d2b36SAndroid Build Coastguard Worker		overrides         []string
212*333d2b36SAndroid Build Coastguard Worker		targetVariant     string
213*333d2b36SAndroid Build Coastguard Worker		packageFlag       string
214*333d2b36SAndroid Build Coastguard Worker		targetPackageFlag string
215*333d2b36SAndroid Build Coastguard Worker		categoryFlag      string
216*333d2b36SAndroid Build Coastguard Worker	}{
217*333d2b36SAndroid Build Coastguard Worker		{
218*333d2b36SAndroid Build Coastguard Worker			variantName:       "android_common",
219*333d2b36SAndroid Build Coastguard Worker			apkPath:           "out/soong/target/product/test_device/product/overlay/foo_overlay.apk",
220*333d2b36SAndroid Build Coastguard Worker			overrides:         nil,
221*333d2b36SAndroid Build Coastguard Worker			targetVariant:     "android_common",
222*333d2b36SAndroid Build Coastguard Worker			packageFlag:       "",
223*333d2b36SAndroid Build Coastguard Worker			targetPackageFlag: "",
224*333d2b36SAndroid Build Coastguard Worker		},
225*333d2b36SAndroid Build Coastguard Worker		{
226*333d2b36SAndroid Build Coastguard Worker			variantName:       "android_common_bar_overlay",
227*333d2b36SAndroid Build Coastguard Worker			apkPath:           "out/soong/target/product/test_device/product/overlay/bar_overlay.apk",
228*333d2b36SAndroid Build Coastguard Worker			overrides:         []string{"foo_overlay"},
229*333d2b36SAndroid Build Coastguard Worker			targetVariant:     "android_common_bar",
230*333d2b36SAndroid Build Coastguard Worker			packageFlag:       "com.android.bar.overlay",
231*333d2b36SAndroid Build Coastguard Worker			targetPackageFlag: "com.android.bar",
232*333d2b36SAndroid Build Coastguard Worker			categoryFlag:      "mycategory",
233*333d2b36SAndroid Build Coastguard Worker		},
234*333d2b36SAndroid Build Coastguard Worker	}
235*333d2b36SAndroid Build Coastguard Worker	for _, expected := range expectedVariants {
236*333d2b36SAndroid Build Coastguard Worker		variant := ctx.ModuleForTests("foo_overlay", expected.variantName)
237*333d2b36SAndroid Build Coastguard Worker
238*333d2b36SAndroid Build Coastguard Worker		// Check the final apk name
239*333d2b36SAndroid Build Coastguard Worker		variant.Output(expected.apkPath)
240*333d2b36SAndroid Build Coastguard Worker
241*333d2b36SAndroid Build Coastguard Worker		// Check if the overrides field values are correctly aggregated.
242*333d2b36SAndroid Build Coastguard Worker		mod := variant.Module().(*RuntimeResourceOverlay)
243*333d2b36SAndroid Build Coastguard Worker		if !reflect.DeepEqual(expected.overrides, mod.properties.Overrides) {
244*333d2b36SAndroid Build Coastguard Worker			t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
245*333d2b36SAndroid Build Coastguard Worker				expected.overrides, mod.properties.Overrides)
246*333d2b36SAndroid Build Coastguard Worker		}
247*333d2b36SAndroid Build Coastguard Worker
248*333d2b36SAndroid Build Coastguard Worker		// Check aapt2 flags.
249*333d2b36SAndroid Build Coastguard Worker		res := variant.Output("package-res.apk")
250*333d2b36SAndroid Build Coastguard Worker		aapt2Flags := res.Args["flags"]
251*333d2b36SAndroid Build Coastguard Worker		checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
252*333d2b36SAndroid Build Coastguard Worker		checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", "")
253*333d2b36SAndroid Build Coastguard Worker		checkAapt2LinkFlag(t, aapt2Flags, "rename-overlay-target-package", expected.targetPackageFlag)
254*333d2b36SAndroid Build Coastguard Worker		checkAapt2LinkFlag(t, aapt2Flags, "rename-overlay-category", expected.categoryFlag)
255*333d2b36SAndroid Build Coastguard Worker	}
256*333d2b36SAndroid Build Coastguard Worker}
257*333d2b36SAndroid Build Coastguard Worker
258*333d2b36SAndroid Build Coastguard Workerfunc TestRuntimeResourceOverlayPartition(t *testing.T) {
259*333d2b36SAndroid Build Coastguard Worker	bp := `
260*333d2b36SAndroid Build Coastguard Worker		runtime_resource_overlay {
261*333d2b36SAndroid Build Coastguard Worker			name: "device_specific",
262*333d2b36SAndroid Build Coastguard Worker			device_specific: true,
263*333d2b36SAndroid Build Coastguard Worker		}
264*333d2b36SAndroid Build Coastguard Worker		runtime_resource_overlay {
265*333d2b36SAndroid Build Coastguard Worker			name: "soc_specific",
266*333d2b36SAndroid Build Coastguard Worker			soc_specific: true,
267*333d2b36SAndroid Build Coastguard Worker		}
268*333d2b36SAndroid Build Coastguard Worker		runtime_resource_overlay {
269*333d2b36SAndroid Build Coastguard Worker			name: "system_ext_specific",
270*333d2b36SAndroid Build Coastguard Worker			system_ext_specific: true,
271*333d2b36SAndroid Build Coastguard Worker		}
272*333d2b36SAndroid Build Coastguard Worker		runtime_resource_overlay {
273*333d2b36SAndroid Build Coastguard Worker			name: "product_specific",
274*333d2b36SAndroid Build Coastguard Worker			product_specific: true,
275*333d2b36SAndroid Build Coastguard Worker		}
276*333d2b36SAndroid Build Coastguard Worker		runtime_resource_overlay {
277*333d2b36SAndroid Build Coastguard Worker			name: "default"
278*333d2b36SAndroid Build Coastguard Worker		}
279*333d2b36SAndroid Build Coastguard Worker	`
280*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
281*333d2b36SAndroid Build Coastguard Worker		name         string
282*333d2b36SAndroid Build Coastguard Worker		expectedPath string
283*333d2b36SAndroid Build Coastguard Worker	}{
284*333d2b36SAndroid Build Coastguard Worker		{
285*333d2b36SAndroid Build Coastguard Worker			name:         "device_specific",
286*333d2b36SAndroid Build Coastguard Worker			expectedPath: "out/soong/target/product/test_device/odm/overlay",
287*333d2b36SAndroid Build Coastguard Worker		},
288*333d2b36SAndroid Build Coastguard Worker		{
289*333d2b36SAndroid Build Coastguard Worker			name:         "soc_specific",
290*333d2b36SAndroid Build Coastguard Worker			expectedPath: "out/soong/target/product/test_device/vendor/overlay",
291*333d2b36SAndroid Build Coastguard Worker		},
292*333d2b36SAndroid Build Coastguard Worker		{
293*333d2b36SAndroid Build Coastguard Worker			name:         "system_ext_specific",
294*333d2b36SAndroid Build Coastguard Worker			expectedPath: "out/soong/target/product/test_device/system_ext/overlay",
295*333d2b36SAndroid Build Coastguard Worker		},
296*333d2b36SAndroid Build Coastguard Worker		{
297*333d2b36SAndroid Build Coastguard Worker			name:         "product_specific",
298*333d2b36SAndroid Build Coastguard Worker			expectedPath: "out/soong/target/product/test_device/product/overlay",
299*333d2b36SAndroid Build Coastguard Worker		},
300*333d2b36SAndroid Build Coastguard Worker		{
301*333d2b36SAndroid Build Coastguard Worker			name:         "default",
302*333d2b36SAndroid Build Coastguard Worker			expectedPath: "out/soong/target/product/test_device/product/overlay",
303*333d2b36SAndroid Build Coastguard Worker		},
304*333d2b36SAndroid Build Coastguard Worker	}
305*333d2b36SAndroid Build Coastguard Worker	for _, testCase := range testCases {
306*333d2b36SAndroid Build Coastguard Worker		ctx, _ := testJava(t, bp)
307*333d2b36SAndroid Build Coastguard Worker		mod := ctx.ModuleForTests(testCase.name, "android_common").Module().(*RuntimeResourceOverlay)
308*333d2b36SAndroid Build Coastguard Worker		android.AssertPathRelativeToTopEquals(t, "Install dir is not correct for "+testCase.name, testCase.expectedPath, mod.installDir)
309*333d2b36SAndroid Build Coastguard Worker	}
310*333d2b36SAndroid Build Coastguard Worker}
311*333d2b36SAndroid Build Coastguard Worker
312*333d2b36SAndroid Build Coastguard Workerfunc TestRuntimeResourceOverlayFlagsPackages(t *testing.T) {
313*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
314*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
315*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
316*333d2b36SAndroid Build Coastguard Worker		runtime_resource_overlay {
317*333d2b36SAndroid Build Coastguard Worker			name: "foo",
318*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
319*333d2b36SAndroid Build Coastguard Worker			flags_packages: [
320*333d2b36SAndroid Build Coastguard Worker				"bar",
321*333d2b36SAndroid Build Coastguard Worker				"baz",
322*333d2b36SAndroid Build Coastguard Worker			],
323*333d2b36SAndroid Build Coastguard Worker		}
324*333d2b36SAndroid Build Coastguard Worker		aconfig_declarations {
325*333d2b36SAndroid Build Coastguard Worker			name: "bar",
326*333d2b36SAndroid Build Coastguard Worker			package: "com.example.package.bar",
327*333d2b36SAndroid Build Coastguard Worker			container: "com.android.foo",
328*333d2b36SAndroid Build Coastguard Worker			srcs: [
329*333d2b36SAndroid Build Coastguard Worker				"bar.aconfig",
330*333d2b36SAndroid Build Coastguard Worker			],
331*333d2b36SAndroid Build Coastguard Worker		}
332*333d2b36SAndroid Build Coastguard Worker		aconfig_declarations {
333*333d2b36SAndroid Build Coastguard Worker			name: "baz",
334*333d2b36SAndroid Build Coastguard Worker			package: "com.example.package.baz",
335*333d2b36SAndroid Build Coastguard Worker			container: "com.android.foo",
336*333d2b36SAndroid Build Coastguard Worker			srcs: [
337*333d2b36SAndroid Build Coastguard Worker				"baz.aconfig",
338*333d2b36SAndroid Build Coastguard Worker			],
339*333d2b36SAndroid Build Coastguard Worker		}
340*333d2b36SAndroid Build Coastguard Worker	`)
341*333d2b36SAndroid Build Coastguard Worker
342*333d2b36SAndroid Build Coastguard Worker	foo := result.ModuleForTests("foo", "android_common")
343*333d2b36SAndroid Build Coastguard Worker
344*333d2b36SAndroid Build Coastguard Worker	// runtime_resource_overlay module depends on aconfig_declarations listed in flags_packages
345*333d2b36SAndroid Build Coastguard Worker	android.AssertBoolEquals(t, "foo expected to depend on bar", true,
346*333d2b36SAndroid Build Coastguard Worker		CheckModuleHasDependency(t, result.TestContext, "foo", "android_common", "bar"))
347*333d2b36SAndroid Build Coastguard Worker
348*333d2b36SAndroid Build Coastguard Worker	android.AssertBoolEquals(t, "foo expected to depend on baz", true,
349*333d2b36SAndroid Build Coastguard Worker		CheckModuleHasDependency(t, result.TestContext, "foo", "android_common", "baz"))
350*333d2b36SAndroid Build Coastguard Worker
351*333d2b36SAndroid Build Coastguard Worker	aapt2LinkRule := foo.Rule("android/soong/java.aapt2Link")
352*333d2b36SAndroid Build Coastguard Worker	linkInFlags := aapt2LinkRule.Args["inFlags"]
353*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t,
354*333d2b36SAndroid Build Coastguard Worker		"aapt2 link command expected to pass feature flags arguments",
355*333d2b36SAndroid Build Coastguard Worker		linkInFlags,
356*333d2b36SAndroid Build Coastguard Worker		"--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
357*333d2b36SAndroid Build Coastguard Worker	)
358*333d2b36SAndroid Build Coastguard Worker}
359