blob: 553b762eeda8dee3ea15d0d3cdd19522e6a8c4ea [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")
Wei Li598f92d2023-01-04 17:12:24 -0800618
619 entries := android.AndroidMkEntriesForTest(t, ctx, fooModule.Module())[0]
620 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "java_library", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
621 entries = android.AndroidMkEntriesForTest(t, ctx, barModule.Module())[0]
622 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "java_import", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
623 entries = android.AndroidMkEntriesForTest(t, ctx, ctx.ModuleForTests("sdklib", "android_common").Module())[0]
624 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "java_sdk_library_import", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Colin Cross72bb3632017-07-13 16:23:21 -0700625}
626
Paul Duffin9b478b02019-12-10 13:41:51 +0000627func assertDeepEquals(t *testing.T, message string, expected interface{}, actual interface{}) {
628 if !reflect.DeepEqual(expected, actual) {
629 t.Errorf("%s: expected %q, found %q", message, expected, actual)
630 }
631}
632
Paul Duffin1a393322020-11-18 16:36:47 +0000633func TestPrebuiltStubsSources(t *testing.T) {
634 test := func(t *testing.T, sourcesPath string, expectedInputs []string) {
635 ctx, _ := testJavaWithFS(t, fmt.Sprintf(`
636prebuilt_stubs_sources {
637 name: "stubs-source",
638 srcs: ["%s"],
639}`, sourcesPath), map[string][]byte{
640 "stubs/sources/pkg/A.java": nil,
641 "stubs/sources/pkg/B.java": nil,
642 })
643
644 zipSrc := ctx.ModuleForTests("stubs-source", "android_common").Rule("zip_src")
645 if expected, actual := expectedInputs, zipSrc.Inputs.Strings(); !reflect.DeepEqual(expected, actual) {
646 t.Errorf("mismatch of inputs to soong_zip: expected %q, actual %q", expected, actual)
647 }
648 }
649
650 t.Run("empty/missing directory", func(t *testing.T) {
Colin Crossce3a51d2021-03-19 16:22:12 -0700651 test(t, "empty-directory", nil)
Paul Duffin1a393322020-11-18 16:36:47 +0000652 })
653
654 t.Run("non-empty set of sources", func(t *testing.T) {
655 test(t, "stubs/sources", []string{
656 "stubs/sources/pkg/A.java",
657 "stubs/sources/pkg/B.java",
658 })
659 })
660}
661
Colin Cross89536d42017-07-07 14:35:50 -0700662func TestDefaults(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700663 ctx, _ := testJava(t, `
Colin Cross89536d42017-07-07 14:35:50 -0700664 java_defaults {
665 name: "defaults",
666 srcs: ["a.java"],
667 libs: ["bar"],
668 static_libs: ["baz"],
Sasha Smundak2057f822019-04-16 17:16:58 -0700669 optimize: {enabled: false},
Colin Cross89536d42017-07-07 14:35:50 -0700670 }
671
672 java_library {
673 name: "foo",
674 defaults: ["defaults"],
675 }
676
677 java_library {
678 name: "bar",
679 srcs: ["b.java"],
680 }
681
682 java_library {
683 name: "baz",
684 srcs: ["c.java"],
685 }
Sasha Smundak2057f822019-04-16 17:16:58 -0700686
687 android_test {
688 name: "atestOptimize",
689 defaults: ["defaults"],
690 optimize: {enabled: true},
691 }
692
693 android_test {
694 name: "atestNoOptimize",
695 defaults: ["defaults"],
696 }
697
698 android_test {
699 name: "atestDefault",
700 srcs: ["a.java"],
701 }
Colin Cross89536d42017-07-07 14:35:50 -0700702 `)
703
Paul Duffina71a67a2021-03-29 00:42:57 +0100704 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
Nan Zhanged19fc32017-10-19 13:06:22 -0700705 combineJar := ctx.ModuleForTests("foo", "android_common").Description("for javac")
Colin Cross89536d42017-07-07 14:35:50 -0700706
707 if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "a.java" {
708 t.Errorf(`foo inputs %v != ["a.java"]`, javac.Inputs)
709 }
710
Paul Duffin414ea5e2021-03-22 17:31:52 +0000711 barTurbine := filepath.Join("out", "soong", ".intermediates", "bar", "android_common", "turbine-combined", "bar.jar")
Nan Zhanged19fc32017-10-19 13:06:22 -0700712 if !strings.Contains(javac.Args["classpath"], barTurbine) {
713 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
Colin Cross89536d42017-07-07 14:35:50 -0700714 }
715
Colin Cross1ee23172017-10-18 14:44:18 -0700716 baz := ctx.ModuleForTests("baz", "android_common").Rule("javac").Output.String()
Colin Cross0a6e0072017-08-30 14:24:55 -0700717 if len(combineJar.Inputs) != 2 || combineJar.Inputs[1].String() != baz {
718 t.Errorf("foo combineJar inputs %v does not contain %q", combineJar.Inputs, baz)
Colin Cross89536d42017-07-07 14:35:50 -0700719 }
Sasha Smundak2057f822019-04-16 17:16:58 -0700720
721 atestOptimize := ctx.ModuleForTests("atestOptimize", "android_common").MaybeRule("r8")
722 if atestOptimize.Output == nil {
723 t.Errorf("atestOptimize should optimize APK")
724 }
725
726 atestNoOptimize := ctx.ModuleForTests("atestNoOptimize", "android_common").MaybeRule("d8")
727 if atestNoOptimize.Output == nil {
728 t.Errorf("atestNoOptimize should not optimize APK")
729 }
730
Jared Duke63a3da92022-06-02 19:11:14 +0000731 atestDefault := ctx.ModuleForTests("atestDefault", "android_common").MaybeRule("d8")
Sasha Smundak2057f822019-04-16 17:16:58 -0700732 if atestDefault.Output == nil {
Jared Duke63a3da92022-06-02 19:11:14 +0000733 t.Errorf("atestDefault should not optimize APK")
Sasha Smundak2057f822019-04-16 17:16:58 -0700734 }
Colin Cross89536d42017-07-07 14:35:50 -0700735}
736
Colin Cross0f37af02017-09-27 17:42:05 -0700737func TestResources(t *testing.T) {
738 var table = []struct {
739 name string
740 prop string
741 extra string
742 args string
743 }{
744 {
Colin Crossaf9c55b2017-10-03 14:50:08 -0700745 // Test that a module with java_resource_dirs includes the files
Colin Cross0f37af02017-09-27 17:42:05 -0700746 name: "resource dirs",
Colin Cross824bee32017-11-22 17:27:51 -0800747 prop: `java_resource_dirs: ["java-res"]`,
Colin Cross0ead1d72018-04-10 13:07:42 -0700748 args: "-C java-res -f java-res/a/a -f java-res/b/b",
Colin Cross0f37af02017-09-27 17:42:05 -0700749 },
750 {
751 // Test that a module with java_resources includes the files
752 name: "resource files",
Colin Cross0ead1d72018-04-10 13:07:42 -0700753 prop: `java_resources: ["java-res/a/a", "java-res/b/b"]`,
754 args: "-C . -f java-res/a/a -f java-res/b/b",
Colin Cross0f37af02017-09-27 17:42:05 -0700755 },
756 {
757 // Test that a module with a filegroup in java_resources includes the files with the
758 // path prefix
759 name: "resource filegroup",
760 prop: `java_resources: [":foo-res"]`,
761 extra: `
762 filegroup {
763 name: "foo-res",
Colin Cross824bee32017-11-22 17:27:51 -0800764 path: "java-res",
Colin Cross0ead1d72018-04-10 13:07:42 -0700765 srcs: ["java-res/a/a", "java-res/b/b"],
Colin Cross0f37af02017-09-27 17:42:05 -0700766 }`,
Colin Cross0ead1d72018-04-10 13:07:42 -0700767 args: "-C java-res -f java-res/a/a -f java-res/b/b",
Colin Cross0f37af02017-09-27 17:42:05 -0700768 },
769 {
Colin Cross0ead1d72018-04-10 13:07:42 -0700770 // Test that a module with wildcards in java_resource_dirs has the correct path prefixes
771 name: "wildcard dirs",
772 prop: `java_resource_dirs: ["java-res/*"]`,
773 args: "-C java-res/a -f java-res/a/a -C java-res/b -f java-res/b/b",
774 },
775 {
776 // Test that a module exclude_java_resource_dirs excludes the files
777 name: "wildcard dirs",
778 prop: `java_resource_dirs: ["java-res/*"], exclude_java_resource_dirs: ["java-res/b"]`,
779 args: "-C java-res/a -f java-res/a/a",
780 },
Colin Crosscedd4762018-09-13 11:26:19 -0700781 {
782 // Test wildcards in java_resources
783 name: "wildcard files",
784 prop: `java_resources: ["java-res/**/*"]`,
785 args: "-C . -f java-res/a/a -f java-res/b/b",
786 },
787 {
788 // Test exclude_java_resources with java_resources
789 name: "wildcard files with exclude",
790 prop: `java_resources: ["java-res/**/*"], exclude_java_resources: ["java-res/b/*"]`,
791 args: "-C . -f java-res/a/a",
792 },
793 {
794 // Test exclude_java_resources with java_resource_dirs
795 name: "resource dirs with exclude files",
796 prop: `java_resource_dirs: ["java-res"], exclude_java_resources: ["java-res/b/b"]`,
797 args: "-C java-res -f java-res/a/a",
798 },
799 {
800 // Test exclude_java_resource_dirs with java_resource_dirs
801 name: "resource dirs with exclude files",
802 prop: `java_resource_dirs: ["java-res", "java-res2"], exclude_java_resource_dirs: ["java-res2"]`,
803 args: "-C java-res -f java-res/a/a -f java-res/b/b",
804 },
Colin Cross0f37af02017-09-27 17:42:05 -0700805 }
806
807 for _, test := range table {
808 t.Run(test.name, func(t *testing.T) {
Colin Cross238c1f32020-06-07 16:58:18 -0700809 ctx, _ := testJavaWithFS(t, `
Colin Cross0f37af02017-09-27 17:42:05 -0700810 java_library {
811 name: "foo",
812 srcs: [
813 "a.java",
814 "b.java",
815 "c.java",
816 ],
817 `+test.prop+`,
818 }
Colin Cross238c1f32020-06-07 16:58:18 -0700819 `+test.extra,
820 map[string][]byte{
821 "java-res/a/a": nil,
822 "java-res/b/b": nil,
823 "java-res2/a": nil,
824 },
825 )
Colin Cross0f37af02017-09-27 17:42:05 -0700826
Colin Cross331a1212018-08-15 20:40:52 -0700827 foo := ctx.ModuleForTests("foo", "android_common").Output("withres/foo.jar")
Colin Cross1ee23172017-10-18 14:44:18 -0700828 fooRes := ctx.ModuleForTests("foo", "android_common").Output("res/foo.jar")
Colin Cross0f37af02017-09-27 17:42:05 -0700829
830 if !inList(fooRes.Output.String(), foo.Inputs.Strings()) {
831 t.Errorf("foo combined jars %v does not contain %q",
832 foo.Inputs.Strings(), fooRes.Output.String())
833 }
834
Colin Crossaf9c55b2017-10-03 14:50:08 -0700835 if fooRes.Args["jarArgs"] != test.args {
836 t.Errorf("foo resource jar args %q is not %q",
Colin Cross0f37af02017-09-27 17:42:05 -0700837 fooRes.Args["jarArgs"], test.args)
838 }
839 })
840 }
841}
842
Colin Cross0c4ce212019-05-03 15:28:19 -0700843func TestIncludeSrcs(t *testing.T) {
Colin Cross238c1f32020-06-07 16:58:18 -0700844 ctx, _ := testJavaWithFS(t, `
Colin Cross0c4ce212019-05-03 15:28:19 -0700845 java_library {
846 name: "foo",
847 srcs: [
848 "a.java",
849 "b.java",
850 "c.java",
851 ],
852 include_srcs: true,
853 }
854
855 java_library {
856 name: "bar",
857 srcs: [
858 "a.java",
859 "b.java",
860 "c.java",
861 ],
862 java_resource_dirs: ["java-res"],
863 include_srcs: true,
864 }
Colin Cross238c1f32020-06-07 16:58:18 -0700865 `, map[string][]byte{
866 "java-res/a/a": nil,
867 "java-res/b/b": nil,
868 "java-res2/a": nil,
869 })
Colin Cross0c4ce212019-05-03 15:28:19 -0700870
871 // Test a library with include_srcs: true
872 foo := ctx.ModuleForTests("foo", "android_common").Output("withres/foo.jar")
873 fooSrcJar := ctx.ModuleForTests("foo", "android_common").Output("foo.srcjar")
874
875 if g, w := fooSrcJar.Output.String(), foo.Inputs.Strings(); !inList(g, w) {
876 t.Errorf("foo combined jars %v does not contain %q", w, g)
877 }
878
879 if g, w := fooSrcJar.Args["jarArgs"], "-C . -f a.java -f b.java -f c.java"; g != w {
880 t.Errorf("foo source jar args %q is not %q", w, g)
881 }
882
883 // Test a library with include_srcs: true and resources
884 bar := ctx.ModuleForTests("bar", "android_common").Output("withres/bar.jar")
885 barResCombined := ctx.ModuleForTests("bar", "android_common").Output("res-combined/bar.jar")
886 barRes := ctx.ModuleForTests("bar", "android_common").Output("res/bar.jar")
887 barSrcJar := ctx.ModuleForTests("bar", "android_common").Output("bar.srcjar")
888
889 if g, w := barSrcJar.Output.String(), barResCombined.Inputs.Strings(); !inList(g, w) {
890 t.Errorf("bar combined resource jars %v does not contain %q", w, g)
891 }
892
893 if g, w := barRes.Output.String(), barResCombined.Inputs.Strings(); !inList(g, w) {
894 t.Errorf("bar combined resource jars %v does not contain %q", w, g)
895 }
896
897 if g, w := barResCombined.Output.String(), bar.Inputs.Strings(); !inList(g, w) {
898 t.Errorf("bar combined jars %v does not contain %q", w, g)
899 }
900
901 if g, w := barSrcJar.Args["jarArgs"], "-C . -f a.java -f b.java -f c.java"; g != w {
902 t.Errorf("bar source jar args %q is not %q", w, g)
903 }
904
905 if g, w := barRes.Args["jarArgs"], "-C java-res -f java-res/a/a -f java-res/b/b"; g != w {
906 t.Errorf("bar resource jar args %q is not %q", w, g)
907 }
908}
909
Colin Cross54190b32017-10-09 15:34:10 -0700910func TestGeneratedSources(t *testing.T) {
Colin Cross238c1f32020-06-07 16:58:18 -0700911 ctx, _ := testJavaWithFS(t, `
Colin Cross54190b32017-10-09 15:34:10 -0700912 java_library {
913 name: "foo",
914 srcs: [
915 "a*.java",
916 ":gen",
917 "b*.java",
918 ],
919 }
920
921 genrule {
922 name: "gen",
Colin Cross824bee32017-11-22 17:27:51 -0800923 tool_files: ["java-res/a"],
Colin Cross54190b32017-10-09 15:34:10 -0700924 out: ["gen.java"],
925 }
Colin Cross238c1f32020-06-07 16:58:18 -0700926 `, map[string][]byte{
927 "a.java": nil,
928 "b.java": nil,
929 })
Colin Cross54190b32017-10-09 15:34:10 -0700930
931 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
932 genrule := ctx.ModuleForTests("gen", "").Rule("generator")
933
Colin Cross15e86d92017-10-20 15:07:08 -0700934 if filepath.Base(genrule.Output.String()) != "gen.java" {
935 t.Fatalf(`gen output file %v is not ".../gen.java"`, genrule.Output.String())
Colin Cross54190b32017-10-09 15:34:10 -0700936 }
937
938 if len(javac.Inputs) != 3 ||
939 javac.Inputs[0].String() != "a.java" ||
Colin Cross15e86d92017-10-20 15:07:08 -0700940 javac.Inputs[1].String() != genrule.Output.String() ||
Colin Cross54190b32017-10-09 15:34:10 -0700941 javac.Inputs[2].String() != "b.java" {
942 t.Errorf(`foo inputs %v != ["a.java", ".../gen.java", "b.java"]`, javac.Inputs)
943 }
944}
945
Nan Zhang61eaedb2017-11-02 13:28:15 -0700946func TestTurbine(t *testing.T) {
Paul Duffin71ae5942021-03-22 15:36:52 +0000947 result := android.GroupFixturePreparers(
948 prepareForJavaTest, FixtureWithPrebuiltApis(map[string][]string{"14": {"foo"}})).
Paul Duffin3d9f2682021-03-13 09:47:16 +0000949 RunTestWithBp(t, `
Nan Zhang61eaedb2017-11-02 13:28:15 -0700950 java_library {
951 name: "foo",
952 srcs: ["a.java"],
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: "bar",
Colin Cross9bc43432017-12-15 20:20:39 -0800958 srcs: ["b.java"],
Nan Zhang61eaedb2017-11-02 13:28:15 -0700959 static_libs: ["foo"],
Jiyong Park2d492942018-03-05 17:44:10 +0900960 sdk_version: "14",
Nan Zhang61eaedb2017-11-02 13:28:15 -0700961 }
962
963 java_library {
964 name: "baz",
965 srcs: ["c.java"],
966 libs: ["bar"],
967 sdk_version: "14",
968 }
969 `)
970
Paul Duffina71a67a2021-03-29 00:42:57 +0100971 fooTurbine := result.ModuleForTests("foo", "android_common").Rule("turbine")
972 barTurbine := result.ModuleForTests("bar", "android_common").Rule("turbine")
973 barJavac := result.ModuleForTests("bar", "android_common").Rule("javac")
974 barTurbineCombined := result.ModuleForTests("bar", "android_common").Description("for turbine")
975 bazJavac := result.ModuleForTests("baz", "android_common").Rule("javac")
Nan Zhang61eaedb2017-11-02 13:28:15 -0700976
Paul Duffin414ea5e2021-03-22 17:31:52 +0000977 android.AssertPathsRelativeToTopEquals(t, "foo inputs", []string{"a.java"}, fooTurbine.Inputs)
Nan Zhang61eaedb2017-11-02 13:28:15 -0700978
Paul Duffin414ea5e2021-03-22 17:31:52 +0000979 fooHeaderJar := filepath.Join("out", "soong", ".intermediates", "foo", "android_common", "turbine-combined", "foo.jar")
980 barTurbineJar := filepath.Join("out", "soong", ".intermediates", "bar", "android_common", "turbine", "bar.jar")
Colin Crossf61766e2022-03-16 18:06:48 -0700981 android.AssertStringDoesContain(t, "bar turbine classpath", barTurbine.Args["turbineFlags"], fooHeaderJar)
Paul Duffin3d9f2682021-03-13 09:47:16 +0000982 android.AssertStringDoesContain(t, "bar javac classpath", barJavac.Args["classpath"], fooHeaderJar)
Paul Duffin414ea5e2021-03-22 17:31:52 +0000983 android.AssertPathsRelativeToTopEquals(t, "bar turbine combineJar", []string{barTurbineJar, fooHeaderJar}, barTurbineCombined.Inputs)
Paul Duffin3d9f2682021-03-13 09:47:16 +0000984 android.AssertStringDoesContain(t, "baz javac classpath", bazJavac.Args["classpath"], "prebuilts/sdk/14/public/android.jar")
Nan Zhang61eaedb2017-11-02 13:28:15 -0700985}
986
987func TestSharding(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700988 ctx, _ := testJava(t, `
Nan Zhang61eaedb2017-11-02 13:28:15 -0700989 java_library {
990 name: "bar",
991 srcs: ["a.java","b.java","c.java"],
992 javac_shard_size: 1
993 }
994 `)
995
Colin Cross3d56ed52021-11-18 22:23:12 -0800996 barHeaderJar := filepath.Join("out", "soong", ".intermediates", "bar", "android_common", "turbine", "bar.jar")
Nan Zhang61eaedb2017-11-02 13:28:15 -0700997 for i := 0; i < 3; i++ {
Paul Duffina71a67a2021-03-29 00:42:57 +0100998 barJavac := ctx.ModuleForTests("bar", "android_common").Description("javac" + strconv.Itoa(i))
Colin Cross3d56ed52021-11-18 22:23:12 -0800999 if !strings.HasPrefix(barJavac.Args["classpath"], "-classpath "+barHeaderJar+":") {
1000 t.Errorf("bar javac classpath %v does start with %q", barJavac.Args["classpath"], barHeaderJar)
Nan Zhang61eaedb2017-11-02 13:28:15 -07001001 }
1002 }
1003}
1004
Nan Zhang27e284d2018-02-09 21:03:53 +00001005func TestExcludeFileGroupInSrcs(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001006 ctx, _ := testJava(t, `
Nan Zhang27e284d2018-02-09 21:03:53 +00001007 java_library {
1008 name: "foo",
1009 srcs: ["a.java", ":foo-srcs"],
1010 exclude_srcs: ["a.java", ":foo-excludes"],
1011 }
1012
1013 filegroup {
1014 name: "foo-srcs",
1015 srcs: ["java-fg/a.java", "java-fg/b.java", "java-fg/c.java"],
1016 }
1017
1018 filegroup {
1019 name: "foo-excludes",
1020 srcs: ["java-fg/a.java", "java-fg/b.java"],
1021 }
1022 `)
1023
1024 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
1025
1026 if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "java-fg/c.java" {
1027 t.Errorf(`foo inputs %v != ["java-fg/c.java"]`, javac.Inputs)
1028 }
1029}
Jiyong Parkc678ad32018-04-10 13:07:10 +09001030
Paul Duffin52d398a2019-06-11 12:31:14 +01001031func TestJavaLibrary(t *testing.T) {
Paul Duffin414ea5e2021-03-22 17:31:52 +00001032 testJavaWithFS(t, "", map[string][]byte{
Paul Duffin52d398a2019-06-11 12:31:14 +01001033 "libcore/Android.bp": []byte(`
1034 java_library {
1035 name: "core",
1036 sdk_version: "none",
1037 system_modules: "none",
Paul Duffinaa55f742020-10-06 17:20:13 +01001038 }
1039
1040 filegroup {
1041 name: "core-jar",
1042 srcs: [":core{.jar}"],
1043 }
Paul Duffin414ea5e2021-03-22 17:31:52 +00001044 `),
Paul Duffinaa55f742020-10-06 17:20:13 +01001045 })
Paul Duffinaa55f742020-10-06 17:20:13 +01001046}
1047
1048func TestJavaImport(t *testing.T) {
Paul Duffin414ea5e2021-03-22 17:31:52 +00001049 testJavaWithFS(t, "", map[string][]byte{
Paul Duffinaa55f742020-10-06 17:20:13 +01001050 "libcore/Android.bp": []byte(`
1051 java_import {
1052 name: "core",
1053 sdk_version: "none",
1054 }
1055
1056 filegroup {
1057 name: "core-jar",
1058 srcs: [":core{.jar}"],
1059 }
Paul Duffin414ea5e2021-03-22 17:31:52 +00001060 `),
Paul Duffin52d398a2019-06-11 12:31:14 +01001061 })
Paul Duffin52d398a2019-06-11 12:31:14 +01001062}
1063
Zoran Jovanovic8736ce22018-08-21 17:10:29 +02001064var compilerFlagsTestCases = []struct {
1065 in string
1066 out bool
1067}{
1068 {
1069 in: "a",
1070 out: false,
1071 },
1072 {
1073 in: "-a",
1074 out: true,
1075 },
1076 {
1077 in: "-no-jdk",
1078 out: false,
1079 },
1080 {
1081 in: "-no-stdlib",
1082 out: false,
1083 },
1084 {
1085 in: "-kotlin-home",
1086 out: false,
1087 },
1088 {
1089 in: "-kotlin-home /some/path",
1090 out: false,
1091 },
1092 {
1093 in: "-include-runtime",
1094 out: false,
1095 },
1096 {
1097 in: "-Xintellij-plugin-root",
1098 out: false,
1099 },
1100}
1101
1102type mockContext struct {
1103 android.ModuleContext
1104 result bool
1105}
1106
1107func (ctx *mockContext) PropertyErrorf(property, format string, args ...interface{}) {
1108 // CheckBadCompilerFlags calls this function when the flag should be rejected
1109 ctx.result = false
1110}
1111
1112func TestCompilerFlags(t *testing.T) {
1113 for _, testCase := range compilerFlagsTestCases {
1114 ctx := &mockContext{result: true}
1115 CheckKotlincFlags(ctx, []string{testCase.in})
1116 if ctx.result != testCase.out {
1117 t.Errorf("incorrect output:")
1118 t.Errorf(" input: %#v", testCase.in)
1119 t.Errorf(" expected: %#v", testCase.out)
1120 t.Errorf(" got: %#v", ctx.result)
1121 }
1122 }
1123}
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001124
1125// TODO(jungjw): Consider making this more robust by ignoring path order.
1126func checkPatchModuleFlag(t *testing.T, ctx *android.TestContext, moduleName string, expected string) {
Paul Duffin414ea5e2021-03-22 17:31:52 +00001127 variables := ctx.ModuleForTests(moduleName, "android_common").VariablesForTestsRelativeToTop()
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001128 flags := strings.Split(variables["javacFlags"], " ")
1129 got := ""
1130 for _, flag := range flags {
1131 keyEnd := strings.Index(flag, "=")
1132 if keyEnd > -1 && flag[:keyEnd] == "--patch-module" {
1133 got = flag[keyEnd+1:]
1134 break
1135 }
1136 }
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02001137 if expected != android.StringPathRelativeToTop(ctx.Config().SoongOutDir(), got) {
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001138 t.Errorf("Unexpected patch-module flag for module %q - expected %q, but got %q", moduleName, expected, got)
1139 }
1140}
1141
1142func TestPatchModule(t *testing.T) {
Pete Gillin0c2143e2019-05-02 15:32:11 +01001143 t.Run("Java language level 8", func(t *testing.T) {
Pete Gillin1b3370f2019-10-01 13:57:31 +01001144 // Test with legacy javac -source 1.8 -target 1.8
Pete Gillinbdf5d712019-10-21 14:29:58 +01001145 bp := `
1146 java_library {
1147 name: "foo",
1148 srcs: ["a.java"],
1149 java_version: "1.8",
1150 }
1151
1152 java_library {
1153 name: "bar",
1154 srcs: ["b.java"],
1155 sdk_version: "none",
1156 system_modules: "none",
1157 patch_module: "java.base",
1158 java_version: "1.8",
1159 }
1160
1161 java_library {
1162 name: "baz",
1163 srcs: ["c.java"],
1164 patch_module: "java.base",
1165 java_version: "1.8",
1166 }
1167 `
1168 ctx, _ := testJava(t, bp)
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001169
1170 checkPatchModuleFlag(t, ctx, "foo", "")
1171 checkPatchModuleFlag(t, ctx, "bar", "")
1172 checkPatchModuleFlag(t, ctx, "baz", "")
1173 })
1174
Pete Gillin0c2143e2019-05-02 15:32:11 +01001175 t.Run("Java language level 9", func(t *testing.T) {
Pete Gillin1b3370f2019-10-01 13:57:31 +01001176 // Test with default javac -source 9 -target 9
Pete Gillinbdf5d712019-10-21 14:29:58 +01001177 bp := `
1178 java_library {
1179 name: "foo",
1180 srcs: ["a.java"],
1181 }
1182
1183 java_library {
1184 name: "bar",
1185 srcs: ["b.java"],
1186 sdk_version: "none",
1187 system_modules: "none",
1188 patch_module: "java.base",
1189 }
1190
1191 java_library {
1192 name: "baz",
Jingwen Chen5136a6e2020-10-30 01:01:35 -04001193 srcs: [
1194 "c.java",
1195 // Tests for b/150878007
1196 "dir/d.java",
1197 "dir2/e.java",
1198 "dir2/f.java",
1199 "nested/dir/g.java"
1200 ],
Pete Gillinbdf5d712019-10-21 14:29:58 +01001201 patch_module: "java.base",
1202 }
1203 `
Pete Gillin1b3370f2019-10-01 13:57:31 +01001204 ctx, _ := testJava(t, bp)
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001205
1206 checkPatchModuleFlag(t, ctx, "foo", "")
Paul Duffin414ea5e2021-03-22 17:31:52 +00001207 expected := "java.base=.:out/soong"
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001208 checkPatchModuleFlag(t, ctx, "bar", expected)
Jingwen Chen5136a6e2020-10-30 01:01:35 -04001209 expected = "java.base=" + strings.Join([]string{
Paul Duffin414ea5e2021-03-22 17:31:52 +00001210 ".", "out/soong", "dir", "dir2", "nested", defaultModuleToPath("ext"), defaultModuleToPath("framework")}, ":")
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001211 checkPatchModuleFlag(t, ctx, "baz", expected)
1212 })
1213}
Paul Duffina7b9f422020-01-10 17:12:18 +00001214
Paul Duffin83a2d962019-11-19 19:44:10 +00001215func TestJavaLibraryWithSystemModules(t *testing.T) {
1216 ctx, _ := testJava(t, `
1217 java_library {
1218 name: "lib-with-source-system-modules",
1219 srcs: [
1220 "a.java",
1221 ],
1222 sdk_version: "none",
1223 system_modules: "source-system-modules",
1224 }
1225
1226 java_library {
1227 name: "source-jar",
1228 srcs: [
1229 "a.java",
1230 ],
1231 }
1232
1233 java_system_modules {
1234 name: "source-system-modules",
1235 libs: ["source-jar"],
1236 }
1237
1238 java_library {
1239 name: "lib-with-prebuilt-system-modules",
1240 srcs: [
1241 "a.java",
1242 ],
1243 sdk_version: "none",
1244 system_modules: "prebuilt-system-modules",
1245 }
1246
1247 java_import {
1248 name: "prebuilt-jar",
1249 jars: ["a.jar"],
1250 }
1251
1252 java_system_modules_import {
1253 name: "prebuilt-system-modules",
1254 libs: ["prebuilt-jar"],
1255 }
1256 `)
1257
1258 checkBootClasspathForSystemModule(t, ctx, "lib-with-source-system-modules", "/source-jar.jar")
1259
1260 checkBootClasspathForSystemModule(t, ctx, "lib-with-prebuilt-system-modules", "/prebuilt-jar.jar")
1261}
1262
1263func checkBootClasspathForSystemModule(t *testing.T, ctx *android.TestContext, moduleName string, expectedSuffix string) {
1264 javacRule := ctx.ModuleForTests(moduleName, "android_common").Rule("javac")
1265 bootClasspath := javacRule.Args["bootClasspath"]
1266 if strings.HasPrefix(bootClasspath, "--system ") && strings.HasSuffix(bootClasspath, expectedSuffix) {
1267 t.Errorf("bootclasspath of %q must start with --system and end with %q, but was %#v.", moduleName, expectedSuffix, bootClasspath)
1268 }
1269}
Jiyong Park19604de2020-03-24 16:44:11 +09001270
1271func TestAidlExportIncludeDirsFromImports(t *testing.T) {
1272 ctx, _ := testJava(t, `
1273 java_library {
1274 name: "foo",
1275 srcs: ["aidl/foo/IFoo.aidl"],
1276 libs: ["bar"],
1277 }
1278
1279 java_import {
1280 name: "bar",
1281 jars: ["a.jar"],
1282 aidl: {
1283 export_include_dirs: ["aidl/bar"],
1284 },
1285 }
1286 `)
1287
1288 aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
1289 expectedAidlFlag := "-Iaidl/bar"
1290 if !strings.Contains(aidlCommand, expectedAidlFlag) {
1291 t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1292 }
1293}
Liz Kammerdd849a82020-06-12 16:38:45 -07001294
Vinh Tran16fe8e12022-08-16 16:45:44 -04001295func TestAidlIncludeDirFromConvertedFileGroupWithPathPropInMixedBuilds(t *testing.T) {
Liz Kammer748209c2022-10-24 10:43:27 -04001296 // TODO(b/247782695), TODO(b/242847534) Fix mixed builds for filegroups
1297 t.Skip("Re-enable once filegroups are corrected for mixed builds")
Vinh Tran16fe8e12022-08-16 16:45:44 -04001298 bp := `
1299 filegroup {
1300 name: "foo_aidl",
1301 srcs: ["aidl/foo/IFoo.aidl"],
1302 path: "aidl/foo",
1303 bazel_module: { label: "//:foo_aidl" },
1304 }
1305 java_library {
1306 name: "foo",
1307 srcs: [":foo_aidl"],
1308 }
1309`
1310
1311 outBaseDir := "out/bazel/output"
1312 result := android.GroupFixturePreparers(
1313 prepareForJavaTest,
1314 android.PrepareForTestWithFilegroup,
1315 android.FixtureModifyConfig(func(config android.Config) {
1316 config.BazelContext = android.MockBazelContext{
1317 OutputBaseDir: outBaseDir,
1318 LabelToOutputFiles: map[string][]string{
1319 "//:foo_aidl": []string{"aidl/foo/IFoo.aidl"},
1320 },
1321 }
1322 }),
1323 ).RunTestWithBp(t, bp)
1324
1325 aidlCommand := result.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
1326 expectedAidlFlag := "-I" + outBaseDir + "/execroot/__main__/aidl/foo"
1327 if !strings.Contains(aidlCommand, expectedAidlFlag) {
1328 t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1329 }
1330}
1331
Jooyung Hane197d8b2021-01-05 10:33:16 +09001332func TestAidlFlagsArePassedToTheAidlCompiler(t *testing.T) {
1333 ctx, _ := testJava(t, `
1334 java_library {
1335 name: "foo",
1336 srcs: ["aidl/foo/IFoo.aidl"],
1337 aidl: { flags: ["-Werror"], },
1338 }
1339 `)
1340
1341 aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
1342 expectedAidlFlag := "-Werror"
1343 if !strings.Contains(aidlCommand, expectedAidlFlag) {
1344 t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1345 }
1346}
1347
Jooyung Han07f70c02021-11-06 07:08:45 +09001348func TestAidlFlagsWithMinSdkVersion(t *testing.T) {
1349 fixture := android.GroupFixturePreparers(
1350 prepareForJavaTest, FixtureWithPrebuiltApis(map[string][]string{"14": {"foo"}}))
1351
1352 for _, tc := range []struct {
1353 name string
1354 sdkVersion string
1355 expected string
1356 }{
1357 {"default is current", "", "current"},
1358 {"use sdk_version", `sdk_version: "14"`, "14"},
1359 {"system_current", `sdk_version: "system_current"`, "current"},
1360 } {
1361 t.Run(tc.name, func(t *testing.T) {
1362 ctx := fixture.RunTestWithBp(t, `
1363 java_library {
1364 name: "foo",
1365 srcs: ["aidl/foo/IFoo.aidl"],
1366 `+tc.sdkVersion+`
1367 }
1368 `)
1369 aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
1370 expectedAidlFlag := "--min_sdk_version=" + tc.expected
1371 if !strings.Contains(aidlCommand, expectedAidlFlag) {
1372 t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1373 }
1374 })
1375 }
1376}
1377
Spandan Das757b6662022-11-17 04:29:59 +00001378func TestAidlFlagsMinSdkVersionDroidstubs(t *testing.T) {
1379 bpTemplate := `
1380 droidstubs {
1381 name: "foo-stubs",
1382 srcs: ["foo.aidl"],
1383 %s
1384 system_modules: "none",
1385 }
1386 `
1387 testCases := []struct {
1388 desc string
1389 sdkVersionBp string
1390 minSdkVersionExpected string
1391 }{
1392 {
1393 desc: "sdk_version not set, module compiles against private platform APIs",
1394 sdkVersionBp: ``,
1395 minSdkVersionExpected: "10000",
1396 },
1397 {
1398 desc: "sdk_version set to none, module does not build against an SDK",
1399 sdkVersionBp: `sdk_version: "none",`,
1400 minSdkVersionExpected: "10000",
1401 },
1402 }
1403 for _, tc := range testCases {
1404 ctx := prepareForJavaTest.RunTestWithBp(t, fmt.Sprintf(bpTemplate, tc.sdkVersionBp))
1405 aidlCmd := ctx.ModuleForTests("foo-stubs", "android_common").Rule("aidl").RuleParams.Command
1406 expected := "--min_sdk_version=" + tc.minSdkVersionExpected
1407 android.AssertStringDoesContain(t, "aidl command conatins incorrect min_sdk_version for testCse: "+tc.desc, aidlCmd, expected)
1408 }
1409}
1410
Thiébaud Weksteende8417c2022-02-10 15:41:46 +11001411func TestAidlEnforcePermissions(t *testing.T) {
1412 ctx, _ := testJava(t, `
1413 java_library {
1414 name: "foo",
1415 srcs: ["aidl/foo/IFoo.aidl"],
1416 aidl: { enforce_permissions: true },
1417 }
1418 `)
1419
1420 aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
1421 expectedAidlFlag := "-Wmissing-permission-annotation -Werror"
1422 if !strings.Contains(aidlCommand, expectedAidlFlag) {
1423 t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1424 }
1425}
1426
1427func TestAidlEnforcePermissionsException(t *testing.T) {
1428 ctx, _ := testJava(t, `
1429 java_library {
1430 name: "foo",
1431 srcs: ["aidl/foo/IFoo.aidl", "aidl/foo/IFoo2.aidl"],
1432 aidl: { enforce_permissions: true, enforce_permissions_exceptions: ["aidl/foo/IFoo2.aidl"] },
1433 }
1434 `)
1435
1436 aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
1437 expectedAidlFlag := "$$FLAGS -Wmissing-permission-annotation -Werror aidl/foo/IFoo.aidl"
1438 if !strings.Contains(aidlCommand, expectedAidlFlag) {
1439 t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1440 }
1441 expectedAidlFlag = "$$FLAGS aidl/foo/IFoo2.aidl"
1442 if !strings.Contains(aidlCommand, expectedAidlFlag) {
1443 t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1444 }
1445}
1446
Liz Kammerdd849a82020-06-12 16:38:45 -07001447func TestDataNativeBinaries(t *testing.T) {
Cole Faust5c503d12023-01-24 11:48:08 -08001448 ctx := android.GroupFixturePreparers(
1449 prepareForJavaTest,
1450 android.PrepareForTestWithAllowMissingDependencies).RunTestWithBp(t, `
Liz Kammerdd849a82020-06-12 16:38:45 -07001451 java_test_host {
1452 name: "foo",
1453 srcs: ["a.java"],
1454 data_native_bins: ["bin"]
1455 }
1456
Cole Faust5c503d12023-01-24 11:48:08 -08001457 cc_binary_host {
Liz Kammerdd849a82020-06-12 16:38:45 -07001458 name: "bin",
Cole Faust5c503d12023-01-24 11:48:08 -08001459 srcs: ["bin.cpp"],
Liz Kammerdd849a82020-06-12 16:38:45 -07001460 }
Cole Faust5c503d12023-01-24 11:48:08 -08001461 `).TestContext
Liz Kammerdd849a82020-06-12 16:38:45 -07001462
Colin Cross0c66bc62021-07-20 09:47:41 -07001463 buildOS := ctx.Config().BuildOS.String()
Liz Kammerdd849a82020-06-12 16:38:45 -07001464
1465 test := ctx.ModuleForTests("foo", buildOS+"_common").Module().(*TestHost)
Colin Crossaa255532020-07-03 13:18:24 -07001466 entries := android.AndroidMkEntriesForTest(t, ctx, test)[0]
Cole Faust5c503d12023-01-24 11:48:08 -08001467 expected := []string{"out/soong/.intermediates/bin/" + buildOS + "_x86_64/bin:bin"}
Liz Kammerdd849a82020-06-12 16:38:45 -07001468 actual := entries.EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
Paul Duffin414ea5e2021-03-22 17:31:52 +00001469 android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_COMPATIBILITY_SUPPORT_FILES", ctx.Config(), expected, actual)
Liz Kammerdd849a82020-06-12 16:38:45 -07001470}
Yuexi Ma627263f2021-03-04 13:47:56 -08001471
1472func TestDefaultInstallable(t *testing.T) {
1473 ctx, _ := testJava(t, `
1474 java_test_host {
1475 name: "foo"
1476 }
1477 `)
1478
Colin Cross0c66bc62021-07-20 09:47:41 -07001479 buildOS := ctx.Config().BuildOS.String()
Yuexi Ma627263f2021-03-04 13:47:56 -08001480 module := ctx.ModuleForTests("foo", buildOS+"_common").Module().(*TestHost)
1481 assertDeepEquals(t, "Default installable value should be true.", proptools.BoolPtr(true),
1482 module.properties.Installable)
1483}
Cole Faust75fffb12021-06-13 15:23:16 -07001484
1485func TestErrorproneEnabled(t *testing.T) {
1486 ctx, _ := testJava(t, `
1487 java_library {
1488 name: "foo",
1489 srcs: ["a.java"],
1490 errorprone: {
1491 enabled: true,
1492 },
1493 }
1494 `)
1495
1496 javac := ctx.ModuleForTests("foo", "android_common").Description("javac")
1497
1498 // Test that the errorprone plugins are passed to javac
1499 expectedSubstring := "-Xplugin:ErrorProne"
1500 if !strings.Contains(javac.Args["javacFlags"], expectedSubstring) {
Cole Faust2b1536e2021-06-18 12:25:54 -07001501 t.Errorf("expected javacFlags to contain %q, got %q", expectedSubstring, javac.Args["javacFlags"])
Cole Faust75fffb12021-06-13 15:23:16 -07001502 }
1503
1504 // Modules with errorprone { enabled: true } will include errorprone checks
1505 // in the main javac build rule. Only when RUN_ERROR_PRONE is true will
1506 // the explicit errorprone build rule be created.
1507 errorprone := ctx.ModuleForTests("foo", "android_common").MaybeDescription("errorprone")
1508 if errorprone.RuleParams.Description != "" {
1509 t.Errorf("expected errorprone build rule to not exist, but it did")
1510 }
1511}
Cole Faust2b1536e2021-06-18 12:25:54 -07001512
1513func TestErrorproneDisabled(t *testing.T) {
1514 bp := `
1515 java_library {
1516 name: "foo",
1517 srcs: ["a.java"],
1518 errorprone: {
1519 enabled: false,
1520 },
1521 }
1522 `
1523 ctx := android.GroupFixturePreparers(
1524 PrepareForTestWithJavaDefaultModules,
1525 android.FixtureMergeEnv(map[string]string{
1526 "RUN_ERROR_PRONE": "true",
1527 }),
1528 ).RunTestWithBp(t, bp)
1529
1530 javac := ctx.ModuleForTests("foo", "android_common").Description("javac")
1531
1532 // Test that the errorprone plugins are not passed to javac, like they would
1533 // be if enabled was true.
1534 expectedSubstring := "-Xplugin:ErrorProne"
1535 if strings.Contains(javac.Args["javacFlags"], expectedSubstring) {
1536 t.Errorf("expected javacFlags to not contain %q, got %q", expectedSubstring, javac.Args["javacFlags"])
1537 }
1538
1539 // Check that no errorprone build rule is created, like there would be
1540 // if enabled was unset and RUN_ERROR_PRONE was true.
1541 errorprone := ctx.ModuleForTests("foo", "android_common").MaybeDescription("errorprone")
1542 if errorprone.RuleParams.Description != "" {
1543 t.Errorf("expected errorprone build rule to not exist, but it did")
1544 }
1545}
1546
1547func TestErrorproneEnabledOnlyByEnvironmentVariable(t *testing.T) {
1548 bp := `
1549 java_library {
1550 name: "foo",
1551 srcs: ["a.java"],
1552 }
1553 `
1554 ctx := android.GroupFixturePreparers(
1555 PrepareForTestWithJavaDefaultModules,
1556 android.FixtureMergeEnv(map[string]string{
1557 "RUN_ERROR_PRONE": "true",
1558 }),
1559 ).RunTestWithBp(t, bp)
1560
1561 javac := ctx.ModuleForTests("foo", "android_common").Description("javac")
1562 errorprone := ctx.ModuleForTests("foo", "android_common").Description("errorprone")
1563
1564 // Check that the errorprone plugins are not passed to javac, because they
1565 // will instead be passed to the separate errorprone compilation
1566 expectedSubstring := "-Xplugin:ErrorProne"
1567 if strings.Contains(javac.Args["javacFlags"], expectedSubstring) {
1568 t.Errorf("expected javacFlags to not contain %q, got %q", expectedSubstring, javac.Args["javacFlags"])
1569 }
1570
1571 // Check that the errorprone plugin is enabled
1572 if !strings.Contains(errorprone.Args["javacFlags"], expectedSubstring) {
1573 t.Errorf("expected errorprone to contain %q, got %q", expectedSubstring, javac.Args["javacFlags"])
1574 }
1575}
Sam Delmericob3342ce2022-01-20 21:10:28 +00001576
1577func TestDataDeviceBinsBuildsDeviceBinary(t *testing.T) {
Sam Delmericocc271e22022-06-01 15:45:02 +00001578 testCases := []struct {
1579 dataDeviceBinType string
1580 depCompileMultilib string
1581 variants []string
1582 expectedError string
1583 }{
1584 {
1585 dataDeviceBinType: "first",
1586 depCompileMultilib: "first",
1587 variants: []string{"android_arm64_armv8-a"},
1588 },
1589 {
1590 dataDeviceBinType: "first",
1591 depCompileMultilib: "both",
1592 variants: []string{"android_arm64_armv8-a"},
1593 },
1594 {
1595 // this is true because our testing framework is set up with
1596 // Targets ~ [<64bit target>, <32bit target>], where 64bit is "first"
1597 dataDeviceBinType: "first",
1598 depCompileMultilib: "32",
1599 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1600 },
1601 {
1602 dataDeviceBinType: "first",
1603 depCompileMultilib: "64",
1604 variants: []string{"android_arm64_armv8-a"},
1605 },
1606 {
1607 dataDeviceBinType: "both",
1608 depCompileMultilib: "both",
1609 variants: []string{
1610 "android_arm_armv7-a-neon",
1611 "android_arm64_armv8-a",
1612 },
1613 },
1614 {
1615 dataDeviceBinType: "both",
1616 depCompileMultilib: "32",
1617 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1618 },
1619 {
1620 dataDeviceBinType: "both",
1621 depCompileMultilib: "64",
1622 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1623 },
1624 {
1625 dataDeviceBinType: "both",
1626 depCompileMultilib: "first",
1627 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1628 },
1629 {
1630 dataDeviceBinType: "32",
1631 depCompileMultilib: "32",
1632 variants: []string{"android_arm_armv7-a-neon"},
1633 },
1634 {
1635 dataDeviceBinType: "32",
1636 depCompileMultilib: "first",
1637 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1638 },
1639 {
1640 dataDeviceBinType: "32",
1641 depCompileMultilib: "both",
1642 variants: []string{"android_arm_armv7-a-neon"},
1643 },
1644 {
1645 dataDeviceBinType: "32",
1646 depCompileMultilib: "64",
1647 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1648 },
1649 {
1650 dataDeviceBinType: "64",
1651 depCompileMultilib: "64",
1652 variants: []string{"android_arm64_armv8-a"},
1653 },
1654 {
1655 dataDeviceBinType: "64",
1656 depCompileMultilib: "both",
1657 variants: []string{"android_arm64_armv8-a"},
1658 },
1659 {
1660 dataDeviceBinType: "64",
1661 depCompileMultilib: "first",
1662 variants: []string{"android_arm64_armv8-a"},
1663 },
1664 {
1665 dataDeviceBinType: "64",
1666 depCompileMultilib: "32",
1667 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1668 },
1669 {
1670 dataDeviceBinType: "prefer32",
1671 depCompileMultilib: "32",
1672 variants: []string{"android_arm_armv7-a-neon"},
1673 },
1674 {
1675 dataDeviceBinType: "prefer32",
1676 depCompileMultilib: "both",
1677 variants: []string{"android_arm_armv7-a-neon"},
1678 },
1679 {
1680 dataDeviceBinType: "prefer32",
1681 depCompileMultilib: "first",
1682 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1683 },
1684 {
1685 dataDeviceBinType: "prefer32",
1686 depCompileMultilib: "64",
1687 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1688 },
Sam Delmericob3342ce2022-01-20 21:10:28 +00001689 }
Sam Delmericob3342ce2022-01-20 21:10:28 +00001690
Sam Delmericocc271e22022-06-01 15:45:02 +00001691 bpTemplate := `
Sam Delmericob3342ce2022-01-20 21:10:28 +00001692 java_test_host {
1693 name: "foo",
1694 srcs: ["test.java"],
Sam Delmericocc271e22022-06-01 15:45:02 +00001695 data_device_bins_%s: ["bar"],
Sam Delmericob3342ce2022-01-20 21:10:28 +00001696 }
1697
1698 cc_binary {
1699 name: "bar",
Sam Delmericocc271e22022-06-01 15:45:02 +00001700 compile_multilib: "%s",
Sam Delmericob3342ce2022-01-20 21:10:28 +00001701 }
1702 `
1703
Sam Delmericocc271e22022-06-01 15:45:02 +00001704 for _, tc := range testCases {
1705 bp := fmt.Sprintf(bpTemplate, tc.dataDeviceBinType, tc.depCompileMultilib)
Sam Delmericob3342ce2022-01-20 21:10:28 +00001706
Sam Delmericocc271e22022-06-01 15:45:02 +00001707 errorHandler := android.FixtureExpectsNoErrors
1708 if tc.expectedError != "" {
1709 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
1710 }
Sam Delmericob3342ce2022-01-20 21:10:28 +00001711
Sam Delmericocc271e22022-06-01 15:45:02 +00001712 testName := fmt.Sprintf(`data_device_bins_%s with compile_multilib:"%s"`, tc.dataDeviceBinType, tc.depCompileMultilib)
1713 t.Run(testName, func(t *testing.T) {
1714 ctx := android.GroupFixturePreparers(PrepareForIntegrationTestWithJava).
1715 ExtendWithErrorHandler(errorHandler).
1716 RunTestWithBp(t, bp)
1717 if tc.expectedError != "" {
1718 return
1719 }
1720
1721 buildOS := ctx.Config.BuildOS.String()
1722 fooVariant := ctx.ModuleForTests("foo", buildOS+"_common")
1723 fooMod := fooVariant.Module().(*TestHost)
1724 entries := android.AndroidMkEntriesForTest(t, ctx.TestContext, fooMod)[0]
1725
1726 expectedAutogenConfig := `<option name="push-file" key="bar" value="/data/local/tests/unrestricted/foo/bar" />`
1727 autogen := fooVariant.Rule("autogen")
1728 if !strings.Contains(autogen.Args["extraConfigs"], expectedAutogenConfig) {
1729 t.Errorf("foo extraConfigs %v does not contain %q", autogen.Args["extraConfigs"], expectedAutogenConfig)
1730 }
1731
1732 expectedData := []string{}
1733 for _, variant := range tc.variants {
1734 barVariant := ctx.ModuleForTests("bar", variant)
1735 relocated := barVariant.Output("bar")
1736 expectedInput := fmt.Sprintf("out/soong/.intermediates/bar/%s/unstripped/bar", variant)
1737 android.AssertPathRelativeToTopEquals(t, "relocation input", expectedInput, relocated.Input)
1738
1739 expectedData = append(expectedData, fmt.Sprintf("out/soong/.intermediates/bar/%s/bar:bar", variant))
1740 }
1741
1742 actualData := entries.EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
1743 android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_TEST_DATA", ctx.Config, expectedData, actualData)
1744 })
Sam Delmericob3342ce2022-01-20 21:10:28 +00001745 }
1746}
Sam Delmerico277795c2022-02-25 17:04:37 +00001747
1748func TestImportMixedBuild(t *testing.T) {
1749 bp := `
1750 java_import {
1751 name: "baz",
1752 jars: [
1753 "test1.jar",
1754 "test2.jar",
1755 ],
1756 bazel_module: { label: "//foo/bar:baz" },
1757 }
1758 `
1759
1760 ctx := android.GroupFixturePreparers(
1761 prepareForJavaTest,
1762 android.FixtureModifyConfig(func(config android.Config) {
1763 config.BazelContext = android.MockBazelContext{
1764 OutputBaseDir: "outputbase",
1765 LabelToOutputFiles: map[string][]string{
1766 "//foo/bar:baz": []string{"test1.jar", "test2.jar"},
1767 },
1768 }
1769 }),
1770 ).RunTestWithBp(t, bp)
1771
1772 bazMod := ctx.ModuleForTests("baz", "android_common").Module()
1773 producer := bazMod.(android.OutputFileProducer)
1774 expectedOutputFiles := []string{".intermediates/baz/android_common/bazelCombined/baz.jar"}
1775
1776 outputFiles, err := producer.OutputFiles("")
1777 if err != nil {
1778 t.Errorf("Unexpected error getting java_import outputfiles %s", err)
1779 }
1780 actualOutputFiles := android.NormalizePathsForTesting(outputFiles)
1781 android.AssertDeepEquals(t, "Output files are produced", expectedOutputFiles, actualOutputFiles)
1782
1783 javaInfoProvider := ctx.ModuleProvider(bazMod, JavaInfoProvider)
1784 javaInfo, ok := javaInfoProvider.(JavaInfo)
1785 if !ok {
1786 t.Error("could not get JavaInfo from java_import module")
1787 }
1788 android.AssertDeepEquals(t, "Header JARs are produced", expectedOutputFiles, android.NormalizePathsForTesting(javaInfo.HeaderJars))
1789 android.AssertDeepEquals(t, "Implementation/Resources JARs are produced", expectedOutputFiles, android.NormalizePathsForTesting(javaInfo.ImplementationAndResourcesJars))
1790 android.AssertDeepEquals(t, "Implementation JARs are produced", expectedOutputFiles, android.NormalizePathsForTesting(javaInfo.ImplementationJars))
1791}
Sam Delmerico2351eac2022-05-24 17:10:02 +00001792
1793func TestGenAidlIncludeFlagsForMixedBuilds(t *testing.T) {
1794 bazelOutputBaseDir := filepath.Join("out", "bazel")
1795 result := android.GroupFixturePreparers(
1796 PrepareForIntegrationTestWithJava,
1797 android.FixtureModifyConfig(func(config android.Config) {
1798 config.BazelContext = android.MockBazelContext{
1799 OutputBaseDir: bazelOutputBaseDir,
1800 }
1801 }),
1802 ).RunTest(t)
1803
1804 ctx := &android.TestPathContext{TestResult: result}
1805
1806 srcDirectory := filepath.Join("frameworks", "base")
1807 srcDirectoryAlreadyIncluded := filepath.Join("frameworks", "base", "core", "java")
1808 bazelSrcDirectory := android.PathForBazelOut(ctx, srcDirectory)
1809 bazelSrcDirectoryAlreadyIncluded := android.PathForBazelOut(ctx, srcDirectoryAlreadyIncluded)
1810 srcs := android.Paths{
1811 android.PathForTestingWithRel(bazelSrcDirectory.String(), "bazelAidl.aidl"),
1812 android.PathForTestingWithRel(bazelSrcDirectory.String(), "bazelAidl2.aidl"),
1813 android.PathForTestingWithRel(bazelSrcDirectoryAlreadyIncluded.String(), "bazelAidlExclude.aidl"),
1814 android.PathForTestingWithRel(bazelSrcDirectoryAlreadyIncluded.String(), "bazelAidl2Exclude.aidl"),
1815 }
1816 dirsAlreadyIncluded := android.Paths{
1817 android.PathForTesting(srcDirectoryAlreadyIncluded),
1818 }
1819
1820 expectedFlags := " -Iout/bazel/execroot/__main__/frameworks/base"
1821 flags := genAidlIncludeFlags(ctx, srcs, dirsAlreadyIncluded)
1822 if flags != expectedFlags {
1823 t.Errorf("expected flags to be %q; was %q", expectedFlags, flags)
1824 }
1825}
Zi Wangca65b402022-10-10 13:45:06 -07001826
1827func TestDeviceBinaryWrapperGeneration(t *testing.T) {
1828 // Scenario 1: java_binary has main_class property in its bp
1829 ctx, _ := testJava(t, `
1830 java_binary {
1831 name: "foo",
1832 srcs: ["foo.java"],
1833 main_class: "foo.bar.jb",
1834 }
1835 `)
1836 wrapperPath := fmt.Sprint(ctx.ModuleForTests("foo", "android_arm64_armv8-a").AllOutputs())
1837 if !strings.Contains(wrapperPath, "foo.sh") {
1838 t.Errorf("wrapper file foo.sh is not generated")
1839 }
1840
1841 // Scenario 2: java_binary has neither wrapper nor main_class, its build
1842 // is expected to be failed.
1843 testJavaError(t, "main_class property is required for device binary if no default wrapper is assigned", `
1844 java_binary {
1845 name: "foo",
1846 srcs: ["foo.java"],
1847 }`)
1848}
Jihoon Kang0ac87c22022-11-15 19:06:14 +00001849
Jihoon Kang3198f3c2023-01-26 08:08:52 +00001850func TestJavaApiContributionEmptyApiFile(t *testing.T) {
1851 testJavaError(t,
1852 "Error: foo has an empty api file.",
1853 `java_api_contribution {
1854 name: "foo",
1855 }
1856 java_api_library {
1857 name: "bar",
1858 api_surface: "public",
1859 api_contributions: ["foo"],
1860 }
1861 `)
1862}
1863
Jihoon Kang0ac87c22022-11-15 19:06:14 +00001864func TestJavaApiLibraryAndProviderLink(t *testing.T) {
1865 provider_bp_a := `
1866 java_api_contribution {
1867 name: "foo1",
1868 api_file: "foo1.txt",
1869 }
1870 `
1871 provider_bp_b := `java_api_contribution {
1872 name: "foo2",
1873 api_file: "foo2.txt",
1874 }
1875 `
1876 ctx, _ := testJavaWithFS(t, `
1877 java_api_library {
1878 name: "bar1",
1879 api_surface: "public",
Jihoon Kang60d4a092022-11-17 23:47:43 +00001880 api_contributions: ["foo1"],
Jihoon Kang0ac87c22022-11-15 19:06:14 +00001881 }
1882
1883 java_api_library {
1884 name: "bar2",
1885 api_surface: "system",
Jihoon Kang60d4a092022-11-17 23:47:43 +00001886 api_contributions: ["foo1", "foo2"],
Spandan Dasc082eb82022-12-01 21:43:06 +00001887 api_files: ["api1/current.txt", "api2/current.txt"]
Jihoon Kang0ac87c22022-11-15 19:06:14 +00001888 }
1889 `,
1890 map[string][]byte{
1891 "a/Android.bp": []byte(provider_bp_a),
1892 "b/Android.bp": []byte(provider_bp_b),
1893 })
1894
1895 testcases := []struct {
1896 moduleName string
1897 sourceTextFileDirs []string
1898 }{
1899 {
1900 moduleName: "bar1",
1901 sourceTextFileDirs: []string{"a/foo1.txt"},
1902 },
1903 {
1904 moduleName: "bar2",
Spandan Dasc082eb82022-12-01 21:43:06 +00001905 sourceTextFileDirs: []string{"a/foo1.txt", "b/foo2.txt", "api1/current.txt", "api2/current.txt"},
Jihoon Kang0ac87c22022-11-15 19:06:14 +00001906 },
1907 }
1908 for _, c := range testcases {
1909 m := ctx.ModuleForTests(c.moduleName, "android_common")
1910 manifest := m.Output("metalava.sbox.textproto")
1911 sboxProto := android.RuleBuilderSboxProtoForTests(t, manifest)
1912 manifestCommand := sboxProto.Commands[0].GetCommand()
1913 sourceFilesFlag := "--source-files " + strings.Join(c.sourceTextFileDirs, " ")
1914 android.AssertStringDoesContain(t, "source text files not present", manifestCommand, sourceFilesFlag)
1915 }
1916}
1917
Jihoon Kang1c51f502023-01-09 23:42:40 +00001918func TestJavaApiLibraryAndDefaultsLink(t *testing.T) {
Jihoon Kang362aa9d2023-01-20 19:44:07 +00001919 provider_bp_a := `
1920 java_api_contribution {
Jihoon Kang1c51f502023-01-09 23:42:40 +00001921 name: "foo1",
1922 api_file: "foo1.txt",
1923 }
1924 `
Jihoon Kang362aa9d2023-01-20 19:44:07 +00001925 provider_bp_b := `
1926 java_api_contribution {
Jihoon Kang1c51f502023-01-09 23:42:40 +00001927 name: "foo2",
1928 api_file: "foo2.txt",
1929 }
1930 `
Jihoon Kang362aa9d2023-01-20 19:44:07 +00001931 provider_bp_c := `
1932 java_api_contribution {
Jihoon Kang1c51f502023-01-09 23:42:40 +00001933 name: "foo3",
1934 api_file: "foo3.txt",
1935 }
1936 `
Jihoon Kang362aa9d2023-01-20 19:44:07 +00001937 provider_bp_d := `
1938 java_api_contribution {
Jihoon Kang1c51f502023-01-09 23:42:40 +00001939 name: "foo4",
1940 api_file: "foo4.txt",
1941 }
1942 `
1943 ctx, _ := testJavaWithFS(t, `
1944 java_defaults {
1945 name: "baz1",
1946 api_surface: "public",
1947 api_contributions: ["foo1", "foo2"],
1948 }
1949
1950 java_defaults {
1951 name: "baz2",
1952 api_surface: "system",
1953 api_contributions: ["foo3"],
1954 }
1955
1956 java_api_library {
1957 name: "bar1",
1958 api_surface: "public",
1959 api_contributions: ["foo1"],
1960 }
1961
1962 java_api_library {
1963 name: "bar2",
1964 api_surface: "public",
1965 defaults:["baz1"],
1966 }
1967
1968 java_api_library {
1969 name: "bar3",
1970 api_surface: "system",
1971 defaults:["baz1", "baz2"],
1972 api_contributions: ["foo4"],
1973 api_files: ["api1/current.txt", "api2/current.txt"]
1974 }
1975 `,
1976 map[string][]byte{
1977 "a/Android.bp": []byte(provider_bp_a),
1978 "b/Android.bp": []byte(provider_bp_b),
1979 "c/Android.bp": []byte(provider_bp_c),
1980 "d/Android.bp": []byte(provider_bp_d),
1981 })
1982
1983 testcases := []struct {
1984 moduleName string
1985 sourceTextFileDirs []string
1986 }{
1987 {
1988 moduleName: "bar1",
1989 sourceTextFileDirs: []string{"a/foo1.txt"},
1990 },
1991 {
1992 moduleName: "bar2",
1993 sourceTextFileDirs: []string{"a/foo1.txt", "b/foo2.txt"},
1994 },
1995 {
1996 moduleName: "bar3",
1997 sourceTextFileDirs: []string{"c/foo3.txt", "a/foo1.txt", "b/foo2.txt", "d/foo4.txt", "api1/current.txt", "api2/current.txt"},
1998 },
1999 }
2000 for _, c := range testcases {
2001 m := ctx.ModuleForTests(c.moduleName, "android_common")
2002 manifest := m.Output("metalava.sbox.textproto")
2003 sboxProto := android.RuleBuilderSboxProtoForTests(t, manifest)
2004 manifestCommand := sboxProto.Commands[0].GetCommand()
2005 sourceFilesFlag := "--source-files " + strings.Join(c.sourceTextFileDirs, " ")
2006 android.AssertStringDoesContain(t, "source text files not present", manifestCommand, sourceFilesFlag)
2007 }
2008}
2009
Jihoon Kang0ac87c22022-11-15 19:06:14 +00002010func TestJavaApiLibraryJarGeneration(t *testing.T) {
2011 provider_bp_a := `
2012 java_api_contribution {
2013 name: "foo1",
2014 api_file: "foo1.txt",
2015 }
2016 `
Jihoon Kang362aa9d2023-01-20 19:44:07 +00002017 provider_bp_b := `
2018 java_api_contribution {
Jihoon Kang0ac87c22022-11-15 19:06:14 +00002019 name: "foo2",
2020 api_file: "foo2.txt",
2021 }
2022 `
2023 ctx, _ := testJavaWithFS(t, `
2024 java_api_library {
2025 name: "bar1",
2026 api_surface: "public",
Jihoon Kang60d4a092022-11-17 23:47:43 +00002027 api_contributions: ["foo1"],
Jihoon Kang0ac87c22022-11-15 19:06:14 +00002028 }
2029
2030 java_api_library {
2031 name: "bar2",
2032 api_surface: "system",
Jihoon Kang60d4a092022-11-17 23:47:43 +00002033 api_contributions: ["foo1", "foo2"],
Jihoon Kang0ac87c22022-11-15 19:06:14 +00002034 }
2035 `,
2036 map[string][]byte{
2037 "a/Android.bp": []byte(provider_bp_a),
2038 "b/Android.bp": []byte(provider_bp_b),
2039 })
2040
2041 testcases := []struct {
2042 moduleName string
2043 outputJarName string
2044 }{
2045 {
2046 moduleName: "bar1",
Jihoon Kang25857f52023-03-01 00:27:32 +00002047 outputJarName: "bar1/bar1.jar",
Jihoon Kang0ac87c22022-11-15 19:06:14 +00002048 },
2049 {
2050 moduleName: "bar2",
Jihoon Kang25857f52023-03-01 00:27:32 +00002051 outputJarName: "bar2/bar2.jar",
Jihoon Kang0ac87c22022-11-15 19:06:14 +00002052 },
2053 }
2054 for _, c := range testcases {
2055 m := ctx.ModuleForTests(c.moduleName, "android_common")
2056 outputs := fmt.Sprint(m.AllOutputs())
2057 if !strings.Contains(outputs, c.outputJarName) {
2058 t.Errorf("Module output does not contain expected jar %s", c.outputJarName)
2059 }
2060 }
2061}
Cole Faust21680542022-12-07 18:18:37 -08002062
Jihoon Kang362aa9d2023-01-20 19:44:07 +00002063func TestJavaApiLibraryLibsLink(t *testing.T) {
2064 provider_bp_a := `
2065 java_api_contribution {
2066 name: "foo1",
2067 api_file: "foo1.txt",
2068 }
2069 `
2070 provider_bp_b := `
2071 java_api_contribution {
2072 name: "foo2",
2073 api_file: "foo2.txt",
2074 }
2075 `
2076 lib_bp_a := `
2077 java_library {
2078 name: "lib1",
2079 srcs: ["Lib.java"],
2080 }
2081 `
2082 lib_bp_b := `
2083 java_library {
2084 name: "lib2",
2085 srcs: ["Lib.java"],
2086 }
2087 `
2088
2089 ctx, _ := testJavaWithFS(t, `
2090 java_api_library {
2091 name: "bar1",
2092 api_surface: "public",
2093 api_contributions: ["foo1"],
2094 libs: ["lib1"],
2095 }
2096
2097 java_api_library {
2098 name: "bar2",
2099 api_surface: "system",
2100 api_contributions: ["foo1", "foo2"],
2101 libs: ["lib1", "lib2", "bar1"],
2102 }
2103 `,
2104 map[string][]byte{
2105 "a/Android.bp": []byte(provider_bp_a),
2106 "b/Android.bp": []byte(provider_bp_b),
2107 "c/Android.bp": []byte(lib_bp_a),
2108 "c/Lib.java": {},
2109 "d/Android.bp": []byte(lib_bp_b),
2110 "d/Lib.java": {},
2111 })
2112
2113 testcases := []struct {
2114 moduleName string
2115 classPathJarNames []string
2116 }{
2117 {
2118 moduleName: "bar1",
2119 classPathJarNames: []string{"lib1.jar"},
2120 },
2121 {
2122 moduleName: "bar2",
Jihoon Kang25857f52023-03-01 00:27:32 +00002123 classPathJarNames: []string{"lib1.jar", "lib2.jar", "bar1/bar1.jar"},
Jihoon Kang362aa9d2023-01-20 19:44:07 +00002124 },
2125 }
2126 for _, c := range testcases {
2127 m := ctx.ModuleForTests(c.moduleName, "android_common")
2128 javacRules := m.Rule("javac")
2129 classPathArgs := javacRules.Args["classpath"]
2130 for _, jarName := range c.classPathJarNames {
2131 if !strings.Contains(classPathArgs, jarName) {
2132 t.Errorf("Module output does not contain expected jar %s", jarName)
2133 }
2134 }
2135 }
2136}
2137
Jihoon Kange30fff02023-02-14 20:18:20 +00002138func TestJavaApiLibraryStaticLibsLink(t *testing.T) {
2139 provider_bp_a := `
2140 java_api_contribution {
2141 name: "foo1",
2142 api_file: "foo1.txt",
2143 }
2144 `
2145 provider_bp_b := `
2146 java_api_contribution {
2147 name: "foo2",
2148 api_file: "foo2.txt",
2149 }
2150 `
2151 lib_bp_a := `
2152 java_library {
2153 name: "lib1",
2154 srcs: ["Lib.java"],
2155 }
2156 `
2157 lib_bp_b := `
2158 java_library {
2159 name: "lib2",
2160 srcs: ["Lib.java"],
2161 }
2162 `
2163
2164 ctx, _ := testJavaWithFS(t, `
2165 java_api_library {
2166 name: "bar1",
2167 api_surface: "public",
2168 api_contributions: ["foo1"],
2169 static_libs: ["lib1"],
2170 }
2171
2172 java_api_library {
2173 name: "bar2",
2174 api_surface: "system",
2175 api_contributions: ["foo1", "foo2"],
2176 static_libs: ["lib1", "lib2", "bar1"],
2177 }
2178 `,
2179 map[string][]byte{
2180 "a/Android.bp": []byte(provider_bp_a),
2181 "b/Android.bp": []byte(provider_bp_b),
2182 "c/Android.bp": []byte(lib_bp_a),
2183 "c/Lib.java": {},
2184 "d/Android.bp": []byte(lib_bp_b),
2185 "d/Lib.java": {},
2186 })
2187
2188 testcases := []struct {
2189 moduleName string
2190 staticLibJarNames []string
2191 }{
2192 {
2193 moduleName: "bar1",
2194 staticLibJarNames: []string{"lib1.jar"},
2195 },
2196 {
2197 moduleName: "bar2",
Jihoon Kang25857f52023-03-01 00:27:32 +00002198 staticLibJarNames: []string{"lib1.jar", "lib2.jar", "bar1/bar1.jar"},
Jihoon Kange30fff02023-02-14 20:18:20 +00002199 },
2200 }
2201 for _, c := range testcases {
2202 m := ctx.ModuleForTests(c.moduleName, "android_common")
2203 mergeZipsCommand := m.Rule("merge_zips").RuleParams.Command
2204 for _, jarName := range c.staticLibJarNames {
2205 if !strings.Contains(mergeZipsCommand, jarName) {
2206 t.Errorf("merge_zips command does not contain expected jar %s", jarName)
2207 }
2208 }
2209 }
2210}
2211
Jihoon Kang01e522c2023-03-14 01:09:34 +00002212func TestJavaApiLibraryDepApiSrcs(t *testing.T) {
2213 provider_bp_a := `
2214 java_api_contribution {
2215 name: "foo1",
2216 api_file: "foo1.txt",
2217 }
2218 `
2219 provider_bp_b := `
2220 java_api_contribution {
2221 name: "foo2",
2222 api_file: "foo2.txt",
2223 }
2224 `
2225 lib_bp_a := `
2226 java_api_library {
2227 name: "lib1",
2228 api_surface: "public",
2229 api_contributions: ["foo1", "foo2"],
2230 }
2231 `
2232
2233 ctx, _ := testJavaWithFS(t, `
2234 java_api_library {
2235 name: "bar1",
2236 api_surface: "public",
2237 api_contributions: ["foo1"],
2238 dep_api_srcs: "lib1",
2239 }
2240 `,
2241 map[string][]byte{
2242 "a/Android.bp": []byte(provider_bp_a),
2243 "b/Android.bp": []byte(provider_bp_b),
2244 "c/Android.bp": []byte(lib_bp_a),
2245 })
2246
2247 m := ctx.ModuleForTests("bar1", "android_common")
2248 manifest := m.Output("metalava.sbox.textproto")
2249 sboxProto := android.RuleBuilderSboxProtoForTests(t, manifest)
2250 manifestCommand := sboxProto.Commands[0].GetCommand()
2251
2252 android.AssertStringDoesContain(t, "Command expected to contain module srcjar file", manifestCommand, "bar1-stubs.srcjar")
2253 android.AssertStringDoesContain(t, "Command expected to contain output files list text file flag", manifestCommand, "--out __SBOX_SANDBOX_DIR__/out/sources.txt")
2254}
2255
Cole Faust21680542022-12-07 18:18:37 -08002256func TestTradefedOptions(t *testing.T) {
2257 result := PrepareForTestWithJavaBuildComponents.RunTestWithBp(t, `
2258java_test_host {
2259 name: "foo",
2260 test_options: {
2261 tradefed_options: [
2262 {
2263 name: "exclude-path",
2264 value: "org/apache"
2265 }
2266 ]
2267 }
2268}
2269`)
2270
2271 buildOS := result.Config.BuildOS.String()
2272 args := result.ModuleForTests("foo", buildOS+"_common").
2273 Output("out/soong/.intermediates/foo/" + buildOS + "_common/foo.config").Args
2274 expected := proptools.NinjaAndShellEscape("<option name=\"exclude-path\" value=\"org/apache\" />")
2275 if args["extraConfigs"] != expected {
2276 t.Errorf("Expected args[\"extraConfigs\"] to equal %q, was %q", expected, args["extraConfigs"])
2277 }
2278}