blob: 7b89848100ba7a53b2947f95f6e70cd892119139 [file] [log] [blame]
Colin Cross72bb3632017-07-13 16:23:21 -07001// Copyright 2017 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 java
16
17import (
Paul Duffin1a393322020-11-18 16:36:47 +000018 "fmt"
Colin Cross72bb3632017-07-13 16:23:21 -070019 "io/ioutil"
20 "os"
21 "path/filepath"
Colin Crossc0806172019-06-14 18:51:47 -070022 "reflect"
Paul Duffindaaa3322020-05-26 18:13:57 +010023 "regexp"
Nan Zhang61eaedb2017-11-02 13:28:15 -070024 "strconv"
Colin Cross72bb3632017-07-13 16:23:21 -070025 "strings"
26 "testing"
Colin Cross86a60ae2018-05-29 14:44:55 -070027
Jeongik Cha28df2572019-11-11 10:46:36 +090028 "github.com/google/blueprint/proptools"
29
Colin Crossa4f08812018-10-02 22:03:40 -070030 "android/soong/android"
31 "android/soong/cc"
Colin Crossc28bb0b2019-02-25 14:20:47 -080032 "android/soong/dexpreopt"
Liz Kammerdd849a82020-06-12 16:38:45 -070033 "android/soong/python"
Colin Cross72bb3632017-07-13 16:23:21 -070034)
35
36var buildDir string
37
38func setUp() {
39 var err error
40 buildDir, err = ioutil.TempDir("", "soong_java_test")
41 if err != nil {
42 panic(err)
43 }
44}
45
46func tearDown() {
47 os.RemoveAll(buildDir)
48}
49
50func TestMain(m *testing.M) {
51 run := func() int {
52 setUp()
53 defer tearDown()
54
55 return m.Run()
56 }
57
58 os.Exit(run())
59}
Colin Cross527012a2017-11-30 22:56:16 -080060
Colin Cross98be1bb2019-12-13 20:41:13 -080061func testConfig(env map[string]string, bp string, fs map[string][]byte) android.Config {
Martin Stjernholmd90676f2020-01-11 00:37:30 +000062 bp += dexpreopt.BpToolModulesForTest()
63
Paul Duffin9f045242021-01-21 15:05:11 +000064 return TestConfig(buildDir, env, bp, fs)
Colin Cross1369cdb2017-09-29 17:58:17 -070065}
66
Colin Crossae8600b2020-10-29 17:09:13 -070067func testContext(config android.Config) *android.TestContext {
Colin Cross72bb3632017-07-13 16:23:21 -070068
Colin Crossae8600b2020-10-29 17:09:13 -070069 ctx := android.NewTestArchContext(config)
Paul Duffinc059c8c2021-01-20 17:13:52 +000070 RegisterRequiredBuildComponentsForTest(ctx)
Colin Cross4b49b762019-11-22 15:25:03 -080071 ctx.RegisterModuleType("java_plugin", PluginFactory)
Colin Cross4b49b762019-11-22 15:25:03 -080072 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Liz Kammerdd849a82020-06-12 16:38:45 -070073 ctx.RegisterModuleType("python_binary_host", python.PythonBinaryHostFactory)
Colin Cross89536d42017-07-07 14:35:50 -070074 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin44f1d842020-06-26 20:17:02 +010075 ctx.PreArchMutators(android.RegisterComponentsMutator)
Paul Duffina48f7582019-12-19 11:25:19 +000076
Liz Kammerdd849a82020-06-12 16:38:45 -070077 ctx.PreDepsMutators(python.RegisterPythonPreDepsMutators)
Jaewoong Jungb639a6a2019-05-10 15:16:29 -070078 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
Colin Cross06fa5882020-10-29 18:21:38 -070079 ctx.RegisterPreSingletonType("overlay", android.SingletonFactoryAdaptor(ctx.Context, OverlaySingletonFactory))
80 ctx.RegisterPreSingletonType("sdk_versions", android.SingletonFactoryAdaptor(ctx.Context, sdkPreSingletonFactory))
Colin Crossa4f08812018-10-02 22:03:40 -070081
Paul Duffin021f4e52020-07-30 16:04:17 +010082 android.RegisterPrebuiltMutators(ctx)
83
Colin Crossa4f08812018-10-02 22:03:40 -070084 // Register module types and mutators from cc needed for JNI testing
Paul Duffin77980a82019-12-19 16:01:36 +000085 cc.RegisterRequiredBuildComponentsForTest(ctx)
Colin Crossa4f08812018-10-02 22:03:40 -070086
Martin Stjernholmd90676f2020-01-11 00:37:30 +000087 dexpreopt.RegisterToolModulesForTest(ctx)
88
Jaewoong Jungc779cd42020-10-06 18:56:10 -070089 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
90 ctx.TopDown("propagate_rro_enforcement", propagateRROEnforcementMutator).Parallel()
91 })
92
Colin Cross527012a2017-11-30 22:56:16 -080093 return ctx
94}
95
96func run(t *testing.T, ctx *android.TestContext, config android.Config) {
Colin Cross6b4a32d2017-12-05 13:42:45 -080097 t.Helper()
Colin Crossc28bb0b2019-02-25 14:20:47 -080098
Colin Cross98be1bb2019-12-13 20:41:13 -080099 pathCtx := android.PathContextForTesting(config)
Martin Stjernholm40f9f3c2020-01-20 18:12:23 +0000100 dexpreopt.SetTestGlobalConfig(config, dexpreopt.GlobalConfigForTests(pathCtx))
Colin Crossc28bb0b2019-02-25 14:20:47 -0800101
Colin Crossae8600b2020-10-29 17:09:13 -0700102 ctx.Register()
Paul Duffinbaccf7e2019-06-11 11:58:30 +0100103 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
Logan Chien42039712018-03-12 16:29:17 +0800104 android.FailIfErrored(t, errs)
Colin Cross72bb3632017-07-13 16:23:21 -0700105 _, errs = ctx.PrepareBuildActions(config)
Logan Chien42039712018-03-12 16:29:17 +0800106 android.FailIfErrored(t, errs)
Colin Cross527012a2017-11-30 22:56:16 -0800107}
108
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900109func testJavaError(t *testing.T, pattern string, bp string) (*android.TestContext, android.Config) {
Jeongik Cha538c0d02019-07-11 15:54:27 +0900110 t.Helper()
Colin Cross98be1bb2019-12-13 20:41:13 -0800111 return testJavaErrorWithConfig(t, pattern, testConfig(nil, bp, nil))
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900112}
113
Colin Cross98be1bb2019-12-13 20:41:13 -0800114func testJavaErrorWithConfig(t *testing.T, pattern string, config android.Config) (*android.TestContext, android.Config) {
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900115 t.Helper()
Colin Crossae8600b2020-10-29 17:09:13 -0700116 ctx := testContext(config)
Jeongik Cha538c0d02019-07-11 15:54:27 +0900117
Colin Cross98be1bb2019-12-13 20:41:13 -0800118 pathCtx := android.PathContextForTesting(config)
Martin Stjernholm40f9f3c2020-01-20 18:12:23 +0000119 dexpreopt.SetTestGlobalConfig(config, dexpreopt.GlobalConfigForTests(pathCtx))
Jeongik Cha538c0d02019-07-11 15:54:27 +0900120
Colin Crossae8600b2020-10-29 17:09:13 -0700121 ctx.Register()
Jeongik Cha538c0d02019-07-11 15:54:27 +0900122 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
123 if len(errs) > 0 {
124 android.FailIfNoMatchingErrors(t, pattern, errs)
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900125 return ctx, config
Jeongik Cha538c0d02019-07-11 15:54:27 +0900126 }
127 _, errs = ctx.PrepareBuildActions(config)
128 if len(errs) > 0 {
129 android.FailIfNoMatchingErrors(t, pattern, errs)
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900130 return ctx, config
Jeongik Cha538c0d02019-07-11 15:54:27 +0900131 }
132
133 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900134
135 return ctx, config
Jeongik Cha538c0d02019-07-11 15:54:27 +0900136}
137
Colin Cross238c1f32020-06-07 16:58:18 -0700138func testJavaWithFS(t *testing.T, bp string, fs map[string][]byte) (*android.TestContext, android.Config) {
139 t.Helper()
140 return testJavaWithConfig(t, testConfig(nil, bp, fs))
141}
142
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700143func testJava(t *testing.T, bp string) (*android.TestContext, android.Config) {
Colin Cross6b4a32d2017-12-05 13:42:45 -0800144 t.Helper()
Colin Cross238c1f32020-06-07 16:58:18 -0700145 return testJavaWithFS(t, bp, nil)
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900146}
147
Colin Cross98be1bb2019-12-13 20:41:13 -0800148func testJavaWithConfig(t *testing.T, config android.Config) (*android.TestContext, android.Config) {
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900149 t.Helper()
Colin Crossae8600b2020-10-29 17:09:13 -0700150 ctx := testContext(config)
Colin Cross527012a2017-11-30 22:56:16 -0800151 run(t, ctx, config)
Colin Cross72bb3632017-07-13 16:23:21 -0700152
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700153 return ctx, config
Colin Cross72bb3632017-07-13 16:23:21 -0700154}
155
Colin Cross2acdae82017-09-15 19:44:24 -0700156func moduleToPath(name string) string {
157 switch {
158 case name == `""`:
159 return name
Colin Crossfc3674a2017-09-18 17:41:52 -0700160 case strings.HasSuffix(name, ".jar"):
161 return name
Nan Zhanged19fc32017-10-19 13:06:22 -0700162 default:
163 return filepath.Join(buildDir, ".intermediates", name, "android_common", "turbine-combined", name+".jar")
Colin Cross2acdae82017-09-15 19:44:24 -0700164 }
165}
166
Jeongik Chae403e9e2019-12-07 00:16:24 +0900167func TestJavaLinkType(t *testing.T) {
168 testJava(t, `
169 java_library {
170 name: "foo",
171 srcs: ["a.java"],
172 libs: ["bar"],
173 static_libs: ["baz"],
174 }
175
176 java_library {
177 name: "bar",
178 sdk_version: "current",
179 srcs: ["b.java"],
180 }
181
182 java_library {
183 name: "baz",
184 sdk_version: "system_current",
185 srcs: ["c.java"],
186 }
187 `)
188
Steven Moreland00298982020-11-17 21:44:36 +0000189 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900190 java_library {
191 name: "foo",
192 srcs: ["a.java"],
193 libs: ["bar"],
194 sdk_version: "current",
195 static_libs: ["baz"],
196 }
197
198 java_library {
199 name: "bar",
200 sdk_version: "current",
201 srcs: ["b.java"],
202 }
203
204 java_library {
205 name: "baz",
206 sdk_version: "system_current",
207 srcs: ["c.java"],
208 }
209 `)
210
211 testJava(t, `
212 java_library {
213 name: "foo",
214 srcs: ["a.java"],
215 libs: ["bar"],
216 sdk_version: "system_current",
217 static_libs: ["baz"],
218 }
219
220 java_library {
221 name: "bar",
222 sdk_version: "current",
223 srcs: ["b.java"],
224 }
225
226 java_library {
227 name: "baz",
228 sdk_version: "system_current",
229 srcs: ["c.java"],
230 }
231 `)
232
Steven Moreland00298982020-11-17 21:44:36 +0000233 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900234 java_library {
235 name: "foo",
236 srcs: ["a.java"],
237 libs: ["bar"],
238 sdk_version: "system_current",
239 static_libs: ["baz"],
240 }
241
242 java_library {
243 name: "bar",
244 sdk_version: "current",
245 srcs: ["b.java"],
246 }
247
248 java_library {
249 name: "baz",
250 srcs: ["c.java"],
251 }
252 `)
253}
254
Colin Cross72bb3632017-07-13 16:23:21 -0700255func TestSimple(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700256 ctx, _ := testJava(t, `
Colin Cross72bb3632017-07-13 16:23:21 -0700257 java_library {
258 name: "foo",
259 srcs: ["a.java"],
Colin Crosse8dc34a2017-07-19 11:22:16 -0700260 libs: ["bar"],
261 static_libs: ["baz"],
Colin Cross72bb3632017-07-13 16:23:21 -0700262 }
263
264 java_library {
265 name: "bar",
266 srcs: ["b.java"],
267 }
268
269 java_library {
270 name: "baz",
271 srcs: ["c.java"],
272 }
Colin Crossd5934c82017-10-02 13:55:26 -0700273 `)
Colin Cross72bb3632017-07-13 16:23:21 -0700274
Colin Cross4c428df2017-09-15 17:36:05 -0700275 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
Nan Zhanged19fc32017-10-19 13:06:22 -0700276 combineJar := ctx.ModuleForTests("foo", "android_common").Description("for javac")
Colin Cross72bb3632017-07-13 16:23:21 -0700277
278 if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "a.java" {
279 t.Errorf(`foo inputs %v != ["a.java"]`, javac.Inputs)
280 }
281
Colin Cross1ee23172017-10-18 14:44:18 -0700282 baz := ctx.ModuleForTests("baz", "android_common").Rule("javac").Output.String()
Nan Zhanged19fc32017-10-19 13:06:22 -0700283 barTurbine := filepath.Join(buildDir, ".intermediates", "bar", "android_common", "turbine-combined", "bar.jar")
284 bazTurbine := filepath.Join(buildDir, ".intermediates", "baz", "android_common", "turbine-combined", "baz.jar")
Colin Cross0a6e0072017-08-30 14:24:55 -0700285
Nan Zhanged19fc32017-10-19 13:06:22 -0700286 if !strings.Contains(javac.Args["classpath"], barTurbine) {
287 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
Colin Cross72bb3632017-07-13 16:23:21 -0700288 }
289
Nan Zhanged19fc32017-10-19 13:06:22 -0700290 if !strings.Contains(javac.Args["classpath"], bazTurbine) {
291 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], bazTurbine)
Colin Cross0a6e0072017-08-30 14:24:55 -0700292 }
293
294 if len(combineJar.Inputs) != 2 || combineJar.Inputs[1].String() != baz {
295 t.Errorf("foo combineJar inputs %v does not contain %q", combineJar.Inputs, baz)
Colin Cross72bb3632017-07-13 16:23:21 -0700296 }
297}
298
Artur Satayev9cf46692019-11-26 18:08:34 +0000299func TestExportedPlugins(t *testing.T) {
300 type Result struct {
Colin Crossc9fe10f2020-11-19 18:06:03 -0800301 library string
302 processors string
303 disableTurbine bool
Artur Satayev9cf46692019-11-26 18:08:34 +0000304 }
305 var tests = []struct {
306 name string
307 extra string
308 results []Result
309 }{
310 {
311 name: "Exported plugin is not a direct plugin",
312 extra: `java_library { name: "exports", srcs: ["a.java"], exported_plugins: ["plugin"] }`,
313 results: []Result{{library: "exports", processors: "-proc:none"}},
314 },
315 {
316 name: "Exports plugin to dependee",
317 extra: `
318 java_library{name: "exports", exported_plugins: ["plugin"]}
319 java_library{name: "foo", srcs: ["a.java"], libs: ["exports"]}
320 java_library{name: "bar", srcs: ["a.java"], static_libs: ["exports"]}
321 `,
322 results: []Result{
323 {library: "foo", processors: "-processor com.android.TestPlugin"},
324 {library: "bar", processors: "-processor com.android.TestPlugin"},
325 },
326 },
327 {
328 name: "Exports plugin to android_library",
329 extra: `
330 java_library{name: "exports", exported_plugins: ["plugin"]}
331 android_library{name: "foo", srcs: ["a.java"], libs: ["exports"]}
332 android_library{name: "bar", srcs: ["a.java"], static_libs: ["exports"]}
333 `,
334 results: []Result{
335 {library: "foo", processors: "-processor com.android.TestPlugin"},
336 {library: "bar", processors: "-processor com.android.TestPlugin"},
337 },
338 },
339 {
340 name: "Exports plugin is not propagated via transitive deps",
341 extra: `
342 java_library{name: "exports", exported_plugins: ["plugin"]}
343 java_library{name: "foo", srcs: ["a.java"], libs: ["exports"]}
344 java_library{name: "bar", srcs: ["a.java"], static_libs: ["foo"]}
345 `,
346 results: []Result{
347 {library: "foo", processors: "-processor com.android.TestPlugin"},
348 {library: "bar", processors: "-proc:none"},
349 },
350 },
351 {
352 name: "Exports plugin appends to plugins",
353 extra: `
354 java_plugin{name: "plugin2", processor_class: "com.android.TestPlugin2"}
355 java_library{name: "exports", exported_plugins: ["plugin"]}
356 java_library{name: "foo", srcs: ["a.java"], libs: ["exports"], plugins: ["plugin2"]}
357 `,
358 results: []Result{
359 {library: "foo", processors: "-processor com.android.TestPlugin,com.android.TestPlugin2"},
360 },
361 },
Colin Crossc9fe10f2020-11-19 18:06:03 -0800362 {
363 name: "Exports plugin to with generates_api to dependee",
364 extra: `
365 java_library{name: "exports", exported_plugins: ["plugin_generates_api"]}
366 java_library{name: "foo", srcs: ["a.java"], libs: ["exports"]}
367 java_library{name: "bar", srcs: ["a.java"], static_libs: ["exports"]}
368 `,
369 results: []Result{
370 {library: "foo", processors: "-processor com.android.TestPlugin", disableTurbine: true},
371 {library: "bar", processors: "-processor com.android.TestPlugin", disableTurbine: true},
372 },
373 },
Artur Satayev9cf46692019-11-26 18:08:34 +0000374 }
375
376 for _, test := range tests {
377 t.Run(test.name, func(t *testing.T) {
378 ctx, _ := testJava(t, `
379 java_plugin {
380 name: "plugin",
381 processor_class: "com.android.TestPlugin",
382 }
Colin Crossc9fe10f2020-11-19 18:06:03 -0800383 java_plugin {
384 name: "plugin_generates_api",
385 generates_api: true,
386 processor_class: "com.android.TestPlugin",
387 }
Artur Satayev9cf46692019-11-26 18:08:34 +0000388 `+test.extra)
389
390 for _, want := range test.results {
391 javac := ctx.ModuleForTests(want.library, "android_common").Rule("javac")
392 if javac.Args["processor"] != want.processors {
393 t.Errorf("For library %v, expected %v, found %v", want.library, want.processors, javac.Args["processor"])
394 }
Colin Crossc9fe10f2020-11-19 18:06:03 -0800395 turbine := ctx.ModuleForTests(want.library, "android_common").MaybeRule("turbine")
396 disableTurbine := turbine.BuildParams.Rule == nil
397 if disableTurbine != want.disableTurbine {
398 t.Errorf("For library %v, expected disableTurbine %v, found %v", want.library, want.disableTurbine, disableTurbine)
399 }
Artur Satayev9cf46692019-11-26 18:08:34 +0000400 }
401 })
402 }
403}
404
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900405func TestSdkVersionByPartition(t *testing.T) {
406 testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
Jeongik Cha6bd33c12019-06-25 16:26:18 +0900407 java_library {
408 name: "foo",
409 srcs: ["a.java"],
410 vendor: true,
411 }
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900412 `)
Jeongik Cha6bd33c12019-06-25 16:26:18 +0900413
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900414 testJava(t, `
Jeongik Cha6bd33c12019-06-25 16:26:18 +0900415 java_library {
416 name: "bar",
417 srcs: ["b.java"],
418 }
419 `)
420
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900421 for _, enforce := range []bool{true, false} {
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900422 bp := `
423 java_library {
424 name: "foo",
425 srcs: ["a.java"],
426 product_specific: true,
427 }
428 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800429
430 config := testConfig(nil, bp, nil)
431 config.TestProductVariables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900432 if enforce {
Colin Cross98be1bb2019-12-13 20:41:13 -0800433 testJavaErrorWithConfig(t, "sdk_version must have a value when the module is located at vendor or product", config)
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900434 } else {
Colin Cross98be1bb2019-12-13 20:41:13 -0800435 testJavaWithConfig(t, config)
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900436 }
Jeongik Cha6bd33c12019-06-25 16:26:18 +0900437 }
438}
439
Colin Crossd5934c82017-10-02 13:55:26 -0700440func TestArchSpecific(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700441 ctx, _ := testJava(t, `
Colin Crossd5934c82017-10-02 13:55:26 -0700442 java_library {
443 name: "foo",
444 srcs: ["a.java"],
445 target: {
446 android: {
447 srcs: ["b.java"],
448 },
449 },
450 }
451 `)
452
453 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
454 if len(javac.Inputs) != 2 || javac.Inputs[0].String() != "a.java" || javac.Inputs[1].String() != "b.java" {
455 t.Errorf(`foo inputs %v != ["a.java", "b.java"]`, javac.Inputs)
456 }
457}
458
Colin Cross6b4a32d2017-12-05 13:42:45 -0800459func TestBinary(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700460 ctx, _ := testJava(t, `
Colin Cross6b4a32d2017-12-05 13:42:45 -0800461 java_library_host {
462 name: "foo",
463 srcs: ["a.java"],
464 }
465
466 java_binary_host {
467 name: "bar",
468 srcs: ["b.java"],
469 static_libs: ["foo"],
Colin Cross89226d92020-10-09 19:00:54 -0700470 jni_libs: ["libjni"],
471 }
472
473 cc_library_shared {
474 name: "libjni",
475 host_supported: true,
476 device_supported: false,
477 stl: "none",
Colin Cross6b4a32d2017-12-05 13:42:45 -0800478 }
479 `)
480
481 buildOS := android.BuildOs.String()
482
483 bar := ctx.ModuleForTests("bar", buildOS+"_common")
484 barJar := bar.Output("bar.jar").Output.String()
485 barWrapper := ctx.ModuleForTests("bar", buildOS+"_x86_64")
486 barWrapperDeps := barWrapper.Output("bar").Implicits.Strings()
487
Colin Cross89226d92020-10-09 19:00:54 -0700488 libjni := ctx.ModuleForTests("libjni", buildOS+"_x86_64_shared")
489 libjniSO := libjni.Rule("Cp").Output.String()
490
Colin Cross6b4a32d2017-12-05 13:42:45 -0800491 // Test that the install binary wrapper depends on the installed jar file
Colin Crossc179ea62020-10-09 10:54:15 -0700492 if g, w := barWrapperDeps, barJar; !android.InList(w, g) {
493 t.Errorf("expected binary wrapper implicits to contain %q, got %q", w, g)
Colin Cross6b4a32d2017-12-05 13:42:45 -0800494 }
Colin Cross89226d92020-10-09 19:00:54 -0700495
496 // Test that the install binary wrapper depends on the installed JNI libraries
497 if g, w := barWrapperDeps, libjniSO; !android.InList(w, g) {
498 t.Errorf("expected binary wrapper implicits to contain %q, got %q", w, g)
Colin Cross6b4a32d2017-12-05 13:42:45 -0800499 }
Alex Humesky2070e322020-06-09 20:23:08 -0400500}
Colin Cross6b4a32d2017-12-05 13:42:45 -0800501
Alex Humesky2070e322020-06-09 20:23:08 -0400502func TestHostBinaryNoJavaDebugInfoOverride(t *testing.T) {
503 bp := `
504 java_library {
505 name: "target_library",
506 srcs: ["a.java"],
507 }
508
509 java_binary_host {
510 name: "host_binary",
511 srcs: ["b.java"],
512 }
513 `
514 config := testConfig(nil, bp, nil)
515 config.TestProductVariables.MinimizeJavaDebugInfo = proptools.BoolPtr(true)
516
517 ctx, _ := testJavaWithConfig(t, config)
518
Liz Kammer7941b302020-07-28 13:27:34 -0700519 // first, check that the -g flag is added to target modules
Alex Humesky2070e322020-06-09 20:23:08 -0400520 targetLibrary := ctx.ModuleForTests("target_library", "android_common")
521 targetJavaFlags := targetLibrary.Module().VariablesForTests()["javacFlags"]
522 if !strings.Contains(targetJavaFlags, "-g:source,lines") {
523 t.Errorf("target library javac flags %v should contain "+
524 "-g:source,lines override with MinimizeJavaDebugInfo", targetJavaFlags)
525 }
526
527 // check that -g is not overridden for host modules
528 buildOS := android.BuildOs.String()
529 hostBinary := ctx.ModuleForTests("host_binary", buildOS+"_common")
530 hostJavaFlags := hostBinary.Module().VariablesForTests()["javacFlags"]
531 if strings.Contains(hostJavaFlags, "-g:source,lines") {
532 t.Errorf("java_binary_host javac flags %v should not have "+
533 "-g:source,lines override with MinimizeJavaDebugInfo", hostJavaFlags)
534 }
Colin Cross6b4a32d2017-12-05 13:42:45 -0800535}
536
Colin Cross72bb3632017-07-13 16:23:21 -0700537func TestPrebuilts(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700538 ctx, _ := testJava(t, `
Colin Cross72bb3632017-07-13 16:23:21 -0700539 java_library {
540 name: "foo",
Paul Duffin91547182019-11-12 19:39:36 +0000541 srcs: ["a.java", ":stubs-source"],
Paul Duffinfcfd7912020-01-31 17:54:30 +0000542 libs: ["bar", "sdklib"],
Colin Crosse8dc34a2017-07-19 11:22:16 -0700543 static_libs: ["baz"],
Colin Cross72bb3632017-07-13 16:23:21 -0700544 }
545
Colin Cross74d73e22017-08-02 11:05:49 -0700546 java_import {
Colin Cross72bb3632017-07-13 16:23:21 -0700547 name: "bar",
Colin Cross74d73e22017-08-02 11:05:49 -0700548 jars: ["a.jar"],
Colin Cross72bb3632017-07-13 16:23:21 -0700549 }
550
Colin Cross74d73e22017-08-02 11:05:49 -0700551 java_import {
Colin Cross72bb3632017-07-13 16:23:21 -0700552 name: "baz",
Colin Cross74d73e22017-08-02 11:05:49 -0700553 jars: ["b.jar"],
Liz Kammerd6c31d22020-08-05 15:40:41 -0700554 sdk_version: "current",
555 compile_dex: true,
Colin Cross72bb3632017-07-13 16:23:21 -0700556 }
Colin Cross42be7612019-02-21 18:12:14 -0800557
558 dex_import {
559 name: "qux",
560 jars: ["b.jar"],
561 }
Colin Cross79c7c262019-04-17 11:11:46 -0700562
563 java_sdk_library_import {
Paul Duffin56d44902020-01-31 13:36:25 +0000564 name: "sdklib",
565 public: {
566 jars: ["c.jar"],
567 },
568 }
569
Paul Duffin91547182019-11-12 19:39:36 +0000570 prebuilt_stubs_sources {
571 name: "stubs-source",
Paul Duffin9b478b02019-12-10 13:41:51 +0000572 srcs: ["stubs/sources"],
Paul Duffin91547182019-11-12 19:39:36 +0000573 }
Paul Duffin1b82e6a2019-12-03 18:06:47 +0000574
575 java_test_import {
576 name: "test",
577 jars: ["a.jar"],
578 test_suites: ["cts"],
579 test_config: "AndroidTest.xml",
580 }
Colin Cross72bb3632017-07-13 16:23:21 -0700581 `)
582
Paul Duffin9b478b02019-12-10 13:41:51 +0000583 fooModule := ctx.ModuleForTests("foo", "android_common")
584 javac := fooModule.Rule("javac")
Nan Zhanged19fc32017-10-19 13:06:22 -0700585 combineJar := ctx.ModuleForTests("foo", "android_common").Description("for javac")
Liz Kammerd6c31d22020-08-05 15:40:41 -0700586 barModule := ctx.ModuleForTests("bar", "android_common")
587 barJar := barModule.Rule("combineJar").Output
588 bazModule := ctx.ModuleForTests("baz", "android_common")
589 bazJar := bazModule.Rule("combineJar").Output
Colin Cross79c7c262019-04-17 11:11:46 -0700590 sdklibStubsJar := ctx.ModuleForTests("sdklib.stubs", "android_common").Rule("combineJar").Output
Colin Cross72bb3632017-07-13 16:23:21 -0700591
Paul Duffin9b478b02019-12-10 13:41:51 +0000592 fooLibrary := fooModule.Module().(*Library)
593 assertDeepEquals(t, "foo java sources incorrect",
594 []string{"a.java"}, fooLibrary.compiledJavaSrcs.Strings())
Paul Duffin91547182019-11-12 19:39:36 +0000595
Paul Duffin9b478b02019-12-10 13:41:51 +0000596 assertDeepEquals(t, "foo java source jars incorrect",
597 []string{".intermediates/stubs-source/android_common/stubs-source-stubs.srcjar"},
598 android.NormalizePathsForTesting(fooLibrary.compiledSrcJars))
Paul Duffin91547182019-11-12 19:39:36 +0000599
Colin Cross37f6d792018-07-12 12:28:41 -0700600 if !strings.Contains(javac.Args["classpath"], barJar.String()) {
601 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], barJar.String())
Colin Cross72bb3632017-07-13 16:23:21 -0700602 }
603
Liz Kammerd6c31d22020-08-05 15:40:41 -0700604 barDexJar := barModule.Module().(*Import).DexJarBuildPath()
605 if barDexJar != nil {
606 t.Errorf("bar dex jar build path expected to be nil, got %q", barDexJar)
607 }
608
Colin Cross79c7c262019-04-17 11:11:46 -0700609 if !strings.Contains(javac.Args["classpath"], sdklibStubsJar.String()) {
610 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], sdklibStubsJar.String())
611 }
612
Colin Cross37f6d792018-07-12 12:28:41 -0700613 if len(combineJar.Inputs) != 2 || combineJar.Inputs[1].String() != bazJar.String() {
614 t.Errorf("foo combineJar inputs %v does not contain %q", combineJar.Inputs, bazJar.String())
Colin Cross72bb3632017-07-13 16:23:21 -0700615 }
Colin Cross42be7612019-02-21 18:12:14 -0800616
Liz Kammerd6c31d22020-08-05 15:40:41 -0700617 bazDexJar := bazModule.Module().(*Import).DexJarBuildPath().String()
618 expectedDexJar := buildDir + "/.intermediates/baz/android_common/dex/baz.jar"
619 if bazDexJar != expectedDexJar {
620 t.Errorf("baz dex jar build path expected %q, got %q", expectedDexJar, bazDexJar)
621 }
622
Colin Cross42be7612019-02-21 18:12:14 -0800623 ctx.ModuleForTests("qux", "android_common").Rule("Cp")
Colin Cross72bb3632017-07-13 16:23:21 -0700624}
625
Paul Duffin9b478b02019-12-10 13:41:51 +0000626func assertDeepEquals(t *testing.T, message string, expected interface{}, actual interface{}) {
627 if !reflect.DeepEqual(expected, actual) {
628 t.Errorf("%s: expected %q, found %q", message, expected, actual)
629 }
630}
631
Paul Duffin1a393322020-11-18 16:36:47 +0000632func TestPrebuiltStubsSources(t *testing.T) {
633 test := func(t *testing.T, sourcesPath string, expectedInputs []string) {
634 ctx, _ := testJavaWithFS(t, fmt.Sprintf(`
635prebuilt_stubs_sources {
636 name: "stubs-source",
637 srcs: ["%s"],
638}`, sourcesPath), map[string][]byte{
639 "stubs/sources/pkg/A.java": nil,
640 "stubs/sources/pkg/B.java": nil,
641 })
642
643 zipSrc := ctx.ModuleForTests("stubs-source", "android_common").Rule("zip_src")
644 if expected, actual := expectedInputs, zipSrc.Inputs.Strings(); !reflect.DeepEqual(expected, actual) {
645 t.Errorf("mismatch of inputs to soong_zip: expected %q, actual %q", expected, actual)
646 }
647 }
648
649 t.Run("empty/missing directory", func(t *testing.T) {
650 test(t, "empty-directory", []string{})
651 })
652
653 t.Run("non-empty set of sources", func(t *testing.T) {
654 test(t, "stubs/sources", []string{
655 "stubs/sources/pkg/A.java",
656 "stubs/sources/pkg/B.java",
657 })
658 })
659}
660
Paul Duffin56d44902020-01-31 13:36:25 +0000661func TestJavaSdkLibraryImport(t *testing.T) {
662 ctx, _ := testJava(t, `
663 java_library {
664 name: "foo",
665 srcs: ["a.java"],
666 libs: ["sdklib"],
667 sdk_version: "current",
668 }
669
670 java_library {
671 name: "foo.system",
672 srcs: ["a.java"],
673 libs: ["sdklib"],
674 sdk_version: "system_current",
675 }
676
677 java_library {
678 name: "foo.test",
679 srcs: ["a.java"],
680 libs: ["sdklib"],
681 sdk_version: "test_current",
682 }
683
684 java_sdk_library_import {
685 name: "sdklib",
686 public: {
687 jars: ["a.jar"],
688 },
689 system: {
690 jars: ["b.jar"],
691 },
692 test: {
693 jars: ["c.jar"],
Paul Duffin0f8faff2020-05-20 16:18:00 +0100694 stub_srcs: ["c.java"],
Paul Duffin56d44902020-01-31 13:36:25 +0000695 },
696 }
697 `)
698
699 for _, scope := range []string{"", ".system", ".test"} {
700 fooModule := ctx.ModuleForTests("foo"+scope, "android_common")
701 javac := fooModule.Rule("javac")
702
703 sdklibStubsJar := ctx.ModuleForTests("sdklib.stubs"+scope, "android_common").Rule("combineJar").Output
704 if !strings.Contains(javac.Args["classpath"], sdklibStubsJar.String()) {
705 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], sdklibStubsJar.String())
706 }
707 }
Paul Duffinca8d9a52020-06-26 22:20:25 +0100708
Paul Duffincee7e662020-07-09 17:32:57 +0100709 CheckModuleDependencies(t, ctx, "sdklib", "android_common", []string{
Paul Duffinca8d9a52020-06-26 22:20:25 +0100710 `prebuilt_sdklib.stubs`,
711 `prebuilt_sdklib.stubs.source.test`,
712 `prebuilt_sdklib.stubs.system`,
713 `prebuilt_sdklib.stubs.test`,
714 })
715}
716
717func TestJavaSdkLibraryImport_WithSource(t *testing.T) {
718 ctx, _ := testJava(t, `
719 java_sdk_library {
720 name: "sdklib",
721 srcs: ["a.java"],
722 sdk_version: "none",
723 system_modules: "none",
724 public: {
725 enabled: true,
726 },
727 }
728
729 java_sdk_library_import {
730 name: "sdklib",
731 public: {
732 jars: ["a.jar"],
733 },
734 }
735 `)
736
Paul Duffincee7e662020-07-09 17:32:57 +0100737 CheckModuleDependencies(t, ctx, "sdklib", "android_common", []string{
Paul Duffinca8d9a52020-06-26 22:20:25 +0100738 `dex2oatd`,
739 `prebuilt_sdklib`,
740 `sdklib.impl`,
741 `sdklib.stubs`,
742 `sdklib.stubs.source`,
743 `sdklib.xml`,
744 })
745
Paul Duffincee7e662020-07-09 17:32:57 +0100746 CheckModuleDependencies(t, ctx, "prebuilt_sdklib", "android_common", []string{
Paul Duffin44f1d842020-06-26 20:17:02 +0100747 `prebuilt_sdklib.stubs`,
Paul Duffinca8d9a52020-06-26 22:20:25 +0100748 `sdklib.impl`,
749 // This should be prebuilt_sdklib.stubs but is set to sdklib.stubs because the
750 // dependency is added after prebuilts may have been renamed and so has to use
751 // the renamed name.
Paul Duffinca8d9a52020-06-26 22:20:25 +0100752 `sdklib.xml`,
753 })
754}
755
756func TestJavaSdkLibraryImport_Preferred(t *testing.T) {
757 ctx, _ := testJava(t, `
758 java_sdk_library {
759 name: "sdklib",
760 srcs: ["a.java"],
761 sdk_version: "none",
762 system_modules: "none",
763 public: {
764 enabled: true,
765 },
766 }
767
768 java_sdk_library_import {
769 name: "sdklib",
770 prefer: true,
771 public: {
772 jars: ["a.jar"],
773 },
774 }
775 `)
776
Paul Duffincee7e662020-07-09 17:32:57 +0100777 CheckModuleDependencies(t, ctx, "sdklib", "android_common", []string{
Paul Duffinca8d9a52020-06-26 22:20:25 +0100778 `dex2oatd`,
779 `prebuilt_sdklib`,
Paul Duffinca8d9a52020-06-26 22:20:25 +0100780 `sdklib.impl`,
Paul Duffin80342d72020-06-26 22:08:43 +0100781 `sdklib.stubs`,
Paul Duffinca8d9a52020-06-26 22:20:25 +0100782 `sdklib.stubs.source`,
783 `sdklib.xml`,
784 })
785
Paul Duffincee7e662020-07-09 17:32:57 +0100786 CheckModuleDependencies(t, ctx, "prebuilt_sdklib", "android_common", []string{
Paul Duffinca8d9a52020-06-26 22:20:25 +0100787 `prebuilt_sdklib.stubs`,
788 `sdklib.impl`,
789 `sdklib.xml`,
790 })
Paul Duffin56d44902020-01-31 13:36:25 +0000791}
792
JaeMan Parkff715562020-10-19 17:25:58 +0900793func TestJavaSdkLibraryEnforce(t *testing.T) {
794 partitionToBpOption := func(partition string) string {
795 switch partition {
796 case "system":
797 return ""
798 case "vendor":
799 return "soc_specific: true,"
800 case "product":
801 return "product_specific: true,"
802 default:
803 panic("Invalid partition group name: " + partition)
804 }
805 }
806
807 type testConfigInfo struct {
808 libraryType string
809 fromPartition string
810 toPartition string
811 enforceVendorInterface bool
812 enforceProductInterface bool
813 enforceJavaSdkLibraryCheck bool
814 allowList []string
815 }
816
817 createTestConfig := func(info testConfigInfo) android.Config {
818 bpFileTemplate := `
819 java_library {
820 name: "foo",
821 srcs: ["foo.java"],
822 libs: ["bar"],
823 sdk_version: "current",
824 %s
825 }
826
827 %s {
828 name: "bar",
829 srcs: ["bar.java"],
830 sdk_version: "current",
831 %s
832 }
833 `
834
835 bpFile := fmt.Sprintf(bpFileTemplate,
836 partitionToBpOption(info.fromPartition),
837 info.libraryType,
838 partitionToBpOption(info.toPartition))
839
840 config := testConfig(nil, bpFile, nil)
841 configVariables := config.TestProductVariables
842
843 configVariables.EnforceProductPartitionInterface = proptools.BoolPtr(info.enforceProductInterface)
844 if info.enforceVendorInterface {
845 configVariables.DeviceVndkVersion = proptools.StringPtr("current")
846 }
847 configVariables.EnforceInterPartitionJavaSdkLibrary = proptools.BoolPtr(info.enforceJavaSdkLibraryCheck)
848 configVariables.InterPartitionJavaLibraryAllowList = info.allowList
849
850 return config
851 }
852
JaeMan Parkff715562020-10-19 17:25:58 +0900853 errorMessage := "is not allowed across the partitions"
854
JaeMan Park90e75352021-01-14 11:56:56 +0900855 testJavaWithConfig(t, createTestConfig(testConfigInfo{
856 libraryType: "java_library",
857 fromPartition: "product",
858 toPartition: "system",
859 enforceVendorInterface: true,
860 enforceProductInterface: true,
861 enforceJavaSdkLibraryCheck: false,
862 }))
JaeMan Parkff715562020-10-19 17:25:58 +0900863
JaeMan Park90e75352021-01-14 11:56:56 +0900864 testJavaWithConfig(t, createTestConfig(testConfigInfo{
865 libraryType: "java_library",
866 fromPartition: "product",
867 toPartition: "system",
868 enforceVendorInterface: true,
869 enforceProductInterface: false,
870 enforceJavaSdkLibraryCheck: true,
871 }))
JaeMan Parkff715562020-10-19 17:25:58 +0900872
JaeMan Park90e75352021-01-14 11:56:56 +0900873 testJavaErrorWithConfig(t, errorMessage, createTestConfig(testConfigInfo{
874 libraryType: "java_library",
875 fromPartition: "product",
876 toPartition: "system",
877 enforceVendorInterface: true,
878 enforceProductInterface: true,
879 enforceJavaSdkLibraryCheck: true,
880 }))
JaeMan Parkff715562020-10-19 17:25:58 +0900881
JaeMan Park90e75352021-01-14 11:56:56 +0900882 testJavaErrorWithConfig(t, errorMessage, createTestConfig(testConfigInfo{
883 libraryType: "java_library",
884 fromPartition: "vendor",
885 toPartition: "system",
886 enforceVendorInterface: true,
887 enforceProductInterface: true,
888 enforceJavaSdkLibraryCheck: true,
889 }))
JaeMan Parkff715562020-10-19 17:25:58 +0900890
891 testJavaWithConfig(t, createTestConfig(testConfigInfo{
892 libraryType: "java_library",
893 fromPartition: "vendor",
894 toPartition: "system",
895 enforceVendorInterface: true,
896 enforceProductInterface: true,
897 enforceJavaSdkLibraryCheck: true,
898 allowList: []string{"bar"},
899 }))
900
901 testJavaErrorWithConfig(t, errorMessage, createTestConfig(testConfigInfo{
902 libraryType: "java_library",
903 fromPartition: "vendor",
JaeMan Park90e75352021-01-14 11:56:56 +0900904 toPartition: "product",
905 enforceVendorInterface: true,
906 enforceProductInterface: true,
907 enforceJavaSdkLibraryCheck: true,
908 }))
909
910 testJavaWithConfig(t, createTestConfig(testConfigInfo{
911 libraryType: "java_sdk_library",
912 fromPartition: "product",
JaeMan Parkff715562020-10-19 17:25:58 +0900913 toPartition: "system",
914 enforceVendorInterface: true,
915 enforceProductInterface: true,
916 enforceJavaSdkLibraryCheck: true,
JaeMan Park90e75352021-01-14 11:56:56 +0900917 }))
918
919 testJavaWithConfig(t, createTestConfig(testConfigInfo{
920 libraryType: "java_sdk_library",
921 fromPartition: "vendor",
922 toPartition: "system",
923 enforceVendorInterface: true,
924 enforceProductInterface: true,
925 enforceJavaSdkLibraryCheck: true,
926 }))
927
928 testJavaWithConfig(t, createTestConfig(testConfigInfo{
929 libraryType: "java_sdk_library",
930 fromPartition: "vendor",
931 toPartition: "product",
932 enforceVendorInterface: true,
933 enforceProductInterface: true,
934 enforceJavaSdkLibraryCheck: true,
JaeMan Parkff715562020-10-19 17:25:58 +0900935 }))
936}
937
Colin Cross89536d42017-07-07 14:35:50 -0700938func TestDefaults(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700939 ctx, _ := testJava(t, `
Colin Cross89536d42017-07-07 14:35:50 -0700940 java_defaults {
941 name: "defaults",
942 srcs: ["a.java"],
943 libs: ["bar"],
944 static_libs: ["baz"],
Sasha Smundak2057f822019-04-16 17:16:58 -0700945 optimize: {enabled: false},
Colin Cross89536d42017-07-07 14:35:50 -0700946 }
947
948 java_library {
949 name: "foo",
950 defaults: ["defaults"],
951 }
952
953 java_library {
954 name: "bar",
955 srcs: ["b.java"],
956 }
957
958 java_library {
959 name: "baz",
960 srcs: ["c.java"],
961 }
Sasha Smundak2057f822019-04-16 17:16:58 -0700962
963 android_test {
964 name: "atestOptimize",
965 defaults: ["defaults"],
966 optimize: {enabled: true},
967 }
968
969 android_test {
970 name: "atestNoOptimize",
971 defaults: ["defaults"],
972 }
973
974 android_test {
975 name: "atestDefault",
976 srcs: ["a.java"],
977 }
Colin Cross89536d42017-07-07 14:35:50 -0700978 `)
979
Colin Cross4c428df2017-09-15 17:36:05 -0700980 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
Nan Zhanged19fc32017-10-19 13:06:22 -0700981 combineJar := ctx.ModuleForTests("foo", "android_common").Description("for javac")
Colin Cross89536d42017-07-07 14:35:50 -0700982
983 if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "a.java" {
984 t.Errorf(`foo inputs %v != ["a.java"]`, javac.Inputs)
985 }
986
Nan Zhanged19fc32017-10-19 13:06:22 -0700987 barTurbine := filepath.Join(buildDir, ".intermediates", "bar", "android_common", "turbine-combined", "bar.jar")
988 if !strings.Contains(javac.Args["classpath"], barTurbine) {
989 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
Colin Cross89536d42017-07-07 14:35:50 -0700990 }
991
Colin Cross1ee23172017-10-18 14:44:18 -0700992 baz := ctx.ModuleForTests("baz", "android_common").Rule("javac").Output.String()
Colin Cross0a6e0072017-08-30 14:24:55 -0700993 if len(combineJar.Inputs) != 2 || combineJar.Inputs[1].String() != baz {
994 t.Errorf("foo combineJar inputs %v does not contain %q", combineJar.Inputs, baz)
Colin Cross89536d42017-07-07 14:35:50 -0700995 }
Sasha Smundak2057f822019-04-16 17:16:58 -0700996
997 atestOptimize := ctx.ModuleForTests("atestOptimize", "android_common").MaybeRule("r8")
998 if atestOptimize.Output == nil {
999 t.Errorf("atestOptimize should optimize APK")
1000 }
1001
1002 atestNoOptimize := ctx.ModuleForTests("atestNoOptimize", "android_common").MaybeRule("d8")
1003 if atestNoOptimize.Output == nil {
1004 t.Errorf("atestNoOptimize should not optimize APK")
1005 }
1006
1007 atestDefault := ctx.ModuleForTests("atestDefault", "android_common").MaybeRule("r8")
1008 if atestDefault.Output == nil {
1009 t.Errorf("atestDefault should optimize APK")
1010 }
Colin Cross89536d42017-07-07 14:35:50 -07001011}
1012
Colin Cross0f37af02017-09-27 17:42:05 -07001013func TestResources(t *testing.T) {
1014 var table = []struct {
1015 name string
1016 prop string
1017 extra string
1018 args string
1019 }{
1020 {
Colin Crossaf9c55b2017-10-03 14:50:08 -07001021 // Test that a module with java_resource_dirs includes the files
Colin Cross0f37af02017-09-27 17:42:05 -07001022 name: "resource dirs",
Colin Cross824bee32017-11-22 17:27:51 -08001023 prop: `java_resource_dirs: ["java-res"]`,
Colin Cross0ead1d72018-04-10 13:07:42 -07001024 args: "-C java-res -f java-res/a/a -f java-res/b/b",
Colin Cross0f37af02017-09-27 17:42:05 -07001025 },
1026 {
1027 // Test that a module with java_resources includes the files
1028 name: "resource files",
Colin Cross0ead1d72018-04-10 13:07:42 -07001029 prop: `java_resources: ["java-res/a/a", "java-res/b/b"]`,
1030 args: "-C . -f java-res/a/a -f java-res/b/b",
Colin Cross0f37af02017-09-27 17:42:05 -07001031 },
1032 {
1033 // Test that a module with a filegroup in java_resources includes the files with the
1034 // path prefix
1035 name: "resource filegroup",
1036 prop: `java_resources: [":foo-res"]`,
1037 extra: `
1038 filegroup {
1039 name: "foo-res",
Colin Cross824bee32017-11-22 17:27:51 -08001040 path: "java-res",
Colin Cross0ead1d72018-04-10 13:07:42 -07001041 srcs: ["java-res/a/a", "java-res/b/b"],
Colin Cross0f37af02017-09-27 17:42:05 -07001042 }`,
Colin Cross0ead1d72018-04-10 13:07:42 -07001043 args: "-C java-res -f java-res/a/a -f java-res/b/b",
Colin Cross0f37af02017-09-27 17:42:05 -07001044 },
1045 {
Colin Cross0ead1d72018-04-10 13:07:42 -07001046 // Test that a module with wildcards in java_resource_dirs has the correct path prefixes
1047 name: "wildcard dirs",
1048 prop: `java_resource_dirs: ["java-res/*"]`,
1049 args: "-C java-res/a -f java-res/a/a -C java-res/b -f java-res/b/b",
1050 },
1051 {
1052 // Test that a module exclude_java_resource_dirs excludes the files
1053 name: "wildcard dirs",
1054 prop: `java_resource_dirs: ["java-res/*"], exclude_java_resource_dirs: ["java-res/b"]`,
1055 args: "-C java-res/a -f java-res/a/a",
1056 },
Colin Crosscedd4762018-09-13 11:26:19 -07001057 {
1058 // Test wildcards in java_resources
1059 name: "wildcard files",
1060 prop: `java_resources: ["java-res/**/*"]`,
1061 args: "-C . -f java-res/a/a -f java-res/b/b",
1062 },
1063 {
1064 // Test exclude_java_resources with java_resources
1065 name: "wildcard files with exclude",
1066 prop: `java_resources: ["java-res/**/*"], exclude_java_resources: ["java-res/b/*"]`,
1067 args: "-C . -f java-res/a/a",
1068 },
1069 {
1070 // Test exclude_java_resources with java_resource_dirs
1071 name: "resource dirs with exclude files",
1072 prop: `java_resource_dirs: ["java-res"], exclude_java_resources: ["java-res/b/b"]`,
1073 args: "-C java-res -f java-res/a/a",
1074 },
1075 {
1076 // Test exclude_java_resource_dirs with java_resource_dirs
1077 name: "resource dirs with exclude files",
1078 prop: `java_resource_dirs: ["java-res", "java-res2"], exclude_java_resource_dirs: ["java-res2"]`,
1079 args: "-C java-res -f java-res/a/a -f java-res/b/b",
1080 },
Colin Cross0f37af02017-09-27 17:42:05 -07001081 }
1082
1083 for _, test := range table {
1084 t.Run(test.name, func(t *testing.T) {
Colin Cross238c1f32020-06-07 16:58:18 -07001085 ctx, _ := testJavaWithFS(t, `
Colin Cross0f37af02017-09-27 17:42:05 -07001086 java_library {
1087 name: "foo",
1088 srcs: [
1089 "a.java",
1090 "b.java",
1091 "c.java",
1092 ],
1093 `+test.prop+`,
1094 }
Colin Cross238c1f32020-06-07 16:58:18 -07001095 `+test.extra,
1096 map[string][]byte{
1097 "java-res/a/a": nil,
1098 "java-res/b/b": nil,
1099 "java-res2/a": nil,
1100 },
1101 )
Colin Cross0f37af02017-09-27 17:42:05 -07001102
Colin Cross331a1212018-08-15 20:40:52 -07001103 foo := ctx.ModuleForTests("foo", "android_common").Output("withres/foo.jar")
Colin Cross1ee23172017-10-18 14:44:18 -07001104 fooRes := ctx.ModuleForTests("foo", "android_common").Output("res/foo.jar")
Colin Cross0f37af02017-09-27 17:42:05 -07001105
1106 if !inList(fooRes.Output.String(), foo.Inputs.Strings()) {
1107 t.Errorf("foo combined jars %v does not contain %q",
1108 foo.Inputs.Strings(), fooRes.Output.String())
1109 }
1110
Colin Crossaf9c55b2017-10-03 14:50:08 -07001111 if fooRes.Args["jarArgs"] != test.args {
1112 t.Errorf("foo resource jar args %q is not %q",
Colin Cross0f37af02017-09-27 17:42:05 -07001113 fooRes.Args["jarArgs"], test.args)
1114 }
1115 })
1116 }
1117}
1118
Colin Cross0c4ce212019-05-03 15:28:19 -07001119func TestIncludeSrcs(t *testing.T) {
Colin Cross238c1f32020-06-07 16:58:18 -07001120 ctx, _ := testJavaWithFS(t, `
Colin Cross0c4ce212019-05-03 15:28:19 -07001121 java_library {
1122 name: "foo",
1123 srcs: [
1124 "a.java",
1125 "b.java",
1126 "c.java",
1127 ],
1128 include_srcs: true,
1129 }
1130
1131 java_library {
1132 name: "bar",
1133 srcs: [
1134 "a.java",
1135 "b.java",
1136 "c.java",
1137 ],
1138 java_resource_dirs: ["java-res"],
1139 include_srcs: true,
1140 }
Colin Cross238c1f32020-06-07 16:58:18 -07001141 `, map[string][]byte{
1142 "java-res/a/a": nil,
1143 "java-res/b/b": nil,
1144 "java-res2/a": nil,
1145 })
Colin Cross0c4ce212019-05-03 15:28:19 -07001146
1147 // Test a library with include_srcs: true
1148 foo := ctx.ModuleForTests("foo", "android_common").Output("withres/foo.jar")
1149 fooSrcJar := ctx.ModuleForTests("foo", "android_common").Output("foo.srcjar")
1150
1151 if g, w := fooSrcJar.Output.String(), foo.Inputs.Strings(); !inList(g, w) {
1152 t.Errorf("foo combined jars %v does not contain %q", w, g)
1153 }
1154
1155 if g, w := fooSrcJar.Args["jarArgs"], "-C . -f a.java -f b.java -f c.java"; g != w {
1156 t.Errorf("foo source jar args %q is not %q", w, g)
1157 }
1158
1159 // Test a library with include_srcs: true and resources
1160 bar := ctx.ModuleForTests("bar", "android_common").Output("withres/bar.jar")
1161 barResCombined := ctx.ModuleForTests("bar", "android_common").Output("res-combined/bar.jar")
1162 barRes := ctx.ModuleForTests("bar", "android_common").Output("res/bar.jar")
1163 barSrcJar := ctx.ModuleForTests("bar", "android_common").Output("bar.srcjar")
1164
1165 if g, w := barSrcJar.Output.String(), barResCombined.Inputs.Strings(); !inList(g, w) {
1166 t.Errorf("bar combined resource jars %v does not contain %q", w, g)
1167 }
1168
1169 if g, w := barRes.Output.String(), barResCombined.Inputs.Strings(); !inList(g, w) {
1170 t.Errorf("bar combined resource jars %v does not contain %q", w, g)
1171 }
1172
1173 if g, w := barResCombined.Output.String(), bar.Inputs.Strings(); !inList(g, w) {
1174 t.Errorf("bar combined jars %v does not contain %q", w, g)
1175 }
1176
1177 if g, w := barSrcJar.Args["jarArgs"], "-C . -f a.java -f b.java -f c.java"; g != w {
1178 t.Errorf("bar source jar args %q is not %q", w, g)
1179 }
1180
1181 if g, w := barRes.Args["jarArgs"], "-C java-res -f java-res/a/a -f java-res/b/b"; g != w {
1182 t.Errorf("bar resource jar args %q is not %q", w, g)
1183 }
1184}
1185
Colin Cross54190b32017-10-09 15:34:10 -07001186func TestGeneratedSources(t *testing.T) {
Colin Cross238c1f32020-06-07 16:58:18 -07001187 ctx, _ := testJavaWithFS(t, `
Colin Cross54190b32017-10-09 15:34:10 -07001188 java_library {
1189 name: "foo",
1190 srcs: [
1191 "a*.java",
1192 ":gen",
1193 "b*.java",
1194 ],
1195 }
1196
1197 genrule {
1198 name: "gen",
Colin Cross824bee32017-11-22 17:27:51 -08001199 tool_files: ["java-res/a"],
Colin Cross54190b32017-10-09 15:34:10 -07001200 out: ["gen.java"],
1201 }
Colin Cross238c1f32020-06-07 16:58:18 -07001202 `, map[string][]byte{
1203 "a.java": nil,
1204 "b.java": nil,
1205 })
Colin Cross54190b32017-10-09 15:34:10 -07001206
1207 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
1208 genrule := ctx.ModuleForTests("gen", "").Rule("generator")
1209
Colin Cross15e86d92017-10-20 15:07:08 -07001210 if filepath.Base(genrule.Output.String()) != "gen.java" {
1211 t.Fatalf(`gen output file %v is not ".../gen.java"`, genrule.Output.String())
Colin Cross54190b32017-10-09 15:34:10 -07001212 }
1213
1214 if len(javac.Inputs) != 3 ||
1215 javac.Inputs[0].String() != "a.java" ||
Colin Cross15e86d92017-10-20 15:07:08 -07001216 javac.Inputs[1].String() != genrule.Output.String() ||
Colin Cross54190b32017-10-09 15:34:10 -07001217 javac.Inputs[2].String() != "b.java" {
1218 t.Errorf(`foo inputs %v != ["a.java", ".../gen.java", "b.java"]`, javac.Inputs)
1219 }
1220}
1221
Nan Zhang61eaedb2017-11-02 13:28:15 -07001222func TestTurbine(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001223 ctx, _ := testJava(t, `
Nan Zhang61eaedb2017-11-02 13:28:15 -07001224 java_library {
1225 name: "foo",
1226 srcs: ["a.java"],
Jiyong Park2d492942018-03-05 17:44:10 +09001227 sdk_version: "14",
Nan Zhang61eaedb2017-11-02 13:28:15 -07001228 }
1229
1230 java_library {
1231 name: "bar",
Colin Cross9bc43432017-12-15 20:20:39 -08001232 srcs: ["b.java"],
Nan Zhang61eaedb2017-11-02 13:28:15 -07001233 static_libs: ["foo"],
Jiyong Park2d492942018-03-05 17:44:10 +09001234 sdk_version: "14",
Nan Zhang61eaedb2017-11-02 13:28:15 -07001235 }
1236
1237 java_library {
1238 name: "baz",
1239 srcs: ["c.java"],
1240 libs: ["bar"],
1241 sdk_version: "14",
1242 }
1243 `)
1244
1245 fooTurbine := ctx.ModuleForTests("foo", "android_common").Rule("turbine")
1246 barTurbine := ctx.ModuleForTests("bar", "android_common").Rule("turbine")
1247 barJavac := ctx.ModuleForTests("bar", "android_common").Rule("javac")
1248 barTurbineCombined := ctx.ModuleForTests("bar", "android_common").Description("for turbine")
1249 bazJavac := ctx.ModuleForTests("baz", "android_common").Rule("javac")
1250
1251 if len(fooTurbine.Inputs) != 1 || fooTurbine.Inputs[0].String() != "a.java" {
1252 t.Errorf(`foo inputs %v != ["a.java"]`, fooTurbine.Inputs)
1253 }
1254
1255 fooHeaderJar := filepath.Join(buildDir, ".intermediates", "foo", "android_common", "turbine-combined", "foo.jar")
1256 if !strings.Contains(barTurbine.Args["classpath"], fooHeaderJar) {
1257 t.Errorf("bar turbine classpath %v does not contain %q", barTurbine.Args["classpath"], fooHeaderJar)
1258 }
1259 if !strings.Contains(barJavac.Args["classpath"], fooHeaderJar) {
1260 t.Errorf("bar javac classpath %v does not contain %q", barJavac.Args["classpath"], fooHeaderJar)
1261 }
1262 if len(barTurbineCombined.Inputs) != 2 || barTurbineCombined.Inputs[1].String() != fooHeaderJar {
1263 t.Errorf("bar turbine combineJar inputs %v does not contain %q", barTurbineCombined.Inputs, fooHeaderJar)
1264 }
Anton Hanssonf66efeb2018-04-11 13:57:30 +01001265 if !strings.Contains(bazJavac.Args["classpath"], "prebuilts/sdk/14/public/android.jar") {
Nan Zhang61eaedb2017-11-02 13:28:15 -07001266 t.Errorf("baz javac classpath %v does not contain %q", bazJavac.Args["classpath"],
Anton Hanssonf66efeb2018-04-11 13:57:30 +01001267 "prebuilts/sdk/14/public/android.jar")
Nan Zhang61eaedb2017-11-02 13:28:15 -07001268 }
1269}
1270
1271func TestSharding(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001272 ctx, _ := testJava(t, `
Nan Zhang61eaedb2017-11-02 13:28:15 -07001273 java_library {
1274 name: "bar",
1275 srcs: ["a.java","b.java","c.java"],
1276 javac_shard_size: 1
1277 }
1278 `)
1279
1280 barHeaderJar := filepath.Join(buildDir, ".intermediates", "bar", "android_common", "turbine-combined", "bar.jar")
1281 for i := 0; i < 3; i++ {
1282 barJavac := ctx.ModuleForTests("bar", "android_common").Description("javac" + strconv.Itoa(i))
1283 if !strings.Contains(barJavac.Args["classpath"], barHeaderJar) {
1284 t.Errorf("bar javac classpath %v does not contain %q", barJavac.Args["classpath"], barHeaderJar)
1285 }
1286 }
1287}
1288
Nan Zhang581fd212018-01-10 16:06:12 -08001289func TestDroiddoc(t *testing.T) {
Colin Cross238c1f32020-06-07 16:58:18 -07001290 ctx, _ := testJavaWithFS(t, `
Paul Duffin884363e2019-12-19 10:21:09 +00001291 droiddoc_exported_dir {
Dan Willemsencc090972018-02-26 14:33:31 -08001292 name: "droiddoc-templates-sdk",
1293 path: ".",
1294 }
Jiyong Park29074592019-07-07 16:27:47 +09001295 filegroup {
1296 name: "bar-doc-aidl-srcs",
1297 srcs: ["bar-doc/IBar.aidl"],
1298 path: "bar-doc",
1299 }
Liz Kammere1ab2502020-09-10 15:29:25 +00001300 droidstubs {
1301 name: "bar-stubs",
Liz Kammer3a55c912020-08-14 12:14:02 -07001302 srcs: [
Steve Kim3666c702020-09-01 17:58:01 +00001303 "bar-doc/a.java",
Liz Kammer3a55c912020-08-14 12:14:02 -07001304 ],
Steve Kim3666c702020-09-01 17:58:01 +00001305 exclude_srcs: [
1306 "bar-doc/b.java"
1307 ],
Liz Kammere1ab2502020-09-10 15:29:25 +00001308 api_levels_annotations_dirs: [
1309 "droiddoc-templates-sdk",
1310 ],
1311 api_levels_annotations_enabled: true,
1312 }
1313 droiddoc {
1314 name: "bar-doc",
1315 srcs: [
1316 ":bar-stubs",
1317 "bar-doc/IFoo.aidl",
1318 ":bar-doc-aidl-srcs",
1319 ],
Dan Willemsencc090972018-02-26 14:33:31 -08001320 custom_template: "droiddoc-templates-sdk",
Nan Zhang581fd212018-01-10 16:06:12 -08001321 hdf: [
1322 "android.whichdoc offline",
1323 ],
1324 knowntags: [
1325 "bar-doc/known_oj_tags.txt",
1326 ],
1327 proofread_file: "libcore-proofread.txt",
1328 todo_file: "libcore-docs-todo.html",
Liz Kammer585cac22020-07-06 09:12:57 -07001329 flags: ["-offlinemode -title \"libcore\""],
Nan Zhang581fd212018-01-10 16:06:12 -08001330 }
Colin Cross238c1f32020-06-07 16:58:18 -07001331 `,
1332 map[string][]byte{
1333 "bar-doc/a.java": nil,
1334 "bar-doc/b.java": nil,
1335 })
Liz Kammere1ab2502020-09-10 15:29:25 +00001336 barStubs := ctx.ModuleForTests("bar-stubs", "android_common")
1337 barStubsOutputs, err := barStubs.Module().(*Droidstubs).OutputFiles("")
1338 if err != nil {
1339 t.Errorf("Unexpected error %q retrieving \"bar-stubs\" output file", err)
1340 }
1341 if len(barStubsOutputs) != 1 {
1342 t.Errorf("Expected one output from \"bar-stubs\" got %s", barStubsOutputs)
Liz Kammer1e2ee122020-07-30 15:07:22 -07001343 }
Nan Zhang581fd212018-01-10 16:06:12 -08001344
Liz Kammere1ab2502020-09-10 15:29:25 +00001345 barStubsOutput := barStubsOutputs[0]
1346 barDoc := ctx.ModuleForTests("bar-doc", "android_common")
1347 javaDoc := barDoc.Rule("javadoc")
1348 if g, w := javaDoc.Implicits.Strings(), barStubsOutput.String(); !inList(w, g) {
1349 t.Errorf("implicits of bar-doc must contain %q, but was %q.", w, g)
Jiyong Park29074592019-07-07 16:27:47 +09001350 }
1351
Liz Kammere1ab2502020-09-10 15:29:25 +00001352 expected := "-sourcepath " + buildDir + "/.intermediates/bar-doc/android_common/srcjars "
1353 if !strings.Contains(javaDoc.RuleParams.Command, expected) {
1354 t.Errorf("bar-doc command does not contain flag %q, but should\n%q", expected, javaDoc.RuleParams.Command)
1355 }
1356
1357 aidl := barDoc.Rule("aidl")
1358 if g, w := javaDoc.Implicits.Strings(), aidl.Output.String(); !inList(w, g) {
Colin Crossc0806172019-06-14 18:51:47 -07001359 t.Errorf("implicits of bar-doc must contain %q, but was %q.", w, g)
1360 }
1361
1362 if g, w := aidl.Implicits.Strings(), []string{"bar-doc/IBar.aidl", "bar-doc/IFoo.aidl"}; !reflect.DeepEqual(w, g) {
1363 t.Errorf("aidl inputs must be %q, but was %q", w, g)
Jiyong Park1e440682018-05-23 18:42:04 +09001364 }
Nan Zhang581fd212018-01-10 16:06:12 -08001365}
1366
Liz Kammer585cac22020-07-06 09:12:57 -07001367func TestDroiddocArgsAndFlagsCausesError(t *testing.T) {
1368 testJavaError(t, "flags is set. Cannot set args", `
1369 droiddoc_exported_dir {
1370 name: "droiddoc-templates-sdk",
1371 path: ".",
1372 }
1373 filegroup {
1374 name: "bar-doc-aidl-srcs",
1375 srcs: ["bar-doc/IBar.aidl"],
1376 path: "bar-doc",
1377 }
Liz Kammere1ab2502020-09-10 15:29:25 +00001378 droidstubs {
1379 name: "bar-stubs",
Liz Kammer3a55c912020-08-14 12:14:02 -07001380 srcs: [
Steve Kim3666c702020-09-01 17:58:01 +00001381 "bar-doc/a.java",
Liz Kammer3a55c912020-08-14 12:14:02 -07001382 ],
Steve Kim3666c702020-09-01 17:58:01 +00001383 exclude_srcs: [
1384 "bar-doc/b.java"
1385 ],
Liz Kammere1ab2502020-09-10 15:29:25 +00001386 api_levels_annotations_dirs: [
1387 "droiddoc-templates-sdk",
1388 ],
1389 api_levels_annotations_enabled: true,
1390 }
1391 droiddoc {
1392 name: "bar-doc",
1393 srcs: [
1394 ":bar-stubs",
1395 "bar-doc/IFoo.aidl",
1396 ":bar-doc-aidl-srcs",
1397 ],
Liz Kammer585cac22020-07-06 09:12:57 -07001398 custom_template: "droiddoc-templates-sdk",
1399 hdf: [
1400 "android.whichdoc offline",
1401 ],
1402 knowntags: [
1403 "bar-doc/known_oj_tags.txt",
1404 ],
1405 proofread_file: "libcore-proofread.txt",
1406 todo_file: "libcore-docs-todo.html",
1407 flags: ["-offlinemode -title \"libcore\""],
1408 args: "-offlinemode -title \"libcore\"",
1409 }
1410 `)
1411}
1412
Liz Kammer3d894b72020-08-04 09:55:13 -07001413func TestDroidstubs(t *testing.T) {
1414 ctx, _ := testJavaWithFS(t, `
1415 droiddoc_exported_dir {
Anton Hansson52ac73d2020-10-26 09:57:40 +00001416 name: "droiddoc-templates-sdk",
1417 path: ".",
Liz Kammer3d894b72020-08-04 09:55:13 -07001418 }
1419
1420 droidstubs {
Anton Hansson52ac73d2020-10-26 09:57:40 +00001421 name: "bar-stubs",
1422 srcs: ["bar-doc/a.java"],
1423 api_levels_annotations_dirs: ["droiddoc-templates-sdk"],
1424 api_levels_annotations_enabled: true,
Liz Kammer3d894b72020-08-04 09:55:13 -07001425 }
1426
1427 droidstubs {
Anton Hansson52ac73d2020-10-26 09:57:40 +00001428 name: "bar-stubs-other",
1429 srcs: ["bar-doc/a.java"],
1430 high_mem: true,
1431 api_levels_annotations_dirs: ["droiddoc-templates-sdk"],
1432 api_levels_annotations_enabled: true,
1433 api_levels_jar_filename: "android.other.jar",
Liz Kammer3d894b72020-08-04 09:55:13 -07001434 }
1435 `,
1436 map[string][]byte{
1437 "bar-doc/a.java": nil,
1438 })
1439 testcases := []struct {
1440 moduleName string
1441 expectedJarFilename string
Anton Hansson52ac73d2020-10-26 09:57:40 +00001442 high_mem bool
Liz Kammer3d894b72020-08-04 09:55:13 -07001443 }{
1444 {
1445 moduleName: "bar-stubs",
1446 expectedJarFilename: "android.jar",
Anton Hansson52ac73d2020-10-26 09:57:40 +00001447 high_mem: false,
Liz Kammer3d894b72020-08-04 09:55:13 -07001448 },
1449 {
1450 moduleName: "bar-stubs-other",
1451 expectedJarFilename: "android.other.jar",
Anton Hansson52ac73d2020-10-26 09:57:40 +00001452 high_mem: true,
Liz Kammer3d894b72020-08-04 09:55:13 -07001453 },
1454 }
1455 for _, c := range testcases {
1456 m := ctx.ModuleForTests(c.moduleName, "android_common")
1457 metalava := m.Rule("metalava")
Anton Hansson52ac73d2020-10-26 09:57:40 +00001458 rp := metalava.RuleParams
Liz Kammer3d894b72020-08-04 09:55:13 -07001459 expected := "--android-jar-pattern ./%/public/" + c.expectedJarFilename
Anton Hansson52ac73d2020-10-26 09:57:40 +00001460 if actual := rp.Command; !strings.Contains(actual, expected) {
Liz Kammer3d894b72020-08-04 09:55:13 -07001461 t.Errorf("For %q, expected metalava argument %q, but was not found %q", c.moduleName, expected, actual)
1462 }
Anton Hansson52ac73d2020-10-26 09:57:40 +00001463
1464 if actual := rp.Pool != nil && strings.Contains(rp.Pool.String(), "highmem"); actual != c.high_mem {
1465 t.Errorf("Expected %q high_mem to be %v, was %v", c.moduleName, c.high_mem, actual)
1466 }
Liz Kammer3d894b72020-08-04 09:55:13 -07001467 }
1468}
1469
Paul Duffin83a2d962019-11-19 19:44:10 +00001470func TestDroidstubsWithSystemModules(t *testing.T) {
1471 ctx, _ := testJava(t, `
1472 droidstubs {
1473 name: "stubs-source-system-modules",
1474 srcs: [
Colin Cross238c1f32020-06-07 16:58:18 -07001475 "bar-doc/a.java",
Paul Duffin83a2d962019-11-19 19:44:10 +00001476 ],
1477 sdk_version: "none",
1478 system_modules: "source-system-modules",
1479 }
1480
1481 java_library {
1482 name: "source-jar",
1483 srcs: [
1484 "a.java",
1485 ],
1486 }
1487
1488 java_system_modules {
1489 name: "source-system-modules",
1490 libs: ["source-jar"],
1491 }
1492
1493 droidstubs {
1494 name: "stubs-prebuilt-system-modules",
1495 srcs: [
Colin Cross238c1f32020-06-07 16:58:18 -07001496 "bar-doc/a.java",
Paul Duffin83a2d962019-11-19 19:44:10 +00001497 ],
1498 sdk_version: "none",
1499 system_modules: "prebuilt-system-modules",
1500 }
1501
1502 java_import {
1503 name: "prebuilt-jar",
1504 jars: ["a.jar"],
1505 }
1506
1507 java_system_modules_import {
1508 name: "prebuilt-system-modules",
1509 libs: ["prebuilt-jar"],
1510 }
1511 `)
1512
1513 checkSystemModulesUseByDroidstubs(t, ctx, "stubs-source-system-modules", "source-jar.jar")
1514
1515 checkSystemModulesUseByDroidstubs(t, ctx, "stubs-prebuilt-system-modules", "prebuilt-jar.jar")
1516}
1517
1518func checkSystemModulesUseByDroidstubs(t *testing.T, ctx *android.TestContext, moduleName string, systemJar string) {
1519 metalavaRule := ctx.ModuleForTests(moduleName, "android_common").Rule("metalava")
1520 var systemJars []string
1521 for _, i := range metalavaRule.Implicits {
1522 systemJars = append(systemJars, i.Base())
1523 }
Ramy Medhatc7965cd2020-04-30 03:08:37 -04001524 if len(systemJars) < 1 || systemJars[0] != systemJar {
Paul Duffin83a2d962019-11-19 19:44:10 +00001525 t.Errorf("inputs of %q must be []string{%q}, but was %#v.", moduleName, systemJar, systemJars)
1526 }
1527}
1528
Colin Cross54250902017-12-05 09:28:08 -08001529func TestJarGenrules(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001530 ctx, _ := testJava(t, `
Colin Cross54250902017-12-05 09:28:08 -08001531 java_library {
1532 name: "foo",
1533 srcs: ["a.java"],
1534 }
1535
1536 java_genrule {
1537 name: "jargen",
1538 tool_files: ["b.java"],
1539 cmd: "$(location b.java) $(in) $(out)",
1540 out: ["jargen.jar"],
1541 srcs: [":foo"],
1542 }
1543
1544 java_library {
1545 name: "bar",
1546 static_libs: ["jargen"],
1547 srcs: ["c.java"],
1548 }
1549
1550 java_library {
1551 name: "baz",
1552 libs: ["jargen"],
1553 srcs: ["c.java"],
1554 }
1555 `)
1556
1557 foo := ctx.ModuleForTests("foo", "android_common").Output("javac/foo.jar")
1558 jargen := ctx.ModuleForTests("jargen", "android_common").Output("jargen.jar")
1559 bar := ctx.ModuleForTests("bar", "android_common").Output("javac/bar.jar")
1560 baz := ctx.ModuleForTests("baz", "android_common").Output("javac/baz.jar")
1561 barCombined := ctx.ModuleForTests("bar", "android_common").Output("combined/bar.jar")
1562
Colin Cross3d680512020-11-13 16:23:53 -08001563 if g, w := jargen.Implicits.Strings(), foo.Output.String(); !android.InList(w, g) {
1564 t.Errorf("expected jargen inputs [%q], got %q", w, g)
Colin Cross54250902017-12-05 09:28:08 -08001565 }
1566
1567 if !strings.Contains(bar.Args["classpath"], jargen.Output.String()) {
1568 t.Errorf("bar classpath %v does not contain %q", bar.Args["classpath"], jargen.Output.String())
1569 }
1570
1571 if !strings.Contains(baz.Args["classpath"], jargen.Output.String()) {
1572 t.Errorf("baz classpath %v does not contain %q", baz.Args["classpath"], jargen.Output.String())
1573 }
1574
1575 if len(barCombined.Inputs) != 2 ||
1576 barCombined.Inputs[0].String() != bar.Output.String() ||
1577 barCombined.Inputs[1].String() != jargen.Output.String() {
1578 t.Errorf("bar combined jar inputs %v is not [%q, %q]",
1579 barCombined.Inputs.Strings(), bar.Output.String(), jargen.Output.String())
1580 }
1581}
1582
Nan Zhang27e284d2018-02-09 21:03:53 +00001583func TestExcludeFileGroupInSrcs(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001584 ctx, _ := testJava(t, `
Nan Zhang27e284d2018-02-09 21:03:53 +00001585 java_library {
1586 name: "foo",
1587 srcs: ["a.java", ":foo-srcs"],
1588 exclude_srcs: ["a.java", ":foo-excludes"],
1589 }
1590
1591 filegroup {
1592 name: "foo-srcs",
1593 srcs: ["java-fg/a.java", "java-fg/b.java", "java-fg/c.java"],
1594 }
1595
1596 filegroup {
1597 name: "foo-excludes",
1598 srcs: ["java-fg/a.java", "java-fg/b.java"],
1599 }
1600 `)
1601
1602 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
1603
1604 if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "java-fg/c.java" {
1605 t.Errorf(`foo inputs %v != ["java-fg/c.java"]`, javac.Inputs)
1606 }
1607}
Jiyong Parkc678ad32018-04-10 13:07:10 +09001608
Paul Duffin52d398a2019-06-11 12:31:14 +01001609func TestJavaLibrary(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -08001610 config := testConfig(nil, "", map[string][]byte{
Paul Duffin52d398a2019-06-11 12:31:14 +01001611 "libcore/Android.bp": []byte(`
1612 java_library {
1613 name: "core",
1614 sdk_version: "none",
1615 system_modules: "none",
Paul Duffinaa55f742020-10-06 17:20:13 +01001616 }
1617
1618 filegroup {
1619 name: "core-jar",
1620 srcs: [":core{.jar}"],
1621 }
1622`),
1623 })
Colin Crossae8600b2020-10-29 17:09:13 -07001624 ctx := testContext(config)
Paul Duffinaa55f742020-10-06 17:20:13 +01001625 run(t, ctx, config)
1626}
1627
1628func TestJavaImport(t *testing.T) {
1629 config := testConfig(nil, "", map[string][]byte{
1630 "libcore/Android.bp": []byte(`
1631 java_import {
1632 name: "core",
1633 sdk_version: "none",
1634 }
1635
1636 filegroup {
1637 name: "core-jar",
1638 srcs: [":core{.jar}"],
1639 }
1640`),
Paul Duffin52d398a2019-06-11 12:31:14 +01001641 })
Colin Crossae8600b2020-10-29 17:09:13 -07001642 ctx := testContext(config)
Paul Duffin52d398a2019-06-11 12:31:14 +01001643 run(t, ctx, config)
1644}
1645
Jiyong Parkc678ad32018-04-10 13:07:10 +09001646func TestJavaSdkLibrary(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001647 ctx, _ := testJava(t, `
Paul Duffin884363e2019-12-19 10:21:09 +00001648 droiddoc_exported_dir {
Jiyong Parkc678ad32018-04-10 13:07:10 +09001649 name: "droiddoc-templates-sdk",
1650 path: ".",
1651 }
Jiyong Parkc678ad32018-04-10 13:07:10 +09001652 java_sdk_library {
1653 name: "foo",
1654 srcs: ["a.java", "b.java"],
1655 api_packages: ["foo"],
1656 }
1657 java_sdk_library {
1658 name: "bar",
1659 srcs: ["a.java", "b.java"],
1660 api_packages: ["bar"],
1661 }
1662 java_library {
1663 name: "baz",
1664 srcs: ["c.java"],
Paul Duffin859fe962020-05-15 10:20:31 +01001665 libs: ["foo", "bar.stubs"],
Jiyong Parkc678ad32018-04-10 13:07:10 +09001666 sdk_version: "system_current",
1667 }
Paul Duffindfa131e2020-05-15 20:37:11 +01001668 java_sdk_library {
1669 name: "barney",
1670 srcs: ["c.java"],
1671 api_only: true,
1672 }
1673 java_sdk_library {
1674 name: "betty",
1675 srcs: ["c.java"],
1676 shared_library: false,
1677 }
Paul Duffin859fe962020-05-15 10:20:31 +01001678 java_sdk_library_import {
1679 name: "quuz",
1680 public: {
1681 jars: ["c.jar"],
1682 },
1683 }
1684 java_sdk_library_import {
1685 name: "fred",
1686 public: {
1687 jars: ["b.jar"],
1688 },
1689 }
Paul Duffindfa131e2020-05-15 20:37:11 +01001690 java_sdk_library_import {
1691 name: "wilma",
1692 public: {
1693 jars: ["b.jar"],
1694 },
1695 shared_library: false,
1696 }
Jiyong Park1be96912018-05-28 18:02:19 +09001697 java_library {
1698 name: "qux",
1699 srcs: ["c.java"],
Paul Duffindfa131e2020-05-15 20:37:11 +01001700 libs: ["baz", "fred", "quuz.stubs", "wilma", "barney", "betty"],
Jiyong Park1be96912018-05-28 18:02:19 +09001701 sdk_version: "system_current",
1702 }
Paul Duffin726d23c2020-01-22 16:30:37 +00001703 java_library {
1704 name: "baz-test",
1705 srcs: ["c.java"],
1706 libs: ["foo"],
1707 sdk_version: "test_current",
1708 }
Paul Duffina2db18f2020-01-22 17:11:15 +00001709 java_library {
1710 name: "baz-29",
1711 srcs: ["c.java"],
1712 libs: ["foo"],
1713 sdk_version: "system_29",
1714 }
Paul Duffinfb6ae5b2020-09-30 15:17:25 +01001715 java_library {
1716 name: "baz-module-30",
1717 srcs: ["c.java"],
1718 libs: ["foo"],
1719 sdk_version: "module_30",
1720 }
Jiyong Parkc678ad32018-04-10 13:07:10 +09001721 `)
1722
1723 // check the existence of the internal modules
1724 ctx.ModuleForTests("foo", "android_common")
Paul Duffindd9d0742020-05-08 15:52:37 +01001725 ctx.ModuleForTests(apiScopePublic.stubsLibraryModuleName("foo"), "android_common")
1726 ctx.ModuleForTests(apiScopeSystem.stubsLibraryModuleName("foo"), "android_common")
1727 ctx.ModuleForTests(apiScopeTest.stubsLibraryModuleName("foo"), "android_common")
1728 ctx.ModuleForTests(apiScopePublic.stubsSourceModuleName("foo"), "android_common")
1729 ctx.ModuleForTests(apiScopeSystem.stubsSourceModuleName("foo"), "android_common")
1730 ctx.ModuleForTests(apiScopeTest.stubsSourceModuleName("foo"), "android_common")
Jiyong Parke3833882020-02-17 17:28:10 +09001731 ctx.ModuleForTests("foo"+sdkXmlFileSuffix, "android_common")
Jiyong Park58c518b2018-05-12 22:29:12 +09001732 ctx.ModuleForTests("foo.api.public.28", "")
1733 ctx.ModuleForTests("foo.api.system.28", "")
1734 ctx.ModuleForTests("foo.api.test.28", "")
Jiyong Parkc678ad32018-04-10 13:07:10 +09001735
1736 bazJavac := ctx.ModuleForTests("baz", "android_common").Rule("javac")
1737 // tests if baz is actually linked to the stubs lib
1738 if !strings.Contains(bazJavac.Args["classpath"], "foo.stubs.system.jar") {
1739 t.Errorf("baz javac classpath %v does not contain %q", bazJavac.Args["classpath"],
1740 "foo.stubs.system.jar")
1741 }
1742 // ... and not to the impl lib
Sundong Ahn054b19a2018-10-19 13:46:09 +09001743 if strings.Contains(bazJavac.Args["classpath"], "foo.jar") {
Jiyong Parkc678ad32018-04-10 13:07:10 +09001744 t.Errorf("baz javac classpath %v should not contain %q", bazJavac.Args["classpath"],
Sundong Ahn054b19a2018-10-19 13:46:09 +09001745 "foo.jar")
Jiyong Parkc678ad32018-04-10 13:07:10 +09001746 }
1747 // test if baz is not linked to the system variant of foo
1748 if strings.Contains(bazJavac.Args["classpath"], "foo.stubs.jar") {
1749 t.Errorf("baz javac classpath %v should not contain %q", bazJavac.Args["classpath"],
1750 "foo.stubs.jar")
1751 }
Jiyong Park1be96912018-05-28 18:02:19 +09001752
Paul Duffin726d23c2020-01-22 16:30:37 +00001753 bazTestJavac := ctx.ModuleForTests("baz-test", "android_common").Rule("javac")
1754 // tests if baz-test is actually linked to the test stubs lib
1755 if !strings.Contains(bazTestJavac.Args["classpath"], "foo.stubs.test.jar") {
1756 t.Errorf("baz-test javac classpath %v does not contain %q", bazTestJavac.Args["classpath"],
1757 "foo.stubs.test.jar")
1758 }
1759
Paul Duffina2db18f2020-01-22 17:11:15 +00001760 baz29Javac := ctx.ModuleForTests("baz-29", "android_common").Rule("javac")
1761 // tests if baz-29 is actually linked to the system 29 stubs lib
1762 if !strings.Contains(baz29Javac.Args["classpath"], "prebuilts/sdk/29/system/foo.jar") {
1763 t.Errorf("baz-29 javac classpath %v does not contain %q", baz29Javac.Args["classpath"],
1764 "prebuilts/sdk/29/system/foo.jar")
1765 }
1766
Paul Duffinfb6ae5b2020-09-30 15:17:25 +01001767 bazModule30Javac := ctx.ModuleForTests("baz-module-30", "android_common").Rule("javac")
1768 // tests if "baz-module-30" is actually linked to the module 30 stubs lib
1769 if !strings.Contains(bazModule30Javac.Args["classpath"], "prebuilts/sdk/30/module-lib/foo.jar") {
1770 t.Errorf("baz-module-30 javac classpath %v does not contain %q", bazModule30Javac.Args["classpath"],
1771 "prebuilts/sdk/30/module-lib/foo.jar")
1772 }
1773
Jiyong Park1be96912018-05-28 18:02:19 +09001774 // test if baz has exported SDK lib names foo and bar to qux
1775 qux := ctx.ModuleForTests("qux", "android_common")
1776 if quxLib, ok := qux.Module().(*Library); ok {
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +01001777 sdkLibs := quxLib.ClassLoaderContexts().UsesLibs()
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +00001778 if w := []string{"foo", "bar", "fred", "quuz"}; !reflect.DeepEqual(w, sdkLibs) {
Paul Duffin859fe962020-05-15 10:20:31 +01001779 t.Errorf("qux should export %q but exports %q", w, sdkLibs)
Jiyong Park1be96912018-05-28 18:02:19 +09001780 }
1781 }
Jiyong Parkc678ad32018-04-10 13:07:10 +09001782}
Zoran Jovanovic8736ce22018-08-21 17:10:29 +02001783
Anton Hansson7f66efa2020-10-08 14:47:23 +01001784func TestJavaSdkLibrary_StubOrImplOnlyLibs(t *testing.T) {
1785 ctx, _ := testJava(t, `
1786 java_sdk_library {
Anton Hanssondff2c782020-12-21 17:10:01 +00001787 name: "sdklib",
Anton Hansson7f66efa2020-10-08 14:47:23 +01001788 srcs: ["a.java"],
1789 impl_only_libs: ["foo"],
1790 stub_only_libs: ["bar"],
1791 }
1792 java_library {
1793 name: "foo",
1794 srcs: ["a.java"],
1795 sdk_version: "current",
1796 }
1797 java_library {
1798 name: "bar",
1799 srcs: ["a.java"],
1800 sdk_version: "current",
1801 }
1802 `)
1803
Anton Hanssondff2c782020-12-21 17:10:01 +00001804 for _, implName := range []string{"sdklib", "sdklib.impl"} {
Anton Hansson7f66efa2020-10-08 14:47:23 +01001805 implJavacCp := ctx.ModuleForTests(implName, "android_common").Rule("javac").Args["classpath"]
1806 if !strings.Contains(implJavacCp, "/foo.jar") || strings.Contains(implJavacCp, "/bar.jar") {
1807 t.Errorf("%v javac classpath %v does not contain foo and not bar", implName, implJavacCp)
1808 }
1809 }
Anton Hanssondff2c782020-12-21 17:10:01 +00001810 stubName := apiScopePublic.stubsLibraryModuleName("sdklib")
Anton Hansson7f66efa2020-10-08 14:47:23 +01001811 stubsJavacCp := ctx.ModuleForTests(stubName, "android_common").Rule("javac").Args["classpath"]
1812 if strings.Contains(stubsJavacCp, "/foo.jar") || !strings.Contains(stubsJavacCp, "/bar.jar") {
1813 t.Errorf("stubs javac classpath %v does not contain bar and not foo", stubsJavacCp)
1814 }
1815}
1816
Paul Duffindaaa3322020-05-26 18:13:57 +01001817func TestJavaSdkLibrary_DoNotAccessImplWhenItIsNotBuilt(t *testing.T) {
1818 ctx, _ := testJava(t, `
1819 java_sdk_library {
1820 name: "foo",
1821 srcs: ["a.java"],
1822 api_only: true,
1823 public: {
1824 enabled: true,
1825 },
1826 }
1827
1828 java_library {
1829 name: "bar",
1830 srcs: ["b.java"],
1831 libs: ["foo"],
1832 }
1833 `)
1834
1835 // The bar library should depend on the stubs jar.
1836 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
1837 if expected, actual := `^-classpath .*:/[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
1838 t.Errorf("expected %q, found %#q", expected, actual)
1839 }
1840}
1841
Paul Duffin46dc45a2020-05-14 15:39:10 +01001842func TestJavaSdkLibrary_UseSourcesFromAnotherSdkLibrary(t *testing.T) {
1843 testJava(t, `
1844 java_sdk_library {
1845 name: "foo",
1846 srcs: ["a.java"],
1847 api_packages: ["foo"],
1848 public: {
1849 enabled: true,
1850 },
1851 }
1852
1853 java_library {
1854 name: "bar",
1855 srcs: ["b.java", ":foo{.public.stubs.source}"],
1856 }
1857 `)
1858}
1859
1860func TestJavaSdkLibrary_AccessOutputFiles_MissingScope(t *testing.T) {
1861 testJavaError(t, `"foo" does not provide api scope system`, `
1862 java_sdk_library {
1863 name: "foo",
1864 srcs: ["a.java"],
1865 api_packages: ["foo"],
1866 public: {
1867 enabled: true,
1868 },
1869 }
1870
1871 java_library {
1872 name: "bar",
1873 srcs: ["b.java", ":foo{.system.stubs.source}"],
1874 }
1875 `)
1876}
1877
Paul Duffinca8d9a52020-06-26 22:20:25 +01001878func TestJavaSdkLibrary_Deps(t *testing.T) {
1879 ctx, _ := testJava(t, `
1880 java_sdk_library {
1881 name: "sdklib",
1882 srcs: ["a.java"],
1883 sdk_version: "none",
1884 system_modules: "none",
1885 public: {
1886 enabled: true,
1887 },
1888 }
1889 `)
1890
Paul Duffincee7e662020-07-09 17:32:57 +01001891 CheckModuleDependencies(t, ctx, "sdklib", "android_common", []string{
Paul Duffinca8d9a52020-06-26 22:20:25 +01001892 `dex2oatd`,
1893 `sdklib.impl`,
1894 `sdklib.stubs`,
1895 `sdklib.stubs.source`,
1896 `sdklib.xml`,
1897 })
1898}
1899
Paul Duffin46dc45a2020-05-14 15:39:10 +01001900func TestJavaSdkLibraryImport_AccessOutputFiles(t *testing.T) {
1901 testJava(t, `
1902 java_sdk_library_import {
1903 name: "foo",
1904 public: {
1905 jars: ["a.jar"],
1906 stub_srcs: ["a.java"],
1907 current_api: "api/current.txt",
1908 removed_api: "api/removed.txt",
1909 },
1910 }
1911
1912 java_library {
1913 name: "bar",
1914 srcs: [":foo{.public.stubs.source}"],
1915 java_resources: [
1916 ":foo{.public.api.txt}",
1917 ":foo{.public.removed-api.txt}",
1918 ],
1919 }
1920 `)
1921}
1922
1923func TestJavaSdkLibraryImport_AccessOutputFiles_Invalid(t *testing.T) {
1924 bp := `
1925 java_sdk_library_import {
1926 name: "foo",
1927 public: {
1928 jars: ["a.jar"],
1929 },
1930 }
1931 `
1932
1933 t.Run("stubs.source", func(t *testing.T) {
1934 testJavaError(t, `stubs.source not available for api scope public`, bp+`
1935 java_library {
1936 name: "bar",
1937 srcs: [":foo{.public.stubs.source}"],
1938 java_resources: [
1939 ":foo{.public.api.txt}",
1940 ":foo{.public.removed-api.txt}",
1941 ],
1942 }
1943 `)
1944 })
1945
1946 t.Run("api.txt", func(t *testing.T) {
1947 testJavaError(t, `api.txt not available for api scope public`, bp+`
1948 java_library {
1949 name: "bar",
1950 srcs: ["a.java"],
1951 java_resources: [
1952 ":foo{.public.api.txt}",
1953 ],
1954 }
1955 `)
1956 })
1957
1958 t.Run("removed-api.txt", func(t *testing.T) {
1959 testJavaError(t, `removed-api.txt not available for api scope public`, bp+`
1960 java_library {
1961 name: "bar",
1962 srcs: ["a.java"],
1963 java_resources: [
1964 ":foo{.public.removed-api.txt}",
1965 ],
1966 }
1967 `)
1968 })
1969}
1970
Paul Duffin3375e352020-04-28 10:44:03 +01001971func TestJavaSdkLibrary_InvalidScopes(t *testing.T) {
1972 testJavaError(t, `module "foo": enabled api scope "system" depends on disabled scope "public"`, `
1973 java_sdk_library {
1974 name: "foo",
1975 srcs: ["a.java", "b.java"],
1976 api_packages: ["foo"],
1977 // Explicitly disable public to test the check that ensures the set of enabled
1978 // scopes is consistent.
1979 public: {
1980 enabled: false,
1981 },
1982 system: {
1983 enabled: true,
1984 },
1985 }
1986 `)
1987}
1988
Paul Duffin87a05a32020-05-12 11:50:28 +01001989func TestJavaSdkLibrary_SdkVersion_ForScope(t *testing.T) {
1990 testJava(t, `
1991 java_sdk_library {
1992 name: "foo",
1993 srcs: ["a.java", "b.java"],
1994 api_packages: ["foo"],
1995 system: {
1996 enabled: true,
1997 sdk_version: "module_current",
1998 },
1999 }
2000 `)
2001}
2002
Paul Duffin0c5bae52020-06-02 13:00:08 +01002003func TestJavaSdkLibrary_ModuleLib(t *testing.T) {
2004 testJava(t, `
2005 java_sdk_library {
2006 name: "foo",
2007 srcs: ["a.java", "b.java"],
2008 api_packages: ["foo"],
2009 system: {
2010 enabled: true,
2011 },
2012 module_lib: {
2013 enabled: true,
2014 },
2015 }
2016 `)
2017}
2018
2019func TestJavaSdkLibrary_SystemServer(t *testing.T) {
2020 testJava(t, `
2021 java_sdk_library {
2022 name: "foo",
2023 srcs: ["a.java", "b.java"],
2024 api_packages: ["foo"],
2025 system: {
2026 enabled: true,
2027 },
2028 system_server: {
2029 enabled: true,
2030 },
2031 }
2032 `)
2033}
2034
Paul Duffin803a9562020-05-20 11:52:25 +01002035func TestJavaSdkLibrary_MissingScope(t *testing.T) {
2036 testJavaError(t, `requires api scope module-lib from foo but it only has \[\] available`, `
2037 java_sdk_library {
2038 name: "foo",
2039 srcs: ["a.java"],
2040 public: {
2041 enabled: false,
2042 },
2043 }
2044
2045 java_library {
2046 name: "baz",
2047 srcs: ["a.java"],
2048 libs: ["foo"],
2049 sdk_version: "module_current",
2050 }
2051 `)
2052}
2053
2054func TestJavaSdkLibrary_FallbackScope(t *testing.T) {
2055 testJava(t, `
2056 java_sdk_library {
2057 name: "foo",
2058 srcs: ["a.java"],
2059 system: {
2060 enabled: true,
2061 },
2062 }
2063
2064 java_library {
2065 name: "baz",
2066 srcs: ["a.java"],
2067 libs: ["foo"],
2068 // foo does not have module-lib scope so it should fallback to system
2069 sdk_version: "module_current",
2070 }
2071 `)
2072}
2073
Jiyong Park932cdfe2020-05-28 00:19:53 +09002074func TestJavaSdkLibrary_DefaultToStubs(t *testing.T) {
2075 ctx, _ := testJava(t, `
2076 java_sdk_library {
2077 name: "foo",
2078 srcs: ["a.java"],
2079 system: {
2080 enabled: true,
2081 },
2082 default_to_stubs: true,
2083 }
2084
2085 java_library {
2086 name: "baz",
2087 srcs: ["a.java"],
2088 libs: ["foo"],
2089 // does not have sdk_version set, should fallback to module,
2090 // which will then fallback to system because the module scope
2091 // is not enabled.
2092 }
2093 `)
2094 // The baz library should depend on the system stubs jar.
2095 bazLibrary := ctx.ModuleForTests("baz", "android_common").Rule("javac")
2096 if expected, actual := `^-classpath .*:/[^:]*/turbine-combined/foo\.stubs.system\.jar$`, bazLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
2097 t.Errorf("expected %q, found %#q", expected, actual)
2098 }
2099}
2100
Zoran Jovanovic8736ce22018-08-21 17:10:29 +02002101var compilerFlagsTestCases = []struct {
2102 in string
2103 out bool
2104}{
2105 {
2106 in: "a",
2107 out: false,
2108 },
2109 {
2110 in: "-a",
2111 out: true,
2112 },
2113 {
2114 in: "-no-jdk",
2115 out: false,
2116 },
2117 {
2118 in: "-no-stdlib",
2119 out: false,
2120 },
2121 {
2122 in: "-kotlin-home",
2123 out: false,
2124 },
2125 {
2126 in: "-kotlin-home /some/path",
2127 out: false,
2128 },
2129 {
2130 in: "-include-runtime",
2131 out: false,
2132 },
2133 {
2134 in: "-Xintellij-plugin-root",
2135 out: false,
2136 },
2137}
2138
2139type mockContext struct {
2140 android.ModuleContext
2141 result bool
2142}
2143
2144func (ctx *mockContext) PropertyErrorf(property, format string, args ...interface{}) {
2145 // CheckBadCompilerFlags calls this function when the flag should be rejected
2146 ctx.result = false
2147}
2148
2149func TestCompilerFlags(t *testing.T) {
2150 for _, testCase := range compilerFlagsTestCases {
2151 ctx := &mockContext{result: true}
2152 CheckKotlincFlags(ctx, []string{testCase.in})
2153 if ctx.result != testCase.out {
2154 t.Errorf("incorrect output:")
2155 t.Errorf(" input: %#v", testCase.in)
2156 t.Errorf(" expected: %#v", testCase.out)
2157 t.Errorf(" got: %#v", ctx.result)
2158 }
2159 }
2160}
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08002161
2162// TODO(jungjw): Consider making this more robust by ignoring path order.
2163func checkPatchModuleFlag(t *testing.T, ctx *android.TestContext, moduleName string, expected string) {
2164 variables := ctx.ModuleForTests(moduleName, "android_common").Module().VariablesForTests()
2165 flags := strings.Split(variables["javacFlags"], " ")
2166 got := ""
2167 for _, flag := range flags {
2168 keyEnd := strings.Index(flag, "=")
2169 if keyEnd > -1 && flag[:keyEnd] == "--patch-module" {
2170 got = flag[keyEnd+1:]
2171 break
2172 }
2173 }
2174 if expected != got {
2175 t.Errorf("Unexpected patch-module flag for module %q - expected %q, but got %q", moduleName, expected, got)
2176 }
2177}
2178
2179func TestPatchModule(t *testing.T) {
Pete Gillin0c2143e2019-05-02 15:32:11 +01002180 t.Run("Java language level 8", func(t *testing.T) {
Pete Gillin1b3370f2019-10-01 13:57:31 +01002181 // Test with legacy javac -source 1.8 -target 1.8
Pete Gillinbdf5d712019-10-21 14:29:58 +01002182 bp := `
2183 java_library {
2184 name: "foo",
2185 srcs: ["a.java"],
2186 java_version: "1.8",
2187 }
2188
2189 java_library {
2190 name: "bar",
2191 srcs: ["b.java"],
2192 sdk_version: "none",
2193 system_modules: "none",
2194 patch_module: "java.base",
2195 java_version: "1.8",
2196 }
2197
2198 java_library {
2199 name: "baz",
2200 srcs: ["c.java"],
2201 patch_module: "java.base",
2202 java_version: "1.8",
2203 }
2204 `
2205 ctx, _ := testJava(t, bp)
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08002206
2207 checkPatchModuleFlag(t, ctx, "foo", "")
2208 checkPatchModuleFlag(t, ctx, "bar", "")
2209 checkPatchModuleFlag(t, ctx, "baz", "")
2210 })
2211
Pete Gillin0c2143e2019-05-02 15:32:11 +01002212 t.Run("Java language level 9", func(t *testing.T) {
Pete Gillin1b3370f2019-10-01 13:57:31 +01002213 // Test with default javac -source 9 -target 9
Pete Gillinbdf5d712019-10-21 14:29:58 +01002214 bp := `
2215 java_library {
2216 name: "foo",
2217 srcs: ["a.java"],
2218 }
2219
2220 java_library {
2221 name: "bar",
2222 srcs: ["b.java"],
2223 sdk_version: "none",
2224 system_modules: "none",
2225 patch_module: "java.base",
2226 }
2227
2228 java_library {
2229 name: "baz",
Jingwen Chen5136a6e2020-10-30 01:01:35 -04002230 srcs: [
2231 "c.java",
2232 // Tests for b/150878007
2233 "dir/d.java",
2234 "dir2/e.java",
2235 "dir2/f.java",
2236 "nested/dir/g.java"
2237 ],
Pete Gillinbdf5d712019-10-21 14:29:58 +01002238 patch_module: "java.base",
2239 }
2240 `
Pete Gillin1b3370f2019-10-01 13:57:31 +01002241 ctx, _ := testJava(t, bp)
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08002242
2243 checkPatchModuleFlag(t, ctx, "foo", "")
2244 expected := "java.base=.:" + buildDir
2245 checkPatchModuleFlag(t, ctx, "bar", expected)
Jingwen Chen5136a6e2020-10-30 01:01:35 -04002246 expected = "java.base=" + strings.Join([]string{
2247 ".", buildDir, "dir", "dir2", "nested", moduleToPath("ext"), moduleToPath("framework")}, ":")
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08002248 checkPatchModuleFlag(t, ctx, "baz", expected)
2249 })
2250}
Paul Duffina7b9f422020-01-10 17:12:18 +00002251
2252func TestJavaSystemModules(t *testing.T) {
2253 ctx, _ := testJava(t, `
2254 java_system_modules {
2255 name: "system-modules",
2256 libs: ["system-module1", "system-module2"],
2257 }
2258 java_library {
2259 name: "system-module1",
2260 srcs: ["a.java"],
2261 sdk_version: "none",
2262 system_modules: "none",
2263 }
2264 java_library {
2265 name: "system-module2",
2266 srcs: ["b.java"],
2267 sdk_version: "none",
2268 system_modules: "none",
2269 }
2270 `)
2271
2272 // check the existence of the module
2273 systemModules := ctx.ModuleForTests("system-modules", "android_common")
2274
2275 cmd := systemModules.Rule("jarsTosystemModules")
2276
2277 // make sure the command compiles against the supplied modules.
2278 for _, module := range []string{"system-module1.jar", "system-module2.jar"} {
2279 if !strings.Contains(cmd.Args["classpath"], module) {
2280 t.Errorf("system modules classpath %v does not contain %q", cmd.Args["classpath"],
2281 module)
2282 }
2283 }
2284}
Paul Duffin90169ba2020-01-10 17:16:44 +00002285
2286func TestJavaSystemModulesImport(t *testing.T) {
2287 ctx, _ := testJava(t, `
2288 java_system_modules_import {
2289 name: "system-modules",
2290 libs: ["system-module1", "system-module2"],
2291 }
2292 java_import {
2293 name: "system-module1",
2294 jars: ["a.jar"],
2295 }
2296 java_import {
2297 name: "system-module2",
2298 jars: ["b.jar"],
2299 }
2300 `)
2301
2302 // check the existence of the module
2303 systemModules := ctx.ModuleForTests("system-modules", "android_common")
2304
2305 cmd := systemModules.Rule("jarsTosystemModules")
2306
2307 // make sure the command compiles against the supplied modules.
2308 for _, module := range []string{"system-module1.jar", "system-module2.jar"} {
2309 if !strings.Contains(cmd.Args["classpath"], module) {
2310 t.Errorf("system modules classpath %v does not contain %q", cmd.Args["classpath"],
2311 module)
2312 }
2313 }
2314}
Paul Duffin83a2d962019-11-19 19:44:10 +00002315
2316func TestJavaLibraryWithSystemModules(t *testing.T) {
2317 ctx, _ := testJava(t, `
2318 java_library {
2319 name: "lib-with-source-system-modules",
2320 srcs: [
2321 "a.java",
2322 ],
2323 sdk_version: "none",
2324 system_modules: "source-system-modules",
2325 }
2326
2327 java_library {
2328 name: "source-jar",
2329 srcs: [
2330 "a.java",
2331 ],
2332 }
2333
2334 java_system_modules {
2335 name: "source-system-modules",
2336 libs: ["source-jar"],
2337 }
2338
2339 java_library {
2340 name: "lib-with-prebuilt-system-modules",
2341 srcs: [
2342 "a.java",
2343 ],
2344 sdk_version: "none",
2345 system_modules: "prebuilt-system-modules",
2346 }
2347
2348 java_import {
2349 name: "prebuilt-jar",
2350 jars: ["a.jar"],
2351 }
2352
2353 java_system_modules_import {
2354 name: "prebuilt-system-modules",
2355 libs: ["prebuilt-jar"],
2356 }
2357 `)
2358
2359 checkBootClasspathForSystemModule(t, ctx, "lib-with-source-system-modules", "/source-jar.jar")
2360
2361 checkBootClasspathForSystemModule(t, ctx, "lib-with-prebuilt-system-modules", "/prebuilt-jar.jar")
2362}
2363
2364func checkBootClasspathForSystemModule(t *testing.T, ctx *android.TestContext, moduleName string, expectedSuffix string) {
2365 javacRule := ctx.ModuleForTests(moduleName, "android_common").Rule("javac")
2366 bootClasspath := javacRule.Args["bootClasspath"]
2367 if strings.HasPrefix(bootClasspath, "--system ") && strings.HasSuffix(bootClasspath, expectedSuffix) {
2368 t.Errorf("bootclasspath of %q must start with --system and end with %q, but was %#v.", moduleName, expectedSuffix, bootClasspath)
2369 }
2370}
Jiyong Park19604de2020-03-24 16:44:11 +09002371
2372func TestAidlExportIncludeDirsFromImports(t *testing.T) {
2373 ctx, _ := testJava(t, `
2374 java_library {
2375 name: "foo",
2376 srcs: ["aidl/foo/IFoo.aidl"],
2377 libs: ["bar"],
2378 }
2379
2380 java_import {
2381 name: "bar",
2382 jars: ["a.jar"],
2383 aidl: {
2384 export_include_dirs: ["aidl/bar"],
2385 },
2386 }
2387 `)
2388
2389 aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
2390 expectedAidlFlag := "-Iaidl/bar"
2391 if !strings.Contains(aidlCommand, expectedAidlFlag) {
2392 t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
2393 }
2394}
Liz Kammerdd849a82020-06-12 16:38:45 -07002395
Jooyung Hane197d8b2021-01-05 10:33:16 +09002396func TestAidlFlagsArePassedToTheAidlCompiler(t *testing.T) {
2397 ctx, _ := testJava(t, `
2398 java_library {
2399 name: "foo",
2400 srcs: ["aidl/foo/IFoo.aidl"],
2401 aidl: { flags: ["-Werror"], },
2402 }
2403 `)
2404
2405 aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
2406 expectedAidlFlag := "-Werror"
2407 if !strings.Contains(aidlCommand, expectedAidlFlag) {
2408 t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
2409 }
2410}
2411
Liz Kammerdd849a82020-06-12 16:38:45 -07002412func TestDataNativeBinaries(t *testing.T) {
2413 ctx, config := testJava(t, `
2414 java_test_host {
2415 name: "foo",
2416 srcs: ["a.java"],
2417 data_native_bins: ["bin"]
2418 }
2419
2420 python_binary_host {
2421 name: "bin",
2422 srcs: ["bin.py"],
2423 }
2424 `)
2425
2426 buildOS := android.BuildOs.String()
2427
2428 test := ctx.ModuleForTests("foo", buildOS+"_common").Module().(*TestHost)
2429 entries := android.AndroidMkEntriesForTest(t, config, "", test)[0]
2430 expected := []string{buildDir + "/.intermediates/bin/" + buildOS + "_x86_64_PY3/bin:bin"}
2431 actual := entries.EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
2432 if !reflect.DeepEqual(expected, actual) {
2433 t.Errorf("Unexpected test data - expected: %q, actual: %q", expected, actual)
2434 }
2435}