xref: /aosp_15_r20/build/soong/filesystem/filesystem_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2021 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 filesystem
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"os"
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/bpf"
24*333d2b36SAndroid Build Coastguard Worker	"android/soong/cc"
25*333d2b36SAndroid Build Coastguard Worker	"android/soong/etc"
26*333d2b36SAndroid Build Coastguard Worker	"android/soong/java"
27*333d2b36SAndroid Build Coastguard Worker	"android/soong/phony"
28*333d2b36SAndroid Build Coastguard Worker
29*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
30*333d2b36SAndroid Build Coastguard Worker)
31*333d2b36SAndroid Build Coastguard Worker
32*333d2b36SAndroid Build Coastguard Workerfunc TestMain(m *testing.M) {
33*333d2b36SAndroid Build Coastguard Worker	os.Exit(m.Run())
34*333d2b36SAndroid Build Coastguard Worker}
35*333d2b36SAndroid Build Coastguard Worker
36*333d2b36SAndroid Build Coastguard Workervar fixture = android.GroupFixturePreparers(
37*333d2b36SAndroid Build Coastguard Worker	android.PrepareForIntegrationTestWithAndroid,
38*333d2b36SAndroid Build Coastguard Worker	android.PrepareForTestWithAndroidBuildComponents,
39*333d2b36SAndroid Build Coastguard Worker	bpf.PrepareForTestWithBpf,
40*333d2b36SAndroid Build Coastguard Worker	cc.PrepareForIntegrationTestWithCc,
41*333d2b36SAndroid Build Coastguard Worker	etc.PrepareForTestWithPrebuiltEtc,
42*333d2b36SAndroid Build Coastguard Worker	java.PrepareForTestWithJavaBuildComponents,
43*333d2b36SAndroid Build Coastguard Worker	java.PrepareForTestWithJavaDefaultModules,
44*333d2b36SAndroid Build Coastguard Worker	phony.PrepareForTestWithPhony,
45*333d2b36SAndroid Build Coastguard Worker	PrepareForTestWithFilesystemBuildComponents,
46*333d2b36SAndroid Build Coastguard Worker)
47*333d2b36SAndroid Build Coastguard Worker
48*333d2b36SAndroid Build Coastguard Workerfunc TestFileSystemDeps(t *testing.T) {
49*333d2b36SAndroid Build Coastguard Worker	result := fixture.RunTestWithBp(t, `
50*333d2b36SAndroid Build Coastguard Worker		android_filesystem {
51*333d2b36SAndroid Build Coastguard Worker			name: "myfilesystem",
52*333d2b36SAndroid Build Coastguard Worker			multilib: {
53*333d2b36SAndroid Build Coastguard Worker				common: {
54*333d2b36SAndroid Build Coastguard Worker					deps: [
55*333d2b36SAndroid Build Coastguard Worker						"bpf.o",
56*333d2b36SAndroid Build Coastguard Worker						"phony",
57*333d2b36SAndroid Build Coastguard Worker					],
58*333d2b36SAndroid Build Coastguard Worker				},
59*333d2b36SAndroid Build Coastguard Worker				lib32: {
60*333d2b36SAndroid Build Coastguard Worker					deps: [
61*333d2b36SAndroid Build Coastguard Worker						"foo",
62*333d2b36SAndroid Build Coastguard Worker						"libbar",
63*333d2b36SAndroid Build Coastguard Worker					],
64*333d2b36SAndroid Build Coastguard Worker				},
65*333d2b36SAndroid Build Coastguard Worker				lib64: {
66*333d2b36SAndroid Build Coastguard Worker					deps: [
67*333d2b36SAndroid Build Coastguard Worker						"libbar",
68*333d2b36SAndroid Build Coastguard Worker					],
69*333d2b36SAndroid Build Coastguard Worker				},
70*333d2b36SAndroid Build Coastguard Worker			},
71*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "both",
72*333d2b36SAndroid Build Coastguard Worker		}
73*333d2b36SAndroid Build Coastguard Worker
74*333d2b36SAndroid Build Coastguard Worker		bpf {
75*333d2b36SAndroid Build Coastguard Worker			name: "bpf.o",
76*333d2b36SAndroid Build Coastguard Worker			srcs: ["bpf.c"],
77*333d2b36SAndroid Build Coastguard Worker		}
78*333d2b36SAndroid Build Coastguard Worker
79*333d2b36SAndroid Build Coastguard Worker		cc_binary {
80*333d2b36SAndroid Build Coastguard Worker			name: "foo",
81*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "prefer32",
82*333d2b36SAndroid Build Coastguard Worker		}
83*333d2b36SAndroid Build Coastguard Worker
84*333d2b36SAndroid Build Coastguard Worker		cc_library {
85*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
86*333d2b36SAndroid Build Coastguard Worker			required: ["libbaz"],
87*333d2b36SAndroid Build Coastguard Worker			target: {
88*333d2b36SAndroid Build Coastguard Worker				platform: {
89*333d2b36SAndroid Build Coastguard Worker					required: ["lib_platform_only"],
90*333d2b36SAndroid Build Coastguard Worker				},
91*333d2b36SAndroid Build Coastguard Worker			},
92*333d2b36SAndroid Build Coastguard Worker		}
93*333d2b36SAndroid Build Coastguard Worker
94*333d2b36SAndroid Build Coastguard Worker		cc_library {
95*333d2b36SAndroid Build Coastguard Worker			name: "libbaz",
96*333d2b36SAndroid Build Coastguard Worker		}
97*333d2b36SAndroid Build Coastguard Worker
98*333d2b36SAndroid Build Coastguard Worker		cc_library {
99*333d2b36SAndroid Build Coastguard Worker			name: "lib_platform_only",
100*333d2b36SAndroid Build Coastguard Worker		}
101*333d2b36SAndroid Build Coastguard Worker
102*333d2b36SAndroid Build Coastguard Worker		phony {
103*333d2b36SAndroid Build Coastguard Worker			name: "phony",
104*333d2b36SAndroid Build Coastguard Worker			required: [
105*333d2b36SAndroid Build Coastguard Worker				"libquz",
106*333d2b36SAndroid Build Coastguard Worker				"myapp",
107*333d2b36SAndroid Build Coastguard Worker			],
108*333d2b36SAndroid Build Coastguard Worker		}
109*333d2b36SAndroid Build Coastguard Worker
110*333d2b36SAndroid Build Coastguard Worker		cc_library {
111*333d2b36SAndroid Build Coastguard Worker			name: "libquz",
112*333d2b36SAndroid Build Coastguard Worker		}
113*333d2b36SAndroid Build Coastguard Worker
114*333d2b36SAndroid Build Coastguard Worker		android_app {
115*333d2b36SAndroid Build Coastguard Worker			name: "myapp",
116*333d2b36SAndroid Build Coastguard Worker			platform_apis: true,
117*333d2b36SAndroid Build Coastguard Worker			installable: true,
118*333d2b36SAndroid Build Coastguard Worker		}
119*333d2b36SAndroid Build Coastguard Worker	`)
120*333d2b36SAndroid Build Coastguard Worker
121*333d2b36SAndroid Build Coastguard Worker	// produces "myfilesystem.img"
122*333d2b36SAndroid Build Coastguard Worker	result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img")
123*333d2b36SAndroid Build Coastguard Worker
124*333d2b36SAndroid Build Coastguard Worker	fs := result.ModuleForTests("myfilesystem", "android_common").Module().(*filesystem)
125*333d2b36SAndroid Build Coastguard Worker	expected := []string{
126*333d2b36SAndroid Build Coastguard Worker		"app/myapp/myapp.apk",
127*333d2b36SAndroid Build Coastguard Worker		"bin/foo",
128*333d2b36SAndroid Build Coastguard Worker		"lib/libbar.so",
129*333d2b36SAndroid Build Coastguard Worker		"lib64/libbar.so",
130*333d2b36SAndroid Build Coastguard Worker		"lib64/libbaz.so",
131*333d2b36SAndroid Build Coastguard Worker		"lib64/libquz.so",
132*333d2b36SAndroid Build Coastguard Worker		"lib64/lib_platform_only.so",
133*333d2b36SAndroid Build Coastguard Worker		"etc/bpf/bpf.o",
134*333d2b36SAndroid Build Coastguard Worker	}
135*333d2b36SAndroid Build Coastguard Worker	for _, e := range expected {
136*333d2b36SAndroid Build Coastguard Worker		android.AssertStringListContains(t, "missing entry", fs.entries, e)
137*333d2b36SAndroid Build Coastguard Worker	}
138*333d2b36SAndroid Build Coastguard Worker}
139*333d2b36SAndroid Build Coastguard Worker
140*333d2b36SAndroid Build Coastguard Workerfunc TestIncludeMakeBuiltFiles(t *testing.T) {
141*333d2b36SAndroid Build Coastguard Worker	result := fixture.RunTestWithBp(t, `
142*333d2b36SAndroid Build Coastguard Worker		android_filesystem {
143*333d2b36SAndroid Build Coastguard Worker			name: "myfilesystem",
144*333d2b36SAndroid Build Coastguard Worker			include_make_built_files: "system",
145*333d2b36SAndroid Build Coastguard Worker		}
146*333d2b36SAndroid Build Coastguard Worker	`)
147*333d2b36SAndroid Build Coastguard Worker
148*333d2b36SAndroid Build Coastguard Worker	output := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img")
149*333d2b36SAndroid Build Coastguard Worker
150*333d2b36SAndroid Build Coastguard Worker	stampFile := "out/target/product/test_device/obj/PACKAGING/system_intermediates/staging_dir.stamp"
151*333d2b36SAndroid Build Coastguard Worker	fileListFile := "out/target/product/test_device/obj/PACKAGING/system_intermediates/file_list.txt"
152*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "deps of filesystem must include the staging dir stamp file", output.Implicits.Strings(), stampFile)
153*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "deps of filesystem must include the staging dir file list", output.Implicits.Strings(), fileListFile)
154*333d2b36SAndroid Build Coastguard Worker}
155*333d2b36SAndroid Build Coastguard Worker
156*333d2b36SAndroid Build Coastguard Workerfunc TestFileSystemFillsLinkerConfigWithStubLibs(t *testing.T) {
157*333d2b36SAndroid Build Coastguard Worker	result := fixture.RunTestWithBp(t, `
158*333d2b36SAndroid Build Coastguard Worker		android_system_image {
159*333d2b36SAndroid Build Coastguard Worker			name: "myfilesystem",
160*333d2b36SAndroid Build Coastguard Worker			base_dir: "system",
161*333d2b36SAndroid Build Coastguard Worker			deps: [
162*333d2b36SAndroid Build Coastguard Worker				"libfoo",
163*333d2b36SAndroid Build Coastguard Worker				"libbar",
164*333d2b36SAndroid Build Coastguard Worker			],
165*333d2b36SAndroid Build Coastguard Worker			linker_config: {
166*333d2b36SAndroid Build Coastguard Worker				gen_linker_config: true,
167*333d2b36SAndroid Build Coastguard Worker				linker_config_srcs: ["linker.config.json"],
168*333d2b36SAndroid Build Coastguard Worker			},
169*333d2b36SAndroid Build Coastguard Worker		}
170*333d2b36SAndroid Build Coastguard Worker
171*333d2b36SAndroid Build Coastguard Worker		cc_library {
172*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
173*333d2b36SAndroid Build Coastguard Worker			stubs: {
174*333d2b36SAndroid Build Coastguard Worker				symbol_file: "libfoo.map.txt",
175*333d2b36SAndroid Build Coastguard Worker			},
176*333d2b36SAndroid Build Coastguard Worker		}
177*333d2b36SAndroid Build Coastguard Worker
178*333d2b36SAndroid Build Coastguard Worker		cc_library {
179*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
180*333d2b36SAndroid Build Coastguard Worker		}
181*333d2b36SAndroid Build Coastguard Worker	`)
182*333d2b36SAndroid Build Coastguard Worker
183*333d2b36SAndroid Build Coastguard Worker	module := result.ModuleForTests("myfilesystem", "android_common")
184*333d2b36SAndroid Build Coastguard Worker	output := module.Output("out/soong/.intermediates/myfilesystem/android_common/root/system/etc/linker.config.pb")
185*333d2b36SAndroid Build Coastguard Worker
186*333d2b36SAndroid Build Coastguard Worker	fullCommand := output.RuleParams.Command
187*333d2b36SAndroid Build Coastguard Worker	startIndex := strings.Index(fullCommand, "conv_linker_config")
188*333d2b36SAndroid Build Coastguard Worker	linkerConfigCommand := fullCommand[startIndex:]
189*333d2b36SAndroid Build Coastguard Worker
190*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "linker.config.pb should have libfoo",
191*333d2b36SAndroid Build Coastguard Worker		linkerConfigCommand, "libfoo.so")
192*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesNotContain(t, "linker.config.pb should not have libbar",
193*333d2b36SAndroid Build Coastguard Worker		linkerConfigCommand, "libbar.so")
194*333d2b36SAndroid Build Coastguard Worker}
195*333d2b36SAndroid Build Coastguard Worker
196*333d2b36SAndroid Build Coastguard Workerfunc registerComponent(ctx android.RegistrationContext) {
197*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("component", componentFactory)
198*333d2b36SAndroid Build Coastguard Worker}
199*333d2b36SAndroid Build Coastguard Worker
200*333d2b36SAndroid Build Coastguard Workerfunc componentFactory() android.Module {
201*333d2b36SAndroid Build Coastguard Worker	m := &component{}
202*333d2b36SAndroid Build Coastguard Worker	m.AddProperties(&m.properties)
203*333d2b36SAndroid Build Coastguard Worker	android.InitAndroidArchModule(m, android.DeviceSupported, android.MultilibCommon)
204*333d2b36SAndroid Build Coastguard Worker	return m
205*333d2b36SAndroid Build Coastguard Worker}
206*333d2b36SAndroid Build Coastguard Worker
207*333d2b36SAndroid Build Coastguard Workertype component struct {
208*333d2b36SAndroid Build Coastguard Worker	android.ModuleBase
209*333d2b36SAndroid Build Coastguard Worker	properties struct {
210*333d2b36SAndroid Build Coastguard Worker		Install_copy_in_data []string
211*333d2b36SAndroid Build Coastguard Worker	}
212*333d2b36SAndroid Build Coastguard Worker}
213*333d2b36SAndroid Build Coastguard Worker
214*333d2b36SAndroid Build Coastguard Workerfunc (c *component) GenerateAndroidBuildActions(ctx android.ModuleContext) {
215*333d2b36SAndroid Build Coastguard Worker	output := android.PathForModuleOut(ctx, c.Name())
216*333d2b36SAndroid Build Coastguard Worker	dir := android.PathForModuleInstall(ctx, "components")
217*333d2b36SAndroid Build Coastguard Worker	ctx.InstallFile(dir, c.Name(), output)
218*333d2b36SAndroid Build Coastguard Worker
219*333d2b36SAndroid Build Coastguard Worker	dataDir := android.PathForModuleInPartitionInstall(ctx, "data", "components")
220*333d2b36SAndroid Build Coastguard Worker	for _, d := range c.properties.Install_copy_in_data {
221*333d2b36SAndroid Build Coastguard Worker		ctx.InstallFile(dataDir, d, output)
222*333d2b36SAndroid Build Coastguard Worker	}
223*333d2b36SAndroid Build Coastguard Worker}
224*333d2b36SAndroid Build Coastguard Worker
225*333d2b36SAndroid Build Coastguard Workerfunc TestFileSystemGathersItemsOnlyInSystemPartition(t *testing.T) {
226*333d2b36SAndroid Build Coastguard Worker	f := android.GroupFixturePreparers(fixture, android.FixtureRegisterWithContext(registerComponent))
227*333d2b36SAndroid Build Coastguard Worker	result := f.RunTestWithBp(t, `
228*333d2b36SAndroid Build Coastguard Worker		android_system_image {
229*333d2b36SAndroid Build Coastguard Worker			name: "myfilesystem",
230*333d2b36SAndroid Build Coastguard Worker			multilib: {
231*333d2b36SAndroid Build Coastguard Worker				common: {
232*333d2b36SAndroid Build Coastguard Worker					deps: ["foo"],
233*333d2b36SAndroid Build Coastguard Worker				},
234*333d2b36SAndroid Build Coastguard Worker			},
235*333d2b36SAndroid Build Coastguard Worker			linker_config: {
236*333d2b36SAndroid Build Coastguard Worker				gen_linker_config: true,
237*333d2b36SAndroid Build Coastguard Worker				linker_config_srcs: ["linker.config.json"],
238*333d2b36SAndroid Build Coastguard Worker			},
239*333d2b36SAndroid Build Coastguard Worker		}
240*333d2b36SAndroid Build Coastguard Worker		component {
241*333d2b36SAndroid Build Coastguard Worker			name: "foo",
242*333d2b36SAndroid Build Coastguard Worker			install_copy_in_data: ["bar"],
243*333d2b36SAndroid Build Coastguard Worker		}
244*333d2b36SAndroid Build Coastguard Worker	`)
245*333d2b36SAndroid Build Coastguard Worker
246*333d2b36SAndroid Build Coastguard Worker	module := result.ModuleForTests("myfilesystem", "android_common").Module().(*systemImage)
247*333d2b36SAndroid Build Coastguard Worker	android.AssertDeepEquals(t, "entries should have foo and not bar", []string{"components/foo", "etc/linker.config.pb"}, module.entries)
248*333d2b36SAndroid Build Coastguard Worker}
249*333d2b36SAndroid Build Coastguard Worker
250*333d2b36SAndroid Build Coastguard Workerfunc TestAvbGenVbmetaImage(t *testing.T) {
251*333d2b36SAndroid Build Coastguard Worker	result := fixture.RunTestWithBp(t, `
252*333d2b36SAndroid Build Coastguard Worker		avb_gen_vbmeta_image {
253*333d2b36SAndroid Build Coastguard Worker			name: "input_hashdesc",
254*333d2b36SAndroid Build Coastguard Worker			src: "input.img",
255*333d2b36SAndroid Build Coastguard Worker			partition_name: "input_partition_name",
256*333d2b36SAndroid Build Coastguard Worker			salt: "2222",
257*333d2b36SAndroid Build Coastguard Worker		}`)
258*333d2b36SAndroid Build Coastguard Worker	cmd := result.ModuleForTests("input_hashdesc", "android_arm64_armv8-a").Rule("avbGenVbmetaImage").RuleParams.Command
259*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "Can't find correct --partition_name argument",
260*333d2b36SAndroid Build Coastguard Worker		cmd, "--partition_name input_partition_name")
261*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "Can't find --do_not_append_vbmeta_image",
262*333d2b36SAndroid Build Coastguard Worker		cmd, "--do_not_append_vbmeta_image")
263*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "Can't find --output_vbmeta_image",
264*333d2b36SAndroid Build Coastguard Worker		cmd, "--output_vbmeta_image ")
265*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "Can't find --salt argument",
266*333d2b36SAndroid Build Coastguard Worker		cmd, "--salt 2222")
267*333d2b36SAndroid Build Coastguard Worker}
268*333d2b36SAndroid Build Coastguard Worker
269*333d2b36SAndroid Build Coastguard Workerfunc TestAvbAddHashFooter(t *testing.T) {
270*333d2b36SAndroid Build Coastguard Worker	result := fixture.RunTestWithBp(t, `
271*333d2b36SAndroid Build Coastguard Worker		avb_gen_vbmeta_image {
272*333d2b36SAndroid Build Coastguard Worker			name: "input_hashdesc",
273*333d2b36SAndroid Build Coastguard Worker			src: "input.img",
274*333d2b36SAndroid Build Coastguard Worker			partition_name: "input",
275*333d2b36SAndroid Build Coastguard Worker			salt: "2222",
276*333d2b36SAndroid Build Coastguard Worker		}
277*333d2b36SAndroid Build Coastguard Worker
278*333d2b36SAndroid Build Coastguard Worker		avb_add_hash_footer {
279*333d2b36SAndroid Build Coastguard Worker			name: "myfooter",
280*333d2b36SAndroid Build Coastguard Worker			src: "input.img",
281*333d2b36SAndroid Build Coastguard Worker			filename: "output.img",
282*333d2b36SAndroid Build Coastguard Worker			partition_name: "mypartition",
283*333d2b36SAndroid Build Coastguard Worker			private_key: "mykey",
284*333d2b36SAndroid Build Coastguard Worker			salt: "1111",
285*333d2b36SAndroid Build Coastguard Worker			props: [
286*333d2b36SAndroid Build Coastguard Worker				{
287*333d2b36SAndroid Build Coastguard Worker					name: "prop1",
288*333d2b36SAndroid Build Coastguard Worker					value: "value1",
289*333d2b36SAndroid Build Coastguard Worker				},
290*333d2b36SAndroid Build Coastguard Worker				{
291*333d2b36SAndroid Build Coastguard Worker					name: "prop2",
292*333d2b36SAndroid Build Coastguard Worker					file: "value_file",
293*333d2b36SAndroid Build Coastguard Worker				},
294*333d2b36SAndroid Build Coastguard Worker			],
295*333d2b36SAndroid Build Coastguard Worker			include_descriptors_from_images: ["input_hashdesc"],
296*333d2b36SAndroid Build Coastguard Worker		}
297*333d2b36SAndroid Build Coastguard Worker	`)
298*333d2b36SAndroid Build Coastguard Worker	cmd := result.ModuleForTests("myfooter", "android_arm64_armv8-a").Rule("avbAddHashFooter").RuleParams.Command
299*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "Can't find correct --partition_name argument",
300*333d2b36SAndroid Build Coastguard Worker		cmd, "--partition_name mypartition")
301*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "Can't find correct --key argument",
302*333d2b36SAndroid Build Coastguard Worker		cmd, "--key mykey")
303*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "Can't find --salt argument",
304*333d2b36SAndroid Build Coastguard Worker		cmd, "--salt 1111")
305*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "Can't find --prop argument",
306*333d2b36SAndroid Build Coastguard Worker		cmd, "--prop 'prop1:value1'")
307*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "Can't find --prop_from_file argument",
308*333d2b36SAndroid Build Coastguard Worker		cmd, "--prop_from_file 'prop2:value_file'")
309*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "Can't find --include_descriptors_from_image",
310*333d2b36SAndroid Build Coastguard Worker		cmd, "--include_descriptors_from_image ")
311*333d2b36SAndroid Build Coastguard Worker}
312*333d2b36SAndroid Build Coastguard Worker
313*333d2b36SAndroid Build Coastguard Workerfunc TestFileSystemWithCoverageVariants(t *testing.T) {
314*333d2b36SAndroid Build Coastguard Worker	context := android.GroupFixturePreparers(
315*333d2b36SAndroid Build Coastguard Worker		fixture,
316*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
317*333d2b36SAndroid Build Coastguard Worker			variables.GcovCoverage = proptools.BoolPtr(true)
318*333d2b36SAndroid Build Coastguard Worker			variables.Native_coverage = proptools.BoolPtr(true)
319*333d2b36SAndroid Build Coastguard Worker		}),
320*333d2b36SAndroid Build Coastguard Worker	)
321*333d2b36SAndroid Build Coastguard Worker
322*333d2b36SAndroid Build Coastguard Worker	result := context.RunTestWithBp(t, `
323*333d2b36SAndroid Build Coastguard Worker		prebuilt_etc {
324*333d2b36SAndroid Build Coastguard Worker			name: "prebuilt",
325*333d2b36SAndroid Build Coastguard Worker			src: ":myfilesystem",
326*333d2b36SAndroid Build Coastguard Worker		}
327*333d2b36SAndroid Build Coastguard Worker
328*333d2b36SAndroid Build Coastguard Worker		android_system_image {
329*333d2b36SAndroid Build Coastguard Worker			name: "myfilesystem",
330*333d2b36SAndroid Build Coastguard Worker			deps: [
331*333d2b36SAndroid Build Coastguard Worker				"libfoo",
332*333d2b36SAndroid Build Coastguard Worker			],
333*333d2b36SAndroid Build Coastguard Worker			linker_config: {
334*333d2b36SAndroid Build Coastguard Worker				gen_linker_config: true,
335*333d2b36SAndroid Build Coastguard Worker				linker_config_srcs: ["linker.config.json"],
336*333d2b36SAndroid Build Coastguard Worker			},
337*333d2b36SAndroid Build Coastguard Worker		}
338*333d2b36SAndroid Build Coastguard Worker
339*333d2b36SAndroid Build Coastguard Worker		cc_library {
340*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
341*333d2b36SAndroid Build Coastguard Worker			shared_libs: [
342*333d2b36SAndroid Build Coastguard Worker				"libbar",
343*333d2b36SAndroid Build Coastguard Worker			],
344*333d2b36SAndroid Build Coastguard Worker			stl: "none",
345*333d2b36SAndroid Build Coastguard Worker		}
346*333d2b36SAndroid Build Coastguard Worker
347*333d2b36SAndroid Build Coastguard Worker		cc_library {
348*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
349*333d2b36SAndroid Build Coastguard Worker			stl: "none",
350*333d2b36SAndroid Build Coastguard Worker		}
351*333d2b36SAndroid Build Coastguard Worker	`)
352*333d2b36SAndroid Build Coastguard Worker
353*333d2b36SAndroid Build Coastguard Worker	filesystem := result.ModuleForTests("myfilesystem", "android_common_cov")
354*333d2b36SAndroid Build Coastguard Worker	inputs := filesystem.Output("myfilesystem.img").Implicits
355*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "filesystem should have libfoo(cov)",
356*333d2b36SAndroid Build Coastguard Worker		inputs.Strings(),
357*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/libfoo/android_arm64_armv8-a_shared_cov/libfoo.so")
358*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "filesystem should have libbar(cov)",
359*333d2b36SAndroid Build Coastguard Worker		inputs.Strings(),
360*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/libbar/android_arm64_armv8-a_shared_cov/libbar.so")
361*333d2b36SAndroid Build Coastguard Worker
362*333d2b36SAndroid Build Coastguard Worker	filesystemOutput := filesystem.Output("myfilesystem.img").Output
363*333d2b36SAndroid Build Coastguard Worker	prebuiltInput := result.ModuleForTests("prebuilt", "android_arm64_armv8-a").Rule("Cp").Input
364*333d2b36SAndroid Build Coastguard Worker	if filesystemOutput != prebuiltInput {
365*333d2b36SAndroid Build Coastguard Worker		t.Error("prebuilt should use cov variant of filesystem")
366*333d2b36SAndroid Build Coastguard Worker	}
367*333d2b36SAndroid Build Coastguard Worker}
368*333d2b36SAndroid Build Coastguard Worker
369*333d2b36SAndroid Build Coastguard Workerfunc TestSystemImageDefaults(t *testing.T) {
370*333d2b36SAndroid Build Coastguard Worker	result := fixture.RunTestWithBp(t, `
371*333d2b36SAndroid Build Coastguard Worker		android_filesystem_defaults {
372*333d2b36SAndroid Build Coastguard Worker			name: "defaults",
373*333d2b36SAndroid Build Coastguard Worker			multilib: {
374*333d2b36SAndroid Build Coastguard Worker				common: {
375*333d2b36SAndroid Build Coastguard Worker					deps: [
376*333d2b36SAndroid Build Coastguard Worker						"phony",
377*333d2b36SAndroid Build Coastguard Worker					],
378*333d2b36SAndroid Build Coastguard Worker				},
379*333d2b36SAndroid Build Coastguard Worker				lib64: {
380*333d2b36SAndroid Build Coastguard Worker					deps: [
381*333d2b36SAndroid Build Coastguard Worker						"libbar",
382*333d2b36SAndroid Build Coastguard Worker					],
383*333d2b36SAndroid Build Coastguard Worker				},
384*333d2b36SAndroid Build Coastguard Worker			},
385*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "both",
386*333d2b36SAndroid Build Coastguard Worker		}
387*333d2b36SAndroid Build Coastguard Worker
388*333d2b36SAndroid Build Coastguard Worker		android_system_image {
389*333d2b36SAndroid Build Coastguard Worker			name: "system",
390*333d2b36SAndroid Build Coastguard Worker			defaults: ["defaults"],
391*333d2b36SAndroid Build Coastguard Worker			multilib: {
392*333d2b36SAndroid Build Coastguard Worker				lib32: {
393*333d2b36SAndroid Build Coastguard Worker					deps: [
394*333d2b36SAndroid Build Coastguard Worker						"foo",
395*333d2b36SAndroid Build Coastguard Worker						"libbar",
396*333d2b36SAndroid Build Coastguard Worker					],
397*333d2b36SAndroid Build Coastguard Worker				},
398*333d2b36SAndroid Build Coastguard Worker			},
399*333d2b36SAndroid Build Coastguard Worker		}
400*333d2b36SAndroid Build Coastguard Worker
401*333d2b36SAndroid Build Coastguard Worker		cc_binary {
402*333d2b36SAndroid Build Coastguard Worker			name: "foo",
403*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "prefer32",
404*333d2b36SAndroid Build Coastguard Worker		}
405*333d2b36SAndroid Build Coastguard Worker
406*333d2b36SAndroid Build Coastguard Worker		cc_library {
407*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
408*333d2b36SAndroid Build Coastguard Worker			required: ["libbaz"],
409*333d2b36SAndroid Build Coastguard Worker		}
410*333d2b36SAndroid Build Coastguard Worker
411*333d2b36SAndroid Build Coastguard Worker		cc_library {
412*333d2b36SAndroid Build Coastguard Worker			name: "libbaz",
413*333d2b36SAndroid Build Coastguard Worker		}
414*333d2b36SAndroid Build Coastguard Worker
415*333d2b36SAndroid Build Coastguard Worker		phony {
416*333d2b36SAndroid Build Coastguard Worker			name: "phony",
417*333d2b36SAndroid Build Coastguard Worker			required: ["libquz"],
418*333d2b36SAndroid Build Coastguard Worker		}
419*333d2b36SAndroid Build Coastguard Worker
420*333d2b36SAndroid Build Coastguard Worker		cc_library {
421*333d2b36SAndroid Build Coastguard Worker			name: "libquz",
422*333d2b36SAndroid Build Coastguard Worker		}
423*333d2b36SAndroid Build Coastguard Worker	`)
424*333d2b36SAndroid Build Coastguard Worker
425*333d2b36SAndroid Build Coastguard Worker	fs := result.ModuleForTests("system", "android_common").Module().(*systemImage)
426*333d2b36SAndroid Build Coastguard Worker	expected := []string{
427*333d2b36SAndroid Build Coastguard Worker		"bin/foo",
428*333d2b36SAndroid Build Coastguard Worker		"lib/libbar.so",
429*333d2b36SAndroid Build Coastguard Worker		"lib64/libbar.so",
430*333d2b36SAndroid Build Coastguard Worker		"lib64/libbaz.so",
431*333d2b36SAndroid Build Coastguard Worker		"lib64/libquz.so",
432*333d2b36SAndroid Build Coastguard Worker	}
433*333d2b36SAndroid Build Coastguard Worker	for _, e := range expected {
434*333d2b36SAndroid Build Coastguard Worker		android.AssertStringListContains(t, "missing entry", fs.entries, e)
435*333d2b36SAndroid Build Coastguard Worker	}
436*333d2b36SAndroid Build Coastguard Worker}
437*333d2b36SAndroid Build Coastguard Worker
438*333d2b36SAndroid Build Coastguard Workerfunc TestInconsistentPartitionTypesInDefaults(t *testing.T) {
439*333d2b36SAndroid Build Coastguard Worker	fixture.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(
440*333d2b36SAndroid Build Coastguard Worker		"doesn't match with the partition type")).
441*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, `
442*333d2b36SAndroid Build Coastguard Worker		android_filesystem_defaults {
443*333d2b36SAndroid Build Coastguard Worker			name: "system_ext_def",
444*333d2b36SAndroid Build Coastguard Worker			partition_type: "system_ext",
445*333d2b36SAndroid Build Coastguard Worker		}
446*333d2b36SAndroid Build Coastguard Worker
447*333d2b36SAndroid Build Coastguard Worker		android_filesystem_defaults {
448*333d2b36SAndroid Build Coastguard Worker			name: "system_def",
449*333d2b36SAndroid Build Coastguard Worker			partition_type: "system",
450*333d2b36SAndroid Build Coastguard Worker			defaults: ["system_ext_def"],
451*333d2b36SAndroid Build Coastguard Worker		}
452*333d2b36SAndroid Build Coastguard Worker
453*333d2b36SAndroid Build Coastguard Worker		android_system_image {
454*333d2b36SAndroid Build Coastguard Worker			name: "system",
455*333d2b36SAndroid Build Coastguard Worker			defaults: ["system_def"],
456*333d2b36SAndroid Build Coastguard Worker		}
457*333d2b36SAndroid Build Coastguard Worker	`)
458*333d2b36SAndroid Build Coastguard Worker}
459*333d2b36SAndroid Build Coastguard Worker
460*333d2b36SAndroid Build Coastguard Workerfunc TestPreventDuplicatedEntries(t *testing.T) {
461*333d2b36SAndroid Build Coastguard Worker	fixture.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(
462*333d2b36SAndroid Build Coastguard Worker		"packaging conflict at")).
463*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, `
464*333d2b36SAndroid Build Coastguard Worker		android_filesystem {
465*333d2b36SAndroid Build Coastguard Worker			name: "fs",
466*333d2b36SAndroid Build Coastguard Worker			deps: [
467*333d2b36SAndroid Build Coastguard Worker				"foo",
468*333d2b36SAndroid Build Coastguard Worker				"foo_dup",
469*333d2b36SAndroid Build Coastguard Worker			],
470*333d2b36SAndroid Build Coastguard Worker		}
471*333d2b36SAndroid Build Coastguard Worker
472*333d2b36SAndroid Build Coastguard Worker		cc_binary {
473*333d2b36SAndroid Build Coastguard Worker			name: "foo",
474*333d2b36SAndroid Build Coastguard Worker		}
475*333d2b36SAndroid Build Coastguard Worker
476*333d2b36SAndroid Build Coastguard Worker		cc_binary {
477*333d2b36SAndroid Build Coastguard Worker			name: "foo_dup",
478*333d2b36SAndroid Build Coastguard Worker			stem: "foo",
479*333d2b36SAndroid Build Coastguard Worker		}
480*333d2b36SAndroid Build Coastguard Worker	`)
481*333d2b36SAndroid Build Coastguard Worker}
482*333d2b36SAndroid Build Coastguard Worker
483*333d2b36SAndroid Build Coastguard Workerfunc TestTrackPhonyAsRequiredDep(t *testing.T) {
484*333d2b36SAndroid Build Coastguard Worker	result := fixture.RunTestWithBp(t, `
485*333d2b36SAndroid Build Coastguard Worker		android_filesystem {
486*333d2b36SAndroid Build Coastguard Worker			name: "fs",
487*333d2b36SAndroid Build Coastguard Worker			deps: ["foo"],
488*333d2b36SAndroid Build Coastguard Worker		}
489*333d2b36SAndroid Build Coastguard Worker
490*333d2b36SAndroid Build Coastguard Worker		cc_binary {
491*333d2b36SAndroid Build Coastguard Worker			name: "foo",
492*333d2b36SAndroid Build Coastguard Worker			required: ["phony"],
493*333d2b36SAndroid Build Coastguard Worker		}
494*333d2b36SAndroid Build Coastguard Worker
495*333d2b36SAndroid Build Coastguard Worker		phony {
496*333d2b36SAndroid Build Coastguard Worker			name: "phony",
497*333d2b36SAndroid Build Coastguard Worker			required: ["libbar"],
498*333d2b36SAndroid Build Coastguard Worker		}
499*333d2b36SAndroid Build Coastguard Worker
500*333d2b36SAndroid Build Coastguard Worker		cc_library {
501*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
502*333d2b36SAndroid Build Coastguard Worker		}
503*333d2b36SAndroid Build Coastguard Worker	`)
504*333d2b36SAndroid Build Coastguard Worker
505*333d2b36SAndroid Build Coastguard Worker	fs := result.ModuleForTests("fs", "android_common").Module().(*filesystem)
506*333d2b36SAndroid Build Coastguard Worker	expected := []string{
507*333d2b36SAndroid Build Coastguard Worker		"bin/foo",
508*333d2b36SAndroid Build Coastguard Worker		"lib64/libbar.so",
509*333d2b36SAndroid Build Coastguard Worker	}
510*333d2b36SAndroid Build Coastguard Worker	for _, e := range expected {
511*333d2b36SAndroid Build Coastguard Worker		android.AssertStringListContains(t, "missing entry", fs.entries, e)
512*333d2b36SAndroid Build Coastguard Worker	}
513*333d2b36SAndroid Build Coastguard Worker}
514*333d2b36SAndroid Build Coastguard Worker
515*333d2b36SAndroid Build Coastguard Workerfunc TestFilterOutUnsupportedArches(t *testing.T) {
516*333d2b36SAndroid Build Coastguard Worker	result := fixture.RunTestWithBp(t, `
517*333d2b36SAndroid Build Coastguard Worker		android_filesystem {
518*333d2b36SAndroid Build Coastguard Worker			name: "fs_64_only",
519*333d2b36SAndroid Build Coastguard Worker			deps: ["foo"],
520*333d2b36SAndroid Build Coastguard Worker		}
521*333d2b36SAndroid Build Coastguard Worker
522*333d2b36SAndroid Build Coastguard Worker		android_filesystem {
523*333d2b36SAndroid Build Coastguard Worker			name: "fs_64_32",
524*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "both",
525*333d2b36SAndroid Build Coastguard Worker			deps: ["foo"],
526*333d2b36SAndroid Build Coastguard Worker		}
527*333d2b36SAndroid Build Coastguard Worker
528*333d2b36SAndroid Build Coastguard Worker		cc_binary {
529*333d2b36SAndroid Build Coastguard Worker			name: "foo",
530*333d2b36SAndroid Build Coastguard Worker			required: ["phony"],
531*333d2b36SAndroid Build Coastguard Worker		}
532*333d2b36SAndroid Build Coastguard Worker
533*333d2b36SAndroid Build Coastguard Worker		phony {
534*333d2b36SAndroid Build Coastguard Worker			name: "phony",
535*333d2b36SAndroid Build Coastguard Worker			required: [
536*333d2b36SAndroid Build Coastguard Worker				"libbar",
537*333d2b36SAndroid Build Coastguard Worker				"app",
538*333d2b36SAndroid Build Coastguard Worker			],
539*333d2b36SAndroid Build Coastguard Worker		}
540*333d2b36SAndroid Build Coastguard Worker
541*333d2b36SAndroid Build Coastguard Worker		cc_library {
542*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
543*333d2b36SAndroid Build Coastguard Worker		}
544*333d2b36SAndroid Build Coastguard Worker
545*333d2b36SAndroid Build Coastguard Worker		android_app {
546*333d2b36SAndroid Build Coastguard Worker			name: "app",
547*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
548*333d2b36SAndroid Build Coastguard Worker			platform_apis: true,
549*333d2b36SAndroid Build Coastguard Worker		}
550*333d2b36SAndroid Build Coastguard Worker	`)
551*333d2b36SAndroid Build Coastguard Worker	testcases := []struct {
552*333d2b36SAndroid Build Coastguard Worker		fsName     string
553*333d2b36SAndroid Build Coastguard Worker		expected   []string
554*333d2b36SAndroid Build Coastguard Worker		unexpected []string
555*333d2b36SAndroid Build Coastguard Worker	}{
556*333d2b36SAndroid Build Coastguard Worker		{
557*333d2b36SAndroid Build Coastguard Worker			fsName:     "fs_64_only",
558*333d2b36SAndroid Build Coastguard Worker			expected:   []string{"app/app/app.apk", "bin/foo", "lib64/libbar.so"},
559*333d2b36SAndroid Build Coastguard Worker			unexpected: []string{"lib/libbar.so"},
560*333d2b36SAndroid Build Coastguard Worker		},
561*333d2b36SAndroid Build Coastguard Worker		{
562*333d2b36SAndroid Build Coastguard Worker			fsName:     "fs_64_32",
563*333d2b36SAndroid Build Coastguard Worker			expected:   []string{"app/app/app.apk", "bin/foo", "lib64/libbar.so", "lib/libbar.so"},
564*333d2b36SAndroid Build Coastguard Worker			unexpected: []string{},
565*333d2b36SAndroid Build Coastguard Worker		},
566*333d2b36SAndroid Build Coastguard Worker	}
567*333d2b36SAndroid Build Coastguard Worker	for _, c := range testcases {
568*333d2b36SAndroid Build Coastguard Worker		fs := result.ModuleForTests(c.fsName, "android_common").Module().(*filesystem)
569*333d2b36SAndroid Build Coastguard Worker		for _, e := range c.expected {
570*333d2b36SAndroid Build Coastguard Worker			android.AssertStringListContains(t, "missing entry", fs.entries, e)
571*333d2b36SAndroid Build Coastguard Worker		}
572*333d2b36SAndroid Build Coastguard Worker		for _, e := range c.unexpected {
573*333d2b36SAndroid Build Coastguard Worker			android.AssertStringListDoesNotContain(t, "unexpected entry", fs.entries, e)
574*333d2b36SAndroid Build Coastguard Worker		}
575*333d2b36SAndroid Build Coastguard Worker	}
576*333d2b36SAndroid Build Coastguard Worker}
577*333d2b36SAndroid Build Coastguard Worker
578*333d2b36SAndroid Build Coastguard Workerfunc TestErofsPartition(t *testing.T) {
579*333d2b36SAndroid Build Coastguard Worker	result := fixture.RunTestWithBp(t, `
580*333d2b36SAndroid Build Coastguard Worker		android_filesystem {
581*333d2b36SAndroid Build Coastguard Worker			name: "erofs_partition",
582*333d2b36SAndroid Build Coastguard Worker			type: "erofs",
583*333d2b36SAndroid Build Coastguard Worker			erofs: {
584*333d2b36SAndroid Build Coastguard Worker				compressor: "lz4hc,9",
585*333d2b36SAndroid Build Coastguard Worker				compress_hints: "compress_hints.txt",
586*333d2b36SAndroid Build Coastguard Worker			},
587*333d2b36SAndroid Build Coastguard Worker			deps: ["binfoo"],
588*333d2b36SAndroid Build Coastguard Worker		}
589*333d2b36SAndroid Build Coastguard Worker
590*333d2b36SAndroid Build Coastguard Worker		cc_binary {
591*333d2b36SAndroid Build Coastguard Worker			name: "binfoo",
592*333d2b36SAndroid Build Coastguard Worker		}
593*333d2b36SAndroid Build Coastguard Worker	`)
594*333d2b36SAndroid Build Coastguard Worker
595*333d2b36SAndroid Build Coastguard Worker	partition := result.ModuleForTests("erofs_partition", "android_common")
596*333d2b36SAndroid Build Coastguard Worker	buildImageConfig := android.ContentFromFileRuleForTests(t, result.TestContext, partition.Output("prop_pre_processing"))
597*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "erofs fs type", buildImageConfig, "fs_type=erofs")
598*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "erofs fs type compress algorithm", buildImageConfig, "erofs_default_compressor=lz4hc,9")
599*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "erofs fs type compress hint", buildImageConfig, "erofs_default_compress_hints=compress_hints.txt")
600*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "erofs fs type sparse", buildImageConfig, "erofs_sparse_flag=-s")
601*333d2b36SAndroid Build Coastguard Worker}
602*333d2b36SAndroid Build Coastguard Worker
603*333d2b36SAndroid Build Coastguard Workerfunc TestF2fsPartition(t *testing.T) {
604*333d2b36SAndroid Build Coastguard Worker	result := fixture.RunTestWithBp(t, `
605*333d2b36SAndroid Build Coastguard Worker		android_filesystem {
606*333d2b36SAndroid Build Coastguard Worker			name: "f2fs_partition",
607*333d2b36SAndroid Build Coastguard Worker			type: "f2fs",
608*333d2b36SAndroid Build Coastguard Worker		}
609*333d2b36SAndroid Build Coastguard Worker	`)
610*333d2b36SAndroid Build Coastguard Worker
611*333d2b36SAndroid Build Coastguard Worker	partition := result.ModuleForTests("f2fs_partition", "android_common")
612*333d2b36SAndroid Build Coastguard Worker	buildImageConfig := android.ContentFromFileRuleForTests(t, result.TestContext, partition.Output("prop_pre_processing"))
613*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "f2fs fs type", buildImageConfig, "fs_type=f2fs")
614*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "f2fs fs type sparse", buildImageConfig, "f2fs_sparse_flag=-S")
615*333d2b36SAndroid Build Coastguard Worker}
616*333d2b36SAndroid Build Coastguard Worker
617*333d2b36SAndroid Build Coastguard Workerfunc TestFsTypesPropertyError(t *testing.T) {
618*333d2b36SAndroid Build Coastguard Worker	fixture.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(
619*333d2b36SAndroid Build Coastguard Worker		"erofs: erofs is non-empty, but FS type is f2fs\n. Please delete erofs properties if this partition should use f2fs\n")).
620*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, `
621*333d2b36SAndroid Build Coastguard Worker		android_filesystem {
622*333d2b36SAndroid Build Coastguard Worker			name: "f2fs_partition",
623*333d2b36SAndroid Build Coastguard Worker			type: "f2fs",
624*333d2b36SAndroid Build Coastguard Worker			erofs: {
625*333d2b36SAndroid Build Coastguard Worker				compressor: "lz4hc,9",
626*333d2b36SAndroid Build Coastguard Worker				compress_hints: "compress_hints.txt",
627*333d2b36SAndroid Build Coastguard Worker			},
628*333d2b36SAndroid Build Coastguard Worker		}
629*333d2b36SAndroid Build Coastguard Worker	`)
630*333d2b36SAndroid Build Coastguard Worker}
631*333d2b36SAndroid Build Coastguard Worker
632*333d2b36SAndroid Build Coastguard Worker// If a system_ext/ module depends on system/ module, the dependency should *not*
633*333d2b36SAndroid Build Coastguard Worker// be installed in system_ext/
634*333d2b36SAndroid Build Coastguard Workerfunc TestDoNotPackageCrossPartitionDependencies(t *testing.T) {
635*333d2b36SAndroid Build Coastguard Worker	t.Skip() // TODO (spandandas): Re-enable this
636*333d2b36SAndroid Build Coastguard Worker	result := fixture.RunTestWithBp(t, `
637*333d2b36SAndroid Build Coastguard Worker		android_filesystem {
638*333d2b36SAndroid Build Coastguard Worker			name: "myfilesystem",
639*333d2b36SAndroid Build Coastguard Worker			deps: ["binfoo"],
640*333d2b36SAndroid Build Coastguard Worker			partition_type: "system_ext",
641*333d2b36SAndroid Build Coastguard Worker		}
642*333d2b36SAndroid Build Coastguard Worker
643*333d2b36SAndroid Build Coastguard Worker		cc_binary {
644*333d2b36SAndroid Build Coastguard Worker			name: "binfoo",
645*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libfoo"],
646*333d2b36SAndroid Build Coastguard Worker			system_ext_specific: true,
647*333d2b36SAndroid Build Coastguard Worker		}
648*333d2b36SAndroid Build Coastguard Worker		cc_library_shared {
649*333d2b36SAndroid Build Coastguard Worker			name: "libfoo", // installed in system/
650*333d2b36SAndroid Build Coastguard Worker		}
651*333d2b36SAndroid Build Coastguard Worker	`)
652*333d2b36SAndroid Build Coastguard Worker
653*333d2b36SAndroid Build Coastguard Worker	partition := result.ModuleForTests("myfilesystem", "android_common")
654*333d2b36SAndroid Build Coastguard Worker	fileList := android.ContentFromFileRuleForTests(t, result.TestContext, partition.Output("fileList"))
655*333d2b36SAndroid Build Coastguard Worker	android.AssertDeepEquals(t, "filesystem with dependencies on different partition", "bin/binfoo\n", fileList)
656*333d2b36SAndroid Build Coastguard Worker}
657*333d2b36SAndroid Build Coastguard Worker
658*333d2b36SAndroid Build Coastguard Worker// If a cc_library is listed in `deps`, and it has a shared and static variant, then the shared variant
659*333d2b36SAndroid Build Coastguard Worker// should be installed.
660*333d2b36SAndroid Build Coastguard Workerfunc TestUseSharedVariationOfNativeLib(t *testing.T) {
661*333d2b36SAndroid Build Coastguard Worker	result := fixture.RunTestWithBp(t, `
662*333d2b36SAndroid Build Coastguard Worker		android_filesystem {
663*333d2b36SAndroid Build Coastguard Worker			name: "myfilesystem",
664*333d2b36SAndroid Build Coastguard Worker			deps: ["libfoo"],
665*333d2b36SAndroid Build Coastguard Worker		}
666*333d2b36SAndroid Build Coastguard Worker		// cc_library will create a static and shared variant.
667*333d2b36SAndroid Build Coastguard Worker		cc_library {
668*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
669*333d2b36SAndroid Build Coastguard Worker		}
670*333d2b36SAndroid Build Coastguard Worker	`)
671*333d2b36SAndroid Build Coastguard Worker
672*333d2b36SAndroid Build Coastguard Worker	partition := result.ModuleForTests("myfilesystem", "android_common")
673*333d2b36SAndroid Build Coastguard Worker	fileList := android.ContentFromFileRuleForTests(t, result.TestContext, partition.Output("fileList"))
674*333d2b36SAndroid Build Coastguard Worker	android.AssertDeepEquals(t, "cc_library listed in deps",
675*333d2b36SAndroid Build Coastguard Worker		"lib64/bootstrap/libc.so\nlib64/bootstrap/libdl.so\nlib64/bootstrap/libm.so\nlib64/libc++.so\nlib64/libc.so\nlib64/libdl.so\nlib64/libfoo.so\nlib64/libm.so\n",
676*333d2b36SAndroid Build Coastguard Worker		fileList)
677*333d2b36SAndroid Build Coastguard Worker}
678*333d2b36SAndroid Build Coastguard Worker
679*333d2b36SAndroid Build Coastguard Worker// binfoo1 overrides binbar. transitive deps of binbar should not be installed.
680*333d2b36SAndroid Build Coastguard Workerfunc TestDoNotInstallTransitiveDepOfOverriddenModule(t *testing.T) {
681*333d2b36SAndroid Build Coastguard Worker	result := fixture.RunTestWithBp(t, `
682*333d2b36SAndroid Build Coastguard Workerandroid_filesystem {
683*333d2b36SAndroid Build Coastguard Worker    name: "myfilesystem",
684*333d2b36SAndroid Build Coastguard Worker    deps: ["binfoo1", "libfoo2", "binbar"],
685*333d2b36SAndroid Build Coastguard Worker}
686*333d2b36SAndroid Build Coastguard Workercc_binary {
687*333d2b36SAndroid Build Coastguard Worker    name: "binfoo1",
688*333d2b36SAndroid Build Coastguard Worker    shared_libs: ["libfoo"],
689*333d2b36SAndroid Build Coastguard Worker    overrides: ["binbar"],
690*333d2b36SAndroid Build Coastguard Worker}
691*333d2b36SAndroid Build Coastguard Workercc_library {
692*333d2b36SAndroid Build Coastguard Worker    name: "libfoo",
693*333d2b36SAndroid Build Coastguard Worker}
694*333d2b36SAndroid Build Coastguard Workercc_library {
695*333d2b36SAndroid Build Coastguard Worker    name: "libfoo2",
696*333d2b36SAndroid Build Coastguard Worker    overrides: ["libfoo"],
697*333d2b36SAndroid Build Coastguard Worker}
698*333d2b36SAndroid Build Coastguard Worker// binbar gets overridden by binfoo1
699*333d2b36SAndroid Build Coastguard Worker// therefore, libbar should not be installed
700*333d2b36SAndroid Build Coastguard Workercc_binary {
701*333d2b36SAndroid Build Coastguard Worker    name: "binbar",
702*333d2b36SAndroid Build Coastguard Worker    shared_libs: ["libbar"]
703*333d2b36SAndroid Build Coastguard Worker}
704*333d2b36SAndroid Build Coastguard Workercc_library {
705*333d2b36SAndroid Build Coastguard Worker    name: "libbar",
706*333d2b36SAndroid Build Coastguard Worker}
707*333d2b36SAndroid Build Coastguard Worker	`)
708*333d2b36SAndroid Build Coastguard Worker
709*333d2b36SAndroid Build Coastguard Worker	partition := result.ModuleForTests("myfilesystem", "android_common")
710*333d2b36SAndroid Build Coastguard Worker	fileList := android.ContentFromFileRuleForTests(t, result.TestContext, partition.Output("fileList"))
711*333d2b36SAndroid Build Coastguard Worker	android.AssertDeepEquals(t, "Shared library dep of overridden binary should not be installed",
712*333d2b36SAndroid Build Coastguard Worker		"bin/binfoo1\nlib64/bootstrap/libc.so\nlib64/bootstrap/libdl.so\nlib64/bootstrap/libm.so\nlib64/libc++.so\nlib64/libc.so\nlib64/libdl.so\nlib64/libfoo2.so\nlib64/libm.so\n",
713*333d2b36SAndroid Build Coastguard Worker		fileList)
714*333d2b36SAndroid Build Coastguard Worker}
715*333d2b36SAndroid Build Coastguard Worker
716*333d2b36SAndroid Build Coastguard Workerfunc TestInstallLinkerConfigFile(t *testing.T) {
717*333d2b36SAndroid Build Coastguard Worker	result := fixture.RunTestWithBp(t, `
718*333d2b36SAndroid Build Coastguard Workerandroid_filesystem {
719*333d2b36SAndroid Build Coastguard Worker    name: "myfilesystem",
720*333d2b36SAndroid Build Coastguard Worker    deps: ["libfoo_has_no_stubs", "libfoo_has_stubs"],
721*333d2b36SAndroid Build Coastguard Worker    linker_config: {
722*333d2b36SAndroid Build Coastguard Worker        gen_linker_config: true,
723*333d2b36SAndroid Build Coastguard Worker        linker_config_srcs: ["linker.config.json"],
724*333d2b36SAndroid Build Coastguard Worker    },
725*333d2b36SAndroid Build Coastguard Worker    partition_type: "vendor",
726*333d2b36SAndroid Build Coastguard Worker}
727*333d2b36SAndroid Build Coastguard Workercc_library {
728*333d2b36SAndroid Build Coastguard Worker    name: "libfoo_has_no_stubs",
729*333d2b36SAndroid Build Coastguard Worker    vendor: true,
730*333d2b36SAndroid Build Coastguard Worker}
731*333d2b36SAndroid Build Coastguard Workercc_library {
732*333d2b36SAndroid Build Coastguard Worker    name: "libfoo_has_stubs",
733*333d2b36SAndroid Build Coastguard Worker    stubs: {symbol_file: "libfoo.map.txt"},
734*333d2b36SAndroid Build Coastguard Worker    vendor: true,
735*333d2b36SAndroid Build Coastguard Worker}
736*333d2b36SAndroid Build Coastguard Worker	`)
737*333d2b36SAndroid Build Coastguard Worker
738*333d2b36SAndroid Build Coastguard Worker	linkerConfigCmd := result.ModuleForTests("myfilesystem", "android_common").Rule("build_filesystem_image").RuleParams.Command
739*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "Could not find linker.config.json file in cmd", linkerConfigCmd, "conv_linker_config proto --force -s linker.config.json")
740*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "Could not find stub in `provideLibs`", linkerConfigCmd, "--key provideLibs --value libfoo_has_stubs.so")
741*333d2b36SAndroid Build Coastguard Worker}
742*333d2b36SAndroid Build Coastguard Worker
743*333d2b36SAndroid Build Coastguard Worker// override_android_* modules implicitly override their base module.
744*333d2b36SAndroid Build Coastguard Worker// If both of these are listed in `deps`, the base module should not be installed.
745*333d2b36SAndroid Build Coastguard Workerfunc TestOverrideModulesInDeps(t *testing.T) {
746*333d2b36SAndroid Build Coastguard Worker	result := fixture.RunTestWithBp(t, `
747*333d2b36SAndroid Build Coastguard Worker		android_filesystem {
748*333d2b36SAndroid Build Coastguard Worker			name: "myfilesystem",
749*333d2b36SAndroid Build Coastguard Worker			deps: ["myapp", "myoverrideapp"],
750*333d2b36SAndroid Build Coastguard Worker		}
751*333d2b36SAndroid Build Coastguard Worker
752*333d2b36SAndroid Build Coastguard Worker		android_app {
753*333d2b36SAndroid Build Coastguard Worker			name: "myapp",
754*333d2b36SAndroid Build Coastguard Worker			platform_apis: true,
755*333d2b36SAndroid Build Coastguard Worker		}
756*333d2b36SAndroid Build Coastguard Worker		override_android_app {
757*333d2b36SAndroid Build Coastguard Worker			name: "myoverrideapp",
758*333d2b36SAndroid Build Coastguard Worker			base: "myapp",
759*333d2b36SAndroid Build Coastguard Worker		}
760*333d2b36SAndroid Build Coastguard Worker	`)
761*333d2b36SAndroid Build Coastguard Worker
762*333d2b36SAndroid Build Coastguard Worker	partition := result.ModuleForTests("myfilesystem", "android_common")
763*333d2b36SAndroid Build Coastguard Worker	fileList := android.ContentFromFileRuleForTests(t, result.TestContext, partition.Output("fileList"))
764*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "filesystem with override app", "app/myoverrideapp/myoverrideapp.apk\n", fileList)
765*333d2b36SAndroid Build Coastguard Worker}
766*333d2b36SAndroid Build Coastguard Worker
767*333d2b36SAndroid Build Coastguard Workerfunc TestRamdiskPartitionSetsDevNodes(t *testing.T) {
768*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
769*333d2b36SAndroid Build Coastguard Worker		fixture,
770*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(android.MockFS{
771*333d2b36SAndroid Build Coastguard Worker			"ramdisk_node_list": nil,
772*333d2b36SAndroid Build Coastguard Worker		}),
773*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
774*333d2b36SAndroid Build Coastguard Worker		android_filesystem {
775*333d2b36SAndroid Build Coastguard Worker			name: "ramdisk_filesystem",
776*333d2b36SAndroid Build Coastguard Worker			partition_name: "ramdisk",
777*333d2b36SAndroid Build Coastguard Worker		}
778*333d2b36SAndroid Build Coastguard Worker		filegroup {
779*333d2b36SAndroid Build Coastguard Worker			name: "ramdisk_node_list",
780*333d2b36SAndroid Build Coastguard Worker			srcs: ["ramdisk_node_list"],
781*333d2b36SAndroid Build Coastguard Worker		}
782*333d2b36SAndroid Build Coastguard Worker	`)
783*333d2b36SAndroid Build Coastguard Worker
784*333d2b36SAndroid Build Coastguard Worker	android.AssertBoolEquals(
785*333d2b36SAndroid Build Coastguard Worker		t,
786*333d2b36SAndroid Build Coastguard Worker		"Generated ramdisk image expected to depend on \"ramdisk_node_list\" module",
787*333d2b36SAndroid Build Coastguard Worker		true,
788*333d2b36SAndroid Build Coastguard Worker		java.CheckModuleHasDependency(t, result.TestContext, "ramdisk_filesystem", "android_common", "ramdisk_node_list"),
789*333d2b36SAndroid Build Coastguard Worker	)
790*333d2b36SAndroid Build Coastguard Worker}
791