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