blob: de5c55cd31aee2378006c45362a83270b421f534 [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
Martin Stjernholm75a48d82020-01-10 20:32:59 +000064 config := TestConfig(buildDir, env, bp, fs)
65
66 // Set up the global Once cache used for dexpreopt.GlobalSoongConfig, so that
67 // it doesn't create a real one, which would fail.
68 _ = dexpreopt.GlobalSoongConfigForTests(config)
69
70 return config
Colin Cross1369cdb2017-09-29 17:58:17 -070071}
72
Colin Crossae8600b2020-10-29 17:09:13 -070073func testContext(config android.Config) *android.TestContext {
Colin Cross72bb3632017-07-13 16:23:21 -070074
Colin Crossae8600b2020-10-29 17:09:13 -070075 ctx := android.NewTestArchContext(config)
Paul Duffinf9b1da02019-12-18 19:51:55 +000076 RegisterJavaBuildComponents(ctx)
77 RegisterAppBuildComponents(ctx)
Jaewoong Jungf9b44652020-12-21 12:29:12 -080078 RegisterAppImportBuildComponents(ctx)
79 RegisterAppSetBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +000080 RegisterAARBuildComponents(ctx)
Paul Duffinb0f85072019-12-19 10:28:56 +000081 RegisterGenRuleBuildComponents(ctx)
Jaewoong Jungf9b44652020-12-21 12:29:12 -080082 RegisterRuntimeResourceOverlayBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +000083 RegisterSystemModulesBuildComponents(ctx)
Colin Cross4b49b762019-11-22 15:25:03 -080084 ctx.RegisterModuleType("java_plugin", PluginFactory)
Colin Cross4b49b762019-11-22 15:25:03 -080085 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Liz Kammerdd849a82020-06-12 16:38:45 -070086 ctx.RegisterModuleType("python_binary_host", python.PythonBinaryHostFactory)
Paul Duffin884363e2019-12-19 10:21:09 +000087 RegisterDocsBuildComponents(ctx)
88 RegisterStubsBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +000089 RegisterSdkLibraryBuildComponents(ctx)
Colin Cross89536d42017-07-07 14:35:50 -070090 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin44f1d842020-06-26 20:17:02 +010091 ctx.PreArchMutators(android.RegisterComponentsMutator)
Paul Duffina48f7582019-12-19 11:25:19 +000092
93 RegisterPrebuiltApisBuildComponents(ctx)
94
Liz Kammerdd849a82020-06-12 16:38:45 -070095 ctx.PreDepsMutators(python.RegisterPythonPreDepsMutators)
Jaewoong Jungb639a6a2019-05-10 15:16:29 -070096 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
Colin Cross06fa5882020-10-29 18:21:38 -070097 ctx.RegisterPreSingletonType("overlay", android.SingletonFactoryAdaptor(ctx.Context, OverlaySingletonFactory))
98 ctx.RegisterPreSingletonType("sdk_versions", android.SingletonFactoryAdaptor(ctx.Context, sdkPreSingletonFactory))
Colin Crossa4f08812018-10-02 22:03:40 -070099
Paul Duffin021f4e52020-07-30 16:04:17 +0100100 android.RegisterPrebuiltMutators(ctx)
101
Colin Crossa4f08812018-10-02 22:03:40 -0700102 // Register module types and mutators from cc needed for JNI testing
Paul Duffin77980a82019-12-19 16:01:36 +0000103 cc.RegisterRequiredBuildComponentsForTest(ctx)
Colin Crossa4f08812018-10-02 22:03:40 -0700104
Martin Stjernholmd90676f2020-01-11 00:37:30 +0000105 dexpreopt.RegisterToolModulesForTest(ctx)
106
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700107 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
108 ctx.TopDown("propagate_rro_enforcement", propagateRROEnforcementMutator).Parallel()
109 })
110
Colin Cross527012a2017-11-30 22:56:16 -0800111 return ctx
112}
113
114func run(t *testing.T, ctx *android.TestContext, config android.Config) {
Colin Cross6b4a32d2017-12-05 13:42:45 -0800115 t.Helper()
Colin Crossc28bb0b2019-02-25 14:20:47 -0800116
Colin Cross98be1bb2019-12-13 20:41:13 -0800117 pathCtx := android.PathContextForTesting(config)
Martin Stjernholm40f9f3c2020-01-20 18:12:23 +0000118 dexpreopt.SetTestGlobalConfig(config, dexpreopt.GlobalConfigForTests(pathCtx))
Colin Crossc28bb0b2019-02-25 14:20:47 -0800119
Colin Crossae8600b2020-10-29 17:09:13 -0700120 ctx.Register()
Paul Duffinbaccf7e2019-06-11 11:58:30 +0100121 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
Logan Chien42039712018-03-12 16:29:17 +0800122 android.FailIfErrored(t, errs)
Colin Cross72bb3632017-07-13 16:23:21 -0700123 _, errs = ctx.PrepareBuildActions(config)
Logan Chien42039712018-03-12 16:29:17 +0800124 android.FailIfErrored(t, errs)
Colin Cross527012a2017-11-30 22:56:16 -0800125}
126
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900127func testJavaError(t *testing.T, pattern string, bp string) (*android.TestContext, android.Config) {
Jeongik Cha538c0d02019-07-11 15:54:27 +0900128 t.Helper()
Colin Cross98be1bb2019-12-13 20:41:13 -0800129 return testJavaErrorWithConfig(t, pattern, testConfig(nil, bp, nil))
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900130}
131
Colin Cross98be1bb2019-12-13 20:41:13 -0800132func testJavaErrorWithConfig(t *testing.T, pattern string, config android.Config) (*android.TestContext, android.Config) {
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900133 t.Helper()
Colin Crossae8600b2020-10-29 17:09:13 -0700134 ctx := testContext(config)
Jeongik Cha538c0d02019-07-11 15:54:27 +0900135
Colin Cross98be1bb2019-12-13 20:41:13 -0800136 pathCtx := android.PathContextForTesting(config)
Martin Stjernholm40f9f3c2020-01-20 18:12:23 +0000137 dexpreopt.SetTestGlobalConfig(config, dexpreopt.GlobalConfigForTests(pathCtx))
Jeongik Cha538c0d02019-07-11 15:54:27 +0900138
Colin Crossae8600b2020-10-29 17:09:13 -0700139 ctx.Register()
Jeongik Cha538c0d02019-07-11 15:54:27 +0900140 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
141 if len(errs) > 0 {
142 android.FailIfNoMatchingErrors(t, pattern, errs)
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900143 return ctx, config
Jeongik Cha538c0d02019-07-11 15:54:27 +0900144 }
145 _, errs = ctx.PrepareBuildActions(config)
146 if len(errs) > 0 {
147 android.FailIfNoMatchingErrors(t, pattern, errs)
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900148 return ctx, config
Jeongik Cha538c0d02019-07-11 15:54:27 +0900149 }
150
151 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900152
153 return ctx, config
Jeongik Cha538c0d02019-07-11 15:54:27 +0900154}
155
Colin Cross238c1f32020-06-07 16:58:18 -0700156func testJavaWithFS(t *testing.T, bp string, fs map[string][]byte) (*android.TestContext, android.Config) {
157 t.Helper()
158 return testJavaWithConfig(t, testConfig(nil, bp, fs))
159}
160
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700161func testJava(t *testing.T, bp string) (*android.TestContext, android.Config) {
Colin Cross6b4a32d2017-12-05 13:42:45 -0800162 t.Helper()
Colin Cross238c1f32020-06-07 16:58:18 -0700163 return testJavaWithFS(t, bp, nil)
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900164}
165
Colin Cross98be1bb2019-12-13 20:41:13 -0800166func testJavaWithConfig(t *testing.T, config android.Config) (*android.TestContext, android.Config) {
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900167 t.Helper()
Colin Crossae8600b2020-10-29 17:09:13 -0700168 ctx := testContext(config)
Colin Cross527012a2017-11-30 22:56:16 -0800169 run(t, ctx, config)
Colin Cross72bb3632017-07-13 16:23:21 -0700170
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700171 return ctx, config
Colin Cross72bb3632017-07-13 16:23:21 -0700172}
173
Colin Cross2acdae82017-09-15 19:44:24 -0700174func moduleToPath(name string) string {
175 switch {
176 case name == `""`:
177 return name
Colin Crossfc3674a2017-09-18 17:41:52 -0700178 case strings.HasSuffix(name, ".jar"):
179 return name
Nan Zhanged19fc32017-10-19 13:06:22 -0700180 default:
181 return filepath.Join(buildDir, ".intermediates", name, "android_common", "turbine-combined", name+".jar")
Colin Cross2acdae82017-09-15 19:44:24 -0700182 }
183}
184
Jeongik Chae403e9e2019-12-07 00:16:24 +0900185func TestJavaLinkType(t *testing.T) {
186 testJava(t, `
187 java_library {
188 name: "foo",
189 srcs: ["a.java"],
190 libs: ["bar"],
191 static_libs: ["baz"],
192 }
193
194 java_library {
195 name: "bar",
196 sdk_version: "current",
197 srcs: ["b.java"],
198 }
199
200 java_library {
201 name: "baz",
202 sdk_version: "system_current",
203 srcs: ["c.java"],
204 }
205 `)
206
Steven Moreland00298982020-11-17 21:44:36 +0000207 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900208 java_library {
209 name: "foo",
210 srcs: ["a.java"],
211 libs: ["bar"],
212 sdk_version: "current",
213 static_libs: ["baz"],
214 }
215
216 java_library {
217 name: "bar",
218 sdk_version: "current",
219 srcs: ["b.java"],
220 }
221
222 java_library {
223 name: "baz",
224 sdk_version: "system_current",
225 srcs: ["c.java"],
226 }
227 `)
228
229 testJava(t, `
230 java_library {
231 name: "foo",
232 srcs: ["a.java"],
233 libs: ["bar"],
234 sdk_version: "system_current",
235 static_libs: ["baz"],
236 }
237
238 java_library {
239 name: "bar",
240 sdk_version: "current",
241 srcs: ["b.java"],
242 }
243
244 java_library {
245 name: "baz",
246 sdk_version: "system_current",
247 srcs: ["c.java"],
248 }
249 `)
250
Steven Moreland00298982020-11-17 21:44:36 +0000251 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900252 java_library {
253 name: "foo",
254 srcs: ["a.java"],
255 libs: ["bar"],
256 sdk_version: "system_current",
257 static_libs: ["baz"],
258 }
259
260 java_library {
261 name: "bar",
262 sdk_version: "current",
263 srcs: ["b.java"],
264 }
265
266 java_library {
267 name: "baz",
268 srcs: ["c.java"],
269 }
270 `)
271}
272
Colin Cross72bb3632017-07-13 16:23:21 -0700273func TestSimple(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700274 ctx, _ := testJava(t, `
Colin Cross72bb3632017-07-13 16:23:21 -0700275 java_library {
276 name: "foo",
277 srcs: ["a.java"],
Colin Crosse8dc34a2017-07-19 11:22:16 -0700278 libs: ["bar"],
279 static_libs: ["baz"],
Colin Cross72bb3632017-07-13 16:23:21 -0700280 }
281
282 java_library {
283 name: "bar",
284 srcs: ["b.java"],
285 }
286
287 java_library {
288 name: "baz",
289 srcs: ["c.java"],
290 }
Colin Crossd5934c82017-10-02 13:55:26 -0700291 `)
Colin Cross72bb3632017-07-13 16:23:21 -0700292
Colin Cross4c428df2017-09-15 17:36:05 -0700293 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
Nan Zhanged19fc32017-10-19 13:06:22 -0700294 combineJar := ctx.ModuleForTests("foo", "android_common").Description("for javac")
Colin Cross72bb3632017-07-13 16:23:21 -0700295
296 if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "a.java" {
297 t.Errorf(`foo inputs %v != ["a.java"]`, javac.Inputs)
298 }
299
Colin Cross1ee23172017-10-18 14:44:18 -0700300 baz := ctx.ModuleForTests("baz", "android_common").Rule("javac").Output.String()
Nan Zhanged19fc32017-10-19 13:06:22 -0700301 barTurbine := filepath.Join(buildDir, ".intermediates", "bar", "android_common", "turbine-combined", "bar.jar")
302 bazTurbine := filepath.Join(buildDir, ".intermediates", "baz", "android_common", "turbine-combined", "baz.jar")
Colin Cross0a6e0072017-08-30 14:24:55 -0700303
Nan Zhanged19fc32017-10-19 13:06:22 -0700304 if !strings.Contains(javac.Args["classpath"], barTurbine) {
305 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
Colin Cross72bb3632017-07-13 16:23:21 -0700306 }
307
Nan Zhanged19fc32017-10-19 13:06:22 -0700308 if !strings.Contains(javac.Args["classpath"], bazTurbine) {
309 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], bazTurbine)
Colin Cross0a6e0072017-08-30 14:24:55 -0700310 }
311
312 if len(combineJar.Inputs) != 2 || combineJar.Inputs[1].String() != baz {
313 t.Errorf("foo combineJar inputs %v does not contain %q", combineJar.Inputs, baz)
Colin Cross72bb3632017-07-13 16:23:21 -0700314 }
315}
316
Artur Satayev9cf46692019-11-26 18:08:34 +0000317func TestExportedPlugins(t *testing.T) {
318 type Result struct {
Colin Crossc9fe10f2020-11-19 18:06:03 -0800319 library string
320 processors string
321 disableTurbine bool
Artur Satayev9cf46692019-11-26 18:08:34 +0000322 }
323 var tests = []struct {
324 name string
325 extra string
326 results []Result
327 }{
328 {
329 name: "Exported plugin is not a direct plugin",
330 extra: `java_library { name: "exports", srcs: ["a.java"], exported_plugins: ["plugin"] }`,
331 results: []Result{{library: "exports", processors: "-proc:none"}},
332 },
333 {
334 name: "Exports plugin to dependee",
335 extra: `
336 java_library{name: "exports", exported_plugins: ["plugin"]}
337 java_library{name: "foo", srcs: ["a.java"], libs: ["exports"]}
338 java_library{name: "bar", srcs: ["a.java"], static_libs: ["exports"]}
339 `,
340 results: []Result{
341 {library: "foo", processors: "-processor com.android.TestPlugin"},
342 {library: "bar", processors: "-processor com.android.TestPlugin"},
343 },
344 },
345 {
346 name: "Exports plugin to android_library",
347 extra: `
348 java_library{name: "exports", exported_plugins: ["plugin"]}
349 android_library{name: "foo", srcs: ["a.java"], libs: ["exports"]}
350 android_library{name: "bar", srcs: ["a.java"], static_libs: ["exports"]}
351 `,
352 results: []Result{
353 {library: "foo", processors: "-processor com.android.TestPlugin"},
354 {library: "bar", processors: "-processor com.android.TestPlugin"},
355 },
356 },
357 {
358 name: "Exports plugin is not propagated via transitive deps",
359 extra: `
360 java_library{name: "exports", exported_plugins: ["plugin"]}
361 java_library{name: "foo", srcs: ["a.java"], libs: ["exports"]}
362 java_library{name: "bar", srcs: ["a.java"], static_libs: ["foo"]}
363 `,
364 results: []Result{
365 {library: "foo", processors: "-processor com.android.TestPlugin"},
366 {library: "bar", processors: "-proc:none"},
367 },
368 },
369 {
370 name: "Exports plugin appends to plugins",
371 extra: `
372 java_plugin{name: "plugin2", processor_class: "com.android.TestPlugin2"}
373 java_library{name: "exports", exported_plugins: ["plugin"]}
374 java_library{name: "foo", srcs: ["a.java"], libs: ["exports"], plugins: ["plugin2"]}
375 `,
376 results: []Result{
377 {library: "foo", processors: "-processor com.android.TestPlugin,com.android.TestPlugin2"},
378 },
379 },
Colin Crossc9fe10f2020-11-19 18:06:03 -0800380 {
381 name: "Exports plugin to with generates_api to dependee",
382 extra: `
383 java_library{name: "exports", exported_plugins: ["plugin_generates_api"]}
384 java_library{name: "foo", srcs: ["a.java"], libs: ["exports"]}
385 java_library{name: "bar", srcs: ["a.java"], static_libs: ["exports"]}
386 `,
387 results: []Result{
388 {library: "foo", processors: "-processor com.android.TestPlugin", disableTurbine: true},
389 {library: "bar", processors: "-processor com.android.TestPlugin", disableTurbine: true},
390 },
391 },
Artur Satayev9cf46692019-11-26 18:08:34 +0000392 }
393
394 for _, test := range tests {
395 t.Run(test.name, func(t *testing.T) {
396 ctx, _ := testJava(t, `
397 java_plugin {
398 name: "plugin",
399 processor_class: "com.android.TestPlugin",
400 }
Colin Crossc9fe10f2020-11-19 18:06:03 -0800401 java_plugin {
402 name: "plugin_generates_api",
403 generates_api: true,
404 processor_class: "com.android.TestPlugin",
405 }
Artur Satayev9cf46692019-11-26 18:08:34 +0000406 `+test.extra)
407
408 for _, want := range test.results {
409 javac := ctx.ModuleForTests(want.library, "android_common").Rule("javac")
410 if javac.Args["processor"] != want.processors {
411 t.Errorf("For library %v, expected %v, found %v", want.library, want.processors, javac.Args["processor"])
412 }
Colin Crossc9fe10f2020-11-19 18:06:03 -0800413 turbine := ctx.ModuleForTests(want.library, "android_common").MaybeRule("turbine")
414 disableTurbine := turbine.BuildParams.Rule == nil
415 if disableTurbine != want.disableTurbine {
416 t.Errorf("For library %v, expected disableTurbine %v, found %v", want.library, want.disableTurbine, disableTurbine)
417 }
Artur Satayev9cf46692019-11-26 18:08:34 +0000418 }
419 })
420 }
421}
422
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900423func TestSdkVersionByPartition(t *testing.T) {
424 testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
Jeongik Cha6bd33c12019-06-25 16:26:18 +0900425 java_library {
426 name: "foo",
427 srcs: ["a.java"],
428 vendor: true,
429 }
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900430 `)
Jeongik Cha6bd33c12019-06-25 16:26:18 +0900431
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900432 testJava(t, `
Jeongik Cha6bd33c12019-06-25 16:26:18 +0900433 java_library {
434 name: "bar",
435 srcs: ["b.java"],
436 }
437 `)
438
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900439 for _, enforce := range []bool{true, false} {
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900440 bp := `
441 java_library {
442 name: "foo",
443 srcs: ["a.java"],
444 product_specific: true,
445 }
446 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800447
448 config := testConfig(nil, bp, nil)
449 config.TestProductVariables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900450 if enforce {
Colin Cross98be1bb2019-12-13 20:41:13 -0800451 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 +0900452 } else {
Colin Cross98be1bb2019-12-13 20:41:13 -0800453 testJavaWithConfig(t, config)
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900454 }
Jeongik Cha6bd33c12019-06-25 16:26:18 +0900455 }
456}
457
Colin Crossd5934c82017-10-02 13:55:26 -0700458func TestArchSpecific(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700459 ctx, _ := testJava(t, `
Colin Crossd5934c82017-10-02 13:55:26 -0700460 java_library {
461 name: "foo",
462 srcs: ["a.java"],
463 target: {
464 android: {
465 srcs: ["b.java"],
466 },
467 },
468 }
469 `)
470
471 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
472 if len(javac.Inputs) != 2 || javac.Inputs[0].String() != "a.java" || javac.Inputs[1].String() != "b.java" {
473 t.Errorf(`foo inputs %v != ["a.java", "b.java"]`, javac.Inputs)
474 }
475}
476
Colin Cross6b4a32d2017-12-05 13:42:45 -0800477func TestBinary(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700478 ctx, _ := testJava(t, `
Colin Cross6b4a32d2017-12-05 13:42:45 -0800479 java_library_host {
480 name: "foo",
481 srcs: ["a.java"],
482 }
483
484 java_binary_host {
485 name: "bar",
486 srcs: ["b.java"],
487 static_libs: ["foo"],
Colin Cross89226d92020-10-09 19:00:54 -0700488 jni_libs: ["libjni"],
489 }
490
491 cc_library_shared {
492 name: "libjni",
493 host_supported: true,
494 device_supported: false,
495 stl: "none",
Colin Cross6b4a32d2017-12-05 13:42:45 -0800496 }
497 `)
498
499 buildOS := android.BuildOs.String()
500
501 bar := ctx.ModuleForTests("bar", buildOS+"_common")
502 barJar := bar.Output("bar.jar").Output.String()
503 barWrapper := ctx.ModuleForTests("bar", buildOS+"_x86_64")
504 barWrapperDeps := barWrapper.Output("bar").Implicits.Strings()
505
Colin Cross89226d92020-10-09 19:00:54 -0700506 libjni := ctx.ModuleForTests("libjni", buildOS+"_x86_64_shared")
507 libjniSO := libjni.Rule("Cp").Output.String()
508
Colin Cross6b4a32d2017-12-05 13:42:45 -0800509 // Test that the install binary wrapper depends on the installed jar file
Colin Crossc179ea62020-10-09 10:54:15 -0700510 if g, w := barWrapperDeps, barJar; !android.InList(w, g) {
511 t.Errorf("expected binary wrapper implicits to contain %q, got %q", w, g)
Colin Cross6b4a32d2017-12-05 13:42:45 -0800512 }
Colin Cross89226d92020-10-09 19:00:54 -0700513
514 // Test that the install binary wrapper depends on the installed JNI libraries
515 if g, w := barWrapperDeps, libjniSO; !android.InList(w, g) {
516 t.Errorf("expected binary wrapper implicits to contain %q, got %q", w, g)
Colin Cross6b4a32d2017-12-05 13:42:45 -0800517 }
Alex Humesky2070e322020-06-09 20:23:08 -0400518}
Colin Cross6b4a32d2017-12-05 13:42:45 -0800519
Alex Humesky2070e322020-06-09 20:23:08 -0400520func TestHostBinaryNoJavaDebugInfoOverride(t *testing.T) {
521 bp := `
522 java_library {
523 name: "target_library",
524 srcs: ["a.java"],
525 }
526
527 java_binary_host {
528 name: "host_binary",
529 srcs: ["b.java"],
530 }
531 `
532 config := testConfig(nil, bp, nil)
533 config.TestProductVariables.MinimizeJavaDebugInfo = proptools.BoolPtr(true)
534
535 ctx, _ := testJavaWithConfig(t, config)
536
Liz Kammer7941b302020-07-28 13:27:34 -0700537 // first, check that the -g flag is added to target modules
Alex Humesky2070e322020-06-09 20:23:08 -0400538 targetLibrary := ctx.ModuleForTests("target_library", "android_common")
539 targetJavaFlags := targetLibrary.Module().VariablesForTests()["javacFlags"]
540 if !strings.Contains(targetJavaFlags, "-g:source,lines") {
541 t.Errorf("target library javac flags %v should contain "+
542 "-g:source,lines override with MinimizeJavaDebugInfo", targetJavaFlags)
543 }
544
545 // check that -g is not overridden for host modules
546 buildOS := android.BuildOs.String()
547 hostBinary := ctx.ModuleForTests("host_binary", buildOS+"_common")
548 hostJavaFlags := hostBinary.Module().VariablesForTests()["javacFlags"]
549 if strings.Contains(hostJavaFlags, "-g:source,lines") {
550 t.Errorf("java_binary_host javac flags %v should not have "+
551 "-g:source,lines override with MinimizeJavaDebugInfo", hostJavaFlags)
552 }
Colin Cross6b4a32d2017-12-05 13:42:45 -0800553}
554
Colin Cross72bb3632017-07-13 16:23:21 -0700555func TestPrebuilts(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700556 ctx, _ := testJava(t, `
Colin Cross72bb3632017-07-13 16:23:21 -0700557 java_library {
558 name: "foo",
Paul Duffin91547182019-11-12 19:39:36 +0000559 srcs: ["a.java", ":stubs-source"],
Paul Duffinfcfd7912020-01-31 17:54:30 +0000560 libs: ["bar", "sdklib"],
Colin Crosse8dc34a2017-07-19 11:22:16 -0700561 static_libs: ["baz"],
Colin Cross72bb3632017-07-13 16:23:21 -0700562 }
563
Colin Cross74d73e22017-08-02 11:05:49 -0700564 java_import {
Colin Cross72bb3632017-07-13 16:23:21 -0700565 name: "bar",
Colin Cross74d73e22017-08-02 11:05:49 -0700566 jars: ["a.jar"],
Colin Cross72bb3632017-07-13 16:23:21 -0700567 }
568
Colin Cross74d73e22017-08-02 11:05:49 -0700569 java_import {
Colin Cross72bb3632017-07-13 16:23:21 -0700570 name: "baz",
Colin Cross74d73e22017-08-02 11:05:49 -0700571 jars: ["b.jar"],
Liz Kammerd6c31d22020-08-05 15:40:41 -0700572 sdk_version: "current",
573 compile_dex: true,
Colin Cross72bb3632017-07-13 16:23:21 -0700574 }
Colin Cross42be7612019-02-21 18:12:14 -0800575
576 dex_import {
577 name: "qux",
578 jars: ["b.jar"],
579 }
Colin Cross79c7c262019-04-17 11:11:46 -0700580
581 java_sdk_library_import {
Paul Duffin56d44902020-01-31 13:36:25 +0000582 name: "sdklib",
583 public: {
584 jars: ["c.jar"],
585 },
586 }
587
Paul Duffin91547182019-11-12 19:39:36 +0000588 prebuilt_stubs_sources {
589 name: "stubs-source",
Paul Duffin9b478b02019-12-10 13:41:51 +0000590 srcs: ["stubs/sources"],
Paul Duffin91547182019-11-12 19:39:36 +0000591 }
Paul Duffin1b82e6a2019-12-03 18:06:47 +0000592
593 java_test_import {
594 name: "test",
595 jars: ["a.jar"],
596 test_suites: ["cts"],
597 test_config: "AndroidTest.xml",
598 }
Colin Cross72bb3632017-07-13 16:23:21 -0700599 `)
600
Paul Duffin9b478b02019-12-10 13:41:51 +0000601 fooModule := ctx.ModuleForTests("foo", "android_common")
602 javac := fooModule.Rule("javac")
Nan Zhanged19fc32017-10-19 13:06:22 -0700603 combineJar := ctx.ModuleForTests("foo", "android_common").Description("for javac")
Liz Kammerd6c31d22020-08-05 15:40:41 -0700604 barModule := ctx.ModuleForTests("bar", "android_common")
605 barJar := barModule.Rule("combineJar").Output
606 bazModule := ctx.ModuleForTests("baz", "android_common")
607 bazJar := bazModule.Rule("combineJar").Output
Colin Cross79c7c262019-04-17 11:11:46 -0700608 sdklibStubsJar := ctx.ModuleForTests("sdklib.stubs", "android_common").Rule("combineJar").Output
Colin Cross72bb3632017-07-13 16:23:21 -0700609
Paul Duffin9b478b02019-12-10 13:41:51 +0000610 fooLibrary := fooModule.Module().(*Library)
611 assertDeepEquals(t, "foo java sources incorrect",
612 []string{"a.java"}, fooLibrary.compiledJavaSrcs.Strings())
Paul Duffin91547182019-11-12 19:39:36 +0000613
Paul Duffin9b478b02019-12-10 13:41:51 +0000614 assertDeepEquals(t, "foo java source jars incorrect",
615 []string{".intermediates/stubs-source/android_common/stubs-source-stubs.srcjar"},
616 android.NormalizePathsForTesting(fooLibrary.compiledSrcJars))
Paul Duffin91547182019-11-12 19:39:36 +0000617
Colin Cross37f6d792018-07-12 12:28:41 -0700618 if !strings.Contains(javac.Args["classpath"], barJar.String()) {
619 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], barJar.String())
Colin Cross72bb3632017-07-13 16:23:21 -0700620 }
621
Liz Kammerd6c31d22020-08-05 15:40:41 -0700622 barDexJar := barModule.Module().(*Import).DexJarBuildPath()
623 if barDexJar != nil {
624 t.Errorf("bar dex jar build path expected to be nil, got %q", barDexJar)
625 }
626
Colin Cross79c7c262019-04-17 11:11:46 -0700627 if !strings.Contains(javac.Args["classpath"], sdklibStubsJar.String()) {
628 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], sdklibStubsJar.String())
629 }
630
Colin Cross37f6d792018-07-12 12:28:41 -0700631 if len(combineJar.Inputs) != 2 || combineJar.Inputs[1].String() != bazJar.String() {
632 t.Errorf("foo combineJar inputs %v does not contain %q", combineJar.Inputs, bazJar.String())
Colin Cross72bb3632017-07-13 16:23:21 -0700633 }
Colin Cross42be7612019-02-21 18:12:14 -0800634
Liz Kammerd6c31d22020-08-05 15:40:41 -0700635 bazDexJar := bazModule.Module().(*Import).DexJarBuildPath().String()
636 expectedDexJar := buildDir + "/.intermediates/baz/android_common/dex/baz.jar"
637 if bazDexJar != expectedDexJar {
638 t.Errorf("baz dex jar build path expected %q, got %q", expectedDexJar, bazDexJar)
639 }
640
Colin Cross42be7612019-02-21 18:12:14 -0800641 ctx.ModuleForTests("qux", "android_common").Rule("Cp")
Colin Cross72bb3632017-07-13 16:23:21 -0700642}
643
Paul Duffin9b478b02019-12-10 13:41:51 +0000644func assertDeepEquals(t *testing.T, message string, expected interface{}, actual interface{}) {
645 if !reflect.DeepEqual(expected, actual) {
646 t.Errorf("%s: expected %q, found %q", message, expected, actual)
647 }
648}
649
Paul Duffin1a393322020-11-18 16:36:47 +0000650func TestPrebuiltStubsSources(t *testing.T) {
651 test := func(t *testing.T, sourcesPath string, expectedInputs []string) {
652 ctx, _ := testJavaWithFS(t, fmt.Sprintf(`
653prebuilt_stubs_sources {
654 name: "stubs-source",
655 srcs: ["%s"],
656}`, sourcesPath), map[string][]byte{
657 "stubs/sources/pkg/A.java": nil,
658 "stubs/sources/pkg/B.java": nil,
659 })
660
661 zipSrc := ctx.ModuleForTests("stubs-source", "android_common").Rule("zip_src")
662 if expected, actual := expectedInputs, zipSrc.Inputs.Strings(); !reflect.DeepEqual(expected, actual) {
663 t.Errorf("mismatch of inputs to soong_zip: expected %q, actual %q", expected, actual)
664 }
665 }
666
667 t.Run("empty/missing directory", func(t *testing.T) {
668 test(t, "empty-directory", []string{})
669 })
670
671 t.Run("non-empty set of sources", func(t *testing.T) {
672 test(t, "stubs/sources", []string{
673 "stubs/sources/pkg/A.java",
674 "stubs/sources/pkg/B.java",
675 })
676 })
677}
678
Paul Duffin56d44902020-01-31 13:36:25 +0000679func TestJavaSdkLibraryImport(t *testing.T) {
680 ctx, _ := testJava(t, `
681 java_library {
682 name: "foo",
683 srcs: ["a.java"],
684 libs: ["sdklib"],
685 sdk_version: "current",
686 }
687
688 java_library {
689 name: "foo.system",
690 srcs: ["a.java"],
691 libs: ["sdklib"],
692 sdk_version: "system_current",
693 }
694
695 java_library {
696 name: "foo.test",
697 srcs: ["a.java"],
698 libs: ["sdklib"],
699 sdk_version: "test_current",
700 }
701
702 java_sdk_library_import {
703 name: "sdklib",
704 public: {
705 jars: ["a.jar"],
706 },
707 system: {
708 jars: ["b.jar"],
709 },
710 test: {
711 jars: ["c.jar"],
Paul Duffin0f8faff2020-05-20 16:18:00 +0100712 stub_srcs: ["c.java"],
Paul Duffin56d44902020-01-31 13:36:25 +0000713 },
714 }
715 `)
716
717 for _, scope := range []string{"", ".system", ".test"} {
718 fooModule := ctx.ModuleForTests("foo"+scope, "android_common")
719 javac := fooModule.Rule("javac")
720
721 sdklibStubsJar := ctx.ModuleForTests("sdklib.stubs"+scope, "android_common").Rule("combineJar").Output
722 if !strings.Contains(javac.Args["classpath"], sdklibStubsJar.String()) {
723 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], sdklibStubsJar.String())
724 }
725 }
Paul Duffinca8d9a52020-06-26 22:20:25 +0100726
Paul Duffincee7e662020-07-09 17:32:57 +0100727 CheckModuleDependencies(t, ctx, "sdklib", "android_common", []string{
Paul Duffinca8d9a52020-06-26 22:20:25 +0100728 `prebuilt_sdklib.stubs`,
729 `prebuilt_sdklib.stubs.source.test`,
730 `prebuilt_sdklib.stubs.system`,
731 `prebuilt_sdklib.stubs.test`,
732 })
733}
734
735func TestJavaSdkLibraryImport_WithSource(t *testing.T) {
736 ctx, _ := testJava(t, `
737 java_sdk_library {
738 name: "sdklib",
739 srcs: ["a.java"],
740 sdk_version: "none",
741 system_modules: "none",
742 public: {
743 enabled: true,
744 },
745 }
746
747 java_sdk_library_import {
748 name: "sdklib",
749 public: {
750 jars: ["a.jar"],
751 },
752 }
753 `)
754
Paul Duffincee7e662020-07-09 17:32:57 +0100755 CheckModuleDependencies(t, ctx, "sdklib", "android_common", []string{
Paul Duffinca8d9a52020-06-26 22:20:25 +0100756 `dex2oatd`,
757 `prebuilt_sdklib`,
758 `sdklib.impl`,
759 `sdklib.stubs`,
760 `sdklib.stubs.source`,
761 `sdklib.xml`,
762 })
763
Paul Duffincee7e662020-07-09 17:32:57 +0100764 CheckModuleDependencies(t, ctx, "prebuilt_sdklib", "android_common", []string{
Paul Duffin44f1d842020-06-26 20:17:02 +0100765 `prebuilt_sdklib.stubs`,
Paul Duffinca8d9a52020-06-26 22:20:25 +0100766 `sdklib.impl`,
767 // This should be prebuilt_sdklib.stubs but is set to sdklib.stubs because the
768 // dependency is added after prebuilts may have been renamed and so has to use
769 // the renamed name.
Paul Duffinca8d9a52020-06-26 22:20:25 +0100770 `sdklib.xml`,
771 })
772}
773
774func TestJavaSdkLibraryImport_Preferred(t *testing.T) {
775 ctx, _ := testJava(t, `
776 java_sdk_library {
777 name: "sdklib",
778 srcs: ["a.java"],
779 sdk_version: "none",
780 system_modules: "none",
781 public: {
782 enabled: true,
783 },
784 }
785
786 java_sdk_library_import {
787 name: "sdklib",
788 prefer: true,
789 public: {
790 jars: ["a.jar"],
791 },
792 }
793 `)
794
Paul Duffincee7e662020-07-09 17:32:57 +0100795 CheckModuleDependencies(t, ctx, "sdklib", "android_common", []string{
Paul Duffinca8d9a52020-06-26 22:20:25 +0100796 `dex2oatd`,
797 `prebuilt_sdklib`,
Paul Duffinca8d9a52020-06-26 22:20:25 +0100798 `sdklib.impl`,
Paul Duffin80342d72020-06-26 22:08:43 +0100799 `sdklib.stubs`,
Paul Duffinca8d9a52020-06-26 22:20:25 +0100800 `sdklib.stubs.source`,
801 `sdklib.xml`,
802 })
803
Paul Duffincee7e662020-07-09 17:32:57 +0100804 CheckModuleDependencies(t, ctx, "prebuilt_sdklib", "android_common", []string{
Paul Duffinca8d9a52020-06-26 22:20:25 +0100805 `prebuilt_sdklib.stubs`,
806 `sdklib.impl`,
807 `sdklib.xml`,
808 })
Paul Duffin56d44902020-01-31 13:36:25 +0000809}
810
JaeMan Parkff715562020-10-19 17:25:58 +0900811func TestJavaSdkLibraryEnforce(t *testing.T) {
812 partitionToBpOption := func(partition string) string {
813 switch partition {
814 case "system":
815 return ""
816 case "vendor":
817 return "soc_specific: true,"
818 case "product":
819 return "product_specific: true,"
820 default:
821 panic("Invalid partition group name: " + partition)
822 }
823 }
824
825 type testConfigInfo struct {
826 libraryType string
827 fromPartition string
828 toPartition string
829 enforceVendorInterface bool
830 enforceProductInterface bool
831 enforceJavaSdkLibraryCheck bool
832 allowList []string
833 }
834
835 createTestConfig := func(info testConfigInfo) android.Config {
836 bpFileTemplate := `
837 java_library {
838 name: "foo",
839 srcs: ["foo.java"],
840 libs: ["bar"],
841 sdk_version: "current",
842 %s
843 }
844
845 %s {
846 name: "bar",
847 srcs: ["bar.java"],
848 sdk_version: "current",
849 %s
850 }
851 `
852
853 bpFile := fmt.Sprintf(bpFileTemplate,
854 partitionToBpOption(info.fromPartition),
855 info.libraryType,
856 partitionToBpOption(info.toPartition))
857
858 config := testConfig(nil, bpFile, nil)
859 configVariables := config.TestProductVariables
860
861 configVariables.EnforceProductPartitionInterface = proptools.BoolPtr(info.enforceProductInterface)
862 if info.enforceVendorInterface {
863 configVariables.DeviceVndkVersion = proptools.StringPtr("current")
864 }
865 configVariables.EnforceInterPartitionJavaSdkLibrary = proptools.BoolPtr(info.enforceJavaSdkLibraryCheck)
866 configVariables.InterPartitionJavaLibraryAllowList = info.allowList
867
868 return config
869 }
870
871 isValidDependency := func(configInfo testConfigInfo) bool {
872 if configInfo.enforceVendorInterface == false {
873 return true
874 }
875
876 if configInfo.enforceJavaSdkLibraryCheck == false {
877 return true
878 }
879
880 if inList("bar", configInfo.allowList) {
881 return true
882 }
883
884 if configInfo.libraryType == "java_library" {
885 if configInfo.fromPartition != configInfo.toPartition {
886 if !configInfo.enforceProductInterface &&
887 ((configInfo.fromPartition == "system" && configInfo.toPartition == "product") ||
888 (configInfo.fromPartition == "product" && configInfo.toPartition == "system")) {
889 return true
890 }
891 return false
892 }
893 }
894
895 return true
896 }
897
898 errorMessage := "is not allowed across the partitions"
899
900 allPartitionCombinations := func() [][2]string {
901 var result [][2]string
902 partitions := []string{"system", "vendor", "product"}
903
904 for _, fromPartition := range partitions {
905 for _, toPartition := range partitions {
906 result = append(result, [2]string{fromPartition, toPartition})
907 }
908 }
909
910 return result
911 }
912
913 allFlagCombinations := func() [][3]bool {
914 var result [][3]bool
915 flagValues := [2]bool{false, true}
916
917 for _, vendorInterface := range flagValues {
918 for _, productInterface := range flagValues {
919 for _, enableEnforce := range flagValues {
920 result = append(result, [3]bool{vendorInterface, productInterface, enableEnforce})
921 }
922 }
923 }
924
925 return result
926 }
927
928 for _, libraryType := range []string{"java_library", "java_sdk_library"} {
929 for _, partitionValues := range allPartitionCombinations() {
930 for _, flagValues := range allFlagCombinations() {
931 testInfo := testConfigInfo{
932 libraryType: libraryType,
933 fromPartition: partitionValues[0],
934 toPartition: partitionValues[1],
935 enforceVendorInterface: flagValues[0],
936 enforceProductInterface: flagValues[1],
937 enforceJavaSdkLibraryCheck: flagValues[2],
938 }
939
940 if isValidDependency(testInfo) {
941 testJavaWithConfig(t, createTestConfig(testInfo))
942 } else {
943 testJavaErrorWithConfig(t, errorMessage, createTestConfig(testInfo))
944 }
945 }
946 }
947 }
948
949 testJavaWithConfig(t, createTestConfig(testConfigInfo{
950 libraryType: "java_library",
951 fromPartition: "vendor",
952 toPartition: "system",
953 enforceVendorInterface: true,
954 enforceProductInterface: true,
955 enforceJavaSdkLibraryCheck: true,
956 allowList: []string{"bar"},
957 }))
958
959 testJavaErrorWithConfig(t, errorMessage, createTestConfig(testConfigInfo{
960 libraryType: "java_library",
961 fromPartition: "vendor",
962 toPartition: "system",
963 enforceVendorInterface: true,
964 enforceProductInterface: true,
965 enforceJavaSdkLibraryCheck: true,
966 allowList: []string{"foo"},
967 }))
968}
969
Colin Cross89536d42017-07-07 14:35:50 -0700970func TestDefaults(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700971 ctx, _ := testJava(t, `
Colin Cross89536d42017-07-07 14:35:50 -0700972 java_defaults {
973 name: "defaults",
974 srcs: ["a.java"],
975 libs: ["bar"],
976 static_libs: ["baz"],
Sasha Smundak2057f822019-04-16 17:16:58 -0700977 optimize: {enabled: false},
Colin Cross89536d42017-07-07 14:35:50 -0700978 }
979
980 java_library {
981 name: "foo",
982 defaults: ["defaults"],
983 }
984
985 java_library {
986 name: "bar",
987 srcs: ["b.java"],
988 }
989
990 java_library {
991 name: "baz",
992 srcs: ["c.java"],
993 }
Sasha Smundak2057f822019-04-16 17:16:58 -0700994
995 android_test {
996 name: "atestOptimize",
997 defaults: ["defaults"],
998 optimize: {enabled: true},
999 }
1000
1001 android_test {
1002 name: "atestNoOptimize",
1003 defaults: ["defaults"],
1004 }
1005
1006 android_test {
1007 name: "atestDefault",
1008 srcs: ["a.java"],
1009 }
Colin Cross89536d42017-07-07 14:35:50 -07001010 `)
1011
Colin Cross4c428df2017-09-15 17:36:05 -07001012 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
Nan Zhanged19fc32017-10-19 13:06:22 -07001013 combineJar := ctx.ModuleForTests("foo", "android_common").Description("for javac")
Colin Cross89536d42017-07-07 14:35:50 -07001014
1015 if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "a.java" {
1016 t.Errorf(`foo inputs %v != ["a.java"]`, javac.Inputs)
1017 }
1018
Nan Zhanged19fc32017-10-19 13:06:22 -07001019 barTurbine := filepath.Join(buildDir, ".intermediates", "bar", "android_common", "turbine-combined", "bar.jar")
1020 if !strings.Contains(javac.Args["classpath"], barTurbine) {
1021 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
Colin Cross89536d42017-07-07 14:35:50 -07001022 }
1023
Colin Cross1ee23172017-10-18 14:44:18 -07001024 baz := ctx.ModuleForTests("baz", "android_common").Rule("javac").Output.String()
Colin Cross0a6e0072017-08-30 14:24:55 -07001025 if len(combineJar.Inputs) != 2 || combineJar.Inputs[1].String() != baz {
1026 t.Errorf("foo combineJar inputs %v does not contain %q", combineJar.Inputs, baz)
Colin Cross89536d42017-07-07 14:35:50 -07001027 }
Sasha Smundak2057f822019-04-16 17:16:58 -07001028
1029 atestOptimize := ctx.ModuleForTests("atestOptimize", "android_common").MaybeRule("r8")
1030 if atestOptimize.Output == nil {
1031 t.Errorf("atestOptimize should optimize APK")
1032 }
1033
1034 atestNoOptimize := ctx.ModuleForTests("atestNoOptimize", "android_common").MaybeRule("d8")
1035 if atestNoOptimize.Output == nil {
1036 t.Errorf("atestNoOptimize should not optimize APK")
1037 }
1038
1039 atestDefault := ctx.ModuleForTests("atestDefault", "android_common").MaybeRule("r8")
1040 if atestDefault.Output == nil {
1041 t.Errorf("atestDefault should optimize APK")
1042 }
Colin Cross89536d42017-07-07 14:35:50 -07001043}
1044
Colin Cross0f37af02017-09-27 17:42:05 -07001045func TestResources(t *testing.T) {
1046 var table = []struct {
1047 name string
1048 prop string
1049 extra string
1050 args string
1051 }{
1052 {
Colin Crossaf9c55b2017-10-03 14:50:08 -07001053 // Test that a module with java_resource_dirs includes the files
Colin Cross0f37af02017-09-27 17:42:05 -07001054 name: "resource dirs",
Colin Cross824bee32017-11-22 17:27:51 -08001055 prop: `java_resource_dirs: ["java-res"]`,
Colin Cross0ead1d72018-04-10 13:07:42 -07001056 args: "-C java-res -f java-res/a/a -f java-res/b/b",
Colin Cross0f37af02017-09-27 17:42:05 -07001057 },
1058 {
1059 // Test that a module with java_resources includes the files
1060 name: "resource files",
Colin Cross0ead1d72018-04-10 13:07:42 -07001061 prop: `java_resources: ["java-res/a/a", "java-res/b/b"]`,
1062 args: "-C . -f java-res/a/a -f java-res/b/b",
Colin Cross0f37af02017-09-27 17:42:05 -07001063 },
1064 {
1065 // Test that a module with a filegroup in java_resources includes the files with the
1066 // path prefix
1067 name: "resource filegroup",
1068 prop: `java_resources: [":foo-res"]`,
1069 extra: `
1070 filegroup {
1071 name: "foo-res",
Colin Cross824bee32017-11-22 17:27:51 -08001072 path: "java-res",
Colin Cross0ead1d72018-04-10 13:07:42 -07001073 srcs: ["java-res/a/a", "java-res/b/b"],
Colin Cross0f37af02017-09-27 17:42:05 -07001074 }`,
Colin Cross0ead1d72018-04-10 13:07:42 -07001075 args: "-C java-res -f java-res/a/a -f java-res/b/b",
Colin Cross0f37af02017-09-27 17:42:05 -07001076 },
1077 {
Colin Cross0ead1d72018-04-10 13:07:42 -07001078 // Test that a module with wildcards in java_resource_dirs has the correct path prefixes
1079 name: "wildcard dirs",
1080 prop: `java_resource_dirs: ["java-res/*"]`,
1081 args: "-C java-res/a -f java-res/a/a -C java-res/b -f java-res/b/b",
1082 },
1083 {
1084 // Test that a module exclude_java_resource_dirs excludes the files
1085 name: "wildcard dirs",
1086 prop: `java_resource_dirs: ["java-res/*"], exclude_java_resource_dirs: ["java-res/b"]`,
1087 args: "-C java-res/a -f java-res/a/a",
1088 },
Colin Crosscedd4762018-09-13 11:26:19 -07001089 {
1090 // Test wildcards in java_resources
1091 name: "wildcard files",
1092 prop: `java_resources: ["java-res/**/*"]`,
1093 args: "-C . -f java-res/a/a -f java-res/b/b",
1094 },
1095 {
1096 // Test exclude_java_resources with java_resources
1097 name: "wildcard files with exclude",
1098 prop: `java_resources: ["java-res/**/*"], exclude_java_resources: ["java-res/b/*"]`,
1099 args: "-C . -f java-res/a/a",
1100 },
1101 {
1102 // Test exclude_java_resources with java_resource_dirs
1103 name: "resource dirs with exclude files",
1104 prop: `java_resource_dirs: ["java-res"], exclude_java_resources: ["java-res/b/b"]`,
1105 args: "-C java-res -f java-res/a/a",
1106 },
1107 {
1108 // Test exclude_java_resource_dirs with java_resource_dirs
1109 name: "resource dirs with exclude files",
1110 prop: `java_resource_dirs: ["java-res", "java-res2"], exclude_java_resource_dirs: ["java-res2"]`,
1111 args: "-C java-res -f java-res/a/a -f java-res/b/b",
1112 },
Colin Cross0f37af02017-09-27 17:42:05 -07001113 }
1114
1115 for _, test := range table {
1116 t.Run(test.name, func(t *testing.T) {
Colin Cross238c1f32020-06-07 16:58:18 -07001117 ctx, _ := testJavaWithFS(t, `
Colin Cross0f37af02017-09-27 17:42:05 -07001118 java_library {
1119 name: "foo",
1120 srcs: [
1121 "a.java",
1122 "b.java",
1123 "c.java",
1124 ],
1125 `+test.prop+`,
1126 }
Colin Cross238c1f32020-06-07 16:58:18 -07001127 `+test.extra,
1128 map[string][]byte{
1129 "java-res/a/a": nil,
1130 "java-res/b/b": nil,
1131 "java-res2/a": nil,
1132 },
1133 )
Colin Cross0f37af02017-09-27 17:42:05 -07001134
Colin Cross331a1212018-08-15 20:40:52 -07001135 foo := ctx.ModuleForTests("foo", "android_common").Output("withres/foo.jar")
Colin Cross1ee23172017-10-18 14:44:18 -07001136 fooRes := ctx.ModuleForTests("foo", "android_common").Output("res/foo.jar")
Colin Cross0f37af02017-09-27 17:42:05 -07001137
1138 if !inList(fooRes.Output.String(), foo.Inputs.Strings()) {
1139 t.Errorf("foo combined jars %v does not contain %q",
1140 foo.Inputs.Strings(), fooRes.Output.String())
1141 }
1142
Colin Crossaf9c55b2017-10-03 14:50:08 -07001143 if fooRes.Args["jarArgs"] != test.args {
1144 t.Errorf("foo resource jar args %q is not %q",
Colin Cross0f37af02017-09-27 17:42:05 -07001145 fooRes.Args["jarArgs"], test.args)
1146 }
1147 })
1148 }
1149}
1150
Colin Cross0c4ce212019-05-03 15:28:19 -07001151func TestIncludeSrcs(t *testing.T) {
Colin Cross238c1f32020-06-07 16:58:18 -07001152 ctx, _ := testJavaWithFS(t, `
Colin Cross0c4ce212019-05-03 15:28:19 -07001153 java_library {
1154 name: "foo",
1155 srcs: [
1156 "a.java",
1157 "b.java",
1158 "c.java",
1159 ],
1160 include_srcs: true,
1161 }
1162
1163 java_library {
1164 name: "bar",
1165 srcs: [
1166 "a.java",
1167 "b.java",
1168 "c.java",
1169 ],
1170 java_resource_dirs: ["java-res"],
1171 include_srcs: true,
1172 }
Colin Cross238c1f32020-06-07 16:58:18 -07001173 `, map[string][]byte{
1174 "java-res/a/a": nil,
1175 "java-res/b/b": nil,
1176 "java-res2/a": nil,
1177 })
Colin Cross0c4ce212019-05-03 15:28:19 -07001178
1179 // Test a library with include_srcs: true
1180 foo := ctx.ModuleForTests("foo", "android_common").Output("withres/foo.jar")
1181 fooSrcJar := ctx.ModuleForTests("foo", "android_common").Output("foo.srcjar")
1182
1183 if g, w := fooSrcJar.Output.String(), foo.Inputs.Strings(); !inList(g, w) {
1184 t.Errorf("foo combined jars %v does not contain %q", w, g)
1185 }
1186
1187 if g, w := fooSrcJar.Args["jarArgs"], "-C . -f a.java -f b.java -f c.java"; g != w {
1188 t.Errorf("foo source jar args %q is not %q", w, g)
1189 }
1190
1191 // Test a library with include_srcs: true and resources
1192 bar := ctx.ModuleForTests("bar", "android_common").Output("withres/bar.jar")
1193 barResCombined := ctx.ModuleForTests("bar", "android_common").Output("res-combined/bar.jar")
1194 barRes := ctx.ModuleForTests("bar", "android_common").Output("res/bar.jar")
1195 barSrcJar := ctx.ModuleForTests("bar", "android_common").Output("bar.srcjar")
1196
1197 if g, w := barSrcJar.Output.String(), barResCombined.Inputs.Strings(); !inList(g, w) {
1198 t.Errorf("bar combined resource jars %v does not contain %q", w, g)
1199 }
1200
1201 if g, w := barRes.Output.String(), barResCombined.Inputs.Strings(); !inList(g, w) {
1202 t.Errorf("bar combined resource jars %v does not contain %q", w, g)
1203 }
1204
1205 if g, w := barResCombined.Output.String(), bar.Inputs.Strings(); !inList(g, w) {
1206 t.Errorf("bar combined jars %v does not contain %q", w, g)
1207 }
1208
1209 if g, w := barSrcJar.Args["jarArgs"], "-C . -f a.java -f b.java -f c.java"; g != w {
1210 t.Errorf("bar source jar args %q is not %q", w, g)
1211 }
1212
1213 if g, w := barRes.Args["jarArgs"], "-C java-res -f java-res/a/a -f java-res/b/b"; g != w {
1214 t.Errorf("bar resource jar args %q is not %q", w, g)
1215 }
1216}
1217
Colin Cross54190b32017-10-09 15:34:10 -07001218func TestGeneratedSources(t *testing.T) {
Colin Cross238c1f32020-06-07 16:58:18 -07001219 ctx, _ := testJavaWithFS(t, `
Colin Cross54190b32017-10-09 15:34:10 -07001220 java_library {
1221 name: "foo",
1222 srcs: [
1223 "a*.java",
1224 ":gen",
1225 "b*.java",
1226 ],
1227 }
1228
1229 genrule {
1230 name: "gen",
Colin Cross824bee32017-11-22 17:27:51 -08001231 tool_files: ["java-res/a"],
Colin Cross54190b32017-10-09 15:34:10 -07001232 out: ["gen.java"],
1233 }
Colin Cross238c1f32020-06-07 16:58:18 -07001234 `, map[string][]byte{
1235 "a.java": nil,
1236 "b.java": nil,
1237 })
Colin Cross54190b32017-10-09 15:34:10 -07001238
1239 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
1240 genrule := ctx.ModuleForTests("gen", "").Rule("generator")
1241
Colin Cross15e86d92017-10-20 15:07:08 -07001242 if filepath.Base(genrule.Output.String()) != "gen.java" {
1243 t.Fatalf(`gen output file %v is not ".../gen.java"`, genrule.Output.String())
Colin Cross54190b32017-10-09 15:34:10 -07001244 }
1245
1246 if len(javac.Inputs) != 3 ||
1247 javac.Inputs[0].String() != "a.java" ||
Colin Cross15e86d92017-10-20 15:07:08 -07001248 javac.Inputs[1].String() != genrule.Output.String() ||
Colin Cross54190b32017-10-09 15:34:10 -07001249 javac.Inputs[2].String() != "b.java" {
1250 t.Errorf(`foo inputs %v != ["a.java", ".../gen.java", "b.java"]`, javac.Inputs)
1251 }
1252}
1253
Nan Zhang61eaedb2017-11-02 13:28:15 -07001254func TestTurbine(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001255 ctx, _ := testJava(t, `
Nan Zhang61eaedb2017-11-02 13:28:15 -07001256 java_library {
1257 name: "foo",
1258 srcs: ["a.java"],
Jiyong Park2d492942018-03-05 17:44:10 +09001259 sdk_version: "14",
Nan Zhang61eaedb2017-11-02 13:28:15 -07001260 }
1261
1262 java_library {
1263 name: "bar",
Colin Cross9bc43432017-12-15 20:20:39 -08001264 srcs: ["b.java"],
Nan Zhang61eaedb2017-11-02 13:28:15 -07001265 static_libs: ["foo"],
Jiyong Park2d492942018-03-05 17:44:10 +09001266 sdk_version: "14",
Nan Zhang61eaedb2017-11-02 13:28:15 -07001267 }
1268
1269 java_library {
1270 name: "baz",
1271 srcs: ["c.java"],
1272 libs: ["bar"],
1273 sdk_version: "14",
1274 }
1275 `)
1276
1277 fooTurbine := ctx.ModuleForTests("foo", "android_common").Rule("turbine")
1278 barTurbine := ctx.ModuleForTests("bar", "android_common").Rule("turbine")
1279 barJavac := ctx.ModuleForTests("bar", "android_common").Rule("javac")
1280 barTurbineCombined := ctx.ModuleForTests("bar", "android_common").Description("for turbine")
1281 bazJavac := ctx.ModuleForTests("baz", "android_common").Rule("javac")
1282
1283 if len(fooTurbine.Inputs) != 1 || fooTurbine.Inputs[0].String() != "a.java" {
1284 t.Errorf(`foo inputs %v != ["a.java"]`, fooTurbine.Inputs)
1285 }
1286
1287 fooHeaderJar := filepath.Join(buildDir, ".intermediates", "foo", "android_common", "turbine-combined", "foo.jar")
1288 if !strings.Contains(barTurbine.Args["classpath"], fooHeaderJar) {
1289 t.Errorf("bar turbine classpath %v does not contain %q", barTurbine.Args["classpath"], fooHeaderJar)
1290 }
1291 if !strings.Contains(barJavac.Args["classpath"], fooHeaderJar) {
1292 t.Errorf("bar javac classpath %v does not contain %q", barJavac.Args["classpath"], fooHeaderJar)
1293 }
1294 if len(barTurbineCombined.Inputs) != 2 || barTurbineCombined.Inputs[1].String() != fooHeaderJar {
1295 t.Errorf("bar turbine combineJar inputs %v does not contain %q", barTurbineCombined.Inputs, fooHeaderJar)
1296 }
Anton Hanssonf66efeb2018-04-11 13:57:30 +01001297 if !strings.Contains(bazJavac.Args["classpath"], "prebuilts/sdk/14/public/android.jar") {
Nan Zhang61eaedb2017-11-02 13:28:15 -07001298 t.Errorf("baz javac classpath %v does not contain %q", bazJavac.Args["classpath"],
Anton Hanssonf66efeb2018-04-11 13:57:30 +01001299 "prebuilts/sdk/14/public/android.jar")
Nan Zhang61eaedb2017-11-02 13:28:15 -07001300 }
1301}
1302
1303func TestSharding(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001304 ctx, _ := testJava(t, `
Nan Zhang61eaedb2017-11-02 13:28:15 -07001305 java_library {
1306 name: "bar",
1307 srcs: ["a.java","b.java","c.java"],
1308 javac_shard_size: 1
1309 }
1310 `)
1311
1312 barHeaderJar := filepath.Join(buildDir, ".intermediates", "bar", "android_common", "turbine-combined", "bar.jar")
1313 for i := 0; i < 3; i++ {
1314 barJavac := ctx.ModuleForTests("bar", "android_common").Description("javac" + strconv.Itoa(i))
1315 if !strings.Contains(barJavac.Args["classpath"], barHeaderJar) {
1316 t.Errorf("bar javac classpath %v does not contain %q", barJavac.Args["classpath"], barHeaderJar)
1317 }
1318 }
1319}
1320
Nan Zhang581fd212018-01-10 16:06:12 -08001321func TestDroiddoc(t *testing.T) {
Colin Cross238c1f32020-06-07 16:58:18 -07001322 ctx, _ := testJavaWithFS(t, `
Paul Duffin884363e2019-12-19 10:21:09 +00001323 droiddoc_exported_dir {
Dan Willemsencc090972018-02-26 14:33:31 -08001324 name: "droiddoc-templates-sdk",
1325 path: ".",
1326 }
Jiyong Park29074592019-07-07 16:27:47 +09001327 filegroup {
1328 name: "bar-doc-aidl-srcs",
1329 srcs: ["bar-doc/IBar.aidl"],
1330 path: "bar-doc",
1331 }
Liz Kammere1ab2502020-09-10 15:29:25 +00001332 droidstubs {
1333 name: "bar-stubs",
Liz Kammer3a55c912020-08-14 12:14:02 -07001334 srcs: [
Steve Kim3666c702020-09-01 17:58:01 +00001335 "bar-doc/a.java",
Liz Kammer3a55c912020-08-14 12:14:02 -07001336 ],
Steve Kim3666c702020-09-01 17:58:01 +00001337 exclude_srcs: [
1338 "bar-doc/b.java"
1339 ],
Liz Kammere1ab2502020-09-10 15:29:25 +00001340 api_levels_annotations_dirs: [
1341 "droiddoc-templates-sdk",
1342 ],
1343 api_levels_annotations_enabled: true,
1344 }
1345 droiddoc {
1346 name: "bar-doc",
1347 srcs: [
1348 ":bar-stubs",
1349 "bar-doc/IFoo.aidl",
1350 ":bar-doc-aidl-srcs",
1351 ],
Dan Willemsencc090972018-02-26 14:33:31 -08001352 custom_template: "droiddoc-templates-sdk",
Nan Zhang581fd212018-01-10 16:06:12 -08001353 hdf: [
1354 "android.whichdoc offline",
1355 ],
1356 knowntags: [
1357 "bar-doc/known_oj_tags.txt",
1358 ],
1359 proofread_file: "libcore-proofread.txt",
1360 todo_file: "libcore-docs-todo.html",
Liz Kammer585cac22020-07-06 09:12:57 -07001361 flags: ["-offlinemode -title \"libcore\""],
Nan Zhang581fd212018-01-10 16:06:12 -08001362 }
Colin Cross238c1f32020-06-07 16:58:18 -07001363 `,
1364 map[string][]byte{
1365 "bar-doc/a.java": nil,
1366 "bar-doc/b.java": nil,
1367 })
Liz Kammere1ab2502020-09-10 15:29:25 +00001368 barStubs := ctx.ModuleForTests("bar-stubs", "android_common")
1369 barStubsOutputs, err := barStubs.Module().(*Droidstubs).OutputFiles("")
1370 if err != nil {
1371 t.Errorf("Unexpected error %q retrieving \"bar-stubs\" output file", err)
1372 }
1373 if len(barStubsOutputs) != 1 {
1374 t.Errorf("Expected one output from \"bar-stubs\" got %s", barStubsOutputs)
Liz Kammer1e2ee122020-07-30 15:07:22 -07001375 }
Nan Zhang581fd212018-01-10 16:06:12 -08001376
Liz Kammere1ab2502020-09-10 15:29:25 +00001377 barStubsOutput := barStubsOutputs[0]
1378 barDoc := ctx.ModuleForTests("bar-doc", "android_common")
1379 javaDoc := barDoc.Rule("javadoc")
1380 if g, w := javaDoc.Implicits.Strings(), barStubsOutput.String(); !inList(w, g) {
1381 t.Errorf("implicits of bar-doc must contain %q, but was %q.", w, g)
Jiyong Park29074592019-07-07 16:27:47 +09001382 }
1383
Liz Kammere1ab2502020-09-10 15:29:25 +00001384 expected := "-sourcepath " + buildDir + "/.intermediates/bar-doc/android_common/srcjars "
1385 if !strings.Contains(javaDoc.RuleParams.Command, expected) {
1386 t.Errorf("bar-doc command does not contain flag %q, but should\n%q", expected, javaDoc.RuleParams.Command)
1387 }
1388
1389 aidl := barDoc.Rule("aidl")
1390 if g, w := javaDoc.Implicits.Strings(), aidl.Output.String(); !inList(w, g) {
Colin Crossc0806172019-06-14 18:51:47 -07001391 t.Errorf("implicits of bar-doc must contain %q, but was %q.", w, g)
1392 }
1393
1394 if g, w := aidl.Implicits.Strings(), []string{"bar-doc/IBar.aidl", "bar-doc/IFoo.aidl"}; !reflect.DeepEqual(w, g) {
1395 t.Errorf("aidl inputs must be %q, but was %q", w, g)
Jiyong Park1e440682018-05-23 18:42:04 +09001396 }
Nan Zhang581fd212018-01-10 16:06:12 -08001397}
1398
Liz Kammer585cac22020-07-06 09:12:57 -07001399func TestDroiddocArgsAndFlagsCausesError(t *testing.T) {
1400 testJavaError(t, "flags is set. Cannot set args", `
1401 droiddoc_exported_dir {
1402 name: "droiddoc-templates-sdk",
1403 path: ".",
1404 }
1405 filegroup {
1406 name: "bar-doc-aidl-srcs",
1407 srcs: ["bar-doc/IBar.aidl"],
1408 path: "bar-doc",
1409 }
Liz Kammere1ab2502020-09-10 15:29:25 +00001410 droidstubs {
1411 name: "bar-stubs",
Liz Kammer3a55c912020-08-14 12:14:02 -07001412 srcs: [
Steve Kim3666c702020-09-01 17:58:01 +00001413 "bar-doc/a.java",
Liz Kammer3a55c912020-08-14 12:14:02 -07001414 ],
Steve Kim3666c702020-09-01 17:58:01 +00001415 exclude_srcs: [
1416 "bar-doc/b.java"
1417 ],
Liz Kammere1ab2502020-09-10 15:29:25 +00001418 api_levels_annotations_dirs: [
1419 "droiddoc-templates-sdk",
1420 ],
1421 api_levels_annotations_enabled: true,
1422 }
1423 droiddoc {
1424 name: "bar-doc",
1425 srcs: [
1426 ":bar-stubs",
1427 "bar-doc/IFoo.aidl",
1428 ":bar-doc-aidl-srcs",
1429 ],
Liz Kammer585cac22020-07-06 09:12:57 -07001430 custom_template: "droiddoc-templates-sdk",
1431 hdf: [
1432 "android.whichdoc offline",
1433 ],
1434 knowntags: [
1435 "bar-doc/known_oj_tags.txt",
1436 ],
1437 proofread_file: "libcore-proofread.txt",
1438 todo_file: "libcore-docs-todo.html",
1439 flags: ["-offlinemode -title \"libcore\""],
1440 args: "-offlinemode -title \"libcore\"",
1441 }
1442 `)
1443}
1444
Liz Kammer3d894b72020-08-04 09:55:13 -07001445func TestDroidstubs(t *testing.T) {
1446 ctx, _ := testJavaWithFS(t, `
1447 droiddoc_exported_dir {
Anton Hansson52ac73d2020-10-26 09:57:40 +00001448 name: "droiddoc-templates-sdk",
1449 path: ".",
Liz Kammer3d894b72020-08-04 09:55:13 -07001450 }
1451
1452 droidstubs {
Anton Hansson52ac73d2020-10-26 09:57:40 +00001453 name: "bar-stubs",
1454 srcs: ["bar-doc/a.java"],
1455 api_levels_annotations_dirs: ["droiddoc-templates-sdk"],
1456 api_levels_annotations_enabled: true,
Liz Kammer3d894b72020-08-04 09:55:13 -07001457 }
1458
1459 droidstubs {
Anton Hansson52ac73d2020-10-26 09:57:40 +00001460 name: "bar-stubs-other",
1461 srcs: ["bar-doc/a.java"],
1462 high_mem: true,
1463 api_levels_annotations_dirs: ["droiddoc-templates-sdk"],
1464 api_levels_annotations_enabled: true,
1465 api_levels_jar_filename: "android.other.jar",
Liz Kammer3d894b72020-08-04 09:55:13 -07001466 }
1467 `,
1468 map[string][]byte{
1469 "bar-doc/a.java": nil,
1470 })
1471 testcases := []struct {
1472 moduleName string
1473 expectedJarFilename string
Anton Hansson52ac73d2020-10-26 09:57:40 +00001474 high_mem bool
Liz Kammer3d894b72020-08-04 09:55:13 -07001475 }{
1476 {
1477 moduleName: "bar-stubs",
1478 expectedJarFilename: "android.jar",
Anton Hansson52ac73d2020-10-26 09:57:40 +00001479 high_mem: false,
Liz Kammer3d894b72020-08-04 09:55:13 -07001480 },
1481 {
1482 moduleName: "bar-stubs-other",
1483 expectedJarFilename: "android.other.jar",
Anton Hansson52ac73d2020-10-26 09:57:40 +00001484 high_mem: true,
Liz Kammer3d894b72020-08-04 09:55:13 -07001485 },
1486 }
1487 for _, c := range testcases {
1488 m := ctx.ModuleForTests(c.moduleName, "android_common")
1489 metalava := m.Rule("metalava")
Anton Hansson52ac73d2020-10-26 09:57:40 +00001490 rp := metalava.RuleParams
Liz Kammer3d894b72020-08-04 09:55:13 -07001491 expected := "--android-jar-pattern ./%/public/" + c.expectedJarFilename
Anton Hansson52ac73d2020-10-26 09:57:40 +00001492 if actual := rp.Command; !strings.Contains(actual, expected) {
Liz Kammer3d894b72020-08-04 09:55:13 -07001493 t.Errorf("For %q, expected metalava argument %q, but was not found %q", c.moduleName, expected, actual)
1494 }
Anton Hansson52ac73d2020-10-26 09:57:40 +00001495
1496 if actual := rp.Pool != nil && strings.Contains(rp.Pool.String(), "highmem"); actual != c.high_mem {
1497 t.Errorf("Expected %q high_mem to be %v, was %v", c.moduleName, c.high_mem, actual)
1498 }
Liz Kammer3d894b72020-08-04 09:55:13 -07001499 }
1500}
1501
Paul Duffin83a2d962019-11-19 19:44:10 +00001502func TestDroidstubsWithSystemModules(t *testing.T) {
1503 ctx, _ := testJava(t, `
1504 droidstubs {
1505 name: "stubs-source-system-modules",
1506 srcs: [
Colin Cross238c1f32020-06-07 16:58:18 -07001507 "bar-doc/a.java",
Paul Duffin83a2d962019-11-19 19:44:10 +00001508 ],
1509 sdk_version: "none",
1510 system_modules: "source-system-modules",
1511 }
1512
1513 java_library {
1514 name: "source-jar",
1515 srcs: [
1516 "a.java",
1517 ],
1518 }
1519
1520 java_system_modules {
1521 name: "source-system-modules",
1522 libs: ["source-jar"],
1523 }
1524
1525 droidstubs {
1526 name: "stubs-prebuilt-system-modules",
1527 srcs: [
Colin Cross238c1f32020-06-07 16:58:18 -07001528 "bar-doc/a.java",
Paul Duffin83a2d962019-11-19 19:44:10 +00001529 ],
1530 sdk_version: "none",
1531 system_modules: "prebuilt-system-modules",
1532 }
1533
1534 java_import {
1535 name: "prebuilt-jar",
1536 jars: ["a.jar"],
1537 }
1538
1539 java_system_modules_import {
1540 name: "prebuilt-system-modules",
1541 libs: ["prebuilt-jar"],
1542 }
1543 `)
1544
1545 checkSystemModulesUseByDroidstubs(t, ctx, "stubs-source-system-modules", "source-jar.jar")
1546
1547 checkSystemModulesUseByDroidstubs(t, ctx, "stubs-prebuilt-system-modules", "prebuilt-jar.jar")
1548}
1549
1550func checkSystemModulesUseByDroidstubs(t *testing.T, ctx *android.TestContext, moduleName string, systemJar string) {
1551 metalavaRule := ctx.ModuleForTests(moduleName, "android_common").Rule("metalava")
1552 var systemJars []string
1553 for _, i := range metalavaRule.Implicits {
1554 systemJars = append(systemJars, i.Base())
1555 }
Ramy Medhatc7965cd2020-04-30 03:08:37 -04001556 if len(systemJars) < 1 || systemJars[0] != systemJar {
Paul Duffin83a2d962019-11-19 19:44:10 +00001557 t.Errorf("inputs of %q must be []string{%q}, but was %#v.", moduleName, systemJar, systemJars)
1558 }
1559}
1560
Colin Cross54250902017-12-05 09:28:08 -08001561func TestJarGenrules(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001562 ctx, _ := testJava(t, `
Colin Cross54250902017-12-05 09:28:08 -08001563 java_library {
1564 name: "foo",
1565 srcs: ["a.java"],
1566 }
1567
1568 java_genrule {
1569 name: "jargen",
1570 tool_files: ["b.java"],
1571 cmd: "$(location b.java) $(in) $(out)",
1572 out: ["jargen.jar"],
1573 srcs: [":foo"],
1574 }
1575
1576 java_library {
1577 name: "bar",
1578 static_libs: ["jargen"],
1579 srcs: ["c.java"],
1580 }
1581
1582 java_library {
1583 name: "baz",
1584 libs: ["jargen"],
1585 srcs: ["c.java"],
1586 }
1587 `)
1588
1589 foo := ctx.ModuleForTests("foo", "android_common").Output("javac/foo.jar")
1590 jargen := ctx.ModuleForTests("jargen", "android_common").Output("jargen.jar")
1591 bar := ctx.ModuleForTests("bar", "android_common").Output("javac/bar.jar")
1592 baz := ctx.ModuleForTests("baz", "android_common").Output("javac/baz.jar")
1593 barCombined := ctx.ModuleForTests("bar", "android_common").Output("combined/bar.jar")
1594
Colin Cross3d680512020-11-13 16:23:53 -08001595 if g, w := jargen.Implicits.Strings(), foo.Output.String(); !android.InList(w, g) {
1596 t.Errorf("expected jargen inputs [%q], got %q", w, g)
Colin Cross54250902017-12-05 09:28:08 -08001597 }
1598
1599 if !strings.Contains(bar.Args["classpath"], jargen.Output.String()) {
1600 t.Errorf("bar classpath %v does not contain %q", bar.Args["classpath"], jargen.Output.String())
1601 }
1602
1603 if !strings.Contains(baz.Args["classpath"], jargen.Output.String()) {
1604 t.Errorf("baz classpath %v does not contain %q", baz.Args["classpath"], jargen.Output.String())
1605 }
1606
1607 if len(barCombined.Inputs) != 2 ||
1608 barCombined.Inputs[0].String() != bar.Output.String() ||
1609 barCombined.Inputs[1].String() != jargen.Output.String() {
1610 t.Errorf("bar combined jar inputs %v is not [%q, %q]",
1611 barCombined.Inputs.Strings(), bar.Output.String(), jargen.Output.String())
1612 }
1613}
1614
Nan Zhang27e284d2018-02-09 21:03:53 +00001615func TestExcludeFileGroupInSrcs(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001616 ctx, _ := testJava(t, `
Nan Zhang27e284d2018-02-09 21:03:53 +00001617 java_library {
1618 name: "foo",
1619 srcs: ["a.java", ":foo-srcs"],
1620 exclude_srcs: ["a.java", ":foo-excludes"],
1621 }
1622
1623 filegroup {
1624 name: "foo-srcs",
1625 srcs: ["java-fg/a.java", "java-fg/b.java", "java-fg/c.java"],
1626 }
1627
1628 filegroup {
1629 name: "foo-excludes",
1630 srcs: ["java-fg/a.java", "java-fg/b.java"],
1631 }
1632 `)
1633
1634 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
1635
1636 if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "java-fg/c.java" {
1637 t.Errorf(`foo inputs %v != ["java-fg/c.java"]`, javac.Inputs)
1638 }
1639}
Jiyong Parkc678ad32018-04-10 13:07:10 +09001640
Paul Duffin52d398a2019-06-11 12:31:14 +01001641func TestJavaLibrary(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -08001642 config := testConfig(nil, "", map[string][]byte{
Paul Duffin52d398a2019-06-11 12:31:14 +01001643 "libcore/Android.bp": []byte(`
1644 java_library {
1645 name: "core",
1646 sdk_version: "none",
1647 system_modules: "none",
Paul Duffinaa55f742020-10-06 17:20:13 +01001648 }
1649
1650 filegroup {
1651 name: "core-jar",
1652 srcs: [":core{.jar}"],
1653 }
1654`),
1655 })
Colin Crossae8600b2020-10-29 17:09:13 -07001656 ctx := testContext(config)
Paul Duffinaa55f742020-10-06 17:20:13 +01001657 run(t, ctx, config)
1658}
1659
1660func TestJavaImport(t *testing.T) {
1661 config := testConfig(nil, "", map[string][]byte{
1662 "libcore/Android.bp": []byte(`
1663 java_import {
1664 name: "core",
1665 sdk_version: "none",
1666 }
1667
1668 filegroup {
1669 name: "core-jar",
1670 srcs: [":core{.jar}"],
1671 }
1672`),
Paul Duffin52d398a2019-06-11 12:31:14 +01001673 })
Colin Crossae8600b2020-10-29 17:09:13 -07001674 ctx := testContext(config)
Paul Duffin52d398a2019-06-11 12:31:14 +01001675 run(t, ctx, config)
1676}
1677
Jiyong Parkc678ad32018-04-10 13:07:10 +09001678func TestJavaSdkLibrary(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001679 ctx, _ := testJava(t, `
Paul Duffin884363e2019-12-19 10:21:09 +00001680 droiddoc_exported_dir {
Jiyong Parkc678ad32018-04-10 13:07:10 +09001681 name: "droiddoc-templates-sdk",
1682 path: ".",
1683 }
Jiyong Parkc678ad32018-04-10 13:07:10 +09001684 java_sdk_library {
1685 name: "foo",
1686 srcs: ["a.java", "b.java"],
1687 api_packages: ["foo"],
1688 }
1689 java_sdk_library {
1690 name: "bar",
1691 srcs: ["a.java", "b.java"],
1692 api_packages: ["bar"],
1693 }
1694 java_library {
1695 name: "baz",
1696 srcs: ["c.java"],
Paul Duffin859fe962020-05-15 10:20:31 +01001697 libs: ["foo", "bar.stubs"],
Jiyong Parkc678ad32018-04-10 13:07:10 +09001698 sdk_version: "system_current",
1699 }
Paul Duffindfa131e2020-05-15 20:37:11 +01001700 java_sdk_library {
1701 name: "barney",
1702 srcs: ["c.java"],
1703 api_only: true,
1704 }
1705 java_sdk_library {
1706 name: "betty",
1707 srcs: ["c.java"],
1708 shared_library: false,
1709 }
Paul Duffin859fe962020-05-15 10:20:31 +01001710 java_sdk_library_import {
1711 name: "quuz",
1712 public: {
1713 jars: ["c.jar"],
1714 },
1715 }
1716 java_sdk_library_import {
1717 name: "fred",
1718 public: {
1719 jars: ["b.jar"],
1720 },
1721 }
Paul Duffindfa131e2020-05-15 20:37:11 +01001722 java_sdk_library_import {
1723 name: "wilma",
1724 public: {
1725 jars: ["b.jar"],
1726 },
1727 shared_library: false,
1728 }
Jiyong Park1be96912018-05-28 18:02:19 +09001729 java_library {
1730 name: "qux",
1731 srcs: ["c.java"],
Paul Duffindfa131e2020-05-15 20:37:11 +01001732 libs: ["baz", "fred", "quuz.stubs", "wilma", "barney", "betty"],
Jiyong Park1be96912018-05-28 18:02:19 +09001733 sdk_version: "system_current",
1734 }
Paul Duffin726d23c2020-01-22 16:30:37 +00001735 java_library {
1736 name: "baz-test",
1737 srcs: ["c.java"],
1738 libs: ["foo"],
1739 sdk_version: "test_current",
1740 }
Paul Duffina2db18f2020-01-22 17:11:15 +00001741 java_library {
1742 name: "baz-29",
1743 srcs: ["c.java"],
1744 libs: ["foo"],
1745 sdk_version: "system_29",
1746 }
Paul Duffinfb6ae5b2020-09-30 15:17:25 +01001747 java_library {
1748 name: "baz-module-30",
1749 srcs: ["c.java"],
1750 libs: ["foo"],
1751 sdk_version: "module_30",
1752 }
Jiyong Parkc678ad32018-04-10 13:07:10 +09001753 `)
1754
1755 // check the existence of the internal modules
1756 ctx.ModuleForTests("foo", "android_common")
Paul Duffindd9d0742020-05-08 15:52:37 +01001757 ctx.ModuleForTests(apiScopePublic.stubsLibraryModuleName("foo"), "android_common")
1758 ctx.ModuleForTests(apiScopeSystem.stubsLibraryModuleName("foo"), "android_common")
1759 ctx.ModuleForTests(apiScopeTest.stubsLibraryModuleName("foo"), "android_common")
1760 ctx.ModuleForTests(apiScopePublic.stubsSourceModuleName("foo"), "android_common")
1761 ctx.ModuleForTests(apiScopeSystem.stubsSourceModuleName("foo"), "android_common")
1762 ctx.ModuleForTests(apiScopeTest.stubsSourceModuleName("foo"), "android_common")
Jiyong Parke3833882020-02-17 17:28:10 +09001763 ctx.ModuleForTests("foo"+sdkXmlFileSuffix, "android_common")
Jiyong Park58c518b2018-05-12 22:29:12 +09001764 ctx.ModuleForTests("foo.api.public.28", "")
1765 ctx.ModuleForTests("foo.api.system.28", "")
1766 ctx.ModuleForTests("foo.api.test.28", "")
Jiyong Parkc678ad32018-04-10 13:07:10 +09001767
1768 bazJavac := ctx.ModuleForTests("baz", "android_common").Rule("javac")
1769 // tests if baz is actually linked to the stubs lib
1770 if !strings.Contains(bazJavac.Args["classpath"], "foo.stubs.system.jar") {
1771 t.Errorf("baz javac classpath %v does not contain %q", bazJavac.Args["classpath"],
1772 "foo.stubs.system.jar")
1773 }
1774 // ... and not to the impl lib
Sundong Ahn054b19a2018-10-19 13:46:09 +09001775 if strings.Contains(bazJavac.Args["classpath"], "foo.jar") {
Jiyong Parkc678ad32018-04-10 13:07:10 +09001776 t.Errorf("baz javac classpath %v should not contain %q", bazJavac.Args["classpath"],
Sundong Ahn054b19a2018-10-19 13:46:09 +09001777 "foo.jar")
Jiyong Parkc678ad32018-04-10 13:07:10 +09001778 }
1779 // test if baz is not linked to the system variant of foo
1780 if strings.Contains(bazJavac.Args["classpath"], "foo.stubs.jar") {
1781 t.Errorf("baz javac classpath %v should not contain %q", bazJavac.Args["classpath"],
1782 "foo.stubs.jar")
1783 }
Jiyong Park1be96912018-05-28 18:02:19 +09001784
Paul Duffin726d23c2020-01-22 16:30:37 +00001785 bazTestJavac := ctx.ModuleForTests("baz-test", "android_common").Rule("javac")
1786 // tests if baz-test is actually linked to the test stubs lib
1787 if !strings.Contains(bazTestJavac.Args["classpath"], "foo.stubs.test.jar") {
1788 t.Errorf("baz-test javac classpath %v does not contain %q", bazTestJavac.Args["classpath"],
1789 "foo.stubs.test.jar")
1790 }
1791
Paul Duffina2db18f2020-01-22 17:11:15 +00001792 baz29Javac := ctx.ModuleForTests("baz-29", "android_common").Rule("javac")
1793 // tests if baz-29 is actually linked to the system 29 stubs lib
1794 if !strings.Contains(baz29Javac.Args["classpath"], "prebuilts/sdk/29/system/foo.jar") {
1795 t.Errorf("baz-29 javac classpath %v does not contain %q", baz29Javac.Args["classpath"],
1796 "prebuilts/sdk/29/system/foo.jar")
1797 }
1798
Paul Duffinfb6ae5b2020-09-30 15:17:25 +01001799 bazModule30Javac := ctx.ModuleForTests("baz-module-30", "android_common").Rule("javac")
1800 // tests if "baz-module-30" is actually linked to the module 30 stubs lib
1801 if !strings.Contains(bazModule30Javac.Args["classpath"], "prebuilts/sdk/30/module-lib/foo.jar") {
1802 t.Errorf("baz-module-30 javac classpath %v does not contain %q", bazModule30Javac.Args["classpath"],
1803 "prebuilts/sdk/30/module-lib/foo.jar")
1804 }
1805
Jiyong Park1be96912018-05-28 18:02:19 +09001806 // test if baz has exported SDK lib names foo and bar to qux
1807 qux := ctx.ModuleForTests("qux", "android_common")
1808 if quxLib, ok := qux.Module().(*Library); ok {
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +01001809 sdkLibs := quxLib.ClassLoaderContexts().UsesLibs()
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +00001810 if w := []string{"foo", "bar", "fred", "quuz"}; !reflect.DeepEqual(w, sdkLibs) {
Paul Duffin859fe962020-05-15 10:20:31 +01001811 t.Errorf("qux should export %q but exports %q", w, sdkLibs)
Jiyong Park1be96912018-05-28 18:02:19 +09001812 }
1813 }
Jiyong Parkc678ad32018-04-10 13:07:10 +09001814}
Zoran Jovanovic8736ce22018-08-21 17:10:29 +02001815
Anton Hansson7f66efa2020-10-08 14:47:23 +01001816func TestJavaSdkLibrary_StubOrImplOnlyLibs(t *testing.T) {
1817 ctx, _ := testJava(t, `
1818 java_sdk_library {
1819 name: "sdk_lib",
1820 srcs: ["a.java"],
1821 impl_only_libs: ["foo"],
1822 stub_only_libs: ["bar"],
1823 }
1824 java_library {
1825 name: "foo",
1826 srcs: ["a.java"],
1827 sdk_version: "current",
1828 }
1829 java_library {
1830 name: "bar",
1831 srcs: ["a.java"],
1832 sdk_version: "current",
1833 }
1834 `)
1835
1836 for _, implName := range []string{"sdk_lib", "sdk_lib.impl"} {
1837 implJavacCp := ctx.ModuleForTests(implName, "android_common").Rule("javac").Args["classpath"]
1838 if !strings.Contains(implJavacCp, "/foo.jar") || strings.Contains(implJavacCp, "/bar.jar") {
1839 t.Errorf("%v javac classpath %v does not contain foo and not bar", implName, implJavacCp)
1840 }
1841 }
1842 stubName := apiScopePublic.stubsLibraryModuleName("sdk_lib")
1843 stubsJavacCp := ctx.ModuleForTests(stubName, "android_common").Rule("javac").Args["classpath"]
1844 if strings.Contains(stubsJavacCp, "/foo.jar") || !strings.Contains(stubsJavacCp, "/bar.jar") {
1845 t.Errorf("stubs javac classpath %v does not contain bar and not foo", stubsJavacCp)
1846 }
1847}
1848
Paul Duffindaaa3322020-05-26 18:13:57 +01001849func TestJavaSdkLibrary_DoNotAccessImplWhenItIsNotBuilt(t *testing.T) {
1850 ctx, _ := testJava(t, `
1851 java_sdk_library {
1852 name: "foo",
1853 srcs: ["a.java"],
1854 api_only: true,
1855 public: {
1856 enabled: true,
1857 },
1858 }
1859
1860 java_library {
1861 name: "bar",
1862 srcs: ["b.java"],
1863 libs: ["foo"],
1864 }
1865 `)
1866
1867 // The bar library should depend on the stubs jar.
1868 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
1869 if expected, actual := `^-classpath .*:/[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
1870 t.Errorf("expected %q, found %#q", expected, actual)
1871 }
1872}
1873
Paul Duffin46dc45a2020-05-14 15:39:10 +01001874func TestJavaSdkLibrary_UseSourcesFromAnotherSdkLibrary(t *testing.T) {
1875 testJava(t, `
1876 java_sdk_library {
1877 name: "foo",
1878 srcs: ["a.java"],
1879 api_packages: ["foo"],
1880 public: {
1881 enabled: true,
1882 },
1883 }
1884
1885 java_library {
1886 name: "bar",
1887 srcs: ["b.java", ":foo{.public.stubs.source}"],
1888 }
1889 `)
1890}
1891
1892func TestJavaSdkLibrary_AccessOutputFiles_MissingScope(t *testing.T) {
1893 testJavaError(t, `"foo" does not provide api scope system`, `
1894 java_sdk_library {
1895 name: "foo",
1896 srcs: ["a.java"],
1897 api_packages: ["foo"],
1898 public: {
1899 enabled: true,
1900 },
1901 }
1902
1903 java_library {
1904 name: "bar",
1905 srcs: ["b.java", ":foo{.system.stubs.source}"],
1906 }
1907 `)
1908}
1909
Paul Duffinca8d9a52020-06-26 22:20:25 +01001910func TestJavaSdkLibrary_Deps(t *testing.T) {
1911 ctx, _ := testJava(t, `
1912 java_sdk_library {
1913 name: "sdklib",
1914 srcs: ["a.java"],
1915 sdk_version: "none",
1916 system_modules: "none",
1917 public: {
1918 enabled: true,
1919 },
1920 }
1921 `)
1922
Paul Duffincee7e662020-07-09 17:32:57 +01001923 CheckModuleDependencies(t, ctx, "sdklib", "android_common", []string{
Paul Duffinca8d9a52020-06-26 22:20:25 +01001924 `dex2oatd`,
1925 `sdklib.impl`,
1926 `sdklib.stubs`,
1927 `sdklib.stubs.source`,
1928 `sdklib.xml`,
1929 })
1930}
1931
Paul Duffin46dc45a2020-05-14 15:39:10 +01001932func TestJavaSdkLibraryImport_AccessOutputFiles(t *testing.T) {
1933 testJava(t, `
1934 java_sdk_library_import {
1935 name: "foo",
1936 public: {
1937 jars: ["a.jar"],
1938 stub_srcs: ["a.java"],
1939 current_api: "api/current.txt",
1940 removed_api: "api/removed.txt",
1941 },
1942 }
1943
1944 java_library {
1945 name: "bar",
1946 srcs: [":foo{.public.stubs.source}"],
1947 java_resources: [
1948 ":foo{.public.api.txt}",
1949 ":foo{.public.removed-api.txt}",
1950 ],
1951 }
1952 `)
1953}
1954
1955func TestJavaSdkLibraryImport_AccessOutputFiles_Invalid(t *testing.T) {
1956 bp := `
1957 java_sdk_library_import {
1958 name: "foo",
1959 public: {
1960 jars: ["a.jar"],
1961 },
1962 }
1963 `
1964
1965 t.Run("stubs.source", func(t *testing.T) {
1966 testJavaError(t, `stubs.source not available for api scope public`, bp+`
1967 java_library {
1968 name: "bar",
1969 srcs: [":foo{.public.stubs.source}"],
1970 java_resources: [
1971 ":foo{.public.api.txt}",
1972 ":foo{.public.removed-api.txt}",
1973 ],
1974 }
1975 `)
1976 })
1977
1978 t.Run("api.txt", func(t *testing.T) {
1979 testJavaError(t, `api.txt not available for api scope public`, bp+`
1980 java_library {
1981 name: "bar",
1982 srcs: ["a.java"],
1983 java_resources: [
1984 ":foo{.public.api.txt}",
1985 ],
1986 }
1987 `)
1988 })
1989
1990 t.Run("removed-api.txt", func(t *testing.T) {
1991 testJavaError(t, `removed-api.txt not available for api scope public`, bp+`
1992 java_library {
1993 name: "bar",
1994 srcs: ["a.java"],
1995 java_resources: [
1996 ":foo{.public.removed-api.txt}",
1997 ],
1998 }
1999 `)
2000 })
2001}
2002
Paul Duffin3375e352020-04-28 10:44:03 +01002003func TestJavaSdkLibrary_InvalidScopes(t *testing.T) {
2004 testJavaError(t, `module "foo": enabled api scope "system" depends on disabled scope "public"`, `
2005 java_sdk_library {
2006 name: "foo",
2007 srcs: ["a.java", "b.java"],
2008 api_packages: ["foo"],
2009 // Explicitly disable public to test the check that ensures the set of enabled
2010 // scopes is consistent.
2011 public: {
2012 enabled: false,
2013 },
2014 system: {
2015 enabled: true,
2016 },
2017 }
2018 `)
2019}
2020
Paul Duffin87a05a32020-05-12 11:50:28 +01002021func TestJavaSdkLibrary_SdkVersion_ForScope(t *testing.T) {
2022 testJava(t, `
2023 java_sdk_library {
2024 name: "foo",
2025 srcs: ["a.java", "b.java"],
2026 api_packages: ["foo"],
2027 system: {
2028 enabled: true,
2029 sdk_version: "module_current",
2030 },
2031 }
2032 `)
2033}
2034
Paul Duffin0c5bae52020-06-02 13:00:08 +01002035func TestJavaSdkLibrary_ModuleLib(t *testing.T) {
2036 testJava(t, `
2037 java_sdk_library {
2038 name: "foo",
2039 srcs: ["a.java", "b.java"],
2040 api_packages: ["foo"],
2041 system: {
2042 enabled: true,
2043 },
2044 module_lib: {
2045 enabled: true,
2046 },
2047 }
2048 `)
2049}
2050
2051func TestJavaSdkLibrary_SystemServer(t *testing.T) {
2052 testJava(t, `
2053 java_sdk_library {
2054 name: "foo",
2055 srcs: ["a.java", "b.java"],
2056 api_packages: ["foo"],
2057 system: {
2058 enabled: true,
2059 },
2060 system_server: {
2061 enabled: true,
2062 },
2063 }
2064 `)
2065}
2066
Paul Duffin803a9562020-05-20 11:52:25 +01002067func TestJavaSdkLibrary_MissingScope(t *testing.T) {
2068 testJavaError(t, `requires api scope module-lib from foo but it only has \[\] available`, `
2069 java_sdk_library {
2070 name: "foo",
2071 srcs: ["a.java"],
2072 public: {
2073 enabled: false,
2074 },
2075 }
2076
2077 java_library {
2078 name: "baz",
2079 srcs: ["a.java"],
2080 libs: ["foo"],
2081 sdk_version: "module_current",
2082 }
2083 `)
2084}
2085
2086func TestJavaSdkLibrary_FallbackScope(t *testing.T) {
2087 testJava(t, `
2088 java_sdk_library {
2089 name: "foo",
2090 srcs: ["a.java"],
2091 system: {
2092 enabled: true,
2093 },
2094 }
2095
2096 java_library {
2097 name: "baz",
2098 srcs: ["a.java"],
2099 libs: ["foo"],
2100 // foo does not have module-lib scope so it should fallback to system
2101 sdk_version: "module_current",
2102 }
2103 `)
2104}
2105
Jiyong Park932cdfe2020-05-28 00:19:53 +09002106func TestJavaSdkLibrary_DefaultToStubs(t *testing.T) {
2107 ctx, _ := testJava(t, `
2108 java_sdk_library {
2109 name: "foo",
2110 srcs: ["a.java"],
2111 system: {
2112 enabled: true,
2113 },
2114 default_to_stubs: true,
2115 }
2116
2117 java_library {
2118 name: "baz",
2119 srcs: ["a.java"],
2120 libs: ["foo"],
2121 // does not have sdk_version set, should fallback to module,
2122 // which will then fallback to system because the module scope
2123 // is not enabled.
2124 }
2125 `)
2126 // The baz library should depend on the system stubs jar.
2127 bazLibrary := ctx.ModuleForTests("baz", "android_common").Rule("javac")
2128 if expected, actual := `^-classpath .*:/[^:]*/turbine-combined/foo\.stubs.system\.jar$`, bazLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
2129 t.Errorf("expected %q, found %#q", expected, actual)
2130 }
2131}
2132
Zoran Jovanovic8736ce22018-08-21 17:10:29 +02002133var compilerFlagsTestCases = []struct {
2134 in string
2135 out bool
2136}{
2137 {
2138 in: "a",
2139 out: false,
2140 },
2141 {
2142 in: "-a",
2143 out: true,
2144 },
2145 {
2146 in: "-no-jdk",
2147 out: false,
2148 },
2149 {
2150 in: "-no-stdlib",
2151 out: false,
2152 },
2153 {
2154 in: "-kotlin-home",
2155 out: false,
2156 },
2157 {
2158 in: "-kotlin-home /some/path",
2159 out: false,
2160 },
2161 {
2162 in: "-include-runtime",
2163 out: false,
2164 },
2165 {
2166 in: "-Xintellij-plugin-root",
2167 out: false,
2168 },
2169}
2170
2171type mockContext struct {
2172 android.ModuleContext
2173 result bool
2174}
2175
2176func (ctx *mockContext) PropertyErrorf(property, format string, args ...interface{}) {
2177 // CheckBadCompilerFlags calls this function when the flag should be rejected
2178 ctx.result = false
2179}
2180
2181func TestCompilerFlags(t *testing.T) {
2182 for _, testCase := range compilerFlagsTestCases {
2183 ctx := &mockContext{result: true}
2184 CheckKotlincFlags(ctx, []string{testCase.in})
2185 if ctx.result != testCase.out {
2186 t.Errorf("incorrect output:")
2187 t.Errorf(" input: %#v", testCase.in)
2188 t.Errorf(" expected: %#v", testCase.out)
2189 t.Errorf(" got: %#v", ctx.result)
2190 }
2191 }
2192}
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08002193
2194// TODO(jungjw): Consider making this more robust by ignoring path order.
2195func checkPatchModuleFlag(t *testing.T, ctx *android.TestContext, moduleName string, expected string) {
2196 variables := ctx.ModuleForTests(moduleName, "android_common").Module().VariablesForTests()
2197 flags := strings.Split(variables["javacFlags"], " ")
2198 got := ""
2199 for _, flag := range flags {
2200 keyEnd := strings.Index(flag, "=")
2201 if keyEnd > -1 && flag[:keyEnd] == "--patch-module" {
2202 got = flag[keyEnd+1:]
2203 break
2204 }
2205 }
2206 if expected != got {
2207 t.Errorf("Unexpected patch-module flag for module %q - expected %q, but got %q", moduleName, expected, got)
2208 }
2209}
2210
2211func TestPatchModule(t *testing.T) {
Pete Gillin0c2143e2019-05-02 15:32:11 +01002212 t.Run("Java language level 8", func(t *testing.T) {
Pete Gillin1b3370f2019-10-01 13:57:31 +01002213 // Test with legacy javac -source 1.8 -target 1.8
Pete Gillinbdf5d712019-10-21 14:29:58 +01002214 bp := `
2215 java_library {
2216 name: "foo",
2217 srcs: ["a.java"],
2218 java_version: "1.8",
2219 }
2220
2221 java_library {
2222 name: "bar",
2223 srcs: ["b.java"],
2224 sdk_version: "none",
2225 system_modules: "none",
2226 patch_module: "java.base",
2227 java_version: "1.8",
2228 }
2229
2230 java_library {
2231 name: "baz",
2232 srcs: ["c.java"],
2233 patch_module: "java.base",
2234 java_version: "1.8",
2235 }
2236 `
2237 ctx, _ := testJava(t, bp)
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08002238
2239 checkPatchModuleFlag(t, ctx, "foo", "")
2240 checkPatchModuleFlag(t, ctx, "bar", "")
2241 checkPatchModuleFlag(t, ctx, "baz", "")
2242 })
2243
Pete Gillin0c2143e2019-05-02 15:32:11 +01002244 t.Run("Java language level 9", func(t *testing.T) {
Pete Gillin1b3370f2019-10-01 13:57:31 +01002245 // Test with default javac -source 9 -target 9
Pete Gillinbdf5d712019-10-21 14:29:58 +01002246 bp := `
2247 java_library {
2248 name: "foo",
2249 srcs: ["a.java"],
2250 }
2251
2252 java_library {
2253 name: "bar",
2254 srcs: ["b.java"],
2255 sdk_version: "none",
2256 system_modules: "none",
2257 patch_module: "java.base",
2258 }
2259
2260 java_library {
2261 name: "baz",
Jingwen Chen5136a6e2020-10-30 01:01:35 -04002262 srcs: [
2263 "c.java",
2264 // Tests for b/150878007
2265 "dir/d.java",
2266 "dir2/e.java",
2267 "dir2/f.java",
2268 "nested/dir/g.java"
2269 ],
Pete Gillinbdf5d712019-10-21 14:29:58 +01002270 patch_module: "java.base",
2271 }
2272 `
Pete Gillin1b3370f2019-10-01 13:57:31 +01002273 ctx, _ := testJava(t, bp)
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08002274
2275 checkPatchModuleFlag(t, ctx, "foo", "")
2276 expected := "java.base=.:" + buildDir
2277 checkPatchModuleFlag(t, ctx, "bar", expected)
Jingwen Chen5136a6e2020-10-30 01:01:35 -04002278 expected = "java.base=" + strings.Join([]string{
2279 ".", buildDir, "dir", "dir2", "nested", moduleToPath("ext"), moduleToPath("framework")}, ":")
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08002280 checkPatchModuleFlag(t, ctx, "baz", expected)
2281 })
2282}
Paul Duffina7b9f422020-01-10 17:12:18 +00002283
2284func TestJavaSystemModules(t *testing.T) {
2285 ctx, _ := testJava(t, `
2286 java_system_modules {
2287 name: "system-modules",
2288 libs: ["system-module1", "system-module2"],
2289 }
2290 java_library {
2291 name: "system-module1",
2292 srcs: ["a.java"],
2293 sdk_version: "none",
2294 system_modules: "none",
2295 }
2296 java_library {
2297 name: "system-module2",
2298 srcs: ["b.java"],
2299 sdk_version: "none",
2300 system_modules: "none",
2301 }
2302 `)
2303
2304 // check the existence of the module
2305 systemModules := ctx.ModuleForTests("system-modules", "android_common")
2306
2307 cmd := systemModules.Rule("jarsTosystemModules")
2308
2309 // make sure the command compiles against the supplied modules.
2310 for _, module := range []string{"system-module1.jar", "system-module2.jar"} {
2311 if !strings.Contains(cmd.Args["classpath"], module) {
2312 t.Errorf("system modules classpath %v does not contain %q", cmd.Args["classpath"],
2313 module)
2314 }
2315 }
2316}
Paul Duffin90169ba2020-01-10 17:16:44 +00002317
2318func TestJavaSystemModulesImport(t *testing.T) {
2319 ctx, _ := testJava(t, `
2320 java_system_modules_import {
2321 name: "system-modules",
2322 libs: ["system-module1", "system-module2"],
2323 }
2324 java_import {
2325 name: "system-module1",
2326 jars: ["a.jar"],
2327 }
2328 java_import {
2329 name: "system-module2",
2330 jars: ["b.jar"],
2331 }
2332 `)
2333
2334 // check the existence of the module
2335 systemModules := ctx.ModuleForTests("system-modules", "android_common")
2336
2337 cmd := systemModules.Rule("jarsTosystemModules")
2338
2339 // make sure the command compiles against the supplied modules.
2340 for _, module := range []string{"system-module1.jar", "system-module2.jar"} {
2341 if !strings.Contains(cmd.Args["classpath"], module) {
2342 t.Errorf("system modules classpath %v does not contain %q", cmd.Args["classpath"],
2343 module)
2344 }
2345 }
2346}
Paul Duffin83a2d962019-11-19 19:44:10 +00002347
2348func TestJavaLibraryWithSystemModules(t *testing.T) {
2349 ctx, _ := testJava(t, `
2350 java_library {
2351 name: "lib-with-source-system-modules",
2352 srcs: [
2353 "a.java",
2354 ],
2355 sdk_version: "none",
2356 system_modules: "source-system-modules",
2357 }
2358
2359 java_library {
2360 name: "source-jar",
2361 srcs: [
2362 "a.java",
2363 ],
2364 }
2365
2366 java_system_modules {
2367 name: "source-system-modules",
2368 libs: ["source-jar"],
2369 }
2370
2371 java_library {
2372 name: "lib-with-prebuilt-system-modules",
2373 srcs: [
2374 "a.java",
2375 ],
2376 sdk_version: "none",
2377 system_modules: "prebuilt-system-modules",
2378 }
2379
2380 java_import {
2381 name: "prebuilt-jar",
2382 jars: ["a.jar"],
2383 }
2384
2385 java_system_modules_import {
2386 name: "prebuilt-system-modules",
2387 libs: ["prebuilt-jar"],
2388 }
2389 `)
2390
2391 checkBootClasspathForSystemModule(t, ctx, "lib-with-source-system-modules", "/source-jar.jar")
2392
2393 checkBootClasspathForSystemModule(t, ctx, "lib-with-prebuilt-system-modules", "/prebuilt-jar.jar")
2394}
2395
2396func checkBootClasspathForSystemModule(t *testing.T, ctx *android.TestContext, moduleName string, expectedSuffix string) {
2397 javacRule := ctx.ModuleForTests(moduleName, "android_common").Rule("javac")
2398 bootClasspath := javacRule.Args["bootClasspath"]
2399 if strings.HasPrefix(bootClasspath, "--system ") && strings.HasSuffix(bootClasspath, expectedSuffix) {
2400 t.Errorf("bootclasspath of %q must start with --system and end with %q, but was %#v.", moduleName, expectedSuffix, bootClasspath)
2401 }
2402}
Jiyong Park19604de2020-03-24 16:44:11 +09002403
2404func TestAidlExportIncludeDirsFromImports(t *testing.T) {
2405 ctx, _ := testJava(t, `
2406 java_library {
2407 name: "foo",
2408 srcs: ["aidl/foo/IFoo.aidl"],
2409 libs: ["bar"],
2410 }
2411
2412 java_import {
2413 name: "bar",
2414 jars: ["a.jar"],
2415 aidl: {
2416 export_include_dirs: ["aidl/bar"],
2417 },
2418 }
2419 `)
2420
2421 aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
2422 expectedAidlFlag := "-Iaidl/bar"
2423 if !strings.Contains(aidlCommand, expectedAidlFlag) {
2424 t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
2425 }
2426}
Liz Kammerdd849a82020-06-12 16:38:45 -07002427
2428func TestDataNativeBinaries(t *testing.T) {
2429 ctx, config := testJava(t, `
2430 java_test_host {
2431 name: "foo",
2432 srcs: ["a.java"],
2433 data_native_bins: ["bin"]
2434 }
2435
2436 python_binary_host {
2437 name: "bin",
2438 srcs: ["bin.py"],
2439 }
2440 `)
2441
2442 buildOS := android.BuildOs.String()
2443
2444 test := ctx.ModuleForTests("foo", buildOS+"_common").Module().(*TestHost)
2445 entries := android.AndroidMkEntriesForTest(t, config, "", test)[0]
2446 expected := []string{buildDir + "/.intermediates/bin/" + buildOS + "_x86_64_PY3/bin:bin"}
2447 actual := entries.EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
2448 if !reflect.DeepEqual(expected, actual) {
2449 t.Errorf("Unexpected test data - expected: %q, actual: %q", expected, actual)
2450 }
2451}