xref: /aosp_15_r20/build/soong/fsgen/filesystem_creator_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2024 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 fsgen
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
19*333d2b36SAndroid Build Coastguard Worker	"android/soong/etc"
20*333d2b36SAndroid Build Coastguard Worker	"android/soong/filesystem"
21*333d2b36SAndroid Build Coastguard Worker	"android/soong/java"
22*333d2b36SAndroid Build Coastguard Worker	"testing"
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
25*333d2b36SAndroid Build Coastguard Worker)
26*333d2b36SAndroid Build Coastguard Worker
27*333d2b36SAndroid Build Coastguard Workervar prepareForTestWithFsgenBuildComponents = android.FixtureRegisterWithContext(registerBuildComponents)
28*333d2b36SAndroid Build Coastguard Worker
29*333d2b36SAndroid Build Coastguard Workerfunc TestFileSystemCreatorSystemImageProps(t *testing.T) {
30*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
31*333d2b36SAndroid Build Coastguard Worker		android.PrepareForIntegrationTestWithAndroid,
32*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithAndroidBuildComponents,
33*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithAllowMissingDependencies,
34*333d2b36SAndroid Build Coastguard Worker		filesystem.PrepareForTestWithFilesystemBuildComponents,
35*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithFsgenBuildComponents,
36*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyConfig(func(config android.Config) {
37*333d2b36SAndroid Build Coastguard Worker			config.TestProductVariables.PartitionVarsForSoongMigrationOnlyDoNotUse.BoardAvbEnable = true
38*333d2b36SAndroid Build Coastguard Worker			config.TestProductVariables.PartitionVarsForSoongMigrationOnlyDoNotUse.PartitionQualifiedVariables =
39*333d2b36SAndroid Build Coastguard Worker				map[string]android.PartitionQualifiedVariablesType{
40*333d2b36SAndroid Build Coastguard Worker					"system": {
41*333d2b36SAndroid Build Coastguard Worker						BoardAvbKeyPath:       "external/avb/test/data/testkey_rsa4096.pem",
42*333d2b36SAndroid Build Coastguard Worker						BoardAvbAlgorithm:     "SHA256_RSA4096",
43*333d2b36SAndroid Build Coastguard Worker						BoardAvbRollbackIndex: "0",
44*333d2b36SAndroid Build Coastguard Worker						BoardFileSystemType:   "ext4",
45*333d2b36SAndroid Build Coastguard Worker					},
46*333d2b36SAndroid Build Coastguard Worker				}
47*333d2b36SAndroid Build Coastguard Worker		}),
48*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(android.MockFS{
49*333d2b36SAndroid Build Coastguard Worker			"external/avb/test/data/testkey_rsa4096.pem": nil,
50*333d2b36SAndroid Build Coastguard Worker			"external/avb/test/Android.bp": []byte(`
51*333d2b36SAndroid Build Coastguard Worker			filegroup {
52*333d2b36SAndroid Build Coastguard Worker				name: "avb_testkey_rsa4096",
53*333d2b36SAndroid Build Coastguard Worker				srcs: ["data/testkey_rsa4096.pem"],
54*333d2b36SAndroid Build Coastguard Worker			}
55*333d2b36SAndroid Build Coastguard Worker			`),
56*333d2b36SAndroid Build Coastguard Worker			"build/soong/fsgen/Android.bp": []byte(`
57*333d2b36SAndroid Build Coastguard Worker			soong_filesystem_creator {
58*333d2b36SAndroid Build Coastguard Worker				name: "foo",
59*333d2b36SAndroid Build Coastguard Worker			}
60*333d2b36SAndroid Build Coastguard Worker			`),
61*333d2b36SAndroid Build Coastguard Worker		}),
62*333d2b36SAndroid Build Coastguard Worker	).RunTest(t)
63*333d2b36SAndroid Build Coastguard Worker
64*333d2b36SAndroid Build Coastguard Worker	fooSystem := result.ModuleForTests("test_product_generated_system_image", "android_common").Module().(interface {
65*333d2b36SAndroid Build Coastguard Worker		FsProps() filesystem.FilesystemProperties
66*333d2b36SAndroid Build Coastguard Worker	})
67*333d2b36SAndroid Build Coastguard Worker	android.AssertBoolEquals(
68*333d2b36SAndroid Build Coastguard Worker		t,
69*333d2b36SAndroid Build Coastguard Worker		"Property expected to match the product variable 'BOARD_AVB_ENABLE'",
70*333d2b36SAndroid Build Coastguard Worker		true,
71*333d2b36SAndroid Build Coastguard Worker		proptools.Bool(fooSystem.FsProps().Use_avb),
72*333d2b36SAndroid Build Coastguard Worker	)
73*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(
74*333d2b36SAndroid Build Coastguard Worker		t,
75*333d2b36SAndroid Build Coastguard Worker		"Property the avb_private_key property to be set to the existing filegroup",
76*333d2b36SAndroid Build Coastguard Worker		":avb_testkey_rsa4096",
77*333d2b36SAndroid Build Coastguard Worker		proptools.String(fooSystem.FsProps().Avb_private_key),
78*333d2b36SAndroid Build Coastguard Worker	)
79*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(
80*333d2b36SAndroid Build Coastguard Worker		t,
81*333d2b36SAndroid Build Coastguard Worker		"Property expected to match the product variable 'BOARD_AVB_ALGORITHM'",
82*333d2b36SAndroid Build Coastguard Worker		"SHA256_RSA4096",
83*333d2b36SAndroid Build Coastguard Worker		proptools.String(fooSystem.FsProps().Avb_algorithm),
84*333d2b36SAndroid Build Coastguard Worker	)
85*333d2b36SAndroid Build Coastguard Worker	android.AssertIntEquals(
86*333d2b36SAndroid Build Coastguard Worker		t,
87*333d2b36SAndroid Build Coastguard Worker		"Property expected to match the product variable 'BOARD_AVB_SYSTEM_ROLLBACK_INDEX'",
88*333d2b36SAndroid Build Coastguard Worker		0,
89*333d2b36SAndroid Build Coastguard Worker		proptools.Int(fooSystem.FsProps().Rollback_index),
90*333d2b36SAndroid Build Coastguard Worker	)
91*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(
92*333d2b36SAndroid Build Coastguard Worker		t,
93*333d2b36SAndroid Build Coastguard Worker		"Property expected to match the product variable 'BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE'",
94*333d2b36SAndroid Build Coastguard Worker		"ext4",
95*333d2b36SAndroid Build Coastguard Worker		proptools.String(fooSystem.FsProps().Type),
96*333d2b36SAndroid Build Coastguard Worker	)
97*333d2b36SAndroid Build Coastguard Worker}
98*333d2b36SAndroid Build Coastguard Worker
99*333d2b36SAndroid Build Coastguard Workerfunc TestFileSystemCreatorSetPartitionDeps(t *testing.T) {
100*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
101*333d2b36SAndroid Build Coastguard Worker		android.PrepareForIntegrationTestWithAndroid,
102*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithAndroidBuildComponents,
103*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithAllowMissingDependencies,
104*333d2b36SAndroid Build Coastguard Worker		filesystem.PrepareForTestWithFilesystemBuildComponents,
105*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithFsgenBuildComponents,
106*333d2b36SAndroid Build Coastguard Worker		java.PrepareForTestWithJavaBuildComponents,
107*333d2b36SAndroid Build Coastguard Worker		java.PrepareForTestWithJavaDefaultModules,
108*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyConfig(func(config android.Config) {
109*333d2b36SAndroid Build Coastguard Worker			config.TestProductVariables.PartitionVarsForSoongMigrationOnlyDoNotUse.ProductPackages = []string{"bar", "baz"}
110*333d2b36SAndroid Build Coastguard Worker			config.TestProductVariables.PartitionVarsForSoongMigrationOnlyDoNotUse.PartitionQualifiedVariables =
111*333d2b36SAndroid Build Coastguard Worker				map[string]android.PartitionQualifiedVariablesType{
112*333d2b36SAndroid Build Coastguard Worker					"system": {
113*333d2b36SAndroid Build Coastguard Worker						BoardFileSystemType: "ext4",
114*333d2b36SAndroid Build Coastguard Worker					},
115*333d2b36SAndroid Build Coastguard Worker				}
116*333d2b36SAndroid Build Coastguard Worker		}),
117*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(android.MockFS{
118*333d2b36SAndroid Build Coastguard Worker			"external/avb/test/data/testkey_rsa4096.pem": nil,
119*333d2b36SAndroid Build Coastguard Worker			"build/soong/fsgen/Android.bp": []byte(`
120*333d2b36SAndroid Build Coastguard Worker			soong_filesystem_creator {
121*333d2b36SAndroid Build Coastguard Worker				name: "foo",
122*333d2b36SAndroid Build Coastguard Worker			}
123*333d2b36SAndroid Build Coastguard Worker			`),
124*333d2b36SAndroid Build Coastguard Worker		}),
125*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
126*333d2b36SAndroid Build Coastguard Worker	java_library {
127*333d2b36SAndroid Build Coastguard Worker		name: "bar",
128*333d2b36SAndroid Build Coastguard Worker		srcs: ["A.java"],
129*333d2b36SAndroid Build Coastguard Worker	}
130*333d2b36SAndroid Build Coastguard Worker	java_library {
131*333d2b36SAndroid Build Coastguard Worker		name: "baz",
132*333d2b36SAndroid Build Coastguard Worker		srcs: ["A.java"],
133*333d2b36SAndroid Build Coastguard Worker		product_specific: true,
134*333d2b36SAndroid Build Coastguard Worker	}
135*333d2b36SAndroid Build Coastguard Worker	`)
136*333d2b36SAndroid Build Coastguard Worker
137*333d2b36SAndroid Build Coastguard Worker	android.AssertBoolEquals(
138*333d2b36SAndroid Build Coastguard Worker		t,
139*333d2b36SAndroid Build Coastguard Worker		"Generated system image expected to depend on system partition installed \"bar\"",
140*333d2b36SAndroid Build Coastguard Worker		true,
141*333d2b36SAndroid Build Coastguard Worker		java.CheckModuleHasDependency(t, result.TestContext, "test_product_generated_system_image", "android_common", "bar"),
142*333d2b36SAndroid Build Coastguard Worker	)
143*333d2b36SAndroid Build Coastguard Worker	android.AssertBoolEquals(
144*333d2b36SAndroid Build Coastguard Worker		t,
145*333d2b36SAndroid Build Coastguard Worker		"Generated system image expected to not depend on product partition installed \"baz\"",
146*333d2b36SAndroid Build Coastguard Worker		false,
147*333d2b36SAndroid Build Coastguard Worker		java.CheckModuleHasDependency(t, result.TestContext, "test_product_generated_system_image", "android_common", "baz"),
148*333d2b36SAndroid Build Coastguard Worker	)
149*333d2b36SAndroid Build Coastguard Worker}
150*333d2b36SAndroid Build Coastguard Worker
151*333d2b36SAndroid Build Coastguard Workerfunc TestFileSystemCreatorDepsWithNamespace(t *testing.T) {
152*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
153*333d2b36SAndroid Build Coastguard Worker		android.PrepareForIntegrationTestWithAndroid,
154*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithAndroidBuildComponents,
155*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithAllowMissingDependencies,
156*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithNamespace,
157*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithArchMutator,
158*333d2b36SAndroid Build Coastguard Worker		filesystem.PrepareForTestWithFilesystemBuildComponents,
159*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithFsgenBuildComponents,
160*333d2b36SAndroid Build Coastguard Worker		java.PrepareForTestWithJavaBuildComponents,
161*333d2b36SAndroid Build Coastguard Worker		java.PrepareForTestWithJavaDefaultModules,
162*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyConfig(func(config android.Config) {
163*333d2b36SAndroid Build Coastguard Worker			config.TestProductVariables.PartitionVarsForSoongMigrationOnlyDoNotUse.ProductPackages = []string{"bar"}
164*333d2b36SAndroid Build Coastguard Worker			config.TestProductVariables.NamespacesToExport = []string{"a/b"}
165*333d2b36SAndroid Build Coastguard Worker			config.TestProductVariables.PartitionVarsForSoongMigrationOnlyDoNotUse.PartitionQualifiedVariables =
166*333d2b36SAndroid Build Coastguard Worker				map[string]android.PartitionQualifiedVariablesType{
167*333d2b36SAndroid Build Coastguard Worker					"system": {
168*333d2b36SAndroid Build Coastguard Worker						BoardFileSystemType: "ext4",
169*333d2b36SAndroid Build Coastguard Worker					},
170*333d2b36SAndroid Build Coastguard Worker				}
171*333d2b36SAndroid Build Coastguard Worker		}),
172*333d2b36SAndroid Build Coastguard Worker		android.PrepareForNativeBridgeEnabled,
173*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(android.MockFS{
174*333d2b36SAndroid Build Coastguard Worker			"external/avb/test/data/testkey_rsa4096.pem": nil,
175*333d2b36SAndroid Build Coastguard Worker			"build/soong/fsgen/Android.bp": []byte(`
176*333d2b36SAndroid Build Coastguard Worker			soong_filesystem_creator {
177*333d2b36SAndroid Build Coastguard Worker				name: "foo",
178*333d2b36SAndroid Build Coastguard Worker			}
179*333d2b36SAndroid Build Coastguard Worker			`),
180*333d2b36SAndroid Build Coastguard Worker			"a/b/Android.bp": []byte(`
181*333d2b36SAndroid Build Coastguard Worker			soong_namespace{
182*333d2b36SAndroid Build Coastguard Worker			}
183*333d2b36SAndroid Build Coastguard Worker			java_library {
184*333d2b36SAndroid Build Coastguard Worker				name: "bar",
185*333d2b36SAndroid Build Coastguard Worker				srcs: ["A.java"],
186*333d2b36SAndroid Build Coastguard Worker				compile_multilib: "64",
187*333d2b36SAndroid Build Coastguard Worker			}
188*333d2b36SAndroid Build Coastguard Worker			`),
189*333d2b36SAndroid Build Coastguard Worker			"c/d/Android.bp": []byte(`
190*333d2b36SAndroid Build Coastguard Worker			soong_namespace{
191*333d2b36SAndroid Build Coastguard Worker			}
192*333d2b36SAndroid Build Coastguard Worker			java_library {
193*333d2b36SAndroid Build Coastguard Worker				name: "bar",
194*333d2b36SAndroid Build Coastguard Worker				srcs: ["A.java"],
195*333d2b36SAndroid Build Coastguard Worker			}
196*333d2b36SAndroid Build Coastguard Worker			`),
197*333d2b36SAndroid Build Coastguard Worker		}),
198*333d2b36SAndroid Build Coastguard Worker	).RunTest(t)
199*333d2b36SAndroid Build Coastguard Worker
200*333d2b36SAndroid Build Coastguard Worker	var packagingProps android.PackagingProperties
201*333d2b36SAndroid Build Coastguard Worker	for _, prop := range result.ModuleForTests("test_product_generated_system_image", "android_common").Module().GetProperties() {
202*333d2b36SAndroid Build Coastguard Worker		if packagingPropStruct, ok := prop.(*android.PackagingProperties); ok {
203*333d2b36SAndroid Build Coastguard Worker			packagingProps = *packagingPropStruct
204*333d2b36SAndroid Build Coastguard Worker		}
205*333d2b36SAndroid Build Coastguard Worker	}
206*333d2b36SAndroid Build Coastguard Worker	moduleDeps := packagingProps.Multilib.Lib64.Deps
207*333d2b36SAndroid Build Coastguard Worker
208*333d2b36SAndroid Build Coastguard Worker	eval := result.ModuleForTests("test_product_generated_system_image", "android_common").Module().ConfigurableEvaluator(android.PanickingConfigAndErrorContext(result.TestContext))
209*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(
210*333d2b36SAndroid Build Coastguard Worker		t,
211*333d2b36SAndroid Build Coastguard Worker		"Generated system image expected to depend on \"bar\" defined in \"a/b\" namespace",
212*333d2b36SAndroid Build Coastguard Worker		moduleDeps.GetOrDefault(eval, nil),
213*333d2b36SAndroid Build Coastguard Worker		"//a/b:bar",
214*333d2b36SAndroid Build Coastguard Worker	)
215*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListDoesNotContain(
216*333d2b36SAndroid Build Coastguard Worker		t,
217*333d2b36SAndroid Build Coastguard Worker		"Generated system image expected to not depend on \"bar\" defined in \"c/d\" namespace",
218*333d2b36SAndroid Build Coastguard Worker		moduleDeps.GetOrDefault(eval, nil),
219*333d2b36SAndroid Build Coastguard Worker		"//c/d:bar",
220*333d2b36SAndroid Build Coastguard Worker	)
221*333d2b36SAndroid Build Coastguard Worker}
222*333d2b36SAndroid Build Coastguard Worker
223*333d2b36SAndroid Build Coastguard Workerfunc TestRemoveOverriddenModulesFromDeps(t *testing.T) {
224*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
225*333d2b36SAndroid Build Coastguard Worker		android.PrepareForIntegrationTestWithAndroid,
226*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithAndroidBuildComponents,
227*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithAllowMissingDependencies,
228*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithFsgenBuildComponents,
229*333d2b36SAndroid Build Coastguard Worker		java.PrepareForTestWithJavaBuildComponents,
230*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(android.MockFS{
231*333d2b36SAndroid Build Coastguard Worker			"external/avb/test/data/testkey_rsa4096.pem": nil,
232*333d2b36SAndroid Build Coastguard Worker			"build/soong/fsgen/Android.bp": []byte(`
233*333d2b36SAndroid Build Coastguard Worker			soong_filesystem_creator {
234*333d2b36SAndroid Build Coastguard Worker				name: "foo",
235*333d2b36SAndroid Build Coastguard Worker			}
236*333d2b36SAndroid Build Coastguard Worker			`),
237*333d2b36SAndroid Build Coastguard Worker		}),
238*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyConfig(func(config android.Config) {
239*333d2b36SAndroid Build Coastguard Worker			config.TestProductVariables.PartitionVarsForSoongMigrationOnlyDoNotUse.ProductPackages = []string{"libfoo", "libbar"}
240*333d2b36SAndroid Build Coastguard Worker		}),
241*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
242*333d2b36SAndroid Build Coastguard Workerjava_library {
243*333d2b36SAndroid Build Coastguard Worker	name: "libfoo",
244*333d2b36SAndroid Build Coastguard Worker}
245*333d2b36SAndroid Build Coastguard Workerjava_library {
246*333d2b36SAndroid Build Coastguard Worker	name: "libbar",
247*333d2b36SAndroid Build Coastguard Worker	required: ["libbaz"],
248*333d2b36SAndroid Build Coastguard Worker}
249*333d2b36SAndroid Build Coastguard Workerjava_library {
250*333d2b36SAndroid Build Coastguard Worker	name: "libbaz",
251*333d2b36SAndroid Build Coastguard Worker	overrides: ["libfoo"], // overrides libfoo
252*333d2b36SAndroid Build Coastguard Worker}
253*333d2b36SAndroid Build Coastguard Worker	`)
254*333d2b36SAndroid Build Coastguard Worker	resolvedSystemDeps := result.TestContext.Config().Get(fsGenStateOnceKey).(*FsGenState).fsDeps["system"]
255*333d2b36SAndroid Build Coastguard Worker	_, libFooInDeps := (*resolvedSystemDeps)["libfoo"]
256*333d2b36SAndroid Build Coastguard Worker	android.AssertBoolEquals(t, "libfoo should not appear in deps because it has been overridden by libbaz. The latter is a required dep of libbar, which is listed in PRODUCT_PACKAGES", false, libFooInDeps)
257*333d2b36SAndroid Build Coastguard Worker}
258*333d2b36SAndroid Build Coastguard Worker
259*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltEtcModuleGen(t *testing.T) {
260*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
261*333d2b36SAndroid Build Coastguard Worker		android.PrepareForIntegrationTestWithAndroid,
262*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithAndroidBuildComponents,
263*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithAllowMissingDependencies,
264*333d2b36SAndroid Build Coastguard Worker		filesystem.PrepareForTestWithFilesystemBuildComponents,
265*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithFsgenBuildComponents,
266*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyConfig(func(config android.Config) {
267*333d2b36SAndroid Build Coastguard Worker			config.TestProductVariables.PartitionVarsForSoongMigrationOnlyDoNotUse.ProductCopyFiles = []string{
268*333d2b36SAndroid Build Coastguard Worker				"frameworks/base/config/preloaded-classes:system/etc/preloaded-classes",
269*333d2b36SAndroid Build Coastguard Worker				"frameworks/base/data/keyboards/Vendor_0079_Product_0011.kl:system/usr/keylayout/subdir/Vendor_0079_Product_0011.kl",
270*333d2b36SAndroid Build Coastguard Worker				"frameworks/base/data/keyboards/Vendor_0079_Product_18d4.kl:system/usr/keylayout/subdir/Vendor_0079_Product_18d4.kl",
271*333d2b36SAndroid Build Coastguard Worker				"some/non/existing/file.txt:system/etc/file.txt",
272*333d2b36SAndroid Build Coastguard Worker				"device/sample/etc/apns-full-conf.xml:product/etc/apns-conf.xml:google",
273*333d2b36SAndroid Build Coastguard Worker				"device/sample/etc/apns-full-conf.xml:product/etc/apns-conf-2.xml",
274*333d2b36SAndroid Build Coastguard Worker			}
275*333d2b36SAndroid Build Coastguard Worker			config.TestProductVariables.PartitionVarsForSoongMigrationOnlyDoNotUse.PartitionQualifiedVariables =
276*333d2b36SAndroid Build Coastguard Worker				map[string]android.PartitionQualifiedVariablesType{
277*333d2b36SAndroid Build Coastguard Worker					"system": {
278*333d2b36SAndroid Build Coastguard Worker						BoardFileSystemType: "ext4",
279*333d2b36SAndroid Build Coastguard Worker					},
280*333d2b36SAndroid Build Coastguard Worker				}
281*333d2b36SAndroid Build Coastguard Worker		}),
282*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(android.MockFS{
283*333d2b36SAndroid Build Coastguard Worker			"external/avb/test/data/testkey_rsa4096.pem": nil,
284*333d2b36SAndroid Build Coastguard Worker			"build/soong/fsgen/Android.bp": []byte(`
285*333d2b36SAndroid Build Coastguard Worker			soong_filesystem_creator {
286*333d2b36SAndroid Build Coastguard Worker				name: "foo",
287*333d2b36SAndroid Build Coastguard Worker			}
288*333d2b36SAndroid Build Coastguard Worker			`),
289*333d2b36SAndroid Build Coastguard Worker			"frameworks/base/config/preloaded-classes":                   nil,
290*333d2b36SAndroid Build Coastguard Worker			"frameworks/base/data/keyboards/Vendor_0079_Product_0011.kl": nil,
291*333d2b36SAndroid Build Coastguard Worker			"frameworks/base/data/keyboards/Vendor_0079_Product_18d4.kl": nil,
292*333d2b36SAndroid Build Coastguard Worker			"device/sample/etc/apns-full-conf.xml":                       nil,
293*333d2b36SAndroid Build Coastguard Worker		}),
294*333d2b36SAndroid Build Coastguard Worker	).RunTest(t)
295*333d2b36SAndroid Build Coastguard Worker
296*333d2b36SAndroid Build Coastguard Worker	checkModuleProp := func(m android.Module, matcher func(actual interface{}) bool) bool {
297*333d2b36SAndroid Build Coastguard Worker		for _, prop := range m.GetProperties() {
298*333d2b36SAndroid Build Coastguard Worker
299*333d2b36SAndroid Build Coastguard Worker			if matcher(prop) {
300*333d2b36SAndroid Build Coastguard Worker				return true
301*333d2b36SAndroid Build Coastguard Worker			}
302*333d2b36SAndroid Build Coastguard Worker		}
303*333d2b36SAndroid Build Coastguard Worker		return false
304*333d2b36SAndroid Build Coastguard Worker	}
305*333d2b36SAndroid Build Coastguard Worker
306*333d2b36SAndroid Build Coastguard Worker	// check generated prebuilt_* module type install path and install partition
307*333d2b36SAndroid Build Coastguard Worker	generatedModule := result.ModuleForTests("system-frameworks_base_config-etc-0", "android_arm64_armv8-a").Module()
308*333d2b36SAndroid Build Coastguard Worker	etcModule, _ := generatedModule.(*etc.PrebuiltEtc)
309*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(
310*333d2b36SAndroid Build Coastguard Worker		t,
311*333d2b36SAndroid Build Coastguard Worker		"module expected to have etc install path",
312*333d2b36SAndroid Build Coastguard Worker		"etc",
313*333d2b36SAndroid Build Coastguard Worker		etcModule.BaseDir(),
314*333d2b36SAndroid Build Coastguard Worker	)
315*333d2b36SAndroid Build Coastguard Worker	android.AssertBoolEquals(
316*333d2b36SAndroid Build Coastguard Worker		t,
317*333d2b36SAndroid Build Coastguard Worker		"module expected to be installed in system partition",
318*333d2b36SAndroid Build Coastguard Worker		true,
319*333d2b36SAndroid Build Coastguard Worker		!generatedModule.InstallInProduct() &&
320*333d2b36SAndroid Build Coastguard Worker			!generatedModule.InstallInVendor() &&
321*333d2b36SAndroid Build Coastguard Worker			!generatedModule.InstallInSystemExt(),
322*333d2b36SAndroid Build Coastguard Worker	)
323*333d2b36SAndroid Build Coastguard Worker
324*333d2b36SAndroid Build Coastguard Worker	// check generated prebuilt_* module specifies correct relative_install_path property
325*333d2b36SAndroid Build Coastguard Worker	generatedModule = result.ModuleForTests("system-frameworks_base_data_keyboards-usr_keylayout_subdir-0", "android_arm64_armv8-a").Module()
326*333d2b36SAndroid Build Coastguard Worker	etcModule, _ = generatedModule.(*etc.PrebuiltEtc)
327*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(
328*333d2b36SAndroid Build Coastguard Worker		t,
329*333d2b36SAndroid Build Coastguard Worker		"module expected to set correct relative_install_path properties",
330*333d2b36SAndroid Build Coastguard Worker		"subdir",
331*333d2b36SAndroid Build Coastguard Worker		etcModule.SubDir(),
332*333d2b36SAndroid Build Coastguard Worker	)
333*333d2b36SAndroid Build Coastguard Worker
334*333d2b36SAndroid Build Coastguard Worker	// check that prebuilt_* module is not generated for non existing source file
335*333d2b36SAndroid Build Coastguard Worker	android.AssertPanicMessageContains(
336*333d2b36SAndroid Build Coastguard Worker		t,
337*333d2b36SAndroid Build Coastguard Worker		"prebuilt_* module not generated for non existing source file",
338*333d2b36SAndroid Build Coastguard Worker		"failed to find module \"system-some_non_existing-etc-0\"",
339*333d2b36SAndroid Build Coastguard Worker		func() { result.ModuleForTests("system-some_non_existing-etc-0", "android_arm64_armv8-a") },
340*333d2b36SAndroid Build Coastguard Worker	)
341*333d2b36SAndroid Build Coastguard Worker
342*333d2b36SAndroid Build Coastguard Worker	// check that duplicate src file can exist in PRODUCT_COPY_FILES and generates separate modules
343*333d2b36SAndroid Build Coastguard Worker	generatedModule0 := result.ModuleForTests("product-device_sample_etc-etc-0", "android_arm64_armv8-a").Module()
344*333d2b36SAndroid Build Coastguard Worker	generatedModule1 := result.ModuleForTests("product-device_sample_etc-etc-1", "android_arm64_armv8-a").Module()
345*333d2b36SAndroid Build Coastguard Worker
346*333d2b36SAndroid Build Coastguard Worker	// check that generated prebuilt_* module sets correct srcs and dsts property
347*333d2b36SAndroid Build Coastguard Worker	eval := generatedModule0.ConfigurableEvaluator(android.PanickingConfigAndErrorContext(result.TestContext))
348*333d2b36SAndroid Build Coastguard Worker	android.AssertBoolEquals(
349*333d2b36SAndroid Build Coastguard Worker		t,
350*333d2b36SAndroid Build Coastguard Worker		"module expected to set correct srcs and dsts properties",
351*333d2b36SAndroid Build Coastguard Worker		true,
352*333d2b36SAndroid Build Coastguard Worker		checkModuleProp(generatedModule0, func(actual interface{}) bool {
353*333d2b36SAndroid Build Coastguard Worker			if p, ok := actual.(*etc.PrebuiltEtcProperties); ok {
354*333d2b36SAndroid Build Coastguard Worker				srcs := p.Srcs.GetOrDefault(eval, nil)
355*333d2b36SAndroid Build Coastguard Worker				dsts := p.Dsts.GetOrDefault(eval, nil)
356*333d2b36SAndroid Build Coastguard Worker				return len(srcs) == 1 &&
357*333d2b36SAndroid Build Coastguard Worker					srcs[0] == "apns-full-conf.xml" &&
358*333d2b36SAndroid Build Coastguard Worker					len(dsts) == 1 &&
359*333d2b36SAndroid Build Coastguard Worker					dsts[0] == "apns-conf.xml"
360*333d2b36SAndroid Build Coastguard Worker			}
361*333d2b36SAndroid Build Coastguard Worker			return false
362*333d2b36SAndroid Build Coastguard Worker		}),
363*333d2b36SAndroid Build Coastguard Worker	)
364*333d2b36SAndroid Build Coastguard Worker
365*333d2b36SAndroid Build Coastguard Worker	// check that generated prebuilt_* module sets correct srcs and dsts property
366*333d2b36SAndroid Build Coastguard Worker	eval = generatedModule1.ConfigurableEvaluator(android.PanickingConfigAndErrorContext(result.TestContext))
367*333d2b36SAndroid Build Coastguard Worker	android.AssertBoolEquals(
368*333d2b36SAndroid Build Coastguard Worker		t,
369*333d2b36SAndroid Build Coastguard Worker		"module expected to set correct srcs and dsts properties",
370*333d2b36SAndroid Build Coastguard Worker		true,
371*333d2b36SAndroid Build Coastguard Worker		checkModuleProp(generatedModule1, func(actual interface{}) bool {
372*333d2b36SAndroid Build Coastguard Worker			if p, ok := actual.(*etc.PrebuiltEtcProperties); ok {
373*333d2b36SAndroid Build Coastguard Worker				srcs := p.Srcs.GetOrDefault(eval, nil)
374*333d2b36SAndroid Build Coastguard Worker				dsts := p.Dsts.GetOrDefault(eval, nil)
375*333d2b36SAndroid Build Coastguard Worker				return len(srcs) == 1 &&
376*333d2b36SAndroid Build Coastguard Worker					srcs[0] == "apns-full-conf.xml" &&
377*333d2b36SAndroid Build Coastguard Worker					len(dsts) == 1 &&
378*333d2b36SAndroid Build Coastguard Worker					dsts[0] == "apns-conf-2.xml"
379*333d2b36SAndroid Build Coastguard Worker			}
380*333d2b36SAndroid Build Coastguard Worker			return false
381*333d2b36SAndroid Build Coastguard Worker		}),
382*333d2b36SAndroid Build Coastguard Worker	)
383*333d2b36SAndroid Build Coastguard Worker}
384