blob: b3ef00f3d435257aeb1a3e99919de4d033788178 [file] [log] [blame]
Colin Crossdc35e212019-06-06 16:13:11 -07001// Copyright 2015 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package android
16
17import (
Martin Stjernholm710ec3a2020-01-16 15:12:04 +000018 "fmt"
Martin Stjernholm710ec3a2020-01-16 15:12:04 +000019 "strings"
Colin Crossdc35e212019-06-06 16:13:11 -070020 "testing"
21
Martin Stjernholm710ec3a2020-01-16 15:12:04 +000022 "github.com/google/blueprint"
Colin Crossdc35e212019-06-06 16:13:11 -070023)
24
25type mutatorTestModule struct {
26 ModuleBase
27 props struct {
Colin Cross9a362232019-07-01 15:32:45 -070028 Deps_missing_deps []string
29 Mutator_missing_deps []string
Colin Crossdc35e212019-06-06 16:13:11 -070030 }
31
32 missingDeps []string
33}
34
35func mutatorTestModuleFactory() Module {
36 module := &mutatorTestModule{}
37 module.AddProperties(&module.props)
38 InitAndroidModule(module)
39 return module
40}
41
42func (m *mutatorTestModule) GenerateAndroidBuildActions(ctx ModuleContext) {
43 ctx.Build(pctx, BuildParams{
44 Rule: Touch,
45 Output: PathForModuleOut(ctx, "output"),
46 })
47
48 m.missingDeps = ctx.GetMissingDependencies()
49}
50
51func (m *mutatorTestModule) DepsMutator(ctx BottomUpMutatorContext) {
Colin Cross9a362232019-07-01 15:32:45 -070052 ctx.AddDependency(ctx.Module(), nil, m.props.Deps_missing_deps...)
Colin Crossdc35e212019-06-06 16:13:11 -070053}
54
55func addMissingDependenciesMutator(ctx TopDownMutatorContext) {
Colin Cross9a362232019-07-01 15:32:45 -070056 ctx.AddMissingDependencies(ctx.Module().(*mutatorTestModule).props.Mutator_missing_deps)
Colin Crossdc35e212019-06-06 16:13:11 -070057}
58
59func TestMutatorAddMissingDependencies(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -080060 bp := `
61 test {
62 name: "foo",
63 deps_missing_deps: ["regular_missing_dep"],
64 mutator_missing_deps: ["added_missing_dep"],
65 }
66 `
67
Paul Duffin30ac3e72021-03-20 00:36:14 +000068 result := GroupFixturePreparers(
Paul Duffine8a4ac42021-03-16 22:35:28 +000069 PrepareForTestWithAllowMissingDependencies,
70 FixtureRegisterWithContext(func(ctx RegistrationContext) {
71 ctx.RegisterModuleType("test", mutatorTestModuleFactory)
72 ctx.PreDepsMutators(func(ctx RegisterMutatorsContext) {
73 ctx.TopDown("add_missing_dependencies", addMissingDependenciesMutator)
74 })
75 }),
76 FixtureWithRootAndroidBp(bp),
Paul Duffin30ac3e72021-03-20 00:36:14 +000077 ).RunTest(t)
Colin Crossdc35e212019-06-06 16:13:11 -070078
Paul Duffine8a4ac42021-03-16 22:35:28 +000079 foo := result.ModuleForTests("foo", "").Module().(*mutatorTestModule)
Colin Crossdc35e212019-06-06 16:13:11 -070080
Paul Duffine8a4ac42021-03-16 22:35:28 +000081 AssertDeepEquals(t, "foo missing deps", []string{"added_missing_dep", "regular_missing_dep"}, foo.missingDeps)
Colin Crossdc35e212019-06-06 16:13:11 -070082}
Colin Cross9a362232019-07-01 15:32:45 -070083
Colin Crossd27205e2024-09-12 22:41:37 -070084type testTransitionMutator struct {
85 split func(ctx BaseModuleContext) []string
86 outgoingTransition func(ctx OutgoingTransitionContext, sourceVariation string) string
87 incomingTransition func(ctx IncomingTransitionContext, incomingVariation string) string
88 mutate func(ctx BottomUpMutatorContext, variation string)
89}
90
91func (t *testTransitionMutator) Split(ctx BaseModuleContext) []string {
92 if t.split != nil {
93 return t.split(ctx)
94 }
95 return []string{""}
96}
97
98func (t *testTransitionMutator) OutgoingTransition(ctx OutgoingTransitionContext, sourceVariation string) string {
99 if t.outgoingTransition != nil {
100 return t.outgoingTransition(ctx, sourceVariation)
101 }
102 return sourceVariation
103}
104
105func (t *testTransitionMutator) IncomingTransition(ctx IncomingTransitionContext, incomingVariation string) string {
106 if t.incomingTransition != nil {
107 return t.incomingTransition(ctx, incomingVariation)
108 }
109 return incomingVariation
110}
111
112func (t *testTransitionMutator) Mutate(ctx BottomUpMutatorContext, variation string) {
113 if t.mutate != nil {
114 t.mutate(ctx, variation)
115 }
116}
117
Colin Cross9a362232019-07-01 15:32:45 -0700118func TestModuleString(t *testing.T) {
Colin Crossae8600b2020-10-29 17:09:13 -0700119 bp := `
120 test {
121 name: "foo",
122 }
123 `
124
Colin Cross9a362232019-07-01 15:32:45 -0700125 var moduleStrings []string
126
Paul Duffin30ac3e72021-03-20 00:36:14 +0000127 GroupFixturePreparers(
Paul Duffine8a4ac42021-03-16 22:35:28 +0000128 FixtureRegisterWithContext(func(ctx RegistrationContext) {
Colin Cross9a362232019-07-01 15:32:45 -0700129
Paul Duffine8a4ac42021-03-16 22:35:28 +0000130 ctx.PreArchMutators(func(ctx RegisterMutatorsContext) {
Colin Crossd27205e2024-09-12 22:41:37 -0700131 ctx.Transition("pre_arch", &testTransitionMutator{
132 split: func(ctx BaseModuleContext) []string {
133 moduleStrings = append(moduleStrings, ctx.Module().String())
134 return []string{"a", "b"}
135 },
Paul Duffine8a4ac42021-03-16 22:35:28 +0000136 })
137 ctx.TopDown("rename_top_down", func(ctx TopDownMutatorContext) {
138 moduleStrings = append(moduleStrings, ctx.Module().String())
139 ctx.Rename(ctx.Module().base().Name() + "_renamed1")
140 })
141 })
Colin Cross9a362232019-07-01 15:32:45 -0700142
Paul Duffine8a4ac42021-03-16 22:35:28 +0000143 ctx.PreDepsMutators(func(ctx RegisterMutatorsContext) {
Colin Crossd27205e2024-09-12 22:41:37 -0700144 ctx.Transition("pre_deps", &testTransitionMutator{
145 split: func(ctx BaseModuleContext) []string {
146 moduleStrings = append(moduleStrings, ctx.Module().String())
147 return []string{"c", "d"}
148 },
Paul Duffine8a4ac42021-03-16 22:35:28 +0000149 })
150 })
Colin Cross9a362232019-07-01 15:32:45 -0700151
Paul Duffine8a4ac42021-03-16 22:35:28 +0000152 ctx.PostDepsMutators(func(ctx RegisterMutatorsContext) {
Colin Crossd27205e2024-09-12 22:41:37 -0700153 ctx.Transition("post_deps", &testTransitionMutator{
154 split: func(ctx BaseModuleContext) []string {
155 moduleStrings = append(moduleStrings, ctx.Module().String())
156 return []string{"e", "f"}
157 },
158 outgoingTransition: func(ctx OutgoingTransitionContext, sourceVariation string) string {
159 return ""
160 },
Paul Duffine8a4ac42021-03-16 22:35:28 +0000161 })
162 ctx.BottomUp("rename_bottom_up", func(ctx BottomUpMutatorContext) {
163 moduleStrings = append(moduleStrings, ctx.Module().String())
164 ctx.Rename(ctx.Module().base().Name() + "_renamed2")
165 })
166 ctx.BottomUp("final", func(ctx BottomUpMutatorContext) {
167 moduleStrings = append(moduleStrings, ctx.Module().String())
168 })
169 })
Colin Cross9a362232019-07-01 15:32:45 -0700170
Paul Duffine8a4ac42021-03-16 22:35:28 +0000171 ctx.RegisterModuleType("test", mutatorTestModuleFactory)
172 }),
173 FixtureWithRootAndroidBp(bp),
Paul Duffin30ac3e72021-03-20 00:36:14 +0000174 ).RunTest(t)
Colin Cross9a362232019-07-01 15:32:45 -0700175
176 want := []string{
177 // Initial name.
178 "foo{}",
179
180 // After pre_arch (reversed because rename_top_down is TopDown so it visits in reverse order).
181 "foo{pre_arch:b}",
182 "foo{pre_arch:a}",
183
Colin Crossd27205e2024-09-12 22:41:37 -0700184 // After rename_top_down (reversed because pre_deps TransitionMutator.Split is TopDown).
Colin Cross9a362232019-07-01 15:32:45 -0700185 "foo_renamed1{pre_arch:b}",
Colin Crossd27205e2024-09-12 22:41:37 -0700186 "foo_renamed1{pre_arch:a}",
Colin Cross9a362232019-07-01 15:32:45 -0700187
Colin Crossd27205e2024-09-12 22:41:37 -0700188 // After pre_deps (reversed because post_deps TransitionMutator.Split is TopDown).
Colin Cross9a362232019-07-01 15:32:45 -0700189 "foo_renamed1{pre_arch:b,pre_deps:d}",
Colin Crossd27205e2024-09-12 22:41:37 -0700190 "foo_renamed1{pre_arch:b,pre_deps:c}",
191 "foo_renamed1{pre_arch:a,pre_deps:d}",
192 "foo_renamed1{pre_arch:a,pre_deps:c}",
Colin Cross9a362232019-07-01 15:32:45 -0700193
194 // After post_deps.
195 "foo_renamed1{pre_arch:a,pre_deps:c,post_deps:e}",
196 "foo_renamed1{pre_arch:a,pre_deps:c,post_deps:f}",
197 "foo_renamed1{pre_arch:a,pre_deps:d,post_deps:e}",
198 "foo_renamed1{pre_arch:a,pre_deps:d,post_deps:f}",
199 "foo_renamed1{pre_arch:b,pre_deps:c,post_deps:e}",
200 "foo_renamed1{pre_arch:b,pre_deps:c,post_deps:f}",
201 "foo_renamed1{pre_arch:b,pre_deps:d,post_deps:e}",
202 "foo_renamed1{pre_arch:b,pre_deps:d,post_deps:f}",
203
204 // After rename_bottom_up.
205 "foo_renamed2{pre_arch:a,pre_deps:c,post_deps:e}",
206 "foo_renamed2{pre_arch:a,pre_deps:c,post_deps:f}",
207 "foo_renamed2{pre_arch:a,pre_deps:d,post_deps:e}",
208 "foo_renamed2{pre_arch:a,pre_deps:d,post_deps:f}",
209 "foo_renamed2{pre_arch:b,pre_deps:c,post_deps:e}",
210 "foo_renamed2{pre_arch:b,pre_deps:c,post_deps:f}",
211 "foo_renamed2{pre_arch:b,pre_deps:d,post_deps:e}",
212 "foo_renamed2{pre_arch:b,pre_deps:d,post_deps:f}",
213 }
214
Paul Duffine8a4ac42021-03-16 22:35:28 +0000215 AssertDeepEquals(t, "module String() values", want, moduleStrings)
Colin Cross9a362232019-07-01 15:32:45 -0700216}
Martin Stjernholm710ec3a2020-01-16 15:12:04 +0000217
218func TestFinalDepsPhase(t *testing.T) {
Colin Crossae8600b2020-10-29 17:09:13 -0700219 bp := `
220 test {
221 name: "common_dep_1",
222 }
223 test {
224 name: "common_dep_2",
225 }
226 test {
227 name: "foo",
228 }
229 `
230
Martin Stjernholm710ec3a2020-01-16 15:12:04 +0000231 finalGot := map[string]int{}
232
Paul Duffin30ac3e72021-03-20 00:36:14 +0000233 GroupFixturePreparers(
Paul Duffine8a4ac42021-03-16 22:35:28 +0000234 FixtureRegisterWithContext(func(ctx RegistrationContext) {
235 dep1Tag := struct {
236 blueprint.BaseDependencyTag
237 }{}
238 dep2Tag := struct {
239 blueprint.BaseDependencyTag
240 }{}
Martin Stjernholm710ec3a2020-01-16 15:12:04 +0000241
Paul Duffine8a4ac42021-03-16 22:35:28 +0000242 ctx.PostDepsMutators(func(ctx RegisterMutatorsContext) {
243 ctx.BottomUp("far_deps_1", func(ctx BottomUpMutatorContext) {
244 if !strings.HasPrefix(ctx.ModuleName(), "common_dep") {
245 ctx.AddFarVariationDependencies([]blueprint.Variation{}, dep1Tag, "common_dep_1")
246 }
247 })
Colin Crossd27205e2024-09-12 22:41:37 -0700248 ctx.Transition("variant", &testTransitionMutator{
249 split: func(ctx BaseModuleContext) []string {
250 return []string{"a", "b"}
251 },
Paul Duffine8a4ac42021-03-16 22:35:28 +0000252 })
Martin Stjernholm710ec3a2020-01-16 15:12:04 +0000253 })
Martin Stjernholm710ec3a2020-01-16 15:12:04 +0000254
Paul Duffine8a4ac42021-03-16 22:35:28 +0000255 ctx.FinalDepsMutators(func(ctx RegisterMutatorsContext) {
256 ctx.BottomUp("far_deps_2", func(ctx BottomUpMutatorContext) {
257 if !strings.HasPrefix(ctx.ModuleName(), "common_dep") {
258 ctx.AddFarVariationDependencies([]blueprint.Variation{}, dep2Tag, "common_dep_2")
259 }
260 })
261 ctx.BottomUp("final", func(ctx BottomUpMutatorContext) {
262 finalGot[ctx.Module().String()] += 1
263 ctx.VisitDirectDeps(func(mod Module) {
264 finalGot[fmt.Sprintf("%s -> %s", ctx.Module().String(), mod)] += 1
265 })
266 })
267 })
Martin Stjernholm710ec3a2020-01-16 15:12:04 +0000268
Paul Duffine8a4ac42021-03-16 22:35:28 +0000269 ctx.RegisterModuleType("test", mutatorTestModuleFactory)
270 }),
271 FixtureWithRootAndroidBp(bp),
Paul Duffin30ac3e72021-03-20 00:36:14 +0000272 ).RunTest(t)
Martin Stjernholm710ec3a2020-01-16 15:12:04 +0000273
274 finalWant := map[string]int{
275 "common_dep_1{variant:a}": 1,
276 "common_dep_1{variant:b}": 1,
277 "common_dep_2{variant:a}": 1,
278 "common_dep_2{variant:b}": 1,
279 "foo{variant:a}": 1,
280 "foo{variant:a} -> common_dep_1{variant:a}": 1,
281 "foo{variant:a} -> common_dep_2{variant:a}": 1,
282 "foo{variant:b}": 1,
283 "foo{variant:b} -> common_dep_1{variant:b}": 1,
284 "foo{variant:b} -> common_dep_2{variant:a}": 1,
285 }
286
Paul Duffine8a4ac42021-03-16 22:35:28 +0000287 AssertDeepEquals(t, "final", finalWant, finalGot)
Martin Stjernholm710ec3a2020-01-16 15:12:04 +0000288}
289
290func TestNoCreateVariationsInFinalDeps(t *testing.T) {
Paul Duffin30ac3e72021-03-20 00:36:14 +0000291 GroupFixturePreparers(
Paul Duffine8a4ac42021-03-16 22:35:28 +0000292 FixtureRegisterWithContext(func(ctx RegistrationContext) {
293 ctx.FinalDepsMutators(func(ctx RegisterMutatorsContext) {
Colin Crossd27205e2024-09-12 22:41:37 -0700294 ctx.Transition("vars", &testTransitionMutator{
295 split: func(ctx BaseModuleContext) []string {
296 return []string{"a", "b"}
297 },
Paul Duffine8a4ac42021-03-16 22:35:28 +0000298 })
299 })
Martin Stjernholm710ec3a2020-01-16 15:12:04 +0000300
Paul Duffine8a4ac42021-03-16 22:35:28 +0000301 ctx.RegisterModuleType("test", mutatorTestModuleFactory)
302 }),
303 FixtureWithRootAndroidBp(`test {name: "foo"}`),
Colin Crossd27205e2024-09-12 22:41:37 -0700304 ).
305 ExtendWithErrorHandler(FixtureExpectsOneErrorPattern("not allowed in FinalDepsMutators")).
306 RunTest(t)
Martin Stjernholm710ec3a2020-01-16 15:12:04 +0000307}