1*333d2b36SAndroid Build Coastguard Worker// Copyright 2017 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 cc 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "fmt" 19*333d2b36SAndroid Build Coastguard Worker "os" 20*333d2b36SAndroid Build Coastguard Worker "reflect" 21*333d2b36SAndroid Build Coastguard Worker "regexp" 22*333d2b36SAndroid Build Coastguard Worker "runtime" 23*333d2b36SAndroid Build Coastguard Worker "slices" 24*333d2b36SAndroid Build Coastguard Worker "strings" 25*333d2b36SAndroid Build Coastguard Worker "testing" 26*333d2b36SAndroid Build Coastguard Worker 27*333d2b36SAndroid Build Coastguard Worker "android/soong/aidl_library" 28*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 29*333d2b36SAndroid Build Coastguard Worker 30*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 31*333d2b36SAndroid Build Coastguard Worker) 32*333d2b36SAndroid Build Coastguard Worker 33*333d2b36SAndroid Build Coastguard Workerfunc init() { 34*333d2b36SAndroid Build Coastguard Worker registerTestMutators(android.InitRegistrationContext) 35*333d2b36SAndroid Build Coastguard Worker} 36*333d2b36SAndroid Build Coastguard Worker 37*333d2b36SAndroid Build Coastguard Workerfunc TestMain(m *testing.M) { 38*333d2b36SAndroid Build Coastguard Worker os.Exit(m.Run()) 39*333d2b36SAndroid Build Coastguard Worker} 40*333d2b36SAndroid Build Coastguard Worker 41*333d2b36SAndroid Build Coastguard Workervar prepareForCcTest = android.GroupFixturePreparers( 42*333d2b36SAndroid Build Coastguard Worker PrepareForIntegrationTestWithCc, 43*333d2b36SAndroid Build Coastguard Worker) 44*333d2b36SAndroid Build Coastguard Worker 45*333d2b36SAndroid Build Coastguard Workervar apexVariationName = "apex28" 46*333d2b36SAndroid Build Coastguard Workervar apexVersion = "28" 47*333d2b36SAndroid Build Coastguard Worker 48*333d2b36SAndroid Build Coastguard Workerfunc registerTestMutators(ctx android.RegistrationContext) { 49*333d2b36SAndroid Build Coastguard Worker ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) { 50*333d2b36SAndroid Build Coastguard Worker ctx.Transition("apex", &testApexTransitionMutator{}) 51*333d2b36SAndroid Build Coastguard Worker }) 52*333d2b36SAndroid Build Coastguard Worker} 53*333d2b36SAndroid Build Coastguard Worker 54*333d2b36SAndroid Build Coastguard Workertype testApexTransitionMutator struct{} 55*333d2b36SAndroid Build Coastguard Worker 56*333d2b36SAndroid Build Coastguard Workerfunc (t *testApexTransitionMutator) Split(ctx android.BaseModuleContext) []string { 57*333d2b36SAndroid Build Coastguard Worker return []string{apexVariationName} 58*333d2b36SAndroid Build Coastguard Worker} 59*333d2b36SAndroid Build Coastguard Worker 60*333d2b36SAndroid Build Coastguard Workerfunc (t *testApexTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string { 61*333d2b36SAndroid Build Coastguard Worker return sourceVariation 62*333d2b36SAndroid Build Coastguard Worker} 63*333d2b36SAndroid Build Coastguard Worker 64*333d2b36SAndroid Build Coastguard Workerfunc (t *testApexTransitionMutator) IncomingTransition(ctx android.IncomingTransitionContext, incomingVariation string) string { 65*333d2b36SAndroid Build Coastguard Worker return incomingVariation 66*333d2b36SAndroid Build Coastguard Worker} 67*333d2b36SAndroid Build Coastguard Worker 68*333d2b36SAndroid Build Coastguard Workerfunc (t *testApexTransitionMutator) Mutate(ctx android.BottomUpMutatorContext, variation string) { 69*333d2b36SAndroid Build Coastguard Worker apexInfo := android.ApexInfo{ 70*333d2b36SAndroid Build Coastguard Worker ApexVariationName: apexVariationName, 71*333d2b36SAndroid Build Coastguard Worker MinSdkVersion: android.ApiLevelForTest(apexVersion), 72*333d2b36SAndroid Build Coastguard Worker } 73*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, android.ApexInfoProvider, apexInfo) 74*333d2b36SAndroid Build Coastguard Worker} 75*333d2b36SAndroid Build Coastguard Worker 76*333d2b36SAndroid Build Coastguard Worker// testCcWithConfig runs tests using the prepareForCcTest 77*333d2b36SAndroid Build Coastguard Worker// 78*333d2b36SAndroid Build Coastguard Worker// See testCc for an explanation as to how to stop using this deprecated method. 79*333d2b36SAndroid Build Coastguard Worker// 80*333d2b36SAndroid Build Coastguard Worker// deprecated 81*333d2b36SAndroid Build Coastguard Workerfunc testCcWithConfig(t *testing.T, config android.Config) *android.TestContext { 82*333d2b36SAndroid Build Coastguard Worker t.Helper() 83*333d2b36SAndroid Build Coastguard Worker result := prepareForCcTest.RunTestWithConfig(t, config) 84*333d2b36SAndroid Build Coastguard Worker return result.TestContext 85*333d2b36SAndroid Build Coastguard Worker} 86*333d2b36SAndroid Build Coastguard Worker 87*333d2b36SAndroid Build Coastguard Worker// testCc runs tests using the prepareForCcTest 88*333d2b36SAndroid Build Coastguard Worker// 89*333d2b36SAndroid Build Coastguard Worker// Do not add any new usages of this, instead use the prepareForCcTest directly as it makes it much 90*333d2b36SAndroid Build Coastguard Worker// easier to customize the test behavior. 91*333d2b36SAndroid Build Coastguard Worker// 92*333d2b36SAndroid Build Coastguard Worker// If it is necessary to customize the behavior of an existing test that uses this then please first 93*333d2b36SAndroid Build Coastguard Worker// convert the test to using prepareForCcTest first and then in a following change add the 94*333d2b36SAndroid Build Coastguard Worker// appropriate fixture preparers. Keeping the conversion change separate makes it easy to verify 95*333d2b36SAndroid Build Coastguard Worker// that it did not change the test behavior unexpectedly. 96*333d2b36SAndroid Build Coastguard Worker// 97*333d2b36SAndroid Build Coastguard Worker// deprecated 98*333d2b36SAndroid Build Coastguard Workerfunc testCc(t *testing.T, bp string) *android.TestContext { 99*333d2b36SAndroid Build Coastguard Worker t.Helper() 100*333d2b36SAndroid Build Coastguard Worker result := prepareForCcTest.RunTestWithBp(t, bp) 101*333d2b36SAndroid Build Coastguard Worker return result.TestContext 102*333d2b36SAndroid Build Coastguard Worker} 103*333d2b36SAndroid Build Coastguard Worker 104*333d2b36SAndroid Build Coastguard Worker// testCcErrorWithConfig runs tests using the prepareForCcTest 105*333d2b36SAndroid Build Coastguard Worker// 106*333d2b36SAndroid Build Coastguard Worker// See testCc for an explanation as to how to stop using this deprecated method. 107*333d2b36SAndroid Build Coastguard Worker// 108*333d2b36SAndroid Build Coastguard Worker// deprecated 109*333d2b36SAndroid Build Coastguard Workerfunc testCcErrorWithConfig(t *testing.T, pattern string, config android.Config) { 110*333d2b36SAndroid Build Coastguard Worker t.Helper() 111*333d2b36SAndroid Build Coastguard Worker 112*333d2b36SAndroid Build Coastguard Worker prepareForCcTest. 113*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)). 114*333d2b36SAndroid Build Coastguard Worker RunTestWithConfig(t, config) 115*333d2b36SAndroid Build Coastguard Worker} 116*333d2b36SAndroid Build Coastguard Worker 117*333d2b36SAndroid Build Coastguard Worker// testCcError runs tests using the prepareForCcTest 118*333d2b36SAndroid Build Coastguard Worker// 119*333d2b36SAndroid Build Coastguard Worker// See testCc for an explanation as to how to stop using this deprecated method. 120*333d2b36SAndroid Build Coastguard Worker// 121*333d2b36SAndroid Build Coastguard Worker// deprecated 122*333d2b36SAndroid Build Coastguard Workerfunc testCcError(t *testing.T, pattern string, bp string) { 123*333d2b36SAndroid Build Coastguard Worker t.Helper() 124*333d2b36SAndroid Build Coastguard Worker config := TestConfig(t.TempDir(), android.Android, nil, bp, nil) 125*333d2b36SAndroid Build Coastguard Worker testCcErrorWithConfig(t, pattern, config) 126*333d2b36SAndroid Build Coastguard Worker return 127*333d2b36SAndroid Build Coastguard Worker} 128*333d2b36SAndroid Build Coastguard Worker 129*333d2b36SAndroid Build Coastguard Workerconst ( 130*333d2b36SAndroid Build Coastguard Worker coreVariant = "android_arm64_armv8-a_shared" 131*333d2b36SAndroid Build Coastguard Worker vendorVariant = "android_vendor_arm64_armv8-a_shared" 132*333d2b36SAndroid Build Coastguard Worker productVariant = "android_product_arm64_armv8-a_shared" 133*333d2b36SAndroid Build Coastguard Worker recoveryVariant = "android_recovery_arm64_armv8-a_shared" 134*333d2b36SAndroid Build Coastguard Worker) 135*333d2b36SAndroid Build Coastguard Worker 136*333d2b36SAndroid Build Coastguard Worker// Test that the PrepareForTestWithCcDefaultModules provides all the files that it uses by 137*333d2b36SAndroid Build Coastguard Worker// running it in a fixture that requires all source files to exist. 138*333d2b36SAndroid Build Coastguard Workerfunc TestPrepareForTestWithCcDefaultModules(t *testing.T) { 139*333d2b36SAndroid Build Coastguard Worker android.GroupFixturePreparers( 140*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithCcDefaultModules, 141*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestDisallowNonExistentPaths, 142*333d2b36SAndroid Build Coastguard Worker ).RunTest(t) 143*333d2b36SAndroid Build Coastguard Worker} 144*333d2b36SAndroid Build Coastguard Worker 145*333d2b36SAndroid Build Coastguard Workerfunc TestVendorSrc(t *testing.T) { 146*333d2b36SAndroid Build Coastguard Worker t.Parallel() 147*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, ` 148*333d2b36SAndroid Build Coastguard Worker cc_library { 149*333d2b36SAndroid Build Coastguard Worker name: "libTest", 150*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 151*333d2b36SAndroid Build Coastguard Worker no_libcrt: true, 152*333d2b36SAndroid Build Coastguard Worker nocrt: true, 153*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 154*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 155*333d2b36SAndroid Build Coastguard Worker target: { 156*333d2b36SAndroid Build Coastguard Worker vendor: { 157*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.c"], 158*333d2b36SAndroid Build Coastguard Worker }, 159*333d2b36SAndroid Build Coastguard Worker }, 160*333d2b36SAndroid Build Coastguard Worker } 161*333d2b36SAndroid Build Coastguard Worker `) 162*333d2b36SAndroid Build Coastguard Worker 163*333d2b36SAndroid Build Coastguard Worker ld := ctx.ModuleForTests("libTest", vendorVariant).Rule("ld") 164*333d2b36SAndroid Build Coastguard Worker var objs []string 165*333d2b36SAndroid Build Coastguard Worker for _, o := range ld.Inputs { 166*333d2b36SAndroid Build Coastguard Worker objs = append(objs, o.Base()) 167*333d2b36SAndroid Build Coastguard Worker } 168*333d2b36SAndroid Build Coastguard Worker if len(objs) != 2 || objs[0] != "foo.o" || objs[1] != "bar.o" { 169*333d2b36SAndroid Build Coastguard Worker t.Errorf("inputs of libTest must be []string{\"foo.o\", \"bar.o\"}, but was %#v.", objs) 170*333d2b36SAndroid Build Coastguard Worker } 171*333d2b36SAndroid Build Coastguard Worker} 172*333d2b36SAndroid Build Coastguard Worker 173*333d2b36SAndroid Build Coastguard Workerfunc checkInstallPartition(t *testing.T, ctx *android.TestContext, name, variant, expected string) { 174*333d2b36SAndroid Build Coastguard Worker mod := ctx.ModuleForTests(name, variant).Module().(*Module) 175*333d2b36SAndroid Build Coastguard Worker partitionDefined := false 176*333d2b36SAndroid Build Coastguard Worker checkPartition := func(specific bool, partition string) { 177*333d2b36SAndroid Build Coastguard Worker if specific { 178*333d2b36SAndroid Build Coastguard Worker if expected != partition && !partitionDefined { 179*333d2b36SAndroid Build Coastguard Worker // The variant is installed to the 'partition' 180*333d2b36SAndroid Build Coastguard Worker t.Errorf("%s variant of %q must not be installed to %s partition", variant, name, partition) 181*333d2b36SAndroid Build Coastguard Worker } 182*333d2b36SAndroid Build Coastguard Worker partitionDefined = true 183*333d2b36SAndroid Build Coastguard Worker } else { 184*333d2b36SAndroid Build Coastguard Worker // The variant is not installed to the 'partition' 185*333d2b36SAndroid Build Coastguard Worker if expected == partition { 186*333d2b36SAndroid Build Coastguard Worker t.Errorf("%s variant of %q must be installed to %s partition", variant, name, partition) 187*333d2b36SAndroid Build Coastguard Worker } 188*333d2b36SAndroid Build Coastguard Worker } 189*333d2b36SAndroid Build Coastguard Worker } 190*333d2b36SAndroid Build Coastguard Worker socSpecific := func(m *Module) bool { 191*333d2b36SAndroid Build Coastguard Worker return m.SocSpecific() || m.InstallInVendor() 192*333d2b36SAndroid Build Coastguard Worker } 193*333d2b36SAndroid Build Coastguard Worker deviceSpecific := func(m *Module) bool { 194*333d2b36SAndroid Build Coastguard Worker return m.DeviceSpecific() || m.InstallInOdm() 195*333d2b36SAndroid Build Coastguard Worker } 196*333d2b36SAndroid Build Coastguard Worker productSpecific := func(m *Module) bool { 197*333d2b36SAndroid Build Coastguard Worker return m.ProductSpecific() || m.InstallInProduct() 198*333d2b36SAndroid Build Coastguard Worker } 199*333d2b36SAndroid Build Coastguard Worker systemExtSpecific := func(m *Module) bool { 200*333d2b36SAndroid Build Coastguard Worker return m.SystemExtSpecific() 201*333d2b36SAndroid Build Coastguard Worker } 202*333d2b36SAndroid Build Coastguard Worker checkPartition(socSpecific(mod), "vendor") 203*333d2b36SAndroid Build Coastguard Worker checkPartition(deviceSpecific(mod), "odm") 204*333d2b36SAndroid Build Coastguard Worker checkPartition(productSpecific(mod), "product") 205*333d2b36SAndroid Build Coastguard Worker checkPartition(systemExtSpecific(mod), "system_ext") 206*333d2b36SAndroid Build Coastguard Worker if !partitionDefined && expected != "system" { 207*333d2b36SAndroid Build Coastguard Worker t.Errorf("%s variant of %q is expected to be installed to %s partition,"+ 208*333d2b36SAndroid Build Coastguard Worker " but installed to system partition", variant, name, expected) 209*333d2b36SAndroid Build Coastguard Worker } 210*333d2b36SAndroid Build Coastguard Worker} 211*333d2b36SAndroid Build Coastguard Worker 212*333d2b36SAndroid Build Coastguard Workerfunc TestInstallPartition(t *testing.T) { 213*333d2b36SAndroid Build Coastguard Worker t.Parallel() 214*333d2b36SAndroid Build Coastguard Worker t.Helper() 215*333d2b36SAndroid Build Coastguard Worker ctx := prepareForCcTest.RunTestWithBp(t, ` 216*333d2b36SAndroid Build Coastguard Worker cc_library { 217*333d2b36SAndroid Build Coastguard Worker name: "libsystem", 218*333d2b36SAndroid Build Coastguard Worker } 219*333d2b36SAndroid Build Coastguard Worker cc_library { 220*333d2b36SAndroid Build Coastguard Worker name: "libsystem_ext", 221*333d2b36SAndroid Build Coastguard Worker system_ext_specific: true, 222*333d2b36SAndroid Build Coastguard Worker } 223*333d2b36SAndroid Build Coastguard Worker cc_library { 224*333d2b36SAndroid Build Coastguard Worker name: "libproduct", 225*333d2b36SAndroid Build Coastguard Worker product_specific: true, 226*333d2b36SAndroid Build Coastguard Worker } 227*333d2b36SAndroid Build Coastguard Worker cc_library { 228*333d2b36SAndroid Build Coastguard Worker name: "libvendor", 229*333d2b36SAndroid Build Coastguard Worker vendor: true, 230*333d2b36SAndroid Build Coastguard Worker } 231*333d2b36SAndroid Build Coastguard Worker cc_library { 232*333d2b36SAndroid Build Coastguard Worker name: "libodm", 233*333d2b36SAndroid Build Coastguard Worker device_specific: true, 234*333d2b36SAndroid Build Coastguard Worker } 235*333d2b36SAndroid Build Coastguard Worker cc_library { 236*333d2b36SAndroid Build Coastguard Worker name: "liball_available", 237*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 238*333d2b36SAndroid Build Coastguard Worker product_available: true, 239*333d2b36SAndroid Build Coastguard Worker } 240*333d2b36SAndroid Build Coastguard Worker cc_library { 241*333d2b36SAndroid Build Coastguard Worker name: "libsystem_ext_all_available", 242*333d2b36SAndroid Build Coastguard Worker system_ext_specific: true, 243*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 244*333d2b36SAndroid Build Coastguard Worker product_available: true, 245*333d2b36SAndroid Build Coastguard Worker } 246*333d2b36SAndroid Build Coastguard Worker cc_library { 247*333d2b36SAndroid Build Coastguard Worker name: "liball_available_odm", 248*333d2b36SAndroid Build Coastguard Worker odm_available: true, 249*333d2b36SAndroid Build Coastguard Worker product_available: true, 250*333d2b36SAndroid Build Coastguard Worker } 251*333d2b36SAndroid Build Coastguard Worker cc_library { 252*333d2b36SAndroid Build Coastguard Worker name: "libproduct_vendoravailable", 253*333d2b36SAndroid Build Coastguard Worker product_specific: true, 254*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 255*333d2b36SAndroid Build Coastguard Worker } 256*333d2b36SAndroid Build Coastguard Worker cc_library { 257*333d2b36SAndroid Build Coastguard Worker name: "libproduct_odmavailable", 258*333d2b36SAndroid Build Coastguard Worker product_specific: true, 259*333d2b36SAndroid Build Coastguard Worker odm_available: true, 260*333d2b36SAndroid Build Coastguard Worker } 261*333d2b36SAndroid Build Coastguard Worker `).TestContext 262*333d2b36SAndroid Build Coastguard Worker 263*333d2b36SAndroid Build Coastguard Worker checkInstallPartition(t, ctx, "libsystem", coreVariant, "system") 264*333d2b36SAndroid Build Coastguard Worker checkInstallPartition(t, ctx, "libsystem_ext", coreVariant, "system_ext") 265*333d2b36SAndroid Build Coastguard Worker checkInstallPartition(t, ctx, "libproduct", productVariant, "product") 266*333d2b36SAndroid Build Coastguard Worker checkInstallPartition(t, ctx, "libvendor", vendorVariant, "vendor") 267*333d2b36SAndroid Build Coastguard Worker checkInstallPartition(t, ctx, "libodm", vendorVariant, "odm") 268*333d2b36SAndroid Build Coastguard Worker 269*333d2b36SAndroid Build Coastguard Worker checkInstallPartition(t, ctx, "liball_available", coreVariant, "system") 270*333d2b36SAndroid Build Coastguard Worker checkInstallPartition(t, ctx, "liball_available", productVariant, "product") 271*333d2b36SAndroid Build Coastguard Worker checkInstallPartition(t, ctx, "liball_available", vendorVariant, "vendor") 272*333d2b36SAndroid Build Coastguard Worker 273*333d2b36SAndroid Build Coastguard Worker checkInstallPartition(t, ctx, "libsystem_ext_all_available", coreVariant, "system_ext") 274*333d2b36SAndroid Build Coastguard Worker checkInstallPartition(t, ctx, "libsystem_ext_all_available", productVariant, "product") 275*333d2b36SAndroid Build Coastguard Worker checkInstallPartition(t, ctx, "libsystem_ext_all_available", vendorVariant, "vendor") 276*333d2b36SAndroid Build Coastguard Worker 277*333d2b36SAndroid Build Coastguard Worker checkInstallPartition(t, ctx, "liball_available_odm", coreVariant, "system") 278*333d2b36SAndroid Build Coastguard Worker checkInstallPartition(t, ctx, "liball_available_odm", productVariant, "product") 279*333d2b36SAndroid Build Coastguard Worker checkInstallPartition(t, ctx, "liball_available_odm", vendorVariant, "odm") 280*333d2b36SAndroid Build Coastguard Worker 281*333d2b36SAndroid Build Coastguard Worker checkInstallPartition(t, ctx, "libproduct_vendoravailable", productVariant, "product") 282*333d2b36SAndroid Build Coastguard Worker checkInstallPartition(t, ctx, "libproduct_vendoravailable", vendorVariant, "vendor") 283*333d2b36SAndroid Build Coastguard Worker 284*333d2b36SAndroid Build Coastguard Worker checkInstallPartition(t, ctx, "libproduct_odmavailable", productVariant, "product") 285*333d2b36SAndroid Build Coastguard Worker checkInstallPartition(t, ctx, "libproduct_odmavailable", vendorVariant, "odm") 286*333d2b36SAndroid Build Coastguard Worker} 287*333d2b36SAndroid Build Coastguard Worker 288*333d2b36SAndroid Build Coastguard Workerfunc checkWriteFileOutput(t *testing.T, ctx *android.TestContext, params android.TestingBuildParams, expected []string) { 289*333d2b36SAndroid Build Coastguard Worker t.Helper() 290*333d2b36SAndroid Build Coastguard Worker content := android.ContentFromFileRuleForTests(t, ctx, params) 291*333d2b36SAndroid Build Coastguard Worker actual := strings.FieldsFunc(content, func(r rune) bool { return r == '\n' }) 292*333d2b36SAndroid Build Coastguard Worker assertArrayString(t, actual, expected) 293*333d2b36SAndroid Build Coastguard Worker} 294*333d2b36SAndroid Build Coastguard Worker 295*333d2b36SAndroid Build Coastguard Workerfunc TestDataLibs(t *testing.T) { 296*333d2b36SAndroid Build Coastguard Worker t.Parallel() 297*333d2b36SAndroid Build Coastguard Worker bp := ` 298*333d2b36SAndroid Build Coastguard Worker cc_test_library { 299*333d2b36SAndroid Build Coastguard Worker name: "test_lib", 300*333d2b36SAndroid Build Coastguard Worker srcs: ["test_lib.cpp"], 301*333d2b36SAndroid Build Coastguard Worker gtest: false, 302*333d2b36SAndroid Build Coastguard Worker } 303*333d2b36SAndroid Build Coastguard Worker 304*333d2b36SAndroid Build Coastguard Worker cc_test { 305*333d2b36SAndroid Build Coastguard Worker name: "main_test", 306*333d2b36SAndroid Build Coastguard Worker data_libs: ["test_lib"], 307*333d2b36SAndroid Build Coastguard Worker gtest: false, 308*333d2b36SAndroid Build Coastguard Worker } 309*333d2b36SAndroid Build Coastguard Worker ` 310*333d2b36SAndroid Build Coastguard Worker 311*333d2b36SAndroid Build Coastguard Worker config := TestConfig(t.TempDir(), android.Android, nil, bp, nil) 312*333d2b36SAndroid Build Coastguard Worker 313*333d2b36SAndroid Build Coastguard Worker ctx := testCcWithConfig(t, config) 314*333d2b36SAndroid Build Coastguard Worker testingModule := ctx.ModuleForTests("main_test", "android_arm_armv7-a-neon") 315*333d2b36SAndroid Build Coastguard Worker testBinary := testingModule.Module().(*Module).linker.(*testBinary) 316*333d2b36SAndroid Build Coastguard Worker outputFiles := testingModule.OutputFiles(ctx, t, "") 317*333d2b36SAndroid Build Coastguard Worker if len(outputFiles) != 1 { 318*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected exactly one output file. output files: [%s]", outputFiles) 319*333d2b36SAndroid Build Coastguard Worker return 320*333d2b36SAndroid Build Coastguard Worker } 321*333d2b36SAndroid Build Coastguard Worker if len(testBinary.dataPaths()) != 1 { 322*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected exactly one test data file. test data files: [%v]", testBinary.dataPaths()) 323*333d2b36SAndroid Build Coastguard Worker return 324*333d2b36SAndroid Build Coastguard Worker } 325*333d2b36SAndroid Build Coastguard Worker 326*333d2b36SAndroid Build Coastguard Worker outputPath := outputFiles[0].String() 327*333d2b36SAndroid Build Coastguard Worker testBinaryPath := testBinary.dataPaths()[0].SrcPath.String() 328*333d2b36SAndroid Build Coastguard Worker 329*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(outputPath, "/main_test") { 330*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected test output file to be 'main_test', but was '%s'", outputPath) 331*333d2b36SAndroid Build Coastguard Worker return 332*333d2b36SAndroid Build Coastguard Worker } 333*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(testBinaryPath, "/test_lib.so") { 334*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected test data file to be 'test_lib.so', but was '%s'", testBinaryPath) 335*333d2b36SAndroid Build Coastguard Worker return 336*333d2b36SAndroid Build Coastguard Worker } 337*333d2b36SAndroid Build Coastguard Worker} 338*333d2b36SAndroid Build Coastguard Worker 339*333d2b36SAndroid Build Coastguard Workerfunc TestDataLibsRelativeInstallPath(t *testing.T) { 340*333d2b36SAndroid Build Coastguard Worker t.Parallel() 341*333d2b36SAndroid Build Coastguard Worker bp := ` 342*333d2b36SAndroid Build Coastguard Worker cc_test_library { 343*333d2b36SAndroid Build Coastguard Worker name: "test_lib", 344*333d2b36SAndroid Build Coastguard Worker srcs: ["test_lib.cpp"], 345*333d2b36SAndroid Build Coastguard Worker relative_install_path: "foo/bar/baz", 346*333d2b36SAndroid Build Coastguard Worker gtest: false, 347*333d2b36SAndroid Build Coastguard Worker } 348*333d2b36SAndroid Build Coastguard Worker 349*333d2b36SAndroid Build Coastguard Worker cc_binary { 350*333d2b36SAndroid Build Coastguard Worker name: "test_bin", 351*333d2b36SAndroid Build Coastguard Worker relative_install_path: "foo/bar/baz", 352*333d2b36SAndroid Build Coastguard Worker compile_multilib: "both", 353*333d2b36SAndroid Build Coastguard Worker } 354*333d2b36SAndroid Build Coastguard Worker 355*333d2b36SAndroid Build Coastguard Worker cc_test { 356*333d2b36SAndroid Build Coastguard Worker name: "main_test", 357*333d2b36SAndroid Build Coastguard Worker data_libs: ["test_lib"], 358*333d2b36SAndroid Build Coastguard Worker data_bins: ["test_bin"], 359*333d2b36SAndroid Build Coastguard Worker gtest: false, 360*333d2b36SAndroid Build Coastguard Worker } 361*333d2b36SAndroid Build Coastguard Worker ` 362*333d2b36SAndroid Build Coastguard Worker 363*333d2b36SAndroid Build Coastguard Worker config := TestConfig(t.TempDir(), android.Android, nil, bp, nil) 364*333d2b36SAndroid Build Coastguard Worker 365*333d2b36SAndroid Build Coastguard Worker ctx := testCcWithConfig(t, config) 366*333d2b36SAndroid Build Coastguard Worker testingModule := ctx.ModuleForTests("main_test", "android_arm_armv7-a-neon") 367*333d2b36SAndroid Build Coastguard Worker module := testingModule.Module() 368*333d2b36SAndroid Build Coastguard Worker testBinary := module.(*Module).linker.(*testBinary) 369*333d2b36SAndroid Build Coastguard Worker outputFiles := testingModule.OutputFiles(ctx, t, "") 370*333d2b36SAndroid Build Coastguard Worker if len(outputFiles) != 1 { 371*333d2b36SAndroid Build Coastguard Worker t.Fatalf("expected exactly one output file. output files: [%s]", outputFiles) 372*333d2b36SAndroid Build Coastguard Worker } 373*333d2b36SAndroid Build Coastguard Worker if len(testBinary.dataPaths()) != 2 { 374*333d2b36SAndroid Build Coastguard Worker t.Fatalf("expected exactly one test data file. test data files: [%v]", testBinary.dataPaths()) 375*333d2b36SAndroid Build Coastguard Worker } 376*333d2b36SAndroid Build Coastguard Worker 377*333d2b36SAndroid Build Coastguard Worker outputPath := outputFiles[0].String() 378*333d2b36SAndroid Build Coastguard Worker 379*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(outputPath, "/main_test") { 380*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected test output file to be 'main_test', but was '%s'", outputPath) 381*333d2b36SAndroid Build Coastguard Worker } 382*333d2b36SAndroid Build Coastguard Worker entries := android.AndroidMkInfoForTest(t, ctx, module).PrimaryInfo 383*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(entries.EntryMap["LOCAL_TEST_DATA"][0], ":test_lib.so:foo/bar/baz") { 384*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected LOCAL_TEST_DATA to end with `:test_lib.so:foo/bar/baz`,"+ 385*333d2b36SAndroid Build Coastguard Worker " but was '%s'", entries.EntryMap["LOCAL_TEST_DATA"][0]) 386*333d2b36SAndroid Build Coastguard Worker } 387*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(entries.EntryMap["LOCAL_TEST_DATA"][1], ":test_bin:foo/bar/baz") { 388*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected LOCAL_TEST_DATA to end with `:test_bin:foo/bar/baz`,"+ 389*333d2b36SAndroid Build Coastguard Worker " but was '%s'", entries.EntryMap["LOCAL_TEST_DATA"][1]) 390*333d2b36SAndroid Build Coastguard Worker } 391*333d2b36SAndroid Build Coastguard Worker} 392*333d2b36SAndroid Build Coastguard Worker 393*333d2b36SAndroid Build Coastguard Workerfunc TestTestBinaryTestSuites(t *testing.T) { 394*333d2b36SAndroid Build Coastguard Worker t.Parallel() 395*333d2b36SAndroid Build Coastguard Worker bp := ` 396*333d2b36SAndroid Build Coastguard Worker cc_test { 397*333d2b36SAndroid Build Coastguard Worker name: "main_test", 398*333d2b36SAndroid Build Coastguard Worker srcs: ["main_test.cpp"], 399*333d2b36SAndroid Build Coastguard Worker test_suites: [ 400*333d2b36SAndroid Build Coastguard Worker "suite_1", 401*333d2b36SAndroid Build Coastguard Worker "suite_2", 402*333d2b36SAndroid Build Coastguard Worker ], 403*333d2b36SAndroid Build Coastguard Worker gtest: false, 404*333d2b36SAndroid Build Coastguard Worker } 405*333d2b36SAndroid Build Coastguard Worker ` 406*333d2b36SAndroid Build Coastguard Worker 407*333d2b36SAndroid Build Coastguard Worker ctx := prepareForCcTest.RunTestWithBp(t, bp).TestContext 408*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests("main_test", "android_arm_armv7-a-neon").Module() 409*333d2b36SAndroid Build Coastguard Worker 410*333d2b36SAndroid Build Coastguard Worker entries := android.AndroidMkInfoForTest(t, ctx, module).PrimaryInfo 411*333d2b36SAndroid Build Coastguard Worker compatEntries := entries.EntryMap["LOCAL_COMPATIBILITY_SUITE"] 412*333d2b36SAndroid Build Coastguard Worker if len(compatEntries) != 2 { 413*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected two elements in LOCAL_COMPATIBILITY_SUITE. got %d", len(compatEntries)) 414*333d2b36SAndroid Build Coastguard Worker } 415*333d2b36SAndroid Build Coastguard Worker if compatEntries[0] != "suite_1" { 416*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected LOCAL_COMPATIBILITY_SUITE to be`suite_1`,"+ 417*333d2b36SAndroid Build Coastguard Worker " but was '%s'", compatEntries[0]) 418*333d2b36SAndroid Build Coastguard Worker } 419*333d2b36SAndroid Build Coastguard Worker if compatEntries[1] != "suite_2" { 420*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected LOCAL_COMPATIBILITY_SUITE to be`suite_2`,"+ 421*333d2b36SAndroid Build Coastguard Worker " but was '%s'", compatEntries[1]) 422*333d2b36SAndroid Build Coastguard Worker } 423*333d2b36SAndroid Build Coastguard Worker} 424*333d2b36SAndroid Build Coastguard Worker 425*333d2b36SAndroid Build Coastguard Workerfunc TestTestLibraryTestSuites(t *testing.T) { 426*333d2b36SAndroid Build Coastguard Worker t.Parallel() 427*333d2b36SAndroid Build Coastguard Worker bp := ` 428*333d2b36SAndroid Build Coastguard Worker cc_test_library { 429*333d2b36SAndroid Build Coastguard Worker name: "main_test_lib", 430*333d2b36SAndroid Build Coastguard Worker srcs: ["main_test_lib.cpp"], 431*333d2b36SAndroid Build Coastguard Worker test_suites: [ 432*333d2b36SAndroid Build Coastguard Worker "suite_1", 433*333d2b36SAndroid Build Coastguard Worker "suite_2", 434*333d2b36SAndroid Build Coastguard Worker ], 435*333d2b36SAndroid Build Coastguard Worker gtest: false, 436*333d2b36SAndroid Build Coastguard Worker } 437*333d2b36SAndroid Build Coastguard Worker ` 438*333d2b36SAndroid Build Coastguard Worker 439*333d2b36SAndroid Build Coastguard Worker ctx := prepareForCcTest.RunTestWithBp(t, bp).TestContext 440*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests("main_test_lib", "android_arm_armv7-a-neon_shared").Module() 441*333d2b36SAndroid Build Coastguard Worker 442*333d2b36SAndroid Build Coastguard Worker entries := android.AndroidMkInfoForTest(t, ctx, module).PrimaryInfo 443*333d2b36SAndroid Build Coastguard Worker compatEntries := entries.EntryMap["LOCAL_COMPATIBILITY_SUITE"] 444*333d2b36SAndroid Build Coastguard Worker if len(compatEntries) != 2 { 445*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected two elements in LOCAL_COMPATIBILITY_SUITE. got %d", len(compatEntries)) 446*333d2b36SAndroid Build Coastguard Worker } 447*333d2b36SAndroid Build Coastguard Worker if compatEntries[0] != "suite_1" { 448*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected LOCAL_COMPATIBILITY_SUITE to be`suite_1`,"+ 449*333d2b36SAndroid Build Coastguard Worker " but was '%s'", compatEntries[0]) 450*333d2b36SAndroid Build Coastguard Worker } 451*333d2b36SAndroid Build Coastguard Worker if compatEntries[1] != "suite_2" { 452*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected LOCAL_COMPATIBILITY_SUITE to be`suite_2`,"+ 453*333d2b36SAndroid Build Coastguard Worker " but was '%s'", compatEntries[1]) 454*333d2b36SAndroid Build Coastguard Worker } 455*333d2b36SAndroid Build Coastguard Worker} 456*333d2b36SAndroid Build Coastguard Worker 457*333d2b36SAndroid Build Coastguard Workerfunc TestDoubleLoadbleDep(t *testing.T) { 458*333d2b36SAndroid Build Coastguard Worker t.Parallel() 459*333d2b36SAndroid Build Coastguard Worker // okay to link : LLNDK -> double_loadable 460*333d2b36SAndroid Build Coastguard Worker testCc(t, ` 461*333d2b36SAndroid Build Coastguard Worker cc_library { 462*333d2b36SAndroid Build Coastguard Worker name: "libllndk", 463*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libdoubleloadable"], 464*333d2b36SAndroid Build Coastguard Worker llndk: { 465*333d2b36SAndroid Build Coastguard Worker symbol_file: "libllndk.map.txt", 466*333d2b36SAndroid Build Coastguard Worker } 467*333d2b36SAndroid Build Coastguard Worker } 468*333d2b36SAndroid Build Coastguard Worker 469*333d2b36SAndroid Build Coastguard Worker cc_library { 470*333d2b36SAndroid Build Coastguard Worker name: "libdoubleloadable", 471*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 472*333d2b36SAndroid Build Coastguard Worker product_available: true, 473*333d2b36SAndroid Build Coastguard Worker double_loadable: true, 474*333d2b36SAndroid Build Coastguard Worker } 475*333d2b36SAndroid Build Coastguard Worker `) 476*333d2b36SAndroid Build Coastguard Worker // okay to link : double_loadable -> double_loadable 477*333d2b36SAndroid Build Coastguard Worker testCc(t, ` 478*333d2b36SAndroid Build Coastguard Worker cc_library { 479*333d2b36SAndroid Build Coastguard Worker name: "libdoubleloadable1", 480*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libdoubleloadable2"], 481*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 482*333d2b36SAndroid Build Coastguard Worker double_loadable: true, 483*333d2b36SAndroid Build Coastguard Worker } 484*333d2b36SAndroid Build Coastguard Worker 485*333d2b36SAndroid Build Coastguard Worker cc_library { 486*333d2b36SAndroid Build Coastguard Worker name: "libdoubleloadable2", 487*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 488*333d2b36SAndroid Build Coastguard Worker double_loadable: true, 489*333d2b36SAndroid Build Coastguard Worker } 490*333d2b36SAndroid Build Coastguard Worker `) 491*333d2b36SAndroid Build Coastguard Worker // okay to link : double_loadable -> double_loadable 492*333d2b36SAndroid Build Coastguard Worker testCc(t, ` 493*333d2b36SAndroid Build Coastguard Worker cc_library { 494*333d2b36SAndroid Build Coastguard Worker name: "libdoubleloadable", 495*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 496*333d2b36SAndroid Build Coastguard Worker product_available: true, 497*333d2b36SAndroid Build Coastguard Worker double_loadable: true, 498*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libnondoubleloadable"], 499*333d2b36SAndroid Build Coastguard Worker } 500*333d2b36SAndroid Build Coastguard Worker 501*333d2b36SAndroid Build Coastguard Worker cc_library { 502*333d2b36SAndroid Build Coastguard Worker name: "libnondoubleloadable", 503*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 504*333d2b36SAndroid Build Coastguard Worker product_available: true, 505*333d2b36SAndroid Build Coastguard Worker double_loadable: true, 506*333d2b36SAndroid Build Coastguard Worker } 507*333d2b36SAndroid Build Coastguard Worker `) 508*333d2b36SAndroid Build Coastguard Worker // okay to link : LLNDK -> core-only -> vendor_available & double_loadable 509*333d2b36SAndroid Build Coastguard Worker testCc(t, ` 510*333d2b36SAndroid Build Coastguard Worker cc_library { 511*333d2b36SAndroid Build Coastguard Worker name: "libllndk", 512*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libcoreonly"], 513*333d2b36SAndroid Build Coastguard Worker llndk: { 514*333d2b36SAndroid Build Coastguard Worker symbol_file: "libllndk.map.txt", 515*333d2b36SAndroid Build Coastguard Worker } 516*333d2b36SAndroid Build Coastguard Worker } 517*333d2b36SAndroid Build Coastguard Worker 518*333d2b36SAndroid Build Coastguard Worker cc_library { 519*333d2b36SAndroid Build Coastguard Worker name: "libcoreonly", 520*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libvendoravailable"], 521*333d2b36SAndroid Build Coastguard Worker } 522*333d2b36SAndroid Build Coastguard Worker 523*333d2b36SAndroid Build Coastguard Worker // indirect dependency of LLNDK 524*333d2b36SAndroid Build Coastguard Worker cc_library { 525*333d2b36SAndroid Build Coastguard Worker name: "libvendoravailable", 526*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 527*333d2b36SAndroid Build Coastguard Worker double_loadable: true, 528*333d2b36SAndroid Build Coastguard Worker } 529*333d2b36SAndroid Build Coastguard Worker `) 530*333d2b36SAndroid Build Coastguard Worker} 531*333d2b36SAndroid Build Coastguard Worker 532*333d2b36SAndroid Build Coastguard Workerfunc TestDoubleLoadableDepError(t *testing.T) { 533*333d2b36SAndroid Build Coastguard Worker t.Parallel() 534*333d2b36SAndroid Build Coastguard Worker // Check whether an error is emitted when a LLNDK depends on a non-double_loadable lib. 535*333d2b36SAndroid Build Coastguard Worker testCcError(t, "module \".*\" variant \".*\": link.* \".*\" which is not LL-NDK, VNDK-SP, .*double_loadable", ` 536*333d2b36SAndroid Build Coastguard Worker cc_library { 537*333d2b36SAndroid Build Coastguard Worker name: "libllndk", 538*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libnondoubleloadable"], 539*333d2b36SAndroid Build Coastguard Worker llndk: { 540*333d2b36SAndroid Build Coastguard Worker symbol_file: "libllndk.map.txt", 541*333d2b36SAndroid Build Coastguard Worker } 542*333d2b36SAndroid Build Coastguard Worker } 543*333d2b36SAndroid Build Coastguard Worker 544*333d2b36SAndroid Build Coastguard Worker cc_library { 545*333d2b36SAndroid Build Coastguard Worker name: "libnondoubleloadable", 546*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 547*333d2b36SAndroid Build Coastguard Worker product_available: true, 548*333d2b36SAndroid Build Coastguard Worker } 549*333d2b36SAndroid Build Coastguard Worker `) 550*333d2b36SAndroid Build Coastguard Worker 551*333d2b36SAndroid Build Coastguard Worker // Check whether an error is emitted when a LLNDK depends on a non-double_loadable vendor_available lib. 552*333d2b36SAndroid Build Coastguard Worker testCcError(t, "module \".*\" variant \".*\": link.* \".*\" which is not LL-NDK, VNDK-SP, .*double_loadable", ` 553*333d2b36SAndroid Build Coastguard Worker cc_library { 554*333d2b36SAndroid Build Coastguard Worker name: "libllndk", 555*333d2b36SAndroid Build Coastguard Worker no_libcrt: true, 556*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libnondoubleloadable"], 557*333d2b36SAndroid Build Coastguard Worker llndk: { 558*333d2b36SAndroid Build Coastguard Worker symbol_file: "libllndk.map.txt", 559*333d2b36SAndroid Build Coastguard Worker } 560*333d2b36SAndroid Build Coastguard Worker } 561*333d2b36SAndroid Build Coastguard Worker 562*333d2b36SAndroid Build Coastguard Worker cc_library { 563*333d2b36SAndroid Build Coastguard Worker name: "libnondoubleloadable", 564*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 565*333d2b36SAndroid Build Coastguard Worker } 566*333d2b36SAndroid Build Coastguard Worker `) 567*333d2b36SAndroid Build Coastguard Worker 568*333d2b36SAndroid Build Coastguard Worker // Check whether an error is emitted when a LLNDK depends on a non-double_loadable indirectly. 569*333d2b36SAndroid Build Coastguard Worker testCcError(t, "module \".*\" variant \".*\": link.* \".*\" which is not LL-NDK, VNDK-SP, .*double_loadable", ` 570*333d2b36SAndroid Build Coastguard Worker cc_library { 571*333d2b36SAndroid Build Coastguard Worker name: "libllndk", 572*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libcoreonly"], 573*333d2b36SAndroid Build Coastguard Worker llndk: { 574*333d2b36SAndroid Build Coastguard Worker symbol_file: "libllndk.map.txt", 575*333d2b36SAndroid Build Coastguard Worker } 576*333d2b36SAndroid Build Coastguard Worker } 577*333d2b36SAndroid Build Coastguard Worker 578*333d2b36SAndroid Build Coastguard Worker cc_library { 579*333d2b36SAndroid Build Coastguard Worker name: "libcoreonly", 580*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libvendoravailable"], 581*333d2b36SAndroid Build Coastguard Worker } 582*333d2b36SAndroid Build Coastguard Worker 583*333d2b36SAndroid Build Coastguard Worker // indirect dependency of LLNDK 584*333d2b36SAndroid Build Coastguard Worker cc_library { 585*333d2b36SAndroid Build Coastguard Worker name: "libvendoravailable", 586*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 587*333d2b36SAndroid Build Coastguard Worker } 588*333d2b36SAndroid Build Coastguard Worker `) 589*333d2b36SAndroid Build Coastguard Worker 590*333d2b36SAndroid Build Coastguard Worker // The error is not from 'client' but from 'libllndk' 591*333d2b36SAndroid Build Coastguard Worker testCcError(t, "module \"libllndk\".* links a library \"libnondoubleloadable\".*double_loadable", ` 592*333d2b36SAndroid Build Coastguard Worker cc_library { 593*333d2b36SAndroid Build Coastguard Worker name: "client", 594*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 595*333d2b36SAndroid Build Coastguard Worker double_loadable: true, 596*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libllndk"], 597*333d2b36SAndroid Build Coastguard Worker } 598*333d2b36SAndroid Build Coastguard Worker cc_library { 599*333d2b36SAndroid Build Coastguard Worker name: "libllndk", 600*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libnondoubleloadable"], 601*333d2b36SAndroid Build Coastguard Worker llndk: { 602*333d2b36SAndroid Build Coastguard Worker symbol_file: "libllndk.map.txt", 603*333d2b36SAndroid Build Coastguard Worker } 604*333d2b36SAndroid Build Coastguard Worker } 605*333d2b36SAndroid Build Coastguard Worker cc_library { 606*333d2b36SAndroid Build Coastguard Worker name: "libnondoubleloadable", 607*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 608*333d2b36SAndroid Build Coastguard Worker } 609*333d2b36SAndroid Build Coastguard Worker `) 610*333d2b36SAndroid Build Coastguard Worker} 611*333d2b36SAndroid Build Coastguard Worker 612*333d2b36SAndroid Build Coastguard Workerfunc TestMakeLinkType(t *testing.T) { 613*333d2b36SAndroid Build Coastguard Worker t.Parallel() 614*333d2b36SAndroid Build Coastguard Worker bp := ` 615*333d2b36SAndroid Build Coastguard Worker cc_library { 616*333d2b36SAndroid Build Coastguard Worker name: "libvendor", 617*333d2b36SAndroid Build Coastguard Worker vendor: true, 618*333d2b36SAndroid Build Coastguard Worker } 619*333d2b36SAndroid Build Coastguard Worker vndk_prebuilt_shared { 620*333d2b36SAndroid Build Coastguard Worker name: "prevndk", 621*333d2b36SAndroid Build Coastguard Worker version: "27", 622*333d2b36SAndroid Build Coastguard Worker target_arch: "arm", 623*333d2b36SAndroid Build Coastguard Worker binder32bit: true, 624*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 625*333d2b36SAndroid Build Coastguard Worker product_available: true, 626*333d2b36SAndroid Build Coastguard Worker vndk: { 627*333d2b36SAndroid Build Coastguard Worker enabled: true, 628*333d2b36SAndroid Build Coastguard Worker }, 629*333d2b36SAndroid Build Coastguard Worker arch: { 630*333d2b36SAndroid Build Coastguard Worker arm: { 631*333d2b36SAndroid Build Coastguard Worker srcs: ["liba.so"], 632*333d2b36SAndroid Build Coastguard Worker }, 633*333d2b36SAndroid Build Coastguard Worker }, 634*333d2b36SAndroid Build Coastguard Worker } 635*333d2b36SAndroid Build Coastguard Worker cc_library { 636*333d2b36SAndroid Build Coastguard Worker name: "libllndk", 637*333d2b36SAndroid Build Coastguard Worker llndk: { 638*333d2b36SAndroid Build Coastguard Worker symbol_file: "libllndk.map.txt", 639*333d2b36SAndroid Build Coastguard Worker } 640*333d2b36SAndroid Build Coastguard Worker } 641*333d2b36SAndroid Build Coastguard Worker cc_library { 642*333d2b36SAndroid Build Coastguard Worker name: "libllndkprivate", 643*333d2b36SAndroid Build Coastguard Worker llndk: { 644*333d2b36SAndroid Build Coastguard Worker symbol_file: "libllndkprivate.map.txt", 645*333d2b36SAndroid Build Coastguard Worker private: true, 646*333d2b36SAndroid Build Coastguard Worker } 647*333d2b36SAndroid Build Coastguard Worker } 648*333d2b36SAndroid Build Coastguard Worker llndk_libraries_txt { 649*333d2b36SAndroid Build Coastguard Worker name: "llndk.libraries.txt", 650*333d2b36SAndroid Build Coastguard Worker } 651*333d2b36SAndroid Build Coastguard Worker ` 652*333d2b36SAndroid Build Coastguard Worker 653*333d2b36SAndroid Build Coastguard Worker config := TestConfig(t.TempDir(), android.Android, nil, bp, nil) 654*333d2b36SAndroid Build Coastguard Worker // native:vndk 655*333d2b36SAndroid Build Coastguard Worker ctx := testCcWithConfig(t, config) 656*333d2b36SAndroid Build Coastguard Worker 657*333d2b36SAndroid Build Coastguard Worker vendorVariant27 := "android_vendor.27_arm64_armv8-a_shared" 658*333d2b36SAndroid Build Coastguard Worker 659*333d2b36SAndroid Build Coastguard Worker tests := []struct { 660*333d2b36SAndroid Build Coastguard Worker variant string 661*333d2b36SAndroid Build Coastguard Worker name string 662*333d2b36SAndroid Build Coastguard Worker expected string 663*333d2b36SAndroid Build Coastguard Worker }{ 664*333d2b36SAndroid Build Coastguard Worker {vendorVariant, "libvendor", "native:vendor"}, 665*333d2b36SAndroid Build Coastguard Worker {vendorVariant, "libllndk", "native:vndk"}, 666*333d2b36SAndroid Build Coastguard Worker {vendorVariant27, "prevndk.vndk.27.arm.binder32", "native:vendor"}, 667*333d2b36SAndroid Build Coastguard Worker {coreVariant, "libllndk", "native:platform"}, 668*333d2b36SAndroid Build Coastguard Worker } 669*333d2b36SAndroid Build Coastguard Worker for _, test := range tests { 670*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 671*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests(test.name, test.variant).Module().(*Module) 672*333d2b36SAndroid Build Coastguard Worker assertString(t, module.makeLinkType, test.expected) 673*333d2b36SAndroid Build Coastguard Worker }) 674*333d2b36SAndroid Build Coastguard Worker } 675*333d2b36SAndroid Build Coastguard Worker} 676*333d2b36SAndroid Build Coastguard Worker 677*333d2b36SAndroid Build Coastguard Workervar staticLinkDepOrderTestCases = []struct { 678*333d2b36SAndroid Build Coastguard Worker // This is a string representation of a map[moduleName][]moduleDependency . 679*333d2b36SAndroid Build Coastguard Worker // It models the dependencies declared in an Android.bp file. 680*333d2b36SAndroid Build Coastguard Worker inStatic string 681*333d2b36SAndroid Build Coastguard Worker 682*333d2b36SAndroid Build Coastguard Worker // This is a string representation of a map[moduleName][]moduleDependency . 683*333d2b36SAndroid Build Coastguard Worker // It models the dependencies declared in an Android.bp file. 684*333d2b36SAndroid Build Coastguard Worker inShared string 685*333d2b36SAndroid Build Coastguard Worker 686*333d2b36SAndroid Build Coastguard Worker // allOrdered is a string representation of a map[moduleName][]moduleDependency . 687*333d2b36SAndroid Build Coastguard Worker // The keys of allOrdered specify which modules we would like to check. 688*333d2b36SAndroid Build Coastguard Worker // The values of allOrdered specify the expected result (of the transitive closure of all 689*333d2b36SAndroid Build Coastguard Worker // dependencies) for each module to test 690*333d2b36SAndroid Build Coastguard Worker allOrdered string 691*333d2b36SAndroid Build Coastguard Worker 692*333d2b36SAndroid Build Coastguard Worker // outOrdered is a string representation of a map[moduleName][]moduleDependency . 693*333d2b36SAndroid Build Coastguard Worker // The keys of outOrdered specify which modules we would like to check. 694*333d2b36SAndroid Build Coastguard Worker // The values of outOrdered specify the expected result (of the ordered linker command line) 695*333d2b36SAndroid Build Coastguard Worker // for each module to test. 696*333d2b36SAndroid Build Coastguard Worker outOrdered string 697*333d2b36SAndroid Build Coastguard Worker}{ 698*333d2b36SAndroid Build Coastguard Worker // Simple tests 699*333d2b36SAndroid Build Coastguard Worker { 700*333d2b36SAndroid Build Coastguard Worker inStatic: "", 701*333d2b36SAndroid Build Coastguard Worker outOrdered: "", 702*333d2b36SAndroid Build Coastguard Worker }, 703*333d2b36SAndroid Build Coastguard Worker { 704*333d2b36SAndroid Build Coastguard Worker inStatic: "a:", 705*333d2b36SAndroid Build Coastguard Worker outOrdered: "a:", 706*333d2b36SAndroid Build Coastguard Worker }, 707*333d2b36SAndroid Build Coastguard Worker { 708*333d2b36SAndroid Build Coastguard Worker inStatic: "a:b; b:", 709*333d2b36SAndroid Build Coastguard Worker outOrdered: "a:b; b:", 710*333d2b36SAndroid Build Coastguard Worker }, 711*333d2b36SAndroid Build Coastguard Worker // Tests of reordering 712*333d2b36SAndroid Build Coastguard Worker { 713*333d2b36SAndroid Build Coastguard Worker // diamond example 714*333d2b36SAndroid Build Coastguard Worker inStatic: "a:d,b,c; b:d; c:d; d:", 715*333d2b36SAndroid Build Coastguard Worker outOrdered: "a:b,c,d; b:d; c:d; d:", 716*333d2b36SAndroid Build Coastguard Worker }, 717*333d2b36SAndroid Build Coastguard Worker { 718*333d2b36SAndroid Build Coastguard Worker // somewhat real example 719*333d2b36SAndroid Build Coastguard Worker inStatic: "bsdiff_unittest:b,c,d,e,f,g,h,i; e:b", 720*333d2b36SAndroid Build Coastguard Worker outOrdered: "bsdiff_unittest:c,d,e,b,f,g,h,i; e:b", 721*333d2b36SAndroid Build Coastguard Worker }, 722*333d2b36SAndroid Build Coastguard Worker { 723*333d2b36SAndroid Build Coastguard Worker // multiple reorderings 724*333d2b36SAndroid Build Coastguard Worker inStatic: "a:b,c,d,e; d:b; e:c", 725*333d2b36SAndroid Build Coastguard Worker outOrdered: "a:d,b,e,c; d:b; e:c", 726*333d2b36SAndroid Build Coastguard Worker }, 727*333d2b36SAndroid Build Coastguard Worker { 728*333d2b36SAndroid Build Coastguard Worker // should reorder without adding new transitive dependencies 729*333d2b36SAndroid Build Coastguard Worker inStatic: "bin:lib2,lib1; lib1:lib2,liboptional", 730*333d2b36SAndroid Build Coastguard Worker allOrdered: "bin:lib1,lib2,liboptional; lib1:lib2,liboptional", 731*333d2b36SAndroid Build Coastguard Worker outOrdered: "bin:lib1,lib2; lib1:lib2,liboptional", 732*333d2b36SAndroid Build Coastguard Worker }, 733*333d2b36SAndroid Build Coastguard Worker { 734*333d2b36SAndroid Build Coastguard Worker // multiple levels of dependencies 735*333d2b36SAndroid Build Coastguard Worker inStatic: "a:b,c,d,e,f,g,h; f:b,c,d; b:c,d; c:d", 736*333d2b36SAndroid Build Coastguard Worker allOrdered: "a:e,f,b,c,d,g,h; f:b,c,d; b:c,d; c:d", 737*333d2b36SAndroid Build Coastguard Worker outOrdered: "a:e,f,b,c,d,g,h; f:b,c,d; b:c,d; c:d", 738*333d2b36SAndroid Build Coastguard Worker }, 739*333d2b36SAndroid Build Coastguard Worker // shared dependencies 740*333d2b36SAndroid Build Coastguard Worker { 741*333d2b36SAndroid Build Coastguard Worker // Note that this test doesn't recurse, to minimize the amount of logic it tests. 742*333d2b36SAndroid Build Coastguard Worker // So, we don't actually have to check that a shared dependency of c will change the order 743*333d2b36SAndroid Build Coastguard Worker // of a library that depends statically on b and on c. We only need to check that if c has 744*333d2b36SAndroid Build Coastguard Worker // a shared dependency on b, that that shows up in allOrdered. 745*333d2b36SAndroid Build Coastguard Worker inShared: "c:b", 746*333d2b36SAndroid Build Coastguard Worker allOrdered: "c:b", 747*333d2b36SAndroid Build Coastguard Worker outOrdered: "c:", 748*333d2b36SAndroid Build Coastguard Worker }, 749*333d2b36SAndroid Build Coastguard Worker { 750*333d2b36SAndroid Build Coastguard Worker // This test doesn't actually include any shared dependencies but it's a reminder of what 751*333d2b36SAndroid Build Coastguard Worker // the second phase of the above test would look like 752*333d2b36SAndroid Build Coastguard Worker inStatic: "a:b,c; c:b", 753*333d2b36SAndroid Build Coastguard Worker allOrdered: "a:c,b; c:b", 754*333d2b36SAndroid Build Coastguard Worker outOrdered: "a:c,b; c:b", 755*333d2b36SAndroid Build Coastguard Worker }, 756*333d2b36SAndroid Build Coastguard Worker // tiebreakers for when two modules specifying different orderings and there is no dependency 757*333d2b36SAndroid Build Coastguard Worker // to dictate an order 758*333d2b36SAndroid Build Coastguard Worker { 759*333d2b36SAndroid Build Coastguard Worker // if the tie is between two modules at the end of a's deps, then a's order wins 760*333d2b36SAndroid Build Coastguard Worker inStatic: "a1:b,c,d,e; a2:b,c,e,d; b:d,e; c:e,d", 761*333d2b36SAndroid Build Coastguard Worker outOrdered: "a1:b,c,d,e; a2:b,c,e,d; b:d,e; c:e,d", 762*333d2b36SAndroid Build Coastguard Worker }, 763*333d2b36SAndroid Build Coastguard Worker { 764*333d2b36SAndroid Build Coastguard Worker // if the tie is between two modules at the start of a's deps, then c's order is used 765*333d2b36SAndroid Build Coastguard Worker inStatic: "a1:d,e,b1,c1; b1:d,e; c1:e,d; a2:d,e,b2,c2; b2:d,e; c2:d,e", 766*333d2b36SAndroid Build Coastguard Worker outOrdered: "a1:b1,c1,e,d; b1:d,e; c1:e,d; a2:b2,c2,d,e; b2:d,e; c2:d,e", 767*333d2b36SAndroid Build Coastguard Worker }, 768*333d2b36SAndroid Build Coastguard Worker // Tests involving duplicate dependencies 769*333d2b36SAndroid Build Coastguard Worker { 770*333d2b36SAndroid Build Coastguard Worker // simple duplicate 771*333d2b36SAndroid Build Coastguard Worker inStatic: "a:b,c,c,b", 772*333d2b36SAndroid Build Coastguard Worker outOrdered: "a:c,b", 773*333d2b36SAndroid Build Coastguard Worker }, 774*333d2b36SAndroid Build Coastguard Worker { 775*333d2b36SAndroid Build Coastguard Worker // duplicates with reordering 776*333d2b36SAndroid Build Coastguard Worker inStatic: "a:b,c,d,c; c:b", 777*333d2b36SAndroid Build Coastguard Worker outOrdered: "a:d,c,b", 778*333d2b36SAndroid Build Coastguard Worker }, 779*333d2b36SAndroid Build Coastguard Worker // Tests to confirm the nonexistence of infinite loops. 780*333d2b36SAndroid Build Coastguard Worker // These cases should never happen, so as long as the test terminates and the 781*333d2b36SAndroid Build Coastguard Worker // result is deterministic then that should be fine. 782*333d2b36SAndroid Build Coastguard Worker { 783*333d2b36SAndroid Build Coastguard Worker inStatic: "a:a", 784*333d2b36SAndroid Build Coastguard Worker outOrdered: "a:a", 785*333d2b36SAndroid Build Coastguard Worker }, 786*333d2b36SAndroid Build Coastguard Worker { 787*333d2b36SAndroid Build Coastguard Worker inStatic: "a:b; b:c; c:a", 788*333d2b36SAndroid Build Coastguard Worker allOrdered: "a:b,c; b:c,a; c:a,b", 789*333d2b36SAndroid Build Coastguard Worker outOrdered: "a:b; b:c; c:a", 790*333d2b36SAndroid Build Coastguard Worker }, 791*333d2b36SAndroid Build Coastguard Worker { 792*333d2b36SAndroid Build Coastguard Worker inStatic: "a:b,c; b:c,a; c:a,b", 793*333d2b36SAndroid Build Coastguard Worker allOrdered: "a:c,a,b; b:a,b,c; c:b,c,a", 794*333d2b36SAndroid Build Coastguard Worker outOrdered: "a:c,b; b:a,c; c:b,a", 795*333d2b36SAndroid Build Coastguard Worker }, 796*333d2b36SAndroid Build Coastguard Worker} 797*333d2b36SAndroid Build Coastguard Worker 798*333d2b36SAndroid Build Coastguard Worker// converts from a string like "a:b,c; d:e" to (["a","b"], {"a":["b","c"], "d":["e"]}, [{"a", "a.o"}, {"b", "b.o"}]) 799*333d2b36SAndroid Build Coastguard Workerfunc parseModuleDeps(text string) (modulesInOrder []android.Path, allDeps map[android.Path][]android.Path) { 800*333d2b36SAndroid Build Coastguard Worker // convert from "a:b,c; d:e" to "a:b,c;d:e" 801*333d2b36SAndroid Build Coastguard Worker strippedText := strings.Replace(text, " ", "", -1) 802*333d2b36SAndroid Build Coastguard Worker if len(strippedText) < 1 { 803*333d2b36SAndroid Build Coastguard Worker return []android.Path{}, make(map[android.Path][]android.Path, 0) 804*333d2b36SAndroid Build Coastguard Worker } 805*333d2b36SAndroid Build Coastguard Worker allDeps = make(map[android.Path][]android.Path, 0) 806*333d2b36SAndroid Build Coastguard Worker 807*333d2b36SAndroid Build Coastguard Worker // convert from "a:b,c;d:e" to ["a:b,c", "d:e"] 808*333d2b36SAndroid Build Coastguard Worker moduleTexts := strings.Split(strippedText, ";") 809*333d2b36SAndroid Build Coastguard Worker 810*333d2b36SAndroid Build Coastguard Worker outputForModuleName := func(moduleName string) android.Path { 811*333d2b36SAndroid Build Coastguard Worker return android.PathForTesting(moduleName) 812*333d2b36SAndroid Build Coastguard Worker } 813*333d2b36SAndroid Build Coastguard Worker 814*333d2b36SAndroid Build Coastguard Worker for _, moduleText := range moduleTexts { 815*333d2b36SAndroid Build Coastguard Worker // convert from "a:b,c" to ["a", "b,c"] 816*333d2b36SAndroid Build Coastguard Worker components := strings.Split(moduleText, ":") 817*333d2b36SAndroid Build Coastguard Worker if len(components) != 2 { 818*333d2b36SAndroid Build Coastguard Worker panic(fmt.Sprintf("illegal module dep string %q from larger string %q; must contain one ':', not %v", moduleText, text, len(components)-1)) 819*333d2b36SAndroid Build Coastguard Worker } 820*333d2b36SAndroid Build Coastguard Worker moduleName := components[0] 821*333d2b36SAndroid Build Coastguard Worker moduleOutput := outputForModuleName(moduleName) 822*333d2b36SAndroid Build Coastguard Worker modulesInOrder = append(modulesInOrder, moduleOutput) 823*333d2b36SAndroid Build Coastguard Worker 824*333d2b36SAndroid Build Coastguard Worker depString := components[1] 825*333d2b36SAndroid Build Coastguard Worker // convert from "b,c" to ["b", "c"] 826*333d2b36SAndroid Build Coastguard Worker depNames := strings.Split(depString, ",") 827*333d2b36SAndroid Build Coastguard Worker if len(depString) < 1 { 828*333d2b36SAndroid Build Coastguard Worker depNames = []string{} 829*333d2b36SAndroid Build Coastguard Worker } 830*333d2b36SAndroid Build Coastguard Worker var deps []android.Path 831*333d2b36SAndroid Build Coastguard Worker for _, depName := range depNames { 832*333d2b36SAndroid Build Coastguard Worker deps = append(deps, outputForModuleName(depName)) 833*333d2b36SAndroid Build Coastguard Worker } 834*333d2b36SAndroid Build Coastguard Worker allDeps[moduleOutput] = deps 835*333d2b36SAndroid Build Coastguard Worker } 836*333d2b36SAndroid Build Coastguard Worker return modulesInOrder, allDeps 837*333d2b36SAndroid Build Coastguard Worker} 838*333d2b36SAndroid Build Coastguard Worker 839*333d2b36SAndroid Build Coastguard Workerfunc TestStaticLibDepReordering(t *testing.T) { 840*333d2b36SAndroid Build Coastguard Worker t.Parallel() 841*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, ` 842*333d2b36SAndroid Build Coastguard Worker cc_library { 843*333d2b36SAndroid Build Coastguard Worker name: "a", 844*333d2b36SAndroid Build Coastguard Worker static_libs: ["b", "c", "d"], 845*333d2b36SAndroid Build Coastguard Worker stl: "none", 846*333d2b36SAndroid Build Coastguard Worker } 847*333d2b36SAndroid Build Coastguard Worker cc_library { 848*333d2b36SAndroid Build Coastguard Worker name: "b", 849*333d2b36SAndroid Build Coastguard Worker stl: "none", 850*333d2b36SAndroid Build Coastguard Worker } 851*333d2b36SAndroid Build Coastguard Worker cc_library { 852*333d2b36SAndroid Build Coastguard Worker name: "c", 853*333d2b36SAndroid Build Coastguard Worker static_libs: ["b"], 854*333d2b36SAndroid Build Coastguard Worker stl: "none", 855*333d2b36SAndroid Build Coastguard Worker } 856*333d2b36SAndroid Build Coastguard Worker cc_library { 857*333d2b36SAndroid Build Coastguard Worker name: "d", 858*333d2b36SAndroid Build Coastguard Worker stl: "none", 859*333d2b36SAndroid Build Coastguard Worker } 860*333d2b36SAndroid Build Coastguard Worker 861*333d2b36SAndroid Build Coastguard Worker `) 862*333d2b36SAndroid Build Coastguard Worker 863*333d2b36SAndroid Build Coastguard Worker variant := "android_arm64_armv8-a_static" 864*333d2b36SAndroid Build Coastguard Worker moduleA := ctx.ModuleForTests("a", variant).Module().(*Module) 865*333d2b36SAndroid Build Coastguard Worker staticLibInfo, _ := android.OtherModuleProvider(ctx, moduleA, StaticLibraryInfoProvider) 866*333d2b36SAndroid Build Coastguard Worker actual := android.Paths(staticLibInfo.TransitiveStaticLibrariesForOrdering.ToList()).RelativeToTop() 867*333d2b36SAndroid Build Coastguard Worker expected := GetOutputPaths(ctx, variant, []string{"a", "c", "b", "d"}) 868*333d2b36SAndroid Build Coastguard Worker 869*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(actual, expected) { 870*333d2b36SAndroid Build Coastguard Worker t.Errorf("staticDeps orderings were not propagated correctly"+ 871*333d2b36SAndroid Build Coastguard Worker "\nactual: %v"+ 872*333d2b36SAndroid Build Coastguard Worker "\nexpected: %v", 873*333d2b36SAndroid Build Coastguard Worker actual, 874*333d2b36SAndroid Build Coastguard Worker expected, 875*333d2b36SAndroid Build Coastguard Worker ) 876*333d2b36SAndroid Build Coastguard Worker } 877*333d2b36SAndroid Build Coastguard Worker} 878*333d2b36SAndroid Build Coastguard Worker 879*333d2b36SAndroid Build Coastguard Workerfunc TestStaticLibDepReorderingWithShared(t *testing.T) { 880*333d2b36SAndroid Build Coastguard Worker t.Parallel() 881*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, ` 882*333d2b36SAndroid Build Coastguard Worker cc_library { 883*333d2b36SAndroid Build Coastguard Worker name: "a", 884*333d2b36SAndroid Build Coastguard Worker static_libs: ["b", "c"], 885*333d2b36SAndroid Build Coastguard Worker stl: "none", 886*333d2b36SAndroid Build Coastguard Worker } 887*333d2b36SAndroid Build Coastguard Worker cc_library { 888*333d2b36SAndroid Build Coastguard Worker name: "b", 889*333d2b36SAndroid Build Coastguard Worker stl: "none", 890*333d2b36SAndroid Build Coastguard Worker } 891*333d2b36SAndroid Build Coastguard Worker cc_library { 892*333d2b36SAndroid Build Coastguard Worker name: "c", 893*333d2b36SAndroid Build Coastguard Worker shared_libs: ["b"], 894*333d2b36SAndroid Build Coastguard Worker stl: "none", 895*333d2b36SAndroid Build Coastguard Worker } 896*333d2b36SAndroid Build Coastguard Worker 897*333d2b36SAndroid Build Coastguard Worker `) 898*333d2b36SAndroid Build Coastguard Worker 899*333d2b36SAndroid Build Coastguard Worker variant := "android_arm64_armv8-a_static" 900*333d2b36SAndroid Build Coastguard Worker moduleA := ctx.ModuleForTests("a", variant).Module().(*Module) 901*333d2b36SAndroid Build Coastguard Worker staticLibInfo, _ := android.OtherModuleProvider(ctx, moduleA, StaticLibraryInfoProvider) 902*333d2b36SAndroid Build Coastguard Worker actual := android.Paths(staticLibInfo.TransitiveStaticLibrariesForOrdering.ToList()).RelativeToTop() 903*333d2b36SAndroid Build Coastguard Worker expected := GetOutputPaths(ctx, variant, []string{"a", "c", "b"}) 904*333d2b36SAndroid Build Coastguard Worker 905*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(actual, expected) { 906*333d2b36SAndroid Build Coastguard Worker t.Errorf("staticDeps orderings did not account for shared libs"+ 907*333d2b36SAndroid Build Coastguard Worker "\nactual: %v"+ 908*333d2b36SAndroid Build Coastguard Worker "\nexpected: %v", 909*333d2b36SAndroid Build Coastguard Worker actual, 910*333d2b36SAndroid Build Coastguard Worker expected, 911*333d2b36SAndroid Build Coastguard Worker ) 912*333d2b36SAndroid Build Coastguard Worker } 913*333d2b36SAndroid Build Coastguard Worker} 914*333d2b36SAndroid Build Coastguard Worker 915*333d2b36SAndroid Build Coastguard Workerfunc checkEquals(t *testing.T, message string, expected, actual interface{}) { 916*333d2b36SAndroid Build Coastguard Worker t.Helper() 917*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(actual, expected) { 918*333d2b36SAndroid Build Coastguard Worker t.Errorf(message+ 919*333d2b36SAndroid Build Coastguard Worker "\nactual: %v"+ 920*333d2b36SAndroid Build Coastguard Worker "\nexpected: %v", 921*333d2b36SAndroid Build Coastguard Worker actual, 922*333d2b36SAndroid Build Coastguard Worker expected, 923*333d2b36SAndroid Build Coastguard Worker ) 924*333d2b36SAndroid Build Coastguard Worker } 925*333d2b36SAndroid Build Coastguard Worker} 926*333d2b36SAndroid Build Coastguard Worker 927*333d2b36SAndroid Build Coastguard Workerfunc TestLlndkLibrary(t *testing.T) { 928*333d2b36SAndroid Build Coastguard Worker t.Parallel() 929*333d2b36SAndroid Build Coastguard Worker result := prepareForCcTest.RunTestWithBp(t, ` 930*333d2b36SAndroid Build Coastguard Worker cc_library { 931*333d2b36SAndroid Build Coastguard Worker name: "libllndk", 932*333d2b36SAndroid Build Coastguard Worker stubs: { versions: ["1", "2"] }, 933*333d2b36SAndroid Build Coastguard Worker llndk: { 934*333d2b36SAndroid Build Coastguard Worker symbol_file: "libllndk.map.txt", 935*333d2b36SAndroid Build Coastguard Worker }, 936*333d2b36SAndroid Build Coastguard Worker export_include_dirs: ["include"], 937*333d2b36SAndroid Build Coastguard Worker } 938*333d2b36SAndroid Build Coastguard Worker 939*333d2b36SAndroid Build Coastguard Worker cc_prebuilt_library_shared { 940*333d2b36SAndroid Build Coastguard Worker name: "libllndkprebuilt", 941*333d2b36SAndroid Build Coastguard Worker stubs: { versions: ["1", "2"] , symbol_file: "libllndkprebuilt.map.txt" }, 942*333d2b36SAndroid Build Coastguard Worker llndk: { 943*333d2b36SAndroid Build Coastguard Worker symbol_file: "libllndkprebuilt.map.txt", 944*333d2b36SAndroid Build Coastguard Worker }, 945*333d2b36SAndroid Build Coastguard Worker } 946*333d2b36SAndroid Build Coastguard Worker 947*333d2b36SAndroid Build Coastguard Worker cc_library { 948*333d2b36SAndroid Build Coastguard Worker name: "libllndk_with_external_headers", 949*333d2b36SAndroid Build Coastguard Worker stubs: { versions: ["1", "2"] }, 950*333d2b36SAndroid Build Coastguard Worker llndk: { 951*333d2b36SAndroid Build Coastguard Worker symbol_file: "libllndk.map.txt", 952*333d2b36SAndroid Build Coastguard Worker export_llndk_headers: ["libexternal_llndk_headers"], 953*333d2b36SAndroid Build Coastguard Worker }, 954*333d2b36SAndroid Build Coastguard Worker header_libs: ["libexternal_headers"], 955*333d2b36SAndroid Build Coastguard Worker export_header_lib_headers: ["libexternal_headers"], 956*333d2b36SAndroid Build Coastguard Worker } 957*333d2b36SAndroid Build Coastguard Worker cc_library_headers { 958*333d2b36SAndroid Build Coastguard Worker name: "libexternal_headers", 959*333d2b36SAndroid Build Coastguard Worker export_include_dirs: ["include"], 960*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 961*333d2b36SAndroid Build Coastguard Worker product_available: true, 962*333d2b36SAndroid Build Coastguard Worker } 963*333d2b36SAndroid Build Coastguard Worker cc_library_headers { 964*333d2b36SAndroid Build Coastguard Worker name: "libexternal_llndk_headers", 965*333d2b36SAndroid Build Coastguard Worker export_include_dirs: ["include_llndk"], 966*333d2b36SAndroid Build Coastguard Worker export_system_include_dirs: ["include_system_llndk"], 967*333d2b36SAndroid Build Coastguard Worker llndk: { 968*333d2b36SAndroid Build Coastguard Worker symbol_file: "libllndk.map.txt", 969*333d2b36SAndroid Build Coastguard Worker }, 970*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 971*333d2b36SAndroid Build Coastguard Worker } 972*333d2b36SAndroid Build Coastguard Worker 973*333d2b36SAndroid Build Coastguard Worker cc_library { 974*333d2b36SAndroid Build Coastguard Worker name: "libllndk_with_override_headers", 975*333d2b36SAndroid Build Coastguard Worker stubs: { versions: ["1", "2"] }, 976*333d2b36SAndroid Build Coastguard Worker llndk: { 977*333d2b36SAndroid Build Coastguard Worker symbol_file: "libllndk.map.txt", 978*333d2b36SAndroid Build Coastguard Worker override_export_include_dirs: ["include_llndk"], 979*333d2b36SAndroid Build Coastguard Worker }, 980*333d2b36SAndroid Build Coastguard Worker export_include_dirs: ["include"], 981*333d2b36SAndroid Build Coastguard Worker } 982*333d2b36SAndroid Build Coastguard Worker 983*333d2b36SAndroid Build Coastguard Worker cc_library { 984*333d2b36SAndroid Build Coastguard Worker name: "libllndk_with_system_headers", 985*333d2b36SAndroid Build Coastguard Worker llndk: { 986*333d2b36SAndroid Build Coastguard Worker symbol_file: "libllndk.map.txt", 987*333d2b36SAndroid Build Coastguard Worker export_llndk_headers: ["libexternal_llndk_headers"], 988*333d2b36SAndroid Build Coastguard Worker export_headers_as_system: true, 989*333d2b36SAndroid Build Coastguard Worker }, 990*333d2b36SAndroid Build Coastguard Worker export_include_dirs: ["include"], 991*333d2b36SAndroid Build Coastguard Worker export_system_include_dirs: ["include_system"], 992*333d2b36SAndroid Build Coastguard Worker } 993*333d2b36SAndroid Build Coastguard Worker `) 994*333d2b36SAndroid Build Coastguard Worker actual := result.ModuleVariantsForTests("libllndk") 995*333d2b36SAndroid Build Coastguard Worker for i := 0; i < len(actual); i++ { 996*333d2b36SAndroid Build Coastguard Worker if !strings.HasPrefix(actual[i], "android_vendor_") { 997*333d2b36SAndroid Build Coastguard Worker actual = append(actual[:i], actual[i+1:]...) 998*333d2b36SAndroid Build Coastguard Worker i-- 999*333d2b36SAndroid Build Coastguard Worker } 1000*333d2b36SAndroid Build Coastguard Worker } 1001*333d2b36SAndroid Build Coastguard Worker expected := []string{ 1002*333d2b36SAndroid Build Coastguard Worker "android_vendor_arm64_armv8-a_shared", 1003*333d2b36SAndroid Build Coastguard Worker "android_vendor_arm_armv7-a-neon_shared", 1004*333d2b36SAndroid Build Coastguard Worker } 1005*333d2b36SAndroid Build Coastguard Worker android.AssertArrayString(t, "variants for llndk stubs", expected, actual) 1006*333d2b36SAndroid Build Coastguard Worker 1007*333d2b36SAndroid Build Coastguard Worker params := result.ModuleForTests("libllndk", "android_vendor_arm_armv7-a-neon_shared").Description("generate stub") 1008*333d2b36SAndroid Build Coastguard Worker android.AssertSame(t, "use Vendor API level for default stubs", "35", params.Args["apiLevel"]) 1009*333d2b36SAndroid Build Coastguard Worker 1010*333d2b36SAndroid Build Coastguard Worker checkExportedIncludeDirs := func(module, variant string, expectedSystemDirs []string, expectedDirs ...string) { 1011*333d2b36SAndroid Build Coastguard Worker t.Helper() 1012*333d2b36SAndroid Build Coastguard Worker m := result.ModuleForTests(module, variant).Module() 1013*333d2b36SAndroid Build Coastguard Worker f, _ := android.OtherModuleProvider(result, m, FlagExporterInfoProvider) 1014*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "exported include dirs for "+module+"["+variant+"]", 1015*333d2b36SAndroid Build Coastguard Worker expectedDirs, f.IncludeDirs) 1016*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "exported include dirs for "+module+"["+variant+"]", 1017*333d2b36SAndroid Build Coastguard Worker expectedSystemDirs, f.SystemIncludeDirs) 1018*333d2b36SAndroid Build Coastguard Worker } 1019*333d2b36SAndroid Build Coastguard Worker 1020*333d2b36SAndroid Build Coastguard Worker checkExportedIncludeDirs("libllndk", coreVariant, nil, "include") 1021*333d2b36SAndroid Build Coastguard Worker checkExportedIncludeDirs("libllndk", vendorVariant, nil, "include") 1022*333d2b36SAndroid Build Coastguard Worker checkExportedIncludeDirs("libllndk_with_external_headers", coreVariant, nil, "include") 1023*333d2b36SAndroid Build Coastguard Worker checkExportedIncludeDirs("libllndk_with_external_headers", vendorVariant, 1024*333d2b36SAndroid Build Coastguard Worker []string{"include_system_llndk"}, "include_llndk") 1025*333d2b36SAndroid Build Coastguard Worker checkExportedIncludeDirs("libllndk_with_override_headers", coreVariant, nil, "include") 1026*333d2b36SAndroid Build Coastguard Worker checkExportedIncludeDirs("libllndk_with_override_headers", vendorVariant, nil, "include_llndk") 1027*333d2b36SAndroid Build Coastguard Worker checkExportedIncludeDirs("libllndk_with_system_headers", coreVariant, []string{"include_system"}, "include") 1028*333d2b36SAndroid Build Coastguard Worker checkExportedIncludeDirs("libllndk_with_system_headers", vendorVariant, 1029*333d2b36SAndroid Build Coastguard Worker []string{"include_system", "include", "include_system_llndk"}, "include_llndk") 1030*333d2b36SAndroid Build Coastguard Worker 1031*333d2b36SAndroid Build Coastguard Worker checkAbiLinkerIncludeDirs := func(module string) { 1032*333d2b36SAndroid Build Coastguard Worker t.Helper() 1033*333d2b36SAndroid Build Coastguard Worker coreModule := result.ModuleForTests(module, coreVariant) 1034*333d2b36SAndroid Build Coastguard Worker abiCheckFlags := "" 1035*333d2b36SAndroid Build Coastguard Worker for _, output := range coreModule.AllOutputs() { 1036*333d2b36SAndroid Build Coastguard Worker if strings.HasSuffix(output, ".so.llndk.lsdump") { 1037*333d2b36SAndroid Build Coastguard Worker abiCheckFlags = coreModule.Output(output).Args["exportedHeaderFlags"] 1038*333d2b36SAndroid Build Coastguard Worker } 1039*333d2b36SAndroid Build Coastguard Worker } 1040*333d2b36SAndroid Build Coastguard Worker vendorModule := result.ModuleForTests(module, vendorVariant).Module() 1041*333d2b36SAndroid Build Coastguard Worker vendorInfo, _ := android.OtherModuleProvider(result, vendorModule, FlagExporterInfoProvider) 1042*333d2b36SAndroid Build Coastguard Worker vendorDirs := android.Concat(vendorInfo.IncludeDirs, vendorInfo.SystemIncludeDirs) 1043*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, module+" has different exported include dirs for vendor variant and ABI check", 1044*333d2b36SAndroid Build Coastguard Worker android.JoinPathsWithPrefix(vendorDirs, "-I"), abiCheckFlags) 1045*333d2b36SAndroid Build Coastguard Worker } 1046*333d2b36SAndroid Build Coastguard Worker checkAbiLinkerIncludeDirs("libllndk") 1047*333d2b36SAndroid Build Coastguard Worker checkAbiLinkerIncludeDirs("libllndk_with_override_headers") 1048*333d2b36SAndroid Build Coastguard Worker checkAbiLinkerIncludeDirs("libllndk_with_external_headers") 1049*333d2b36SAndroid Build Coastguard Worker checkAbiLinkerIncludeDirs("libllndk_with_system_headers") 1050*333d2b36SAndroid Build Coastguard Worker} 1051*333d2b36SAndroid Build Coastguard Worker 1052*333d2b36SAndroid Build Coastguard Workerfunc TestLlndkHeaders(t *testing.T) { 1053*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1054*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, ` 1055*333d2b36SAndroid Build Coastguard Worker cc_library_headers { 1056*333d2b36SAndroid Build Coastguard Worker name: "libllndk_headers", 1057*333d2b36SAndroid Build Coastguard Worker export_include_dirs: ["my_include"], 1058*333d2b36SAndroid Build Coastguard Worker llndk: { 1059*333d2b36SAndroid Build Coastguard Worker llndk_headers: true, 1060*333d2b36SAndroid Build Coastguard Worker }, 1061*333d2b36SAndroid Build Coastguard Worker } 1062*333d2b36SAndroid Build Coastguard Worker cc_library { 1063*333d2b36SAndroid Build Coastguard Worker name: "libllndk", 1064*333d2b36SAndroid Build Coastguard Worker llndk: { 1065*333d2b36SAndroid Build Coastguard Worker symbol_file: "libllndk.map.txt", 1066*333d2b36SAndroid Build Coastguard Worker export_llndk_headers: ["libllndk_headers"], 1067*333d2b36SAndroid Build Coastguard Worker } 1068*333d2b36SAndroid Build Coastguard Worker } 1069*333d2b36SAndroid Build Coastguard Worker 1070*333d2b36SAndroid Build Coastguard Worker cc_library { 1071*333d2b36SAndroid Build Coastguard Worker name: "libvendor", 1072*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libllndk"], 1073*333d2b36SAndroid Build Coastguard Worker vendor: true, 1074*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 1075*333d2b36SAndroid Build Coastguard Worker no_libcrt: true, 1076*333d2b36SAndroid Build Coastguard Worker nocrt: true, 1077*333d2b36SAndroid Build Coastguard Worker } 1078*333d2b36SAndroid Build Coastguard Worker `) 1079*333d2b36SAndroid Build Coastguard Worker 1080*333d2b36SAndroid Build Coastguard Worker // _static variant is used since _shared reuses *.o from the static variant 1081*333d2b36SAndroid Build Coastguard Worker cc := ctx.ModuleForTests("libvendor", "android_vendor_arm_armv7-a-neon_static").Rule("cc") 1082*333d2b36SAndroid Build Coastguard Worker cflags := cc.Args["cFlags"] 1083*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cflags, "-Imy_include") { 1084*333d2b36SAndroid Build Coastguard Worker t.Errorf("cflags for libvendor must contain -Imy_include, but was %#v.", cflags) 1085*333d2b36SAndroid Build Coastguard Worker } 1086*333d2b36SAndroid Build Coastguard Worker} 1087*333d2b36SAndroid Build Coastguard Worker 1088*333d2b36SAndroid Build Coastguard Workerfunc checkRuntimeLibs(t *testing.T, expected []string, module *Module) { 1089*333d2b36SAndroid Build Coastguard Worker actual := module.Properties.AndroidMkRuntimeLibs 1090*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(actual, expected) { 1091*333d2b36SAndroid Build Coastguard Worker t.Errorf("incorrect runtime_libs for shared libs"+ 1092*333d2b36SAndroid Build Coastguard Worker "\nactual: %v"+ 1093*333d2b36SAndroid Build Coastguard Worker "\nexpected: %v", 1094*333d2b36SAndroid Build Coastguard Worker actual, 1095*333d2b36SAndroid Build Coastguard Worker expected, 1096*333d2b36SAndroid Build Coastguard Worker ) 1097*333d2b36SAndroid Build Coastguard Worker } 1098*333d2b36SAndroid Build Coastguard Worker} 1099*333d2b36SAndroid Build Coastguard Worker 1100*333d2b36SAndroid Build Coastguard Workerconst runtimeLibAndroidBp = ` 1101*333d2b36SAndroid Build Coastguard Worker cc_library { 1102*333d2b36SAndroid Build Coastguard Worker name: "liball_available", 1103*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 1104*333d2b36SAndroid Build Coastguard Worker product_available: true, 1105*333d2b36SAndroid Build Coastguard Worker no_libcrt : true, 1106*333d2b36SAndroid Build Coastguard Worker nocrt : true, 1107*333d2b36SAndroid Build Coastguard Worker system_shared_libs : [], 1108*333d2b36SAndroid Build Coastguard Worker } 1109*333d2b36SAndroid Build Coastguard Worker cc_library { 1110*333d2b36SAndroid Build Coastguard Worker name: "libvendor_available1", 1111*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 1112*333d2b36SAndroid Build Coastguard Worker runtime_libs: ["liball_available"], 1113*333d2b36SAndroid Build Coastguard Worker no_libcrt : true, 1114*333d2b36SAndroid Build Coastguard Worker nocrt : true, 1115*333d2b36SAndroid Build Coastguard Worker system_shared_libs : [], 1116*333d2b36SAndroid Build Coastguard Worker } 1117*333d2b36SAndroid Build Coastguard Worker cc_library { 1118*333d2b36SAndroid Build Coastguard Worker name: "libvendor_available2", 1119*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 1120*333d2b36SAndroid Build Coastguard Worker runtime_libs: ["liball_available"], 1121*333d2b36SAndroid Build Coastguard Worker target: { 1122*333d2b36SAndroid Build Coastguard Worker vendor: { 1123*333d2b36SAndroid Build Coastguard Worker exclude_runtime_libs: ["liball_available"], 1124*333d2b36SAndroid Build Coastguard Worker } 1125*333d2b36SAndroid Build Coastguard Worker }, 1126*333d2b36SAndroid Build Coastguard Worker no_libcrt : true, 1127*333d2b36SAndroid Build Coastguard Worker nocrt : true, 1128*333d2b36SAndroid Build Coastguard Worker system_shared_libs : [], 1129*333d2b36SAndroid Build Coastguard Worker } 1130*333d2b36SAndroid Build Coastguard Worker cc_library { 1131*333d2b36SAndroid Build Coastguard Worker name: "libproduct_vendor", 1132*333d2b36SAndroid Build Coastguard Worker product_specific: true, 1133*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 1134*333d2b36SAndroid Build Coastguard Worker no_libcrt : true, 1135*333d2b36SAndroid Build Coastguard Worker nocrt : true, 1136*333d2b36SAndroid Build Coastguard Worker system_shared_libs : [], 1137*333d2b36SAndroid Build Coastguard Worker } 1138*333d2b36SAndroid Build Coastguard Worker cc_library { 1139*333d2b36SAndroid Build Coastguard Worker name: "libcore", 1140*333d2b36SAndroid Build Coastguard Worker runtime_libs: ["liball_available"], 1141*333d2b36SAndroid Build Coastguard Worker no_libcrt : true, 1142*333d2b36SAndroid Build Coastguard Worker nocrt : true, 1143*333d2b36SAndroid Build Coastguard Worker system_shared_libs : [], 1144*333d2b36SAndroid Build Coastguard Worker } 1145*333d2b36SAndroid Build Coastguard Worker cc_library { 1146*333d2b36SAndroid Build Coastguard Worker name: "libvendor1", 1147*333d2b36SAndroid Build Coastguard Worker vendor: true, 1148*333d2b36SAndroid Build Coastguard Worker no_libcrt : true, 1149*333d2b36SAndroid Build Coastguard Worker nocrt : true, 1150*333d2b36SAndroid Build Coastguard Worker system_shared_libs : [], 1151*333d2b36SAndroid Build Coastguard Worker } 1152*333d2b36SAndroid Build Coastguard Worker cc_library { 1153*333d2b36SAndroid Build Coastguard Worker name: "libvendor2", 1154*333d2b36SAndroid Build Coastguard Worker vendor: true, 1155*333d2b36SAndroid Build Coastguard Worker runtime_libs: ["liball_available", "libvendor1", "libproduct_vendor"], 1156*333d2b36SAndroid Build Coastguard Worker no_libcrt : true, 1157*333d2b36SAndroid Build Coastguard Worker nocrt : true, 1158*333d2b36SAndroid Build Coastguard Worker system_shared_libs : [], 1159*333d2b36SAndroid Build Coastguard Worker } 1160*333d2b36SAndroid Build Coastguard Worker cc_library { 1161*333d2b36SAndroid Build Coastguard Worker name: "libproduct_available1", 1162*333d2b36SAndroid Build Coastguard Worker product_available: true, 1163*333d2b36SAndroid Build Coastguard Worker runtime_libs: ["liball_available"], 1164*333d2b36SAndroid Build Coastguard Worker no_libcrt : true, 1165*333d2b36SAndroid Build Coastguard Worker nocrt : true, 1166*333d2b36SAndroid Build Coastguard Worker system_shared_libs : [], 1167*333d2b36SAndroid Build Coastguard Worker } 1168*333d2b36SAndroid Build Coastguard Worker cc_library { 1169*333d2b36SAndroid Build Coastguard Worker name: "libproduct1", 1170*333d2b36SAndroid Build Coastguard Worker product_specific: true, 1171*333d2b36SAndroid Build Coastguard Worker no_libcrt : true, 1172*333d2b36SAndroid Build Coastguard Worker nocrt : true, 1173*333d2b36SAndroid Build Coastguard Worker system_shared_libs : [], 1174*333d2b36SAndroid Build Coastguard Worker } 1175*333d2b36SAndroid Build Coastguard Worker cc_library { 1176*333d2b36SAndroid Build Coastguard Worker name: "libproduct2", 1177*333d2b36SAndroid Build Coastguard Worker product_specific: true, 1178*333d2b36SAndroid Build Coastguard Worker runtime_libs: ["liball_available", "libproduct1", "libproduct_vendor"], 1179*333d2b36SAndroid Build Coastguard Worker no_libcrt : true, 1180*333d2b36SAndroid Build Coastguard Worker nocrt : true, 1181*333d2b36SAndroid Build Coastguard Worker system_shared_libs : [], 1182*333d2b36SAndroid Build Coastguard Worker } 1183*333d2b36SAndroid Build Coastguard Worker` 1184*333d2b36SAndroid Build Coastguard Worker 1185*333d2b36SAndroid Build Coastguard Workerfunc TestRuntimeLibs(t *testing.T) { 1186*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1187*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, runtimeLibAndroidBp) 1188*333d2b36SAndroid Build Coastguard Worker 1189*333d2b36SAndroid Build Coastguard Worker // runtime_libs for core variants use the module names without suffixes. 1190*333d2b36SAndroid Build Coastguard Worker variant := "android_arm64_armv8-a_shared" 1191*333d2b36SAndroid Build Coastguard Worker 1192*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests("libvendor_available1", variant).Module().(*Module) 1193*333d2b36SAndroid Build Coastguard Worker checkRuntimeLibs(t, []string{"liball_available"}, module) 1194*333d2b36SAndroid Build Coastguard Worker 1195*333d2b36SAndroid Build Coastguard Worker module = ctx.ModuleForTests("libproduct_available1", variant).Module().(*Module) 1196*333d2b36SAndroid Build Coastguard Worker checkRuntimeLibs(t, []string{"liball_available"}, module) 1197*333d2b36SAndroid Build Coastguard Worker 1198*333d2b36SAndroid Build Coastguard Worker module = ctx.ModuleForTests("libcore", variant).Module().(*Module) 1199*333d2b36SAndroid Build Coastguard Worker checkRuntimeLibs(t, []string{"liball_available"}, module) 1200*333d2b36SAndroid Build Coastguard Worker 1201*333d2b36SAndroid Build Coastguard Worker // runtime_libs for vendor variants have '.vendor' suffixes if the modules have both core 1202*333d2b36SAndroid Build Coastguard Worker // and vendor variants. 1203*333d2b36SAndroid Build Coastguard Worker variant = "android_vendor_arm64_armv8-a_shared" 1204*333d2b36SAndroid Build Coastguard Worker 1205*333d2b36SAndroid Build Coastguard Worker module = ctx.ModuleForTests("libvendor_available1", variant).Module().(*Module) 1206*333d2b36SAndroid Build Coastguard Worker checkRuntimeLibs(t, []string{"liball_available.vendor"}, module) 1207*333d2b36SAndroid Build Coastguard Worker 1208*333d2b36SAndroid Build Coastguard Worker module = ctx.ModuleForTests("libvendor2", variant).Module().(*Module) 1209*333d2b36SAndroid Build Coastguard Worker checkRuntimeLibs(t, []string{"liball_available.vendor", "libvendor1", "libproduct_vendor.vendor"}, module) 1210*333d2b36SAndroid Build Coastguard Worker 1211*333d2b36SAndroid Build Coastguard Worker // runtime_libs for product variants have '.product' suffixes if the modules have both core 1212*333d2b36SAndroid Build Coastguard Worker // and product variants. 1213*333d2b36SAndroid Build Coastguard Worker variant = "android_product_arm64_armv8-a_shared" 1214*333d2b36SAndroid Build Coastguard Worker 1215*333d2b36SAndroid Build Coastguard Worker module = ctx.ModuleForTests("libproduct_available1", variant).Module().(*Module) 1216*333d2b36SAndroid Build Coastguard Worker checkRuntimeLibs(t, []string{"liball_available.product"}, module) 1217*333d2b36SAndroid Build Coastguard Worker 1218*333d2b36SAndroid Build Coastguard Worker module = ctx.ModuleForTests("libproduct2", variant).Module().(*Module) 1219*333d2b36SAndroid Build Coastguard Worker checkRuntimeLibs(t, []string{"liball_available.product", "libproduct1", "libproduct_vendor"}, module) 1220*333d2b36SAndroid Build Coastguard Worker} 1221*333d2b36SAndroid Build Coastguard Worker 1222*333d2b36SAndroid Build Coastguard Workerfunc TestExcludeRuntimeLibs(t *testing.T) { 1223*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1224*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, runtimeLibAndroidBp) 1225*333d2b36SAndroid Build Coastguard Worker 1226*333d2b36SAndroid Build Coastguard Worker variant := "android_arm64_armv8-a_shared" 1227*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests("libvendor_available2", variant).Module().(*Module) 1228*333d2b36SAndroid Build Coastguard Worker checkRuntimeLibs(t, []string{"liball_available"}, module) 1229*333d2b36SAndroid Build Coastguard Worker 1230*333d2b36SAndroid Build Coastguard Worker variant = "android_vendor_arm64_armv8-a_shared" 1231*333d2b36SAndroid Build Coastguard Worker module = ctx.ModuleForTests("libvendor_available2", variant).Module().(*Module) 1232*333d2b36SAndroid Build Coastguard Worker checkRuntimeLibs(t, nil, module) 1233*333d2b36SAndroid Build Coastguard Worker} 1234*333d2b36SAndroid Build Coastguard Worker 1235*333d2b36SAndroid Build Coastguard Workerfunc checkStaticLibs(t *testing.T, expected []string, module *Module) { 1236*333d2b36SAndroid Build Coastguard Worker t.Helper() 1237*333d2b36SAndroid Build Coastguard Worker actual := module.Properties.AndroidMkStaticLibs 1238*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(actual, expected) { 1239*333d2b36SAndroid Build Coastguard Worker t.Errorf("incorrect static_libs"+ 1240*333d2b36SAndroid Build Coastguard Worker "\nactual: %v"+ 1241*333d2b36SAndroid Build Coastguard Worker "\nexpected: %v", 1242*333d2b36SAndroid Build Coastguard Worker actual, 1243*333d2b36SAndroid Build Coastguard Worker expected, 1244*333d2b36SAndroid Build Coastguard Worker ) 1245*333d2b36SAndroid Build Coastguard Worker } 1246*333d2b36SAndroid Build Coastguard Worker} 1247*333d2b36SAndroid Build Coastguard Worker 1248*333d2b36SAndroid Build Coastguard Workerconst staticLibAndroidBp = ` 1249*333d2b36SAndroid Build Coastguard Worker cc_library { 1250*333d2b36SAndroid Build Coastguard Worker name: "lib1", 1251*333d2b36SAndroid Build Coastguard Worker } 1252*333d2b36SAndroid Build Coastguard Worker cc_library { 1253*333d2b36SAndroid Build Coastguard Worker name: "lib2", 1254*333d2b36SAndroid Build Coastguard Worker static_libs: ["lib1"], 1255*333d2b36SAndroid Build Coastguard Worker } 1256*333d2b36SAndroid Build Coastguard Worker` 1257*333d2b36SAndroid Build Coastguard Worker 1258*333d2b36SAndroid Build Coastguard Workerfunc TestStaticLibDepExport(t *testing.T) { 1259*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1260*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, staticLibAndroidBp) 1261*333d2b36SAndroid Build Coastguard Worker 1262*333d2b36SAndroid Build Coastguard Worker // Check the shared version of lib2. 1263*333d2b36SAndroid Build Coastguard Worker variant := "android_arm64_armv8-a_shared" 1264*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests("lib2", variant).Module().(*Module) 1265*333d2b36SAndroid Build Coastguard Worker checkStaticLibs(t, []string{"lib1", "libc++demangle", "libclang_rt.builtins"}, module) 1266*333d2b36SAndroid Build Coastguard Worker 1267*333d2b36SAndroid Build Coastguard Worker // Check the static version of lib2. 1268*333d2b36SAndroid Build Coastguard Worker variant = "android_arm64_armv8-a_static" 1269*333d2b36SAndroid Build Coastguard Worker module = ctx.ModuleForTests("lib2", variant).Module().(*Module) 1270*333d2b36SAndroid Build Coastguard Worker // libc++_static is linked additionally. 1271*333d2b36SAndroid Build Coastguard Worker checkStaticLibs(t, []string{"lib1", "libc++_static", "libc++demangle", "libclang_rt.builtins"}, module) 1272*333d2b36SAndroid Build Coastguard Worker} 1273*333d2b36SAndroid Build Coastguard Worker 1274*333d2b36SAndroid Build Coastguard Workervar compilerFlagsTestCases = []struct { 1275*333d2b36SAndroid Build Coastguard Worker in string 1276*333d2b36SAndroid Build Coastguard Worker out bool 1277*333d2b36SAndroid Build Coastguard Worker}{ 1278*333d2b36SAndroid Build Coastguard Worker { 1279*333d2b36SAndroid Build Coastguard Worker in: "a", 1280*333d2b36SAndroid Build Coastguard Worker out: false, 1281*333d2b36SAndroid Build Coastguard Worker }, 1282*333d2b36SAndroid Build Coastguard Worker { 1283*333d2b36SAndroid Build Coastguard Worker in: "-a", 1284*333d2b36SAndroid Build Coastguard Worker out: true, 1285*333d2b36SAndroid Build Coastguard Worker }, 1286*333d2b36SAndroid Build Coastguard Worker { 1287*333d2b36SAndroid Build Coastguard Worker in: "-Ipath/to/something", 1288*333d2b36SAndroid Build Coastguard Worker out: false, 1289*333d2b36SAndroid Build Coastguard Worker }, 1290*333d2b36SAndroid Build Coastguard Worker { 1291*333d2b36SAndroid Build Coastguard Worker in: "-isystempath/to/something", 1292*333d2b36SAndroid Build Coastguard Worker out: false, 1293*333d2b36SAndroid Build Coastguard Worker }, 1294*333d2b36SAndroid Build Coastguard Worker { 1295*333d2b36SAndroid Build Coastguard Worker in: "--coverage", 1296*333d2b36SAndroid Build Coastguard Worker out: false, 1297*333d2b36SAndroid Build Coastguard Worker }, 1298*333d2b36SAndroid Build Coastguard Worker { 1299*333d2b36SAndroid Build Coastguard Worker in: "-include a/b", 1300*333d2b36SAndroid Build Coastguard Worker out: true, 1301*333d2b36SAndroid Build Coastguard Worker }, 1302*333d2b36SAndroid Build Coastguard Worker { 1303*333d2b36SAndroid Build Coastguard Worker in: "-include a/b c/d", 1304*333d2b36SAndroid Build Coastguard Worker out: false, 1305*333d2b36SAndroid Build Coastguard Worker }, 1306*333d2b36SAndroid Build Coastguard Worker { 1307*333d2b36SAndroid Build Coastguard Worker in: "-DMACRO", 1308*333d2b36SAndroid Build Coastguard Worker out: true, 1309*333d2b36SAndroid Build Coastguard Worker }, 1310*333d2b36SAndroid Build Coastguard Worker { 1311*333d2b36SAndroid Build Coastguard Worker in: "-DMAC RO", 1312*333d2b36SAndroid Build Coastguard Worker out: false, 1313*333d2b36SAndroid Build Coastguard Worker }, 1314*333d2b36SAndroid Build Coastguard Worker { 1315*333d2b36SAndroid Build Coastguard Worker in: "-a -b", 1316*333d2b36SAndroid Build Coastguard Worker out: false, 1317*333d2b36SAndroid Build Coastguard Worker }, 1318*333d2b36SAndroid Build Coastguard Worker { 1319*333d2b36SAndroid Build Coastguard Worker in: "-DMACRO=definition", 1320*333d2b36SAndroid Build Coastguard Worker out: true, 1321*333d2b36SAndroid Build Coastguard Worker }, 1322*333d2b36SAndroid Build Coastguard Worker { 1323*333d2b36SAndroid Build Coastguard Worker in: "-DMACRO=defi nition", 1324*333d2b36SAndroid Build Coastguard Worker out: true, // TODO(jiyong): this should be false 1325*333d2b36SAndroid Build Coastguard Worker }, 1326*333d2b36SAndroid Build Coastguard Worker { 1327*333d2b36SAndroid Build Coastguard Worker in: "-DMACRO(x)=x + 1", 1328*333d2b36SAndroid Build Coastguard Worker out: true, 1329*333d2b36SAndroid Build Coastguard Worker }, 1330*333d2b36SAndroid Build Coastguard Worker { 1331*333d2b36SAndroid Build Coastguard Worker in: "-DMACRO=\"defi nition\"", 1332*333d2b36SAndroid Build Coastguard Worker out: true, 1333*333d2b36SAndroid Build Coastguard Worker }, 1334*333d2b36SAndroid Build Coastguard Worker} 1335*333d2b36SAndroid Build Coastguard Worker 1336*333d2b36SAndroid Build Coastguard Workertype mockContext struct { 1337*333d2b36SAndroid Build Coastguard Worker BaseModuleContext 1338*333d2b36SAndroid Build Coastguard Worker result bool 1339*333d2b36SAndroid Build Coastguard Worker} 1340*333d2b36SAndroid Build Coastguard Worker 1341*333d2b36SAndroid Build Coastguard Workerfunc (ctx *mockContext) PropertyErrorf(property, format string, args ...interface{}) { 1342*333d2b36SAndroid Build Coastguard Worker // CheckBadCompilerFlags calls this function when the flag should be rejected 1343*333d2b36SAndroid Build Coastguard Worker ctx.result = false 1344*333d2b36SAndroid Build Coastguard Worker} 1345*333d2b36SAndroid Build Coastguard Worker 1346*333d2b36SAndroid Build Coastguard Workerfunc TestCompilerFlags(t *testing.T) { 1347*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1348*333d2b36SAndroid Build Coastguard Worker for _, testCase := range compilerFlagsTestCases { 1349*333d2b36SAndroid Build Coastguard Worker ctx := &mockContext{result: true} 1350*333d2b36SAndroid Build Coastguard Worker CheckBadCompilerFlags(ctx, "", []string{testCase.in}) 1351*333d2b36SAndroid Build Coastguard Worker if ctx.result != testCase.out { 1352*333d2b36SAndroid Build Coastguard Worker t.Errorf("incorrect output:") 1353*333d2b36SAndroid Build Coastguard Worker t.Errorf(" input: %#v", testCase.in) 1354*333d2b36SAndroid Build Coastguard Worker t.Errorf(" expected: %#v", testCase.out) 1355*333d2b36SAndroid Build Coastguard Worker t.Errorf(" got: %#v", ctx.result) 1356*333d2b36SAndroid Build Coastguard Worker } 1357*333d2b36SAndroid Build Coastguard Worker } 1358*333d2b36SAndroid Build Coastguard Worker} 1359*333d2b36SAndroid Build Coastguard Worker 1360*333d2b36SAndroid Build Coastguard Workerfunc TestRecovery(t *testing.T) { 1361*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1362*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, ` 1363*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 1364*333d2b36SAndroid Build Coastguard Worker name: "librecovery", 1365*333d2b36SAndroid Build Coastguard Worker recovery: true, 1366*333d2b36SAndroid Build Coastguard Worker } 1367*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 1368*333d2b36SAndroid Build Coastguard Worker name: "librecovery32", 1369*333d2b36SAndroid Build Coastguard Worker recovery: true, 1370*333d2b36SAndroid Build Coastguard Worker compile_multilib:"32", 1371*333d2b36SAndroid Build Coastguard Worker } 1372*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 1373*333d2b36SAndroid Build Coastguard Worker name: "libHalInRecovery", 1374*333d2b36SAndroid Build Coastguard Worker recovery_available: true, 1375*333d2b36SAndroid Build Coastguard Worker vendor: true, 1376*333d2b36SAndroid Build Coastguard Worker } 1377*333d2b36SAndroid Build Coastguard Worker `) 1378*333d2b36SAndroid Build Coastguard Worker 1379*333d2b36SAndroid Build Coastguard Worker variants := ctx.ModuleVariantsForTests("librecovery") 1380*333d2b36SAndroid Build Coastguard Worker const arm64 = "android_recovery_arm64_armv8-a_shared" 1381*333d2b36SAndroid Build Coastguard Worker if len(variants) != 1 || !android.InList(arm64, variants) { 1382*333d2b36SAndroid Build Coastguard Worker t.Errorf("variants of librecovery must be \"%s\" only, but was %#v", arm64, variants) 1383*333d2b36SAndroid Build Coastguard Worker } 1384*333d2b36SAndroid Build Coastguard Worker 1385*333d2b36SAndroid Build Coastguard Worker variants = ctx.ModuleVariantsForTests("librecovery32") 1386*333d2b36SAndroid Build Coastguard Worker if android.InList(arm64, variants) { 1387*333d2b36SAndroid Build Coastguard Worker t.Errorf("multilib was set to 32 for librecovery32, but its variants has %s.", arm64) 1388*333d2b36SAndroid Build Coastguard Worker } 1389*333d2b36SAndroid Build Coastguard Worker 1390*333d2b36SAndroid Build Coastguard Worker recoveryModule := ctx.ModuleForTests("libHalInRecovery", recoveryVariant).Module().(*Module) 1391*333d2b36SAndroid Build Coastguard Worker if !recoveryModule.Platform() { 1392*333d2b36SAndroid Build Coastguard Worker t.Errorf("recovery variant of libHalInRecovery must not specific to device, soc, or product") 1393*333d2b36SAndroid Build Coastguard Worker } 1394*333d2b36SAndroid Build Coastguard Worker} 1395*333d2b36SAndroid Build Coastguard Worker 1396*333d2b36SAndroid Build Coastguard Workerfunc TestDataLibsPrebuiltSharedTestLibrary(t *testing.T) { 1397*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1398*333d2b36SAndroid Build Coastguard Worker bp := ` 1399*333d2b36SAndroid Build Coastguard Worker cc_prebuilt_test_library_shared { 1400*333d2b36SAndroid Build Coastguard Worker name: "test_lib", 1401*333d2b36SAndroid Build Coastguard Worker relative_install_path: "foo/bar/baz", 1402*333d2b36SAndroid Build Coastguard Worker srcs: ["srcpath/dontusethispath/baz.so"], 1403*333d2b36SAndroid Build Coastguard Worker } 1404*333d2b36SAndroid Build Coastguard Worker 1405*333d2b36SAndroid Build Coastguard Worker cc_test { 1406*333d2b36SAndroid Build Coastguard Worker name: "main_test", 1407*333d2b36SAndroid Build Coastguard Worker data_libs: ["test_lib"], 1408*333d2b36SAndroid Build Coastguard Worker gtest: false, 1409*333d2b36SAndroid Build Coastguard Worker } 1410*333d2b36SAndroid Build Coastguard Worker ` 1411*333d2b36SAndroid Build Coastguard Worker 1412*333d2b36SAndroid Build Coastguard Worker config := TestConfig(t.TempDir(), android.Android, nil, bp, nil) 1413*333d2b36SAndroid Build Coastguard Worker 1414*333d2b36SAndroid Build Coastguard Worker ctx := testCcWithConfig(t, config) 1415*333d2b36SAndroid Build Coastguard Worker testingModule := ctx.ModuleForTests("main_test", "android_arm_armv7-a-neon") 1416*333d2b36SAndroid Build Coastguard Worker module := testingModule.Module() 1417*333d2b36SAndroid Build Coastguard Worker testBinary := module.(*Module).linker.(*testBinary) 1418*333d2b36SAndroid Build Coastguard Worker outputFiles := testingModule.OutputFiles(ctx, t, "") 1419*333d2b36SAndroid Build Coastguard Worker if len(outputFiles) != 1 { 1420*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected exactly one output file. output files: [%s]", outputFiles) 1421*333d2b36SAndroid Build Coastguard Worker } 1422*333d2b36SAndroid Build Coastguard Worker if len(testBinary.dataPaths()) != 1 { 1423*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected exactly one test data file. test data files: [%v]", testBinary.dataPaths()) 1424*333d2b36SAndroid Build Coastguard Worker } 1425*333d2b36SAndroid Build Coastguard Worker 1426*333d2b36SAndroid Build Coastguard Worker outputPath := outputFiles[0].String() 1427*333d2b36SAndroid Build Coastguard Worker 1428*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(outputPath, "/main_test") { 1429*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected test output file to be 'main_test', but was '%s'", outputPath) 1430*333d2b36SAndroid Build Coastguard Worker } 1431*333d2b36SAndroid Build Coastguard Worker entries := android.AndroidMkInfoForTest(t, ctx, module).PrimaryInfo 1432*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(entries.EntryMap["LOCAL_TEST_DATA"][0], ":test_lib.so:foo/bar/baz") { 1433*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected LOCAL_TEST_DATA to end with `:test_lib.so:foo/bar/baz`,"+ 1434*333d2b36SAndroid Build Coastguard Worker " but was '%s'", entries.EntryMap["LOCAL_TEST_DATA"][0]) 1435*333d2b36SAndroid Build Coastguard Worker } 1436*333d2b36SAndroid Build Coastguard Worker} 1437*333d2b36SAndroid Build Coastguard Worker 1438*333d2b36SAndroid Build Coastguard Workerfunc TestVersionedStubs(t *testing.T) { 1439*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1440*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, ` 1441*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 1442*333d2b36SAndroid Build Coastguard Worker name: "libFoo", 1443*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 1444*333d2b36SAndroid Build Coastguard Worker stubs: { 1445*333d2b36SAndroid Build Coastguard Worker symbol_file: "foo.map.txt", 1446*333d2b36SAndroid Build Coastguard Worker versions: ["1", "2", "3"], 1447*333d2b36SAndroid Build Coastguard Worker }, 1448*333d2b36SAndroid Build Coastguard Worker } 1449*333d2b36SAndroid Build Coastguard Worker 1450*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 1451*333d2b36SAndroid Build Coastguard Worker name: "libBar", 1452*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.c"], 1453*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libFoo#1"], 1454*333d2b36SAndroid Build Coastguard Worker }`) 1455*333d2b36SAndroid Build Coastguard Worker 1456*333d2b36SAndroid Build Coastguard Worker variants := ctx.ModuleVariantsForTests("libFoo") 1457*333d2b36SAndroid Build Coastguard Worker expectedVariants := []string{ 1458*333d2b36SAndroid Build Coastguard Worker "android_arm64_armv8-a_shared", 1459*333d2b36SAndroid Build Coastguard Worker "android_arm64_armv8-a_shared_1", 1460*333d2b36SAndroid Build Coastguard Worker "android_arm64_armv8-a_shared_2", 1461*333d2b36SAndroid Build Coastguard Worker "android_arm64_armv8-a_shared_3", 1462*333d2b36SAndroid Build Coastguard Worker "android_arm64_armv8-a_shared_current", 1463*333d2b36SAndroid Build Coastguard Worker "android_arm_armv7-a-neon_shared", 1464*333d2b36SAndroid Build Coastguard Worker "android_arm_armv7-a-neon_shared_1", 1465*333d2b36SAndroid Build Coastguard Worker "android_arm_armv7-a-neon_shared_2", 1466*333d2b36SAndroid Build Coastguard Worker "android_arm_armv7-a-neon_shared_3", 1467*333d2b36SAndroid Build Coastguard Worker "android_arm_armv7-a-neon_shared_current", 1468*333d2b36SAndroid Build Coastguard Worker } 1469*333d2b36SAndroid Build Coastguard Worker variantsMismatch := false 1470*333d2b36SAndroid Build Coastguard Worker if len(variants) != len(expectedVariants) { 1471*333d2b36SAndroid Build Coastguard Worker variantsMismatch = true 1472*333d2b36SAndroid Build Coastguard Worker } else { 1473*333d2b36SAndroid Build Coastguard Worker for _, v := range expectedVariants { 1474*333d2b36SAndroid Build Coastguard Worker if !inList(v, variants) { 1475*333d2b36SAndroid Build Coastguard Worker variantsMismatch = false 1476*333d2b36SAndroid Build Coastguard Worker } 1477*333d2b36SAndroid Build Coastguard Worker } 1478*333d2b36SAndroid Build Coastguard Worker } 1479*333d2b36SAndroid Build Coastguard Worker if variantsMismatch { 1480*333d2b36SAndroid Build Coastguard Worker t.Errorf("variants of libFoo expected:\n") 1481*333d2b36SAndroid Build Coastguard Worker for _, v := range expectedVariants { 1482*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q\n", v) 1483*333d2b36SAndroid Build Coastguard Worker } 1484*333d2b36SAndroid Build Coastguard Worker t.Errorf(", but got:\n") 1485*333d2b36SAndroid Build Coastguard Worker for _, v := range variants { 1486*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q\n", v) 1487*333d2b36SAndroid Build Coastguard Worker } 1488*333d2b36SAndroid Build Coastguard Worker } 1489*333d2b36SAndroid Build Coastguard Worker 1490*333d2b36SAndroid Build Coastguard Worker libBarLinkRule := ctx.ModuleForTests("libBar", "android_arm64_armv8-a_shared").Rule("ld") 1491*333d2b36SAndroid Build Coastguard Worker libFlags := libBarLinkRule.Args["libFlags"] 1492*333d2b36SAndroid Build Coastguard Worker libFoo1StubPath := "libFoo/android_arm64_armv8-a_shared_1/libFoo.so" 1493*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(libFlags, libFoo1StubPath) { 1494*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q is not found in %q", libFoo1StubPath, libFlags) 1495*333d2b36SAndroid Build Coastguard Worker } 1496*333d2b36SAndroid Build Coastguard Worker 1497*333d2b36SAndroid Build Coastguard Worker libBarCompileRule := ctx.ModuleForTests("libBar", "android_arm64_armv8-a_shared").Rule("cc") 1498*333d2b36SAndroid Build Coastguard Worker cFlags := libBarCompileRule.Args["cFlags"] 1499*333d2b36SAndroid Build Coastguard Worker libFoo1VersioningMacro := "-D__LIBFOO_API__=1" 1500*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, libFoo1VersioningMacro) { 1501*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q is not found in %q", libFoo1VersioningMacro, cFlags) 1502*333d2b36SAndroid Build Coastguard Worker } 1503*333d2b36SAndroid Build Coastguard Worker} 1504*333d2b36SAndroid Build Coastguard Worker 1505*333d2b36SAndroid Build Coastguard Workerfunc TestVersioningMacro(t *testing.T) { 1506*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1507*333d2b36SAndroid Build Coastguard Worker for _, tc := range []struct{ moduleName, expected string }{ 1508*333d2b36SAndroid Build Coastguard Worker {"libc", "__LIBC_API__"}, 1509*333d2b36SAndroid Build Coastguard Worker {"libfoo", "__LIBFOO_API__"}, 1510*333d2b36SAndroid Build Coastguard Worker {"libfoo@1", "__LIBFOO_1_API__"}, 1511*333d2b36SAndroid Build Coastguard Worker {"libfoo-v1", "__LIBFOO_V1_API__"}, 1512*333d2b36SAndroid Build Coastguard Worker {"libfoo.v1", "__LIBFOO_V1_API__"}, 1513*333d2b36SAndroid Build Coastguard Worker } { 1514*333d2b36SAndroid Build Coastguard Worker checkEquals(t, tc.moduleName, tc.expected, versioningMacroName(tc.moduleName)) 1515*333d2b36SAndroid Build Coastguard Worker } 1516*333d2b36SAndroid Build Coastguard Worker} 1517*333d2b36SAndroid Build Coastguard Worker 1518*333d2b36SAndroid Build Coastguard Workerfunc pathsToBase(paths android.Paths) []string { 1519*333d2b36SAndroid Build Coastguard Worker var ret []string 1520*333d2b36SAndroid Build Coastguard Worker for _, p := range paths { 1521*333d2b36SAndroid Build Coastguard Worker ret = append(ret, p.Base()) 1522*333d2b36SAndroid Build Coastguard Worker } 1523*333d2b36SAndroid Build Coastguard Worker return ret 1524*333d2b36SAndroid Build Coastguard Worker} 1525*333d2b36SAndroid Build Coastguard Worker 1526*333d2b36SAndroid Build Coastguard Workerfunc TestStaticLibArchiveArgs(t *testing.T) { 1527*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1528*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, ` 1529*333d2b36SAndroid Build Coastguard Worker cc_library_static { 1530*333d2b36SAndroid Build Coastguard Worker name: "foo", 1531*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 1532*333d2b36SAndroid Build Coastguard Worker } 1533*333d2b36SAndroid Build Coastguard Worker 1534*333d2b36SAndroid Build Coastguard Worker cc_library_static { 1535*333d2b36SAndroid Build Coastguard Worker name: "bar", 1536*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.c"], 1537*333d2b36SAndroid Build Coastguard Worker } 1538*333d2b36SAndroid Build Coastguard Worker 1539*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 1540*333d2b36SAndroid Build Coastguard Worker name: "qux", 1541*333d2b36SAndroid Build Coastguard Worker srcs: ["qux.c"], 1542*333d2b36SAndroid Build Coastguard Worker } 1543*333d2b36SAndroid Build Coastguard Worker 1544*333d2b36SAndroid Build Coastguard Worker cc_library_static { 1545*333d2b36SAndroid Build Coastguard Worker name: "baz", 1546*333d2b36SAndroid Build Coastguard Worker srcs: ["baz.c"], 1547*333d2b36SAndroid Build Coastguard Worker static_libs: ["foo"], 1548*333d2b36SAndroid Build Coastguard Worker shared_libs: ["qux"], 1549*333d2b36SAndroid Build Coastguard Worker whole_static_libs: ["bar"], 1550*333d2b36SAndroid Build Coastguard Worker }`) 1551*333d2b36SAndroid Build Coastguard Worker 1552*333d2b36SAndroid Build Coastguard Worker variant := "android_arm64_armv8-a_static" 1553*333d2b36SAndroid Build Coastguard Worker arRule := ctx.ModuleForTests("baz", variant).Rule("ar") 1554*333d2b36SAndroid Build Coastguard Worker 1555*333d2b36SAndroid Build Coastguard Worker // For static libraries, the object files of a whole static dep are included in the archive 1556*333d2b36SAndroid Build Coastguard Worker // directly 1557*333d2b36SAndroid Build Coastguard Worker if g, w := pathsToBase(arRule.Inputs), []string{"bar.o", "baz.o"}; !reflect.DeepEqual(w, g) { 1558*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected input objects %q, got %q", w, g) 1559*333d2b36SAndroid Build Coastguard Worker } 1560*333d2b36SAndroid Build Coastguard Worker 1561*333d2b36SAndroid Build Coastguard Worker // non whole static dependencies are not linked into the archive 1562*333d2b36SAndroid Build Coastguard Worker if len(arRule.Implicits) > 0 { 1563*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected 0 additional deps, got %q", arRule.Implicits) 1564*333d2b36SAndroid Build Coastguard Worker } 1565*333d2b36SAndroid Build Coastguard Worker} 1566*333d2b36SAndroid Build Coastguard Worker 1567*333d2b36SAndroid Build Coastguard Workerfunc TestSharedLibLinkingArgs(t *testing.T) { 1568*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1569*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, ` 1570*333d2b36SAndroid Build Coastguard Worker cc_library_static { 1571*333d2b36SAndroid Build Coastguard Worker name: "foo", 1572*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 1573*333d2b36SAndroid Build Coastguard Worker } 1574*333d2b36SAndroid Build Coastguard Worker 1575*333d2b36SAndroid Build Coastguard Worker cc_library_static { 1576*333d2b36SAndroid Build Coastguard Worker name: "bar", 1577*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.c"], 1578*333d2b36SAndroid Build Coastguard Worker } 1579*333d2b36SAndroid Build Coastguard Worker 1580*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 1581*333d2b36SAndroid Build Coastguard Worker name: "qux", 1582*333d2b36SAndroid Build Coastguard Worker srcs: ["qux.c"], 1583*333d2b36SAndroid Build Coastguard Worker } 1584*333d2b36SAndroid Build Coastguard Worker 1585*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 1586*333d2b36SAndroid Build Coastguard Worker name: "baz", 1587*333d2b36SAndroid Build Coastguard Worker srcs: ["baz.c"], 1588*333d2b36SAndroid Build Coastguard Worker static_libs: ["foo"], 1589*333d2b36SAndroid Build Coastguard Worker shared_libs: ["qux"], 1590*333d2b36SAndroid Build Coastguard Worker whole_static_libs: ["bar"], 1591*333d2b36SAndroid Build Coastguard Worker }`) 1592*333d2b36SAndroid Build Coastguard Worker 1593*333d2b36SAndroid Build Coastguard Worker variant := "android_arm64_armv8-a_shared" 1594*333d2b36SAndroid Build Coastguard Worker linkRule := ctx.ModuleForTests("baz", variant).Rule("ld") 1595*333d2b36SAndroid Build Coastguard Worker libFlags := linkRule.Args["libFlags"] 1596*333d2b36SAndroid Build Coastguard Worker // When dynamically linking, we expect static dependencies to be found on the command line 1597*333d2b36SAndroid Build Coastguard Worker if expected := "foo.a"; !strings.Contains(libFlags, expected) { 1598*333d2b36SAndroid Build Coastguard Worker t.Errorf("Static lib %q was not found in %q", expected, libFlags) 1599*333d2b36SAndroid Build Coastguard Worker } 1600*333d2b36SAndroid Build Coastguard Worker // When dynamically linking, we expect whole static dependencies to be found on the command line 1601*333d2b36SAndroid Build Coastguard Worker if expected := "bar.a"; !strings.Contains(libFlags, expected) { 1602*333d2b36SAndroid Build Coastguard Worker t.Errorf("Static lib %q was not found in %q", expected, libFlags) 1603*333d2b36SAndroid Build Coastguard Worker } 1604*333d2b36SAndroid Build Coastguard Worker 1605*333d2b36SAndroid Build Coastguard Worker // When dynamically linking, we expect shared dependencies to be found on the command line 1606*333d2b36SAndroid Build Coastguard Worker if expected := "qux.so"; !strings.Contains(libFlags, expected) { 1607*333d2b36SAndroid Build Coastguard Worker t.Errorf("Shared lib %q was not found in %q", expected, libFlags) 1608*333d2b36SAndroid Build Coastguard Worker } 1609*333d2b36SAndroid Build Coastguard Worker 1610*333d2b36SAndroid Build Coastguard Worker // We should only have the objects from the shared library srcs, not the whole static dependencies 1611*333d2b36SAndroid Build Coastguard Worker if g, w := pathsToBase(linkRule.Inputs), []string{"baz.o"}; !reflect.DeepEqual(w, g) { 1612*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected input objects %q, got %q", w, g) 1613*333d2b36SAndroid Build Coastguard Worker } 1614*333d2b36SAndroid Build Coastguard Worker} 1615*333d2b36SAndroid Build Coastguard Worker 1616*333d2b36SAndroid Build Coastguard Workerfunc TestStaticExecutable(t *testing.T) { 1617*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1618*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, ` 1619*333d2b36SAndroid Build Coastguard Worker cc_binary { 1620*333d2b36SAndroid Build Coastguard Worker name: "static_test", 1621*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c", "baz.o"], 1622*333d2b36SAndroid Build Coastguard Worker static_executable: true, 1623*333d2b36SAndroid Build Coastguard Worker }`) 1624*333d2b36SAndroid Build Coastguard Worker 1625*333d2b36SAndroid Build Coastguard Worker variant := "android_arm64_armv8-a" 1626*333d2b36SAndroid Build Coastguard Worker binModuleRule := ctx.ModuleForTests("static_test", variant).Rule("ld") 1627*333d2b36SAndroid Build Coastguard Worker libFlags := binModuleRule.Args["libFlags"] 1628*333d2b36SAndroid Build Coastguard Worker systemStaticLibs := []string{"libc.a", "libm.a"} 1629*333d2b36SAndroid Build Coastguard Worker for _, lib := range systemStaticLibs { 1630*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(libFlags, lib) { 1631*333d2b36SAndroid Build Coastguard Worker t.Errorf("Static lib %q was not found in %q", lib, libFlags) 1632*333d2b36SAndroid Build Coastguard Worker } 1633*333d2b36SAndroid Build Coastguard Worker } 1634*333d2b36SAndroid Build Coastguard Worker systemSharedLibs := []string{"libc.so", "libm.so", "libdl.so"} 1635*333d2b36SAndroid Build Coastguard Worker for _, lib := range systemSharedLibs { 1636*333d2b36SAndroid Build Coastguard Worker if strings.Contains(libFlags, lib) { 1637*333d2b36SAndroid Build Coastguard Worker t.Errorf("Shared lib %q was found in %q", lib, libFlags) 1638*333d2b36SAndroid Build Coastguard Worker } 1639*333d2b36SAndroid Build Coastguard Worker } 1640*333d2b36SAndroid Build Coastguard Worker} 1641*333d2b36SAndroid Build Coastguard Worker 1642*333d2b36SAndroid Build Coastguard Workerfunc TestStaticDepsOrderWithStubs(t *testing.T) { 1643*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1644*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, ` 1645*333d2b36SAndroid Build Coastguard Worker cc_binary { 1646*333d2b36SAndroid Build Coastguard Worker name: "mybin", 1647*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 1648*333d2b36SAndroid Build Coastguard Worker static_libs: ["libfooC", "libfooB"], 1649*333d2b36SAndroid Build Coastguard Worker static_executable: true, 1650*333d2b36SAndroid Build Coastguard Worker stl: "none", 1651*333d2b36SAndroid Build Coastguard Worker } 1652*333d2b36SAndroid Build Coastguard Worker 1653*333d2b36SAndroid Build Coastguard Worker cc_library { 1654*333d2b36SAndroid Build Coastguard Worker name: "libfooB", 1655*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 1656*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libfooC"], 1657*333d2b36SAndroid Build Coastguard Worker stl: "none", 1658*333d2b36SAndroid Build Coastguard Worker } 1659*333d2b36SAndroid Build Coastguard Worker 1660*333d2b36SAndroid Build Coastguard Worker cc_library { 1661*333d2b36SAndroid Build Coastguard Worker name: "libfooC", 1662*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 1663*333d2b36SAndroid Build Coastguard Worker stl: "none", 1664*333d2b36SAndroid Build Coastguard Worker stubs: { 1665*333d2b36SAndroid Build Coastguard Worker versions: ["1"], 1666*333d2b36SAndroid Build Coastguard Worker }, 1667*333d2b36SAndroid Build Coastguard Worker }`) 1668*333d2b36SAndroid Build Coastguard Worker 1669*333d2b36SAndroid Build Coastguard Worker mybin := ctx.ModuleForTests("mybin", "android_arm64_armv8-a").Rule("ld") 1670*333d2b36SAndroid Build Coastguard Worker actual := mybin.Implicits[:2] 1671*333d2b36SAndroid Build Coastguard Worker expected := GetOutputPaths(ctx, "android_arm64_armv8-a_static", []string{"libfooB", "libfooC"}) 1672*333d2b36SAndroid Build Coastguard Worker 1673*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(actual, expected) { 1674*333d2b36SAndroid Build Coastguard Worker t.Errorf("staticDeps orderings were not propagated correctly"+ 1675*333d2b36SAndroid Build Coastguard Worker "\nactual: %v"+ 1676*333d2b36SAndroid Build Coastguard Worker "\nexpected: %v", 1677*333d2b36SAndroid Build Coastguard Worker actual, 1678*333d2b36SAndroid Build Coastguard Worker expected, 1679*333d2b36SAndroid Build Coastguard Worker ) 1680*333d2b36SAndroid Build Coastguard Worker } 1681*333d2b36SAndroid Build Coastguard Worker} 1682*333d2b36SAndroid Build Coastguard Worker 1683*333d2b36SAndroid Build Coastguard Workerfunc TestErrorsIfAModuleDependsOnDisabled(t *testing.T) { 1684*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1685*333d2b36SAndroid Build Coastguard Worker testCcError(t, `module "libA" .* depends on disabled module "libB"`, ` 1686*333d2b36SAndroid Build Coastguard Worker cc_library { 1687*333d2b36SAndroid Build Coastguard Worker name: "libA", 1688*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 1689*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libB"], 1690*333d2b36SAndroid Build Coastguard Worker stl: "none", 1691*333d2b36SAndroid Build Coastguard Worker } 1692*333d2b36SAndroid Build Coastguard Worker 1693*333d2b36SAndroid Build Coastguard Worker cc_library { 1694*333d2b36SAndroid Build Coastguard Worker name: "libB", 1695*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 1696*333d2b36SAndroid Build Coastguard Worker enabled: false, 1697*333d2b36SAndroid Build Coastguard Worker stl: "none", 1698*333d2b36SAndroid Build Coastguard Worker } 1699*333d2b36SAndroid Build Coastguard Worker `) 1700*333d2b36SAndroid Build Coastguard Worker} 1701*333d2b36SAndroid Build Coastguard Worker 1702*333d2b36SAndroid Build Coastguard Workerfunc VerifyAFLFuzzTargetVariant(t *testing.T, variant string) { 1703*333d2b36SAndroid Build Coastguard Worker bp := ` 1704*333d2b36SAndroid Build Coastguard Worker cc_fuzz { 1705*333d2b36SAndroid Build Coastguard Worker name: "test_afl_fuzz_target", 1706*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 1707*333d2b36SAndroid Build Coastguard Worker host_supported: true, 1708*333d2b36SAndroid Build Coastguard Worker static_libs: [ 1709*333d2b36SAndroid Build Coastguard Worker "afl_fuzz_static_lib", 1710*333d2b36SAndroid Build Coastguard Worker ], 1711*333d2b36SAndroid Build Coastguard Worker shared_libs: [ 1712*333d2b36SAndroid Build Coastguard Worker "afl_fuzz_shared_lib", 1713*333d2b36SAndroid Build Coastguard Worker ], 1714*333d2b36SAndroid Build Coastguard Worker fuzzing_frameworks: { 1715*333d2b36SAndroid Build Coastguard Worker afl: true, 1716*333d2b36SAndroid Build Coastguard Worker libfuzzer: false, 1717*333d2b36SAndroid Build Coastguard Worker }, 1718*333d2b36SAndroid Build Coastguard Worker } 1719*333d2b36SAndroid Build Coastguard Worker cc_library { 1720*333d2b36SAndroid Build Coastguard Worker name: "afl_fuzz_static_lib", 1721*333d2b36SAndroid Build Coastguard Worker host_supported: true, 1722*333d2b36SAndroid Build Coastguard Worker srcs: ["static_file.c"], 1723*333d2b36SAndroid Build Coastguard Worker } 1724*333d2b36SAndroid Build Coastguard Worker cc_library { 1725*333d2b36SAndroid Build Coastguard Worker name: "libfuzzer_only_static_lib", 1726*333d2b36SAndroid Build Coastguard Worker host_supported: true, 1727*333d2b36SAndroid Build Coastguard Worker srcs: ["static_file.c"], 1728*333d2b36SAndroid Build Coastguard Worker } 1729*333d2b36SAndroid Build Coastguard Worker cc_library { 1730*333d2b36SAndroid Build Coastguard Worker name: "afl_fuzz_shared_lib", 1731*333d2b36SAndroid Build Coastguard Worker host_supported: true, 1732*333d2b36SAndroid Build Coastguard Worker srcs: ["shared_file.c"], 1733*333d2b36SAndroid Build Coastguard Worker static_libs: [ 1734*333d2b36SAndroid Build Coastguard Worker "second_static_lib", 1735*333d2b36SAndroid Build Coastguard Worker ], 1736*333d2b36SAndroid Build Coastguard Worker } 1737*333d2b36SAndroid Build Coastguard Worker cc_library_headers { 1738*333d2b36SAndroid Build Coastguard Worker name: "libafl_headers", 1739*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 1740*333d2b36SAndroid Build Coastguard Worker host_supported: true, 1741*333d2b36SAndroid Build Coastguard Worker export_include_dirs: [ 1742*333d2b36SAndroid Build Coastguard Worker "include", 1743*333d2b36SAndroid Build Coastguard Worker "instrumentation", 1744*333d2b36SAndroid Build Coastguard Worker ], 1745*333d2b36SAndroid Build Coastguard Worker } 1746*333d2b36SAndroid Build Coastguard Worker cc_object { 1747*333d2b36SAndroid Build Coastguard Worker name: "afl-compiler-rt", 1748*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 1749*333d2b36SAndroid Build Coastguard Worker host_supported: true, 1750*333d2b36SAndroid Build Coastguard Worker cflags: [ 1751*333d2b36SAndroid Build Coastguard Worker "-fPIC", 1752*333d2b36SAndroid Build Coastguard Worker ], 1753*333d2b36SAndroid Build Coastguard Worker srcs: [ 1754*333d2b36SAndroid Build Coastguard Worker "instrumentation/afl-compiler-rt.o.c", 1755*333d2b36SAndroid Build Coastguard Worker ], 1756*333d2b36SAndroid Build Coastguard Worker } 1757*333d2b36SAndroid Build Coastguard Worker cc_library { 1758*333d2b36SAndroid Build Coastguard Worker name: "second_static_lib", 1759*333d2b36SAndroid Build Coastguard Worker host_supported: true, 1760*333d2b36SAndroid Build Coastguard Worker srcs: ["second_file.c"], 1761*333d2b36SAndroid Build Coastguard Worker } 1762*333d2b36SAndroid Build Coastguard Worker cc_object { 1763*333d2b36SAndroid Build Coastguard Worker name: "aflpp_driver", 1764*333d2b36SAndroid Build Coastguard Worker host_supported: true, 1765*333d2b36SAndroid Build Coastguard Worker srcs: [ 1766*333d2b36SAndroid Build Coastguard Worker "aflpp_driver.c", 1767*333d2b36SAndroid Build Coastguard Worker ], 1768*333d2b36SAndroid Build Coastguard Worker }` 1769*333d2b36SAndroid Build Coastguard Worker 1770*333d2b36SAndroid Build Coastguard Worker testEnv := map[string]string{ 1771*333d2b36SAndroid Build Coastguard Worker "FUZZ_FRAMEWORK": "AFL", 1772*333d2b36SAndroid Build Coastguard Worker } 1773*333d2b36SAndroid Build Coastguard Worker 1774*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers(prepareForCcTest, android.FixtureMergeEnv(testEnv)).RunTestWithBp(t, bp) 1775*333d2b36SAndroid Build Coastguard Worker 1776*333d2b36SAndroid Build Coastguard Worker checkPcGuardFlag := func( 1777*333d2b36SAndroid Build Coastguard Worker modName string, variantName string, shouldHave bool) { 1778*333d2b36SAndroid Build Coastguard Worker cc := ctx.ModuleForTests(modName, variantName).Rule("cc") 1779*333d2b36SAndroid Build Coastguard Worker 1780*333d2b36SAndroid Build Coastguard Worker cFlags, ok := cc.Args["cFlags"] 1781*333d2b36SAndroid Build Coastguard Worker if !ok { 1782*333d2b36SAndroid Build Coastguard Worker t.Errorf("Could not find cFlags for module %s and variant %s", 1783*333d2b36SAndroid Build Coastguard Worker modName, variantName) 1784*333d2b36SAndroid Build Coastguard Worker } 1785*333d2b36SAndroid Build Coastguard Worker 1786*333d2b36SAndroid Build Coastguard Worker if strings.Contains( 1787*333d2b36SAndroid Build Coastguard Worker cFlags, "-fsanitize-coverage=trace-pc-guard") != shouldHave { 1788*333d2b36SAndroid Build Coastguard Worker t.Errorf("Flag was found: %t. Expected to find flag: %t. "+ 1789*333d2b36SAndroid Build Coastguard Worker "Test failed for module %s and variant %s", 1790*333d2b36SAndroid Build Coastguard Worker !shouldHave, shouldHave, modName, variantName) 1791*333d2b36SAndroid Build Coastguard Worker } 1792*333d2b36SAndroid Build Coastguard Worker } 1793*333d2b36SAndroid Build Coastguard Worker 1794*333d2b36SAndroid Build Coastguard Worker moduleName := "test_afl_fuzz_target" 1795*333d2b36SAndroid Build Coastguard Worker checkPcGuardFlag(moduleName, variant+"_fuzzer", true) 1796*333d2b36SAndroid Build Coastguard Worker 1797*333d2b36SAndroid Build Coastguard Worker moduleName = "afl_fuzz_static_lib" 1798*333d2b36SAndroid Build Coastguard Worker checkPcGuardFlag(moduleName, variant+"_static", false) 1799*333d2b36SAndroid Build Coastguard Worker checkPcGuardFlag(moduleName, variant+"_static_fuzzer_afl", true) 1800*333d2b36SAndroid Build Coastguard Worker 1801*333d2b36SAndroid Build Coastguard Worker moduleName = "second_static_lib" 1802*333d2b36SAndroid Build Coastguard Worker checkPcGuardFlag(moduleName, variant+"_static", false) 1803*333d2b36SAndroid Build Coastguard Worker checkPcGuardFlag(moduleName, variant+"_static_fuzzer_afl", true) 1804*333d2b36SAndroid Build Coastguard Worker 1805*333d2b36SAndroid Build Coastguard Worker ctx.ModuleForTests("afl_fuzz_shared_lib", 1806*333d2b36SAndroid Build Coastguard Worker "android_arm64_armv8-a_shared").Rule("cc") 1807*333d2b36SAndroid Build Coastguard Worker ctx.ModuleForTests("afl_fuzz_shared_lib", 1808*333d2b36SAndroid Build Coastguard Worker "android_arm64_armv8-a_shared_fuzzer").Rule("cc") 1809*333d2b36SAndroid Build Coastguard Worker} 1810*333d2b36SAndroid Build Coastguard Worker 1811*333d2b36SAndroid Build Coastguard Workerfunc TestAFLFuzzTargetForDevice(t *testing.T) { 1812*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1813*333d2b36SAndroid Build Coastguard Worker VerifyAFLFuzzTargetVariant(t, "android_arm64_armv8-a") 1814*333d2b36SAndroid Build Coastguard Worker} 1815*333d2b36SAndroid Build Coastguard Worker 1816*333d2b36SAndroid Build Coastguard Workerfunc TestAFLFuzzTargetForLinuxHost(t *testing.T) { 1817*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1818*333d2b36SAndroid Build Coastguard Worker if runtime.GOOS != "linux" { 1819*333d2b36SAndroid Build Coastguard Worker t.Skip("requires linux") 1820*333d2b36SAndroid Build Coastguard Worker } 1821*333d2b36SAndroid Build Coastguard Worker 1822*333d2b36SAndroid Build Coastguard Worker VerifyAFLFuzzTargetVariant(t, "linux_glibc_x86_64") 1823*333d2b36SAndroid Build Coastguard Worker} 1824*333d2b36SAndroid Build Coastguard Worker 1825*333d2b36SAndroid Build Coastguard Worker// Simple smoke test for the cc_fuzz target that ensures the rule compiles 1826*333d2b36SAndroid Build Coastguard Worker// correctly. 1827*333d2b36SAndroid Build Coastguard Workerfunc TestFuzzTarget(t *testing.T) { 1828*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1829*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, ` 1830*333d2b36SAndroid Build Coastguard Worker cc_fuzz { 1831*333d2b36SAndroid Build Coastguard Worker name: "fuzz_smoke_test", 1832*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 1833*333d2b36SAndroid Build Coastguard Worker }`) 1834*333d2b36SAndroid Build Coastguard Worker 1835*333d2b36SAndroid Build Coastguard Worker variant := "android_arm64_armv8-a_fuzzer" 1836*333d2b36SAndroid Build Coastguard Worker ctx.ModuleForTests("fuzz_smoke_test", variant).Rule("cc") 1837*333d2b36SAndroid Build Coastguard Worker} 1838*333d2b36SAndroid Build Coastguard Worker 1839*333d2b36SAndroid Build Coastguard Workerfunc assertString(t *testing.T, got, expected string) { 1840*333d2b36SAndroid Build Coastguard Worker t.Helper() 1841*333d2b36SAndroid Build Coastguard Worker if got != expected { 1842*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected %q got %q", expected, got) 1843*333d2b36SAndroid Build Coastguard Worker } 1844*333d2b36SAndroid Build Coastguard Worker} 1845*333d2b36SAndroid Build Coastguard Worker 1846*333d2b36SAndroid Build Coastguard Workerfunc assertArrayString(t *testing.T, got, expected []string) { 1847*333d2b36SAndroid Build Coastguard Worker t.Helper() 1848*333d2b36SAndroid Build Coastguard Worker if len(got) != len(expected) { 1849*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected %d (%q) got (%d) %q", len(expected), expected, len(got), got) 1850*333d2b36SAndroid Build Coastguard Worker return 1851*333d2b36SAndroid Build Coastguard Worker } 1852*333d2b36SAndroid Build Coastguard Worker for i := range got { 1853*333d2b36SAndroid Build Coastguard Worker if got[i] != expected[i] { 1854*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected %d-th %q (%q) got %q (%q)", 1855*333d2b36SAndroid Build Coastguard Worker i, expected[i], expected, got[i], got) 1856*333d2b36SAndroid Build Coastguard Worker return 1857*333d2b36SAndroid Build Coastguard Worker } 1858*333d2b36SAndroid Build Coastguard Worker } 1859*333d2b36SAndroid Build Coastguard Worker} 1860*333d2b36SAndroid Build Coastguard Worker 1861*333d2b36SAndroid Build Coastguard Workerfunc assertMapKeys(t *testing.T, m map[string]string, expected []string) { 1862*333d2b36SAndroid Build Coastguard Worker t.Helper() 1863*333d2b36SAndroid Build Coastguard Worker assertArrayString(t, android.SortedKeys(m), expected) 1864*333d2b36SAndroid Build Coastguard Worker} 1865*333d2b36SAndroid Build Coastguard Worker 1866*333d2b36SAndroid Build Coastguard Workerfunc TestDefaults(t *testing.T) { 1867*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1868*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, ` 1869*333d2b36SAndroid Build Coastguard Worker cc_defaults { 1870*333d2b36SAndroid Build Coastguard Worker name: "defaults", 1871*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 1872*333d2b36SAndroid Build Coastguard Worker static: { 1873*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.c"], 1874*333d2b36SAndroid Build Coastguard Worker }, 1875*333d2b36SAndroid Build Coastguard Worker shared: { 1876*333d2b36SAndroid Build Coastguard Worker srcs: ["baz.c"], 1877*333d2b36SAndroid Build Coastguard Worker }, 1878*333d2b36SAndroid Build Coastguard Worker } 1879*333d2b36SAndroid Build Coastguard Worker 1880*333d2b36SAndroid Build Coastguard Worker cc_library_static { 1881*333d2b36SAndroid Build Coastguard Worker name: "libstatic", 1882*333d2b36SAndroid Build Coastguard Worker defaults: ["defaults"], 1883*333d2b36SAndroid Build Coastguard Worker } 1884*333d2b36SAndroid Build Coastguard Worker 1885*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 1886*333d2b36SAndroid Build Coastguard Worker name: "libshared", 1887*333d2b36SAndroid Build Coastguard Worker defaults: ["defaults"], 1888*333d2b36SAndroid Build Coastguard Worker } 1889*333d2b36SAndroid Build Coastguard Worker 1890*333d2b36SAndroid Build Coastguard Worker cc_library { 1891*333d2b36SAndroid Build Coastguard Worker name: "libboth", 1892*333d2b36SAndroid Build Coastguard Worker defaults: ["defaults"], 1893*333d2b36SAndroid Build Coastguard Worker } 1894*333d2b36SAndroid Build Coastguard Worker 1895*333d2b36SAndroid Build Coastguard Worker cc_binary { 1896*333d2b36SAndroid Build Coastguard Worker name: "binary", 1897*333d2b36SAndroid Build Coastguard Worker defaults: ["defaults"], 1898*333d2b36SAndroid Build Coastguard Worker }`) 1899*333d2b36SAndroid Build Coastguard Worker 1900*333d2b36SAndroid Build Coastguard Worker shared := ctx.ModuleForTests("libshared", "android_arm64_armv8-a_shared").Rule("ld") 1901*333d2b36SAndroid Build Coastguard Worker if g, w := pathsToBase(shared.Inputs), []string{"foo.o", "baz.o"}; !reflect.DeepEqual(w, g) { 1902*333d2b36SAndroid Build Coastguard Worker t.Errorf("libshared ld rule wanted %q, got %q", w, g) 1903*333d2b36SAndroid Build Coastguard Worker } 1904*333d2b36SAndroid Build Coastguard Worker bothShared := ctx.ModuleForTests("libboth", "android_arm64_armv8-a_shared").Rule("ld") 1905*333d2b36SAndroid Build Coastguard Worker if g, w := pathsToBase(bothShared.Inputs), []string{"foo.o", "baz.o"}; !reflect.DeepEqual(w, g) { 1906*333d2b36SAndroid Build Coastguard Worker t.Errorf("libboth ld rule wanted %q, got %q", w, g) 1907*333d2b36SAndroid Build Coastguard Worker } 1908*333d2b36SAndroid Build Coastguard Worker binary := ctx.ModuleForTests("binary", "android_arm64_armv8-a").Rule("ld") 1909*333d2b36SAndroid Build Coastguard Worker if g, w := pathsToBase(binary.Inputs), []string{"foo.o"}; !reflect.DeepEqual(w, g) { 1910*333d2b36SAndroid Build Coastguard Worker t.Errorf("binary ld rule wanted %q, got %q", w, g) 1911*333d2b36SAndroid Build Coastguard Worker } 1912*333d2b36SAndroid Build Coastguard Worker 1913*333d2b36SAndroid Build Coastguard Worker static := ctx.ModuleForTests("libstatic", "android_arm64_armv8-a_static").Rule("ar") 1914*333d2b36SAndroid Build Coastguard Worker if g, w := pathsToBase(static.Inputs), []string{"foo.o", "bar.o"}; !reflect.DeepEqual(w, g) { 1915*333d2b36SAndroid Build Coastguard Worker t.Errorf("libstatic ar rule wanted %q, got %q", w, g) 1916*333d2b36SAndroid Build Coastguard Worker } 1917*333d2b36SAndroid Build Coastguard Worker bothStatic := ctx.ModuleForTests("libboth", "android_arm64_armv8-a_static").Rule("ar") 1918*333d2b36SAndroid Build Coastguard Worker if g, w := pathsToBase(bothStatic.Inputs), []string{"foo.o", "bar.o"}; !reflect.DeepEqual(w, g) { 1919*333d2b36SAndroid Build Coastguard Worker t.Errorf("libboth ar rule wanted %q, got %q", w, g) 1920*333d2b36SAndroid Build Coastguard Worker } 1921*333d2b36SAndroid Build Coastguard Worker} 1922*333d2b36SAndroid Build Coastguard Worker 1923*333d2b36SAndroid Build Coastguard Workerfunc TestProductVariableDefaults(t *testing.T) { 1924*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1925*333d2b36SAndroid Build Coastguard Worker bp := ` 1926*333d2b36SAndroid Build Coastguard Worker cc_defaults { 1927*333d2b36SAndroid Build Coastguard Worker name: "libfoo_defaults", 1928*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 1929*333d2b36SAndroid Build Coastguard Worker cppflags: ["-DFOO"], 1930*333d2b36SAndroid Build Coastguard Worker product_variables: { 1931*333d2b36SAndroid Build Coastguard Worker debuggable: { 1932*333d2b36SAndroid Build Coastguard Worker cppflags: ["-DBAR"], 1933*333d2b36SAndroid Build Coastguard Worker }, 1934*333d2b36SAndroid Build Coastguard Worker }, 1935*333d2b36SAndroid Build Coastguard Worker } 1936*333d2b36SAndroid Build Coastguard Worker 1937*333d2b36SAndroid Build Coastguard Worker cc_library { 1938*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 1939*333d2b36SAndroid Build Coastguard Worker defaults: ["libfoo_defaults"], 1940*333d2b36SAndroid Build Coastguard Worker } 1941*333d2b36SAndroid Build Coastguard Worker ` 1942*333d2b36SAndroid Build Coastguard Worker 1943*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 1944*333d2b36SAndroid Build Coastguard Worker prepareForCcTest, 1945*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithVariables, 1946*333d2b36SAndroid Build Coastguard Worker 1947*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 1948*333d2b36SAndroid Build Coastguard Worker variables.Debuggable = BoolPtr(true) 1949*333d2b36SAndroid Build Coastguard Worker }), 1950*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 1951*333d2b36SAndroid Build Coastguard Worker 1952*333d2b36SAndroid Build Coastguard Worker libfoo := result.Module("libfoo", "android_arm64_armv8-a_static").(*Module) 1953*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "cppflags", libfoo.flags.Local.CppFlags, "-DBAR") 1954*333d2b36SAndroid Build Coastguard Worker} 1955*333d2b36SAndroid Build Coastguard Worker 1956*333d2b36SAndroid Build Coastguard Workerfunc TestEmptyWholeStaticLibsAllowMissingDependencies(t *testing.T) { 1957*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1958*333d2b36SAndroid Build Coastguard Worker bp := ` 1959*333d2b36SAndroid Build Coastguard Worker cc_library_static { 1960*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 1961*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 1962*333d2b36SAndroid Build Coastguard Worker whole_static_libs: ["libbar"], 1963*333d2b36SAndroid Build Coastguard Worker } 1964*333d2b36SAndroid Build Coastguard Worker 1965*333d2b36SAndroid Build Coastguard Worker cc_library_static { 1966*333d2b36SAndroid Build Coastguard Worker name: "libbar", 1967*333d2b36SAndroid Build Coastguard Worker whole_static_libs: ["libmissing"], 1968*333d2b36SAndroid Build Coastguard Worker } 1969*333d2b36SAndroid Build Coastguard Worker ` 1970*333d2b36SAndroid Build Coastguard Worker 1971*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 1972*333d2b36SAndroid Build Coastguard Worker prepareForCcTest, 1973*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithAllowMissingDependencies, 1974*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 1975*333d2b36SAndroid Build Coastguard Worker 1976*333d2b36SAndroid Build Coastguard Worker libbar := result.ModuleForTests("libbar", "android_arm64_armv8-a_static").Output("libbar.a") 1977*333d2b36SAndroid Build Coastguard Worker android.AssertDeepEquals(t, "libbar rule", android.ErrorRule, libbar.Rule) 1978*333d2b36SAndroid Build Coastguard Worker 1979*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "libbar error", libbar.Args["error"], "missing dependencies: libmissing") 1980*333d2b36SAndroid Build Coastguard Worker 1981*333d2b36SAndroid Build Coastguard Worker libfoo := result.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Output("libfoo.a") 1982*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "libfoo.a dependencies", libfoo.Inputs.Strings(), libbar.Output.String()) 1983*333d2b36SAndroid Build Coastguard Worker} 1984*333d2b36SAndroid Build Coastguard Worker 1985*333d2b36SAndroid Build Coastguard Workerfunc TestInstallSharedLibs(t *testing.T) { 1986*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1987*333d2b36SAndroid Build Coastguard Worker bp := ` 1988*333d2b36SAndroid Build Coastguard Worker cc_binary { 1989*333d2b36SAndroid Build Coastguard Worker name: "bin", 1990*333d2b36SAndroid Build Coastguard Worker host_supported: true, 1991*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libshared"], 1992*333d2b36SAndroid Build Coastguard Worker runtime_libs: ["libruntime"], 1993*333d2b36SAndroid Build Coastguard Worker srcs: [":gen"], 1994*333d2b36SAndroid Build Coastguard Worker } 1995*333d2b36SAndroid Build Coastguard Worker 1996*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 1997*333d2b36SAndroid Build Coastguard Worker name: "libshared", 1998*333d2b36SAndroid Build Coastguard Worker host_supported: true, 1999*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libtransitive"], 2000*333d2b36SAndroid Build Coastguard Worker } 2001*333d2b36SAndroid Build Coastguard Worker 2002*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 2003*333d2b36SAndroid Build Coastguard Worker name: "libtransitive", 2004*333d2b36SAndroid Build Coastguard Worker host_supported: true, 2005*333d2b36SAndroid Build Coastguard Worker } 2006*333d2b36SAndroid Build Coastguard Worker 2007*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 2008*333d2b36SAndroid Build Coastguard Worker name: "libruntime", 2009*333d2b36SAndroid Build Coastguard Worker host_supported: true, 2010*333d2b36SAndroid Build Coastguard Worker } 2011*333d2b36SAndroid Build Coastguard Worker 2012*333d2b36SAndroid Build Coastguard Worker cc_binary_host { 2013*333d2b36SAndroid Build Coastguard Worker name: "tool", 2014*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.cpp"], 2015*333d2b36SAndroid Build Coastguard Worker } 2016*333d2b36SAndroid Build Coastguard Worker 2017*333d2b36SAndroid Build Coastguard Worker genrule { 2018*333d2b36SAndroid Build Coastguard Worker name: "gen", 2019*333d2b36SAndroid Build Coastguard Worker tools: ["tool"], 2020*333d2b36SAndroid Build Coastguard Worker out: ["gen.cpp"], 2021*333d2b36SAndroid Build Coastguard Worker cmd: "$(location tool) $(out)", 2022*333d2b36SAndroid Build Coastguard Worker } 2023*333d2b36SAndroid Build Coastguard Worker ` 2024*333d2b36SAndroid Build Coastguard Worker 2025*333d2b36SAndroid Build Coastguard Worker config := TestConfig(t.TempDir(), android.Android, nil, bp, nil) 2026*333d2b36SAndroid Build Coastguard Worker ctx := testCcWithConfig(t, config) 2027*333d2b36SAndroid Build Coastguard Worker 2028*333d2b36SAndroid Build Coastguard Worker hostBin := ctx.ModuleForTests("bin", config.BuildOSTarget.String()).Description("install") 2029*333d2b36SAndroid Build Coastguard Worker hostShared := ctx.ModuleForTests("libshared", config.BuildOSTarget.String()+"_shared").Description("install") 2030*333d2b36SAndroid Build Coastguard Worker hostRuntime := ctx.ModuleForTests("libruntime", config.BuildOSTarget.String()+"_shared").Description("install") 2031*333d2b36SAndroid Build Coastguard Worker hostTransitive := ctx.ModuleForTests("libtransitive", config.BuildOSTarget.String()+"_shared").Description("install") 2032*333d2b36SAndroid Build Coastguard Worker hostTool := ctx.ModuleForTests("tool", config.BuildOSTarget.String()).Description("install") 2033*333d2b36SAndroid Build Coastguard Worker 2034*333d2b36SAndroid Build Coastguard Worker if g, w := hostBin.Implicits.Strings(), hostShared.Output.String(); !android.InList(w, g) { 2035*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected host bin dependency %q, got %q", w, g) 2036*333d2b36SAndroid Build Coastguard Worker } 2037*333d2b36SAndroid Build Coastguard Worker 2038*333d2b36SAndroid Build Coastguard Worker if g, w := hostBin.Implicits.Strings(), hostTransitive.Output.String(); !android.InList(w, g) { 2039*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected host bin dependency %q, got %q", w, g) 2040*333d2b36SAndroid Build Coastguard Worker } 2041*333d2b36SAndroid Build Coastguard Worker 2042*333d2b36SAndroid Build Coastguard Worker if g, w := hostShared.Implicits.Strings(), hostTransitive.Output.String(); !android.InList(w, g) { 2043*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected host bin dependency %q, got %q", w, g) 2044*333d2b36SAndroid Build Coastguard Worker } 2045*333d2b36SAndroid Build Coastguard Worker 2046*333d2b36SAndroid Build Coastguard Worker if g, w := hostBin.Implicits.Strings(), hostRuntime.Output.String(); !android.InList(w, g) { 2047*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected host bin dependency %q, got %q", w, g) 2048*333d2b36SAndroid Build Coastguard Worker } 2049*333d2b36SAndroid Build Coastguard Worker 2050*333d2b36SAndroid Build Coastguard Worker if g, w := hostBin.Implicits.Strings(), hostTool.Output.String(); android.InList(w, g) { 2051*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected no host bin dependency %q, got %q", w, g) 2052*333d2b36SAndroid Build Coastguard Worker } 2053*333d2b36SAndroid Build Coastguard Worker 2054*333d2b36SAndroid Build Coastguard Worker deviceBin := ctx.ModuleForTests("bin", "android_arm64_armv8-a").Description("install") 2055*333d2b36SAndroid Build Coastguard Worker deviceShared := ctx.ModuleForTests("libshared", "android_arm64_armv8-a_shared").Description("install") 2056*333d2b36SAndroid Build Coastguard Worker deviceTransitive := ctx.ModuleForTests("libtransitive", "android_arm64_armv8-a_shared").Description("install") 2057*333d2b36SAndroid Build Coastguard Worker deviceRuntime := ctx.ModuleForTests("libruntime", "android_arm64_armv8-a_shared").Description("install") 2058*333d2b36SAndroid Build Coastguard Worker 2059*333d2b36SAndroid Build Coastguard Worker if g, w := deviceBin.OrderOnly.Strings(), deviceShared.Output.String(); !android.InList(w, g) { 2060*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected device bin dependency %q, got %q", w, g) 2061*333d2b36SAndroid Build Coastguard Worker } 2062*333d2b36SAndroid Build Coastguard Worker 2063*333d2b36SAndroid Build Coastguard Worker if g, w := deviceBin.OrderOnly.Strings(), deviceTransitive.Output.String(); !android.InList(w, g) { 2064*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected device bin dependency %q, got %q", w, g) 2065*333d2b36SAndroid Build Coastguard Worker } 2066*333d2b36SAndroid Build Coastguard Worker 2067*333d2b36SAndroid Build Coastguard Worker if g, w := deviceShared.OrderOnly.Strings(), deviceTransitive.Output.String(); !android.InList(w, g) { 2068*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected device bin dependency %q, got %q", w, g) 2069*333d2b36SAndroid Build Coastguard Worker } 2070*333d2b36SAndroid Build Coastguard Worker 2071*333d2b36SAndroid Build Coastguard Worker if g, w := deviceBin.OrderOnly.Strings(), deviceRuntime.Output.String(); !android.InList(w, g) { 2072*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected device bin dependency %q, got %q", w, g) 2073*333d2b36SAndroid Build Coastguard Worker } 2074*333d2b36SAndroid Build Coastguard Worker 2075*333d2b36SAndroid Build Coastguard Worker if g, w := deviceBin.OrderOnly.Strings(), hostTool.Output.String(); android.InList(w, g) { 2076*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected no device bin dependency %q, got %q", w, g) 2077*333d2b36SAndroid Build Coastguard Worker } 2078*333d2b36SAndroid Build Coastguard Worker 2079*333d2b36SAndroid Build Coastguard Worker} 2080*333d2b36SAndroid Build Coastguard Worker 2081*333d2b36SAndroid Build Coastguard Workerfunc TestStubsLibReexportsHeaders(t *testing.T) { 2082*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2083*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, ` 2084*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 2085*333d2b36SAndroid Build Coastguard Worker name: "libclient", 2086*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 2087*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libfoo#1"], 2088*333d2b36SAndroid Build Coastguard Worker } 2089*333d2b36SAndroid Build Coastguard Worker 2090*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 2091*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 2092*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 2093*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbar"], 2094*333d2b36SAndroid Build Coastguard Worker export_shared_lib_headers: ["libbar"], 2095*333d2b36SAndroid Build Coastguard Worker stubs: { 2096*333d2b36SAndroid Build Coastguard Worker symbol_file: "foo.map.txt", 2097*333d2b36SAndroid Build Coastguard Worker versions: ["1", "2", "3"], 2098*333d2b36SAndroid Build Coastguard Worker }, 2099*333d2b36SAndroid Build Coastguard Worker } 2100*333d2b36SAndroid Build Coastguard Worker 2101*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 2102*333d2b36SAndroid Build Coastguard Worker name: "libbar", 2103*333d2b36SAndroid Build Coastguard Worker export_include_dirs: ["include/libbar"], 2104*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 2105*333d2b36SAndroid Build Coastguard Worker }`) 2106*333d2b36SAndroid Build Coastguard Worker 2107*333d2b36SAndroid Build Coastguard Worker cFlags := ctx.ModuleForTests("libclient", "android_arm64_armv8-a_shared").Rule("cc").Args["cFlags"] 2108*333d2b36SAndroid Build Coastguard Worker 2109*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, "-Iinclude/libbar") { 2110*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected %q in cflags, got %q", "-Iinclude/libbar", cFlags) 2111*333d2b36SAndroid Build Coastguard Worker } 2112*333d2b36SAndroid Build Coastguard Worker} 2113*333d2b36SAndroid Build Coastguard Worker 2114*333d2b36SAndroid Build Coastguard Workerfunc TestAidlLibraryWithHeaders(t *testing.T) { 2115*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2116*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers( 2117*333d2b36SAndroid Build Coastguard Worker prepareForCcTest, 2118*333d2b36SAndroid Build Coastguard Worker aidl_library.PrepareForTestWithAidlLibrary, 2119*333d2b36SAndroid Build Coastguard Worker android.MockFS{ 2120*333d2b36SAndroid Build Coastguard Worker "package_bar/Android.bp": []byte(` 2121*333d2b36SAndroid Build Coastguard Worker aidl_library { 2122*333d2b36SAndroid Build Coastguard Worker name: "bar", 2123*333d2b36SAndroid Build Coastguard Worker srcs: ["x/y/Bar.aidl"], 2124*333d2b36SAndroid Build Coastguard Worker hdrs: ["x/HeaderBar.aidl"], 2125*333d2b36SAndroid Build Coastguard Worker strip_import_prefix: "x", 2126*333d2b36SAndroid Build Coastguard Worker } 2127*333d2b36SAndroid Build Coastguard Worker `)}.AddToFixture(), 2128*333d2b36SAndroid Build Coastguard Worker android.MockFS{ 2129*333d2b36SAndroid Build Coastguard Worker "package_foo/Android.bp": []byte(` 2130*333d2b36SAndroid Build Coastguard Worker aidl_library { 2131*333d2b36SAndroid Build Coastguard Worker name: "foo", 2132*333d2b36SAndroid Build Coastguard Worker srcs: ["a/b/Foo.aidl"], 2133*333d2b36SAndroid Build Coastguard Worker hdrs: ["a/HeaderFoo.aidl"], 2134*333d2b36SAndroid Build Coastguard Worker strip_import_prefix: "a", 2135*333d2b36SAndroid Build Coastguard Worker deps: ["bar"], 2136*333d2b36SAndroid Build Coastguard Worker } 2137*333d2b36SAndroid Build Coastguard Worker cc_library { 2138*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 2139*333d2b36SAndroid Build Coastguard Worker aidl: { 2140*333d2b36SAndroid Build Coastguard Worker libs: ["foo"], 2141*333d2b36SAndroid Build Coastguard Worker } 2142*333d2b36SAndroid Build Coastguard Worker } 2143*333d2b36SAndroid Build Coastguard Worker `), 2144*333d2b36SAndroid Build Coastguard Worker }.AddToFixture(), 2145*333d2b36SAndroid Build Coastguard Worker ).RunTest(t).TestContext 2146*333d2b36SAndroid Build Coastguard Worker 2147*333d2b36SAndroid Build Coastguard Worker libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static") 2148*333d2b36SAndroid Build Coastguard Worker 2149*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals( 2150*333d2b36SAndroid Build Coastguard Worker t, 2151*333d2b36SAndroid Build Coastguard Worker "aidl headers", 2152*333d2b36SAndroid Build Coastguard Worker []string{ 2153*333d2b36SAndroid Build Coastguard Worker "package_bar/x/HeaderBar.aidl", 2154*333d2b36SAndroid Build Coastguard Worker "package_foo/a/HeaderFoo.aidl", 2155*333d2b36SAndroid Build Coastguard Worker "package_foo/a/b/Foo.aidl", 2156*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/package_foo/libfoo/android_arm64_armv8-a_static/gen/aidl_library.sbox.textproto", 2157*333d2b36SAndroid Build Coastguard Worker }, 2158*333d2b36SAndroid Build Coastguard Worker libfoo.Rule("aidl_library").Implicits, 2159*333d2b36SAndroid Build Coastguard Worker ) 2160*333d2b36SAndroid Build Coastguard Worker 2161*333d2b36SAndroid Build Coastguard Worker manifest := android.RuleBuilderSboxProtoForTests(t, ctx, libfoo.Output("aidl_library.sbox.textproto")) 2162*333d2b36SAndroid Build Coastguard Worker aidlCommand := manifest.Commands[0].GetCommand() 2163*333d2b36SAndroid Build Coastguard Worker 2164*333d2b36SAndroid Build Coastguard Worker expectedAidlFlags := "-Ipackage_foo/a -Ipackage_bar/x" 2165*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(aidlCommand, expectedAidlFlags) { 2166*333d2b36SAndroid Build Coastguard Worker t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlags) 2167*333d2b36SAndroid Build Coastguard Worker } 2168*333d2b36SAndroid Build Coastguard Worker 2169*333d2b36SAndroid Build Coastguard Worker outputs := strings.Join(libfoo.AllOutputs(), " ") 2170*333d2b36SAndroid Build Coastguard Worker 2171*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "aidl-generated header", outputs, "gen/aidl_library/b/BpFoo.h") 2172*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "aidl-generated header", outputs, "gen/aidl_library/b/BnFoo.h") 2173*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "aidl-generated header", outputs, "gen/aidl_library/b/Foo.h") 2174*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "aidl-generated cpp", outputs, "b/Foo.cpp") 2175*333d2b36SAndroid Build Coastguard Worker // Confirm that the aidl header doesn't get compiled to cpp and h files 2176*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, "aidl-generated header", outputs, "gen/aidl_library/y/BpBar.h") 2177*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, "aidl-generated header", outputs, "gen/aidl_library/y/BnBar.h") 2178*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, "aidl-generated header", outputs, "gen/aidl_library/y/Bar.h") 2179*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, "aidl-generated cpp", outputs, "y/Bar.cpp") 2180*333d2b36SAndroid Build Coastguard Worker} 2181*333d2b36SAndroid Build Coastguard Worker 2182*333d2b36SAndroid Build Coastguard Workerfunc TestAidlFlagsPassedToTheAidlCompiler(t *testing.T) { 2183*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2184*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers( 2185*333d2b36SAndroid Build Coastguard Worker prepareForCcTest, 2186*333d2b36SAndroid Build Coastguard Worker aidl_library.PrepareForTestWithAidlLibrary, 2187*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 2188*333d2b36SAndroid Build Coastguard Worker cc_library { 2189*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 2190*333d2b36SAndroid Build Coastguard Worker srcs: ["a/Foo.aidl"], 2191*333d2b36SAndroid Build Coastguard Worker aidl: { flags: ["-Werror"], }, 2192*333d2b36SAndroid Build Coastguard Worker } 2193*333d2b36SAndroid Build Coastguard Worker `) 2194*333d2b36SAndroid Build Coastguard Worker 2195*333d2b36SAndroid Build Coastguard Worker libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static") 2196*333d2b36SAndroid Build Coastguard Worker manifest := android.RuleBuilderSboxProtoForTests(t, ctx.TestContext, libfoo.Output("aidl.sbox.textproto")) 2197*333d2b36SAndroid Build Coastguard Worker aidlCommand := manifest.Commands[0].GetCommand() 2198*333d2b36SAndroid Build Coastguard Worker expectedAidlFlag := "-Werror" 2199*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(aidlCommand, expectedAidlFlag) { 2200*333d2b36SAndroid Build Coastguard Worker t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag) 2201*333d2b36SAndroid Build Coastguard Worker } 2202*333d2b36SAndroid Build Coastguard Worker} 2203*333d2b36SAndroid Build Coastguard Worker 2204*333d2b36SAndroid Build Coastguard Workerfunc TestAidlFlagsWithMinSdkVersion(t *testing.T) { 2205*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2206*333d2b36SAndroid Build Coastguard Worker for _, tc := range []struct { 2207*333d2b36SAndroid Build Coastguard Worker name string 2208*333d2b36SAndroid Build Coastguard Worker sdkVersion string 2209*333d2b36SAndroid Build Coastguard Worker variant string 2210*333d2b36SAndroid Build Coastguard Worker expected string 2211*333d2b36SAndroid Build Coastguard Worker }{ 2212*333d2b36SAndroid Build Coastguard Worker { 2213*333d2b36SAndroid Build Coastguard Worker name: "default is current", 2214*333d2b36SAndroid Build Coastguard Worker sdkVersion: "", 2215*333d2b36SAndroid Build Coastguard Worker variant: "android_arm64_armv8-a_static", 2216*333d2b36SAndroid Build Coastguard Worker expected: "platform_apis", 2217*333d2b36SAndroid Build Coastguard Worker }, 2218*333d2b36SAndroid Build Coastguard Worker { 2219*333d2b36SAndroid Build Coastguard Worker name: "use sdk_version", 2220*333d2b36SAndroid Build Coastguard Worker sdkVersion: `sdk_version: "29"`, 2221*333d2b36SAndroid Build Coastguard Worker variant: "android_arm64_armv8-a_static", 2222*333d2b36SAndroid Build Coastguard Worker expected: "platform_apis", 2223*333d2b36SAndroid Build Coastguard Worker }, 2224*333d2b36SAndroid Build Coastguard Worker { 2225*333d2b36SAndroid Build Coastguard Worker name: "use sdk_version(sdk variant)", 2226*333d2b36SAndroid Build Coastguard Worker sdkVersion: `sdk_version: "29"`, 2227*333d2b36SAndroid Build Coastguard Worker variant: "android_arm64_armv8-a_sdk_static", 2228*333d2b36SAndroid Build Coastguard Worker expected: "29", 2229*333d2b36SAndroid Build Coastguard Worker }, 2230*333d2b36SAndroid Build Coastguard Worker { 2231*333d2b36SAndroid Build Coastguard Worker name: "use min_sdk_version", 2232*333d2b36SAndroid Build Coastguard Worker sdkVersion: `min_sdk_version: "29"`, 2233*333d2b36SAndroid Build Coastguard Worker variant: "android_arm64_armv8-a_static", 2234*333d2b36SAndroid Build Coastguard Worker expected: "29", 2235*333d2b36SAndroid Build Coastguard Worker }, 2236*333d2b36SAndroid Build Coastguard Worker } { 2237*333d2b36SAndroid Build Coastguard Worker t.Run(tc.name, func(t *testing.T) { 2238*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, ` 2239*333d2b36SAndroid Build Coastguard Worker cc_library { 2240*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 2241*333d2b36SAndroid Build Coastguard Worker stl: "none", 2242*333d2b36SAndroid Build Coastguard Worker srcs: ["a/Foo.aidl"], 2243*333d2b36SAndroid Build Coastguard Worker `+tc.sdkVersion+` 2244*333d2b36SAndroid Build Coastguard Worker } 2245*333d2b36SAndroid Build Coastguard Worker `) 2246*333d2b36SAndroid Build Coastguard Worker libfoo := ctx.ModuleForTests("libfoo", tc.variant) 2247*333d2b36SAndroid Build Coastguard Worker manifest := android.RuleBuilderSboxProtoForTests(t, ctx, libfoo.Output("aidl.sbox.textproto")) 2248*333d2b36SAndroid Build Coastguard Worker aidlCommand := manifest.Commands[0].GetCommand() 2249*333d2b36SAndroid Build Coastguard Worker expectedAidlFlag := "--min_sdk_version=" + tc.expected 2250*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(aidlCommand, expectedAidlFlag) { 2251*333d2b36SAndroid Build Coastguard Worker t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag) 2252*333d2b36SAndroid Build Coastguard Worker } 2253*333d2b36SAndroid Build Coastguard Worker }) 2254*333d2b36SAndroid Build Coastguard Worker } 2255*333d2b36SAndroid Build Coastguard Worker} 2256*333d2b36SAndroid Build Coastguard Worker 2257*333d2b36SAndroid Build Coastguard Workerfunc TestInvalidAidlProp(t *testing.T) { 2258*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2259*333d2b36SAndroid Build Coastguard Worker 2260*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 2261*333d2b36SAndroid Build Coastguard Worker description string 2262*333d2b36SAndroid Build Coastguard Worker bp string 2263*333d2b36SAndroid Build Coastguard Worker }{ 2264*333d2b36SAndroid Build Coastguard Worker { 2265*333d2b36SAndroid Build Coastguard Worker description: "Invalid use of aidl.libs and aidl.include_dirs", 2266*333d2b36SAndroid Build Coastguard Worker bp: ` 2267*333d2b36SAndroid Build Coastguard Worker cc_library { 2268*333d2b36SAndroid Build Coastguard Worker name: "foo", 2269*333d2b36SAndroid Build Coastguard Worker aidl: { 2270*333d2b36SAndroid Build Coastguard Worker libs: ["foo_aidl"], 2271*333d2b36SAndroid Build Coastguard Worker include_dirs: ["bar/include"], 2272*333d2b36SAndroid Build Coastguard Worker } 2273*333d2b36SAndroid Build Coastguard Worker } 2274*333d2b36SAndroid Build Coastguard Worker `, 2275*333d2b36SAndroid Build Coastguard Worker }, 2276*333d2b36SAndroid Build Coastguard Worker { 2277*333d2b36SAndroid Build Coastguard Worker description: "Invalid use of aidl.libs and aidl.local_include_dirs", 2278*333d2b36SAndroid Build Coastguard Worker bp: ` 2279*333d2b36SAndroid Build Coastguard Worker cc_library { 2280*333d2b36SAndroid Build Coastguard Worker name: "foo", 2281*333d2b36SAndroid Build Coastguard Worker aidl: { 2282*333d2b36SAndroid Build Coastguard Worker libs: ["foo_aidl"], 2283*333d2b36SAndroid Build Coastguard Worker local_include_dirs: ["include"], 2284*333d2b36SAndroid Build Coastguard Worker } 2285*333d2b36SAndroid Build Coastguard Worker } 2286*333d2b36SAndroid Build Coastguard Worker `, 2287*333d2b36SAndroid Build Coastguard Worker }, 2288*333d2b36SAndroid Build Coastguard Worker } 2289*333d2b36SAndroid Build Coastguard Worker 2290*333d2b36SAndroid Build Coastguard Worker for _, testCase := range testCases { 2291*333d2b36SAndroid Build Coastguard Worker t.Run(testCase.description, func(t *testing.T) { 2292*333d2b36SAndroid Build Coastguard Worker bp := ` 2293*333d2b36SAndroid Build Coastguard Worker aidl_library { 2294*333d2b36SAndroid Build Coastguard Worker name: "foo_aidl", 2295*333d2b36SAndroid Build Coastguard Worker srcs: ["Foo.aidl"], 2296*333d2b36SAndroid Build Coastguard Worker } ` + testCase.bp 2297*333d2b36SAndroid Build Coastguard Worker android.GroupFixturePreparers( 2298*333d2b36SAndroid Build Coastguard Worker prepareForCcTest, 2299*333d2b36SAndroid Build Coastguard Worker aidl_library.PrepareForTestWithAidlLibrary. 2300*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("For aidl headers, please only use aidl.libs prop")), 2301*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 2302*333d2b36SAndroid Build Coastguard Worker }) 2303*333d2b36SAndroid Build Coastguard Worker } 2304*333d2b36SAndroid Build Coastguard Worker} 2305*333d2b36SAndroid Build Coastguard Worker 2306*333d2b36SAndroid Build Coastguard Workerfunc TestMinSdkVersionInClangTriple(t *testing.T) { 2307*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2308*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, ` 2309*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 2310*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 2311*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 2312*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2313*333d2b36SAndroid Build Coastguard Worker }`) 2314*333d2b36SAndroid Build Coastguard Worker 2315*333d2b36SAndroid Build Coastguard Worker cFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Rule("cc").Args["cFlags"] 2316*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "min sdk version", cFlags, "-target aarch64-linux-android29") 2317*333d2b36SAndroid Build Coastguard Worker} 2318*333d2b36SAndroid Build Coastguard Worker 2319*333d2b36SAndroid Build Coastguard Workerfunc TestNonDigitMinSdkVersionInClangTriple(t *testing.T) { 2320*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2321*333d2b36SAndroid Build Coastguard Worker bp := ` 2322*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 2323*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 2324*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 2325*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "S", 2326*333d2b36SAndroid Build Coastguard Worker } 2327*333d2b36SAndroid Build Coastguard Worker ` 2328*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 2329*333d2b36SAndroid Build Coastguard Worker prepareForCcTest, 2330*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 2331*333d2b36SAndroid Build Coastguard Worker variables.Platform_version_active_codenames = []string{"UpsideDownCake", "Tiramisu"} 2332*333d2b36SAndroid Build Coastguard Worker }), 2333*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 2334*333d2b36SAndroid Build Coastguard Worker ctx := result.TestContext 2335*333d2b36SAndroid Build Coastguard Worker cFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Rule("cc").Args["cFlags"] 2336*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "min sdk version", cFlags, "-target aarch64-linux-android31") 2337*333d2b36SAndroid Build Coastguard Worker} 2338*333d2b36SAndroid Build Coastguard Worker 2339*333d2b36SAndroid Build Coastguard Workerfunc TestIncludeDirsExporting(t *testing.T) { 2340*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2341*333d2b36SAndroid Build Coastguard Worker 2342*333d2b36SAndroid Build Coastguard Worker // Trim spaces from the beginning, end and immediately after any newline characters. Leaves 2343*333d2b36SAndroid Build Coastguard Worker // embedded newline characters alone. 2344*333d2b36SAndroid Build Coastguard Worker trimIndentingSpaces := func(s string) string { 2345*333d2b36SAndroid Build Coastguard Worker return strings.TrimSpace(regexp.MustCompile("(^|\n)\\s+").ReplaceAllString(s, "$1")) 2346*333d2b36SAndroid Build Coastguard Worker } 2347*333d2b36SAndroid Build Coastguard Worker 2348*333d2b36SAndroid Build Coastguard Worker checkPaths := func(t *testing.T, message string, expected string, paths android.Paths) { 2349*333d2b36SAndroid Build Coastguard Worker t.Helper() 2350*333d2b36SAndroid Build Coastguard Worker expected = trimIndentingSpaces(expected) 2351*333d2b36SAndroid Build Coastguard Worker actual := trimIndentingSpaces(strings.Join(android.FirstUniqueStrings(android.NormalizePathsForTesting(paths)), "\n")) 2352*333d2b36SAndroid Build Coastguard Worker if expected != actual { 2353*333d2b36SAndroid Build Coastguard Worker t.Errorf("%s: expected:\n%s\n actual:\n%s\n", message, expected, actual) 2354*333d2b36SAndroid Build Coastguard Worker } 2355*333d2b36SAndroid Build Coastguard Worker } 2356*333d2b36SAndroid Build Coastguard Worker 2357*333d2b36SAndroid Build Coastguard Worker type exportedChecker func(t *testing.T, name string, exported FlagExporterInfo) 2358*333d2b36SAndroid Build Coastguard Worker 2359*333d2b36SAndroid Build Coastguard Worker checkIncludeDirs := func(t *testing.T, ctx *android.TestContext, module android.Module, checkers ...exportedChecker) { 2360*333d2b36SAndroid Build Coastguard Worker t.Helper() 2361*333d2b36SAndroid Build Coastguard Worker exported, _ := android.OtherModuleProvider(ctx, module, FlagExporterInfoProvider) 2362*333d2b36SAndroid Build Coastguard Worker name := module.Name() 2363*333d2b36SAndroid Build Coastguard Worker 2364*333d2b36SAndroid Build Coastguard Worker for _, checker := range checkers { 2365*333d2b36SAndroid Build Coastguard Worker checker(t, name, exported) 2366*333d2b36SAndroid Build Coastguard Worker } 2367*333d2b36SAndroid Build Coastguard Worker } 2368*333d2b36SAndroid Build Coastguard Worker 2369*333d2b36SAndroid Build Coastguard Worker expectedIncludeDirs := func(expectedPaths string) exportedChecker { 2370*333d2b36SAndroid Build Coastguard Worker return func(t *testing.T, name string, exported FlagExporterInfo) { 2371*333d2b36SAndroid Build Coastguard Worker t.Helper() 2372*333d2b36SAndroid Build Coastguard Worker checkPaths(t, fmt.Sprintf("%s: include dirs", name), expectedPaths, exported.IncludeDirs) 2373*333d2b36SAndroid Build Coastguard Worker } 2374*333d2b36SAndroid Build Coastguard Worker } 2375*333d2b36SAndroid Build Coastguard Worker 2376*333d2b36SAndroid Build Coastguard Worker expectedSystemIncludeDirs := func(expectedPaths string) exportedChecker { 2377*333d2b36SAndroid Build Coastguard Worker return func(t *testing.T, name string, exported FlagExporterInfo) { 2378*333d2b36SAndroid Build Coastguard Worker t.Helper() 2379*333d2b36SAndroid Build Coastguard Worker checkPaths(t, fmt.Sprintf("%s: system include dirs", name), expectedPaths, exported.SystemIncludeDirs) 2380*333d2b36SAndroid Build Coastguard Worker } 2381*333d2b36SAndroid Build Coastguard Worker } 2382*333d2b36SAndroid Build Coastguard Worker 2383*333d2b36SAndroid Build Coastguard Worker expectedGeneratedHeaders := func(expectedPaths string) exportedChecker { 2384*333d2b36SAndroid Build Coastguard Worker return func(t *testing.T, name string, exported FlagExporterInfo) { 2385*333d2b36SAndroid Build Coastguard Worker t.Helper() 2386*333d2b36SAndroid Build Coastguard Worker checkPaths(t, fmt.Sprintf("%s: generated headers", name), expectedPaths, exported.GeneratedHeaders) 2387*333d2b36SAndroid Build Coastguard Worker } 2388*333d2b36SAndroid Build Coastguard Worker } 2389*333d2b36SAndroid Build Coastguard Worker 2390*333d2b36SAndroid Build Coastguard Worker expectedOrderOnlyDeps := func(expectedPaths string) exportedChecker { 2391*333d2b36SAndroid Build Coastguard Worker return func(t *testing.T, name string, exported FlagExporterInfo) { 2392*333d2b36SAndroid Build Coastguard Worker t.Helper() 2393*333d2b36SAndroid Build Coastguard Worker checkPaths(t, fmt.Sprintf("%s: order only deps", name), expectedPaths, exported.Deps) 2394*333d2b36SAndroid Build Coastguard Worker } 2395*333d2b36SAndroid Build Coastguard Worker } 2396*333d2b36SAndroid Build Coastguard Worker 2397*333d2b36SAndroid Build Coastguard Worker genRuleModules := ` 2398*333d2b36SAndroid Build Coastguard Worker genrule { 2399*333d2b36SAndroid Build Coastguard Worker name: "genrule_foo", 2400*333d2b36SAndroid Build Coastguard Worker cmd: "generate-foo", 2401*333d2b36SAndroid Build Coastguard Worker out: [ 2402*333d2b36SAndroid Build Coastguard Worker "generated_headers/foo/generated_header.h", 2403*333d2b36SAndroid Build Coastguard Worker ], 2404*333d2b36SAndroid Build Coastguard Worker export_include_dirs: [ 2405*333d2b36SAndroid Build Coastguard Worker "generated_headers", 2406*333d2b36SAndroid Build Coastguard Worker ], 2407*333d2b36SAndroid Build Coastguard Worker } 2408*333d2b36SAndroid Build Coastguard Worker 2409*333d2b36SAndroid Build Coastguard Worker genrule { 2410*333d2b36SAndroid Build Coastguard Worker name: "genrule_bar", 2411*333d2b36SAndroid Build Coastguard Worker cmd: "generate-bar", 2412*333d2b36SAndroid Build Coastguard Worker out: [ 2413*333d2b36SAndroid Build Coastguard Worker "generated_headers/bar/generated_header.h", 2414*333d2b36SAndroid Build Coastguard Worker ], 2415*333d2b36SAndroid Build Coastguard Worker export_include_dirs: [ 2416*333d2b36SAndroid Build Coastguard Worker "generated_headers", 2417*333d2b36SAndroid Build Coastguard Worker ], 2418*333d2b36SAndroid Build Coastguard Worker } 2419*333d2b36SAndroid Build Coastguard Worker ` 2420*333d2b36SAndroid Build Coastguard Worker 2421*333d2b36SAndroid Build Coastguard Worker t.Run("ensure exported include dirs are not automatically re-exported from shared_libs", func(t *testing.T) { 2422*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, genRuleModules+` 2423*333d2b36SAndroid Build Coastguard Worker cc_library { 2424*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 2425*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 2426*333d2b36SAndroid Build Coastguard Worker export_include_dirs: ["foo/standard"], 2427*333d2b36SAndroid Build Coastguard Worker export_system_include_dirs: ["foo/system"], 2428*333d2b36SAndroid Build Coastguard Worker generated_headers: ["genrule_foo"], 2429*333d2b36SAndroid Build Coastguard Worker export_generated_headers: ["genrule_foo"], 2430*333d2b36SAndroid Build Coastguard Worker } 2431*333d2b36SAndroid Build Coastguard Worker 2432*333d2b36SAndroid Build Coastguard Worker cc_library { 2433*333d2b36SAndroid Build Coastguard Worker name: "libbar", 2434*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.c"], 2435*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libfoo"], 2436*333d2b36SAndroid Build Coastguard Worker export_include_dirs: ["bar/standard"], 2437*333d2b36SAndroid Build Coastguard Worker export_system_include_dirs: ["bar/system"], 2438*333d2b36SAndroid Build Coastguard Worker generated_headers: ["genrule_bar"], 2439*333d2b36SAndroid Build Coastguard Worker export_generated_headers: ["genrule_bar"], 2440*333d2b36SAndroid Build Coastguard Worker } 2441*333d2b36SAndroid Build Coastguard Worker `) 2442*333d2b36SAndroid Build Coastguard Worker foo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module() 2443*333d2b36SAndroid Build Coastguard Worker checkIncludeDirs(t, ctx, foo, 2444*333d2b36SAndroid Build Coastguard Worker expectedIncludeDirs(` 2445*333d2b36SAndroid Build Coastguard Worker foo/standard 2446*333d2b36SAndroid Build Coastguard Worker .intermediates/genrule_foo/gen/generated_headers 2447*333d2b36SAndroid Build Coastguard Worker `), 2448*333d2b36SAndroid Build Coastguard Worker expectedSystemIncludeDirs(`foo/system`), 2449*333d2b36SAndroid Build Coastguard Worker expectedGeneratedHeaders(`.intermediates/genrule_foo/gen/generated_headers/foo/generated_header.h`), 2450*333d2b36SAndroid Build Coastguard Worker expectedOrderOnlyDeps(`.intermediates/genrule_foo/gen/generated_headers/foo/generated_header.h`), 2451*333d2b36SAndroid Build Coastguard Worker ) 2452*333d2b36SAndroid Build Coastguard Worker 2453*333d2b36SAndroid Build Coastguard Worker bar := ctx.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module() 2454*333d2b36SAndroid Build Coastguard Worker checkIncludeDirs(t, ctx, bar, 2455*333d2b36SAndroid Build Coastguard Worker expectedIncludeDirs(` 2456*333d2b36SAndroid Build Coastguard Worker bar/standard 2457*333d2b36SAndroid Build Coastguard Worker .intermediates/genrule_bar/gen/generated_headers 2458*333d2b36SAndroid Build Coastguard Worker `), 2459*333d2b36SAndroid Build Coastguard Worker expectedSystemIncludeDirs(`bar/system`), 2460*333d2b36SAndroid Build Coastguard Worker expectedGeneratedHeaders(`.intermediates/genrule_bar/gen/generated_headers/bar/generated_header.h`), 2461*333d2b36SAndroid Build Coastguard Worker expectedOrderOnlyDeps(`.intermediates/genrule_bar/gen/generated_headers/bar/generated_header.h`), 2462*333d2b36SAndroid Build Coastguard Worker ) 2463*333d2b36SAndroid Build Coastguard Worker }) 2464*333d2b36SAndroid Build Coastguard Worker 2465*333d2b36SAndroid Build Coastguard Worker t.Run("ensure exported include dirs are automatically re-exported from whole_static_libs", func(t *testing.T) { 2466*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, genRuleModules+` 2467*333d2b36SAndroid Build Coastguard Worker cc_library { 2468*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 2469*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 2470*333d2b36SAndroid Build Coastguard Worker export_include_dirs: ["foo/standard"], 2471*333d2b36SAndroid Build Coastguard Worker export_system_include_dirs: ["foo/system"], 2472*333d2b36SAndroid Build Coastguard Worker generated_headers: ["genrule_foo"], 2473*333d2b36SAndroid Build Coastguard Worker export_generated_headers: ["genrule_foo"], 2474*333d2b36SAndroid Build Coastguard Worker } 2475*333d2b36SAndroid Build Coastguard Worker 2476*333d2b36SAndroid Build Coastguard Worker cc_library { 2477*333d2b36SAndroid Build Coastguard Worker name: "libbar", 2478*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.c"], 2479*333d2b36SAndroid Build Coastguard Worker whole_static_libs: ["libfoo"], 2480*333d2b36SAndroid Build Coastguard Worker export_include_dirs: ["bar/standard"], 2481*333d2b36SAndroid Build Coastguard Worker export_system_include_dirs: ["bar/system"], 2482*333d2b36SAndroid Build Coastguard Worker generated_headers: ["genrule_bar"], 2483*333d2b36SAndroid Build Coastguard Worker export_generated_headers: ["genrule_bar"], 2484*333d2b36SAndroid Build Coastguard Worker } 2485*333d2b36SAndroid Build Coastguard Worker `) 2486*333d2b36SAndroid Build Coastguard Worker foo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module() 2487*333d2b36SAndroid Build Coastguard Worker checkIncludeDirs(t, ctx, foo, 2488*333d2b36SAndroid Build Coastguard Worker expectedIncludeDirs(` 2489*333d2b36SAndroid Build Coastguard Worker foo/standard 2490*333d2b36SAndroid Build Coastguard Worker .intermediates/genrule_foo/gen/generated_headers 2491*333d2b36SAndroid Build Coastguard Worker `), 2492*333d2b36SAndroid Build Coastguard Worker expectedSystemIncludeDirs(`foo/system`), 2493*333d2b36SAndroid Build Coastguard Worker expectedGeneratedHeaders(`.intermediates/genrule_foo/gen/generated_headers/foo/generated_header.h`), 2494*333d2b36SAndroid Build Coastguard Worker expectedOrderOnlyDeps(`.intermediates/genrule_foo/gen/generated_headers/foo/generated_header.h`), 2495*333d2b36SAndroid Build Coastguard Worker ) 2496*333d2b36SAndroid Build Coastguard Worker 2497*333d2b36SAndroid Build Coastguard Worker bar := ctx.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module() 2498*333d2b36SAndroid Build Coastguard Worker checkIncludeDirs(t, ctx, bar, 2499*333d2b36SAndroid Build Coastguard Worker expectedIncludeDirs(` 2500*333d2b36SAndroid Build Coastguard Worker bar/standard 2501*333d2b36SAndroid Build Coastguard Worker foo/standard 2502*333d2b36SAndroid Build Coastguard Worker .intermediates/genrule_foo/gen/generated_headers 2503*333d2b36SAndroid Build Coastguard Worker .intermediates/genrule_bar/gen/generated_headers 2504*333d2b36SAndroid Build Coastguard Worker `), 2505*333d2b36SAndroid Build Coastguard Worker expectedSystemIncludeDirs(` 2506*333d2b36SAndroid Build Coastguard Worker bar/system 2507*333d2b36SAndroid Build Coastguard Worker foo/system 2508*333d2b36SAndroid Build Coastguard Worker `), 2509*333d2b36SAndroid Build Coastguard Worker expectedGeneratedHeaders(` 2510*333d2b36SAndroid Build Coastguard Worker .intermediates/genrule_foo/gen/generated_headers/foo/generated_header.h 2511*333d2b36SAndroid Build Coastguard Worker .intermediates/genrule_bar/gen/generated_headers/bar/generated_header.h 2512*333d2b36SAndroid Build Coastguard Worker `), 2513*333d2b36SAndroid Build Coastguard Worker expectedOrderOnlyDeps(` 2514*333d2b36SAndroid Build Coastguard Worker .intermediates/genrule_foo/gen/generated_headers/foo/generated_header.h 2515*333d2b36SAndroid Build Coastguard Worker .intermediates/genrule_bar/gen/generated_headers/bar/generated_header.h 2516*333d2b36SAndroid Build Coastguard Worker `), 2517*333d2b36SAndroid Build Coastguard Worker ) 2518*333d2b36SAndroid Build Coastguard Worker }) 2519*333d2b36SAndroid Build Coastguard Worker 2520*333d2b36SAndroid Build Coastguard Worker t.Run("ensure only aidl headers are exported", func(t *testing.T) { 2521*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers( 2522*333d2b36SAndroid Build Coastguard Worker prepareForCcTest, 2523*333d2b36SAndroid Build Coastguard Worker aidl_library.PrepareForTestWithAidlLibrary, 2524*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 2525*333d2b36SAndroid Build Coastguard Worker aidl_library { 2526*333d2b36SAndroid Build Coastguard Worker name: "libfoo_aidl", 2527*333d2b36SAndroid Build Coastguard Worker srcs: ["x/y/Bar.aidl"], 2528*333d2b36SAndroid Build Coastguard Worker strip_import_prefix: "x", 2529*333d2b36SAndroid Build Coastguard Worker } 2530*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 2531*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 2532*333d2b36SAndroid Build Coastguard Worker srcs: [ 2533*333d2b36SAndroid Build Coastguard Worker "foo.c", 2534*333d2b36SAndroid Build Coastguard Worker "b.aidl", 2535*333d2b36SAndroid Build Coastguard Worker "a.proto", 2536*333d2b36SAndroid Build Coastguard Worker ], 2537*333d2b36SAndroid Build Coastguard Worker aidl: { 2538*333d2b36SAndroid Build Coastguard Worker libs: ["libfoo_aidl"], 2539*333d2b36SAndroid Build Coastguard Worker export_aidl_headers: true, 2540*333d2b36SAndroid Build Coastguard Worker } 2541*333d2b36SAndroid Build Coastguard Worker } 2542*333d2b36SAndroid Build Coastguard Worker `).TestContext 2543*333d2b36SAndroid Build Coastguard Worker foo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module() 2544*333d2b36SAndroid Build Coastguard Worker checkIncludeDirs(t, ctx, foo, 2545*333d2b36SAndroid Build Coastguard Worker expectedIncludeDirs(` 2546*333d2b36SAndroid Build Coastguard Worker .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl 2547*333d2b36SAndroid Build Coastguard Worker .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl_library 2548*333d2b36SAndroid Build Coastguard Worker `), 2549*333d2b36SAndroid Build Coastguard Worker expectedSystemIncludeDirs(``), 2550*333d2b36SAndroid Build Coastguard Worker expectedGeneratedHeaders(` 2551*333d2b36SAndroid Build Coastguard Worker .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl/b.h 2552*333d2b36SAndroid Build Coastguard Worker .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl/Bnb.h 2553*333d2b36SAndroid Build Coastguard Worker .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl/Bpb.h 2554*333d2b36SAndroid Build Coastguard Worker .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl_library/y/Bar.h 2555*333d2b36SAndroid Build Coastguard Worker .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl_library/y/BnBar.h 2556*333d2b36SAndroid Build Coastguard Worker .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl_library/y/BpBar.h 2557*333d2b36SAndroid Build Coastguard Worker `), 2558*333d2b36SAndroid Build Coastguard Worker expectedOrderOnlyDeps(` 2559*333d2b36SAndroid Build Coastguard Worker .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl/b.h 2560*333d2b36SAndroid Build Coastguard Worker .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl/Bnb.h 2561*333d2b36SAndroid Build Coastguard Worker .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl/Bpb.h 2562*333d2b36SAndroid Build Coastguard Worker .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl_library/y/Bar.h 2563*333d2b36SAndroid Build Coastguard Worker .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl_library/y/BnBar.h 2564*333d2b36SAndroid Build Coastguard Worker .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl_library/y/BpBar.h 2565*333d2b36SAndroid Build Coastguard Worker `), 2566*333d2b36SAndroid Build Coastguard Worker ) 2567*333d2b36SAndroid Build Coastguard Worker }) 2568*333d2b36SAndroid Build Coastguard Worker 2569*333d2b36SAndroid Build Coastguard Worker t.Run("ensure only proto headers are exported", func(t *testing.T) { 2570*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, genRuleModules+` 2571*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 2572*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 2573*333d2b36SAndroid Build Coastguard Worker srcs: [ 2574*333d2b36SAndroid Build Coastguard Worker "foo.c", 2575*333d2b36SAndroid Build Coastguard Worker "b.aidl", 2576*333d2b36SAndroid Build Coastguard Worker "a.proto", 2577*333d2b36SAndroid Build Coastguard Worker ], 2578*333d2b36SAndroid Build Coastguard Worker proto: { 2579*333d2b36SAndroid Build Coastguard Worker export_proto_headers: true, 2580*333d2b36SAndroid Build Coastguard Worker } 2581*333d2b36SAndroid Build Coastguard Worker } 2582*333d2b36SAndroid Build Coastguard Worker `) 2583*333d2b36SAndroid Build Coastguard Worker foo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module() 2584*333d2b36SAndroid Build Coastguard Worker checkIncludeDirs(t, ctx, foo, 2585*333d2b36SAndroid Build Coastguard Worker expectedIncludeDirs(` 2586*333d2b36SAndroid Build Coastguard Worker .intermediates/libfoo/android_arm64_armv8-a_shared/gen/proto 2587*333d2b36SAndroid Build Coastguard Worker `), 2588*333d2b36SAndroid Build Coastguard Worker expectedSystemIncludeDirs(``), 2589*333d2b36SAndroid Build Coastguard Worker expectedGeneratedHeaders(` 2590*333d2b36SAndroid Build Coastguard Worker .intermediates/libfoo/android_arm64_armv8-a_shared/gen/proto/a.pb.h 2591*333d2b36SAndroid Build Coastguard Worker `), 2592*333d2b36SAndroid Build Coastguard Worker expectedOrderOnlyDeps(` 2593*333d2b36SAndroid Build Coastguard Worker .intermediates/libfoo/android_arm64_armv8-a_shared/gen/proto/a.pb.h 2594*333d2b36SAndroid Build Coastguard Worker `), 2595*333d2b36SAndroid Build Coastguard Worker ) 2596*333d2b36SAndroid Build Coastguard Worker }) 2597*333d2b36SAndroid Build Coastguard Worker 2598*333d2b36SAndroid Build Coastguard Worker t.Run("ensure only sysprop headers are exported", func(t *testing.T) { 2599*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, genRuleModules+` 2600*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 2601*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 2602*333d2b36SAndroid Build Coastguard Worker srcs: [ 2603*333d2b36SAndroid Build Coastguard Worker "foo.c", 2604*333d2b36SAndroid Build Coastguard Worker "path/to/a.sysprop", 2605*333d2b36SAndroid Build Coastguard Worker "b.aidl", 2606*333d2b36SAndroid Build Coastguard Worker "a.proto", 2607*333d2b36SAndroid Build Coastguard Worker ], 2608*333d2b36SAndroid Build Coastguard Worker } 2609*333d2b36SAndroid Build Coastguard Worker `) 2610*333d2b36SAndroid Build Coastguard Worker foo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module() 2611*333d2b36SAndroid Build Coastguard Worker checkIncludeDirs(t, ctx, foo, 2612*333d2b36SAndroid Build Coastguard Worker expectedIncludeDirs(` 2613*333d2b36SAndroid Build Coastguard Worker .intermediates/libfoo/android_arm64_armv8-a_shared/gen/sysprop/include 2614*333d2b36SAndroid Build Coastguard Worker `), 2615*333d2b36SAndroid Build Coastguard Worker expectedSystemIncludeDirs(``), 2616*333d2b36SAndroid Build Coastguard Worker expectedGeneratedHeaders(` 2617*333d2b36SAndroid Build Coastguard Worker .intermediates/libfoo/android_arm64_armv8-a_shared/gen/sysprop/include/path/to/a.sysprop.h 2618*333d2b36SAndroid Build Coastguard Worker `), 2619*333d2b36SAndroid Build Coastguard Worker expectedOrderOnlyDeps(` 2620*333d2b36SAndroid Build Coastguard Worker .intermediates/libfoo/android_arm64_armv8-a_shared/gen/sysprop/include/path/to/a.sysprop.h 2621*333d2b36SAndroid Build Coastguard Worker .intermediates/libfoo/android_arm64_armv8-a_shared/gen/sysprop/public/include/path/to/a.sysprop.h 2622*333d2b36SAndroid Build Coastguard Worker `), 2623*333d2b36SAndroid Build Coastguard Worker ) 2624*333d2b36SAndroid Build Coastguard Worker }) 2625*333d2b36SAndroid Build Coastguard Worker} 2626*333d2b36SAndroid Build Coastguard Worker 2627*333d2b36SAndroid Build Coastguard Workerfunc TestIncludeDirectoryOrdering(t *testing.T) { 2628*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2629*333d2b36SAndroid Build Coastguard Worker 2630*333d2b36SAndroid Build Coastguard Worker expectedPlatformFlags := []string{ 2631*333d2b36SAndroid Build Coastguard Worker "-nostdlibinc", 2632*333d2b36SAndroid Build Coastguard Worker } 2633*333d2b36SAndroid Build Coastguard Worker 2634*333d2b36SAndroid Build Coastguard Worker baseExpectedFlags := []string{ 2635*333d2b36SAndroid Build Coastguard Worker "${config.ArmThumbCflags}", 2636*333d2b36SAndroid Build Coastguard Worker "${config.ArmCflags}", 2637*333d2b36SAndroid Build Coastguard Worker "${config.CommonGlobalCflags}", 2638*333d2b36SAndroid Build Coastguard Worker "${config.DeviceGlobalCflags}", 2639*333d2b36SAndroid Build Coastguard Worker "${config.ExternalCflags}", 2640*333d2b36SAndroid Build Coastguard Worker "${config.ArmToolchainCflags}", 2641*333d2b36SAndroid Build Coastguard Worker "${config.ArmArmv7ANeonCflags}", 2642*333d2b36SAndroid Build Coastguard Worker "${config.ArmGenericCflags}", 2643*333d2b36SAndroid Build Coastguard Worker } 2644*333d2b36SAndroid Build Coastguard Worker 2645*333d2b36SAndroid Build Coastguard Worker expectedTargetNDKFlags := []string{ 2646*333d2b36SAndroid Build Coastguard Worker "-target", 2647*333d2b36SAndroid Build Coastguard Worker "armv7a-linux-androideabi21", 2648*333d2b36SAndroid Build Coastguard Worker } 2649*333d2b36SAndroid Build Coastguard Worker 2650*333d2b36SAndroid Build Coastguard Worker expectedTargetPlatformFlags := []string{ 2651*333d2b36SAndroid Build Coastguard Worker "-target", 2652*333d2b36SAndroid Build Coastguard Worker "armv7a-linux-androideabi10000", 2653*333d2b36SAndroid Build Coastguard Worker } 2654*333d2b36SAndroid Build Coastguard Worker 2655*333d2b36SAndroid Build Coastguard Worker expectedIncludes := []string{ 2656*333d2b36SAndroid Build Coastguard Worker "external/foo/android_arm_export_include_dirs", 2657*333d2b36SAndroid Build Coastguard Worker "external/foo/lib32_export_include_dirs", 2658*333d2b36SAndroid Build Coastguard Worker "external/foo/arm_export_include_dirs", 2659*333d2b36SAndroid Build Coastguard Worker "external/foo/android_export_include_dirs", 2660*333d2b36SAndroid Build Coastguard Worker "external/foo/linux_export_include_dirs", 2661*333d2b36SAndroid Build Coastguard Worker "external/foo/export_include_dirs", 2662*333d2b36SAndroid Build Coastguard Worker "external/foo/android_arm_local_include_dirs", 2663*333d2b36SAndroid Build Coastguard Worker "external/foo/lib32_local_include_dirs", 2664*333d2b36SAndroid Build Coastguard Worker "external/foo/arm_local_include_dirs", 2665*333d2b36SAndroid Build Coastguard Worker "external/foo/android_local_include_dirs", 2666*333d2b36SAndroid Build Coastguard Worker "external/foo/linux_local_include_dirs", 2667*333d2b36SAndroid Build Coastguard Worker "external/foo/local_include_dirs", 2668*333d2b36SAndroid Build Coastguard Worker "external/foo", 2669*333d2b36SAndroid Build Coastguard Worker "external/foo/libheader1", 2670*333d2b36SAndroid Build Coastguard Worker "external/foo/libheader2", 2671*333d2b36SAndroid Build Coastguard Worker "external/foo/libwhole1", 2672*333d2b36SAndroid Build Coastguard Worker "external/foo/libwhole2", 2673*333d2b36SAndroid Build Coastguard Worker "external/foo/libstatic1", 2674*333d2b36SAndroid Build Coastguard Worker "external/foo/libstatic2", 2675*333d2b36SAndroid Build Coastguard Worker "external/foo/libshared1", 2676*333d2b36SAndroid Build Coastguard Worker "external/foo/libshared2", 2677*333d2b36SAndroid Build Coastguard Worker "external/foo/liblinux", 2678*333d2b36SAndroid Build Coastguard Worker "external/foo/libandroid", 2679*333d2b36SAndroid Build Coastguard Worker "external/foo/libarm", 2680*333d2b36SAndroid Build Coastguard Worker "external/foo/lib32", 2681*333d2b36SAndroid Build Coastguard Worker "external/foo/libandroid_arm", 2682*333d2b36SAndroid Build Coastguard Worker } 2683*333d2b36SAndroid Build Coastguard Worker 2684*333d2b36SAndroid Build Coastguard Worker expectedNDKSTLIncludes := []string{ 2685*333d2b36SAndroid Build Coastguard Worker "defaults/cc/common/ndk_libc++_shared_include_dirs", 2686*333d2b36SAndroid Build Coastguard Worker } 2687*333d2b36SAndroid Build Coastguard Worker 2688*333d2b36SAndroid Build Coastguard Worker conly := []string{"-fPIC", "${config.CommonGlobalConlyflags}"} 2689*333d2b36SAndroid Build Coastguard Worker cppOnly := []string{"-fPIC", "${config.CommonGlobalCppflags}", "${config.DeviceGlobalCppflags}", "${config.ArmCppflags}"} 2690*333d2b36SAndroid Build Coastguard Worker 2691*333d2b36SAndroid Build Coastguard Worker cflags := []string{"-Werror", "-std=candcpp"} 2692*333d2b36SAndroid Build Coastguard Worker cstd := []string{"-std=gnu17", "-std=conly"} 2693*333d2b36SAndroid Build Coastguard Worker cppstd := []string{"-std=gnu++20", "-std=cpp", "-fno-rtti"} 2694*333d2b36SAndroid Build Coastguard Worker 2695*333d2b36SAndroid Build Coastguard Worker lastNDKFlags := []string{ 2696*333d2b36SAndroid Build Coastguard Worker "--sysroot", 2697*333d2b36SAndroid Build Coastguard Worker "out/soong/ndk/sysroot", 2698*333d2b36SAndroid Build Coastguard Worker } 2699*333d2b36SAndroid Build Coastguard Worker 2700*333d2b36SAndroid Build Coastguard Worker lastPlatformIncludes := []string{ 2701*333d2b36SAndroid Build Coastguard Worker "${config.CommonGlobalIncludes}", 2702*333d2b36SAndroid Build Coastguard Worker } 2703*333d2b36SAndroid Build Coastguard Worker 2704*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 2705*333d2b36SAndroid Build Coastguard Worker name string 2706*333d2b36SAndroid Build Coastguard Worker src string 2707*333d2b36SAndroid Build Coastguard Worker expectedNDK []string 2708*333d2b36SAndroid Build Coastguard Worker expectedPlatform []string 2709*333d2b36SAndroid Build Coastguard Worker }{ 2710*333d2b36SAndroid Build Coastguard Worker { 2711*333d2b36SAndroid Build Coastguard Worker name: "c", 2712*333d2b36SAndroid Build Coastguard Worker src: "foo.c", 2713*333d2b36SAndroid Build Coastguard Worker expectedNDK: slices.Concat( 2714*333d2b36SAndroid Build Coastguard Worker baseExpectedFlags, 2715*333d2b36SAndroid Build Coastguard Worker expectedTargetNDKFlags, 2716*333d2b36SAndroid Build Coastguard Worker conly, 2717*333d2b36SAndroid Build Coastguard Worker expectedIncludes, 2718*333d2b36SAndroid Build Coastguard Worker expectedNDKSTLIncludes, 2719*333d2b36SAndroid Build Coastguard Worker cflags, 2720*333d2b36SAndroid Build Coastguard Worker cstd, 2721*333d2b36SAndroid Build Coastguard Worker lastNDKFlags, 2722*333d2b36SAndroid Build Coastguard Worker []string{"${config.NoOverrideGlobalCflags}", "${config.NoOverrideExternalGlobalCflags}"}, 2723*333d2b36SAndroid Build Coastguard Worker ), 2724*333d2b36SAndroid Build Coastguard Worker expectedPlatform: slices.Concat( 2725*333d2b36SAndroid Build Coastguard Worker expectedPlatformFlags, 2726*333d2b36SAndroid Build Coastguard Worker baseExpectedFlags, 2727*333d2b36SAndroid Build Coastguard Worker expectedTargetPlatformFlags, 2728*333d2b36SAndroid Build Coastguard Worker conly, 2729*333d2b36SAndroid Build Coastguard Worker expectedIncludes, 2730*333d2b36SAndroid Build Coastguard Worker cflags, 2731*333d2b36SAndroid Build Coastguard Worker cstd, 2732*333d2b36SAndroid Build Coastguard Worker lastPlatformIncludes, 2733*333d2b36SAndroid Build Coastguard Worker []string{"${config.NoOverrideGlobalCflags}", "${config.NoOverrideExternalGlobalCflags}"}, 2734*333d2b36SAndroid Build Coastguard Worker ), 2735*333d2b36SAndroid Build Coastguard Worker }, 2736*333d2b36SAndroid Build Coastguard Worker { 2737*333d2b36SAndroid Build Coastguard Worker name: "cc", 2738*333d2b36SAndroid Build Coastguard Worker src: "foo.cc", 2739*333d2b36SAndroid Build Coastguard Worker expectedNDK: slices.Concat( 2740*333d2b36SAndroid Build Coastguard Worker baseExpectedFlags, 2741*333d2b36SAndroid Build Coastguard Worker expectedTargetNDKFlags, 2742*333d2b36SAndroid Build Coastguard Worker cppOnly, 2743*333d2b36SAndroid Build Coastguard Worker expectedIncludes, 2744*333d2b36SAndroid Build Coastguard Worker expectedNDKSTLIncludes, 2745*333d2b36SAndroid Build Coastguard Worker cflags, 2746*333d2b36SAndroid Build Coastguard Worker cppstd, 2747*333d2b36SAndroid Build Coastguard Worker lastNDKFlags, 2748*333d2b36SAndroid Build Coastguard Worker []string{"${config.NoOverrideGlobalCflags}", "${config.NoOverrideExternalGlobalCflags}"}, 2749*333d2b36SAndroid Build Coastguard Worker ), 2750*333d2b36SAndroid Build Coastguard Worker expectedPlatform: slices.Concat( 2751*333d2b36SAndroid Build Coastguard Worker expectedPlatformFlags, 2752*333d2b36SAndroid Build Coastguard Worker baseExpectedFlags, 2753*333d2b36SAndroid Build Coastguard Worker expectedTargetPlatformFlags, 2754*333d2b36SAndroid Build Coastguard Worker cppOnly, 2755*333d2b36SAndroid Build Coastguard Worker expectedIncludes, 2756*333d2b36SAndroid Build Coastguard Worker cflags, 2757*333d2b36SAndroid Build Coastguard Worker cppstd, 2758*333d2b36SAndroid Build Coastguard Worker lastPlatformIncludes, 2759*333d2b36SAndroid Build Coastguard Worker []string{"${config.NoOverrideGlobalCflags}", "${config.NoOverrideExternalGlobalCflags}"}, 2760*333d2b36SAndroid Build Coastguard Worker ), 2761*333d2b36SAndroid Build Coastguard Worker }, 2762*333d2b36SAndroid Build Coastguard Worker { 2763*333d2b36SAndroid Build Coastguard Worker name: "assemble", 2764*333d2b36SAndroid Build Coastguard Worker src: "foo.s", 2765*333d2b36SAndroid Build Coastguard Worker expectedNDK: slices.Concat( 2766*333d2b36SAndroid Build Coastguard Worker baseExpectedFlags, 2767*333d2b36SAndroid Build Coastguard Worker expectedTargetNDKFlags, 2768*333d2b36SAndroid Build Coastguard Worker []string{"${config.CommonGlobalAsflags}"}, 2769*333d2b36SAndroid Build Coastguard Worker expectedIncludes, 2770*333d2b36SAndroid Build Coastguard Worker expectedNDKSTLIncludes, 2771*333d2b36SAndroid Build Coastguard Worker lastNDKFlags, 2772*333d2b36SAndroid Build Coastguard Worker ), 2773*333d2b36SAndroid Build Coastguard Worker expectedPlatform: slices.Concat( 2774*333d2b36SAndroid Build Coastguard Worker expectedPlatformFlags, 2775*333d2b36SAndroid Build Coastguard Worker baseExpectedFlags, 2776*333d2b36SAndroid Build Coastguard Worker expectedTargetPlatformFlags, 2777*333d2b36SAndroid Build Coastguard Worker []string{"${config.CommonGlobalAsflags}"}, 2778*333d2b36SAndroid Build Coastguard Worker expectedIncludes, 2779*333d2b36SAndroid Build Coastguard Worker lastPlatformIncludes, 2780*333d2b36SAndroid Build Coastguard Worker ), 2781*333d2b36SAndroid Build Coastguard Worker }, 2782*333d2b36SAndroid Build Coastguard Worker } 2783*333d2b36SAndroid Build Coastguard Worker 2784*333d2b36SAndroid Build Coastguard Worker for _, tc := range testCases { 2785*333d2b36SAndroid Build Coastguard Worker t.Run(tc.name, func(t *testing.T) { 2786*333d2b36SAndroid Build Coastguard Worker bp := fmt.Sprintf(` 2787*333d2b36SAndroid Build Coastguard Worker cc_library { 2788*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 2789*333d2b36SAndroid Build Coastguard Worker srcs: ["%s"], 2790*333d2b36SAndroid Build Coastguard Worker cflags: ["-std=candcpp"], 2791*333d2b36SAndroid Build Coastguard Worker conlyflags: ["-std=conly"], 2792*333d2b36SAndroid Build Coastguard Worker cppflags: ["-std=cpp"], 2793*333d2b36SAndroid Build Coastguard Worker local_include_dirs: ["local_include_dirs"], 2794*333d2b36SAndroid Build Coastguard Worker export_include_dirs: ["export_include_dirs"], 2795*333d2b36SAndroid Build Coastguard Worker export_system_include_dirs: ["export_system_include_dirs"], 2796*333d2b36SAndroid Build Coastguard Worker static_libs: ["libstatic1", "libstatic2"], 2797*333d2b36SAndroid Build Coastguard Worker whole_static_libs: ["libwhole1", "libwhole2"], 2798*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libshared1", "libshared2"], 2799*333d2b36SAndroid Build Coastguard Worker header_libs: ["libheader1", "libheader2"], 2800*333d2b36SAndroid Build Coastguard Worker target: { 2801*333d2b36SAndroid Build Coastguard Worker android: { 2802*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libandroid"], 2803*333d2b36SAndroid Build Coastguard Worker local_include_dirs: ["android_local_include_dirs"], 2804*333d2b36SAndroid Build Coastguard Worker export_include_dirs: ["android_export_include_dirs"], 2805*333d2b36SAndroid Build Coastguard Worker }, 2806*333d2b36SAndroid Build Coastguard Worker android_arm: { 2807*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libandroid_arm"], 2808*333d2b36SAndroid Build Coastguard Worker local_include_dirs: ["android_arm_local_include_dirs"], 2809*333d2b36SAndroid Build Coastguard Worker export_include_dirs: ["android_arm_export_include_dirs"], 2810*333d2b36SAndroid Build Coastguard Worker }, 2811*333d2b36SAndroid Build Coastguard Worker linux: { 2812*333d2b36SAndroid Build Coastguard Worker shared_libs: ["liblinux"], 2813*333d2b36SAndroid Build Coastguard Worker local_include_dirs: ["linux_local_include_dirs"], 2814*333d2b36SAndroid Build Coastguard Worker export_include_dirs: ["linux_export_include_dirs"], 2815*333d2b36SAndroid Build Coastguard Worker }, 2816*333d2b36SAndroid Build Coastguard Worker }, 2817*333d2b36SAndroid Build Coastguard Worker multilib: { 2818*333d2b36SAndroid Build Coastguard Worker lib32: { 2819*333d2b36SAndroid Build Coastguard Worker shared_libs: ["lib32"], 2820*333d2b36SAndroid Build Coastguard Worker local_include_dirs: ["lib32_local_include_dirs"], 2821*333d2b36SAndroid Build Coastguard Worker export_include_dirs: ["lib32_export_include_dirs"], 2822*333d2b36SAndroid Build Coastguard Worker }, 2823*333d2b36SAndroid Build Coastguard Worker }, 2824*333d2b36SAndroid Build Coastguard Worker arch: { 2825*333d2b36SAndroid Build Coastguard Worker arm: { 2826*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libarm"], 2827*333d2b36SAndroid Build Coastguard Worker local_include_dirs: ["arm_local_include_dirs"], 2828*333d2b36SAndroid Build Coastguard Worker export_include_dirs: ["arm_export_include_dirs"], 2829*333d2b36SAndroid Build Coastguard Worker }, 2830*333d2b36SAndroid Build Coastguard Worker }, 2831*333d2b36SAndroid Build Coastguard Worker stl: "libc++", 2832*333d2b36SAndroid Build Coastguard Worker sdk_version: "minimum", 2833*333d2b36SAndroid Build Coastguard Worker } 2834*333d2b36SAndroid Build Coastguard Worker 2835*333d2b36SAndroid Build Coastguard Worker cc_library_headers { 2836*333d2b36SAndroid Build Coastguard Worker name: "libheader1", 2837*333d2b36SAndroid Build Coastguard Worker export_include_dirs: ["libheader1"], 2838*333d2b36SAndroid Build Coastguard Worker sdk_version: "minimum", 2839*333d2b36SAndroid Build Coastguard Worker stl: "none", 2840*333d2b36SAndroid Build Coastguard Worker } 2841*333d2b36SAndroid Build Coastguard Worker 2842*333d2b36SAndroid Build Coastguard Worker cc_library_headers { 2843*333d2b36SAndroid Build Coastguard Worker name: "libheader2", 2844*333d2b36SAndroid Build Coastguard Worker export_include_dirs: ["libheader2"], 2845*333d2b36SAndroid Build Coastguard Worker sdk_version: "minimum", 2846*333d2b36SAndroid Build Coastguard Worker stl: "none", 2847*333d2b36SAndroid Build Coastguard Worker } 2848*333d2b36SAndroid Build Coastguard Worker `, tc.src) 2849*333d2b36SAndroid Build Coastguard Worker 2850*333d2b36SAndroid Build Coastguard Worker libs := []string{ 2851*333d2b36SAndroid Build Coastguard Worker "libstatic1", 2852*333d2b36SAndroid Build Coastguard Worker "libstatic2", 2853*333d2b36SAndroid Build Coastguard Worker "libwhole1", 2854*333d2b36SAndroid Build Coastguard Worker "libwhole2", 2855*333d2b36SAndroid Build Coastguard Worker "libshared1", 2856*333d2b36SAndroid Build Coastguard Worker "libshared2", 2857*333d2b36SAndroid Build Coastguard Worker "libandroid", 2858*333d2b36SAndroid Build Coastguard Worker "libandroid_arm", 2859*333d2b36SAndroid Build Coastguard Worker "liblinux", 2860*333d2b36SAndroid Build Coastguard Worker "lib32", 2861*333d2b36SAndroid Build Coastguard Worker "libarm", 2862*333d2b36SAndroid Build Coastguard Worker } 2863*333d2b36SAndroid Build Coastguard Worker 2864*333d2b36SAndroid Build Coastguard Worker for _, lib := range libs { 2865*333d2b36SAndroid Build Coastguard Worker bp += fmt.Sprintf(` 2866*333d2b36SAndroid Build Coastguard Worker cc_library { 2867*333d2b36SAndroid Build Coastguard Worker name: "%s", 2868*333d2b36SAndroid Build Coastguard Worker export_include_dirs: ["%s"], 2869*333d2b36SAndroid Build Coastguard Worker sdk_version: "minimum", 2870*333d2b36SAndroid Build Coastguard Worker stl: "none", 2871*333d2b36SAndroid Build Coastguard Worker } 2872*333d2b36SAndroid Build Coastguard Worker `, lib, lib) 2873*333d2b36SAndroid Build Coastguard Worker } 2874*333d2b36SAndroid Build Coastguard Worker 2875*333d2b36SAndroid Build Coastguard Worker runTest := func(t *testing.T, variant string, expected []string) { 2876*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers( 2877*333d2b36SAndroid Build Coastguard Worker PrepareForIntegrationTestWithCc, 2878*333d2b36SAndroid Build Coastguard Worker android.FixtureAddTextFile("external/foo/Android.bp", bp), 2879*333d2b36SAndroid Build Coastguard Worker ).RunTest(t) 2880*333d2b36SAndroid Build Coastguard Worker cflags := ctx.ModuleForTests("libfoo", variant).Output("obj/external/foo/foo.o").Args["cFlags"] 2881*333d2b36SAndroid Build Coastguard Worker 2882*333d2b36SAndroid Build Coastguard Worker var includes []string 2883*333d2b36SAndroid Build Coastguard Worker flags := strings.Split(cflags, " ") 2884*333d2b36SAndroid Build Coastguard Worker for _, flag := range flags { 2885*333d2b36SAndroid Build Coastguard Worker if strings.HasPrefix(flag, "-I") { 2886*333d2b36SAndroid Build Coastguard Worker includes = append(includes, strings.TrimPrefix(flag, "-I")) 2887*333d2b36SAndroid Build Coastguard Worker } else if flag == "-isystem" { 2888*333d2b36SAndroid Build Coastguard Worker // skip isystem, include next 2889*333d2b36SAndroid Build Coastguard Worker } else if len(flag) > 0 { 2890*333d2b36SAndroid Build Coastguard Worker includes = append(includes, flag) 2891*333d2b36SAndroid Build Coastguard Worker } 2892*333d2b36SAndroid Build Coastguard Worker } 2893*333d2b36SAndroid Build Coastguard Worker 2894*333d2b36SAndroid Build Coastguard Worker android.AssertArrayString(t, "includes", expected, includes) 2895*333d2b36SAndroid Build Coastguard Worker } 2896*333d2b36SAndroid Build Coastguard Worker 2897*333d2b36SAndroid Build Coastguard Worker t.Run("platform", func(t *testing.T) { 2898*333d2b36SAndroid Build Coastguard Worker runTest(t, "android_arm_armv7-a-neon_static", tc.expectedPlatform) 2899*333d2b36SAndroid Build Coastguard Worker }) 2900*333d2b36SAndroid Build Coastguard Worker t.Run("ndk", func(t *testing.T) { 2901*333d2b36SAndroid Build Coastguard Worker runTest(t, "android_arm_armv7-a-neon_sdk_static", tc.expectedNDK) 2902*333d2b36SAndroid Build Coastguard Worker }) 2903*333d2b36SAndroid Build Coastguard Worker }) 2904*333d2b36SAndroid Build Coastguard Worker } 2905*333d2b36SAndroid Build Coastguard Worker 2906*333d2b36SAndroid Build Coastguard Worker} 2907*333d2b36SAndroid Build Coastguard Worker 2908*333d2b36SAndroid Build Coastguard Workerfunc TestAddnoOverride64GlobalCflags(t *testing.T) { 2909*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2910*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, ` 2911*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 2912*333d2b36SAndroid Build Coastguard Worker name: "libclient", 2913*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 2914*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libfoo#1"], 2915*333d2b36SAndroid Build Coastguard Worker } 2916*333d2b36SAndroid Build Coastguard Worker 2917*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 2918*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 2919*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 2920*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbar"], 2921*333d2b36SAndroid Build Coastguard Worker export_shared_lib_headers: ["libbar"], 2922*333d2b36SAndroid Build Coastguard Worker stubs: { 2923*333d2b36SAndroid Build Coastguard Worker symbol_file: "foo.map.txt", 2924*333d2b36SAndroid Build Coastguard Worker versions: ["1", "2", "3"], 2925*333d2b36SAndroid Build Coastguard Worker }, 2926*333d2b36SAndroid Build Coastguard Worker } 2927*333d2b36SAndroid Build Coastguard Worker 2928*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 2929*333d2b36SAndroid Build Coastguard Worker name: "libbar", 2930*333d2b36SAndroid Build Coastguard Worker export_include_dirs: ["include/libbar"], 2931*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 2932*333d2b36SAndroid Build Coastguard Worker }`) 2933*333d2b36SAndroid Build Coastguard Worker 2934*333d2b36SAndroid Build Coastguard Worker cFlags := ctx.ModuleForTests("libclient", "android_arm64_armv8-a_shared").Rule("cc").Args["cFlags"] 2935*333d2b36SAndroid Build Coastguard Worker 2936*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(cFlags, "${config.NoOverride64GlobalCflags}") { 2937*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected %q in cflags, got %q", "${config.NoOverride64GlobalCflags}", cFlags) 2938*333d2b36SAndroid Build Coastguard Worker } 2939*333d2b36SAndroid Build Coastguard Worker} 2940*333d2b36SAndroid Build Coastguard Worker 2941*333d2b36SAndroid Build Coastguard Workerfunc TestCcBuildBrokenClangProperty(t *testing.T) { 2942*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2943*333d2b36SAndroid Build Coastguard Worker tests := []struct { 2944*333d2b36SAndroid Build Coastguard Worker name string 2945*333d2b36SAndroid Build Coastguard Worker clang bool 2946*333d2b36SAndroid Build Coastguard Worker BuildBrokenClangProperty bool 2947*333d2b36SAndroid Build Coastguard Worker err string 2948*333d2b36SAndroid Build Coastguard Worker }{ 2949*333d2b36SAndroid Build Coastguard Worker { 2950*333d2b36SAndroid Build Coastguard Worker name: "error when clang is set to false", 2951*333d2b36SAndroid Build Coastguard Worker clang: false, 2952*333d2b36SAndroid Build Coastguard Worker err: "is no longer supported", 2953*333d2b36SAndroid Build Coastguard Worker }, 2954*333d2b36SAndroid Build Coastguard Worker { 2955*333d2b36SAndroid Build Coastguard Worker name: "error when clang is set to true", 2956*333d2b36SAndroid Build Coastguard Worker clang: true, 2957*333d2b36SAndroid Build Coastguard Worker err: "property is deprecated, see Changes.md", 2958*333d2b36SAndroid Build Coastguard Worker }, 2959*333d2b36SAndroid Build Coastguard Worker { 2960*333d2b36SAndroid Build Coastguard Worker name: "no error when BuildBrokenClangProperty is explicitly set to true", 2961*333d2b36SAndroid Build Coastguard Worker clang: true, 2962*333d2b36SAndroid Build Coastguard Worker BuildBrokenClangProperty: true, 2963*333d2b36SAndroid Build Coastguard Worker }, 2964*333d2b36SAndroid Build Coastguard Worker } 2965*333d2b36SAndroid Build Coastguard Worker 2966*333d2b36SAndroid Build Coastguard Worker for _, test := range tests { 2967*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 2968*333d2b36SAndroid Build Coastguard Worker bp := fmt.Sprintf(` 2969*333d2b36SAndroid Build Coastguard Worker cc_library { 2970*333d2b36SAndroid Build Coastguard Worker name: "foo", 2971*333d2b36SAndroid Build Coastguard Worker clang: %t, 2972*333d2b36SAndroid Build Coastguard Worker }`, test.clang) 2973*333d2b36SAndroid Build Coastguard Worker 2974*333d2b36SAndroid Build Coastguard Worker if test.err == "" { 2975*333d2b36SAndroid Build Coastguard Worker android.GroupFixturePreparers( 2976*333d2b36SAndroid Build Coastguard Worker prepareForCcTest, 2977*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 2978*333d2b36SAndroid Build Coastguard Worker if test.BuildBrokenClangProperty { 2979*333d2b36SAndroid Build Coastguard Worker variables.BuildBrokenClangProperty = test.BuildBrokenClangProperty 2980*333d2b36SAndroid Build Coastguard Worker } 2981*333d2b36SAndroid Build Coastguard Worker }), 2982*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 2983*333d2b36SAndroid Build Coastguard Worker } else { 2984*333d2b36SAndroid Build Coastguard Worker prepareForCcTest. 2985*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(test.err)). 2986*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, bp) 2987*333d2b36SAndroid Build Coastguard Worker } 2988*333d2b36SAndroid Build Coastguard Worker }) 2989*333d2b36SAndroid Build Coastguard Worker } 2990*333d2b36SAndroid Build Coastguard Worker} 2991*333d2b36SAndroid Build Coastguard Worker 2992*333d2b36SAndroid Build Coastguard Workerfunc TestCcBuildBrokenClangAsFlags(t *testing.T) { 2993*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2994*333d2b36SAndroid Build Coastguard Worker tests := []struct { 2995*333d2b36SAndroid Build Coastguard Worker name string 2996*333d2b36SAndroid Build Coastguard Worker clangAsFlags []string 2997*333d2b36SAndroid Build Coastguard Worker BuildBrokenClangAsFlags bool 2998*333d2b36SAndroid Build Coastguard Worker err string 2999*333d2b36SAndroid Build Coastguard Worker }{ 3000*333d2b36SAndroid Build Coastguard Worker { 3001*333d2b36SAndroid Build Coastguard Worker name: "error when clang_asflags is set", 3002*333d2b36SAndroid Build Coastguard Worker clangAsFlags: []string{"-a", "-b"}, 3003*333d2b36SAndroid Build Coastguard Worker err: "clang_asflags: property is deprecated", 3004*333d2b36SAndroid Build Coastguard Worker }, 3005*333d2b36SAndroid Build Coastguard Worker { 3006*333d2b36SAndroid Build Coastguard Worker name: "no error when BuildBrokenClangAsFlags is explicitly set to true", 3007*333d2b36SAndroid Build Coastguard Worker clangAsFlags: []string{"-a", "-b"}, 3008*333d2b36SAndroid Build Coastguard Worker BuildBrokenClangAsFlags: true, 3009*333d2b36SAndroid Build Coastguard Worker }, 3010*333d2b36SAndroid Build Coastguard Worker } 3011*333d2b36SAndroid Build Coastguard Worker 3012*333d2b36SAndroid Build Coastguard Worker for _, test := range tests { 3013*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 3014*333d2b36SAndroid Build Coastguard Worker bp := fmt.Sprintf(` 3015*333d2b36SAndroid Build Coastguard Worker cc_library { 3016*333d2b36SAndroid Build Coastguard Worker name: "foo", 3017*333d2b36SAndroid Build Coastguard Worker clang_asflags: %s, 3018*333d2b36SAndroid Build Coastguard Worker }`, `["`+strings.Join(test.clangAsFlags, `","`)+`"]`) 3019*333d2b36SAndroid Build Coastguard Worker 3020*333d2b36SAndroid Build Coastguard Worker if test.err == "" { 3021*333d2b36SAndroid Build Coastguard Worker android.GroupFixturePreparers( 3022*333d2b36SAndroid Build Coastguard Worker prepareForCcTest, 3023*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 3024*333d2b36SAndroid Build Coastguard Worker if test.BuildBrokenClangAsFlags { 3025*333d2b36SAndroid Build Coastguard Worker variables.BuildBrokenClangAsFlags = test.BuildBrokenClangAsFlags 3026*333d2b36SAndroid Build Coastguard Worker } 3027*333d2b36SAndroid Build Coastguard Worker }), 3028*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 3029*333d2b36SAndroid Build Coastguard Worker } else { 3030*333d2b36SAndroid Build Coastguard Worker prepareForCcTest. 3031*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(test.err)). 3032*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, bp) 3033*333d2b36SAndroid Build Coastguard Worker } 3034*333d2b36SAndroid Build Coastguard Worker }) 3035*333d2b36SAndroid Build Coastguard Worker } 3036*333d2b36SAndroid Build Coastguard Worker} 3037*333d2b36SAndroid Build Coastguard Worker 3038*333d2b36SAndroid Build Coastguard Workerfunc TestCcBuildBrokenClangCFlags(t *testing.T) { 3039*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3040*333d2b36SAndroid Build Coastguard Worker tests := []struct { 3041*333d2b36SAndroid Build Coastguard Worker name string 3042*333d2b36SAndroid Build Coastguard Worker clangCFlags []string 3043*333d2b36SAndroid Build Coastguard Worker BuildBrokenClangCFlags bool 3044*333d2b36SAndroid Build Coastguard Worker err string 3045*333d2b36SAndroid Build Coastguard Worker }{ 3046*333d2b36SAndroid Build Coastguard Worker { 3047*333d2b36SAndroid Build Coastguard Worker name: "error when clang_cflags is set", 3048*333d2b36SAndroid Build Coastguard Worker clangCFlags: []string{"-a", "-b"}, 3049*333d2b36SAndroid Build Coastguard Worker err: "clang_cflags: property is deprecated", 3050*333d2b36SAndroid Build Coastguard Worker }, 3051*333d2b36SAndroid Build Coastguard Worker { 3052*333d2b36SAndroid Build Coastguard Worker name: "no error when BuildBrokenClangCFlags is explicitly set to true", 3053*333d2b36SAndroid Build Coastguard Worker clangCFlags: []string{"-a", "-b"}, 3054*333d2b36SAndroid Build Coastguard Worker BuildBrokenClangCFlags: true, 3055*333d2b36SAndroid Build Coastguard Worker }, 3056*333d2b36SAndroid Build Coastguard Worker } 3057*333d2b36SAndroid Build Coastguard Worker 3058*333d2b36SAndroid Build Coastguard Worker for _, test := range tests { 3059*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 3060*333d2b36SAndroid Build Coastguard Worker bp := fmt.Sprintf(` 3061*333d2b36SAndroid Build Coastguard Worker cc_library { 3062*333d2b36SAndroid Build Coastguard Worker name: "foo", 3063*333d2b36SAndroid Build Coastguard Worker clang_cflags: %s, 3064*333d2b36SAndroid Build Coastguard Worker }`, `["`+strings.Join(test.clangCFlags, `","`)+`"]`) 3065*333d2b36SAndroid Build Coastguard Worker 3066*333d2b36SAndroid Build Coastguard Worker if test.err == "" { 3067*333d2b36SAndroid Build Coastguard Worker android.GroupFixturePreparers( 3068*333d2b36SAndroid Build Coastguard Worker prepareForCcTest, 3069*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 3070*333d2b36SAndroid Build Coastguard Worker if test.BuildBrokenClangCFlags { 3071*333d2b36SAndroid Build Coastguard Worker variables.BuildBrokenClangCFlags = test.BuildBrokenClangCFlags 3072*333d2b36SAndroid Build Coastguard Worker } 3073*333d2b36SAndroid Build Coastguard Worker }), 3074*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 3075*333d2b36SAndroid Build Coastguard Worker } else { 3076*333d2b36SAndroid Build Coastguard Worker prepareForCcTest. 3077*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(test.err)). 3078*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, bp) 3079*333d2b36SAndroid Build Coastguard Worker } 3080*333d2b36SAndroid Build Coastguard Worker }) 3081*333d2b36SAndroid Build Coastguard Worker } 3082*333d2b36SAndroid Build Coastguard Worker} 3083*333d2b36SAndroid Build Coastguard Worker 3084*333d2b36SAndroid Build Coastguard Workerfunc TestStrippedAllOutputFile(t *testing.T) { 3085*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3086*333d2b36SAndroid Build Coastguard Worker bp := ` 3087*333d2b36SAndroid Build Coastguard Worker cc_library { 3088*333d2b36SAndroid Build Coastguard Worker name: "test_lib", 3089*333d2b36SAndroid Build Coastguard Worker srcs: ["test_lib.cpp"], 3090*333d2b36SAndroid Build Coastguard Worker dist: { 3091*333d2b36SAndroid Build Coastguard Worker targets: [ "dist_target" ], 3092*333d2b36SAndroid Build Coastguard Worker tag: "stripped_all", 3093*333d2b36SAndroid Build Coastguard Worker } 3094*333d2b36SAndroid Build Coastguard Worker } 3095*333d2b36SAndroid Build Coastguard Worker ` 3096*333d2b36SAndroid Build Coastguard Worker config := TestConfig(t.TempDir(), android.Android, nil, bp, nil) 3097*333d2b36SAndroid Build Coastguard Worker ctx := testCcWithConfig(t, config) 3098*333d2b36SAndroid Build Coastguard Worker testingModule := ctx.ModuleForTests("test_lib", "android_arm_armv7-a-neon_shared") 3099*333d2b36SAndroid Build Coastguard Worker outputFile := testingModule.OutputFiles(ctx, t, "stripped_all") 3100*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(outputFile.Strings()[0], "/stripped_all/test_lib.so") { 3101*333d2b36SAndroid Build Coastguard Worker t.Errorf("Unexpected output file: %s", outputFile.Strings()[0]) 3102*333d2b36SAndroid Build Coastguard Worker return 3103*333d2b36SAndroid Build Coastguard Worker } 3104*333d2b36SAndroid Build Coastguard Worker} 3105*333d2b36SAndroid Build Coastguard Worker 3106*333d2b36SAndroid Build Coastguard Workerfunc TestImageVariants(t *testing.T) { 3107*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3108*333d2b36SAndroid Build Coastguard Worker 3109*333d2b36SAndroid Build Coastguard Worker bp := ` 3110*333d2b36SAndroid Build Coastguard Worker cc_binary { 3111*333d2b36SAndroid Build Coastguard Worker name: "binfoo", 3112*333d2b36SAndroid Build Coastguard Worker srcs: ["binfoo.cc"], 3113*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 3114*333d2b36SAndroid Build Coastguard Worker product_available: true, 3115*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbar"] 3116*333d2b36SAndroid Build Coastguard Worker } 3117*333d2b36SAndroid Build Coastguard Worker cc_library { 3118*333d2b36SAndroid Build Coastguard Worker name: "libbar", 3119*333d2b36SAndroid Build Coastguard Worker srcs: ["libbar.cc"], 3120*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 3121*333d2b36SAndroid Build Coastguard Worker product_available: true, 3122*333d2b36SAndroid Build Coastguard Worker } 3123*333d2b36SAndroid Build Coastguard Worker ` 3124*333d2b36SAndroid Build Coastguard Worker 3125*333d2b36SAndroid Build Coastguard Worker ctx := prepareForCcTest.RunTestWithBp(t, bp) 3126*333d2b36SAndroid Build Coastguard Worker 3127*333d2b36SAndroid Build Coastguard Worker hasDep := func(m android.Module, wantDep android.Module) bool { 3128*333d2b36SAndroid Build Coastguard Worker t.Helper() 3129*333d2b36SAndroid Build Coastguard Worker var found bool 3130*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDeps(m, func(dep blueprint.Module) { 3131*333d2b36SAndroid Build Coastguard Worker if dep == wantDep { 3132*333d2b36SAndroid Build Coastguard Worker found = true 3133*333d2b36SAndroid Build Coastguard Worker } 3134*333d2b36SAndroid Build Coastguard Worker }) 3135*333d2b36SAndroid Build Coastguard Worker return found 3136*333d2b36SAndroid Build Coastguard Worker } 3137*333d2b36SAndroid Build Coastguard Worker 3138*333d2b36SAndroid Build Coastguard Worker testDepWithVariant := func(imageVariant string) { 3139*333d2b36SAndroid Build Coastguard Worker imageVariantStr := "" 3140*333d2b36SAndroid Build Coastguard Worker if imageVariant != "core" { 3141*333d2b36SAndroid Build Coastguard Worker imageVariantStr = "_" + imageVariant 3142*333d2b36SAndroid Build Coastguard Worker } 3143*333d2b36SAndroid Build Coastguard Worker binFooModule := ctx.ModuleForTests("binfoo", "android"+imageVariantStr+"_arm64_armv8-a").Module() 3144*333d2b36SAndroid Build Coastguard Worker libBarModule := ctx.ModuleForTests("libbar", "android"+imageVariantStr+"_arm64_armv8-a_shared").Module() 3145*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, "binfoo should have dependency on libbar with image variant "+imageVariant, true, hasDep(binFooModule, libBarModule)) 3146*333d2b36SAndroid Build Coastguard Worker } 3147*333d2b36SAndroid Build Coastguard Worker 3148*333d2b36SAndroid Build Coastguard Worker testDepWithVariant("core") 3149*333d2b36SAndroid Build Coastguard Worker testDepWithVariant("vendor") 3150*333d2b36SAndroid Build Coastguard Worker testDepWithVariant("product") 3151*333d2b36SAndroid Build Coastguard Worker} 3152*333d2b36SAndroid Build Coastguard Worker 3153*333d2b36SAndroid Build Coastguard Workerfunc TestVendorOrProductVariantUsesPlatformSdkVersionAsDefault(t *testing.T) { 3154*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3155*333d2b36SAndroid Build Coastguard Worker 3156*333d2b36SAndroid Build Coastguard Worker bp := ` 3157*333d2b36SAndroid Build Coastguard Worker cc_library { 3158*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 3159*333d2b36SAndroid Build Coastguard Worker srcs: ["libfoo.cc"], 3160*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 3161*333d2b36SAndroid Build Coastguard Worker product_available: true, 3162*333d2b36SAndroid Build Coastguard Worker } 3163*333d2b36SAndroid Build Coastguard Worker 3164*333d2b36SAndroid Build Coastguard Worker cc_library { 3165*333d2b36SAndroid Build Coastguard Worker name: "libbar", 3166*333d2b36SAndroid Build Coastguard Worker srcs: ["libbar.cc"], 3167*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 3168*333d2b36SAndroid Build Coastguard Worker product_available: true, 3169*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 3170*333d2b36SAndroid Build Coastguard Worker } 3171*333d2b36SAndroid Build Coastguard Worker ` 3172*333d2b36SAndroid Build Coastguard Worker 3173*333d2b36SAndroid Build Coastguard Worker ctx := prepareForCcTest.RunTestWithBp(t, bp) 3174*333d2b36SAndroid Build Coastguard Worker testSdkVersionFlag := func(module, variant, version string) { 3175*333d2b36SAndroid Build Coastguard Worker flags := ctx.ModuleForTests(module, "android_"+variant+"_arm64_armv8-a_static").Rule("cc").Args["cFlags"] 3176*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "target SDK version", flags, "-target aarch64-linux-android"+version) 3177*333d2b36SAndroid Build Coastguard Worker } 3178*333d2b36SAndroid Build Coastguard Worker 3179*333d2b36SAndroid Build Coastguard Worker testSdkVersionFlag("libfoo", "vendor", "30") 3180*333d2b36SAndroid Build Coastguard Worker testSdkVersionFlag("libfoo", "product", "30") 3181*333d2b36SAndroid Build Coastguard Worker // target SDK version can be set explicitly with min_sdk_version 3182*333d2b36SAndroid Build Coastguard Worker testSdkVersionFlag("libbar", "vendor", "29") 3183*333d2b36SAndroid Build Coastguard Worker testSdkVersionFlag("libbar", "product", "29") 3184*333d2b36SAndroid Build Coastguard Worker} 3185*333d2b36SAndroid Build Coastguard Worker 3186*333d2b36SAndroid Build Coastguard Workerfunc TestClangVerify(t *testing.T) { 3187*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3188*333d2b36SAndroid Build Coastguard Worker 3189*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, ` 3190*333d2b36SAndroid Build Coastguard Worker cc_library { 3191*333d2b36SAndroid Build Coastguard Worker name: "lib_no_clang_verify", 3192*333d2b36SAndroid Build Coastguard Worker srcs: ["libnocv.cc"], 3193*333d2b36SAndroid Build Coastguard Worker } 3194*333d2b36SAndroid Build Coastguard Worker 3195*333d2b36SAndroid Build Coastguard Worker cc_library { 3196*333d2b36SAndroid Build Coastguard Worker name: "lib_clang_verify", 3197*333d2b36SAndroid Build Coastguard Worker srcs: ["libcv.cc"], 3198*333d2b36SAndroid Build Coastguard Worker clang_verify: true, 3199*333d2b36SAndroid Build Coastguard Worker } 3200*333d2b36SAndroid Build Coastguard Worker `) 3201*333d2b36SAndroid Build Coastguard Worker 3202*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests("lib_no_clang_verify", "android_arm64_armv8-a_shared") 3203*333d2b36SAndroid Build Coastguard Worker 3204*333d2b36SAndroid Build Coastguard Worker cFlags_no_cv := module.Rule("cc").Args["cFlags"] 3205*333d2b36SAndroid Build Coastguard Worker if strings.Contains(cFlags_no_cv, "-Xclang") || strings.Contains(cFlags_no_cv, "-verify") { 3206*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected %q not in cflags, got %q", "-Xclang -verify", cFlags_no_cv) 3207*333d2b36SAndroid Build Coastguard Worker } 3208*333d2b36SAndroid Build Coastguard Worker 3209*333d2b36SAndroid Build Coastguard Worker cFlags_cv := ctx.ModuleForTests("lib_clang_verify", "android_arm64_armv8-a_shared").Rule("cc").Args["cFlags"] 3210*333d2b36SAndroid Build Coastguard Worker if strings.Contains(cFlags_cv, "-Xclang") && strings.Contains(cFlags_cv, "-verify") { 3211*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected %q in cflags, got %q", "-Xclang -verify", cFlags_cv) 3212*333d2b36SAndroid Build Coastguard Worker } 3213*333d2b36SAndroid Build Coastguard Worker} 3214*333d2b36SAndroid Build Coastguard Worker 3215*333d2b36SAndroid Build Coastguard Workerfunc TestCheckConflictingExplicitVersions(t *testing.T) { 3216*333d2b36SAndroid Build Coastguard Worker PrepareForIntegrationTestWithCc. 3217*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern( 3218*333d2b36SAndroid Build Coastguard Worker `shared_libs: duplicate shared libraries with different explicit versions: "libbar" and "libbar#impl"`, 3219*333d2b36SAndroid Build Coastguard Worker )). 3220*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, ` 3221*333d2b36SAndroid Build Coastguard Worker cc_library { 3222*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 3223*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbar", "libbar#impl"], 3224*333d2b36SAndroid Build Coastguard Worker } 3225*333d2b36SAndroid Build Coastguard Worker 3226*333d2b36SAndroid Build Coastguard Worker cc_library { 3227*333d2b36SAndroid Build Coastguard Worker name: "libbar", 3228*333d2b36SAndroid Build Coastguard Worker } 3229*333d2b36SAndroid Build Coastguard Worker `) 3230*333d2b36SAndroid Build Coastguard Worker} 3231