blob: a72b160c0be49c3382088711f78493b8eb3eff27 [file] [log] [blame]
Colin Cross9d34f352019-11-22 16:03:51 -08001// Copyright 2019 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 (
Colin Cross9d34f352019-11-22 16:03:51 -080018 "testing"
19)
20
Liz Kammerdbd48092020-09-21 22:24:17 +000021type soongConfigTestDefaultsModuleProperties struct {
22}
23
24type soongConfigTestDefaultsModule struct {
25 ModuleBase
26 DefaultsModuleBase
27}
28
29func soongConfigTestDefaultsModuleFactory() Module {
30 m := &soongConfigTestDefaultsModule{}
31 m.AddProperties(&soongConfigTestModuleProperties{})
32 InitDefaultsModule(m)
33 return m
34}
35
Colin Cross9d34f352019-11-22 16:03:51 -080036type soongConfigTestModule struct {
37 ModuleBase
Liz Kammerdbd48092020-09-21 22:24:17 +000038 DefaultableModuleBase
Colin Cross9d34f352019-11-22 16:03:51 -080039 props soongConfigTestModuleProperties
40}
41
42type soongConfigTestModuleProperties struct {
43 Cflags []string
44}
45
46func soongConfigTestModuleFactory() Module {
47 m := &soongConfigTestModule{}
48 m.AddProperties(&m.props)
49 InitAndroidModule(m)
Liz Kammerdbd48092020-09-21 22:24:17 +000050 InitDefaultableModule(m)
Colin Cross9d34f352019-11-22 16:03:51 -080051 return m
52}
53
54func (t soongConfigTestModule) GenerateAndroidBuildActions(ModuleContext) {}
55
56func TestSoongConfigModule(t *testing.T) {
57 configBp := `
58 soong_config_module_type {
Liz Kammerdbd48092020-09-21 22:24:17 +000059 name: "acme_test",
60 module_type: "test",
Colin Cross9d34f352019-11-22 16:03:51 -080061 config_namespace: "acme",
Liz Kammer432bd592020-12-16 12:42:02 -080062 variables: ["board", "feature1", "FEATURE3", "unused_string_var"],
63 bool_variables: ["feature2", "unused_feature"],
64 value_variables: ["size", "unused_size"],
Liz Kammerdbd48092020-09-21 22:24:17 +000065 properties: ["cflags", "srcs", "defaults"],
Colin Cross9d34f352019-11-22 16:03:51 -080066 }
67
68 soong_config_string_variable {
69 name: "board",
Liz Kammer432bd592020-12-16 12:42:02 -080070 values: ["soc_a", "soc_b", "soc_c", "soc_d"],
71 }
72
73 soong_config_string_variable {
74 name: "unused_string_var",
75 values: ["a", "b"],
Colin Cross9d34f352019-11-22 16:03:51 -080076 }
77
78 soong_config_bool_variable {
79 name: "feature1",
80 }
81
82 soong_config_bool_variable {
Colin Cross3beeb1e2020-02-05 16:27:47 -080083 name: "FEATURE3",
Colin Cross9d34f352019-11-22 16:03:51 -080084 }
85 `
86
87 importBp := `
88 soong_config_module_type_import {
89 from: "SoongConfig.bp",
Liz Kammerdbd48092020-09-21 22:24:17 +000090 module_types: ["acme_test"],
Colin Cross9d34f352019-11-22 16:03:51 -080091 }
92 `
93
94 bp := `
Liz Kammerdbd48092020-09-21 22:24:17 +000095 test_defaults {
96 name: "foo_defaults",
97 cflags: ["DEFAULT"],
98 }
99
100 acme_test {
Colin Cross9d34f352019-11-22 16:03:51 -0800101 name: "foo",
102 cflags: ["-DGENERIC"],
Liz Kammerdbd48092020-09-21 22:24:17 +0000103 defaults: ["foo_defaults"],
Colin Cross9d34f352019-11-22 16:03:51 -0800104 soong_config_variables: {
105 board: {
106 soc_a: {
107 cflags: ["-DSOC_A"],
108 },
109 soc_b: {
110 cflags: ["-DSOC_B"],
111 },
Liz Kammer432bd592020-12-16 12:42:02 -0800112 soc_c: {},
113 conditions_default: {
114 cflags: ["-DSOC_CONDITIONS_DEFAULT"],
115 },
Colin Cross9d34f352019-11-22 16:03:51 -0800116 },
Dan Willemsenb0935db2020-03-23 19:42:18 -0700117 size: {
118 cflags: ["-DSIZE=%s"],
Liz Kammer432bd592020-12-16 12:42:02 -0800119 conditions_default: {
120 cflags: ["-DSIZE=CONDITIONS_DEFAULT"],
121 },
Dan Willemsenb0935db2020-03-23 19:42:18 -0700122 },
Colin Cross9d34f352019-11-22 16:03:51 -0800123 feature1: {
Liz Kammer432bd592020-12-16 12:42:02 -0800124 conditions_default: {
125 cflags: ["-DF1_CONDITIONS_DEFAULT"],
126 },
Colin Cross9d34f352019-11-22 16:03:51 -0800127 cflags: ["-DFEATURE1"],
128 },
129 feature2: {
130 cflags: ["-DFEATURE2"],
Liz Kammer432bd592020-12-16 12:42:02 -0800131 conditions_default: {
132 cflags: ["-DF2_CONDITIONS_DEFAULT"],
133 },
Colin Cross9d34f352019-11-22 16:03:51 -0800134 },
Colin Cross3beeb1e2020-02-05 16:27:47 -0800135 FEATURE3: {
Colin Cross9d34f352019-11-22 16:03:51 -0800136 cflags: ["-DFEATURE3"],
137 },
138 },
139 }
Liz Kammerdbd48092020-09-21 22:24:17 +0000140
141 test_defaults {
142 name: "foo_defaults_a",
143 cflags: ["DEFAULT_A"],
144 }
145
146 test_defaults {
147 name: "foo_defaults_b",
148 cflags: ["DEFAULT_B"],
149 }
150
151 acme_test {
152 name: "foo_with_defaults",
153 cflags: ["-DGENERIC"],
154 defaults: ["foo_defaults"],
155 soong_config_variables: {
156 board: {
157 soc_a: {
158 cflags: ["-DSOC_A"],
159 defaults: ["foo_defaults_a"],
160 },
161 soc_b: {
162 cflags: ["-DSOC_B"],
163 defaults: ["foo_defaults_b"],
164 },
Liz Kammer432bd592020-12-16 12:42:02 -0800165 soc_c: {},
Liz Kammerdbd48092020-09-21 22:24:17 +0000166 },
167 size: {
168 cflags: ["-DSIZE=%s"],
169 },
170 feature1: {
171 cflags: ["-DFEATURE1"],
172 },
173 feature2: {
174 cflags: ["-DFEATURE2"],
175 },
176 FEATURE3: {
177 cflags: ["-DFEATURE3"],
178 },
179 },
180 }
Colin Cross9d34f352019-11-22 16:03:51 -0800181 `
182
Paul Duffin791302b2021-03-16 22:45:14 +0000183 fixtureForVendorVars := func(vars map[string]map[string]string) FixturePreparer {
184 return FixtureModifyProductVariables(func(variables FixtureProductVariables) {
185 variables.VendorVars = vars
186 })
187 }
188
189 run := func(t *testing.T, bp string, fs MockFS) {
Liz Kammer432bd592020-12-16 12:42:02 -0800190 testCases := []struct {
191 name string
Paul Duffin791302b2021-03-16 22:45:14 +0000192 preparer FixturePreparer
Liz Kammer432bd592020-12-16 12:42:02 -0800193 fooExpectedFlags []string
194 fooDefaultsExpectedFlags []string
195 }{
196 {
197 name: "withValues",
Paul Duffin791302b2021-03-16 22:45:14 +0000198 preparer: fixtureForVendorVars(map[string]map[string]string{
199 "acme": {
Liz Kammer432bd592020-12-16 12:42:02 -0800200 "board": "soc_a",
201 "size": "42",
202 "feature1": "true",
203 "feature2": "false",
204 // FEATURE3 unset
205 "unused_feature": "true", // unused
206 "unused_size": "1", // unused
207 "unused_string_var": "a", // unused
208 },
209 }),
210 fooExpectedFlags: []string{
211 "DEFAULT",
212 "-DGENERIC",
213 "-DF2_CONDITIONS_DEFAULT",
214 "-DSIZE=42",
215 "-DSOC_A",
216 "-DFEATURE1",
217 },
218 fooDefaultsExpectedFlags: []string{
219 "DEFAULT_A",
220 "DEFAULT",
221 "-DGENERIC",
222 "-DSIZE=42",
223 "-DSOC_A",
224 "-DFEATURE1",
225 },
226 },
227 {
228 name: "empty_prop_for_string_var",
Paul Duffin791302b2021-03-16 22:45:14 +0000229 preparer: fixtureForVendorVars(map[string]map[string]string{
230 "acme": {"board": "soc_c"}}),
Liz Kammer432bd592020-12-16 12:42:02 -0800231 fooExpectedFlags: []string{
232 "DEFAULT",
233 "-DGENERIC",
234 "-DF2_CONDITIONS_DEFAULT",
235 "-DSIZE=CONDITIONS_DEFAULT",
236 "-DF1_CONDITIONS_DEFAULT",
237 },
238 fooDefaultsExpectedFlags: []string{
239 "DEFAULT",
240 "-DGENERIC",
241 },
242 },
243 {
244 name: "unused_string_var",
Paul Duffin791302b2021-03-16 22:45:14 +0000245 preparer: fixtureForVendorVars(map[string]map[string]string{
246 "acme": {"board": "soc_d"}}),
Liz Kammer432bd592020-12-16 12:42:02 -0800247 fooExpectedFlags: []string{
248 "DEFAULT",
249 "-DGENERIC",
250 "-DF2_CONDITIONS_DEFAULT",
251 "-DSIZE=CONDITIONS_DEFAULT",
252 "-DSOC_CONDITIONS_DEFAULT", // foo does not contain a prop "soc_d", so we use the default
253 "-DF1_CONDITIONS_DEFAULT",
254 },
255 fooDefaultsExpectedFlags: []string{
256 "DEFAULT",
257 "-DGENERIC",
258 },
259 },
Colin Cross9d34f352019-11-22 16:03:51 -0800260
Liz Kammer432bd592020-12-16 12:42:02 -0800261 {
Paul Duffin791302b2021-03-16 22:45:14 +0000262 name: "conditions_default",
263 preparer: fixtureForVendorVars(map[string]map[string]string{}),
Liz Kammer432bd592020-12-16 12:42:02 -0800264 fooExpectedFlags: []string{
265 "DEFAULT",
266 "-DGENERIC",
267 "-DF2_CONDITIONS_DEFAULT",
268 "-DSIZE=CONDITIONS_DEFAULT",
269 "-DSOC_CONDITIONS_DEFAULT",
270 "-DF1_CONDITIONS_DEFAULT",
271 },
272 fooDefaultsExpectedFlags: []string{
273 "DEFAULT",
274 "-DGENERIC",
275 },
Colin Cross9d34f352019-11-22 16:03:51 -0800276 },
277 }
278
Liz Kammer432bd592020-12-16 12:42:02 -0800279 for _, tc := range testCases {
Paul Duffin791302b2021-03-16 22:45:14 +0000280 t.Run(tc.name, func(t *testing.T) {
281 result := emptyTestFixtureFactory.RunTest(t,
282 tc.preparer,
283 PrepareForTestWithDefaults,
284 FixtureRegisterWithContext(func(ctx RegistrationContext) {
285 ctx.RegisterModuleType("soong_config_module_type_import", soongConfigModuleTypeImportFactory)
286 ctx.RegisterModuleType("soong_config_module_type", soongConfigModuleTypeFactory)
287 ctx.RegisterModuleType("soong_config_string_variable", soongConfigStringVariableDummyFactory)
288 ctx.RegisterModuleType("soong_config_bool_variable", soongConfigBoolVariableDummyFactory)
289 ctx.RegisterModuleType("test_defaults", soongConfigTestDefaultsModuleFactory)
290 ctx.RegisterModuleType("test", soongConfigTestModuleFactory)
291 }),
292 fs.AddToFixture(),
293 FixtureWithRootAndroidBp(bp),
294 )
Colin Cross9d34f352019-11-22 16:03:51 -0800295
Paul Duffin791302b2021-03-16 22:45:14 +0000296 foo := result.ModuleForTests("foo", "").Module().(*soongConfigTestModule)
297 AssertDeepEquals(t, "foo cflags", tc.fooExpectedFlags, foo.props.Cflags)
Colin Cross9d34f352019-11-22 16:03:51 -0800298
Paul Duffin791302b2021-03-16 22:45:14 +0000299 fooDefaults := result.ModuleForTests("foo_with_defaults", "").Module().(*soongConfigTestModule)
300 AssertDeepEquals(t, "foo_with_defaults cflags", tc.fooDefaultsExpectedFlags, fooDefaults.props.Cflags)
301 })
Liz Kammerdbd48092020-09-21 22:24:17 +0000302 }
Colin Cross9d34f352019-11-22 16:03:51 -0800303 }
304
305 t.Run("single file", func(t *testing.T) {
306 run(t, configBp+bp, nil)
307 })
308
309 t.Run("import", func(t *testing.T) {
310 run(t, importBp+bp, map[string][]byte{
311 "SoongConfig.bp": []byte(configBp),
312 })
313 })
314}
Liz Kammer432bd592020-12-16 12:42:02 -0800315
316func testConfigWithVendorVars(buildDir, bp string, fs map[string][]byte, vendorVars map[string]map[string]string) Config {
317 config := TestConfig(buildDir, nil, bp, fs)
318
319 config.TestProductVariables.VendorVars = vendorVars
320
321 return config
322}