1*333d2b36SAndroid Build Coastguard Worker// Copyright 2019 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 21*333d2b36SAndroid Build Coastguard Workertype pathDepsMutatorTestModule struct { 22*333d2b36SAndroid Build Coastguard Worker ModuleBase 23*333d2b36SAndroid Build Coastguard Worker props struct { 24*333d2b36SAndroid Build Coastguard Worker Foo string `android:"path"` 25*333d2b36SAndroid Build Coastguard Worker Bar []string `android:"path,arch_variant"` 26*333d2b36SAndroid Build Coastguard Worker Baz *string `android:"path"` 27*333d2b36SAndroid Build Coastguard Worker Qux string 28*333d2b36SAndroid Build Coastguard Worker V *struct { 29*333d2b36SAndroid Build Coastguard Worker W string `android:"path"` 30*333d2b36SAndroid Build Coastguard Worker } 31*333d2b36SAndroid Build Coastguard Worker } 32*333d2b36SAndroid Build Coastguard Worker 33*333d2b36SAndroid Build Coastguard Worker // A second property struct with a duplicate property name 34*333d2b36SAndroid Build Coastguard Worker props2 struct { 35*333d2b36SAndroid Build Coastguard Worker Foo string `android:"path"` 36*333d2b36SAndroid Build Coastguard Worker } 37*333d2b36SAndroid Build Coastguard Worker 38*333d2b36SAndroid Build Coastguard Worker // nested slices of struct 39*333d2b36SAndroid Build Coastguard Worker props3 struct { 40*333d2b36SAndroid Build Coastguard Worker X []struct { 41*333d2b36SAndroid Build Coastguard Worker Y []struct { 42*333d2b36SAndroid Build Coastguard Worker Z []string `android:"path"` 43*333d2b36SAndroid Build Coastguard Worker } 44*333d2b36SAndroid Build Coastguard Worker } 45*333d2b36SAndroid Build Coastguard Worker } 46*333d2b36SAndroid Build Coastguard Worker 47*333d2b36SAndroid Build Coastguard Worker sourceDeps []string 48*333d2b36SAndroid Build Coastguard Worker} 49*333d2b36SAndroid Build Coastguard Worker 50*333d2b36SAndroid Build Coastguard Workerfunc pathDepsMutatorTestModuleFactory() Module { 51*333d2b36SAndroid Build Coastguard Worker module := &pathDepsMutatorTestModule{} 52*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.props, &module.props2, &module.props3) 53*333d2b36SAndroid Build Coastguard Worker InitAndroidArchModule(module, DeviceSupported, MultilibBoth) 54*333d2b36SAndroid Build Coastguard Worker return module 55*333d2b36SAndroid Build Coastguard Worker} 56*333d2b36SAndroid Build Coastguard Worker 57*333d2b36SAndroid Build Coastguard Workerfunc (p *pathDepsMutatorTestModule) GenerateAndroidBuildActions(ctx ModuleContext) { 58*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDeps(func(dep Module) { 59*333d2b36SAndroid Build Coastguard Worker if _, ok := ctx.OtherModuleDependencyTag(dep).(sourceOrOutputDependencyTag); ok { 60*333d2b36SAndroid Build Coastguard Worker p.sourceDeps = append(p.sourceDeps, ctx.OtherModuleName(dep)) 61*333d2b36SAndroid Build Coastguard Worker } 62*333d2b36SAndroid Build Coastguard Worker }) 63*333d2b36SAndroid Build Coastguard Worker 64*333d2b36SAndroid Build Coastguard Worker if p.props.Foo != "" { 65*333d2b36SAndroid Build Coastguard Worker // Make sure there is only one dependency on a module listed in a property present in multiple property structs 66*333d2b36SAndroid Build Coastguard Worker m := SrcIsModule(p.props.Foo) 67*333d2b36SAndroid Build Coastguard Worker if GetModuleProxyFromPathDep(ctx, m, "") == nil { 68*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("GetDirectDepWithTag failed") 69*333d2b36SAndroid Build Coastguard Worker } 70*333d2b36SAndroid Build Coastguard Worker } 71*333d2b36SAndroid Build Coastguard Worker} 72*333d2b36SAndroid Build Coastguard Worker 73*333d2b36SAndroid Build Coastguard Workerfunc TestPathDepsMutator(t *testing.T) { 74*333d2b36SAndroid Build Coastguard Worker tests := []struct { 75*333d2b36SAndroid Build Coastguard Worker name string 76*333d2b36SAndroid Build Coastguard Worker bp string 77*333d2b36SAndroid Build Coastguard Worker deps []string 78*333d2b36SAndroid Build Coastguard Worker }{ 79*333d2b36SAndroid Build Coastguard Worker { 80*333d2b36SAndroid Build Coastguard Worker name: "all", 81*333d2b36SAndroid Build Coastguard Worker bp: ` 82*333d2b36SAndroid Build Coastguard Worker test { 83*333d2b36SAndroid Build Coastguard Worker name: "foo", 84*333d2b36SAndroid Build Coastguard Worker foo: ":a", 85*333d2b36SAndroid Build Coastguard Worker bar: [":b"], 86*333d2b36SAndroid Build Coastguard Worker baz: ":c{.bar}", 87*333d2b36SAndroid Build Coastguard Worker qux: ":d", 88*333d2b36SAndroid Build Coastguard Worker x: [ 89*333d2b36SAndroid Build Coastguard Worker { 90*333d2b36SAndroid Build Coastguard Worker y: [ 91*333d2b36SAndroid Build Coastguard Worker { 92*333d2b36SAndroid Build Coastguard Worker z: [":x", ":y"], 93*333d2b36SAndroid Build Coastguard Worker }, 94*333d2b36SAndroid Build Coastguard Worker { 95*333d2b36SAndroid Build Coastguard Worker z: [":z"], 96*333d2b36SAndroid Build Coastguard Worker }, 97*333d2b36SAndroid Build Coastguard Worker ], 98*333d2b36SAndroid Build Coastguard Worker }, 99*333d2b36SAndroid Build Coastguard Worker ], 100*333d2b36SAndroid Build Coastguard Worker v: { 101*333d2b36SAndroid Build Coastguard Worker w: ":w", 102*333d2b36SAndroid Build Coastguard Worker }, 103*333d2b36SAndroid Build Coastguard Worker }`, 104*333d2b36SAndroid Build Coastguard Worker deps: []string{"a", "b", "c", "w", "x", "y", "z"}, 105*333d2b36SAndroid Build Coastguard Worker }, 106*333d2b36SAndroid Build Coastguard Worker { 107*333d2b36SAndroid Build Coastguard Worker name: "arch variant", 108*333d2b36SAndroid Build Coastguard Worker bp: ` 109*333d2b36SAndroid Build Coastguard Worker test { 110*333d2b36SAndroid Build Coastguard Worker name: "foo", 111*333d2b36SAndroid Build Coastguard Worker arch: { 112*333d2b36SAndroid Build Coastguard Worker arm64: { 113*333d2b36SAndroid Build Coastguard Worker bar: [":a"], 114*333d2b36SAndroid Build Coastguard Worker }, 115*333d2b36SAndroid Build Coastguard Worker arm: { 116*333d2b36SAndroid Build Coastguard Worker bar: [":b"], 117*333d2b36SAndroid Build Coastguard Worker }, 118*333d2b36SAndroid Build Coastguard Worker }, 119*333d2b36SAndroid Build Coastguard Worker bar: [":c"], 120*333d2b36SAndroid Build Coastguard Worker }`, 121*333d2b36SAndroid Build Coastguard Worker deps: []string{"c", "a"}, 122*333d2b36SAndroid Build Coastguard Worker }, 123*333d2b36SAndroid Build Coastguard Worker } 124*333d2b36SAndroid Build Coastguard Worker 125*333d2b36SAndroid Build Coastguard Worker for _, test := range tests { 126*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 127*333d2b36SAndroid Build Coastguard Worker bp := test.bp + ` 128*333d2b36SAndroid Build Coastguard Worker filegroup { 129*333d2b36SAndroid Build Coastguard Worker name: "a", 130*333d2b36SAndroid Build Coastguard Worker } 131*333d2b36SAndroid Build Coastguard Worker 132*333d2b36SAndroid Build Coastguard Worker filegroup { 133*333d2b36SAndroid Build Coastguard Worker name: "b", 134*333d2b36SAndroid Build Coastguard Worker } 135*333d2b36SAndroid Build Coastguard Worker 136*333d2b36SAndroid Build Coastguard Worker filegroup { 137*333d2b36SAndroid Build Coastguard Worker name: "c", 138*333d2b36SAndroid Build Coastguard Worker } 139*333d2b36SAndroid Build Coastguard Worker 140*333d2b36SAndroid Build Coastguard Worker filegroup { 141*333d2b36SAndroid Build Coastguard Worker name: "d", 142*333d2b36SAndroid Build Coastguard Worker } 143*333d2b36SAndroid Build Coastguard Worker 144*333d2b36SAndroid Build Coastguard Worker filegroup { 145*333d2b36SAndroid Build Coastguard Worker name: "w", 146*333d2b36SAndroid Build Coastguard Worker } 147*333d2b36SAndroid Build Coastguard Worker 148*333d2b36SAndroid Build Coastguard Worker filegroup { 149*333d2b36SAndroid Build Coastguard Worker name: "x", 150*333d2b36SAndroid Build Coastguard Worker } 151*333d2b36SAndroid Build Coastguard Worker 152*333d2b36SAndroid Build Coastguard Worker filegroup { 153*333d2b36SAndroid Build Coastguard Worker name: "y", 154*333d2b36SAndroid Build Coastguard Worker } 155*333d2b36SAndroid Build Coastguard Worker 156*333d2b36SAndroid Build Coastguard Worker filegroup { 157*333d2b36SAndroid Build Coastguard Worker name: "z", 158*333d2b36SAndroid Build Coastguard Worker } 159*333d2b36SAndroid Build Coastguard Worker ` 160*333d2b36SAndroid Build Coastguard Worker 161*333d2b36SAndroid Build Coastguard Worker result := GroupFixturePreparers( 162*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithArchMutator, 163*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithFilegroup, 164*333d2b36SAndroid Build Coastguard Worker FixtureRegisterWithContext(func(ctx RegistrationContext) { 165*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("test", pathDepsMutatorTestModuleFactory) 166*333d2b36SAndroid Build Coastguard Worker }), 167*333d2b36SAndroid Build Coastguard Worker FixtureWithRootAndroidBp(bp), 168*333d2b36SAndroid Build Coastguard Worker ).RunTest(t) 169*333d2b36SAndroid Build Coastguard Worker 170*333d2b36SAndroid Build Coastguard Worker m := result.Module("foo", "android_arm64_armv8-a").(*pathDepsMutatorTestModule) 171*333d2b36SAndroid Build Coastguard Worker 172*333d2b36SAndroid Build Coastguard Worker AssertDeepEquals(t, "deps", test.deps, m.sourceDeps) 173*333d2b36SAndroid Build Coastguard Worker }) 174*333d2b36SAndroid Build Coastguard Worker } 175*333d2b36SAndroid Build Coastguard Worker} 176