blob: 60a61199f53a2b527d5b4282f80e6635a84393dc [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 Cross2d2e68f2024-10-10 11:57:11 -070020 "sync"
21 "sync/atomic"
Colin Crossdc35e212019-06-06 16:13:11 -070022 "testing"
23
Martin Stjernholm710ec3a2020-01-16 15:12:04 +000024 "github.com/google/blueprint"
Colin Crossdc35e212019-06-06 16:13:11 -070025)
26
27type mutatorTestModule struct {
28 ModuleBase
29 props struct {
Colin Cross9a362232019-07-01 15:32:45 -070030 Deps_missing_deps []string
31 Mutator_missing_deps []string
Colin Crossdc35e212019-06-06 16:13:11 -070032 }
33
34 missingDeps []string
35}
36
37func mutatorTestModuleFactory() Module {
38 module := &mutatorTestModule{}
39 module.AddProperties(&module.props)
40 InitAndroidModule(module)
41 return module
42}
43
44func (m *mutatorTestModule) GenerateAndroidBuildActions(ctx ModuleContext) {
45 ctx.Build(pctx, BuildParams{
46 Rule: Touch,
47 Output: PathForModuleOut(ctx, "output"),
48 })
49
50 m.missingDeps = ctx.GetMissingDependencies()
51}
52
53func (m *mutatorTestModule) DepsMutator(ctx BottomUpMutatorContext) {
Colin Cross9a362232019-07-01 15:32:45 -070054 ctx.AddDependency(ctx.Module(), nil, m.props.Deps_missing_deps...)
Colin Crossdc35e212019-06-06 16:13:11 -070055}
56
57func addMissingDependenciesMutator(ctx TopDownMutatorContext) {
Colin Cross9a362232019-07-01 15:32:45 -070058 ctx.AddMissingDependencies(ctx.Module().(*mutatorTestModule).props.Mutator_missing_deps)
Colin Crossdc35e212019-06-06 16:13:11 -070059}
60
61func TestMutatorAddMissingDependencies(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -080062 bp := `
63 test {
64 name: "foo",
65 deps_missing_deps: ["regular_missing_dep"],
66 mutator_missing_deps: ["added_missing_dep"],
67 }
68 `
69
Paul Duffin30ac3e72021-03-20 00:36:14 +000070 result := GroupFixturePreparers(
Paul Duffine8a4ac42021-03-16 22:35:28 +000071 PrepareForTestWithAllowMissingDependencies,
72 FixtureRegisterWithContext(func(ctx RegistrationContext) {
73 ctx.RegisterModuleType("test", mutatorTestModuleFactory)
74 ctx.PreDepsMutators(func(ctx RegisterMutatorsContext) {
75 ctx.TopDown("add_missing_dependencies", addMissingDependenciesMutator)
76 })
77 }),
78 FixtureWithRootAndroidBp(bp),
Paul Duffin30ac3e72021-03-20 00:36:14 +000079 ).RunTest(t)
Colin Crossdc35e212019-06-06 16:13:11 -070080
Paul Duffine8a4ac42021-03-16 22:35:28 +000081 foo := result.ModuleForTests("foo", "").Module().(*mutatorTestModule)
Colin Crossdc35e212019-06-06 16:13:11 -070082
Paul Duffine8a4ac42021-03-16 22:35:28 +000083 AssertDeepEquals(t, "foo missing deps", []string{"added_missing_dep", "regular_missing_dep"}, foo.missingDeps)
Colin Crossdc35e212019-06-06 16:13:11 -070084}
Colin Cross9a362232019-07-01 15:32:45 -070085
Martin Stjernholm710ec3a2020-01-16 15:12:04 +000086func TestFinalDepsPhase(t *testing.T) {
Colin Crossae8600b2020-10-29 17:09:13 -070087 bp := `
88 test {
89 name: "common_dep_1",
90 }
91 test {
92 name: "common_dep_2",
93 }
94 test {
95 name: "foo",
96 }
97 `
98
Colin Cross2d2e68f2024-10-10 11:57:11 -070099 finalGot := sync.Map{}
Martin Stjernholm710ec3a2020-01-16 15:12:04 +0000100
Paul Duffin30ac3e72021-03-20 00:36:14 +0000101 GroupFixturePreparers(
Paul Duffine8a4ac42021-03-16 22:35:28 +0000102 FixtureRegisterWithContext(func(ctx RegistrationContext) {
103 dep1Tag := struct {
104 blueprint.BaseDependencyTag
105 }{}
106 dep2Tag := struct {
107 blueprint.BaseDependencyTag
108 }{}
Martin Stjernholm710ec3a2020-01-16 15:12:04 +0000109
Paul Duffine8a4ac42021-03-16 22:35:28 +0000110 ctx.PostDepsMutators(func(ctx RegisterMutatorsContext) {
111 ctx.BottomUp("far_deps_1", func(ctx BottomUpMutatorContext) {
112 if !strings.HasPrefix(ctx.ModuleName(), "common_dep") {
113 ctx.AddFarVariationDependencies([]blueprint.Variation{}, dep1Tag, "common_dep_1")
114 }
Colin Cross8a962802024-10-09 15:29:27 -0700115 })
Colin Crossd27205e2024-09-12 22:41:37 -0700116 ctx.Transition("variant", &testTransitionMutator{
117 split: func(ctx BaseModuleContext) []string {
118 return []string{"a", "b"}
119 },
Paul Duffine8a4ac42021-03-16 22:35:28 +0000120 })
Martin Stjernholm710ec3a2020-01-16 15:12:04 +0000121 })
Martin Stjernholm710ec3a2020-01-16 15:12:04 +0000122
Paul Duffine8a4ac42021-03-16 22:35:28 +0000123 ctx.FinalDepsMutators(func(ctx RegisterMutatorsContext) {
124 ctx.BottomUp("far_deps_2", func(ctx BottomUpMutatorContext) {
125 if !strings.HasPrefix(ctx.ModuleName(), "common_dep") {
126 ctx.AddFarVariationDependencies([]blueprint.Variation{}, dep2Tag, "common_dep_2")
127 }
Colin Cross8a962802024-10-09 15:29:27 -0700128 })
Paul Duffine8a4ac42021-03-16 22:35:28 +0000129 ctx.BottomUp("final", func(ctx BottomUpMutatorContext) {
Colin Cross2d2e68f2024-10-10 11:57:11 -0700130 counter, _ := finalGot.LoadOrStore(ctx.Module().String(), &atomic.Int64{})
131 counter.(*atomic.Int64).Add(1)
Paul Duffine8a4ac42021-03-16 22:35:28 +0000132 ctx.VisitDirectDeps(func(mod Module) {
Colin Cross2d2e68f2024-10-10 11:57:11 -0700133 counter, _ := finalGot.LoadOrStore(fmt.Sprintf("%s -> %s", ctx.Module().String(), mod), &atomic.Int64{})
134 counter.(*atomic.Int64).Add(1)
Paul Duffine8a4ac42021-03-16 22:35:28 +0000135 })
Colin Cross8a962802024-10-09 15:29:27 -0700136 })
Paul Duffine8a4ac42021-03-16 22:35:28 +0000137 })
Martin Stjernholm710ec3a2020-01-16 15:12:04 +0000138
Paul Duffine8a4ac42021-03-16 22:35:28 +0000139 ctx.RegisterModuleType("test", mutatorTestModuleFactory)
140 }),
141 FixtureWithRootAndroidBp(bp),
Paul Duffin30ac3e72021-03-20 00:36:14 +0000142 ).RunTest(t)
Martin Stjernholm710ec3a2020-01-16 15:12:04 +0000143
144 finalWant := map[string]int{
145 "common_dep_1{variant:a}": 1,
146 "common_dep_1{variant:b}": 1,
147 "common_dep_2{variant:a}": 1,
148 "common_dep_2{variant:b}": 1,
149 "foo{variant:a}": 1,
150 "foo{variant:a} -> common_dep_1{variant:a}": 1,
151 "foo{variant:a} -> common_dep_2{variant:a}": 1,
152 "foo{variant:b}": 1,
153 "foo{variant:b} -> common_dep_1{variant:b}": 1,
154 "foo{variant:b} -> common_dep_2{variant:a}": 1,
155 }
156
Colin Cross2d2e68f2024-10-10 11:57:11 -0700157 finalGotMap := make(map[string]int)
158 finalGot.Range(func(k, v any) bool {
159 finalGotMap[k.(string)] = int(v.(*atomic.Int64).Load())
160 return true
161 })
162
163 AssertDeepEquals(t, "final", finalWant, finalGotMap)
Martin Stjernholm710ec3a2020-01-16 15:12:04 +0000164}