1*333d2b36SAndroid Build Coastguard Worker// Copyright 2015 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 "fmt" 19*333d2b36SAndroid Build Coastguard Worker "strings" 20*333d2b36SAndroid Build Coastguard Worker "sync" 21*333d2b36SAndroid Build Coastguard Worker "sync/atomic" 22*333d2b36SAndroid Build Coastguard Worker "testing" 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 25*333d2b36SAndroid Build Coastguard Worker) 26*333d2b36SAndroid Build Coastguard Worker 27*333d2b36SAndroid Build Coastguard Workertype mutatorTestModule struct { 28*333d2b36SAndroid Build Coastguard Worker ModuleBase 29*333d2b36SAndroid Build Coastguard Worker props struct { 30*333d2b36SAndroid Build Coastguard Worker Deps_missing_deps []string 31*333d2b36SAndroid Build Coastguard Worker Mutator_missing_deps []string 32*333d2b36SAndroid Build Coastguard Worker } 33*333d2b36SAndroid Build Coastguard Worker 34*333d2b36SAndroid Build Coastguard Worker missingDeps []string 35*333d2b36SAndroid Build Coastguard Worker} 36*333d2b36SAndroid Build Coastguard Worker 37*333d2b36SAndroid Build Coastguard Workerfunc mutatorTestModuleFactory() Module { 38*333d2b36SAndroid Build Coastguard Worker module := &mutatorTestModule{} 39*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.props) 40*333d2b36SAndroid Build Coastguard Worker InitAndroidModule(module) 41*333d2b36SAndroid Build Coastguard Worker return module 42*333d2b36SAndroid Build Coastguard Worker} 43*333d2b36SAndroid Build Coastguard Worker 44*333d2b36SAndroid Build Coastguard Workerfunc (m *mutatorTestModule) GenerateAndroidBuildActions(ctx ModuleContext) { 45*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, BuildParams{ 46*333d2b36SAndroid Build Coastguard Worker Rule: Touch, 47*333d2b36SAndroid Build Coastguard Worker Output: PathForModuleOut(ctx, "output"), 48*333d2b36SAndroid Build Coastguard Worker }) 49*333d2b36SAndroid Build Coastguard Worker 50*333d2b36SAndroid Build Coastguard Worker m.missingDeps = ctx.GetMissingDependencies() 51*333d2b36SAndroid Build Coastguard Worker} 52*333d2b36SAndroid Build Coastguard Worker 53*333d2b36SAndroid Build Coastguard Workerfunc (m *mutatorTestModule) DepsMutator(ctx BottomUpMutatorContext) { 54*333d2b36SAndroid Build Coastguard Worker ctx.AddDependency(ctx.Module(), nil, m.props.Deps_missing_deps...) 55*333d2b36SAndroid Build Coastguard Worker} 56*333d2b36SAndroid Build Coastguard Worker 57*333d2b36SAndroid Build Coastguard Workerfunc addMissingDependenciesMutator(ctx TopDownMutatorContext) { 58*333d2b36SAndroid Build Coastguard Worker ctx.AddMissingDependencies(ctx.Module().(*mutatorTestModule).props.Mutator_missing_deps) 59*333d2b36SAndroid Build Coastguard Worker} 60*333d2b36SAndroid Build Coastguard Worker 61*333d2b36SAndroid Build Coastguard Workerfunc TestMutatorAddMissingDependencies(t *testing.T) { 62*333d2b36SAndroid Build Coastguard Worker bp := ` 63*333d2b36SAndroid Build Coastguard Worker test { 64*333d2b36SAndroid Build Coastguard Worker name: "foo", 65*333d2b36SAndroid Build Coastguard Worker deps_missing_deps: ["regular_missing_dep"], 66*333d2b36SAndroid Build Coastguard Worker mutator_missing_deps: ["added_missing_dep"], 67*333d2b36SAndroid Build Coastguard Worker } 68*333d2b36SAndroid Build Coastguard Worker ` 69*333d2b36SAndroid Build Coastguard Worker 70*333d2b36SAndroid Build Coastguard Worker result := GroupFixturePreparers( 71*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithAllowMissingDependencies, 72*333d2b36SAndroid Build Coastguard Worker FixtureRegisterWithContext(func(ctx RegistrationContext) { 73*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("test", mutatorTestModuleFactory) 74*333d2b36SAndroid Build Coastguard Worker ctx.PreDepsMutators(func(ctx RegisterMutatorsContext) { 75*333d2b36SAndroid Build Coastguard Worker ctx.TopDown("add_missing_dependencies", addMissingDependenciesMutator) 76*333d2b36SAndroid Build Coastguard Worker }) 77*333d2b36SAndroid Build Coastguard Worker }), 78*333d2b36SAndroid Build Coastguard Worker FixtureWithRootAndroidBp(bp), 79*333d2b36SAndroid Build Coastguard Worker ).RunTest(t) 80*333d2b36SAndroid Build Coastguard Worker 81*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", "").Module().(*mutatorTestModule) 82*333d2b36SAndroid Build Coastguard Worker 83*333d2b36SAndroid Build Coastguard Worker AssertDeepEquals(t, "foo missing deps", []string{"added_missing_dep", "regular_missing_dep"}, foo.missingDeps) 84*333d2b36SAndroid Build Coastguard Worker} 85*333d2b36SAndroid Build Coastguard Worker 86*333d2b36SAndroid Build Coastguard Workertype testTransitionMutator struct { 87*333d2b36SAndroid Build Coastguard Worker split func(ctx BaseModuleContext) []string 88*333d2b36SAndroid Build Coastguard Worker outgoingTransition func(ctx OutgoingTransitionContext, sourceVariation string) string 89*333d2b36SAndroid Build Coastguard Worker incomingTransition func(ctx IncomingTransitionContext, incomingVariation string) string 90*333d2b36SAndroid Build Coastguard Worker mutate func(ctx BottomUpMutatorContext, variation string) 91*333d2b36SAndroid Build Coastguard Worker} 92*333d2b36SAndroid Build Coastguard Worker 93*333d2b36SAndroid Build Coastguard Workerfunc (t *testTransitionMutator) Split(ctx BaseModuleContext) []string { 94*333d2b36SAndroid Build Coastguard Worker if t.split != nil { 95*333d2b36SAndroid Build Coastguard Worker return t.split(ctx) 96*333d2b36SAndroid Build Coastguard Worker } 97*333d2b36SAndroid Build Coastguard Worker return []string{""} 98*333d2b36SAndroid Build Coastguard Worker} 99*333d2b36SAndroid Build Coastguard Worker 100*333d2b36SAndroid Build Coastguard Workerfunc (t *testTransitionMutator) OutgoingTransition(ctx OutgoingTransitionContext, sourceVariation string) string { 101*333d2b36SAndroid Build Coastguard Worker if t.outgoingTransition != nil { 102*333d2b36SAndroid Build Coastguard Worker return t.outgoingTransition(ctx, sourceVariation) 103*333d2b36SAndroid Build Coastguard Worker } 104*333d2b36SAndroid Build Coastguard Worker return sourceVariation 105*333d2b36SAndroid Build Coastguard Worker} 106*333d2b36SAndroid Build Coastguard Worker 107*333d2b36SAndroid Build Coastguard Workerfunc (t *testTransitionMutator) IncomingTransition(ctx IncomingTransitionContext, incomingVariation string) string { 108*333d2b36SAndroid Build Coastguard Worker if t.incomingTransition != nil { 109*333d2b36SAndroid Build Coastguard Worker return t.incomingTransition(ctx, incomingVariation) 110*333d2b36SAndroid Build Coastguard Worker } 111*333d2b36SAndroid Build Coastguard Worker return incomingVariation 112*333d2b36SAndroid Build Coastguard Worker} 113*333d2b36SAndroid Build Coastguard Worker 114*333d2b36SAndroid Build Coastguard Workerfunc (t *testTransitionMutator) Mutate(ctx BottomUpMutatorContext, variation string) { 115*333d2b36SAndroid Build Coastguard Worker if t.mutate != nil { 116*333d2b36SAndroid Build Coastguard Worker t.mutate(ctx, variation) 117*333d2b36SAndroid Build Coastguard Worker } 118*333d2b36SAndroid Build Coastguard Worker} 119*333d2b36SAndroid Build Coastguard Worker 120*333d2b36SAndroid Build Coastguard Workerfunc TestModuleString(t *testing.T) { 121*333d2b36SAndroid Build Coastguard Worker bp := ` 122*333d2b36SAndroid Build Coastguard Worker test { 123*333d2b36SAndroid Build Coastguard Worker name: "foo", 124*333d2b36SAndroid Build Coastguard Worker } 125*333d2b36SAndroid Build Coastguard Worker ` 126*333d2b36SAndroid Build Coastguard Worker 127*333d2b36SAndroid Build Coastguard Worker var moduleStrings []string 128*333d2b36SAndroid Build Coastguard Worker 129*333d2b36SAndroid Build Coastguard Worker GroupFixturePreparers( 130*333d2b36SAndroid Build Coastguard Worker FixtureRegisterWithContext(func(ctx RegistrationContext) { 131*333d2b36SAndroid Build Coastguard Worker 132*333d2b36SAndroid Build Coastguard Worker ctx.PreArchMutators(func(ctx RegisterMutatorsContext) { 133*333d2b36SAndroid Build Coastguard Worker ctx.Transition("pre_arch", &testTransitionMutator{ 134*333d2b36SAndroid Build Coastguard Worker split: func(ctx BaseModuleContext) []string { 135*333d2b36SAndroid Build Coastguard Worker moduleStrings = append(moduleStrings, ctx.Module().String()) 136*333d2b36SAndroid Build Coastguard Worker return []string{"a", "b"} 137*333d2b36SAndroid Build Coastguard Worker }, 138*333d2b36SAndroid Build Coastguard Worker }) 139*333d2b36SAndroid Build Coastguard Worker }) 140*333d2b36SAndroid Build Coastguard Worker 141*333d2b36SAndroid Build Coastguard Worker ctx.PreDepsMutators(func(ctx RegisterMutatorsContext) { 142*333d2b36SAndroid Build Coastguard Worker ctx.Transition("pre_deps", &testTransitionMutator{ 143*333d2b36SAndroid Build Coastguard Worker split: func(ctx BaseModuleContext) []string { 144*333d2b36SAndroid Build Coastguard Worker moduleStrings = append(moduleStrings, ctx.Module().String()) 145*333d2b36SAndroid Build Coastguard Worker return []string{"c", "d"} 146*333d2b36SAndroid Build Coastguard Worker }, 147*333d2b36SAndroid Build Coastguard Worker }) 148*333d2b36SAndroid Build Coastguard Worker }) 149*333d2b36SAndroid Build Coastguard Worker 150*333d2b36SAndroid Build Coastguard Worker ctx.PostDepsMutators(func(ctx RegisterMutatorsContext) { 151*333d2b36SAndroid Build Coastguard Worker ctx.Transition("post_deps", &testTransitionMutator{ 152*333d2b36SAndroid Build Coastguard Worker split: func(ctx BaseModuleContext) []string { 153*333d2b36SAndroid Build Coastguard Worker moduleStrings = append(moduleStrings, ctx.Module().String()) 154*333d2b36SAndroid Build Coastguard Worker return []string{"e", "f"} 155*333d2b36SAndroid Build Coastguard Worker }, 156*333d2b36SAndroid Build Coastguard Worker outgoingTransition: func(ctx OutgoingTransitionContext, sourceVariation string) string { 157*333d2b36SAndroid Build Coastguard Worker return "" 158*333d2b36SAndroid Build Coastguard Worker }, 159*333d2b36SAndroid Build Coastguard Worker }) 160*333d2b36SAndroid Build Coastguard Worker ctx.BottomUp("rename_bottom_up", func(ctx BottomUpMutatorContext) { 161*333d2b36SAndroid Build Coastguard Worker moduleStrings = append(moduleStrings, ctx.Module().String()) 162*333d2b36SAndroid Build Coastguard Worker ctx.Rename(ctx.Module().base().Name() + "_renamed1") 163*333d2b36SAndroid Build Coastguard Worker }).UsesRename() 164*333d2b36SAndroid Build Coastguard Worker ctx.BottomUp("final", func(ctx BottomUpMutatorContext) { 165*333d2b36SAndroid Build Coastguard Worker moduleStrings = append(moduleStrings, ctx.Module().String()) 166*333d2b36SAndroid Build Coastguard Worker }) 167*333d2b36SAndroid Build Coastguard Worker }) 168*333d2b36SAndroid Build Coastguard Worker 169*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("test", mutatorTestModuleFactory) 170*333d2b36SAndroid Build Coastguard Worker }), 171*333d2b36SAndroid Build Coastguard Worker FixtureWithRootAndroidBp(bp), 172*333d2b36SAndroid Build Coastguard Worker ).RunTest(t) 173*333d2b36SAndroid Build Coastguard Worker 174*333d2b36SAndroid Build Coastguard Worker want := []string{ 175*333d2b36SAndroid Build Coastguard Worker // Initial name. 176*333d2b36SAndroid Build Coastguard Worker "foo{}", 177*333d2b36SAndroid Build Coastguard Worker 178*333d2b36SAndroid Build Coastguard Worker // After pre_arch (reversed because rename_top_down is TopDown so it visits in reverse order). 179*333d2b36SAndroid Build Coastguard Worker "foo{pre_arch:b}", 180*333d2b36SAndroid Build Coastguard Worker "foo{pre_arch:a}", 181*333d2b36SAndroid Build Coastguard Worker 182*333d2b36SAndroid Build Coastguard Worker // After pre_deps (reversed because post_deps TransitionMutator.Split is TopDown). 183*333d2b36SAndroid Build Coastguard Worker "foo{pre_arch:b,pre_deps:d}", 184*333d2b36SAndroid Build Coastguard Worker "foo{pre_arch:b,pre_deps:c}", 185*333d2b36SAndroid Build Coastguard Worker "foo{pre_arch:a,pre_deps:d}", 186*333d2b36SAndroid Build Coastguard Worker "foo{pre_arch:a,pre_deps:c}", 187*333d2b36SAndroid Build Coastguard Worker 188*333d2b36SAndroid Build Coastguard Worker // After post_deps. 189*333d2b36SAndroid Build Coastguard Worker "foo{pre_arch:a,pre_deps:c,post_deps:e}", 190*333d2b36SAndroid Build Coastguard Worker "foo{pre_arch:a,pre_deps:c,post_deps:f}", 191*333d2b36SAndroid Build Coastguard Worker "foo{pre_arch:a,pre_deps:d,post_deps:e}", 192*333d2b36SAndroid Build Coastguard Worker "foo{pre_arch:a,pre_deps:d,post_deps:f}", 193*333d2b36SAndroid Build Coastguard Worker "foo{pre_arch:b,pre_deps:c,post_deps:e}", 194*333d2b36SAndroid Build Coastguard Worker "foo{pre_arch:b,pre_deps:c,post_deps:f}", 195*333d2b36SAndroid Build Coastguard Worker "foo{pre_arch:b,pre_deps:d,post_deps:e}", 196*333d2b36SAndroid Build Coastguard Worker "foo{pre_arch:b,pre_deps:d,post_deps:f}", 197*333d2b36SAndroid Build Coastguard Worker 198*333d2b36SAndroid Build Coastguard Worker // After rename_bottom_up. 199*333d2b36SAndroid Build Coastguard Worker "foo_renamed1{pre_arch:a,pre_deps:c,post_deps:e}", 200*333d2b36SAndroid Build Coastguard Worker "foo_renamed1{pre_arch:a,pre_deps:c,post_deps:f}", 201*333d2b36SAndroid Build Coastguard Worker "foo_renamed1{pre_arch:a,pre_deps:d,post_deps:e}", 202*333d2b36SAndroid Build Coastguard Worker "foo_renamed1{pre_arch:a,pre_deps:d,post_deps:f}", 203*333d2b36SAndroid Build Coastguard Worker "foo_renamed1{pre_arch:b,pre_deps:c,post_deps:e}", 204*333d2b36SAndroid Build Coastguard Worker "foo_renamed1{pre_arch:b,pre_deps:c,post_deps:f}", 205*333d2b36SAndroid Build Coastguard Worker "foo_renamed1{pre_arch:b,pre_deps:d,post_deps:e}", 206*333d2b36SAndroid Build Coastguard Worker "foo_renamed1{pre_arch:b,pre_deps:d,post_deps:f}", 207*333d2b36SAndroid Build Coastguard Worker } 208*333d2b36SAndroid Build Coastguard Worker 209*333d2b36SAndroid Build Coastguard Worker AssertDeepEquals(t, "module String() values", want, moduleStrings) 210*333d2b36SAndroid Build Coastguard Worker} 211*333d2b36SAndroid Build Coastguard Worker 212*333d2b36SAndroid Build Coastguard Workerfunc TestFinalDepsPhase(t *testing.T) { 213*333d2b36SAndroid Build Coastguard Worker bp := ` 214*333d2b36SAndroid Build Coastguard Worker test { 215*333d2b36SAndroid Build Coastguard Worker name: "common_dep_1", 216*333d2b36SAndroid Build Coastguard Worker } 217*333d2b36SAndroid Build Coastguard Worker test { 218*333d2b36SAndroid Build Coastguard Worker name: "common_dep_2", 219*333d2b36SAndroid Build Coastguard Worker } 220*333d2b36SAndroid Build Coastguard Worker test { 221*333d2b36SAndroid Build Coastguard Worker name: "foo", 222*333d2b36SAndroid Build Coastguard Worker } 223*333d2b36SAndroid Build Coastguard Worker ` 224*333d2b36SAndroid Build Coastguard Worker 225*333d2b36SAndroid Build Coastguard Worker finalGot := sync.Map{} 226*333d2b36SAndroid Build Coastguard Worker 227*333d2b36SAndroid Build Coastguard Worker GroupFixturePreparers( 228*333d2b36SAndroid Build Coastguard Worker FixtureRegisterWithContext(func(ctx RegistrationContext) { 229*333d2b36SAndroid Build Coastguard Worker dep1Tag := struct { 230*333d2b36SAndroid Build Coastguard Worker blueprint.BaseDependencyTag 231*333d2b36SAndroid Build Coastguard Worker }{} 232*333d2b36SAndroid Build Coastguard Worker dep2Tag := struct { 233*333d2b36SAndroid Build Coastguard Worker blueprint.BaseDependencyTag 234*333d2b36SAndroid Build Coastguard Worker }{} 235*333d2b36SAndroid Build Coastguard Worker 236*333d2b36SAndroid Build Coastguard Worker ctx.PostDepsMutators(func(ctx RegisterMutatorsContext) { 237*333d2b36SAndroid Build Coastguard Worker ctx.BottomUp("far_deps_1", func(ctx BottomUpMutatorContext) { 238*333d2b36SAndroid Build Coastguard Worker if !strings.HasPrefix(ctx.ModuleName(), "common_dep") { 239*333d2b36SAndroid Build Coastguard Worker ctx.AddFarVariationDependencies([]blueprint.Variation{}, dep1Tag, "common_dep_1") 240*333d2b36SAndroid Build Coastguard Worker } 241*333d2b36SAndroid Build Coastguard Worker }) 242*333d2b36SAndroid Build Coastguard Worker ctx.Transition("variant", &testTransitionMutator{ 243*333d2b36SAndroid Build Coastguard Worker split: func(ctx BaseModuleContext) []string { 244*333d2b36SAndroid Build Coastguard Worker return []string{"a", "b"} 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 ctx.FinalDepsMutators(func(ctx RegisterMutatorsContext) { 250*333d2b36SAndroid Build Coastguard Worker ctx.BottomUp("far_deps_2", func(ctx BottomUpMutatorContext) { 251*333d2b36SAndroid Build Coastguard Worker if !strings.HasPrefix(ctx.ModuleName(), "common_dep") { 252*333d2b36SAndroid Build Coastguard Worker ctx.AddFarVariationDependencies([]blueprint.Variation{}, dep2Tag, "common_dep_2") 253*333d2b36SAndroid Build Coastguard Worker } 254*333d2b36SAndroid Build Coastguard Worker }) 255*333d2b36SAndroid Build Coastguard Worker ctx.BottomUp("final", func(ctx BottomUpMutatorContext) { 256*333d2b36SAndroid Build Coastguard Worker counter, _ := finalGot.LoadOrStore(ctx.Module().String(), &atomic.Int64{}) 257*333d2b36SAndroid Build Coastguard Worker counter.(*atomic.Int64).Add(1) 258*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDeps(func(mod Module) { 259*333d2b36SAndroid Build Coastguard Worker counter, _ := finalGot.LoadOrStore(fmt.Sprintf("%s -> %s", ctx.Module().String(), mod), &atomic.Int64{}) 260*333d2b36SAndroid Build Coastguard Worker counter.(*atomic.Int64).Add(1) 261*333d2b36SAndroid Build Coastguard Worker }) 262*333d2b36SAndroid Build Coastguard Worker }) 263*333d2b36SAndroid Build Coastguard Worker }) 264*333d2b36SAndroid Build Coastguard Worker 265*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("test", mutatorTestModuleFactory) 266*333d2b36SAndroid Build Coastguard Worker }), 267*333d2b36SAndroid Build Coastguard Worker FixtureWithRootAndroidBp(bp), 268*333d2b36SAndroid Build Coastguard Worker ).RunTest(t) 269*333d2b36SAndroid Build Coastguard Worker 270*333d2b36SAndroid Build Coastguard Worker finalWant := map[string]int{ 271*333d2b36SAndroid Build Coastguard Worker "common_dep_1{variant:a}": 1, 272*333d2b36SAndroid Build Coastguard Worker "common_dep_1{variant:b}": 1, 273*333d2b36SAndroid Build Coastguard Worker "common_dep_2{variant:a}": 1, 274*333d2b36SAndroid Build Coastguard Worker "common_dep_2{variant:b}": 1, 275*333d2b36SAndroid Build Coastguard Worker "foo{variant:a}": 1, 276*333d2b36SAndroid Build Coastguard Worker "foo{variant:a} -> common_dep_1{variant:a}": 1, 277*333d2b36SAndroid Build Coastguard Worker "foo{variant:a} -> common_dep_2{variant:a}": 1, 278*333d2b36SAndroid Build Coastguard Worker "foo{variant:b}": 1, 279*333d2b36SAndroid Build Coastguard Worker "foo{variant:b} -> common_dep_1{variant:b}": 1, 280*333d2b36SAndroid Build Coastguard Worker "foo{variant:b} -> common_dep_2{variant:a}": 1, 281*333d2b36SAndroid Build Coastguard Worker } 282*333d2b36SAndroid Build Coastguard Worker 283*333d2b36SAndroid Build Coastguard Worker finalGotMap := make(map[string]int) 284*333d2b36SAndroid Build Coastguard Worker finalGot.Range(func(k, v any) bool { 285*333d2b36SAndroid Build Coastguard Worker finalGotMap[k.(string)] = int(v.(*atomic.Int64).Load()) 286*333d2b36SAndroid Build Coastguard Worker return true 287*333d2b36SAndroid Build Coastguard Worker }) 288*333d2b36SAndroid Build Coastguard Worker 289*333d2b36SAndroid Build Coastguard Worker AssertDeepEquals(t, "final", finalWant, finalGotMap) 290*333d2b36SAndroid Build Coastguard Worker} 291*333d2b36SAndroid Build Coastguard Worker 292*333d2b36SAndroid Build Coastguard Workerfunc TestTransitionMutatorInFinalDeps(t *testing.T) { 293*333d2b36SAndroid Build Coastguard Worker GroupFixturePreparers( 294*333d2b36SAndroid Build Coastguard Worker FixtureRegisterWithContext(func(ctx RegistrationContext) { 295*333d2b36SAndroid Build Coastguard Worker ctx.FinalDepsMutators(func(ctx RegisterMutatorsContext) { 296*333d2b36SAndroid Build Coastguard Worker ctx.Transition("vars", &testTransitionMutator{ 297*333d2b36SAndroid Build Coastguard Worker split: func(ctx BaseModuleContext) []string { 298*333d2b36SAndroid Build Coastguard Worker return []string{"a", "b"} 299*333d2b36SAndroid Build Coastguard Worker }, 300*333d2b36SAndroid Build Coastguard Worker }) 301*333d2b36SAndroid Build Coastguard Worker }) 302*333d2b36SAndroid Build Coastguard Worker 303*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("test", mutatorTestModuleFactory) 304*333d2b36SAndroid Build Coastguard Worker }), 305*333d2b36SAndroid Build Coastguard Worker FixtureWithRootAndroidBp(`test {name: "foo"}`), 306*333d2b36SAndroid Build Coastguard Worker ). 307*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(FixtureExpectsOneErrorPattern("not allowed in FinalDepsMutators")). 308*333d2b36SAndroid Build Coastguard Worker RunTest(t) 309*333d2b36SAndroid Build Coastguard Worker} 310