1*333d2b36SAndroid Build Coastguard Worker// Copyright 2016 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 android 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "testing" 19*333d2b36SAndroid Build Coastguard Worker 20*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 21*333d2b36SAndroid Build Coastguard Worker) 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuilts(t *testing.T) { 24*333d2b36SAndroid Build Coastguard Worker buildOS := TestArchConfig(t.TempDir(), nil, "", nil).BuildOS 25*333d2b36SAndroid Build Coastguard Worker 26*333d2b36SAndroid Build Coastguard Worker var prebuiltsTests = []struct { 27*333d2b36SAndroid Build Coastguard Worker name string 28*333d2b36SAndroid Build Coastguard Worker replaceBp bool // modules is added to default bp boilerplate if false. 29*333d2b36SAndroid Build Coastguard Worker modules string 30*333d2b36SAndroid Build Coastguard Worker prebuilt []OsType 31*333d2b36SAndroid Build Coastguard Worker preparer FixturePreparer 32*333d2b36SAndroid Build Coastguard Worker }{ 33*333d2b36SAndroid Build Coastguard Worker { 34*333d2b36SAndroid Build Coastguard Worker name: "no prebuilt", 35*333d2b36SAndroid Build Coastguard Worker modules: ` 36*333d2b36SAndroid Build Coastguard Worker source { 37*333d2b36SAndroid Build Coastguard Worker name: "bar", 38*333d2b36SAndroid Build Coastguard Worker }`, 39*333d2b36SAndroid Build Coastguard Worker prebuilt: nil, 40*333d2b36SAndroid Build Coastguard Worker }, 41*333d2b36SAndroid Build Coastguard Worker { 42*333d2b36SAndroid Build Coastguard Worker name: "no source prebuilt not preferred", 43*333d2b36SAndroid Build Coastguard Worker modules: ` 44*333d2b36SAndroid Build Coastguard Worker prebuilt { 45*333d2b36SAndroid Build Coastguard Worker name: "bar", 46*333d2b36SAndroid Build Coastguard Worker prefer: false, 47*333d2b36SAndroid Build Coastguard Worker srcs: ["prebuilt_file"], 48*333d2b36SAndroid Build Coastguard Worker }`, 49*333d2b36SAndroid Build Coastguard Worker prebuilt: []OsType{Android, buildOS}, 50*333d2b36SAndroid Build Coastguard Worker }, 51*333d2b36SAndroid Build Coastguard Worker { 52*333d2b36SAndroid Build Coastguard Worker name: "no source prebuilt preferred", 53*333d2b36SAndroid Build Coastguard Worker modules: ` 54*333d2b36SAndroid Build Coastguard Worker prebuilt { 55*333d2b36SAndroid Build Coastguard Worker name: "bar", 56*333d2b36SAndroid Build Coastguard Worker prefer: true, 57*333d2b36SAndroid Build Coastguard Worker srcs: ["prebuilt_file"], 58*333d2b36SAndroid Build Coastguard Worker }`, 59*333d2b36SAndroid Build Coastguard Worker prebuilt: []OsType{Android, buildOS}, 60*333d2b36SAndroid Build Coastguard Worker }, 61*333d2b36SAndroid Build Coastguard Worker { 62*333d2b36SAndroid Build Coastguard Worker name: "prebuilt not preferred", 63*333d2b36SAndroid Build Coastguard Worker modules: ` 64*333d2b36SAndroid Build Coastguard Worker source { 65*333d2b36SAndroid Build Coastguard Worker name: "bar", 66*333d2b36SAndroid Build Coastguard Worker } 67*333d2b36SAndroid Build Coastguard Worker 68*333d2b36SAndroid Build Coastguard Worker prebuilt { 69*333d2b36SAndroid Build Coastguard Worker name: "bar", 70*333d2b36SAndroid Build Coastguard Worker prefer: false, 71*333d2b36SAndroid Build Coastguard Worker srcs: ["prebuilt_file"], 72*333d2b36SAndroid Build Coastguard Worker }`, 73*333d2b36SAndroid Build Coastguard Worker prebuilt: nil, 74*333d2b36SAndroid Build Coastguard Worker }, 75*333d2b36SAndroid Build Coastguard Worker { 76*333d2b36SAndroid Build Coastguard Worker name: "prebuilt preferred", 77*333d2b36SAndroid Build Coastguard Worker modules: ` 78*333d2b36SAndroid Build Coastguard Worker source { 79*333d2b36SAndroid Build Coastguard Worker name: "bar", 80*333d2b36SAndroid Build Coastguard Worker } 81*333d2b36SAndroid Build Coastguard Worker 82*333d2b36SAndroid Build Coastguard Worker prebuilt { 83*333d2b36SAndroid Build Coastguard Worker name: "bar", 84*333d2b36SAndroid Build Coastguard Worker prefer: true, 85*333d2b36SAndroid Build Coastguard Worker srcs: ["prebuilt_file"], 86*333d2b36SAndroid Build Coastguard Worker }`, 87*333d2b36SAndroid Build Coastguard Worker prebuilt: []OsType{Android, buildOS}, 88*333d2b36SAndroid Build Coastguard Worker }, 89*333d2b36SAndroid Build Coastguard Worker { 90*333d2b36SAndroid Build Coastguard Worker name: "prebuilt no file not preferred", 91*333d2b36SAndroid Build Coastguard Worker modules: ` 92*333d2b36SAndroid Build Coastguard Worker source { 93*333d2b36SAndroid Build Coastguard Worker name: "bar", 94*333d2b36SAndroid Build Coastguard Worker } 95*333d2b36SAndroid Build Coastguard Worker 96*333d2b36SAndroid Build Coastguard Worker prebuilt { 97*333d2b36SAndroid Build Coastguard Worker name: "bar", 98*333d2b36SAndroid Build Coastguard Worker prefer: false, 99*333d2b36SAndroid Build Coastguard Worker }`, 100*333d2b36SAndroid Build Coastguard Worker prebuilt: nil, 101*333d2b36SAndroid Build Coastguard Worker }, 102*333d2b36SAndroid Build Coastguard Worker { 103*333d2b36SAndroid Build Coastguard Worker name: "prebuilt no file preferred", 104*333d2b36SAndroid Build Coastguard Worker modules: ` 105*333d2b36SAndroid Build Coastguard Worker source { 106*333d2b36SAndroid Build Coastguard Worker name: "bar", 107*333d2b36SAndroid Build Coastguard Worker } 108*333d2b36SAndroid Build Coastguard Worker 109*333d2b36SAndroid Build Coastguard Worker prebuilt { 110*333d2b36SAndroid Build Coastguard Worker name: "bar", 111*333d2b36SAndroid Build Coastguard Worker prefer: true, 112*333d2b36SAndroid Build Coastguard Worker }`, 113*333d2b36SAndroid Build Coastguard Worker prebuilt: nil, 114*333d2b36SAndroid Build Coastguard Worker }, 115*333d2b36SAndroid Build Coastguard Worker { 116*333d2b36SAndroid Build Coastguard Worker name: "prebuilt file from filegroup preferred", 117*333d2b36SAndroid Build Coastguard Worker modules: ` 118*333d2b36SAndroid Build Coastguard Worker filegroup { 119*333d2b36SAndroid Build Coastguard Worker name: "fg", 120*333d2b36SAndroid Build Coastguard Worker srcs: ["prebuilt_file"], 121*333d2b36SAndroid Build Coastguard Worker } 122*333d2b36SAndroid Build Coastguard Worker prebuilt { 123*333d2b36SAndroid Build Coastguard Worker name: "bar", 124*333d2b36SAndroid Build Coastguard Worker prefer: true, 125*333d2b36SAndroid Build Coastguard Worker srcs: [":fg"], 126*333d2b36SAndroid Build Coastguard Worker }`, 127*333d2b36SAndroid Build Coastguard Worker prebuilt: []OsType{Android, buildOS}, 128*333d2b36SAndroid Build Coastguard Worker }, 129*333d2b36SAndroid Build Coastguard Worker { 130*333d2b36SAndroid Build Coastguard Worker name: "prebuilt module for device only", 131*333d2b36SAndroid Build Coastguard Worker modules: ` 132*333d2b36SAndroid Build Coastguard Worker source { 133*333d2b36SAndroid Build Coastguard Worker name: "bar", 134*333d2b36SAndroid Build Coastguard Worker } 135*333d2b36SAndroid Build Coastguard Worker 136*333d2b36SAndroid Build Coastguard Worker prebuilt { 137*333d2b36SAndroid Build Coastguard Worker name: "bar", 138*333d2b36SAndroid Build Coastguard Worker host_supported: false, 139*333d2b36SAndroid Build Coastguard Worker prefer: true, 140*333d2b36SAndroid Build Coastguard Worker srcs: ["prebuilt_file"], 141*333d2b36SAndroid Build Coastguard Worker }`, 142*333d2b36SAndroid Build Coastguard Worker prebuilt: []OsType{Android}, 143*333d2b36SAndroid Build Coastguard Worker }, 144*333d2b36SAndroid Build Coastguard Worker { 145*333d2b36SAndroid Build Coastguard Worker name: "prebuilt file for host only", 146*333d2b36SAndroid Build Coastguard Worker modules: ` 147*333d2b36SAndroid Build Coastguard Worker source { 148*333d2b36SAndroid Build Coastguard Worker name: "bar", 149*333d2b36SAndroid Build Coastguard Worker } 150*333d2b36SAndroid Build Coastguard Worker 151*333d2b36SAndroid Build Coastguard Worker prebuilt { 152*333d2b36SAndroid Build Coastguard Worker name: "bar", 153*333d2b36SAndroid Build Coastguard Worker prefer: true, 154*333d2b36SAndroid Build Coastguard Worker target: { 155*333d2b36SAndroid Build Coastguard Worker host: { 156*333d2b36SAndroid Build Coastguard Worker srcs: ["prebuilt_file"], 157*333d2b36SAndroid Build Coastguard Worker }, 158*333d2b36SAndroid Build Coastguard Worker }, 159*333d2b36SAndroid Build Coastguard Worker }`, 160*333d2b36SAndroid Build Coastguard Worker prebuilt: []OsType{buildOS}, 161*333d2b36SAndroid Build Coastguard Worker }, 162*333d2b36SAndroid Build Coastguard Worker { 163*333d2b36SAndroid Build Coastguard Worker name: "prebuilt override not preferred", 164*333d2b36SAndroid Build Coastguard Worker modules: ` 165*333d2b36SAndroid Build Coastguard Worker source { 166*333d2b36SAndroid Build Coastguard Worker name: "baz", 167*333d2b36SAndroid Build Coastguard Worker } 168*333d2b36SAndroid Build Coastguard Worker 169*333d2b36SAndroid Build Coastguard Worker override_source { 170*333d2b36SAndroid Build Coastguard Worker name: "bar", 171*333d2b36SAndroid Build Coastguard Worker base: "baz", 172*333d2b36SAndroid Build Coastguard Worker } 173*333d2b36SAndroid Build Coastguard Worker 174*333d2b36SAndroid Build Coastguard Worker prebuilt { 175*333d2b36SAndroid Build Coastguard Worker name: "bar", 176*333d2b36SAndroid Build Coastguard Worker prefer: false, 177*333d2b36SAndroid Build Coastguard Worker srcs: ["prebuilt_file"], 178*333d2b36SAndroid Build Coastguard Worker }`, 179*333d2b36SAndroid Build Coastguard Worker prebuilt: nil, 180*333d2b36SAndroid Build Coastguard Worker }, 181*333d2b36SAndroid Build Coastguard Worker { 182*333d2b36SAndroid Build Coastguard Worker name: "prebuilt override preferred", 183*333d2b36SAndroid Build Coastguard Worker modules: ` 184*333d2b36SAndroid Build Coastguard Worker source { 185*333d2b36SAndroid Build Coastguard Worker name: "baz", 186*333d2b36SAndroid Build Coastguard Worker } 187*333d2b36SAndroid Build Coastguard Worker 188*333d2b36SAndroid Build Coastguard Worker override_source { 189*333d2b36SAndroid Build Coastguard Worker name: "bar", 190*333d2b36SAndroid Build Coastguard Worker base: "baz", 191*333d2b36SAndroid Build Coastguard Worker } 192*333d2b36SAndroid Build Coastguard Worker 193*333d2b36SAndroid Build Coastguard Worker prebuilt { 194*333d2b36SAndroid Build Coastguard Worker name: "bar", 195*333d2b36SAndroid Build Coastguard Worker prefer: true, 196*333d2b36SAndroid Build Coastguard Worker srcs: ["prebuilt_file"], 197*333d2b36SAndroid Build Coastguard Worker }`, 198*333d2b36SAndroid Build Coastguard Worker prebuilt: []OsType{Android, buildOS}, 199*333d2b36SAndroid Build Coastguard Worker }, 200*333d2b36SAndroid Build Coastguard Worker { 201*333d2b36SAndroid Build Coastguard Worker name: "prebuilt including default-disabled OS", 202*333d2b36SAndroid Build Coastguard Worker replaceBp: true, 203*333d2b36SAndroid Build Coastguard Worker modules: ` 204*333d2b36SAndroid Build Coastguard Worker source { 205*333d2b36SAndroid Build Coastguard Worker name: "foo", 206*333d2b36SAndroid Build Coastguard Worker deps: [":bar"], 207*333d2b36SAndroid Build Coastguard Worker target: { 208*333d2b36SAndroid Build Coastguard Worker windows: { 209*333d2b36SAndroid Build Coastguard Worker enabled: true, 210*333d2b36SAndroid Build Coastguard Worker }, 211*333d2b36SAndroid Build Coastguard Worker }, 212*333d2b36SAndroid Build Coastguard Worker } 213*333d2b36SAndroid Build Coastguard Worker 214*333d2b36SAndroid Build Coastguard Worker source { 215*333d2b36SAndroid Build Coastguard Worker name: "bar", 216*333d2b36SAndroid Build Coastguard Worker target: { 217*333d2b36SAndroid Build Coastguard Worker windows: { 218*333d2b36SAndroid Build Coastguard Worker enabled: true, 219*333d2b36SAndroid Build Coastguard Worker }, 220*333d2b36SAndroid Build Coastguard Worker }, 221*333d2b36SAndroid Build Coastguard Worker } 222*333d2b36SAndroid Build Coastguard Worker 223*333d2b36SAndroid Build Coastguard Worker prebuilt { 224*333d2b36SAndroid Build Coastguard Worker name: "bar", 225*333d2b36SAndroid Build Coastguard Worker prefer: true, 226*333d2b36SAndroid Build Coastguard Worker srcs: ["prebuilt_file"], 227*333d2b36SAndroid Build Coastguard Worker target: { 228*333d2b36SAndroid Build Coastguard Worker windows: { 229*333d2b36SAndroid Build Coastguard Worker enabled: true, 230*333d2b36SAndroid Build Coastguard Worker }, 231*333d2b36SAndroid Build Coastguard Worker }, 232*333d2b36SAndroid Build Coastguard Worker }`, 233*333d2b36SAndroid Build Coastguard Worker prebuilt: []OsType{Android, buildOS, Windows}, 234*333d2b36SAndroid Build Coastguard Worker }, 235*333d2b36SAndroid Build Coastguard Worker { 236*333d2b36SAndroid Build Coastguard Worker name: "fall back to source for default-disabled OS", 237*333d2b36SAndroid Build Coastguard Worker replaceBp: true, 238*333d2b36SAndroid Build Coastguard Worker modules: ` 239*333d2b36SAndroid Build Coastguard Worker source { 240*333d2b36SAndroid Build Coastguard Worker name: "foo", 241*333d2b36SAndroid Build Coastguard Worker deps: [":bar"], 242*333d2b36SAndroid Build Coastguard Worker target: { 243*333d2b36SAndroid Build Coastguard Worker windows: { 244*333d2b36SAndroid Build Coastguard Worker enabled: true, 245*333d2b36SAndroid Build Coastguard Worker }, 246*333d2b36SAndroid Build Coastguard Worker }, 247*333d2b36SAndroid Build Coastguard Worker } 248*333d2b36SAndroid Build Coastguard Worker 249*333d2b36SAndroid Build Coastguard Worker source { 250*333d2b36SAndroid Build Coastguard Worker name: "bar", 251*333d2b36SAndroid Build Coastguard Worker target: { 252*333d2b36SAndroid Build Coastguard Worker windows: { 253*333d2b36SAndroid Build Coastguard Worker enabled: true, 254*333d2b36SAndroid Build Coastguard Worker }, 255*333d2b36SAndroid Build Coastguard Worker }, 256*333d2b36SAndroid Build Coastguard Worker } 257*333d2b36SAndroid Build Coastguard Worker 258*333d2b36SAndroid Build Coastguard Worker prebuilt { 259*333d2b36SAndroid Build Coastguard Worker name: "bar", 260*333d2b36SAndroid Build Coastguard Worker prefer: true, 261*333d2b36SAndroid Build Coastguard Worker srcs: ["prebuilt_file"], 262*333d2b36SAndroid Build Coastguard Worker }`, 263*333d2b36SAndroid Build Coastguard Worker prebuilt: []OsType{Android, buildOS}, 264*333d2b36SAndroid Build Coastguard Worker }, 265*333d2b36SAndroid Build Coastguard Worker { 266*333d2b36SAndroid Build Coastguard Worker name: "prebuilt properties customizable", 267*333d2b36SAndroid Build Coastguard Worker replaceBp: true, 268*333d2b36SAndroid Build Coastguard Worker modules: ` 269*333d2b36SAndroid Build Coastguard Worker source { 270*333d2b36SAndroid Build Coastguard Worker name: "foo", 271*333d2b36SAndroid Build Coastguard Worker deps: [":bar"], 272*333d2b36SAndroid Build Coastguard Worker } 273*333d2b36SAndroid Build Coastguard Worker 274*333d2b36SAndroid Build Coastguard Worker soong_config_module_type { 275*333d2b36SAndroid Build Coastguard Worker name: "prebuilt_with_config", 276*333d2b36SAndroid Build Coastguard Worker module_type: "prebuilt", 277*333d2b36SAndroid Build Coastguard Worker config_namespace: "any_namespace", 278*333d2b36SAndroid Build Coastguard Worker bool_variables: ["bool_var"], 279*333d2b36SAndroid Build Coastguard Worker properties: ["prefer"], 280*333d2b36SAndroid Build Coastguard Worker } 281*333d2b36SAndroid Build Coastguard Worker 282*333d2b36SAndroid Build Coastguard Worker prebuilt_with_config { 283*333d2b36SAndroid Build Coastguard Worker name: "bar", 284*333d2b36SAndroid Build Coastguard Worker prefer: true, 285*333d2b36SAndroid Build Coastguard Worker srcs: ["prebuilt_file"], 286*333d2b36SAndroid Build Coastguard Worker soong_config_variables: { 287*333d2b36SAndroid Build Coastguard Worker bool_var: { 288*333d2b36SAndroid Build Coastguard Worker prefer: false, 289*333d2b36SAndroid Build Coastguard Worker conditions_default: { 290*333d2b36SAndroid Build Coastguard Worker prefer: true, 291*333d2b36SAndroid Build Coastguard Worker }, 292*333d2b36SAndroid Build Coastguard Worker }, 293*333d2b36SAndroid Build Coastguard Worker }, 294*333d2b36SAndroid Build Coastguard Worker }`, 295*333d2b36SAndroid Build Coastguard Worker prebuilt: []OsType{Android, buildOS}, 296*333d2b36SAndroid Build Coastguard Worker }, 297*333d2b36SAndroid Build Coastguard Worker } 298*333d2b36SAndroid Build Coastguard Worker 299*333d2b36SAndroid Build Coastguard Worker fs := MockFS{ 300*333d2b36SAndroid Build Coastguard Worker "prebuilt_file": nil, 301*333d2b36SAndroid Build Coastguard Worker "source_file": nil, 302*333d2b36SAndroid Build Coastguard Worker } 303*333d2b36SAndroid Build Coastguard Worker 304*333d2b36SAndroid Build Coastguard Worker for _, test := range prebuiltsTests { 305*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 306*333d2b36SAndroid Build Coastguard Worker bp := test.modules 307*333d2b36SAndroid Build Coastguard Worker if !test.replaceBp { 308*333d2b36SAndroid Build Coastguard Worker bp = bp + ` 309*333d2b36SAndroid Build Coastguard Worker source { 310*333d2b36SAndroid Build Coastguard Worker name: "foo", 311*333d2b36SAndroid Build Coastguard Worker deps: [":bar"], 312*333d2b36SAndroid Build Coastguard Worker }` 313*333d2b36SAndroid Build Coastguard Worker } 314*333d2b36SAndroid Build Coastguard Worker 315*333d2b36SAndroid Build Coastguard Worker // Add windows to the target list to test the logic when a variant is 316*333d2b36SAndroid Build Coastguard Worker // disabled by default. 317*333d2b36SAndroid Build Coastguard Worker if !Windows.DefaultDisabled { 318*333d2b36SAndroid Build Coastguard Worker t.Errorf("windows is assumed to be disabled by default") 319*333d2b36SAndroid Build Coastguard Worker } 320*333d2b36SAndroid Build Coastguard Worker 321*333d2b36SAndroid Build Coastguard Worker result := GroupFixturePreparers( 322*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithArchMutator, 323*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithPrebuilts, 324*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithOverrides, 325*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithFilegroup, 326*333d2b36SAndroid Build Coastguard Worker // Add a Windows target to the configuration. 327*333d2b36SAndroid Build Coastguard Worker FixtureModifyConfig(func(config Config) { 328*333d2b36SAndroid Build Coastguard Worker config.Targets[Windows] = []Target{ 329*333d2b36SAndroid Build Coastguard Worker {Windows, Arch{ArchType: X86_64}, NativeBridgeDisabled, "", "", true}, 330*333d2b36SAndroid Build Coastguard Worker } 331*333d2b36SAndroid Build Coastguard Worker }), 332*333d2b36SAndroid Build Coastguard Worker fs.AddToFixture(), 333*333d2b36SAndroid Build Coastguard Worker FixtureRegisterWithContext(registerTestPrebuiltModules), 334*333d2b36SAndroid Build Coastguard Worker OptionalFixturePreparer(test.preparer), 335*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 336*333d2b36SAndroid Build Coastguard Worker 337*333d2b36SAndroid Build Coastguard Worker for _, variant := range result.ModuleVariantsForTests("foo") { 338*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", variant) 339*333d2b36SAndroid Build Coastguard Worker t.Run(foo.Module().Target().Os.String(), func(t *testing.T) { 340*333d2b36SAndroid Build Coastguard Worker var dependsOnSourceModule, dependsOnPrebuiltModule bool 341*333d2b36SAndroid Build Coastguard Worker result.VisitDirectDeps(foo.Module(), func(m blueprint.Module) { 342*333d2b36SAndroid Build Coastguard Worker if _, ok := m.(*sourceModule); ok { 343*333d2b36SAndroid Build Coastguard Worker dependsOnSourceModule = true 344*333d2b36SAndroid Build Coastguard Worker } 345*333d2b36SAndroid Build Coastguard Worker if p, ok := m.(*prebuiltModule); ok { 346*333d2b36SAndroid Build Coastguard Worker dependsOnPrebuiltModule = true 347*333d2b36SAndroid Build Coastguard Worker if !p.Prebuilt().properties.UsePrebuilt { 348*333d2b36SAndroid Build Coastguard Worker t.Errorf("dependency on prebuilt module not marked used") 349*333d2b36SAndroid Build Coastguard Worker } 350*333d2b36SAndroid Build Coastguard Worker } 351*333d2b36SAndroid Build Coastguard Worker }) 352*333d2b36SAndroid Build Coastguard Worker 353*333d2b36SAndroid Build Coastguard Worker moduleIsDisabled := !foo.Module().Enabled(PanickingConfigAndErrorContext(result.TestContext)) 354*333d2b36SAndroid Build Coastguard Worker deps := foo.Module().(*sourceModule).deps 355*333d2b36SAndroid Build Coastguard Worker if moduleIsDisabled { 356*333d2b36SAndroid Build Coastguard Worker if len(deps) > 0 { 357*333d2b36SAndroid Build Coastguard Worker t.Errorf("disabled module got deps: %v", deps) 358*333d2b36SAndroid Build Coastguard Worker } 359*333d2b36SAndroid Build Coastguard Worker } else { 360*333d2b36SAndroid Build Coastguard Worker if len(deps) != 1 { 361*333d2b36SAndroid Build Coastguard Worker t.Errorf("deps does not have single path, but is %v", deps) 362*333d2b36SAndroid Build Coastguard Worker } 363*333d2b36SAndroid Build Coastguard Worker } 364*333d2b36SAndroid Build Coastguard Worker 365*333d2b36SAndroid Build Coastguard Worker var usingSourceFile, usingPrebuiltFile bool 366*333d2b36SAndroid Build Coastguard Worker if len(deps) > 0 && deps[0].String() == "source_file" { 367*333d2b36SAndroid Build Coastguard Worker usingSourceFile = true 368*333d2b36SAndroid Build Coastguard Worker } 369*333d2b36SAndroid Build Coastguard Worker if len(deps) > 0 && deps[0].String() == "prebuilt_file" { 370*333d2b36SAndroid Build Coastguard Worker usingPrebuiltFile = true 371*333d2b36SAndroid Build Coastguard Worker } 372*333d2b36SAndroid Build Coastguard Worker 373*333d2b36SAndroid Build Coastguard Worker prebuilt := false 374*333d2b36SAndroid Build Coastguard Worker for _, os := range test.prebuilt { 375*333d2b36SAndroid Build Coastguard Worker if os == foo.Module().Target().Os { 376*333d2b36SAndroid Build Coastguard Worker prebuilt = true 377*333d2b36SAndroid Build Coastguard Worker } 378*333d2b36SAndroid Build Coastguard Worker } 379*333d2b36SAndroid Build Coastguard Worker 380*333d2b36SAndroid Build Coastguard Worker if prebuilt { 381*333d2b36SAndroid Build Coastguard Worker if moduleIsDisabled { 382*333d2b36SAndroid Build Coastguard Worker t.Errorf("dependent module for prebuilt is disabled") 383*333d2b36SAndroid Build Coastguard Worker } 384*333d2b36SAndroid Build Coastguard Worker 385*333d2b36SAndroid Build Coastguard Worker if !dependsOnPrebuiltModule { 386*333d2b36SAndroid Build Coastguard Worker t.Errorf("doesn't depend on prebuilt module") 387*333d2b36SAndroid Build Coastguard Worker } 388*333d2b36SAndroid Build Coastguard Worker if !usingPrebuiltFile { 389*333d2b36SAndroid Build Coastguard Worker t.Errorf("doesn't use prebuilt_file") 390*333d2b36SAndroid Build Coastguard Worker } 391*333d2b36SAndroid Build Coastguard Worker 392*333d2b36SAndroid Build Coastguard Worker if dependsOnSourceModule { 393*333d2b36SAndroid Build Coastguard Worker t.Errorf("depends on source module") 394*333d2b36SAndroid Build Coastguard Worker } 395*333d2b36SAndroid Build Coastguard Worker if usingSourceFile { 396*333d2b36SAndroid Build Coastguard Worker t.Errorf("using source_file") 397*333d2b36SAndroid Build Coastguard Worker } 398*333d2b36SAndroid Build Coastguard Worker } else if !moduleIsDisabled { 399*333d2b36SAndroid Build Coastguard Worker if dependsOnPrebuiltModule { 400*333d2b36SAndroid Build Coastguard Worker t.Errorf("depends on prebuilt module") 401*333d2b36SAndroid Build Coastguard Worker } 402*333d2b36SAndroid Build Coastguard Worker if usingPrebuiltFile { 403*333d2b36SAndroid Build Coastguard Worker t.Errorf("using prebuilt_file") 404*333d2b36SAndroid Build Coastguard Worker } 405*333d2b36SAndroid Build Coastguard Worker 406*333d2b36SAndroid Build Coastguard Worker if !dependsOnSourceModule { 407*333d2b36SAndroid Build Coastguard Worker t.Errorf("doesn't depend on source module") 408*333d2b36SAndroid Build Coastguard Worker } 409*333d2b36SAndroid Build Coastguard Worker if !usingSourceFile { 410*333d2b36SAndroid Build Coastguard Worker t.Errorf("doesn't use source_file") 411*333d2b36SAndroid Build Coastguard Worker } 412*333d2b36SAndroid Build Coastguard Worker } 413*333d2b36SAndroid Build Coastguard Worker }) 414*333d2b36SAndroid Build Coastguard Worker } 415*333d2b36SAndroid Build Coastguard Worker }) 416*333d2b36SAndroid Build Coastguard Worker } 417*333d2b36SAndroid Build Coastguard Worker} 418*333d2b36SAndroid Build Coastguard Worker 419*333d2b36SAndroid Build Coastguard Workerfunc testPrebuiltErrorWithFixture(t *testing.T, expectedError, bp string, fixture FixturePreparer) { 420*333d2b36SAndroid Build Coastguard Worker t.Helper() 421*333d2b36SAndroid Build Coastguard Worker fs := MockFS{ 422*333d2b36SAndroid Build Coastguard Worker "prebuilt_file": nil, 423*333d2b36SAndroid Build Coastguard Worker } 424*333d2b36SAndroid Build Coastguard Worker GroupFixturePreparers( 425*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithArchMutator, 426*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithPrebuilts, 427*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithOverrides, 428*333d2b36SAndroid Build Coastguard Worker fs.AddToFixture(), 429*333d2b36SAndroid Build Coastguard Worker FixtureRegisterWithContext(registerTestPrebuiltModules), 430*333d2b36SAndroid Build Coastguard Worker OptionalFixturePreparer(fixture), 431*333d2b36SAndroid Build Coastguard Worker ). 432*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(FixtureExpectsAtLeastOneErrorMatchingPattern(expectedError)). 433*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, bp) 434*333d2b36SAndroid Build Coastguard Worker 435*333d2b36SAndroid Build Coastguard Worker} 436*333d2b36SAndroid Build Coastguard Worker 437*333d2b36SAndroid Build Coastguard Workerfunc testPrebuiltError(t *testing.T, expectedError, bp string) { 438*333d2b36SAndroid Build Coastguard Worker testPrebuiltErrorWithFixture(t, expectedError, bp, nil) 439*333d2b36SAndroid Build Coastguard Worker} 440*333d2b36SAndroid Build Coastguard Worker 441*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltShouldNotChangePartition(t *testing.T) { 442*333d2b36SAndroid Build Coastguard Worker testPrebuiltError(t, `partition is different`, ` 443*333d2b36SAndroid Build Coastguard Worker source { 444*333d2b36SAndroid Build Coastguard Worker name: "foo", 445*333d2b36SAndroid Build Coastguard Worker vendor: true, 446*333d2b36SAndroid Build Coastguard Worker } 447*333d2b36SAndroid Build Coastguard Worker prebuilt { 448*333d2b36SAndroid Build Coastguard Worker name: "foo", 449*333d2b36SAndroid Build Coastguard Worker prefer: true, 450*333d2b36SAndroid Build Coastguard Worker srcs: ["prebuilt_file"], 451*333d2b36SAndroid Build Coastguard Worker }`) 452*333d2b36SAndroid Build Coastguard Worker} 453*333d2b36SAndroid Build Coastguard Worker 454*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltShouldNotChangePartition_WithOverride(t *testing.T) { 455*333d2b36SAndroid Build Coastguard Worker testPrebuiltError(t, `partition is different`, ` 456*333d2b36SAndroid Build Coastguard Worker source { 457*333d2b36SAndroid Build Coastguard Worker name: "foo", 458*333d2b36SAndroid Build Coastguard Worker vendor: true, 459*333d2b36SAndroid Build Coastguard Worker } 460*333d2b36SAndroid Build Coastguard Worker override_source { 461*333d2b36SAndroid Build Coastguard Worker name: "bar", 462*333d2b36SAndroid Build Coastguard Worker base: "foo", 463*333d2b36SAndroid Build Coastguard Worker } 464*333d2b36SAndroid Build Coastguard Worker prebuilt { 465*333d2b36SAndroid Build Coastguard Worker name: "bar", 466*333d2b36SAndroid Build Coastguard Worker prefer: true, 467*333d2b36SAndroid Build Coastguard Worker srcs: ["prebuilt_file"], 468*333d2b36SAndroid Build Coastguard Worker }`) 469*333d2b36SAndroid Build Coastguard Worker} 470*333d2b36SAndroid Build Coastguard Worker 471*333d2b36SAndroid Build Coastguard Workerfunc registerTestPrebuiltBuildComponents(ctx RegistrationContext) { 472*333d2b36SAndroid Build Coastguard Worker registerTestPrebuiltModules(ctx) 473*333d2b36SAndroid Build Coastguard Worker 474*333d2b36SAndroid Build Coastguard Worker RegisterPrebuiltMutators(ctx) 475*333d2b36SAndroid Build Coastguard Worker ctx.PostDepsMutators(RegisterOverridePostDepsMutators) 476*333d2b36SAndroid Build Coastguard Worker} 477*333d2b36SAndroid Build Coastguard Worker 478*333d2b36SAndroid Build Coastguard Workervar prepareForTestWithFakePrebuiltModules = FixtureRegisterWithContext(registerTestPrebuiltModules) 479*333d2b36SAndroid Build Coastguard Worker 480*333d2b36SAndroid Build Coastguard Workerfunc registerTestPrebuiltModules(ctx RegistrationContext) { 481*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("prebuilt", newPrebuiltModule) 482*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("source", newSourceModule) 483*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("override_source", newOverrideSourceModule) 484*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("soong_config_module_type", SoongConfigModuleTypeFactory) 485*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("soong_config_string_variable", SoongConfigStringVariableDummyFactory) 486*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("soong_config_bool_variable", SoongConfigBoolVariableDummyFactory) 487*333d2b36SAndroid Build Coastguard Worker RegisterApexContributionsBuildComponents(ctx) 488*333d2b36SAndroid Build Coastguard Worker} 489*333d2b36SAndroid Build Coastguard Worker 490*333d2b36SAndroid Build Coastguard Workertype prebuiltModule struct { 491*333d2b36SAndroid Build Coastguard Worker ModuleBase 492*333d2b36SAndroid Build Coastguard Worker prebuilt Prebuilt 493*333d2b36SAndroid Build Coastguard Worker properties struct { 494*333d2b36SAndroid Build Coastguard Worker Srcs []string `android:"path,arch_variant"` 495*333d2b36SAndroid Build Coastguard Worker } 496*333d2b36SAndroid Build Coastguard Worker} 497*333d2b36SAndroid Build Coastguard Worker 498*333d2b36SAndroid Build Coastguard Workerfunc newPrebuiltModule() Module { 499*333d2b36SAndroid Build Coastguard Worker m := &prebuiltModule{} 500*333d2b36SAndroid Build Coastguard Worker m.AddProperties(&m.properties) 501*333d2b36SAndroid Build Coastguard Worker InitPrebuiltModule(m, &m.properties.Srcs) 502*333d2b36SAndroid Build Coastguard Worker InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon) 503*333d2b36SAndroid Build Coastguard Worker return m 504*333d2b36SAndroid Build Coastguard Worker} 505*333d2b36SAndroid Build Coastguard Worker 506*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltModule) Name() string { 507*333d2b36SAndroid Build Coastguard Worker return p.prebuilt.Name(p.ModuleBase.Name()) 508*333d2b36SAndroid Build Coastguard Worker} 509*333d2b36SAndroid Build Coastguard Worker 510*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltModule) GenerateAndroidBuildActions(ctx ModuleContext) { 511*333d2b36SAndroid Build Coastguard Worker if len(p.properties.Srcs) >= 1 { 512*333d2b36SAndroid Build Coastguard Worker src := p.prebuilt.SingleSourcePath(ctx) 513*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(Paths{src}, "") 514*333d2b36SAndroid Build Coastguard Worker } 515*333d2b36SAndroid Build Coastguard Worker} 516*333d2b36SAndroid Build Coastguard Worker 517*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltModule) Prebuilt() *Prebuilt { 518*333d2b36SAndroid Build Coastguard Worker return &p.prebuilt 519*333d2b36SAndroid Build Coastguard Worker} 520*333d2b36SAndroid Build Coastguard Worker 521*333d2b36SAndroid Build Coastguard Workertype sourceModuleProperties struct { 522*333d2b36SAndroid Build Coastguard Worker Deps []string `android:"path,arch_variant"` 523*333d2b36SAndroid Build Coastguard Worker} 524*333d2b36SAndroid Build Coastguard Worker 525*333d2b36SAndroid Build Coastguard Workertype sourceModule struct { 526*333d2b36SAndroid Build Coastguard Worker ModuleBase 527*333d2b36SAndroid Build Coastguard Worker OverridableModuleBase 528*333d2b36SAndroid Build Coastguard Worker 529*333d2b36SAndroid Build Coastguard Worker properties sourceModuleProperties 530*333d2b36SAndroid Build Coastguard Worker dependsOnSourceModule, dependsOnPrebuiltModule bool 531*333d2b36SAndroid Build Coastguard Worker deps Paths 532*333d2b36SAndroid Build Coastguard Worker src Path 533*333d2b36SAndroid Build Coastguard Worker} 534*333d2b36SAndroid Build Coastguard Worker 535*333d2b36SAndroid Build Coastguard Workerfunc newSourceModule() Module { 536*333d2b36SAndroid Build Coastguard Worker m := &sourceModule{} 537*333d2b36SAndroid Build Coastguard Worker m.AddProperties(&m.properties) 538*333d2b36SAndroid Build Coastguard Worker InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon) 539*333d2b36SAndroid Build Coastguard Worker InitOverridableModule(m, nil) 540*333d2b36SAndroid Build Coastguard Worker return m 541*333d2b36SAndroid Build Coastguard Worker} 542*333d2b36SAndroid Build Coastguard Worker 543*333d2b36SAndroid Build Coastguard Workerfunc (s *sourceModule) OverridablePropertiesDepsMutator(ctx BottomUpMutatorContext) { 544*333d2b36SAndroid Build Coastguard Worker // s.properties.Deps are annotated with android:path, so they are 545*333d2b36SAndroid Build Coastguard Worker // automatically added to the dependency by pathDeps mutator 546*333d2b36SAndroid Build Coastguard Worker} 547*333d2b36SAndroid Build Coastguard Worker 548*333d2b36SAndroid Build Coastguard Workerfunc (s *sourceModule) GenerateAndroidBuildActions(ctx ModuleContext) { 549*333d2b36SAndroid Build Coastguard Worker s.deps = PathsForModuleSrc(ctx, s.properties.Deps) 550*333d2b36SAndroid Build Coastguard Worker s.src = PathForModuleSrc(ctx, "source_file") 551*333d2b36SAndroid Build Coastguard Worker} 552*333d2b36SAndroid Build Coastguard Worker 553*333d2b36SAndroid Build Coastguard Workerfunc (s *sourceModule) Srcs() Paths { 554*333d2b36SAndroid Build Coastguard Worker return Paths{s.src} 555*333d2b36SAndroid Build Coastguard Worker} 556*333d2b36SAndroid Build Coastguard Worker 557*333d2b36SAndroid Build Coastguard Workertype overrideSourceModule struct { 558*333d2b36SAndroid Build Coastguard Worker ModuleBase 559*333d2b36SAndroid Build Coastguard Worker OverrideModuleBase 560*333d2b36SAndroid Build Coastguard Worker} 561*333d2b36SAndroid Build Coastguard Worker 562*333d2b36SAndroid Build Coastguard Workerfunc (o *overrideSourceModule) GenerateAndroidBuildActions(_ ModuleContext) { 563*333d2b36SAndroid Build Coastguard Worker} 564*333d2b36SAndroid Build Coastguard Worker 565*333d2b36SAndroid Build Coastguard Workerfunc newOverrideSourceModule() Module { 566*333d2b36SAndroid Build Coastguard Worker m := &overrideSourceModule{} 567*333d2b36SAndroid Build Coastguard Worker m.AddProperties(&sourceModuleProperties{}) 568*333d2b36SAndroid Build Coastguard Worker 569*333d2b36SAndroid Build Coastguard Worker InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon) 570*333d2b36SAndroid Build Coastguard Worker InitOverrideModule(m) 571*333d2b36SAndroid Build Coastguard Worker return m 572*333d2b36SAndroid Build Coastguard Worker} 573*333d2b36SAndroid Build Coastguard Worker 574*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltErrorCannotListBothSourceAndPrebuiltInContributions(t *testing.T) { 575*333d2b36SAndroid Build Coastguard Worker selectMainlineModuleContritbutions := GroupFixturePreparers( 576*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", "my_apex_contributions"), 577*333d2b36SAndroid Build Coastguard Worker ) 578*333d2b36SAndroid Build Coastguard Worker testPrebuiltErrorWithFixture(t, `Found duplicate variations of the same module in apex_contributions: foo and prebuilt_foo. Please remove one of these`, ` 579*333d2b36SAndroid Build Coastguard Worker source { 580*333d2b36SAndroid Build Coastguard Worker name: "foo", 581*333d2b36SAndroid Build Coastguard Worker } 582*333d2b36SAndroid Build Coastguard Worker prebuilt { 583*333d2b36SAndroid Build Coastguard Worker name: "foo", 584*333d2b36SAndroid Build Coastguard Worker srcs: ["prebuilt_file"], 585*333d2b36SAndroid Build Coastguard Worker } 586*333d2b36SAndroid Build Coastguard Worker apex_contributions { 587*333d2b36SAndroid Build Coastguard Worker name: "my_apex_contributions", 588*333d2b36SAndroid Build Coastguard Worker api_domain: "my_mainline_module", 589*333d2b36SAndroid Build Coastguard Worker contents: [ 590*333d2b36SAndroid Build Coastguard Worker "foo", 591*333d2b36SAndroid Build Coastguard Worker "prebuilt_foo", 592*333d2b36SAndroid Build Coastguard Worker ], 593*333d2b36SAndroid Build Coastguard Worker } 594*333d2b36SAndroid Build Coastguard Worker all_apex_contributions { 595*333d2b36SAndroid Build Coastguard Worker name: "all_apex_contributions", 596*333d2b36SAndroid Build Coastguard Worker } 597*333d2b36SAndroid Build Coastguard Worker `, selectMainlineModuleContritbutions) 598*333d2b36SAndroid Build Coastguard Worker} 599