xref: /aosp_15_r20/build/soong/android/defaults_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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	"github.com/google/blueprint"
21*333d2b36SAndroid Build Coastguard Worker)
22*333d2b36SAndroid Build Coastguard Worker
23*333d2b36SAndroid Build Coastguard Workertype defaultsTestProperties struct {
24*333d2b36SAndroid Build Coastguard Worker	Foo       []string
25*333d2b36SAndroid Build Coastguard Worker	Path_prop []string `android:"path"`
26*333d2b36SAndroid Build Coastguard Worker}
27*333d2b36SAndroid Build Coastguard Worker
28*333d2b36SAndroid Build Coastguard Workertype defaultsTestModule struct {
29*333d2b36SAndroid Build Coastguard Worker	ModuleBase
30*333d2b36SAndroid Build Coastguard Worker	DefaultableModuleBase
31*333d2b36SAndroid Build Coastguard Worker	properties defaultsTestProperties
32*333d2b36SAndroid Build Coastguard Worker}
33*333d2b36SAndroid Build Coastguard Worker
34*333d2b36SAndroid Build Coastguard Workerfunc (d *defaultsTestModule) GenerateAndroidBuildActions(ctx ModuleContext) {
35*333d2b36SAndroid Build Coastguard Worker	ctx.Build(pctx, BuildParams{
36*333d2b36SAndroid Build Coastguard Worker		Rule:   Touch,
37*333d2b36SAndroid Build Coastguard Worker		Output: PathForModuleOut(ctx, "out"),
38*333d2b36SAndroid Build Coastguard Worker	})
39*333d2b36SAndroid Build Coastguard Worker}
40*333d2b36SAndroid Build Coastguard Worker
41*333d2b36SAndroid Build Coastguard Workerfunc defaultsTestModuleFactory() Module {
42*333d2b36SAndroid Build Coastguard Worker	module := &defaultsTestModule{}
43*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(&module.properties)
44*333d2b36SAndroid Build Coastguard Worker	InitAndroidModule(module)
45*333d2b36SAndroid Build Coastguard Worker	InitDefaultableModule(module)
46*333d2b36SAndroid Build Coastguard Worker	return module
47*333d2b36SAndroid Build Coastguard Worker}
48*333d2b36SAndroid Build Coastguard Worker
49*333d2b36SAndroid Build Coastguard Workertype defaultsTestDefaults struct {
50*333d2b36SAndroid Build Coastguard Worker	ModuleBase
51*333d2b36SAndroid Build Coastguard Worker	DefaultsModuleBase
52*333d2b36SAndroid Build Coastguard Worker}
53*333d2b36SAndroid Build Coastguard Worker
54*333d2b36SAndroid Build Coastguard Workerfunc defaultsTestDefaultsFactory() Module {
55*333d2b36SAndroid Build Coastguard Worker	defaults := &defaultsTestDefaults{}
56*333d2b36SAndroid Build Coastguard Worker	defaults.AddProperties(&defaultsTestProperties{})
57*333d2b36SAndroid Build Coastguard Worker	InitDefaultsModule(defaults)
58*333d2b36SAndroid Build Coastguard Worker	return defaults
59*333d2b36SAndroid Build Coastguard Worker}
60*333d2b36SAndroid Build Coastguard Worker
61*333d2b36SAndroid Build Coastguard Workervar prepareForDefaultsTest = GroupFixturePreparers(
62*333d2b36SAndroid Build Coastguard Worker	PrepareForTestWithDefaults,
63*333d2b36SAndroid Build Coastguard Worker	FixtureRegisterWithContext(func(ctx RegistrationContext) {
64*333d2b36SAndroid Build Coastguard Worker		ctx.RegisterModuleType("test", defaultsTestModuleFactory)
65*333d2b36SAndroid Build Coastguard Worker		ctx.RegisterModuleType("defaults", defaultsTestDefaultsFactory)
66*333d2b36SAndroid Build Coastguard Worker	}),
67*333d2b36SAndroid Build Coastguard Worker)
68*333d2b36SAndroid Build Coastguard Worker
69*333d2b36SAndroid Build Coastguard Workerfunc TestDefaults(t *testing.T) {
70*333d2b36SAndroid Build Coastguard Worker	bp := `
71*333d2b36SAndroid Build Coastguard Worker		defaults {
72*333d2b36SAndroid Build Coastguard Worker			name: "transitive",
73*333d2b36SAndroid Build Coastguard Worker			foo: ["transitive"],
74*333d2b36SAndroid Build Coastguard Worker		}
75*333d2b36SAndroid Build Coastguard Worker
76*333d2b36SAndroid Build Coastguard Worker		defaults {
77*333d2b36SAndroid Build Coastguard Worker			name: "defaults",
78*333d2b36SAndroid Build Coastguard Worker			defaults: ["transitive"],
79*333d2b36SAndroid Build Coastguard Worker			foo: ["defaults"],
80*333d2b36SAndroid Build Coastguard Worker		}
81*333d2b36SAndroid Build Coastguard Worker
82*333d2b36SAndroid Build Coastguard Worker		test {
83*333d2b36SAndroid Build Coastguard Worker			name: "foo",
84*333d2b36SAndroid Build Coastguard Worker			defaults: ["defaults"],
85*333d2b36SAndroid Build Coastguard Worker			foo: ["module"],
86*333d2b36SAndroid Build Coastguard Worker		}
87*333d2b36SAndroid Build Coastguard Worker	`
88*333d2b36SAndroid Build Coastguard Worker
89*333d2b36SAndroid Build Coastguard Worker	result := GroupFixturePreparers(
90*333d2b36SAndroid Build Coastguard Worker		prepareForDefaultsTest,
91*333d2b36SAndroid Build Coastguard Worker		FixtureWithRootAndroidBp(bp),
92*333d2b36SAndroid Build Coastguard Worker	).RunTest(t)
93*333d2b36SAndroid Build Coastguard Worker
94*333d2b36SAndroid Build Coastguard Worker	foo := result.Module("foo", "").(*defaultsTestModule)
95*333d2b36SAndroid Build Coastguard Worker
96*333d2b36SAndroid Build Coastguard Worker	AssertDeepEquals(t, "foo", []string{"transitive", "defaults", "module"}, foo.properties.Foo)
97*333d2b36SAndroid Build Coastguard Worker}
98*333d2b36SAndroid Build Coastguard Worker
99*333d2b36SAndroid Build Coastguard Workerfunc TestDefaultsAllowMissingDependencies(t *testing.T) {
100*333d2b36SAndroid Build Coastguard Worker	bp := `
101*333d2b36SAndroid Build Coastguard Worker		defaults {
102*333d2b36SAndroid Build Coastguard Worker			name: "defaults",
103*333d2b36SAndroid Build Coastguard Worker			defaults: ["missing"],
104*333d2b36SAndroid Build Coastguard Worker			foo: ["defaults"],
105*333d2b36SAndroid Build Coastguard Worker		}
106*333d2b36SAndroid Build Coastguard Worker
107*333d2b36SAndroid Build Coastguard Worker		test {
108*333d2b36SAndroid Build Coastguard Worker			name: "missing_defaults",
109*333d2b36SAndroid Build Coastguard Worker			defaults: ["missing"],
110*333d2b36SAndroid Build Coastguard Worker			foo: ["module"],
111*333d2b36SAndroid Build Coastguard Worker		}
112*333d2b36SAndroid Build Coastguard Worker
113*333d2b36SAndroid Build Coastguard Worker		test {
114*333d2b36SAndroid Build Coastguard Worker			name: "missing_transitive_defaults",
115*333d2b36SAndroid Build Coastguard Worker			defaults: ["defaults"],
116*333d2b36SAndroid Build Coastguard Worker			foo: ["module"],
117*333d2b36SAndroid Build Coastguard Worker		}
118*333d2b36SAndroid Build Coastguard Worker	`
119*333d2b36SAndroid Build Coastguard Worker
120*333d2b36SAndroid Build Coastguard Worker	result := GroupFixturePreparers(
121*333d2b36SAndroid Build Coastguard Worker		prepareForDefaultsTest,
122*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithAllowMissingDependencies,
123*333d2b36SAndroid Build Coastguard Worker		FixtureWithRootAndroidBp(bp),
124*333d2b36SAndroid Build Coastguard Worker	).RunTest(t)
125*333d2b36SAndroid Build Coastguard Worker
126*333d2b36SAndroid Build Coastguard Worker	missingDefaults := result.ModuleForTests("missing_defaults", "").Output("out")
127*333d2b36SAndroid Build Coastguard Worker	missingTransitiveDefaults := result.ModuleForTests("missing_transitive_defaults", "").Output("out")
128*333d2b36SAndroid Build Coastguard Worker
129*333d2b36SAndroid Build Coastguard Worker	AssertSame(t, "missing_defaults rule", ErrorRule, missingDefaults.Rule)
130*333d2b36SAndroid Build Coastguard Worker
131*333d2b36SAndroid Build Coastguard Worker	AssertStringEquals(t, "missing_defaults", "module missing_defaults missing dependencies: missing\n", missingDefaults.Args["error"])
132*333d2b36SAndroid Build Coastguard Worker
133*333d2b36SAndroid Build Coastguard Worker	// TODO: missing transitive defaults is currently not handled
134*333d2b36SAndroid Build Coastguard Worker	_ = missingTransitiveDefaults
135*333d2b36SAndroid Build Coastguard Worker}
136*333d2b36SAndroid Build Coastguard Worker
137*333d2b36SAndroid Build Coastguard Workerfunc TestDefaultsPathProperties(t *testing.T) {
138*333d2b36SAndroid Build Coastguard Worker	bp := `
139*333d2b36SAndroid Build Coastguard Worker		defaults {
140*333d2b36SAndroid Build Coastguard Worker			name: "defaults",
141*333d2b36SAndroid Build Coastguard Worker			path_prop: [":gen"],
142*333d2b36SAndroid Build Coastguard Worker		}
143*333d2b36SAndroid Build Coastguard Worker
144*333d2b36SAndroid Build Coastguard Worker		test {
145*333d2b36SAndroid Build Coastguard Worker			name: "foo",
146*333d2b36SAndroid Build Coastguard Worker			defaults: ["defaults"],
147*333d2b36SAndroid Build Coastguard Worker		}
148*333d2b36SAndroid Build Coastguard Worker
149*333d2b36SAndroid Build Coastguard Worker		test {
150*333d2b36SAndroid Build Coastguard Worker			name: "gen",
151*333d2b36SAndroid Build Coastguard Worker		}
152*333d2b36SAndroid Build Coastguard Worker	`
153*333d2b36SAndroid Build Coastguard Worker
154*333d2b36SAndroid Build Coastguard Worker	result := GroupFixturePreparers(
155*333d2b36SAndroid Build Coastguard Worker		prepareForDefaultsTest,
156*333d2b36SAndroid Build Coastguard Worker		FixtureWithRootAndroidBp(bp),
157*333d2b36SAndroid Build Coastguard Worker	).RunTest(t)
158*333d2b36SAndroid Build Coastguard Worker
159*333d2b36SAndroid Build Coastguard Worker	collectDeps := func(m Module) []string {
160*333d2b36SAndroid Build Coastguard Worker		var deps []string
161*333d2b36SAndroid Build Coastguard Worker		result.VisitDirectDeps(m, func(dep blueprint.Module) {
162*333d2b36SAndroid Build Coastguard Worker			deps = append(deps, result.ModuleName(dep))
163*333d2b36SAndroid Build Coastguard Worker		})
164*333d2b36SAndroid Build Coastguard Worker		return deps
165*333d2b36SAndroid Build Coastguard Worker	}
166*333d2b36SAndroid Build Coastguard Worker
167*333d2b36SAndroid Build Coastguard Worker	foo := result.Module("foo", "")
168*333d2b36SAndroid Build Coastguard Worker	defaults := result.Module("defaults", "")
169*333d2b36SAndroid Build Coastguard Worker
170*333d2b36SAndroid Build Coastguard Worker	AssertStringListContains(t, "foo should depend on gen", collectDeps(foo), "gen")
171*333d2b36SAndroid Build Coastguard Worker	AssertStringListDoesNotContain(t, "defaults should not depend on gen", collectDeps(defaults), "gen")
172*333d2b36SAndroid Build Coastguard Worker}
173