blob: dc42e9e59c244a80c5c8b1ca0dc2bc3d4d5ac305 [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 "os"
20 "path/filepath"
Colin Crossc0806172019-06-14 18:51:47 -070021 "reflect"
Colin Crossf8d9c492021-01-26 11:01:43 -080022 "runtime"
Nan Zhang61eaedb2017-11-02 13:28:15 -070023 "strconv"
Colin Cross72bb3632017-07-13 16:23:21 -070024 "strings"
25 "testing"
Colin Cross86a60ae2018-05-29 14:44:55 -070026
Jeongik Cha28df2572019-11-11 10:46:36 +090027 "github.com/google/blueprint/proptools"
28
Colin Crossa4f08812018-10-02 22:03:40 -070029 "android/soong/android"
30 "android/soong/cc"
Colin Crossc28bb0b2019-02-25 14:20:47 -080031 "android/soong/dexpreopt"
Colin Cross1661aff2021-03-12 17:56:51 -080032 "android/soong/genrule"
Colin Cross72bb3632017-07-13 16:23:21 -070033)
34
Paul Duffin70d3bee2021-03-21 11:26:05 +000035// Legacy preparer used for running tests within the java package.
36//
37// This includes everything that was needed to run any test in the java package prior to the
38// introduction of the test fixtures. Tests that are being converted to use fixtures directly
39// rather than through the testJava...() methods should avoid using this and instead use the
40// various preparers directly, using android.GroupFixturePreparers(...) to group them when
41// necessary.
42//
43// deprecated
44var prepareForJavaTest = android.GroupFixturePreparers(
Paul Duffin95bdab42021-03-08 21:48:46 +000045 genrule.PrepareForTestWithGenRuleBuildComponents,
46 // Get the CC build components but not default modules.
47 cc.PrepareForTestWithCcBuildComponents,
48 // Include all the default java modules.
49 PrepareForTestWithJavaDefaultModules,
Paul Duffin42da69d2021-03-22 13:41:36 +000050 PrepareForTestWithOverlayBuildComponents,
Paul Duffin95bdab42021-03-08 21:48:46 +000051 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
Paul Duffin95bdab42021-03-08 21:48:46 +000052 ctx.RegisterPreSingletonType("sdk_versions", sdkPreSingletonFactory)
53 }),
Paul Duffin9fc9f532021-03-23 15:41:11 +000054 PrepareForTestWithDexpreopt,
Paul Duffin95bdab42021-03-08 21:48:46 +000055)
56
Colin Cross72bb3632017-07-13 16:23:21 -070057func TestMain(m *testing.M) {
Paul Duffind6339af2021-03-22 18:05:04 +000058 os.Exit(m.Run())
Colin Cross527012a2017-11-30 22:56:16 -080059}
60
Paul Duffin95bdab42021-03-08 21:48:46 +000061// testJavaError is a legacy way of running tests of java modules that expect errors.
62//
63// See testJava for an explanation as to how to stop using this deprecated method.
64//
65// deprecated
Jeongik Cha2cc570d2019-10-29 15:44:45 +090066func testJavaError(t *testing.T, pattern string, bp string) (*android.TestContext, android.Config) {
Jeongik Cha538c0d02019-07-11 15:54:27 +090067 t.Helper()
Paul Duffin71ae5942021-03-22 15:36:52 +000068 result := android.GroupFixturePreparers(
Paul Duffin9fc9f532021-03-23 15:41:11 +000069 prepareForJavaTest, dexpreopt.PrepareForTestByEnablingDexpreopt).
Paul Duffin6bac49c2021-03-12 21:28:15 +000070 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
71 RunTestWithBp(t, bp)
72 return result.TestContext, result.Config
Jeongik Cha2cc570d2019-10-29 15:44:45 +090073}
74
Paul Duffin71ae5942021-03-22 15:36:52 +000075// testJavaWithFS runs tests using the prepareForJavaTest
Paul Duffin95bdab42021-03-08 21:48:46 +000076//
77// See testJava for an explanation as to how to stop using this deprecated method.
78//
79// deprecated
80func testJavaWithFS(t *testing.T, bp string, fs android.MockFS) (*android.TestContext, android.Config) {
Colin Cross238c1f32020-06-07 16:58:18 -070081 t.Helper()
Paul Duffin71ae5942021-03-22 15:36:52 +000082 result := android.GroupFixturePreparers(
83 prepareForJavaTest, fs.AddToFixture()).RunTestWithBp(t, bp)
Paul Duffin95bdab42021-03-08 21:48:46 +000084 return result.TestContext, result.Config
Colin Cross238c1f32020-06-07 16:58:18 -070085}
86
Paul Duffin71ae5942021-03-22 15:36:52 +000087// testJava runs tests using the prepareForJavaTest
Paul Duffin95bdab42021-03-08 21:48:46 +000088//
Paul Duffin71ae5942021-03-22 15:36:52 +000089// Do not add any new usages of this, instead use the prepareForJavaTest directly as it makes it
Paul Duffin95bdab42021-03-08 21:48:46 +000090// much easier to customize the test behavior.
91//
92// If it is necessary to customize the behavior of an existing test that uses this then please first
Paul Duffin71ae5942021-03-22 15:36:52 +000093// convert the test to using prepareForJavaTest first and then in a following change add the
Paul Duffin95bdab42021-03-08 21:48:46 +000094// appropriate fixture preparers. Keeping the conversion change separate makes it easy to verify
95// that it did not change the test behavior unexpectedly.
96//
97// deprecated
Jaewoong Jungf9a04432019-07-17 11:15:09 -070098func testJava(t *testing.T, bp string) (*android.TestContext, android.Config) {
Colin Cross6b4a32d2017-12-05 13:42:45 -080099 t.Helper()
Paul Duffin71ae5942021-03-22 15:36:52 +0000100 result := prepareForJavaTest.RunTestWithBp(t, bp)
Paul Duffin95bdab42021-03-08 21:48:46 +0000101 return result.TestContext, result.Config
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900102}
103
Paul Duffin95bdab42021-03-08 21:48:46 +0000104// defaultModuleToPath constructs a path to the turbine generate jar for a default test module that
105// is defined in PrepareForIntegrationTestWithJava
106func defaultModuleToPath(name string) string {
Paul Duffin76101fa2021-03-13 09:55:25 +0000107 switch {
108 case name == `""`:
109 return name
110 case strings.HasSuffix(name, ".jar"):
111 return name
112 default:
Paul Duffin414ea5e2021-03-22 17:31:52 +0000113 return filepath.Join("out", "soong", ".intermediates", defaultJavaDir, name, "android_common", "turbine-combined", name+".jar")
Paul Duffin76101fa2021-03-13 09:55:25 +0000114 }
Paul Duffin95bdab42021-03-08 21:48:46 +0000115}
116
Paul Duffin76e5c8a2021-03-20 14:19:46 +0000117// Test that the PrepareForTestWithJavaDefaultModules provides all the files that it uses by
118// running it in a fixture that requires all source files to exist.
119func TestPrepareForTestWithJavaDefaultModules(t *testing.T) {
120 android.GroupFixturePreparers(
121 PrepareForTestWithJavaDefaultModules,
122 android.PrepareForTestDisallowNonExistentPaths,
123 ).RunTest(t)
124}
125
Jeongik Chae403e9e2019-12-07 00:16:24 +0900126func TestJavaLinkType(t *testing.T) {
127 testJava(t, `
128 java_library {
129 name: "foo",
130 srcs: ["a.java"],
131 libs: ["bar"],
132 static_libs: ["baz"],
133 }
134
135 java_library {
136 name: "bar",
137 sdk_version: "current",
138 srcs: ["b.java"],
139 }
140
141 java_library {
142 name: "baz",
143 sdk_version: "system_current",
144 srcs: ["c.java"],
145 }
146 `)
147
Steven Moreland00298982020-11-17 21:44:36 +0000148 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900149 java_library {
150 name: "foo",
151 srcs: ["a.java"],
152 libs: ["bar"],
153 sdk_version: "current",
154 static_libs: ["baz"],
155 }
156
157 java_library {
158 name: "bar",
159 sdk_version: "current",
160 srcs: ["b.java"],
161 }
162
163 java_library {
164 name: "baz",
165 sdk_version: "system_current",
166 srcs: ["c.java"],
167 }
168 `)
169
170 testJava(t, `
171 java_library {
172 name: "foo",
173 srcs: ["a.java"],
174 libs: ["bar"],
175 sdk_version: "system_current",
176 static_libs: ["baz"],
177 }
178
179 java_library {
180 name: "bar",
181 sdk_version: "current",
182 srcs: ["b.java"],
183 }
184
185 java_library {
186 name: "baz",
187 sdk_version: "system_current",
188 srcs: ["c.java"],
189 }
190 `)
191
Steven Moreland00298982020-11-17 21:44:36 +0000192 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900193 java_library {
194 name: "foo",
195 srcs: ["a.java"],
196 libs: ["bar"],
197 sdk_version: "system_current",
198 static_libs: ["baz"],
199 }
200
201 java_library {
202 name: "bar",
203 sdk_version: "current",
204 srcs: ["b.java"],
205 }
206
207 java_library {
208 name: "baz",
209 srcs: ["c.java"],
210 }
211 `)
212}
213
Colin Cross72bb3632017-07-13 16:23:21 -0700214func TestSimple(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700215 ctx, _ := testJava(t, `
Colin Cross72bb3632017-07-13 16:23:21 -0700216 java_library {
217 name: "foo",
218 srcs: ["a.java"],
Colin Crosse8dc34a2017-07-19 11:22:16 -0700219 libs: ["bar"],
220 static_libs: ["baz"],
Colin Cross72bb3632017-07-13 16:23:21 -0700221 }
222
223 java_library {
224 name: "bar",
225 srcs: ["b.java"],
226 }
227
228 java_library {
229 name: "baz",
230 srcs: ["c.java"],
231 }
Colin Crossd5934c82017-10-02 13:55:26 -0700232 `)
Colin Cross72bb3632017-07-13 16:23:21 -0700233
Paul Duffina71a67a2021-03-29 00:42:57 +0100234 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
Nan Zhanged19fc32017-10-19 13:06:22 -0700235 combineJar := ctx.ModuleForTests("foo", "android_common").Description("for javac")
Colin Cross72bb3632017-07-13 16:23:21 -0700236
237 if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "a.java" {
238 t.Errorf(`foo inputs %v != ["a.java"]`, javac.Inputs)
239 }
240
Colin Cross1ee23172017-10-18 14:44:18 -0700241 baz := ctx.ModuleForTests("baz", "android_common").Rule("javac").Output.String()
Paul Duffin414ea5e2021-03-22 17:31:52 +0000242 barTurbine := filepath.Join("out", "soong", ".intermediates", "bar", "android_common", "turbine-combined", "bar.jar")
243 bazTurbine := filepath.Join("out", "soong", ".intermediates", "baz", "android_common", "turbine-combined", "baz.jar")
Colin Cross0a6e0072017-08-30 14:24:55 -0700244
Paul Duffin22b77cd2021-03-12 19:15:01 +0000245 android.AssertStringDoesContain(t, "foo classpath", javac.Args["classpath"], barTurbine)
Colin Cross72bb3632017-07-13 16:23:21 -0700246
Paul Duffin22b77cd2021-03-12 19:15:01 +0000247 android.AssertStringDoesContain(t, "foo classpath", javac.Args["classpath"], bazTurbine)
Colin Cross0a6e0072017-08-30 14:24:55 -0700248
249 if len(combineJar.Inputs) != 2 || combineJar.Inputs[1].String() != baz {
250 t.Errorf("foo combineJar inputs %v does not contain %q", combineJar.Inputs, baz)
Colin Cross72bb3632017-07-13 16:23:21 -0700251 }
252}
253
Artur Satayev9cf46692019-11-26 18:08:34 +0000254func TestExportedPlugins(t *testing.T) {
255 type Result struct {
Colin Crossc9fe10f2020-11-19 18:06:03 -0800256 library string
257 processors string
258 disableTurbine bool
Artur Satayev9cf46692019-11-26 18:08:34 +0000259 }
260 var tests = []struct {
261 name string
262 extra string
263 results []Result
264 }{
265 {
266 name: "Exported plugin is not a direct plugin",
267 extra: `java_library { name: "exports", srcs: ["a.java"], exported_plugins: ["plugin"] }`,
268 results: []Result{{library: "exports", processors: "-proc:none"}},
269 },
270 {
271 name: "Exports plugin to dependee",
272 extra: `
273 java_library{name: "exports", exported_plugins: ["plugin"]}
274 java_library{name: "foo", srcs: ["a.java"], libs: ["exports"]}
275 java_library{name: "bar", srcs: ["a.java"], static_libs: ["exports"]}
276 `,
277 results: []Result{
278 {library: "foo", processors: "-processor com.android.TestPlugin"},
279 {library: "bar", processors: "-processor com.android.TestPlugin"},
280 },
281 },
282 {
283 name: "Exports plugin to android_library",
284 extra: `
285 java_library{name: "exports", exported_plugins: ["plugin"]}
286 android_library{name: "foo", srcs: ["a.java"], libs: ["exports"]}
287 android_library{name: "bar", srcs: ["a.java"], static_libs: ["exports"]}
288 `,
289 results: []Result{
290 {library: "foo", processors: "-processor com.android.TestPlugin"},
291 {library: "bar", processors: "-processor com.android.TestPlugin"},
292 },
293 },
294 {
295 name: "Exports plugin is not propagated via transitive deps",
296 extra: `
297 java_library{name: "exports", exported_plugins: ["plugin"]}
298 java_library{name: "foo", srcs: ["a.java"], libs: ["exports"]}
299 java_library{name: "bar", srcs: ["a.java"], static_libs: ["foo"]}
300 `,
301 results: []Result{
302 {library: "foo", processors: "-processor com.android.TestPlugin"},
303 {library: "bar", processors: "-proc:none"},
304 },
305 },
306 {
307 name: "Exports plugin appends to plugins",
308 extra: `
309 java_plugin{name: "plugin2", processor_class: "com.android.TestPlugin2"}
310 java_library{name: "exports", exported_plugins: ["plugin"]}
311 java_library{name: "foo", srcs: ["a.java"], libs: ["exports"], plugins: ["plugin2"]}
312 `,
313 results: []Result{
314 {library: "foo", processors: "-processor com.android.TestPlugin,com.android.TestPlugin2"},
315 },
316 },
Colin Crossc9fe10f2020-11-19 18:06:03 -0800317 {
318 name: "Exports plugin to with generates_api to dependee",
319 extra: `
320 java_library{name: "exports", exported_plugins: ["plugin_generates_api"]}
321 java_library{name: "foo", srcs: ["a.java"], libs: ["exports"]}
322 java_library{name: "bar", srcs: ["a.java"], static_libs: ["exports"]}
323 `,
324 results: []Result{
325 {library: "foo", processors: "-processor com.android.TestPlugin", disableTurbine: true},
326 {library: "bar", processors: "-processor com.android.TestPlugin", disableTurbine: true},
327 },
328 },
Artur Satayev9cf46692019-11-26 18:08:34 +0000329 }
330
331 for _, test := range tests {
332 t.Run(test.name, func(t *testing.T) {
333 ctx, _ := testJava(t, `
334 java_plugin {
335 name: "plugin",
336 processor_class: "com.android.TestPlugin",
337 }
Colin Crossc9fe10f2020-11-19 18:06:03 -0800338 java_plugin {
339 name: "plugin_generates_api",
340 generates_api: true,
341 processor_class: "com.android.TestPlugin",
342 }
Artur Satayev9cf46692019-11-26 18:08:34 +0000343 `+test.extra)
344
345 for _, want := range test.results {
346 javac := ctx.ModuleForTests(want.library, "android_common").Rule("javac")
347 if javac.Args["processor"] != want.processors {
348 t.Errorf("For library %v, expected %v, found %v", want.library, want.processors, javac.Args["processor"])
349 }
Colin Crossc9fe10f2020-11-19 18:06:03 -0800350 turbine := ctx.ModuleForTests(want.library, "android_common").MaybeRule("turbine")
351 disableTurbine := turbine.BuildParams.Rule == nil
352 if disableTurbine != want.disableTurbine {
353 t.Errorf("For library %v, expected disableTurbine %v, found %v", want.library, want.disableTurbine, disableTurbine)
354 }
Artur Satayev9cf46692019-11-26 18:08:34 +0000355 }
356 })
357 }
358}
359
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900360func TestSdkVersionByPartition(t *testing.T) {
361 testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
Jeongik Cha6bd33c12019-06-25 16:26:18 +0900362 java_library {
363 name: "foo",
364 srcs: ["a.java"],
365 vendor: true,
366 }
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900367 `)
Jeongik Cha6bd33c12019-06-25 16:26:18 +0900368
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900369 testJava(t, `
Jeongik Cha6bd33c12019-06-25 16:26:18 +0900370 java_library {
371 name: "bar",
372 srcs: ["b.java"],
373 }
374 `)
375
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900376 for _, enforce := range []bool{true, false} {
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900377 bp := `
378 java_library {
379 name: "foo",
380 srcs: ["a.java"],
381 product_specific: true,
382 }
383 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800384
Paul Duffin414ea5e2021-03-22 17:31:52 +0000385 errorHandler := android.FixtureExpectsNoErrors
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900386 if enforce {
Paul Duffin414ea5e2021-03-22 17:31:52 +0000387 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern("sdk_version must have a value when the module is located at vendor or product")
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900388 }
Paul Duffin414ea5e2021-03-22 17:31:52 +0000389
390 android.GroupFixturePreparers(
391 PrepareForTestWithJavaDefaultModules,
392 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
393 variables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
394 }),
395 ).
396 ExtendWithErrorHandler(errorHandler).
397 RunTestWithBp(t, bp)
Jeongik Cha6bd33c12019-06-25 16:26:18 +0900398 }
399}
400
Colin Crossd5934c82017-10-02 13:55:26 -0700401func TestArchSpecific(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700402 ctx, _ := testJava(t, `
Colin Crossd5934c82017-10-02 13:55:26 -0700403 java_library {
404 name: "foo",
405 srcs: ["a.java"],
406 target: {
407 android: {
408 srcs: ["b.java"],
409 },
410 },
411 }
412 `)
413
414 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
415 if len(javac.Inputs) != 2 || javac.Inputs[0].String() != "a.java" || javac.Inputs[1].String() != "b.java" {
416 t.Errorf(`foo inputs %v != ["a.java", "b.java"]`, javac.Inputs)
417 }
418}
419
Colin Cross6b4a32d2017-12-05 13:42:45 -0800420func TestBinary(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700421 ctx, _ := testJava(t, `
Colin Cross6b4a32d2017-12-05 13:42:45 -0800422 java_library_host {
423 name: "foo",
424 srcs: ["a.java"],
425 }
426
427 java_binary_host {
428 name: "bar",
429 srcs: ["b.java"],
430 static_libs: ["foo"],
Colin Cross89226d92020-10-09 19:00:54 -0700431 jni_libs: ["libjni"],
432 }
433
434 cc_library_shared {
435 name: "libjni",
436 host_supported: true,
437 device_supported: false,
438 stl: "none",
Colin Cross6b4a32d2017-12-05 13:42:45 -0800439 }
440 `)
441
Colin Cross0c66bc62021-07-20 09:47:41 -0700442 buildOS := ctx.Config().BuildOS.String()
Colin Cross6b4a32d2017-12-05 13:42:45 -0800443
444 bar := ctx.ModuleForTests("bar", buildOS+"_common")
445 barJar := bar.Output("bar.jar").Output.String()
446 barWrapper := ctx.ModuleForTests("bar", buildOS+"_x86_64")
447 barWrapperDeps := barWrapper.Output("bar").Implicits.Strings()
448
Colin Cross89226d92020-10-09 19:00:54 -0700449 libjni := ctx.ModuleForTests("libjni", buildOS+"_x86_64_shared")
450 libjniSO := libjni.Rule("Cp").Output.String()
451
Colin Cross6b4a32d2017-12-05 13:42:45 -0800452 // Test that the install binary wrapper depends on the installed jar file
Colin Crossc179ea62020-10-09 10:54:15 -0700453 if g, w := barWrapperDeps, barJar; !android.InList(w, g) {
454 t.Errorf("expected binary wrapper implicits to contain %q, got %q", w, g)
Colin Cross6b4a32d2017-12-05 13:42:45 -0800455 }
Colin Cross89226d92020-10-09 19:00:54 -0700456
457 // Test that the install binary wrapper depends on the installed JNI libraries
458 if g, w := barWrapperDeps, libjniSO; !android.InList(w, g) {
459 t.Errorf("expected binary wrapper implicits to contain %q, got %q", w, g)
Colin Cross6b4a32d2017-12-05 13:42:45 -0800460 }
Alex Humesky2070e322020-06-09 20:23:08 -0400461}
Colin Cross6b4a32d2017-12-05 13:42:45 -0800462
Colin Crossf8d9c492021-01-26 11:01:43 -0800463func TestTest(t *testing.T) {
464 ctx, _ := testJava(t, `
465 java_test_host {
466 name: "foo",
467 srcs: ["a.java"],
468 jni_libs: ["libjni"],
469 }
470
471 cc_library_shared {
472 name: "libjni",
473 host_supported: true,
474 device_supported: false,
475 stl: "none",
476 }
477 `)
478
Colin Cross0c66bc62021-07-20 09:47:41 -0700479 buildOS := ctx.Config().BuildOS.String()
Colin Crossf8d9c492021-01-26 11:01:43 -0800480
481 foo := ctx.ModuleForTests("foo", buildOS+"_common").Module().(*TestHost)
482
483 expected := "lib64/libjni.so"
484 if runtime.GOOS == "darwin" {
485 expected = "lib64/libjni.dylib"
486 }
487
488 fooTestData := foo.data
489 if len(fooTestData) != 1 || fooTestData[0].Rel() != expected {
490 t.Errorf(`expected foo test data relative path [%q], got %q`,
491 expected, fooTestData.Strings())
492 }
493}
494
Alex Humesky2070e322020-06-09 20:23:08 -0400495func TestHostBinaryNoJavaDebugInfoOverride(t *testing.T) {
496 bp := `
497 java_library {
498 name: "target_library",
499 srcs: ["a.java"],
500 }
501
502 java_binary_host {
503 name: "host_binary",
504 srcs: ["b.java"],
505 }
506 `
Alex Humesky2070e322020-06-09 20:23:08 -0400507
Paul Duffin414ea5e2021-03-22 17:31:52 +0000508 result := android.GroupFixturePreparers(
509 PrepareForTestWithJavaDefaultModules,
510 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
511 variables.MinimizeJavaDebugInfo = proptools.BoolPtr(true)
512 }),
513 ).RunTestWithBp(t, bp)
Alex Humesky2070e322020-06-09 20:23:08 -0400514
Liz Kammer7941b302020-07-28 13:27:34 -0700515 // first, check that the -g flag is added to target modules
Paul Duffin414ea5e2021-03-22 17:31:52 +0000516 targetLibrary := result.ModuleForTests("target_library", "android_common")
Alex Humesky2070e322020-06-09 20:23:08 -0400517 targetJavaFlags := targetLibrary.Module().VariablesForTests()["javacFlags"]
518 if !strings.Contains(targetJavaFlags, "-g:source,lines") {
519 t.Errorf("target library javac flags %v should contain "+
520 "-g:source,lines override with MinimizeJavaDebugInfo", targetJavaFlags)
521 }
522
523 // check that -g is not overridden for host modules
Colin Cross0c66bc62021-07-20 09:47:41 -0700524 buildOS := result.Config.BuildOS.String()
Paul Duffin414ea5e2021-03-22 17:31:52 +0000525 hostBinary := result.ModuleForTests("host_binary", buildOS+"_common")
Alex Humesky2070e322020-06-09 20:23:08 -0400526 hostJavaFlags := hostBinary.Module().VariablesForTests()["javacFlags"]
527 if strings.Contains(hostJavaFlags, "-g:source,lines") {
528 t.Errorf("java_binary_host javac flags %v should not have "+
529 "-g:source,lines override with MinimizeJavaDebugInfo", hostJavaFlags)
530 }
Colin Cross6b4a32d2017-12-05 13:42:45 -0800531}
532
Colin Cross72bb3632017-07-13 16:23:21 -0700533func TestPrebuilts(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700534 ctx, _ := testJava(t, `
Colin Cross72bb3632017-07-13 16:23:21 -0700535 java_library {
536 name: "foo",
Paul Duffin91547182019-11-12 19:39:36 +0000537 srcs: ["a.java", ":stubs-source"],
Paul Duffinfcfd7912020-01-31 17:54:30 +0000538 libs: ["bar", "sdklib"],
Colin Crosse8dc34a2017-07-19 11:22:16 -0700539 static_libs: ["baz"],
Colin Cross72bb3632017-07-13 16:23:21 -0700540 }
541
Colin Cross74d73e22017-08-02 11:05:49 -0700542 java_import {
Colin Cross72bb3632017-07-13 16:23:21 -0700543 name: "bar",
Colin Cross74d73e22017-08-02 11:05:49 -0700544 jars: ["a.jar"],
Colin Cross72bb3632017-07-13 16:23:21 -0700545 }
546
Colin Cross74d73e22017-08-02 11:05:49 -0700547 java_import {
Colin Cross72bb3632017-07-13 16:23:21 -0700548 name: "baz",
Colin Cross74d73e22017-08-02 11:05:49 -0700549 jars: ["b.jar"],
Liz Kammerd6c31d22020-08-05 15:40:41 -0700550 sdk_version: "current",
551 compile_dex: true,
Colin Cross72bb3632017-07-13 16:23:21 -0700552 }
Colin Cross42be7612019-02-21 18:12:14 -0800553
554 dex_import {
555 name: "qux",
556 jars: ["b.jar"],
557 }
Colin Cross79c7c262019-04-17 11:11:46 -0700558
559 java_sdk_library_import {
Paul Duffin56d44902020-01-31 13:36:25 +0000560 name: "sdklib",
561 public: {
562 jars: ["c.jar"],
563 },
564 }
565
Paul Duffin91547182019-11-12 19:39:36 +0000566 prebuilt_stubs_sources {
567 name: "stubs-source",
Paul Duffin9b478b02019-12-10 13:41:51 +0000568 srcs: ["stubs/sources"],
Paul Duffin91547182019-11-12 19:39:36 +0000569 }
Paul Duffin1b82e6a2019-12-03 18:06:47 +0000570
571 java_test_import {
572 name: "test",
573 jars: ["a.jar"],
574 test_suites: ["cts"],
575 test_config: "AndroidTest.xml",
576 }
Colin Cross72bb3632017-07-13 16:23:21 -0700577 `)
578
Paul Duffin9b478b02019-12-10 13:41:51 +0000579 fooModule := ctx.ModuleForTests("foo", "android_common")
580 javac := fooModule.Rule("javac")
Nan Zhanged19fc32017-10-19 13:06:22 -0700581 combineJar := ctx.ModuleForTests("foo", "android_common").Description("for javac")
Liz Kammerd6c31d22020-08-05 15:40:41 -0700582 barModule := ctx.ModuleForTests("bar", "android_common")
583 barJar := barModule.Rule("combineJar").Output
584 bazModule := ctx.ModuleForTests("baz", "android_common")
585 bazJar := bazModule.Rule("combineJar").Output
Colin Cross79c7c262019-04-17 11:11:46 -0700586 sdklibStubsJar := ctx.ModuleForTests("sdklib.stubs", "android_common").Rule("combineJar").Output
Colin Cross72bb3632017-07-13 16:23:21 -0700587
Paul Duffin9b478b02019-12-10 13:41:51 +0000588 fooLibrary := fooModule.Module().(*Library)
Chaohui Wangdcbe33c2022-10-11 11:13:30 +0800589 assertDeepEquals(t, "foo unique sources incorrect",
590 []string{"a.java"}, fooLibrary.uniqueSrcFiles.Strings())
Paul Duffin91547182019-11-12 19:39:36 +0000591
Paul Duffin9b478b02019-12-10 13:41:51 +0000592 assertDeepEquals(t, "foo java source jars incorrect",
593 []string{".intermediates/stubs-source/android_common/stubs-source-stubs.srcjar"},
594 android.NormalizePathsForTesting(fooLibrary.compiledSrcJars))
Paul Duffin91547182019-11-12 19:39:36 +0000595
Colin Cross37f6d792018-07-12 12:28:41 -0700596 if !strings.Contains(javac.Args["classpath"], barJar.String()) {
597 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], barJar.String())
Colin Cross72bb3632017-07-13 16:23:21 -0700598 }
599
Liz Kammerd6c31d22020-08-05 15:40:41 -0700600 barDexJar := barModule.Module().(*Import).DexJarBuildPath()
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +0100601 if barDexJar.IsSet() {
602 t.Errorf("bar dex jar build path expected to be set, got %s", barDexJar)
Liz Kammerd6c31d22020-08-05 15:40:41 -0700603 }
604
Colin Cross79c7c262019-04-17 11:11:46 -0700605 if !strings.Contains(javac.Args["classpath"], sdklibStubsJar.String()) {
606 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], sdklibStubsJar.String())
607 }
608
Colin Cross37f6d792018-07-12 12:28:41 -0700609 if len(combineJar.Inputs) != 2 || combineJar.Inputs[1].String() != bazJar.String() {
610 t.Errorf("foo combineJar inputs %v does not contain %q", combineJar.Inputs, bazJar.String())
Colin Cross72bb3632017-07-13 16:23:21 -0700611 }
Colin Cross42be7612019-02-21 18:12:14 -0800612
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +0100613 bazDexJar := bazModule.Module().(*Import).DexJarBuildPath().Path()
Paul Duffin414ea5e2021-03-22 17:31:52 +0000614 expectedDexJar := "out/soong/.intermediates/baz/android_common/dex/baz.jar"
615 android.AssertPathRelativeToTopEquals(t, "baz dex jar build path", expectedDexJar, bazDexJar)
Liz Kammerd6c31d22020-08-05 15:40:41 -0700616
Colin Cross42be7612019-02-21 18:12:14 -0800617 ctx.ModuleForTests("qux", "android_common").Rule("Cp")
Colin Cross72bb3632017-07-13 16:23:21 -0700618}
619
Paul Duffin9b478b02019-12-10 13:41:51 +0000620func assertDeepEquals(t *testing.T, message string, expected interface{}, actual interface{}) {
621 if !reflect.DeepEqual(expected, actual) {
622 t.Errorf("%s: expected %q, found %q", message, expected, actual)
623 }
624}
625
Paul Duffin1a393322020-11-18 16:36:47 +0000626func TestPrebuiltStubsSources(t *testing.T) {
627 test := func(t *testing.T, sourcesPath string, expectedInputs []string) {
628 ctx, _ := testJavaWithFS(t, fmt.Sprintf(`
629prebuilt_stubs_sources {
630 name: "stubs-source",
631 srcs: ["%s"],
632}`, sourcesPath), map[string][]byte{
633 "stubs/sources/pkg/A.java": nil,
634 "stubs/sources/pkg/B.java": nil,
635 })
636
637 zipSrc := ctx.ModuleForTests("stubs-source", "android_common").Rule("zip_src")
638 if expected, actual := expectedInputs, zipSrc.Inputs.Strings(); !reflect.DeepEqual(expected, actual) {
639 t.Errorf("mismatch of inputs to soong_zip: expected %q, actual %q", expected, actual)
640 }
641 }
642
643 t.Run("empty/missing directory", func(t *testing.T) {
Colin Crossce3a51d2021-03-19 16:22:12 -0700644 test(t, "empty-directory", nil)
Paul Duffin1a393322020-11-18 16:36:47 +0000645 })
646
647 t.Run("non-empty set of sources", func(t *testing.T) {
648 test(t, "stubs/sources", []string{
649 "stubs/sources/pkg/A.java",
650 "stubs/sources/pkg/B.java",
651 })
652 })
653}
654
Colin Cross89536d42017-07-07 14:35:50 -0700655func TestDefaults(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700656 ctx, _ := testJava(t, `
Colin Cross89536d42017-07-07 14:35:50 -0700657 java_defaults {
658 name: "defaults",
659 srcs: ["a.java"],
660 libs: ["bar"],
661 static_libs: ["baz"],
Sasha Smundak2057f822019-04-16 17:16:58 -0700662 optimize: {enabled: false},
Colin Cross89536d42017-07-07 14:35:50 -0700663 }
664
665 java_library {
666 name: "foo",
667 defaults: ["defaults"],
668 }
669
670 java_library {
671 name: "bar",
672 srcs: ["b.java"],
673 }
674
675 java_library {
676 name: "baz",
677 srcs: ["c.java"],
678 }
Sasha Smundak2057f822019-04-16 17:16:58 -0700679
680 android_test {
681 name: "atestOptimize",
682 defaults: ["defaults"],
683 optimize: {enabled: true},
684 }
685
686 android_test {
687 name: "atestNoOptimize",
688 defaults: ["defaults"],
689 }
690
691 android_test {
692 name: "atestDefault",
693 srcs: ["a.java"],
694 }
Colin Cross89536d42017-07-07 14:35:50 -0700695 `)
696
Paul Duffina71a67a2021-03-29 00:42:57 +0100697 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
Nan Zhanged19fc32017-10-19 13:06:22 -0700698 combineJar := ctx.ModuleForTests("foo", "android_common").Description("for javac")
Colin Cross89536d42017-07-07 14:35:50 -0700699
700 if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "a.java" {
701 t.Errorf(`foo inputs %v != ["a.java"]`, javac.Inputs)
702 }
703
Paul Duffin414ea5e2021-03-22 17:31:52 +0000704 barTurbine := filepath.Join("out", "soong", ".intermediates", "bar", "android_common", "turbine-combined", "bar.jar")
Nan Zhanged19fc32017-10-19 13:06:22 -0700705 if !strings.Contains(javac.Args["classpath"], barTurbine) {
706 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
Colin Cross89536d42017-07-07 14:35:50 -0700707 }
708
Colin Cross1ee23172017-10-18 14:44:18 -0700709 baz := ctx.ModuleForTests("baz", "android_common").Rule("javac").Output.String()
Colin Cross0a6e0072017-08-30 14:24:55 -0700710 if len(combineJar.Inputs) != 2 || combineJar.Inputs[1].String() != baz {
711 t.Errorf("foo combineJar inputs %v does not contain %q", combineJar.Inputs, baz)
Colin Cross89536d42017-07-07 14:35:50 -0700712 }
Sasha Smundak2057f822019-04-16 17:16:58 -0700713
714 atestOptimize := ctx.ModuleForTests("atestOptimize", "android_common").MaybeRule("r8")
715 if atestOptimize.Output == nil {
716 t.Errorf("atestOptimize should optimize APK")
717 }
718
719 atestNoOptimize := ctx.ModuleForTests("atestNoOptimize", "android_common").MaybeRule("d8")
720 if atestNoOptimize.Output == nil {
721 t.Errorf("atestNoOptimize should not optimize APK")
722 }
723
Jared Duke63a3da92022-06-02 19:11:14 +0000724 atestDefault := ctx.ModuleForTests("atestDefault", "android_common").MaybeRule("d8")
Sasha Smundak2057f822019-04-16 17:16:58 -0700725 if atestDefault.Output == nil {
Jared Duke63a3da92022-06-02 19:11:14 +0000726 t.Errorf("atestDefault should not optimize APK")
Sasha Smundak2057f822019-04-16 17:16:58 -0700727 }
Colin Cross89536d42017-07-07 14:35:50 -0700728}
729
Colin Cross0f37af02017-09-27 17:42:05 -0700730func TestResources(t *testing.T) {
731 var table = []struct {
732 name string
733 prop string
734 extra string
735 args string
736 }{
737 {
Colin Crossaf9c55b2017-10-03 14:50:08 -0700738 // Test that a module with java_resource_dirs includes the files
Colin Cross0f37af02017-09-27 17:42:05 -0700739 name: "resource dirs",
Colin Cross824bee32017-11-22 17:27:51 -0800740 prop: `java_resource_dirs: ["java-res"]`,
Colin Cross0ead1d72018-04-10 13:07:42 -0700741 args: "-C java-res -f java-res/a/a -f java-res/b/b",
Colin Cross0f37af02017-09-27 17:42:05 -0700742 },
743 {
744 // Test that a module with java_resources includes the files
745 name: "resource files",
Colin Cross0ead1d72018-04-10 13:07:42 -0700746 prop: `java_resources: ["java-res/a/a", "java-res/b/b"]`,
747 args: "-C . -f java-res/a/a -f java-res/b/b",
Colin Cross0f37af02017-09-27 17:42:05 -0700748 },
749 {
750 // Test that a module with a filegroup in java_resources includes the files with the
751 // path prefix
752 name: "resource filegroup",
753 prop: `java_resources: [":foo-res"]`,
754 extra: `
755 filegroup {
756 name: "foo-res",
Colin Cross824bee32017-11-22 17:27:51 -0800757 path: "java-res",
Colin Cross0ead1d72018-04-10 13:07:42 -0700758 srcs: ["java-res/a/a", "java-res/b/b"],
Colin Cross0f37af02017-09-27 17:42:05 -0700759 }`,
Colin Cross0ead1d72018-04-10 13:07:42 -0700760 args: "-C java-res -f java-res/a/a -f java-res/b/b",
Colin Cross0f37af02017-09-27 17:42:05 -0700761 },
762 {
Colin Cross0ead1d72018-04-10 13:07:42 -0700763 // Test that a module with wildcards in java_resource_dirs has the correct path prefixes
764 name: "wildcard dirs",
765 prop: `java_resource_dirs: ["java-res/*"]`,
766 args: "-C java-res/a -f java-res/a/a -C java-res/b -f java-res/b/b",
767 },
768 {
769 // Test that a module exclude_java_resource_dirs excludes the files
770 name: "wildcard dirs",
771 prop: `java_resource_dirs: ["java-res/*"], exclude_java_resource_dirs: ["java-res/b"]`,
772 args: "-C java-res/a -f java-res/a/a",
773 },
Colin Crosscedd4762018-09-13 11:26:19 -0700774 {
775 // Test wildcards in java_resources
776 name: "wildcard files",
777 prop: `java_resources: ["java-res/**/*"]`,
778 args: "-C . -f java-res/a/a -f java-res/b/b",
779 },
780 {
781 // Test exclude_java_resources with java_resources
782 name: "wildcard files with exclude",
783 prop: `java_resources: ["java-res/**/*"], exclude_java_resources: ["java-res/b/*"]`,
784 args: "-C . -f java-res/a/a",
785 },
786 {
787 // Test exclude_java_resources with java_resource_dirs
788 name: "resource dirs with exclude files",
789 prop: `java_resource_dirs: ["java-res"], exclude_java_resources: ["java-res/b/b"]`,
790 args: "-C java-res -f java-res/a/a",
791 },
792 {
793 // Test exclude_java_resource_dirs with java_resource_dirs
794 name: "resource dirs with exclude files",
795 prop: `java_resource_dirs: ["java-res", "java-res2"], exclude_java_resource_dirs: ["java-res2"]`,
796 args: "-C java-res -f java-res/a/a -f java-res/b/b",
797 },
Colin Cross0f37af02017-09-27 17:42:05 -0700798 }
799
800 for _, test := range table {
801 t.Run(test.name, func(t *testing.T) {
Colin Cross238c1f32020-06-07 16:58:18 -0700802 ctx, _ := testJavaWithFS(t, `
Colin Cross0f37af02017-09-27 17:42:05 -0700803 java_library {
804 name: "foo",
805 srcs: [
806 "a.java",
807 "b.java",
808 "c.java",
809 ],
810 `+test.prop+`,
811 }
Colin Cross238c1f32020-06-07 16:58:18 -0700812 `+test.extra,
813 map[string][]byte{
814 "java-res/a/a": nil,
815 "java-res/b/b": nil,
816 "java-res2/a": nil,
817 },
818 )
Colin Cross0f37af02017-09-27 17:42:05 -0700819
Colin Cross331a1212018-08-15 20:40:52 -0700820 foo := ctx.ModuleForTests("foo", "android_common").Output("withres/foo.jar")
Colin Cross1ee23172017-10-18 14:44:18 -0700821 fooRes := ctx.ModuleForTests("foo", "android_common").Output("res/foo.jar")
Colin Cross0f37af02017-09-27 17:42:05 -0700822
823 if !inList(fooRes.Output.String(), foo.Inputs.Strings()) {
824 t.Errorf("foo combined jars %v does not contain %q",
825 foo.Inputs.Strings(), fooRes.Output.String())
826 }
827
Colin Crossaf9c55b2017-10-03 14:50:08 -0700828 if fooRes.Args["jarArgs"] != test.args {
829 t.Errorf("foo resource jar args %q is not %q",
Colin Cross0f37af02017-09-27 17:42:05 -0700830 fooRes.Args["jarArgs"], test.args)
831 }
832 })
833 }
834}
835
Colin Cross0c4ce212019-05-03 15:28:19 -0700836func TestIncludeSrcs(t *testing.T) {
Colin Cross238c1f32020-06-07 16:58:18 -0700837 ctx, _ := testJavaWithFS(t, `
Colin Cross0c4ce212019-05-03 15:28:19 -0700838 java_library {
839 name: "foo",
840 srcs: [
841 "a.java",
842 "b.java",
843 "c.java",
844 ],
845 include_srcs: true,
846 }
847
848 java_library {
849 name: "bar",
850 srcs: [
851 "a.java",
852 "b.java",
853 "c.java",
854 ],
855 java_resource_dirs: ["java-res"],
856 include_srcs: true,
857 }
Colin Cross238c1f32020-06-07 16:58:18 -0700858 `, map[string][]byte{
859 "java-res/a/a": nil,
860 "java-res/b/b": nil,
861 "java-res2/a": nil,
862 })
Colin Cross0c4ce212019-05-03 15:28:19 -0700863
864 // Test a library with include_srcs: true
865 foo := ctx.ModuleForTests("foo", "android_common").Output("withres/foo.jar")
866 fooSrcJar := ctx.ModuleForTests("foo", "android_common").Output("foo.srcjar")
867
868 if g, w := fooSrcJar.Output.String(), foo.Inputs.Strings(); !inList(g, w) {
869 t.Errorf("foo combined jars %v does not contain %q", w, g)
870 }
871
872 if g, w := fooSrcJar.Args["jarArgs"], "-C . -f a.java -f b.java -f c.java"; g != w {
873 t.Errorf("foo source jar args %q is not %q", w, g)
874 }
875
876 // Test a library with include_srcs: true and resources
877 bar := ctx.ModuleForTests("bar", "android_common").Output("withres/bar.jar")
878 barResCombined := ctx.ModuleForTests("bar", "android_common").Output("res-combined/bar.jar")
879 barRes := ctx.ModuleForTests("bar", "android_common").Output("res/bar.jar")
880 barSrcJar := ctx.ModuleForTests("bar", "android_common").Output("bar.srcjar")
881
882 if g, w := barSrcJar.Output.String(), barResCombined.Inputs.Strings(); !inList(g, w) {
883 t.Errorf("bar combined resource jars %v does not contain %q", w, g)
884 }
885
886 if g, w := barRes.Output.String(), barResCombined.Inputs.Strings(); !inList(g, w) {
887 t.Errorf("bar combined resource jars %v does not contain %q", w, g)
888 }
889
890 if g, w := barResCombined.Output.String(), bar.Inputs.Strings(); !inList(g, w) {
891 t.Errorf("bar combined jars %v does not contain %q", w, g)
892 }
893
894 if g, w := barSrcJar.Args["jarArgs"], "-C . -f a.java -f b.java -f c.java"; g != w {
895 t.Errorf("bar source jar args %q is not %q", w, g)
896 }
897
898 if g, w := barRes.Args["jarArgs"], "-C java-res -f java-res/a/a -f java-res/b/b"; g != w {
899 t.Errorf("bar resource jar args %q is not %q", w, g)
900 }
901}
902
Colin Cross54190b32017-10-09 15:34:10 -0700903func TestGeneratedSources(t *testing.T) {
Colin Cross238c1f32020-06-07 16:58:18 -0700904 ctx, _ := testJavaWithFS(t, `
Colin Cross54190b32017-10-09 15:34:10 -0700905 java_library {
906 name: "foo",
907 srcs: [
908 "a*.java",
909 ":gen",
910 "b*.java",
911 ],
912 }
913
914 genrule {
915 name: "gen",
Colin Cross824bee32017-11-22 17:27:51 -0800916 tool_files: ["java-res/a"],
Colin Cross54190b32017-10-09 15:34:10 -0700917 out: ["gen.java"],
918 }
Colin Cross238c1f32020-06-07 16:58:18 -0700919 `, map[string][]byte{
920 "a.java": nil,
921 "b.java": nil,
922 })
Colin Cross54190b32017-10-09 15:34:10 -0700923
924 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
925 genrule := ctx.ModuleForTests("gen", "").Rule("generator")
926
Colin Cross15e86d92017-10-20 15:07:08 -0700927 if filepath.Base(genrule.Output.String()) != "gen.java" {
928 t.Fatalf(`gen output file %v is not ".../gen.java"`, genrule.Output.String())
Colin Cross54190b32017-10-09 15:34:10 -0700929 }
930
931 if len(javac.Inputs) != 3 ||
932 javac.Inputs[0].String() != "a.java" ||
Colin Cross15e86d92017-10-20 15:07:08 -0700933 javac.Inputs[1].String() != genrule.Output.String() ||
Colin Cross54190b32017-10-09 15:34:10 -0700934 javac.Inputs[2].String() != "b.java" {
935 t.Errorf(`foo inputs %v != ["a.java", ".../gen.java", "b.java"]`, javac.Inputs)
936 }
937}
938
Nan Zhang61eaedb2017-11-02 13:28:15 -0700939func TestTurbine(t *testing.T) {
Paul Duffin71ae5942021-03-22 15:36:52 +0000940 result := android.GroupFixturePreparers(
941 prepareForJavaTest, FixtureWithPrebuiltApis(map[string][]string{"14": {"foo"}})).
Paul Duffin3d9f2682021-03-13 09:47:16 +0000942 RunTestWithBp(t, `
Nan Zhang61eaedb2017-11-02 13:28:15 -0700943 java_library {
944 name: "foo",
945 srcs: ["a.java"],
Jiyong Park2d492942018-03-05 17:44:10 +0900946 sdk_version: "14",
Nan Zhang61eaedb2017-11-02 13:28:15 -0700947 }
948
949 java_library {
950 name: "bar",
Colin Cross9bc43432017-12-15 20:20:39 -0800951 srcs: ["b.java"],
Nan Zhang61eaedb2017-11-02 13:28:15 -0700952 static_libs: ["foo"],
Jiyong Park2d492942018-03-05 17:44:10 +0900953 sdk_version: "14",
Nan Zhang61eaedb2017-11-02 13:28:15 -0700954 }
955
956 java_library {
957 name: "baz",
958 srcs: ["c.java"],
959 libs: ["bar"],
960 sdk_version: "14",
961 }
962 `)
963
Paul Duffina71a67a2021-03-29 00:42:57 +0100964 fooTurbine := result.ModuleForTests("foo", "android_common").Rule("turbine")
965 barTurbine := result.ModuleForTests("bar", "android_common").Rule("turbine")
966 barJavac := result.ModuleForTests("bar", "android_common").Rule("javac")
967 barTurbineCombined := result.ModuleForTests("bar", "android_common").Description("for turbine")
968 bazJavac := result.ModuleForTests("baz", "android_common").Rule("javac")
Nan Zhang61eaedb2017-11-02 13:28:15 -0700969
Paul Duffin414ea5e2021-03-22 17:31:52 +0000970 android.AssertPathsRelativeToTopEquals(t, "foo inputs", []string{"a.java"}, fooTurbine.Inputs)
Nan Zhang61eaedb2017-11-02 13:28:15 -0700971
Paul Duffin414ea5e2021-03-22 17:31:52 +0000972 fooHeaderJar := filepath.Join("out", "soong", ".intermediates", "foo", "android_common", "turbine-combined", "foo.jar")
973 barTurbineJar := filepath.Join("out", "soong", ".intermediates", "bar", "android_common", "turbine", "bar.jar")
Colin Crossf61766e2022-03-16 18:06:48 -0700974 android.AssertStringDoesContain(t, "bar turbine classpath", barTurbine.Args["turbineFlags"], fooHeaderJar)
Paul Duffin3d9f2682021-03-13 09:47:16 +0000975 android.AssertStringDoesContain(t, "bar javac classpath", barJavac.Args["classpath"], fooHeaderJar)
Paul Duffin414ea5e2021-03-22 17:31:52 +0000976 android.AssertPathsRelativeToTopEquals(t, "bar turbine combineJar", []string{barTurbineJar, fooHeaderJar}, barTurbineCombined.Inputs)
Paul Duffin3d9f2682021-03-13 09:47:16 +0000977 android.AssertStringDoesContain(t, "baz javac classpath", bazJavac.Args["classpath"], "prebuilts/sdk/14/public/android.jar")
Nan Zhang61eaedb2017-11-02 13:28:15 -0700978}
979
980func TestSharding(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700981 ctx, _ := testJava(t, `
Nan Zhang61eaedb2017-11-02 13:28:15 -0700982 java_library {
983 name: "bar",
984 srcs: ["a.java","b.java","c.java"],
985 javac_shard_size: 1
986 }
987 `)
988
Colin Cross3d56ed52021-11-18 22:23:12 -0800989 barHeaderJar := filepath.Join("out", "soong", ".intermediates", "bar", "android_common", "turbine", "bar.jar")
Nan Zhang61eaedb2017-11-02 13:28:15 -0700990 for i := 0; i < 3; i++ {
Paul Duffina71a67a2021-03-29 00:42:57 +0100991 barJavac := ctx.ModuleForTests("bar", "android_common").Description("javac" + strconv.Itoa(i))
Colin Cross3d56ed52021-11-18 22:23:12 -0800992 if !strings.HasPrefix(barJavac.Args["classpath"], "-classpath "+barHeaderJar+":") {
993 t.Errorf("bar javac classpath %v does start with %q", barJavac.Args["classpath"], barHeaderJar)
Nan Zhang61eaedb2017-11-02 13:28:15 -0700994 }
995 }
996}
997
Nan Zhang27e284d2018-02-09 21:03:53 +0000998func TestExcludeFileGroupInSrcs(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700999 ctx, _ := testJava(t, `
Nan Zhang27e284d2018-02-09 21:03:53 +00001000 java_library {
1001 name: "foo",
1002 srcs: ["a.java", ":foo-srcs"],
1003 exclude_srcs: ["a.java", ":foo-excludes"],
1004 }
1005
1006 filegroup {
1007 name: "foo-srcs",
1008 srcs: ["java-fg/a.java", "java-fg/b.java", "java-fg/c.java"],
1009 }
1010
1011 filegroup {
1012 name: "foo-excludes",
1013 srcs: ["java-fg/a.java", "java-fg/b.java"],
1014 }
1015 `)
1016
1017 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
1018
1019 if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "java-fg/c.java" {
1020 t.Errorf(`foo inputs %v != ["java-fg/c.java"]`, javac.Inputs)
1021 }
1022}
Jiyong Parkc678ad32018-04-10 13:07:10 +09001023
Paul Duffin52d398a2019-06-11 12:31:14 +01001024func TestJavaLibrary(t *testing.T) {
Paul Duffin414ea5e2021-03-22 17:31:52 +00001025 testJavaWithFS(t, "", map[string][]byte{
Paul Duffin52d398a2019-06-11 12:31:14 +01001026 "libcore/Android.bp": []byte(`
1027 java_library {
1028 name: "core",
1029 sdk_version: "none",
1030 system_modules: "none",
Paul Duffinaa55f742020-10-06 17:20:13 +01001031 }
1032
1033 filegroup {
1034 name: "core-jar",
1035 srcs: [":core{.jar}"],
1036 }
Paul Duffin414ea5e2021-03-22 17:31:52 +00001037 `),
Paul Duffinaa55f742020-10-06 17:20:13 +01001038 })
Paul Duffinaa55f742020-10-06 17:20:13 +01001039}
1040
1041func TestJavaImport(t *testing.T) {
Paul Duffin414ea5e2021-03-22 17:31:52 +00001042 testJavaWithFS(t, "", map[string][]byte{
Paul Duffinaa55f742020-10-06 17:20:13 +01001043 "libcore/Android.bp": []byte(`
1044 java_import {
1045 name: "core",
1046 sdk_version: "none",
1047 }
1048
1049 filegroup {
1050 name: "core-jar",
1051 srcs: [":core{.jar}"],
1052 }
Paul Duffin414ea5e2021-03-22 17:31:52 +00001053 `),
Paul Duffin52d398a2019-06-11 12:31:14 +01001054 })
Paul Duffin52d398a2019-06-11 12:31:14 +01001055}
1056
Zoran Jovanovic8736ce22018-08-21 17:10:29 +02001057var compilerFlagsTestCases = []struct {
1058 in string
1059 out bool
1060}{
1061 {
1062 in: "a",
1063 out: false,
1064 },
1065 {
1066 in: "-a",
1067 out: true,
1068 },
1069 {
1070 in: "-no-jdk",
1071 out: false,
1072 },
1073 {
1074 in: "-no-stdlib",
1075 out: false,
1076 },
1077 {
1078 in: "-kotlin-home",
1079 out: false,
1080 },
1081 {
1082 in: "-kotlin-home /some/path",
1083 out: false,
1084 },
1085 {
1086 in: "-include-runtime",
1087 out: false,
1088 },
1089 {
1090 in: "-Xintellij-plugin-root",
1091 out: false,
1092 },
1093}
1094
1095type mockContext struct {
1096 android.ModuleContext
1097 result bool
1098}
1099
1100func (ctx *mockContext) PropertyErrorf(property, format string, args ...interface{}) {
1101 // CheckBadCompilerFlags calls this function when the flag should be rejected
1102 ctx.result = false
1103}
1104
1105func TestCompilerFlags(t *testing.T) {
1106 for _, testCase := range compilerFlagsTestCases {
1107 ctx := &mockContext{result: true}
1108 CheckKotlincFlags(ctx, []string{testCase.in})
1109 if ctx.result != testCase.out {
1110 t.Errorf("incorrect output:")
1111 t.Errorf(" input: %#v", testCase.in)
1112 t.Errorf(" expected: %#v", testCase.out)
1113 t.Errorf(" got: %#v", ctx.result)
1114 }
1115 }
1116}
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001117
1118// TODO(jungjw): Consider making this more robust by ignoring path order.
1119func checkPatchModuleFlag(t *testing.T, ctx *android.TestContext, moduleName string, expected string) {
Paul Duffin414ea5e2021-03-22 17:31:52 +00001120 variables := ctx.ModuleForTests(moduleName, "android_common").VariablesForTestsRelativeToTop()
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001121 flags := strings.Split(variables["javacFlags"], " ")
1122 got := ""
1123 for _, flag := range flags {
1124 keyEnd := strings.Index(flag, "=")
1125 if keyEnd > -1 && flag[:keyEnd] == "--patch-module" {
1126 got = flag[keyEnd+1:]
1127 break
1128 }
1129 }
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02001130 if expected != android.StringPathRelativeToTop(ctx.Config().SoongOutDir(), got) {
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001131 t.Errorf("Unexpected patch-module flag for module %q - expected %q, but got %q", moduleName, expected, got)
1132 }
1133}
1134
1135func TestPatchModule(t *testing.T) {
Pete Gillin0c2143e2019-05-02 15:32:11 +01001136 t.Run("Java language level 8", func(t *testing.T) {
Pete Gillin1b3370f2019-10-01 13:57:31 +01001137 // Test with legacy javac -source 1.8 -target 1.8
Pete Gillinbdf5d712019-10-21 14:29:58 +01001138 bp := `
1139 java_library {
1140 name: "foo",
1141 srcs: ["a.java"],
1142 java_version: "1.8",
1143 }
1144
1145 java_library {
1146 name: "bar",
1147 srcs: ["b.java"],
1148 sdk_version: "none",
1149 system_modules: "none",
1150 patch_module: "java.base",
1151 java_version: "1.8",
1152 }
1153
1154 java_library {
1155 name: "baz",
1156 srcs: ["c.java"],
1157 patch_module: "java.base",
1158 java_version: "1.8",
1159 }
1160 `
1161 ctx, _ := testJava(t, bp)
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001162
1163 checkPatchModuleFlag(t, ctx, "foo", "")
1164 checkPatchModuleFlag(t, ctx, "bar", "")
1165 checkPatchModuleFlag(t, ctx, "baz", "")
1166 })
1167
Pete Gillin0c2143e2019-05-02 15:32:11 +01001168 t.Run("Java language level 9", func(t *testing.T) {
Pete Gillin1b3370f2019-10-01 13:57:31 +01001169 // Test with default javac -source 9 -target 9
Pete Gillinbdf5d712019-10-21 14:29:58 +01001170 bp := `
1171 java_library {
1172 name: "foo",
1173 srcs: ["a.java"],
1174 }
1175
1176 java_library {
1177 name: "bar",
1178 srcs: ["b.java"],
1179 sdk_version: "none",
1180 system_modules: "none",
1181 patch_module: "java.base",
1182 }
1183
1184 java_library {
1185 name: "baz",
Jingwen Chen5136a6e2020-10-30 01:01:35 -04001186 srcs: [
1187 "c.java",
1188 // Tests for b/150878007
1189 "dir/d.java",
1190 "dir2/e.java",
1191 "dir2/f.java",
1192 "nested/dir/g.java"
1193 ],
Pete Gillinbdf5d712019-10-21 14:29:58 +01001194 patch_module: "java.base",
1195 }
1196 `
Pete Gillin1b3370f2019-10-01 13:57:31 +01001197 ctx, _ := testJava(t, bp)
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001198
1199 checkPatchModuleFlag(t, ctx, "foo", "")
Paul Duffin414ea5e2021-03-22 17:31:52 +00001200 expected := "java.base=.:out/soong"
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001201 checkPatchModuleFlag(t, ctx, "bar", expected)
Jingwen Chen5136a6e2020-10-30 01:01:35 -04001202 expected = "java.base=" + strings.Join([]string{
Paul Duffin414ea5e2021-03-22 17:31:52 +00001203 ".", "out/soong", "dir", "dir2", "nested", defaultModuleToPath("ext"), defaultModuleToPath("framework")}, ":")
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001204 checkPatchModuleFlag(t, ctx, "baz", expected)
1205 })
1206}
Paul Duffina7b9f422020-01-10 17:12:18 +00001207
Paul Duffin83a2d962019-11-19 19:44:10 +00001208func TestJavaLibraryWithSystemModules(t *testing.T) {
1209 ctx, _ := testJava(t, `
1210 java_library {
1211 name: "lib-with-source-system-modules",
1212 srcs: [
1213 "a.java",
1214 ],
1215 sdk_version: "none",
1216 system_modules: "source-system-modules",
1217 }
1218
1219 java_library {
1220 name: "source-jar",
1221 srcs: [
1222 "a.java",
1223 ],
1224 }
1225
1226 java_system_modules {
1227 name: "source-system-modules",
1228 libs: ["source-jar"],
1229 }
1230
1231 java_library {
1232 name: "lib-with-prebuilt-system-modules",
1233 srcs: [
1234 "a.java",
1235 ],
1236 sdk_version: "none",
1237 system_modules: "prebuilt-system-modules",
1238 }
1239
1240 java_import {
1241 name: "prebuilt-jar",
1242 jars: ["a.jar"],
1243 }
1244
1245 java_system_modules_import {
1246 name: "prebuilt-system-modules",
1247 libs: ["prebuilt-jar"],
1248 }
1249 `)
1250
1251 checkBootClasspathForSystemModule(t, ctx, "lib-with-source-system-modules", "/source-jar.jar")
1252
1253 checkBootClasspathForSystemModule(t, ctx, "lib-with-prebuilt-system-modules", "/prebuilt-jar.jar")
1254}
1255
1256func checkBootClasspathForSystemModule(t *testing.T, ctx *android.TestContext, moduleName string, expectedSuffix string) {
1257 javacRule := ctx.ModuleForTests(moduleName, "android_common").Rule("javac")
1258 bootClasspath := javacRule.Args["bootClasspath"]
1259 if strings.HasPrefix(bootClasspath, "--system ") && strings.HasSuffix(bootClasspath, expectedSuffix) {
1260 t.Errorf("bootclasspath of %q must start with --system and end with %q, but was %#v.", moduleName, expectedSuffix, bootClasspath)
1261 }
1262}
Jiyong Park19604de2020-03-24 16:44:11 +09001263
1264func TestAidlExportIncludeDirsFromImports(t *testing.T) {
1265 ctx, _ := testJava(t, `
1266 java_library {
1267 name: "foo",
1268 srcs: ["aidl/foo/IFoo.aidl"],
1269 libs: ["bar"],
1270 }
1271
1272 java_import {
1273 name: "bar",
1274 jars: ["a.jar"],
1275 aidl: {
1276 export_include_dirs: ["aidl/bar"],
1277 },
1278 }
1279 `)
1280
1281 aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
1282 expectedAidlFlag := "-Iaidl/bar"
1283 if !strings.Contains(aidlCommand, expectedAidlFlag) {
1284 t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1285 }
1286}
Liz Kammerdd849a82020-06-12 16:38:45 -07001287
Vinh Tran16fe8e12022-08-16 16:45:44 -04001288func TestAidlIncludeDirFromConvertedFileGroupWithPathPropInMixedBuilds(t *testing.T) {
Liz Kammer748209c2022-10-24 10:43:27 -04001289 // TODO(b/247782695), TODO(b/242847534) Fix mixed builds for filegroups
1290 t.Skip("Re-enable once filegroups are corrected for mixed builds")
Vinh Tran16fe8e12022-08-16 16:45:44 -04001291 bp := `
1292 filegroup {
1293 name: "foo_aidl",
1294 srcs: ["aidl/foo/IFoo.aidl"],
1295 path: "aidl/foo",
1296 bazel_module: { label: "//:foo_aidl" },
1297 }
1298 java_library {
1299 name: "foo",
1300 srcs: [":foo_aidl"],
1301 }
1302`
1303
1304 outBaseDir := "out/bazel/output"
1305 result := android.GroupFixturePreparers(
1306 prepareForJavaTest,
1307 android.PrepareForTestWithFilegroup,
1308 android.FixtureModifyConfig(func(config android.Config) {
1309 config.BazelContext = android.MockBazelContext{
1310 OutputBaseDir: outBaseDir,
1311 LabelToOutputFiles: map[string][]string{
1312 "//:foo_aidl": []string{"aidl/foo/IFoo.aidl"},
1313 },
1314 }
1315 }),
1316 ).RunTestWithBp(t, bp)
1317
1318 aidlCommand := result.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
1319 expectedAidlFlag := "-I" + outBaseDir + "/execroot/__main__/aidl/foo"
1320 if !strings.Contains(aidlCommand, expectedAidlFlag) {
1321 t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1322 }
1323}
1324
Jooyung Hane197d8b2021-01-05 10:33:16 +09001325func TestAidlFlagsArePassedToTheAidlCompiler(t *testing.T) {
1326 ctx, _ := testJava(t, `
1327 java_library {
1328 name: "foo",
1329 srcs: ["aidl/foo/IFoo.aidl"],
1330 aidl: { flags: ["-Werror"], },
1331 }
1332 `)
1333
1334 aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
1335 expectedAidlFlag := "-Werror"
1336 if !strings.Contains(aidlCommand, expectedAidlFlag) {
1337 t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1338 }
1339}
1340
Jooyung Han07f70c02021-11-06 07:08:45 +09001341func TestAidlFlagsWithMinSdkVersion(t *testing.T) {
1342 fixture := android.GroupFixturePreparers(
1343 prepareForJavaTest, FixtureWithPrebuiltApis(map[string][]string{"14": {"foo"}}))
1344
1345 for _, tc := range []struct {
1346 name string
1347 sdkVersion string
1348 expected string
1349 }{
1350 {"default is current", "", "current"},
1351 {"use sdk_version", `sdk_version: "14"`, "14"},
1352 {"system_current", `sdk_version: "system_current"`, "current"},
1353 } {
1354 t.Run(tc.name, func(t *testing.T) {
1355 ctx := fixture.RunTestWithBp(t, `
1356 java_library {
1357 name: "foo",
1358 srcs: ["aidl/foo/IFoo.aidl"],
1359 `+tc.sdkVersion+`
1360 }
1361 `)
1362 aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
1363 expectedAidlFlag := "--min_sdk_version=" + tc.expected
1364 if !strings.Contains(aidlCommand, expectedAidlFlag) {
1365 t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1366 }
1367 })
1368 }
1369}
1370
Spandan Das757b6662022-11-17 04:29:59 +00001371func TestAidlFlagsMinSdkVersionDroidstubs(t *testing.T) {
1372 bpTemplate := `
1373 droidstubs {
1374 name: "foo-stubs",
1375 srcs: ["foo.aidl"],
1376 %s
1377 system_modules: "none",
1378 }
1379 `
1380 testCases := []struct {
1381 desc string
1382 sdkVersionBp string
1383 minSdkVersionExpected string
1384 }{
1385 {
1386 desc: "sdk_version not set, module compiles against private platform APIs",
1387 sdkVersionBp: ``,
1388 minSdkVersionExpected: "10000",
1389 },
1390 {
1391 desc: "sdk_version set to none, module does not build against an SDK",
1392 sdkVersionBp: `sdk_version: "none",`,
1393 minSdkVersionExpected: "10000",
1394 },
1395 }
1396 for _, tc := range testCases {
1397 ctx := prepareForJavaTest.RunTestWithBp(t, fmt.Sprintf(bpTemplate, tc.sdkVersionBp))
1398 aidlCmd := ctx.ModuleForTests("foo-stubs", "android_common").Rule("aidl").RuleParams.Command
1399 expected := "--min_sdk_version=" + tc.minSdkVersionExpected
1400 android.AssertStringDoesContain(t, "aidl command conatins incorrect min_sdk_version for testCse: "+tc.desc, aidlCmd, expected)
1401 }
1402}
1403
Thiébaud Weksteende8417c2022-02-10 15:41:46 +11001404func TestAidlEnforcePermissions(t *testing.T) {
1405 ctx, _ := testJava(t, `
1406 java_library {
1407 name: "foo",
1408 srcs: ["aidl/foo/IFoo.aidl"],
1409 aidl: { enforce_permissions: true },
1410 }
1411 `)
1412
1413 aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
1414 expectedAidlFlag := "-Wmissing-permission-annotation -Werror"
1415 if !strings.Contains(aidlCommand, expectedAidlFlag) {
1416 t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1417 }
1418}
1419
1420func TestAidlEnforcePermissionsException(t *testing.T) {
1421 ctx, _ := testJava(t, `
1422 java_library {
1423 name: "foo",
1424 srcs: ["aidl/foo/IFoo.aidl", "aidl/foo/IFoo2.aidl"],
1425 aidl: { enforce_permissions: true, enforce_permissions_exceptions: ["aidl/foo/IFoo2.aidl"] },
1426 }
1427 `)
1428
1429 aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
1430 expectedAidlFlag := "$$FLAGS -Wmissing-permission-annotation -Werror aidl/foo/IFoo.aidl"
1431 if !strings.Contains(aidlCommand, expectedAidlFlag) {
1432 t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1433 }
1434 expectedAidlFlag = "$$FLAGS aidl/foo/IFoo2.aidl"
1435 if !strings.Contains(aidlCommand, expectedAidlFlag) {
1436 t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1437 }
1438}
1439
Liz Kammerdd849a82020-06-12 16:38:45 -07001440func TestDataNativeBinaries(t *testing.T) {
Cole Faust5c503d12023-01-24 11:48:08 -08001441 ctx := android.GroupFixturePreparers(
1442 prepareForJavaTest,
1443 android.PrepareForTestWithAllowMissingDependencies).RunTestWithBp(t, `
Liz Kammerdd849a82020-06-12 16:38:45 -07001444 java_test_host {
1445 name: "foo",
1446 srcs: ["a.java"],
1447 data_native_bins: ["bin"]
1448 }
1449
Cole Faust5c503d12023-01-24 11:48:08 -08001450 cc_binary_host {
Liz Kammerdd849a82020-06-12 16:38:45 -07001451 name: "bin",
Cole Faust5c503d12023-01-24 11:48:08 -08001452 srcs: ["bin.cpp"],
Liz Kammerdd849a82020-06-12 16:38:45 -07001453 }
Cole Faust5c503d12023-01-24 11:48:08 -08001454 `).TestContext
Liz Kammerdd849a82020-06-12 16:38:45 -07001455
Colin Cross0c66bc62021-07-20 09:47:41 -07001456 buildOS := ctx.Config().BuildOS.String()
Liz Kammerdd849a82020-06-12 16:38:45 -07001457
1458 test := ctx.ModuleForTests("foo", buildOS+"_common").Module().(*TestHost)
Colin Crossaa255532020-07-03 13:18:24 -07001459 entries := android.AndroidMkEntriesForTest(t, ctx, test)[0]
Cole Faust5c503d12023-01-24 11:48:08 -08001460 expected := []string{"out/soong/.intermediates/bin/" + buildOS + "_x86_64/bin:bin"}
Liz Kammerdd849a82020-06-12 16:38:45 -07001461 actual := entries.EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
Paul Duffin414ea5e2021-03-22 17:31:52 +00001462 android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_COMPATIBILITY_SUPPORT_FILES", ctx.Config(), expected, actual)
Liz Kammerdd849a82020-06-12 16:38:45 -07001463}
Yuexi Ma627263f2021-03-04 13:47:56 -08001464
1465func TestDefaultInstallable(t *testing.T) {
1466 ctx, _ := testJava(t, `
1467 java_test_host {
1468 name: "foo"
1469 }
1470 `)
1471
Colin Cross0c66bc62021-07-20 09:47:41 -07001472 buildOS := ctx.Config().BuildOS.String()
Yuexi Ma627263f2021-03-04 13:47:56 -08001473 module := ctx.ModuleForTests("foo", buildOS+"_common").Module().(*TestHost)
1474 assertDeepEquals(t, "Default installable value should be true.", proptools.BoolPtr(true),
1475 module.properties.Installable)
1476}
Cole Faust75fffb12021-06-13 15:23:16 -07001477
1478func TestErrorproneEnabled(t *testing.T) {
1479 ctx, _ := testJava(t, `
1480 java_library {
1481 name: "foo",
1482 srcs: ["a.java"],
1483 errorprone: {
1484 enabled: true,
1485 },
1486 }
1487 `)
1488
1489 javac := ctx.ModuleForTests("foo", "android_common").Description("javac")
1490
1491 // Test that the errorprone plugins are passed to javac
1492 expectedSubstring := "-Xplugin:ErrorProne"
1493 if !strings.Contains(javac.Args["javacFlags"], expectedSubstring) {
Cole Faust2b1536e2021-06-18 12:25:54 -07001494 t.Errorf("expected javacFlags to contain %q, got %q", expectedSubstring, javac.Args["javacFlags"])
Cole Faust75fffb12021-06-13 15:23:16 -07001495 }
1496
1497 // Modules with errorprone { enabled: true } will include errorprone checks
1498 // in the main javac build rule. Only when RUN_ERROR_PRONE is true will
1499 // the explicit errorprone build rule be created.
1500 errorprone := ctx.ModuleForTests("foo", "android_common").MaybeDescription("errorprone")
1501 if errorprone.RuleParams.Description != "" {
1502 t.Errorf("expected errorprone build rule to not exist, but it did")
1503 }
1504}
Cole Faust2b1536e2021-06-18 12:25:54 -07001505
1506func TestErrorproneDisabled(t *testing.T) {
1507 bp := `
1508 java_library {
1509 name: "foo",
1510 srcs: ["a.java"],
1511 errorprone: {
1512 enabled: false,
1513 },
1514 }
1515 `
1516 ctx := android.GroupFixturePreparers(
1517 PrepareForTestWithJavaDefaultModules,
1518 android.FixtureMergeEnv(map[string]string{
1519 "RUN_ERROR_PRONE": "true",
1520 }),
1521 ).RunTestWithBp(t, bp)
1522
1523 javac := ctx.ModuleForTests("foo", "android_common").Description("javac")
1524
1525 // Test that the errorprone plugins are not passed to javac, like they would
1526 // be if enabled was true.
1527 expectedSubstring := "-Xplugin:ErrorProne"
1528 if strings.Contains(javac.Args["javacFlags"], expectedSubstring) {
1529 t.Errorf("expected javacFlags to not contain %q, got %q", expectedSubstring, javac.Args["javacFlags"])
1530 }
1531
1532 // Check that no errorprone build rule is created, like there would be
1533 // if enabled was unset and RUN_ERROR_PRONE was true.
1534 errorprone := ctx.ModuleForTests("foo", "android_common").MaybeDescription("errorprone")
1535 if errorprone.RuleParams.Description != "" {
1536 t.Errorf("expected errorprone build rule to not exist, but it did")
1537 }
1538}
1539
1540func TestErrorproneEnabledOnlyByEnvironmentVariable(t *testing.T) {
1541 bp := `
1542 java_library {
1543 name: "foo",
1544 srcs: ["a.java"],
1545 }
1546 `
1547 ctx := android.GroupFixturePreparers(
1548 PrepareForTestWithJavaDefaultModules,
1549 android.FixtureMergeEnv(map[string]string{
1550 "RUN_ERROR_PRONE": "true",
1551 }),
1552 ).RunTestWithBp(t, bp)
1553
1554 javac := ctx.ModuleForTests("foo", "android_common").Description("javac")
1555 errorprone := ctx.ModuleForTests("foo", "android_common").Description("errorprone")
1556
1557 // Check that the errorprone plugins are not passed to javac, because they
1558 // will instead be passed to the separate errorprone compilation
1559 expectedSubstring := "-Xplugin:ErrorProne"
1560 if strings.Contains(javac.Args["javacFlags"], expectedSubstring) {
1561 t.Errorf("expected javacFlags to not contain %q, got %q", expectedSubstring, javac.Args["javacFlags"])
1562 }
1563
1564 // Check that the errorprone plugin is enabled
1565 if !strings.Contains(errorprone.Args["javacFlags"], expectedSubstring) {
1566 t.Errorf("expected errorprone to contain %q, got %q", expectedSubstring, javac.Args["javacFlags"])
1567 }
1568}
Sam Delmericob3342ce2022-01-20 21:10:28 +00001569
1570func TestDataDeviceBinsBuildsDeviceBinary(t *testing.T) {
Sam Delmericocc271e22022-06-01 15:45:02 +00001571 testCases := []struct {
1572 dataDeviceBinType string
1573 depCompileMultilib string
1574 variants []string
1575 expectedError string
1576 }{
1577 {
1578 dataDeviceBinType: "first",
1579 depCompileMultilib: "first",
1580 variants: []string{"android_arm64_armv8-a"},
1581 },
1582 {
1583 dataDeviceBinType: "first",
1584 depCompileMultilib: "both",
1585 variants: []string{"android_arm64_armv8-a"},
1586 },
1587 {
1588 // this is true because our testing framework is set up with
1589 // Targets ~ [<64bit target>, <32bit target>], where 64bit is "first"
1590 dataDeviceBinType: "first",
1591 depCompileMultilib: "32",
1592 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1593 },
1594 {
1595 dataDeviceBinType: "first",
1596 depCompileMultilib: "64",
1597 variants: []string{"android_arm64_armv8-a"},
1598 },
1599 {
1600 dataDeviceBinType: "both",
1601 depCompileMultilib: "both",
1602 variants: []string{
1603 "android_arm_armv7-a-neon",
1604 "android_arm64_armv8-a",
1605 },
1606 },
1607 {
1608 dataDeviceBinType: "both",
1609 depCompileMultilib: "32",
1610 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1611 },
1612 {
1613 dataDeviceBinType: "both",
1614 depCompileMultilib: "64",
1615 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1616 },
1617 {
1618 dataDeviceBinType: "both",
1619 depCompileMultilib: "first",
1620 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1621 },
1622 {
1623 dataDeviceBinType: "32",
1624 depCompileMultilib: "32",
1625 variants: []string{"android_arm_armv7-a-neon"},
1626 },
1627 {
1628 dataDeviceBinType: "32",
1629 depCompileMultilib: "first",
1630 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1631 },
1632 {
1633 dataDeviceBinType: "32",
1634 depCompileMultilib: "both",
1635 variants: []string{"android_arm_armv7-a-neon"},
1636 },
1637 {
1638 dataDeviceBinType: "32",
1639 depCompileMultilib: "64",
1640 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1641 },
1642 {
1643 dataDeviceBinType: "64",
1644 depCompileMultilib: "64",
1645 variants: []string{"android_arm64_armv8-a"},
1646 },
1647 {
1648 dataDeviceBinType: "64",
1649 depCompileMultilib: "both",
1650 variants: []string{"android_arm64_armv8-a"},
1651 },
1652 {
1653 dataDeviceBinType: "64",
1654 depCompileMultilib: "first",
1655 variants: []string{"android_arm64_armv8-a"},
1656 },
1657 {
1658 dataDeviceBinType: "64",
1659 depCompileMultilib: "32",
1660 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1661 },
1662 {
1663 dataDeviceBinType: "prefer32",
1664 depCompileMultilib: "32",
1665 variants: []string{"android_arm_armv7-a-neon"},
1666 },
1667 {
1668 dataDeviceBinType: "prefer32",
1669 depCompileMultilib: "both",
1670 variants: []string{"android_arm_armv7-a-neon"},
1671 },
1672 {
1673 dataDeviceBinType: "prefer32",
1674 depCompileMultilib: "first",
1675 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1676 },
1677 {
1678 dataDeviceBinType: "prefer32",
1679 depCompileMultilib: "64",
1680 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1681 },
Sam Delmericob3342ce2022-01-20 21:10:28 +00001682 }
Sam Delmericob3342ce2022-01-20 21:10:28 +00001683
Sam Delmericocc271e22022-06-01 15:45:02 +00001684 bpTemplate := `
Sam Delmericob3342ce2022-01-20 21:10:28 +00001685 java_test_host {
1686 name: "foo",
1687 srcs: ["test.java"],
Sam Delmericocc271e22022-06-01 15:45:02 +00001688 data_device_bins_%s: ["bar"],
Sam Delmericob3342ce2022-01-20 21:10:28 +00001689 }
1690
1691 cc_binary {
1692 name: "bar",
Sam Delmericocc271e22022-06-01 15:45:02 +00001693 compile_multilib: "%s",
Sam Delmericob3342ce2022-01-20 21:10:28 +00001694 }
1695 `
1696
Sam Delmericocc271e22022-06-01 15:45:02 +00001697 for _, tc := range testCases {
1698 bp := fmt.Sprintf(bpTemplate, tc.dataDeviceBinType, tc.depCompileMultilib)
Sam Delmericob3342ce2022-01-20 21:10:28 +00001699
Sam Delmericocc271e22022-06-01 15:45:02 +00001700 errorHandler := android.FixtureExpectsNoErrors
1701 if tc.expectedError != "" {
1702 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
1703 }
Sam Delmericob3342ce2022-01-20 21:10:28 +00001704
Sam Delmericocc271e22022-06-01 15:45:02 +00001705 testName := fmt.Sprintf(`data_device_bins_%s with compile_multilib:"%s"`, tc.dataDeviceBinType, tc.depCompileMultilib)
1706 t.Run(testName, func(t *testing.T) {
1707 ctx := android.GroupFixturePreparers(PrepareForIntegrationTestWithJava).
1708 ExtendWithErrorHandler(errorHandler).
1709 RunTestWithBp(t, bp)
1710 if tc.expectedError != "" {
1711 return
1712 }
1713
1714 buildOS := ctx.Config.BuildOS.String()
1715 fooVariant := ctx.ModuleForTests("foo", buildOS+"_common")
1716 fooMod := fooVariant.Module().(*TestHost)
1717 entries := android.AndroidMkEntriesForTest(t, ctx.TestContext, fooMod)[0]
1718
1719 expectedAutogenConfig := `<option name="push-file" key="bar" value="/data/local/tests/unrestricted/foo/bar" />`
1720 autogen := fooVariant.Rule("autogen")
1721 if !strings.Contains(autogen.Args["extraConfigs"], expectedAutogenConfig) {
1722 t.Errorf("foo extraConfigs %v does not contain %q", autogen.Args["extraConfigs"], expectedAutogenConfig)
1723 }
1724
1725 expectedData := []string{}
1726 for _, variant := range tc.variants {
1727 barVariant := ctx.ModuleForTests("bar", variant)
1728 relocated := barVariant.Output("bar")
1729 expectedInput := fmt.Sprintf("out/soong/.intermediates/bar/%s/unstripped/bar", variant)
1730 android.AssertPathRelativeToTopEquals(t, "relocation input", expectedInput, relocated.Input)
1731
1732 expectedData = append(expectedData, fmt.Sprintf("out/soong/.intermediates/bar/%s/bar:bar", variant))
1733 }
1734
1735 actualData := entries.EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
1736 android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_TEST_DATA", ctx.Config, expectedData, actualData)
1737 })
Sam Delmericob3342ce2022-01-20 21:10:28 +00001738 }
1739}
Sam Delmerico277795c2022-02-25 17:04:37 +00001740
1741func TestImportMixedBuild(t *testing.T) {
1742 bp := `
1743 java_import {
1744 name: "baz",
1745 jars: [
1746 "test1.jar",
1747 "test2.jar",
1748 ],
1749 bazel_module: { label: "//foo/bar:baz" },
1750 }
1751 `
1752
1753 ctx := android.GroupFixturePreparers(
1754 prepareForJavaTest,
1755 android.FixtureModifyConfig(func(config android.Config) {
1756 config.BazelContext = android.MockBazelContext{
1757 OutputBaseDir: "outputbase",
1758 LabelToOutputFiles: map[string][]string{
1759 "//foo/bar:baz": []string{"test1.jar", "test2.jar"},
1760 },
1761 }
1762 }),
1763 ).RunTestWithBp(t, bp)
1764
1765 bazMod := ctx.ModuleForTests("baz", "android_common").Module()
1766 producer := bazMod.(android.OutputFileProducer)
1767 expectedOutputFiles := []string{".intermediates/baz/android_common/bazelCombined/baz.jar"}
1768
1769 outputFiles, err := producer.OutputFiles("")
1770 if err != nil {
1771 t.Errorf("Unexpected error getting java_import outputfiles %s", err)
1772 }
1773 actualOutputFiles := android.NormalizePathsForTesting(outputFiles)
1774 android.AssertDeepEquals(t, "Output files are produced", expectedOutputFiles, actualOutputFiles)
1775
1776 javaInfoProvider := ctx.ModuleProvider(bazMod, JavaInfoProvider)
1777 javaInfo, ok := javaInfoProvider.(JavaInfo)
1778 if !ok {
1779 t.Error("could not get JavaInfo from java_import module")
1780 }
1781 android.AssertDeepEquals(t, "Header JARs are produced", expectedOutputFiles, android.NormalizePathsForTesting(javaInfo.HeaderJars))
1782 android.AssertDeepEquals(t, "Implementation/Resources JARs are produced", expectedOutputFiles, android.NormalizePathsForTesting(javaInfo.ImplementationAndResourcesJars))
1783 android.AssertDeepEquals(t, "Implementation JARs are produced", expectedOutputFiles, android.NormalizePathsForTesting(javaInfo.ImplementationJars))
1784}
Sam Delmerico2351eac2022-05-24 17:10:02 +00001785
1786func TestGenAidlIncludeFlagsForMixedBuilds(t *testing.T) {
1787 bazelOutputBaseDir := filepath.Join("out", "bazel")
1788 result := android.GroupFixturePreparers(
1789 PrepareForIntegrationTestWithJava,
1790 android.FixtureModifyConfig(func(config android.Config) {
1791 config.BazelContext = android.MockBazelContext{
1792 OutputBaseDir: bazelOutputBaseDir,
1793 }
1794 }),
1795 ).RunTest(t)
1796
1797 ctx := &android.TestPathContext{TestResult: result}
1798
1799 srcDirectory := filepath.Join("frameworks", "base")
1800 srcDirectoryAlreadyIncluded := filepath.Join("frameworks", "base", "core", "java")
1801 bazelSrcDirectory := android.PathForBazelOut(ctx, srcDirectory)
1802 bazelSrcDirectoryAlreadyIncluded := android.PathForBazelOut(ctx, srcDirectoryAlreadyIncluded)
1803 srcs := android.Paths{
1804 android.PathForTestingWithRel(bazelSrcDirectory.String(), "bazelAidl.aidl"),
1805 android.PathForTestingWithRel(bazelSrcDirectory.String(), "bazelAidl2.aidl"),
1806 android.PathForTestingWithRel(bazelSrcDirectoryAlreadyIncluded.String(), "bazelAidlExclude.aidl"),
1807 android.PathForTestingWithRel(bazelSrcDirectoryAlreadyIncluded.String(), "bazelAidl2Exclude.aidl"),
1808 }
1809 dirsAlreadyIncluded := android.Paths{
1810 android.PathForTesting(srcDirectoryAlreadyIncluded),
1811 }
1812
1813 expectedFlags := " -Iout/bazel/execroot/__main__/frameworks/base"
1814 flags := genAidlIncludeFlags(ctx, srcs, dirsAlreadyIncluded)
1815 if flags != expectedFlags {
1816 t.Errorf("expected flags to be %q; was %q", expectedFlags, flags)
1817 }
1818}
Zi Wangca65b402022-10-10 13:45:06 -07001819
1820func TestDeviceBinaryWrapperGeneration(t *testing.T) {
1821 // Scenario 1: java_binary has main_class property in its bp
1822 ctx, _ := testJava(t, `
1823 java_binary {
1824 name: "foo",
1825 srcs: ["foo.java"],
1826 main_class: "foo.bar.jb",
1827 }
1828 `)
1829 wrapperPath := fmt.Sprint(ctx.ModuleForTests("foo", "android_arm64_armv8-a").AllOutputs())
1830 if !strings.Contains(wrapperPath, "foo.sh") {
1831 t.Errorf("wrapper file foo.sh is not generated")
1832 }
1833
1834 // Scenario 2: java_binary has neither wrapper nor main_class, its build
1835 // is expected to be failed.
1836 testJavaError(t, "main_class property is required for device binary if no default wrapper is assigned", `
1837 java_binary {
1838 name: "foo",
1839 srcs: ["foo.java"],
1840 }`)
1841}
Jihoon Kang0ac87c22022-11-15 19:06:14 +00001842
Jihoon Kang3198f3c2023-01-26 08:08:52 +00001843func TestJavaApiContributionEmptyApiFile(t *testing.T) {
1844 testJavaError(t,
1845 "Error: foo has an empty api file.",
1846 `java_api_contribution {
1847 name: "foo",
1848 }
1849 java_api_library {
1850 name: "bar",
1851 api_surface: "public",
1852 api_contributions: ["foo"],
1853 }
1854 `)
1855}
1856
Jihoon Kang0ac87c22022-11-15 19:06:14 +00001857func TestJavaApiLibraryAndProviderLink(t *testing.T) {
1858 provider_bp_a := `
1859 java_api_contribution {
1860 name: "foo1",
1861 api_file: "foo1.txt",
1862 }
1863 `
1864 provider_bp_b := `java_api_contribution {
1865 name: "foo2",
1866 api_file: "foo2.txt",
1867 }
1868 `
1869 ctx, _ := testJavaWithFS(t, `
1870 java_api_library {
1871 name: "bar1",
1872 api_surface: "public",
Jihoon Kang60d4a092022-11-17 23:47:43 +00001873 api_contributions: ["foo1"],
Jihoon Kang0ac87c22022-11-15 19:06:14 +00001874 }
1875
1876 java_api_library {
1877 name: "bar2",
1878 api_surface: "system",
Jihoon Kang60d4a092022-11-17 23:47:43 +00001879 api_contributions: ["foo1", "foo2"],
Spandan Dasc082eb82022-12-01 21:43:06 +00001880 api_files: ["api1/current.txt", "api2/current.txt"]
Jihoon Kang0ac87c22022-11-15 19:06:14 +00001881 }
1882 `,
1883 map[string][]byte{
1884 "a/Android.bp": []byte(provider_bp_a),
1885 "b/Android.bp": []byte(provider_bp_b),
1886 })
1887
1888 testcases := []struct {
1889 moduleName string
1890 sourceTextFileDirs []string
1891 }{
1892 {
1893 moduleName: "bar1",
1894 sourceTextFileDirs: []string{"a/foo1.txt"},
1895 },
1896 {
1897 moduleName: "bar2",
Spandan Dasc082eb82022-12-01 21:43:06 +00001898 sourceTextFileDirs: []string{"a/foo1.txt", "b/foo2.txt", "api1/current.txt", "api2/current.txt"},
Jihoon Kang0ac87c22022-11-15 19:06:14 +00001899 },
1900 }
1901 for _, c := range testcases {
1902 m := ctx.ModuleForTests(c.moduleName, "android_common")
1903 manifest := m.Output("metalava.sbox.textproto")
1904 sboxProto := android.RuleBuilderSboxProtoForTests(t, manifest)
1905 manifestCommand := sboxProto.Commands[0].GetCommand()
1906 sourceFilesFlag := "--source-files " + strings.Join(c.sourceTextFileDirs, " ")
1907 android.AssertStringDoesContain(t, "source text files not present", manifestCommand, sourceFilesFlag)
1908 }
1909}
1910
Jihoon Kang1c51f502023-01-09 23:42:40 +00001911func TestJavaApiLibraryAndDefaultsLink(t *testing.T) {
Jihoon Kang362aa9d2023-01-20 19:44:07 +00001912 provider_bp_a := `
1913 java_api_contribution {
Jihoon Kang1c51f502023-01-09 23:42:40 +00001914 name: "foo1",
1915 api_file: "foo1.txt",
1916 }
1917 `
Jihoon Kang362aa9d2023-01-20 19:44:07 +00001918 provider_bp_b := `
1919 java_api_contribution {
Jihoon Kang1c51f502023-01-09 23:42:40 +00001920 name: "foo2",
1921 api_file: "foo2.txt",
1922 }
1923 `
Jihoon Kang362aa9d2023-01-20 19:44:07 +00001924 provider_bp_c := `
1925 java_api_contribution {
Jihoon Kang1c51f502023-01-09 23:42:40 +00001926 name: "foo3",
1927 api_file: "foo3.txt",
1928 }
1929 `
Jihoon Kang362aa9d2023-01-20 19:44:07 +00001930 provider_bp_d := `
1931 java_api_contribution {
Jihoon Kang1c51f502023-01-09 23:42:40 +00001932 name: "foo4",
1933 api_file: "foo4.txt",
1934 }
1935 `
1936 ctx, _ := testJavaWithFS(t, `
1937 java_defaults {
1938 name: "baz1",
1939 api_surface: "public",
1940 api_contributions: ["foo1", "foo2"],
1941 }
1942
1943 java_defaults {
1944 name: "baz2",
1945 api_surface: "system",
1946 api_contributions: ["foo3"],
1947 }
1948
1949 java_api_library {
1950 name: "bar1",
1951 api_surface: "public",
1952 api_contributions: ["foo1"],
1953 }
1954
1955 java_api_library {
1956 name: "bar2",
1957 api_surface: "public",
1958 defaults:["baz1"],
1959 }
1960
1961 java_api_library {
1962 name: "bar3",
1963 api_surface: "system",
1964 defaults:["baz1", "baz2"],
1965 api_contributions: ["foo4"],
1966 api_files: ["api1/current.txt", "api2/current.txt"]
1967 }
1968 `,
1969 map[string][]byte{
1970 "a/Android.bp": []byte(provider_bp_a),
1971 "b/Android.bp": []byte(provider_bp_b),
1972 "c/Android.bp": []byte(provider_bp_c),
1973 "d/Android.bp": []byte(provider_bp_d),
1974 })
1975
1976 testcases := []struct {
1977 moduleName string
1978 sourceTextFileDirs []string
1979 }{
1980 {
1981 moduleName: "bar1",
1982 sourceTextFileDirs: []string{"a/foo1.txt"},
1983 },
1984 {
1985 moduleName: "bar2",
1986 sourceTextFileDirs: []string{"a/foo1.txt", "b/foo2.txt"},
1987 },
1988 {
1989 moduleName: "bar3",
1990 sourceTextFileDirs: []string{"c/foo3.txt", "a/foo1.txt", "b/foo2.txt", "d/foo4.txt", "api1/current.txt", "api2/current.txt"},
1991 },
1992 }
1993 for _, c := range testcases {
1994 m := ctx.ModuleForTests(c.moduleName, "android_common")
1995 manifest := m.Output("metalava.sbox.textproto")
1996 sboxProto := android.RuleBuilderSboxProtoForTests(t, manifest)
1997 manifestCommand := sboxProto.Commands[0].GetCommand()
1998 sourceFilesFlag := "--source-files " + strings.Join(c.sourceTextFileDirs, " ")
1999 android.AssertStringDoesContain(t, "source text files not present", manifestCommand, sourceFilesFlag)
2000 }
2001}
2002
Jihoon Kang0ac87c22022-11-15 19:06:14 +00002003func TestJavaApiLibraryJarGeneration(t *testing.T) {
2004 provider_bp_a := `
2005 java_api_contribution {
2006 name: "foo1",
2007 api_file: "foo1.txt",
2008 }
2009 `
Jihoon Kang362aa9d2023-01-20 19:44:07 +00002010 provider_bp_b := `
2011 java_api_contribution {
Jihoon Kang0ac87c22022-11-15 19:06:14 +00002012 name: "foo2",
2013 api_file: "foo2.txt",
2014 }
2015 `
2016 ctx, _ := testJavaWithFS(t, `
2017 java_api_library {
2018 name: "bar1",
2019 api_surface: "public",
Jihoon Kang60d4a092022-11-17 23:47:43 +00002020 api_contributions: ["foo1"],
Jihoon Kang0ac87c22022-11-15 19:06:14 +00002021 }
2022
2023 java_api_library {
2024 name: "bar2",
2025 api_surface: "system",
Jihoon Kang60d4a092022-11-17 23:47:43 +00002026 api_contributions: ["foo1", "foo2"],
Jihoon Kang0ac87c22022-11-15 19:06:14 +00002027 }
2028 `,
2029 map[string][]byte{
2030 "a/Android.bp": []byte(provider_bp_a),
2031 "b/Android.bp": []byte(provider_bp_b),
2032 })
2033
2034 testcases := []struct {
2035 moduleName string
2036 outputJarName string
2037 }{
2038 {
2039 moduleName: "bar1",
2040 outputJarName: "bar1/android.jar",
2041 },
2042 {
2043 moduleName: "bar2",
2044 outputJarName: "bar2/android.jar",
2045 },
2046 }
2047 for _, c := range testcases {
2048 m := ctx.ModuleForTests(c.moduleName, "android_common")
2049 outputs := fmt.Sprint(m.AllOutputs())
2050 if !strings.Contains(outputs, c.outputJarName) {
2051 t.Errorf("Module output does not contain expected jar %s", c.outputJarName)
2052 }
2053 }
2054}
Cole Faust21680542022-12-07 18:18:37 -08002055
Jihoon Kang362aa9d2023-01-20 19:44:07 +00002056func TestJavaApiLibraryLibsLink(t *testing.T) {
2057 provider_bp_a := `
2058 java_api_contribution {
2059 name: "foo1",
2060 api_file: "foo1.txt",
2061 }
2062 `
2063 provider_bp_b := `
2064 java_api_contribution {
2065 name: "foo2",
2066 api_file: "foo2.txt",
2067 }
2068 `
2069 lib_bp_a := `
2070 java_library {
2071 name: "lib1",
2072 srcs: ["Lib.java"],
2073 }
2074 `
2075 lib_bp_b := `
2076 java_library {
2077 name: "lib2",
2078 srcs: ["Lib.java"],
2079 }
2080 `
2081
2082 ctx, _ := testJavaWithFS(t, `
2083 java_api_library {
2084 name: "bar1",
2085 api_surface: "public",
2086 api_contributions: ["foo1"],
2087 libs: ["lib1"],
2088 }
2089
2090 java_api_library {
2091 name: "bar2",
2092 api_surface: "system",
2093 api_contributions: ["foo1", "foo2"],
2094 libs: ["lib1", "lib2", "bar1"],
2095 }
2096 `,
2097 map[string][]byte{
2098 "a/Android.bp": []byte(provider_bp_a),
2099 "b/Android.bp": []byte(provider_bp_b),
2100 "c/Android.bp": []byte(lib_bp_a),
2101 "c/Lib.java": {},
2102 "d/Android.bp": []byte(lib_bp_b),
2103 "d/Lib.java": {},
2104 })
2105
2106 testcases := []struct {
2107 moduleName string
2108 classPathJarNames []string
2109 }{
2110 {
2111 moduleName: "bar1",
2112 classPathJarNames: []string{"lib1.jar"},
2113 },
2114 {
2115 moduleName: "bar2",
2116 classPathJarNames: []string{"lib1.jar", "lib2.jar", "bar1/android.jar"},
2117 },
2118 }
2119 for _, c := range testcases {
2120 m := ctx.ModuleForTests(c.moduleName, "android_common")
2121 javacRules := m.Rule("javac")
2122 classPathArgs := javacRules.Args["classpath"]
2123 for _, jarName := range c.classPathJarNames {
2124 if !strings.Contains(classPathArgs, jarName) {
2125 t.Errorf("Module output does not contain expected jar %s", jarName)
2126 }
2127 }
2128 }
2129}
2130
Jihoon Kange30fff02023-02-14 20:18:20 +00002131func TestJavaApiLibraryStaticLibsLink(t *testing.T) {
2132 provider_bp_a := `
2133 java_api_contribution {
2134 name: "foo1",
2135 api_file: "foo1.txt",
2136 }
2137 `
2138 provider_bp_b := `
2139 java_api_contribution {
2140 name: "foo2",
2141 api_file: "foo2.txt",
2142 }
2143 `
2144 lib_bp_a := `
2145 java_library {
2146 name: "lib1",
2147 srcs: ["Lib.java"],
2148 }
2149 `
2150 lib_bp_b := `
2151 java_library {
2152 name: "lib2",
2153 srcs: ["Lib.java"],
2154 }
2155 `
2156
2157 ctx, _ := testJavaWithFS(t, `
2158 java_api_library {
2159 name: "bar1",
2160 api_surface: "public",
2161 api_contributions: ["foo1"],
2162 static_libs: ["lib1"],
2163 }
2164
2165 java_api_library {
2166 name: "bar2",
2167 api_surface: "system",
2168 api_contributions: ["foo1", "foo2"],
2169 static_libs: ["lib1", "lib2", "bar1"],
2170 }
2171 `,
2172 map[string][]byte{
2173 "a/Android.bp": []byte(provider_bp_a),
2174 "b/Android.bp": []byte(provider_bp_b),
2175 "c/Android.bp": []byte(lib_bp_a),
2176 "c/Lib.java": {},
2177 "d/Android.bp": []byte(lib_bp_b),
2178 "d/Lib.java": {},
2179 })
2180
2181 testcases := []struct {
2182 moduleName string
2183 staticLibJarNames []string
2184 }{
2185 {
2186 moduleName: "bar1",
2187 staticLibJarNames: []string{"lib1.jar"},
2188 },
2189 {
2190 moduleName: "bar2",
2191 staticLibJarNames: []string{"lib1.jar", "lib2.jar", "bar1/android.jar"},
2192 },
2193 }
2194 for _, c := range testcases {
2195 m := ctx.ModuleForTests(c.moduleName, "android_common")
2196 mergeZipsCommand := m.Rule("merge_zips").RuleParams.Command
2197 for _, jarName := range c.staticLibJarNames {
2198 if !strings.Contains(mergeZipsCommand, jarName) {
2199 t.Errorf("merge_zips command does not contain expected jar %s", jarName)
2200 }
2201 }
2202 }
2203}
2204
Cole Faust21680542022-12-07 18:18:37 -08002205func TestTradefedOptions(t *testing.T) {
2206 result := PrepareForTestWithJavaBuildComponents.RunTestWithBp(t, `
2207java_test_host {
2208 name: "foo",
2209 test_options: {
2210 tradefed_options: [
2211 {
2212 name: "exclude-path",
2213 value: "org/apache"
2214 }
2215 ]
2216 }
2217}
2218`)
2219
2220 buildOS := result.Config.BuildOS.String()
2221 args := result.ModuleForTests("foo", buildOS+"_common").
2222 Output("out/soong/.intermediates/foo/" + buildOS + "_common/foo.config").Args
2223 expected := proptools.NinjaAndShellEscape("<option name=\"exclude-path\" value=\"org/apache\" />")
2224 if args["extraConfigs"] != expected {
2225 t.Errorf("Expected args[\"extraConfigs\"] to equal %q, was %q", expected, args["extraConfigs"])
2226 }
2227}