1*333d2b36SAndroid Build Coastguard Worker// Copyright 2018 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 "reflect" 19*333d2b36SAndroid Build Coastguard Worker "slices" 20*333d2b36SAndroid Build Coastguard Worker "testing" 21*333d2b36SAndroid Build Coastguard Worker 22*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 23*333d2b36SAndroid Build Coastguard Worker) 24*333d2b36SAndroid Build Coastguard Worker 25*333d2b36SAndroid Build Coastguard Workerfunc testGenruleContext(config android.Config) *android.TestContext { 26*333d2b36SAndroid Build Coastguard Worker ctx := android.NewTestArchContext(config) 27*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("cc_genrule", GenRuleFactory) 28*333d2b36SAndroid Build Coastguard Worker ctx.Register() 29*333d2b36SAndroid Build Coastguard Worker 30*333d2b36SAndroid Build Coastguard Worker return ctx 31*333d2b36SAndroid Build Coastguard Worker} 32*333d2b36SAndroid Build Coastguard Worker 33*333d2b36SAndroid Build Coastguard Workerfunc TestArchGenruleCmd(t *testing.T) { 34*333d2b36SAndroid Build Coastguard Worker fs := map[string][]byte{ 35*333d2b36SAndroid Build Coastguard Worker "tool": nil, 36*333d2b36SAndroid Build Coastguard Worker "foo": nil, 37*333d2b36SAndroid Build Coastguard Worker "bar": nil, 38*333d2b36SAndroid Build Coastguard Worker } 39*333d2b36SAndroid Build Coastguard Worker bp := ` 40*333d2b36SAndroid Build Coastguard Worker cc_genrule { 41*333d2b36SAndroid Build Coastguard Worker name: "gen", 42*333d2b36SAndroid Build Coastguard Worker tool_files: ["tool"], 43*333d2b36SAndroid Build Coastguard Worker cmd: "$(location tool) $(in) $(out)", 44*333d2b36SAndroid Build Coastguard Worker out: ["out_arm"], 45*333d2b36SAndroid Build Coastguard Worker arch: { 46*333d2b36SAndroid Build Coastguard Worker arm: { 47*333d2b36SAndroid Build Coastguard Worker srcs: ["foo"], 48*333d2b36SAndroid Build Coastguard Worker }, 49*333d2b36SAndroid Build Coastguard Worker arm64: { 50*333d2b36SAndroid Build Coastguard Worker srcs: ["bar"], 51*333d2b36SAndroid Build Coastguard Worker }, 52*333d2b36SAndroid Build Coastguard Worker }, 53*333d2b36SAndroid Build Coastguard Worker } 54*333d2b36SAndroid Build Coastguard Worker ` 55*333d2b36SAndroid Build Coastguard Worker config := android.TestArchConfig(t.TempDir(), nil, bp, fs) 56*333d2b36SAndroid Build Coastguard Worker 57*333d2b36SAndroid Build Coastguard Worker ctx := testGenruleContext(config) 58*333d2b36SAndroid Build Coastguard Worker 59*333d2b36SAndroid Build Coastguard Worker _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) 60*333d2b36SAndroid Build Coastguard Worker if errs == nil { 61*333d2b36SAndroid Build Coastguard Worker _, errs = ctx.PrepareBuildActions(config) 62*333d2b36SAndroid Build Coastguard Worker } 63*333d2b36SAndroid Build Coastguard Worker if errs != nil { 64*333d2b36SAndroid Build Coastguard Worker t.Fatal(errs) 65*333d2b36SAndroid Build Coastguard Worker } 66*333d2b36SAndroid Build Coastguard Worker 67*333d2b36SAndroid Build Coastguard Worker gen := ctx.ModuleForTests("gen", "android_arm_armv7-a-neon").Output("out_arm") 68*333d2b36SAndroid Build Coastguard Worker expected := []string{"foo"} 69*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(expected, gen.Implicits.Strings()[:len(expected)]) { 70*333d2b36SAndroid Build Coastguard Worker t.Errorf(`want arm inputs %v, got %v`, expected, gen.Implicits.Strings()) 71*333d2b36SAndroid Build Coastguard Worker } 72*333d2b36SAndroid Build Coastguard Worker 73*333d2b36SAndroid Build Coastguard Worker gen = ctx.ModuleForTests("gen", "android_arm64_armv8-a").Output("out_arm") 74*333d2b36SAndroid Build Coastguard Worker expected = []string{"bar"} 75*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(expected, gen.Implicits.Strings()[:len(expected)]) { 76*333d2b36SAndroid Build Coastguard Worker t.Errorf(`want arm64 inputs %v, got %v`, expected, gen.Implicits.Strings()) 77*333d2b36SAndroid Build Coastguard Worker } 78*333d2b36SAndroid Build Coastguard Worker} 79*333d2b36SAndroid Build Coastguard Worker 80*333d2b36SAndroid Build Coastguard Workerfunc TestLibraryGenruleCmd(t *testing.T) { 81*333d2b36SAndroid Build Coastguard Worker bp := ` 82*333d2b36SAndroid Build Coastguard Worker cc_library { 83*333d2b36SAndroid Build Coastguard Worker name: "libboth", 84*333d2b36SAndroid Build Coastguard Worker } 85*333d2b36SAndroid Build Coastguard Worker 86*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 87*333d2b36SAndroid Build Coastguard Worker name: "libshared", 88*333d2b36SAndroid Build Coastguard Worker } 89*333d2b36SAndroid Build Coastguard Worker 90*333d2b36SAndroid Build Coastguard Worker cc_library_static { 91*333d2b36SAndroid Build Coastguard Worker name: "libstatic", 92*333d2b36SAndroid Build Coastguard Worker } 93*333d2b36SAndroid Build Coastguard Worker 94*333d2b36SAndroid Build Coastguard Worker cc_genrule { 95*333d2b36SAndroid Build Coastguard Worker name: "gen", 96*333d2b36SAndroid Build Coastguard Worker tool_files: ["tool"], 97*333d2b36SAndroid Build Coastguard Worker srcs: [ 98*333d2b36SAndroid Build Coastguard Worker ":libboth", 99*333d2b36SAndroid Build Coastguard Worker ":libshared", 100*333d2b36SAndroid Build Coastguard Worker ":libstatic", 101*333d2b36SAndroid Build Coastguard Worker ], 102*333d2b36SAndroid Build Coastguard Worker cmd: "$(location tool) $(in) $(out)", 103*333d2b36SAndroid Build Coastguard Worker out: ["out"], 104*333d2b36SAndroid Build Coastguard Worker } 105*333d2b36SAndroid Build Coastguard Worker ` 106*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, bp) 107*333d2b36SAndroid Build Coastguard Worker 108*333d2b36SAndroid Build Coastguard Worker gen := ctx.ModuleForTests("gen", "android_arm_armv7-a-neon").Output("out") 109*333d2b36SAndroid Build Coastguard Worker expected := []string{"libboth.so", "libshared.so", "libstatic.a"} 110*333d2b36SAndroid Build Coastguard Worker var got []string 111*333d2b36SAndroid Build Coastguard Worker for _, input := range gen.Implicits { 112*333d2b36SAndroid Build Coastguard Worker got = append(got, input.Base()) 113*333d2b36SAndroid Build Coastguard Worker } 114*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(expected, got[:len(expected)]) { 115*333d2b36SAndroid Build Coastguard Worker t.Errorf(`want inputs %v, got %v`, expected, got) 116*333d2b36SAndroid Build Coastguard Worker } 117*333d2b36SAndroid Build Coastguard Worker} 118*333d2b36SAndroid Build Coastguard Worker 119*333d2b36SAndroid Build Coastguard Workerfunc TestCmdPrefix(t *testing.T) { 120*333d2b36SAndroid Build Coastguard Worker bp := ` 121*333d2b36SAndroid Build Coastguard Worker cc_genrule { 122*333d2b36SAndroid Build Coastguard Worker name: "gen", 123*333d2b36SAndroid Build Coastguard Worker cmd: "echo foo", 124*333d2b36SAndroid Build Coastguard Worker out: ["out"], 125*333d2b36SAndroid Build Coastguard Worker native_bridge_supported: true, 126*333d2b36SAndroid Build Coastguard Worker } 127*333d2b36SAndroid Build Coastguard Worker ` 128*333d2b36SAndroid Build Coastguard Worker 129*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 130*333d2b36SAndroid Build Coastguard Worker name string 131*333d2b36SAndroid Build Coastguard Worker variant string 132*333d2b36SAndroid Build Coastguard Worker preparer android.FixturePreparer 133*333d2b36SAndroid Build Coastguard Worker 134*333d2b36SAndroid Build Coastguard Worker arch string 135*333d2b36SAndroid Build Coastguard Worker nativeBridge string 136*333d2b36SAndroid Build Coastguard Worker multilib string 137*333d2b36SAndroid Build Coastguard Worker }{ 138*333d2b36SAndroid Build Coastguard Worker { 139*333d2b36SAndroid Build Coastguard Worker name: "arm", 140*333d2b36SAndroid Build Coastguard Worker variant: "android_arm_armv7-a-neon", 141*333d2b36SAndroid Build Coastguard Worker arch: "arm", 142*333d2b36SAndroid Build Coastguard Worker multilib: "lib32", 143*333d2b36SAndroid Build Coastguard Worker }, 144*333d2b36SAndroid Build Coastguard Worker { 145*333d2b36SAndroid Build Coastguard Worker name: "arm64", 146*333d2b36SAndroid Build Coastguard Worker variant: "android_arm64_armv8-a", 147*333d2b36SAndroid Build Coastguard Worker arch: "arm64", 148*333d2b36SAndroid Build Coastguard Worker multilib: "lib64", 149*333d2b36SAndroid Build Coastguard Worker }, 150*333d2b36SAndroid Build Coastguard Worker { 151*333d2b36SAndroid Build Coastguard Worker name: "nativebridge", 152*333d2b36SAndroid Build Coastguard Worker variant: "android_native_bridge_arm_armv7-a-neon", 153*333d2b36SAndroid Build Coastguard Worker preparer: android.FixtureModifyConfig(func(config android.Config) { 154*333d2b36SAndroid Build Coastguard Worker config.Targets[android.Android] = []android.Target{ 155*333d2b36SAndroid Build Coastguard Worker { 156*333d2b36SAndroid Build Coastguard Worker Os: android.Android, 157*333d2b36SAndroid Build Coastguard Worker Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}}, 158*333d2b36SAndroid Build Coastguard Worker NativeBridge: android.NativeBridgeDisabled, 159*333d2b36SAndroid Build Coastguard Worker }, 160*333d2b36SAndroid Build Coastguard Worker { 161*333d2b36SAndroid Build Coastguard Worker Os: android.Android, 162*333d2b36SAndroid Build Coastguard Worker Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}, 163*333d2b36SAndroid Build Coastguard Worker NativeBridge: android.NativeBridgeEnabled, 164*333d2b36SAndroid Build Coastguard Worker NativeBridgeHostArchName: "x86", 165*333d2b36SAndroid Build Coastguard Worker NativeBridgeRelativePath: "arm", 166*333d2b36SAndroid Build Coastguard Worker }, 167*333d2b36SAndroid Build Coastguard Worker } 168*333d2b36SAndroid Build Coastguard Worker }), 169*333d2b36SAndroid Build Coastguard Worker arch: "arm", 170*333d2b36SAndroid Build Coastguard Worker multilib: "lib32", 171*333d2b36SAndroid Build Coastguard Worker nativeBridge: "arm", 172*333d2b36SAndroid Build Coastguard Worker }, 173*333d2b36SAndroid Build Coastguard Worker } 174*333d2b36SAndroid Build Coastguard Worker 175*333d2b36SAndroid Build Coastguard Worker for _, tt := range testCases { 176*333d2b36SAndroid Build Coastguard Worker t.Run(tt.name, func(t *testing.T) { 177*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 178*333d2b36SAndroid Build Coastguard Worker PrepareForIntegrationTestWithCc, 179*333d2b36SAndroid Build Coastguard Worker android.OptionalFixturePreparer(tt.preparer), 180*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 181*333d2b36SAndroid Build Coastguard Worker gen := result.ModuleForTests("gen", tt.variant) 182*333d2b36SAndroid Build Coastguard Worker sboxProto := android.RuleBuilderSboxProtoForTests(t, result.TestContext, gen.Output("genrule.sbox.textproto")) 183*333d2b36SAndroid Build Coastguard Worker cmd := *sboxProto.Commands[0].Command 184*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "incorrect CC_ARCH", cmd, "CC_ARCH="+tt.arch+" ") 185*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "incorrect CC_NATIVE_BRIDGE", cmd, "CC_NATIVE_BRIDGE="+tt.nativeBridge+" ") 186*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "incorrect CC_MULTILIB", cmd, "CC_MULTILIB="+tt.multilib+" ") 187*333d2b36SAndroid Build Coastguard Worker }) 188*333d2b36SAndroid Build Coastguard Worker } 189*333d2b36SAndroid Build Coastguard Worker} 190*333d2b36SAndroid Build Coastguard Worker 191*333d2b36SAndroid Build Coastguard Workerfunc TestVendorProductVariantGenrule(t *testing.T) { 192*333d2b36SAndroid Build Coastguard Worker bp := ` 193*333d2b36SAndroid Build Coastguard Worker cc_genrule { 194*333d2b36SAndroid Build Coastguard Worker name: "gen", 195*333d2b36SAndroid Build Coastguard Worker tool_files: ["tool"], 196*333d2b36SAndroid Build Coastguard Worker cmd: "$(location tool) $(in) $(out)", 197*333d2b36SAndroid Build Coastguard Worker out: ["out"], 198*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 199*333d2b36SAndroid Build Coastguard Worker product_available: true, 200*333d2b36SAndroid Build Coastguard Worker } 201*333d2b36SAndroid Build Coastguard Worker ` 202*333d2b36SAndroid Build Coastguard Worker t.Helper() 203*333d2b36SAndroid Build Coastguard Worker ctx := PrepareForIntegrationTestWithCc.RunTestWithBp(t, bp) 204*333d2b36SAndroid Build Coastguard Worker 205*333d2b36SAndroid Build Coastguard Worker variants := ctx.ModuleVariantsForTests("gen") 206*333d2b36SAndroid Build Coastguard Worker if !slices.Contains(variants, "android_vendor_arm64_armv8-a") { 207*333d2b36SAndroid Build Coastguard Worker t.Errorf(`expected vendor variant, but does not exist in %v`, variants) 208*333d2b36SAndroid Build Coastguard Worker } 209*333d2b36SAndroid Build Coastguard Worker if !slices.Contains(variants, "android_product_arm64_armv8-a") { 210*333d2b36SAndroid Build Coastguard Worker t.Errorf(`expected product variant, but does not exist in %v`, variants) 211*333d2b36SAndroid Build Coastguard Worker } 212*333d2b36SAndroid Build Coastguard Worker} 213*333d2b36SAndroid Build Coastguard Worker 214*333d2b36SAndroid Build Coastguard Worker// cc_genrule is initialized to android.InitAndroidArchModule 215*333d2b36SAndroid Build Coastguard Worker// that is an architecture-specific Android module. 216*333d2b36SAndroid Build Coastguard Worker// So testing properties tagged with `android:"arch_variant"` 217*333d2b36SAndroid Build Coastguard Worker// for cc_genrule. 218*333d2b36SAndroid Build Coastguard Workerfunc TestMultilibGenruleOut(t *testing.T) { 219*333d2b36SAndroid Build Coastguard Worker bp := ` 220*333d2b36SAndroid Build Coastguard Worker cc_genrule { 221*333d2b36SAndroid Build Coastguard Worker name: "gen", 222*333d2b36SAndroid Build Coastguard Worker cmd: "cp $(in) $(out)", 223*333d2b36SAndroid Build Coastguard Worker srcs: ["foo"], 224*333d2b36SAndroid Build Coastguard Worker multilib: { 225*333d2b36SAndroid Build Coastguard Worker lib32: { 226*333d2b36SAndroid Build Coastguard Worker out: [ 227*333d2b36SAndroid Build Coastguard Worker "subdir32/external-module32", 228*333d2b36SAndroid Build Coastguard Worker ], 229*333d2b36SAndroid Build Coastguard Worker }, 230*333d2b36SAndroid Build Coastguard Worker lib64: { 231*333d2b36SAndroid Build Coastguard Worker out: [ 232*333d2b36SAndroid Build Coastguard Worker "subdir64/external-module64", 233*333d2b36SAndroid Build Coastguard Worker ], 234*333d2b36SAndroid Build Coastguard Worker }, 235*333d2b36SAndroid Build Coastguard Worker }, 236*333d2b36SAndroid Build Coastguard Worker } 237*333d2b36SAndroid Build Coastguard Worker ` 238*333d2b36SAndroid Build Coastguard Worker result := PrepareForIntegrationTestWithCc.RunTestWithBp(t, bp) 239*333d2b36SAndroid Build Coastguard Worker gen_32bit := result.ModuleForTests("gen", "android_arm_armv7-a-neon").OutputFiles(result.TestContext, t, "") 240*333d2b36SAndroid Build Coastguard Worker android.AssertPathsEndWith(t, 241*333d2b36SAndroid Build Coastguard Worker "genrule_out", 242*333d2b36SAndroid Build Coastguard Worker []string{ 243*333d2b36SAndroid Build Coastguard Worker "subdir32/external-module32", 244*333d2b36SAndroid Build Coastguard Worker }, 245*333d2b36SAndroid Build Coastguard Worker gen_32bit, 246*333d2b36SAndroid Build Coastguard Worker ) 247*333d2b36SAndroid Build Coastguard Worker 248*333d2b36SAndroid Build Coastguard Worker gen_64bit := result.ModuleForTests("gen", "android_arm64_armv8-a").OutputFiles(result.TestContext, t, "") 249*333d2b36SAndroid Build Coastguard Worker android.AssertPathsEndWith(t, 250*333d2b36SAndroid Build Coastguard Worker "genrule_out", 251*333d2b36SAndroid Build Coastguard Worker []string{ 252*333d2b36SAndroid Build Coastguard Worker "subdir64/external-module64", 253*333d2b36SAndroid Build Coastguard Worker }, 254*333d2b36SAndroid Build Coastguard Worker gen_64bit, 255*333d2b36SAndroid Build Coastguard Worker ) 256*333d2b36SAndroid Build Coastguard Worker} 257