xref: /aosp_15_r20/build/soong/android/mutator_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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