blob: 81119a79e42a3a70823488f70d05970218c33396 [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.
Jiakai Zhangb95998b2023-05-11 16:39:27 +010049 PrepareForTestWithDexpreopt,
Paul Duffin95bdab42021-03-08 21:48:46 +000050)
51
Colin Cross72bb3632017-07-13 16:23:21 -070052func TestMain(m *testing.M) {
Paul Duffind6339af2021-03-22 18:05:04 +000053 os.Exit(m.Run())
Colin Cross527012a2017-11-30 22:56:16 -080054}
55
Paul Duffin95bdab42021-03-08 21:48:46 +000056// testJavaError is a legacy way of running tests of java modules that expect errors.
57//
58// See testJava for an explanation as to how to stop using this deprecated method.
59//
60// deprecated
Jeongik Cha2cc570d2019-10-29 15:44:45 +090061func testJavaError(t *testing.T, pattern string, bp string) (*android.TestContext, android.Config) {
Jeongik Cha538c0d02019-07-11 15:54:27 +090062 t.Helper()
Paul Duffin71ae5942021-03-22 15:36:52 +000063 result := android.GroupFixturePreparers(
Paul Duffin9fc9f532021-03-23 15:41:11 +000064 prepareForJavaTest, dexpreopt.PrepareForTestByEnablingDexpreopt).
Paul Duffin6bac49c2021-03-12 21:28:15 +000065 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
66 RunTestWithBp(t, bp)
67 return result.TestContext, result.Config
Jeongik Cha2cc570d2019-10-29 15:44:45 +090068}
69
Paul Duffin71ae5942021-03-22 15:36:52 +000070// testJavaWithFS runs tests using the prepareForJavaTest
Paul Duffin95bdab42021-03-08 21:48:46 +000071//
72// See testJava for an explanation as to how to stop using this deprecated method.
73//
74// deprecated
75func testJavaWithFS(t *testing.T, bp string, fs android.MockFS) (*android.TestContext, android.Config) {
Colin Cross238c1f32020-06-07 16:58:18 -070076 t.Helper()
Paul Duffin71ae5942021-03-22 15:36:52 +000077 result := android.GroupFixturePreparers(
78 prepareForJavaTest, fs.AddToFixture()).RunTestWithBp(t, bp)
Paul Duffin95bdab42021-03-08 21:48:46 +000079 return result.TestContext, result.Config
Colin Cross238c1f32020-06-07 16:58:18 -070080}
81
Paul Duffin71ae5942021-03-22 15:36:52 +000082// testJava runs tests using the prepareForJavaTest
Paul Duffin95bdab42021-03-08 21:48:46 +000083//
Paul Duffin71ae5942021-03-22 15:36:52 +000084// Do not add any new usages of this, instead use the prepareForJavaTest directly as it makes it
Paul Duffin95bdab42021-03-08 21:48:46 +000085// much easier to customize the test behavior.
86//
87// 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 +000088// convert the test to using prepareForJavaTest first and then in a following change add the
Paul Duffin95bdab42021-03-08 21:48:46 +000089// appropriate fixture preparers. Keeping the conversion change separate makes it easy to verify
90// that it did not change the test behavior unexpectedly.
91//
92// deprecated
Jaewoong Jungf9a04432019-07-17 11:15:09 -070093func testJava(t *testing.T, bp string) (*android.TestContext, android.Config) {
Colin Cross6b4a32d2017-12-05 13:42:45 -080094 t.Helper()
Paul Duffin71ae5942021-03-22 15:36:52 +000095 result := prepareForJavaTest.RunTestWithBp(t, bp)
Paul Duffin95bdab42021-03-08 21:48:46 +000096 return result.TestContext, result.Config
Jeongik Cha2cc570d2019-10-29 15:44:45 +090097}
98
Paul Duffin95bdab42021-03-08 21:48:46 +000099// defaultModuleToPath constructs a path to the turbine generate jar for a default test module that
100// is defined in PrepareForIntegrationTestWithJava
101func defaultModuleToPath(name string) string {
Paul Duffin76101fa2021-03-13 09:55:25 +0000102 switch {
103 case name == `""`:
104 return name
105 case strings.HasSuffix(name, ".jar"):
106 return name
107 default:
Paul Duffin414ea5e2021-03-22 17:31:52 +0000108 return filepath.Join("out", "soong", ".intermediates", defaultJavaDir, name, "android_common", "turbine-combined", name+".jar")
Paul Duffin76101fa2021-03-13 09:55:25 +0000109 }
Paul Duffin95bdab42021-03-08 21:48:46 +0000110}
111
Paul Duffin76e5c8a2021-03-20 14:19:46 +0000112// Test that the PrepareForTestWithJavaDefaultModules provides all the files that it uses by
113// running it in a fixture that requires all source files to exist.
114func TestPrepareForTestWithJavaDefaultModules(t *testing.T) {
115 android.GroupFixturePreparers(
116 PrepareForTestWithJavaDefaultModules,
117 android.PrepareForTestDisallowNonExistentPaths,
118 ).RunTest(t)
119}
120
Jeongik Chae403e9e2019-12-07 00:16:24 +0900121func TestJavaLinkType(t *testing.T) {
122 testJava(t, `
123 java_library {
124 name: "foo",
125 srcs: ["a.java"],
126 libs: ["bar"],
127 static_libs: ["baz"],
128 }
129
130 java_library {
131 name: "bar",
132 sdk_version: "current",
133 srcs: ["b.java"],
134 }
135
136 java_library {
137 name: "baz",
138 sdk_version: "system_current",
139 srcs: ["c.java"],
140 }
141 `)
142
Steven Moreland00298982020-11-17 21:44:36 +0000143 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900144 java_library {
145 name: "foo",
146 srcs: ["a.java"],
147 libs: ["bar"],
148 sdk_version: "current",
149 static_libs: ["baz"],
150 }
151
152 java_library {
153 name: "bar",
154 sdk_version: "current",
155 srcs: ["b.java"],
156 }
157
158 java_library {
159 name: "baz",
160 sdk_version: "system_current",
161 srcs: ["c.java"],
162 }
163 `)
164
165 testJava(t, `
166 java_library {
167 name: "foo",
168 srcs: ["a.java"],
169 libs: ["bar"],
170 sdk_version: "system_current",
171 static_libs: ["baz"],
172 }
173
174 java_library {
175 name: "bar",
176 sdk_version: "current",
177 srcs: ["b.java"],
178 }
179
180 java_library {
181 name: "baz",
182 sdk_version: "system_current",
183 srcs: ["c.java"],
184 }
185 `)
186
Steven Moreland00298982020-11-17 21:44:36 +0000187 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900188 java_library {
189 name: "foo",
190 srcs: ["a.java"],
191 libs: ["bar"],
192 sdk_version: "system_current",
193 static_libs: ["baz"],
194 }
195
196 java_library {
197 name: "bar",
198 sdk_version: "current",
199 srcs: ["b.java"],
200 }
201
202 java_library {
203 name: "baz",
204 srcs: ["c.java"],
205 }
206 `)
207}
208
Colin Cross72bb3632017-07-13 16:23:21 -0700209func TestSimple(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700210 ctx, _ := testJava(t, `
Colin Cross72bb3632017-07-13 16:23:21 -0700211 java_library {
212 name: "foo",
213 srcs: ["a.java"],
Colin Crosse8dc34a2017-07-19 11:22:16 -0700214 libs: ["bar"],
215 static_libs: ["baz"],
Colin Cross72bb3632017-07-13 16:23:21 -0700216 }
217
218 java_library {
219 name: "bar",
220 srcs: ["b.java"],
221 }
222
223 java_library {
224 name: "baz",
225 srcs: ["c.java"],
226 }
Colin Crossd5934c82017-10-02 13:55:26 -0700227 `)
Colin Cross72bb3632017-07-13 16:23:21 -0700228
Paul Duffina71a67a2021-03-29 00:42:57 +0100229 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
Nan Zhanged19fc32017-10-19 13:06:22 -0700230 combineJar := ctx.ModuleForTests("foo", "android_common").Description("for javac")
Colin Cross72bb3632017-07-13 16:23:21 -0700231
232 if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "a.java" {
233 t.Errorf(`foo inputs %v != ["a.java"]`, javac.Inputs)
234 }
235
Colin Cross1ee23172017-10-18 14:44:18 -0700236 baz := ctx.ModuleForTests("baz", "android_common").Rule("javac").Output.String()
Paul Duffin414ea5e2021-03-22 17:31:52 +0000237 barTurbine := filepath.Join("out", "soong", ".intermediates", "bar", "android_common", "turbine-combined", "bar.jar")
238 bazTurbine := filepath.Join("out", "soong", ".intermediates", "baz", "android_common", "turbine-combined", "baz.jar")
Colin Cross0a6e0072017-08-30 14:24:55 -0700239
Paul Duffin22b77cd2021-03-12 19:15:01 +0000240 android.AssertStringDoesContain(t, "foo classpath", javac.Args["classpath"], barTurbine)
Colin Cross72bb3632017-07-13 16:23:21 -0700241
Paul Duffin22b77cd2021-03-12 19:15:01 +0000242 android.AssertStringDoesContain(t, "foo classpath", javac.Args["classpath"], bazTurbine)
Colin Cross0a6e0072017-08-30 14:24:55 -0700243
244 if len(combineJar.Inputs) != 2 || combineJar.Inputs[1].String() != baz {
245 t.Errorf("foo combineJar inputs %v does not contain %q", combineJar.Inputs, baz)
Colin Cross72bb3632017-07-13 16:23:21 -0700246 }
247}
248
Artur Satayev9cf46692019-11-26 18:08:34 +0000249func TestExportedPlugins(t *testing.T) {
250 type Result struct {
Colin Crossc9fe10f2020-11-19 18:06:03 -0800251 library string
252 processors string
253 disableTurbine bool
Artur Satayev9cf46692019-11-26 18:08:34 +0000254 }
255 var tests = []struct {
256 name string
257 extra string
258 results []Result
259 }{
260 {
261 name: "Exported plugin is not a direct plugin",
262 extra: `java_library { name: "exports", srcs: ["a.java"], exported_plugins: ["plugin"] }`,
263 results: []Result{{library: "exports", processors: "-proc:none"}},
264 },
265 {
266 name: "Exports plugin to dependee",
267 extra: `
268 java_library{name: "exports", exported_plugins: ["plugin"]}
269 java_library{name: "foo", srcs: ["a.java"], libs: ["exports"]}
270 java_library{name: "bar", srcs: ["a.java"], static_libs: ["exports"]}
271 `,
272 results: []Result{
273 {library: "foo", processors: "-processor com.android.TestPlugin"},
274 {library: "bar", processors: "-processor com.android.TestPlugin"},
275 },
276 },
277 {
278 name: "Exports plugin to android_library",
279 extra: `
280 java_library{name: "exports", exported_plugins: ["plugin"]}
281 android_library{name: "foo", srcs: ["a.java"], libs: ["exports"]}
282 android_library{name: "bar", srcs: ["a.java"], static_libs: ["exports"]}
283 `,
284 results: []Result{
285 {library: "foo", processors: "-processor com.android.TestPlugin"},
286 {library: "bar", processors: "-processor com.android.TestPlugin"},
287 },
288 },
289 {
290 name: "Exports plugin is not propagated via transitive deps",
291 extra: `
292 java_library{name: "exports", exported_plugins: ["plugin"]}
293 java_library{name: "foo", srcs: ["a.java"], libs: ["exports"]}
294 java_library{name: "bar", srcs: ["a.java"], static_libs: ["foo"]}
295 `,
296 results: []Result{
297 {library: "foo", processors: "-processor com.android.TestPlugin"},
298 {library: "bar", processors: "-proc:none"},
299 },
300 },
301 {
302 name: "Exports plugin appends to plugins",
303 extra: `
304 java_plugin{name: "plugin2", processor_class: "com.android.TestPlugin2"}
305 java_library{name: "exports", exported_plugins: ["plugin"]}
306 java_library{name: "foo", srcs: ["a.java"], libs: ["exports"], plugins: ["plugin2"]}
307 `,
308 results: []Result{
309 {library: "foo", processors: "-processor com.android.TestPlugin,com.android.TestPlugin2"},
310 },
311 },
Colin Crossc9fe10f2020-11-19 18:06:03 -0800312 {
313 name: "Exports plugin to with generates_api to dependee",
314 extra: `
315 java_library{name: "exports", exported_plugins: ["plugin_generates_api"]}
316 java_library{name: "foo", srcs: ["a.java"], libs: ["exports"]}
317 java_library{name: "bar", srcs: ["a.java"], static_libs: ["exports"]}
318 `,
319 results: []Result{
320 {library: "foo", processors: "-processor com.android.TestPlugin", disableTurbine: true},
321 {library: "bar", processors: "-processor com.android.TestPlugin", disableTurbine: true},
322 },
323 },
Artur Satayev9cf46692019-11-26 18:08:34 +0000324 }
325
326 for _, test := range tests {
327 t.Run(test.name, func(t *testing.T) {
328 ctx, _ := testJava(t, `
329 java_plugin {
330 name: "plugin",
331 processor_class: "com.android.TestPlugin",
332 }
Colin Crossc9fe10f2020-11-19 18:06:03 -0800333 java_plugin {
334 name: "plugin_generates_api",
335 generates_api: true,
336 processor_class: "com.android.TestPlugin",
337 }
Artur Satayev9cf46692019-11-26 18:08:34 +0000338 `+test.extra)
339
340 for _, want := range test.results {
341 javac := ctx.ModuleForTests(want.library, "android_common").Rule("javac")
342 if javac.Args["processor"] != want.processors {
343 t.Errorf("For library %v, expected %v, found %v", want.library, want.processors, javac.Args["processor"])
344 }
Colin Crossc9fe10f2020-11-19 18:06:03 -0800345 turbine := ctx.ModuleForTests(want.library, "android_common").MaybeRule("turbine")
346 disableTurbine := turbine.BuildParams.Rule == nil
347 if disableTurbine != want.disableTurbine {
348 t.Errorf("For library %v, expected disableTurbine %v, found %v", want.library, want.disableTurbine, disableTurbine)
349 }
Artur Satayev9cf46692019-11-26 18:08:34 +0000350 }
351 })
352 }
353}
354
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900355func TestSdkVersionByPartition(t *testing.T) {
356 testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
Jeongik Cha6bd33c12019-06-25 16:26:18 +0900357 java_library {
358 name: "foo",
359 srcs: ["a.java"],
360 vendor: true,
361 }
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900362 `)
Jeongik Cha6bd33c12019-06-25 16:26:18 +0900363
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900364 testJava(t, `
Jeongik Cha6bd33c12019-06-25 16:26:18 +0900365 java_library {
366 name: "bar",
367 srcs: ["b.java"],
368 }
369 `)
370
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900371 for _, enforce := range []bool{true, false} {
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900372 bp := `
373 java_library {
374 name: "foo",
375 srcs: ["a.java"],
376 product_specific: true,
377 }
378 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800379
Paul Duffin414ea5e2021-03-22 17:31:52 +0000380 errorHandler := android.FixtureExpectsNoErrors
Jeongik Cha2cc570d2019-10-29 15:44:45 +0900381 if enforce {
Paul Duffin414ea5e2021-03-22 17:31:52 +0000382 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 +0900383 }
Paul Duffin414ea5e2021-03-22 17:31:52 +0000384
385 android.GroupFixturePreparers(
386 PrepareForTestWithJavaDefaultModules,
387 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
388 variables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
389 }),
390 ).
391 ExtendWithErrorHandler(errorHandler).
392 RunTestWithBp(t, bp)
Jeongik Cha6bd33c12019-06-25 16:26:18 +0900393 }
394}
395
Colin Crossd5934c82017-10-02 13:55:26 -0700396func TestArchSpecific(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700397 ctx, _ := testJava(t, `
Colin Crossd5934c82017-10-02 13:55:26 -0700398 java_library {
399 name: "foo",
400 srcs: ["a.java"],
401 target: {
402 android: {
403 srcs: ["b.java"],
404 },
405 },
406 }
407 `)
408
409 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
410 if len(javac.Inputs) != 2 || javac.Inputs[0].String() != "a.java" || javac.Inputs[1].String() != "b.java" {
411 t.Errorf(`foo inputs %v != ["a.java", "b.java"]`, javac.Inputs)
412 }
413}
414
Colin Cross6b4a32d2017-12-05 13:42:45 -0800415func TestBinary(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700416 ctx, _ := testJava(t, `
Colin Cross6b4a32d2017-12-05 13:42:45 -0800417 java_library_host {
418 name: "foo",
419 srcs: ["a.java"],
420 }
421
422 java_binary_host {
423 name: "bar",
424 srcs: ["b.java"],
425 static_libs: ["foo"],
Colin Cross89226d92020-10-09 19:00:54 -0700426 jni_libs: ["libjni"],
427 }
428
429 cc_library_shared {
430 name: "libjni",
431 host_supported: true,
432 device_supported: false,
433 stl: "none",
Colin Cross6b4a32d2017-12-05 13:42:45 -0800434 }
435 `)
436
Colin Cross0c66bc62021-07-20 09:47:41 -0700437 buildOS := ctx.Config().BuildOS.String()
Colin Cross6b4a32d2017-12-05 13:42:45 -0800438
439 bar := ctx.ModuleForTests("bar", buildOS+"_common")
440 barJar := bar.Output("bar.jar").Output.String()
441 barWrapper := ctx.ModuleForTests("bar", buildOS+"_x86_64")
442 barWrapperDeps := barWrapper.Output("bar").Implicits.Strings()
443
Colin Cross89226d92020-10-09 19:00:54 -0700444 libjni := ctx.ModuleForTests("libjni", buildOS+"_x86_64_shared")
445 libjniSO := libjni.Rule("Cp").Output.String()
446
Colin Cross6b4a32d2017-12-05 13:42:45 -0800447 // Test that the install binary wrapper depends on the installed jar file
Colin Crossc179ea62020-10-09 10:54:15 -0700448 if g, w := barWrapperDeps, barJar; !android.InList(w, g) {
449 t.Errorf("expected binary wrapper implicits to contain %q, got %q", w, g)
Colin Cross6b4a32d2017-12-05 13:42:45 -0800450 }
Colin Cross89226d92020-10-09 19:00:54 -0700451
452 // Test that the install binary wrapper depends on the installed JNI libraries
453 if g, w := barWrapperDeps, libjniSO; !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 }
Alex Humesky2070e322020-06-09 20:23:08 -0400456}
Colin Cross6b4a32d2017-12-05 13:42:45 -0800457
Colin Crossf8d9c492021-01-26 11:01:43 -0800458func TestTest(t *testing.T) {
459 ctx, _ := testJava(t, `
460 java_test_host {
461 name: "foo",
462 srcs: ["a.java"],
463 jni_libs: ["libjni"],
464 }
465
466 cc_library_shared {
467 name: "libjni",
468 host_supported: true,
469 device_supported: false,
470 stl: "none",
471 }
472 `)
473
Colin Cross0c66bc62021-07-20 09:47:41 -0700474 buildOS := ctx.Config().BuildOS.String()
Colin Crossf8d9c492021-01-26 11:01:43 -0800475
476 foo := ctx.ModuleForTests("foo", buildOS+"_common").Module().(*TestHost)
477
478 expected := "lib64/libjni.so"
479 if runtime.GOOS == "darwin" {
480 expected = "lib64/libjni.dylib"
481 }
482
483 fooTestData := foo.data
484 if len(fooTestData) != 1 || fooTestData[0].Rel() != expected {
485 t.Errorf(`expected foo test data relative path [%q], got %q`,
486 expected, fooTestData.Strings())
487 }
488}
489
Alex Humesky2070e322020-06-09 20:23:08 -0400490func TestHostBinaryNoJavaDebugInfoOverride(t *testing.T) {
491 bp := `
492 java_library {
493 name: "target_library",
494 srcs: ["a.java"],
495 }
496
497 java_binary_host {
498 name: "host_binary",
499 srcs: ["b.java"],
500 }
501 `
Alex Humesky2070e322020-06-09 20:23:08 -0400502
Paul Duffin414ea5e2021-03-22 17:31:52 +0000503 result := android.GroupFixturePreparers(
504 PrepareForTestWithJavaDefaultModules,
505 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
506 variables.MinimizeJavaDebugInfo = proptools.BoolPtr(true)
507 }),
508 ).RunTestWithBp(t, bp)
Alex Humesky2070e322020-06-09 20:23:08 -0400509
Liz Kammer7941b302020-07-28 13:27:34 -0700510 // first, check that the -g flag is added to target modules
Paul Duffin414ea5e2021-03-22 17:31:52 +0000511 targetLibrary := result.ModuleForTests("target_library", "android_common")
Alex Humesky2070e322020-06-09 20:23:08 -0400512 targetJavaFlags := targetLibrary.Module().VariablesForTests()["javacFlags"]
513 if !strings.Contains(targetJavaFlags, "-g:source,lines") {
514 t.Errorf("target library javac flags %v should contain "+
515 "-g:source,lines override with MinimizeJavaDebugInfo", targetJavaFlags)
516 }
517
518 // check that -g is not overridden for host modules
Colin Cross0c66bc62021-07-20 09:47:41 -0700519 buildOS := result.Config.BuildOS.String()
Paul Duffin414ea5e2021-03-22 17:31:52 +0000520 hostBinary := result.ModuleForTests("host_binary", buildOS+"_common")
Alex Humesky2070e322020-06-09 20:23:08 -0400521 hostJavaFlags := hostBinary.Module().VariablesForTests()["javacFlags"]
522 if strings.Contains(hostJavaFlags, "-g:source,lines") {
523 t.Errorf("java_binary_host javac flags %v should not have "+
524 "-g:source,lines override with MinimizeJavaDebugInfo", hostJavaFlags)
525 }
Colin Cross6b4a32d2017-12-05 13:42:45 -0800526}
527
Colin Cross72bb3632017-07-13 16:23:21 -0700528func TestPrebuilts(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700529 ctx, _ := testJava(t, `
Colin Cross72bb3632017-07-13 16:23:21 -0700530 java_library {
531 name: "foo",
Paul Duffin91547182019-11-12 19:39:36 +0000532 srcs: ["a.java", ":stubs-source"],
Paul Duffinfcfd7912020-01-31 17:54:30 +0000533 libs: ["bar", "sdklib"],
Colin Crosse8dc34a2017-07-19 11:22:16 -0700534 static_libs: ["baz"],
Colin Cross72bb3632017-07-13 16:23:21 -0700535 }
536
Colin Cross74d73e22017-08-02 11:05:49 -0700537 java_import {
Colin Cross72bb3632017-07-13 16:23:21 -0700538 name: "bar",
Colin Cross74d73e22017-08-02 11:05:49 -0700539 jars: ["a.jar"],
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: "baz",
Colin Cross74d73e22017-08-02 11:05:49 -0700544 jars: ["b.jar"],
Liz Kammerd6c31d22020-08-05 15:40:41 -0700545 sdk_version: "current",
546 compile_dex: true,
Colin Cross72bb3632017-07-13 16:23:21 -0700547 }
Colin Cross42be7612019-02-21 18:12:14 -0800548
549 dex_import {
550 name: "qux",
551 jars: ["b.jar"],
552 }
Colin Cross79c7c262019-04-17 11:11:46 -0700553
554 java_sdk_library_import {
Paul Duffin56d44902020-01-31 13:36:25 +0000555 name: "sdklib",
556 public: {
557 jars: ["c.jar"],
558 },
559 }
560
Paul Duffin91547182019-11-12 19:39:36 +0000561 prebuilt_stubs_sources {
562 name: "stubs-source",
Paul Duffin9b478b02019-12-10 13:41:51 +0000563 srcs: ["stubs/sources"],
Paul Duffin91547182019-11-12 19:39:36 +0000564 }
Paul Duffin1b82e6a2019-12-03 18:06:47 +0000565
566 java_test_import {
567 name: "test",
568 jars: ["a.jar"],
569 test_suites: ["cts"],
570 test_config: "AndroidTest.xml",
571 }
Colin Cross72bb3632017-07-13 16:23:21 -0700572 `)
573
Paul Duffin9b478b02019-12-10 13:41:51 +0000574 fooModule := ctx.ModuleForTests("foo", "android_common")
575 javac := fooModule.Rule("javac")
Nan Zhanged19fc32017-10-19 13:06:22 -0700576 combineJar := ctx.ModuleForTests("foo", "android_common").Description("for javac")
Liz Kammerd6c31d22020-08-05 15:40:41 -0700577 barModule := ctx.ModuleForTests("bar", "android_common")
578 barJar := barModule.Rule("combineJar").Output
579 bazModule := ctx.ModuleForTests("baz", "android_common")
580 bazJar := bazModule.Rule("combineJar").Output
Colin Cross79c7c262019-04-17 11:11:46 -0700581 sdklibStubsJar := ctx.ModuleForTests("sdklib.stubs", "android_common").Rule("combineJar").Output
Colin Cross72bb3632017-07-13 16:23:21 -0700582
Paul Duffin9b478b02019-12-10 13:41:51 +0000583 fooLibrary := fooModule.Module().(*Library)
Chaohui Wangdcbe33c2022-10-11 11:13:30 +0800584 assertDeepEquals(t, "foo unique sources incorrect",
585 []string{"a.java"}, fooLibrary.uniqueSrcFiles.Strings())
Paul Duffin91547182019-11-12 19:39:36 +0000586
Paul Duffin9b478b02019-12-10 13:41:51 +0000587 assertDeepEquals(t, "foo java source jars incorrect",
588 []string{".intermediates/stubs-source/android_common/stubs-source-stubs.srcjar"},
589 android.NormalizePathsForTesting(fooLibrary.compiledSrcJars))
Paul Duffin91547182019-11-12 19:39:36 +0000590
Colin Cross37f6d792018-07-12 12:28:41 -0700591 if !strings.Contains(javac.Args["classpath"], barJar.String()) {
592 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], barJar.String())
Colin Cross72bb3632017-07-13 16:23:21 -0700593 }
594
Liz Kammerd6c31d22020-08-05 15:40:41 -0700595 barDexJar := barModule.Module().(*Import).DexJarBuildPath()
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +0100596 if barDexJar.IsSet() {
597 t.Errorf("bar dex jar build path expected to be set, got %s", barDexJar)
Liz Kammerd6c31d22020-08-05 15:40:41 -0700598 }
599
Colin Cross79c7c262019-04-17 11:11:46 -0700600 if !strings.Contains(javac.Args["classpath"], sdklibStubsJar.String()) {
601 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], sdklibStubsJar.String())
602 }
603
Colin Cross37f6d792018-07-12 12:28:41 -0700604 if len(combineJar.Inputs) != 2 || combineJar.Inputs[1].String() != bazJar.String() {
605 t.Errorf("foo combineJar inputs %v does not contain %q", combineJar.Inputs, bazJar.String())
Colin Cross72bb3632017-07-13 16:23:21 -0700606 }
Colin Cross42be7612019-02-21 18:12:14 -0800607
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +0100608 bazDexJar := bazModule.Module().(*Import).DexJarBuildPath().Path()
Paul Duffin414ea5e2021-03-22 17:31:52 +0000609 expectedDexJar := "out/soong/.intermediates/baz/android_common/dex/baz.jar"
610 android.AssertPathRelativeToTopEquals(t, "baz dex jar build path", expectedDexJar, bazDexJar)
Liz Kammerd6c31d22020-08-05 15:40:41 -0700611
Colin Cross42be7612019-02-21 18:12:14 -0800612 ctx.ModuleForTests("qux", "android_common").Rule("Cp")
Wei Li598f92d2023-01-04 17:12:24 -0800613
614 entries := android.AndroidMkEntriesForTest(t, ctx, fooModule.Module())[0]
615 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "java_library", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
616 entries = android.AndroidMkEntriesForTest(t, ctx, barModule.Module())[0]
617 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "java_import", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
618 entries = android.AndroidMkEntriesForTest(t, ctx, ctx.ModuleForTests("sdklib", "android_common").Module())[0]
619 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 -0700620}
621
Paul Duffin9b478b02019-12-10 13:41:51 +0000622func assertDeepEquals(t *testing.T, message string, expected interface{}, actual interface{}) {
623 if !reflect.DeepEqual(expected, actual) {
624 t.Errorf("%s: expected %q, found %q", message, expected, actual)
625 }
626}
627
Paul Duffin1a393322020-11-18 16:36:47 +0000628func TestPrebuiltStubsSources(t *testing.T) {
629 test := func(t *testing.T, sourcesPath string, expectedInputs []string) {
630 ctx, _ := testJavaWithFS(t, fmt.Sprintf(`
631prebuilt_stubs_sources {
632 name: "stubs-source",
633 srcs: ["%s"],
634}`, sourcesPath), map[string][]byte{
635 "stubs/sources/pkg/A.java": nil,
636 "stubs/sources/pkg/B.java": nil,
637 })
638
639 zipSrc := ctx.ModuleForTests("stubs-source", "android_common").Rule("zip_src")
640 if expected, actual := expectedInputs, zipSrc.Inputs.Strings(); !reflect.DeepEqual(expected, actual) {
641 t.Errorf("mismatch of inputs to soong_zip: expected %q, actual %q", expected, actual)
642 }
643 }
644
645 t.Run("empty/missing directory", func(t *testing.T) {
Colin Crossce3a51d2021-03-19 16:22:12 -0700646 test(t, "empty-directory", nil)
Paul Duffin1a393322020-11-18 16:36:47 +0000647 })
648
649 t.Run("non-empty set of sources", func(t *testing.T) {
650 test(t, "stubs/sources", []string{
651 "stubs/sources/pkg/A.java",
652 "stubs/sources/pkg/B.java",
653 })
654 })
655}
656
Colin Cross89536d42017-07-07 14:35:50 -0700657func TestDefaults(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700658 ctx, _ := testJava(t, `
Colin Cross89536d42017-07-07 14:35:50 -0700659 java_defaults {
660 name: "defaults",
661 srcs: ["a.java"],
662 libs: ["bar"],
663 static_libs: ["baz"],
Sasha Smundak2057f822019-04-16 17:16:58 -0700664 optimize: {enabled: false},
Colin Cross89536d42017-07-07 14:35:50 -0700665 }
666
667 java_library {
668 name: "foo",
669 defaults: ["defaults"],
670 }
671
672 java_library {
673 name: "bar",
674 srcs: ["b.java"],
675 }
676
677 java_library {
678 name: "baz",
679 srcs: ["c.java"],
680 }
Sasha Smundak2057f822019-04-16 17:16:58 -0700681
682 android_test {
683 name: "atestOptimize",
684 defaults: ["defaults"],
685 optimize: {enabled: true},
686 }
687
688 android_test {
689 name: "atestNoOptimize",
690 defaults: ["defaults"],
691 }
692
693 android_test {
694 name: "atestDefault",
695 srcs: ["a.java"],
696 }
Colin Cross89536d42017-07-07 14:35:50 -0700697 `)
698
Paul Duffina71a67a2021-03-29 00:42:57 +0100699 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
Nan Zhanged19fc32017-10-19 13:06:22 -0700700 combineJar := ctx.ModuleForTests("foo", "android_common").Description("for javac")
Colin Cross89536d42017-07-07 14:35:50 -0700701
702 if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "a.java" {
703 t.Errorf(`foo inputs %v != ["a.java"]`, javac.Inputs)
704 }
705
Paul Duffin414ea5e2021-03-22 17:31:52 +0000706 barTurbine := filepath.Join("out", "soong", ".intermediates", "bar", "android_common", "turbine-combined", "bar.jar")
Nan Zhanged19fc32017-10-19 13:06:22 -0700707 if !strings.Contains(javac.Args["classpath"], barTurbine) {
708 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
Colin Cross89536d42017-07-07 14:35:50 -0700709 }
710
Colin Cross1ee23172017-10-18 14:44:18 -0700711 baz := ctx.ModuleForTests("baz", "android_common").Rule("javac").Output.String()
Colin Cross0a6e0072017-08-30 14:24:55 -0700712 if len(combineJar.Inputs) != 2 || combineJar.Inputs[1].String() != baz {
713 t.Errorf("foo combineJar inputs %v does not contain %q", combineJar.Inputs, baz)
Colin Cross89536d42017-07-07 14:35:50 -0700714 }
Sasha Smundak2057f822019-04-16 17:16:58 -0700715
716 atestOptimize := ctx.ModuleForTests("atestOptimize", "android_common").MaybeRule("r8")
717 if atestOptimize.Output == nil {
718 t.Errorf("atestOptimize should optimize APK")
719 }
720
721 atestNoOptimize := ctx.ModuleForTests("atestNoOptimize", "android_common").MaybeRule("d8")
722 if atestNoOptimize.Output == nil {
723 t.Errorf("atestNoOptimize should not optimize APK")
724 }
725
Jared Duke63a3da92022-06-02 19:11:14 +0000726 atestDefault := ctx.ModuleForTests("atestDefault", "android_common").MaybeRule("d8")
Sasha Smundak2057f822019-04-16 17:16:58 -0700727 if atestDefault.Output == nil {
Jared Duke63a3da92022-06-02 19:11:14 +0000728 t.Errorf("atestDefault should not optimize APK")
Sasha Smundak2057f822019-04-16 17:16:58 -0700729 }
Colin Cross89536d42017-07-07 14:35:50 -0700730}
731
Colin Cross0f37af02017-09-27 17:42:05 -0700732func TestResources(t *testing.T) {
733 var table = []struct {
734 name string
735 prop string
736 extra string
737 args string
738 }{
739 {
Colin Crossaf9c55b2017-10-03 14:50:08 -0700740 // Test that a module with java_resource_dirs includes the files
Colin Cross0f37af02017-09-27 17:42:05 -0700741 name: "resource dirs",
Colin Cross824bee32017-11-22 17:27:51 -0800742 prop: `java_resource_dirs: ["java-res"]`,
Colin Cross0ead1d72018-04-10 13:07:42 -0700743 args: "-C java-res -f java-res/a/a -f java-res/b/b",
Colin Cross0f37af02017-09-27 17:42:05 -0700744 },
745 {
746 // Test that a module with java_resources includes the files
747 name: "resource files",
Colin Cross0ead1d72018-04-10 13:07:42 -0700748 prop: `java_resources: ["java-res/a/a", "java-res/b/b"]`,
749 args: "-C . -f java-res/a/a -f java-res/b/b",
Colin Cross0f37af02017-09-27 17:42:05 -0700750 },
751 {
752 // Test that a module with a filegroup in java_resources includes the files with the
753 // path prefix
754 name: "resource filegroup",
755 prop: `java_resources: [":foo-res"]`,
756 extra: `
757 filegroup {
758 name: "foo-res",
Colin Cross824bee32017-11-22 17:27:51 -0800759 path: "java-res",
Colin Cross0ead1d72018-04-10 13:07:42 -0700760 srcs: ["java-res/a/a", "java-res/b/b"],
Colin Cross0f37af02017-09-27 17:42:05 -0700761 }`,
Colin Cross0ead1d72018-04-10 13:07:42 -0700762 args: "-C java-res -f java-res/a/a -f java-res/b/b",
Colin Cross0f37af02017-09-27 17:42:05 -0700763 },
764 {
Colin Cross0ead1d72018-04-10 13:07:42 -0700765 // Test that a module with wildcards in java_resource_dirs has the correct path prefixes
766 name: "wildcard dirs",
767 prop: `java_resource_dirs: ["java-res/*"]`,
768 args: "-C java-res/a -f java-res/a/a -C java-res/b -f java-res/b/b",
769 },
770 {
771 // Test that a module exclude_java_resource_dirs excludes the files
772 name: "wildcard dirs",
773 prop: `java_resource_dirs: ["java-res/*"], exclude_java_resource_dirs: ["java-res/b"]`,
774 args: "-C java-res/a -f java-res/a/a",
775 },
Colin Crosscedd4762018-09-13 11:26:19 -0700776 {
777 // Test wildcards in java_resources
778 name: "wildcard files",
779 prop: `java_resources: ["java-res/**/*"]`,
780 args: "-C . -f java-res/a/a -f java-res/b/b",
781 },
782 {
783 // Test exclude_java_resources with java_resources
784 name: "wildcard files with exclude",
785 prop: `java_resources: ["java-res/**/*"], exclude_java_resources: ["java-res/b/*"]`,
786 args: "-C . -f java-res/a/a",
787 },
788 {
789 // Test exclude_java_resources with java_resource_dirs
790 name: "resource dirs with exclude files",
791 prop: `java_resource_dirs: ["java-res"], exclude_java_resources: ["java-res/b/b"]`,
792 args: "-C java-res -f java-res/a/a",
793 },
794 {
795 // Test exclude_java_resource_dirs with java_resource_dirs
796 name: "resource dirs with exclude files",
797 prop: `java_resource_dirs: ["java-res", "java-res2"], exclude_java_resource_dirs: ["java-res2"]`,
798 args: "-C java-res -f java-res/a/a -f java-res/b/b",
799 },
Colin Cross0f37af02017-09-27 17:42:05 -0700800 }
801
802 for _, test := range table {
803 t.Run(test.name, func(t *testing.T) {
Colin Cross238c1f32020-06-07 16:58:18 -0700804 ctx, _ := testJavaWithFS(t, `
Colin Cross0f37af02017-09-27 17:42:05 -0700805 java_library {
806 name: "foo",
807 srcs: [
808 "a.java",
809 "b.java",
810 "c.java",
811 ],
812 `+test.prop+`,
813 }
Colin Cross238c1f32020-06-07 16:58:18 -0700814 `+test.extra,
815 map[string][]byte{
816 "java-res/a/a": nil,
817 "java-res/b/b": nil,
818 "java-res2/a": nil,
819 },
820 )
Colin Cross0f37af02017-09-27 17:42:05 -0700821
Colin Cross331a1212018-08-15 20:40:52 -0700822 foo := ctx.ModuleForTests("foo", "android_common").Output("withres/foo.jar")
Colin Cross1ee23172017-10-18 14:44:18 -0700823 fooRes := ctx.ModuleForTests("foo", "android_common").Output("res/foo.jar")
Colin Cross0f37af02017-09-27 17:42:05 -0700824
825 if !inList(fooRes.Output.String(), foo.Inputs.Strings()) {
826 t.Errorf("foo combined jars %v does not contain %q",
827 foo.Inputs.Strings(), fooRes.Output.String())
828 }
829
Colin Crossaf9c55b2017-10-03 14:50:08 -0700830 if fooRes.Args["jarArgs"] != test.args {
831 t.Errorf("foo resource jar args %q is not %q",
Colin Cross0f37af02017-09-27 17:42:05 -0700832 fooRes.Args["jarArgs"], test.args)
833 }
834 })
835 }
836}
837
Colin Cross0c4ce212019-05-03 15:28:19 -0700838func TestIncludeSrcs(t *testing.T) {
Colin Cross238c1f32020-06-07 16:58:18 -0700839 ctx, _ := testJavaWithFS(t, `
Colin Cross0c4ce212019-05-03 15:28:19 -0700840 java_library {
841 name: "foo",
842 srcs: [
843 "a.java",
844 "b.java",
845 "c.java",
846 ],
847 include_srcs: true,
848 }
849
850 java_library {
851 name: "bar",
852 srcs: [
853 "a.java",
854 "b.java",
855 "c.java",
856 ],
857 java_resource_dirs: ["java-res"],
858 include_srcs: true,
859 }
Colin Cross238c1f32020-06-07 16:58:18 -0700860 `, map[string][]byte{
861 "java-res/a/a": nil,
862 "java-res/b/b": nil,
863 "java-res2/a": nil,
864 })
Colin Cross0c4ce212019-05-03 15:28:19 -0700865
866 // Test a library with include_srcs: true
867 foo := ctx.ModuleForTests("foo", "android_common").Output("withres/foo.jar")
868 fooSrcJar := ctx.ModuleForTests("foo", "android_common").Output("foo.srcjar")
869
870 if g, w := fooSrcJar.Output.String(), foo.Inputs.Strings(); !inList(g, w) {
871 t.Errorf("foo combined jars %v does not contain %q", w, g)
872 }
873
874 if g, w := fooSrcJar.Args["jarArgs"], "-C . -f a.java -f b.java -f c.java"; g != w {
875 t.Errorf("foo source jar args %q is not %q", w, g)
876 }
877
878 // Test a library with include_srcs: true and resources
879 bar := ctx.ModuleForTests("bar", "android_common").Output("withres/bar.jar")
880 barResCombined := ctx.ModuleForTests("bar", "android_common").Output("res-combined/bar.jar")
881 barRes := ctx.ModuleForTests("bar", "android_common").Output("res/bar.jar")
882 barSrcJar := ctx.ModuleForTests("bar", "android_common").Output("bar.srcjar")
883
884 if g, w := barSrcJar.Output.String(), barResCombined.Inputs.Strings(); !inList(g, w) {
885 t.Errorf("bar combined resource jars %v does not contain %q", w, g)
886 }
887
888 if g, w := barRes.Output.String(), barResCombined.Inputs.Strings(); !inList(g, w) {
889 t.Errorf("bar combined resource jars %v does not contain %q", w, g)
890 }
891
892 if g, w := barResCombined.Output.String(), bar.Inputs.Strings(); !inList(g, w) {
893 t.Errorf("bar combined jars %v does not contain %q", w, g)
894 }
895
896 if g, w := barSrcJar.Args["jarArgs"], "-C . -f a.java -f b.java -f c.java"; g != w {
897 t.Errorf("bar source jar args %q is not %q", w, g)
898 }
899
900 if g, w := barRes.Args["jarArgs"], "-C java-res -f java-res/a/a -f java-res/b/b"; g != w {
901 t.Errorf("bar resource jar args %q is not %q", w, g)
902 }
903}
904
Colin Cross54190b32017-10-09 15:34:10 -0700905func TestGeneratedSources(t *testing.T) {
Colin Cross238c1f32020-06-07 16:58:18 -0700906 ctx, _ := testJavaWithFS(t, `
Colin Cross54190b32017-10-09 15:34:10 -0700907 java_library {
908 name: "foo",
909 srcs: [
910 "a*.java",
911 ":gen",
912 "b*.java",
913 ],
914 }
915
916 genrule {
917 name: "gen",
Colin Cross824bee32017-11-22 17:27:51 -0800918 tool_files: ["java-res/a"],
Colin Cross54190b32017-10-09 15:34:10 -0700919 out: ["gen.java"],
920 }
Colin Cross238c1f32020-06-07 16:58:18 -0700921 `, map[string][]byte{
922 "a.java": nil,
923 "b.java": nil,
924 })
Colin Cross54190b32017-10-09 15:34:10 -0700925
926 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
927 genrule := ctx.ModuleForTests("gen", "").Rule("generator")
928
Colin Cross15e86d92017-10-20 15:07:08 -0700929 if filepath.Base(genrule.Output.String()) != "gen.java" {
930 t.Fatalf(`gen output file %v is not ".../gen.java"`, genrule.Output.String())
Colin Cross54190b32017-10-09 15:34:10 -0700931 }
932
933 if len(javac.Inputs) != 3 ||
934 javac.Inputs[0].String() != "a.java" ||
Colin Cross15e86d92017-10-20 15:07:08 -0700935 javac.Inputs[1].String() != genrule.Output.String() ||
Colin Cross54190b32017-10-09 15:34:10 -0700936 javac.Inputs[2].String() != "b.java" {
937 t.Errorf(`foo inputs %v != ["a.java", ".../gen.java", "b.java"]`, javac.Inputs)
938 }
939}
940
Nan Zhang61eaedb2017-11-02 13:28:15 -0700941func TestTurbine(t *testing.T) {
Paul Duffin71ae5942021-03-22 15:36:52 +0000942 result := android.GroupFixturePreparers(
943 prepareForJavaTest, FixtureWithPrebuiltApis(map[string][]string{"14": {"foo"}})).
Paul Duffin3d9f2682021-03-13 09:47:16 +0000944 RunTestWithBp(t, `
Nan Zhang61eaedb2017-11-02 13:28:15 -0700945 java_library {
946 name: "foo",
947 srcs: ["a.java"],
Jiyong Park2d492942018-03-05 17:44:10 +0900948 sdk_version: "14",
Nan Zhang61eaedb2017-11-02 13:28:15 -0700949 }
950
951 java_library {
952 name: "bar",
Colin Cross9bc43432017-12-15 20:20:39 -0800953 srcs: ["b.java"],
Nan Zhang61eaedb2017-11-02 13:28:15 -0700954 static_libs: ["foo"],
Jiyong Park2d492942018-03-05 17:44:10 +0900955 sdk_version: "14",
Nan Zhang61eaedb2017-11-02 13:28:15 -0700956 }
957
958 java_library {
959 name: "baz",
960 srcs: ["c.java"],
961 libs: ["bar"],
962 sdk_version: "14",
963 }
964 `)
965
Paul Duffina71a67a2021-03-29 00:42:57 +0100966 fooTurbine := result.ModuleForTests("foo", "android_common").Rule("turbine")
967 barTurbine := result.ModuleForTests("bar", "android_common").Rule("turbine")
968 barJavac := result.ModuleForTests("bar", "android_common").Rule("javac")
969 barTurbineCombined := result.ModuleForTests("bar", "android_common").Description("for turbine")
970 bazJavac := result.ModuleForTests("baz", "android_common").Rule("javac")
Nan Zhang61eaedb2017-11-02 13:28:15 -0700971
Paul Duffin414ea5e2021-03-22 17:31:52 +0000972 android.AssertPathsRelativeToTopEquals(t, "foo inputs", []string{"a.java"}, fooTurbine.Inputs)
Nan Zhang61eaedb2017-11-02 13:28:15 -0700973
Paul Duffin414ea5e2021-03-22 17:31:52 +0000974 fooHeaderJar := filepath.Join("out", "soong", ".intermediates", "foo", "android_common", "turbine-combined", "foo.jar")
975 barTurbineJar := filepath.Join("out", "soong", ".intermediates", "bar", "android_common", "turbine", "bar.jar")
Colin Crossf61766e2022-03-16 18:06:48 -0700976 android.AssertStringDoesContain(t, "bar turbine classpath", barTurbine.Args["turbineFlags"], fooHeaderJar)
Paul Duffin3d9f2682021-03-13 09:47:16 +0000977 android.AssertStringDoesContain(t, "bar javac classpath", barJavac.Args["classpath"], fooHeaderJar)
Paul Duffin414ea5e2021-03-22 17:31:52 +0000978 android.AssertPathsRelativeToTopEquals(t, "bar turbine combineJar", []string{barTurbineJar, fooHeaderJar}, barTurbineCombined.Inputs)
Paul Duffin3d9f2682021-03-13 09:47:16 +0000979 android.AssertStringDoesContain(t, "baz javac classpath", bazJavac.Args["classpath"], "prebuilts/sdk/14/public/android.jar")
Nan Zhang61eaedb2017-11-02 13:28:15 -0700980}
981
982func TestSharding(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -0700983 ctx, _ := testJava(t, `
Nan Zhang61eaedb2017-11-02 13:28:15 -0700984 java_library {
985 name: "bar",
986 srcs: ["a.java","b.java","c.java"],
987 javac_shard_size: 1
988 }
989 `)
990
Colin Cross3d56ed52021-11-18 22:23:12 -0800991 barHeaderJar := filepath.Join("out", "soong", ".intermediates", "bar", "android_common", "turbine", "bar.jar")
Nan Zhang61eaedb2017-11-02 13:28:15 -0700992 for i := 0; i < 3; i++ {
Paul Duffina71a67a2021-03-29 00:42:57 +0100993 barJavac := ctx.ModuleForTests("bar", "android_common").Description("javac" + strconv.Itoa(i))
Colin Cross3d56ed52021-11-18 22:23:12 -0800994 if !strings.HasPrefix(barJavac.Args["classpath"], "-classpath "+barHeaderJar+":") {
995 t.Errorf("bar javac classpath %v does start with %q", barJavac.Args["classpath"], barHeaderJar)
Nan Zhang61eaedb2017-11-02 13:28:15 -0700996 }
997 }
998}
999
Nan Zhang27e284d2018-02-09 21:03:53 +00001000func TestExcludeFileGroupInSrcs(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001001 ctx, _ := testJava(t, `
Nan Zhang27e284d2018-02-09 21:03:53 +00001002 java_library {
1003 name: "foo",
1004 srcs: ["a.java", ":foo-srcs"],
1005 exclude_srcs: ["a.java", ":foo-excludes"],
1006 }
1007
1008 filegroup {
1009 name: "foo-srcs",
1010 srcs: ["java-fg/a.java", "java-fg/b.java", "java-fg/c.java"],
1011 }
1012
1013 filegroup {
1014 name: "foo-excludes",
1015 srcs: ["java-fg/a.java", "java-fg/b.java"],
1016 }
1017 `)
1018
1019 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
1020
1021 if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "java-fg/c.java" {
1022 t.Errorf(`foo inputs %v != ["java-fg/c.java"]`, javac.Inputs)
1023 }
1024}
Jiyong Parkc678ad32018-04-10 13:07:10 +09001025
Paul Duffin52d398a2019-06-11 12:31:14 +01001026func TestJavaLibrary(t *testing.T) {
Paul Duffin414ea5e2021-03-22 17:31:52 +00001027 testJavaWithFS(t, "", map[string][]byte{
Paul Duffin52d398a2019-06-11 12:31:14 +01001028 "libcore/Android.bp": []byte(`
1029 java_library {
1030 name: "core",
1031 sdk_version: "none",
1032 system_modules: "none",
Paul Duffinaa55f742020-10-06 17:20:13 +01001033 }
1034
1035 filegroup {
1036 name: "core-jar",
1037 srcs: [":core{.jar}"],
1038 }
Paul Duffin414ea5e2021-03-22 17:31:52 +00001039 `),
Paul Duffinaa55f742020-10-06 17:20:13 +01001040 })
Paul Duffinaa55f742020-10-06 17:20:13 +01001041}
1042
1043func TestJavaImport(t *testing.T) {
Paul Duffin414ea5e2021-03-22 17:31:52 +00001044 testJavaWithFS(t, "", map[string][]byte{
Paul Duffinaa55f742020-10-06 17:20:13 +01001045 "libcore/Android.bp": []byte(`
1046 java_import {
1047 name: "core",
1048 sdk_version: "none",
1049 }
1050
1051 filegroup {
1052 name: "core-jar",
1053 srcs: [":core{.jar}"],
1054 }
Paul Duffin414ea5e2021-03-22 17:31:52 +00001055 `),
Paul Duffin52d398a2019-06-11 12:31:14 +01001056 })
Paul Duffin52d398a2019-06-11 12:31:14 +01001057}
1058
Zoran Jovanovic8736ce22018-08-21 17:10:29 +02001059var compilerFlagsTestCases = []struct {
1060 in string
1061 out bool
1062}{
1063 {
1064 in: "a",
1065 out: false,
1066 },
1067 {
1068 in: "-a",
1069 out: true,
1070 },
1071 {
1072 in: "-no-jdk",
1073 out: false,
1074 },
1075 {
1076 in: "-no-stdlib",
1077 out: false,
1078 },
1079 {
1080 in: "-kotlin-home",
1081 out: false,
1082 },
1083 {
1084 in: "-kotlin-home /some/path",
1085 out: false,
1086 },
1087 {
1088 in: "-include-runtime",
1089 out: false,
1090 },
1091 {
1092 in: "-Xintellij-plugin-root",
1093 out: false,
1094 },
1095}
1096
1097type mockContext struct {
1098 android.ModuleContext
1099 result bool
1100}
1101
1102func (ctx *mockContext) PropertyErrorf(property, format string, args ...interface{}) {
1103 // CheckBadCompilerFlags calls this function when the flag should be rejected
1104 ctx.result = false
1105}
1106
1107func TestCompilerFlags(t *testing.T) {
1108 for _, testCase := range compilerFlagsTestCases {
1109 ctx := &mockContext{result: true}
1110 CheckKotlincFlags(ctx, []string{testCase.in})
1111 if ctx.result != testCase.out {
1112 t.Errorf("incorrect output:")
1113 t.Errorf(" input: %#v", testCase.in)
1114 t.Errorf(" expected: %#v", testCase.out)
1115 t.Errorf(" got: %#v", ctx.result)
1116 }
1117 }
1118}
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001119
1120// TODO(jungjw): Consider making this more robust by ignoring path order.
1121func checkPatchModuleFlag(t *testing.T, ctx *android.TestContext, moduleName string, expected string) {
Paul Duffin414ea5e2021-03-22 17:31:52 +00001122 variables := ctx.ModuleForTests(moduleName, "android_common").VariablesForTestsRelativeToTop()
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001123 flags := strings.Split(variables["javacFlags"], " ")
1124 got := ""
1125 for _, flag := range flags {
1126 keyEnd := strings.Index(flag, "=")
1127 if keyEnd > -1 && flag[:keyEnd] == "--patch-module" {
1128 got = flag[keyEnd+1:]
1129 break
1130 }
1131 }
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02001132 if expected != android.StringPathRelativeToTop(ctx.Config().SoongOutDir(), got) {
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001133 t.Errorf("Unexpected patch-module flag for module %q - expected %q, but got %q", moduleName, expected, got)
1134 }
1135}
1136
1137func TestPatchModule(t *testing.T) {
Pete Gillin0c2143e2019-05-02 15:32:11 +01001138 t.Run("Java language level 8", func(t *testing.T) {
Pete Gillin1b3370f2019-10-01 13:57:31 +01001139 // Test with legacy javac -source 1.8 -target 1.8
Pete Gillinbdf5d712019-10-21 14:29:58 +01001140 bp := `
1141 java_library {
1142 name: "foo",
1143 srcs: ["a.java"],
1144 java_version: "1.8",
1145 }
1146
1147 java_library {
1148 name: "bar",
1149 srcs: ["b.java"],
1150 sdk_version: "none",
1151 system_modules: "none",
1152 patch_module: "java.base",
1153 java_version: "1.8",
1154 }
1155
1156 java_library {
1157 name: "baz",
1158 srcs: ["c.java"],
1159 patch_module: "java.base",
1160 java_version: "1.8",
1161 }
1162 `
1163 ctx, _ := testJava(t, bp)
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001164
1165 checkPatchModuleFlag(t, ctx, "foo", "")
1166 checkPatchModuleFlag(t, ctx, "bar", "")
1167 checkPatchModuleFlag(t, ctx, "baz", "")
1168 })
1169
Pete Gillin0c2143e2019-05-02 15:32:11 +01001170 t.Run("Java language level 9", func(t *testing.T) {
Pete Gillin1b3370f2019-10-01 13:57:31 +01001171 // Test with default javac -source 9 -target 9
Pete Gillinbdf5d712019-10-21 14:29:58 +01001172 bp := `
1173 java_library {
1174 name: "foo",
1175 srcs: ["a.java"],
1176 }
1177
1178 java_library {
1179 name: "bar",
1180 srcs: ["b.java"],
1181 sdk_version: "none",
1182 system_modules: "none",
1183 patch_module: "java.base",
1184 }
1185
1186 java_library {
1187 name: "baz",
Jingwen Chen5136a6e2020-10-30 01:01:35 -04001188 srcs: [
1189 "c.java",
1190 // Tests for b/150878007
1191 "dir/d.java",
1192 "dir2/e.java",
1193 "dir2/f.java",
1194 "nested/dir/g.java"
1195 ],
Pete Gillinbdf5d712019-10-21 14:29:58 +01001196 patch_module: "java.base",
1197 }
1198 `
Pete Gillin1b3370f2019-10-01 13:57:31 +01001199 ctx, _ := testJava(t, bp)
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001200
1201 checkPatchModuleFlag(t, ctx, "foo", "")
Paul Duffin414ea5e2021-03-22 17:31:52 +00001202 expected := "java.base=.:out/soong"
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001203 checkPatchModuleFlag(t, ctx, "bar", expected)
Jingwen Chen5136a6e2020-10-30 01:01:35 -04001204 expected = "java.base=" + strings.Join([]string{
Paul Duffin414ea5e2021-03-22 17:31:52 +00001205 ".", "out/soong", "dir", "dir2", "nested", defaultModuleToPath("ext"), defaultModuleToPath("framework")}, ":")
Jaewoong Jung38e4fb22018-12-12 09:01:34 -08001206 checkPatchModuleFlag(t, ctx, "baz", expected)
1207 })
1208}
Paul Duffina7b9f422020-01-10 17:12:18 +00001209
Paul Duffin83a2d962019-11-19 19:44:10 +00001210func TestJavaLibraryWithSystemModules(t *testing.T) {
1211 ctx, _ := testJava(t, `
1212 java_library {
1213 name: "lib-with-source-system-modules",
1214 srcs: [
1215 "a.java",
1216 ],
1217 sdk_version: "none",
1218 system_modules: "source-system-modules",
1219 }
1220
1221 java_library {
1222 name: "source-jar",
1223 srcs: [
1224 "a.java",
1225 ],
1226 }
1227
1228 java_system_modules {
1229 name: "source-system-modules",
1230 libs: ["source-jar"],
1231 }
1232
1233 java_library {
1234 name: "lib-with-prebuilt-system-modules",
1235 srcs: [
1236 "a.java",
1237 ],
1238 sdk_version: "none",
1239 system_modules: "prebuilt-system-modules",
1240 }
1241
1242 java_import {
1243 name: "prebuilt-jar",
1244 jars: ["a.jar"],
1245 }
1246
1247 java_system_modules_import {
1248 name: "prebuilt-system-modules",
1249 libs: ["prebuilt-jar"],
1250 }
1251 `)
1252
1253 checkBootClasspathForSystemModule(t, ctx, "lib-with-source-system-modules", "/source-jar.jar")
1254
1255 checkBootClasspathForSystemModule(t, ctx, "lib-with-prebuilt-system-modules", "/prebuilt-jar.jar")
1256}
1257
1258func checkBootClasspathForSystemModule(t *testing.T, ctx *android.TestContext, moduleName string, expectedSuffix string) {
1259 javacRule := ctx.ModuleForTests(moduleName, "android_common").Rule("javac")
1260 bootClasspath := javacRule.Args["bootClasspath"]
1261 if strings.HasPrefix(bootClasspath, "--system ") && strings.HasSuffix(bootClasspath, expectedSuffix) {
1262 t.Errorf("bootclasspath of %q must start with --system and end with %q, but was %#v.", moduleName, expectedSuffix, bootClasspath)
1263 }
1264}
Jiyong Park19604de2020-03-24 16:44:11 +09001265
1266func TestAidlExportIncludeDirsFromImports(t *testing.T) {
1267 ctx, _ := testJava(t, `
1268 java_library {
1269 name: "foo",
1270 srcs: ["aidl/foo/IFoo.aidl"],
1271 libs: ["bar"],
1272 }
1273
1274 java_import {
1275 name: "bar",
1276 jars: ["a.jar"],
1277 aidl: {
1278 export_include_dirs: ["aidl/bar"],
1279 },
1280 }
1281 `)
1282
1283 aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
1284 expectedAidlFlag := "-Iaidl/bar"
1285 if !strings.Contains(aidlCommand, expectedAidlFlag) {
1286 t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1287 }
1288}
Liz Kammerdd849a82020-06-12 16:38:45 -07001289
Vinh Tran16fe8e12022-08-16 16:45:44 -04001290func TestAidlIncludeDirFromConvertedFileGroupWithPathPropInMixedBuilds(t *testing.T) {
Liz Kammer748209c2022-10-24 10:43:27 -04001291 // TODO(b/247782695), TODO(b/242847534) Fix mixed builds for filegroups
1292 t.Skip("Re-enable once filegroups are corrected for mixed builds")
Vinh Tran16fe8e12022-08-16 16:45:44 -04001293 bp := `
1294 filegroup {
1295 name: "foo_aidl",
1296 srcs: ["aidl/foo/IFoo.aidl"],
1297 path: "aidl/foo",
1298 bazel_module: { label: "//:foo_aidl" },
1299 }
1300 java_library {
1301 name: "foo",
1302 srcs: [":foo_aidl"],
1303 }
1304`
1305
1306 outBaseDir := "out/bazel/output"
1307 result := android.GroupFixturePreparers(
1308 prepareForJavaTest,
1309 android.PrepareForTestWithFilegroup,
1310 android.FixtureModifyConfig(func(config android.Config) {
1311 config.BazelContext = android.MockBazelContext{
1312 OutputBaseDir: outBaseDir,
1313 LabelToOutputFiles: map[string][]string{
1314 "//:foo_aidl": []string{"aidl/foo/IFoo.aidl"},
1315 },
1316 }
1317 }),
1318 ).RunTestWithBp(t, bp)
1319
1320 aidlCommand := result.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
1321 expectedAidlFlag := "-I" + outBaseDir + "/execroot/__main__/aidl/foo"
1322 if !strings.Contains(aidlCommand, expectedAidlFlag) {
1323 t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1324 }
1325}
1326
Jooyung Hane197d8b2021-01-05 10:33:16 +09001327func TestAidlFlagsArePassedToTheAidlCompiler(t *testing.T) {
1328 ctx, _ := testJava(t, `
1329 java_library {
1330 name: "foo",
1331 srcs: ["aidl/foo/IFoo.aidl"],
1332 aidl: { flags: ["-Werror"], },
1333 }
1334 `)
1335
1336 aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
1337 expectedAidlFlag := "-Werror"
1338 if !strings.Contains(aidlCommand, expectedAidlFlag) {
1339 t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1340 }
1341}
1342
Jooyung Han07f70c02021-11-06 07:08:45 +09001343func TestAidlFlagsWithMinSdkVersion(t *testing.T) {
1344 fixture := android.GroupFixturePreparers(
1345 prepareForJavaTest, FixtureWithPrebuiltApis(map[string][]string{"14": {"foo"}}))
1346
1347 for _, tc := range []struct {
1348 name string
1349 sdkVersion string
1350 expected string
1351 }{
1352 {"default is current", "", "current"},
1353 {"use sdk_version", `sdk_version: "14"`, "14"},
1354 {"system_current", `sdk_version: "system_current"`, "current"},
1355 } {
1356 t.Run(tc.name, func(t *testing.T) {
1357 ctx := fixture.RunTestWithBp(t, `
1358 java_library {
1359 name: "foo",
1360 srcs: ["aidl/foo/IFoo.aidl"],
1361 `+tc.sdkVersion+`
1362 }
1363 `)
1364 aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
1365 expectedAidlFlag := "--min_sdk_version=" + tc.expected
1366 if !strings.Contains(aidlCommand, expectedAidlFlag) {
1367 t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1368 }
1369 })
1370 }
1371}
1372
Spandan Das757b6662022-11-17 04:29:59 +00001373func TestAidlFlagsMinSdkVersionDroidstubs(t *testing.T) {
1374 bpTemplate := `
1375 droidstubs {
1376 name: "foo-stubs",
1377 srcs: ["foo.aidl"],
1378 %s
1379 system_modules: "none",
1380 }
1381 `
1382 testCases := []struct {
1383 desc string
1384 sdkVersionBp string
1385 minSdkVersionExpected string
1386 }{
1387 {
1388 desc: "sdk_version not set, module compiles against private platform APIs",
1389 sdkVersionBp: ``,
1390 minSdkVersionExpected: "10000",
1391 },
1392 {
1393 desc: "sdk_version set to none, module does not build against an SDK",
1394 sdkVersionBp: `sdk_version: "none",`,
1395 minSdkVersionExpected: "10000",
1396 },
1397 }
1398 for _, tc := range testCases {
1399 ctx := prepareForJavaTest.RunTestWithBp(t, fmt.Sprintf(bpTemplate, tc.sdkVersionBp))
1400 aidlCmd := ctx.ModuleForTests("foo-stubs", "android_common").Rule("aidl").RuleParams.Command
1401 expected := "--min_sdk_version=" + tc.minSdkVersionExpected
1402 android.AssertStringDoesContain(t, "aidl command conatins incorrect min_sdk_version for testCse: "+tc.desc, aidlCmd, expected)
1403 }
1404}
1405
Thiébaud Weksteende8417c2022-02-10 15:41:46 +11001406func TestAidlEnforcePermissions(t *testing.T) {
1407 ctx, _ := testJava(t, `
1408 java_library {
1409 name: "foo",
1410 srcs: ["aidl/foo/IFoo.aidl"],
1411 aidl: { enforce_permissions: true },
1412 }
1413 `)
1414
1415 aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
1416 expectedAidlFlag := "-Wmissing-permission-annotation -Werror"
1417 if !strings.Contains(aidlCommand, expectedAidlFlag) {
1418 t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1419 }
1420}
1421
1422func TestAidlEnforcePermissionsException(t *testing.T) {
1423 ctx, _ := testJava(t, `
1424 java_library {
1425 name: "foo",
1426 srcs: ["aidl/foo/IFoo.aidl", "aidl/foo/IFoo2.aidl"],
1427 aidl: { enforce_permissions: true, enforce_permissions_exceptions: ["aidl/foo/IFoo2.aidl"] },
1428 }
1429 `)
1430
1431 aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
1432 expectedAidlFlag := "$$FLAGS -Wmissing-permission-annotation -Werror aidl/foo/IFoo.aidl"
1433 if !strings.Contains(aidlCommand, expectedAidlFlag) {
1434 t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1435 }
1436 expectedAidlFlag = "$$FLAGS aidl/foo/IFoo2.aidl"
1437 if !strings.Contains(aidlCommand, expectedAidlFlag) {
1438 t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1439 }
1440}
1441
Liz Kammerdd849a82020-06-12 16:38:45 -07001442func TestDataNativeBinaries(t *testing.T) {
Cole Faust5c503d12023-01-24 11:48:08 -08001443 ctx := android.GroupFixturePreparers(
1444 prepareForJavaTest,
1445 android.PrepareForTestWithAllowMissingDependencies).RunTestWithBp(t, `
Liz Kammerdd849a82020-06-12 16:38:45 -07001446 java_test_host {
1447 name: "foo",
1448 srcs: ["a.java"],
1449 data_native_bins: ["bin"]
1450 }
1451
Cole Faust5c503d12023-01-24 11:48:08 -08001452 cc_binary_host {
Liz Kammerdd849a82020-06-12 16:38:45 -07001453 name: "bin",
Cole Faust5c503d12023-01-24 11:48:08 -08001454 srcs: ["bin.cpp"],
Liz Kammerdd849a82020-06-12 16:38:45 -07001455 }
Cole Faust5c503d12023-01-24 11:48:08 -08001456 `).TestContext
Liz Kammerdd849a82020-06-12 16:38:45 -07001457
Colin Cross0c66bc62021-07-20 09:47:41 -07001458 buildOS := ctx.Config().BuildOS.String()
Liz Kammerdd849a82020-06-12 16:38:45 -07001459
1460 test := ctx.ModuleForTests("foo", buildOS+"_common").Module().(*TestHost)
Colin Crossaa255532020-07-03 13:18:24 -07001461 entries := android.AndroidMkEntriesForTest(t, ctx, test)[0]
Cole Faust5c503d12023-01-24 11:48:08 -08001462 expected := []string{"out/soong/.intermediates/bin/" + buildOS + "_x86_64/bin:bin"}
Liz Kammerdd849a82020-06-12 16:38:45 -07001463 actual := entries.EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
Paul Duffin414ea5e2021-03-22 17:31:52 +00001464 android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_COMPATIBILITY_SUPPORT_FILES", ctx.Config(), expected, actual)
Liz Kammerdd849a82020-06-12 16:38:45 -07001465}
Yuexi Ma627263f2021-03-04 13:47:56 -08001466
1467func TestDefaultInstallable(t *testing.T) {
1468 ctx, _ := testJava(t, `
1469 java_test_host {
1470 name: "foo"
1471 }
1472 `)
1473
Colin Cross0c66bc62021-07-20 09:47:41 -07001474 buildOS := ctx.Config().BuildOS.String()
Yuexi Ma627263f2021-03-04 13:47:56 -08001475 module := ctx.ModuleForTests("foo", buildOS+"_common").Module().(*TestHost)
1476 assertDeepEquals(t, "Default installable value should be true.", proptools.BoolPtr(true),
1477 module.properties.Installable)
1478}
Cole Faust75fffb12021-06-13 15:23:16 -07001479
1480func TestErrorproneEnabled(t *testing.T) {
1481 ctx, _ := testJava(t, `
1482 java_library {
1483 name: "foo",
1484 srcs: ["a.java"],
1485 errorprone: {
1486 enabled: true,
1487 },
1488 }
1489 `)
1490
1491 javac := ctx.ModuleForTests("foo", "android_common").Description("javac")
1492
1493 // Test that the errorprone plugins are passed to javac
1494 expectedSubstring := "-Xplugin:ErrorProne"
1495 if !strings.Contains(javac.Args["javacFlags"], expectedSubstring) {
Cole Faust2b1536e2021-06-18 12:25:54 -07001496 t.Errorf("expected javacFlags to contain %q, got %q", expectedSubstring, javac.Args["javacFlags"])
Cole Faust75fffb12021-06-13 15:23:16 -07001497 }
1498
1499 // Modules with errorprone { enabled: true } will include errorprone checks
1500 // in the main javac build rule. Only when RUN_ERROR_PRONE is true will
1501 // the explicit errorprone build rule be created.
1502 errorprone := ctx.ModuleForTests("foo", "android_common").MaybeDescription("errorprone")
1503 if errorprone.RuleParams.Description != "" {
1504 t.Errorf("expected errorprone build rule to not exist, but it did")
1505 }
1506}
Cole Faust2b1536e2021-06-18 12:25:54 -07001507
1508func TestErrorproneDisabled(t *testing.T) {
1509 bp := `
1510 java_library {
1511 name: "foo",
1512 srcs: ["a.java"],
1513 errorprone: {
1514 enabled: false,
1515 },
1516 }
1517 `
1518 ctx := android.GroupFixturePreparers(
1519 PrepareForTestWithJavaDefaultModules,
1520 android.FixtureMergeEnv(map[string]string{
1521 "RUN_ERROR_PRONE": "true",
1522 }),
1523 ).RunTestWithBp(t, bp)
1524
1525 javac := ctx.ModuleForTests("foo", "android_common").Description("javac")
1526
1527 // Test that the errorprone plugins are not passed to javac, like they would
1528 // be if enabled was true.
1529 expectedSubstring := "-Xplugin:ErrorProne"
1530 if strings.Contains(javac.Args["javacFlags"], expectedSubstring) {
1531 t.Errorf("expected javacFlags to not contain %q, got %q", expectedSubstring, javac.Args["javacFlags"])
1532 }
1533
1534 // Check that no errorprone build rule is created, like there would be
1535 // if enabled was unset and RUN_ERROR_PRONE was true.
1536 errorprone := ctx.ModuleForTests("foo", "android_common").MaybeDescription("errorprone")
1537 if errorprone.RuleParams.Description != "" {
1538 t.Errorf("expected errorprone build rule to not exist, but it did")
1539 }
1540}
1541
1542func TestErrorproneEnabledOnlyByEnvironmentVariable(t *testing.T) {
1543 bp := `
1544 java_library {
1545 name: "foo",
1546 srcs: ["a.java"],
1547 }
1548 `
1549 ctx := android.GroupFixturePreparers(
1550 PrepareForTestWithJavaDefaultModules,
1551 android.FixtureMergeEnv(map[string]string{
1552 "RUN_ERROR_PRONE": "true",
1553 }),
1554 ).RunTestWithBp(t, bp)
1555
1556 javac := ctx.ModuleForTests("foo", "android_common").Description("javac")
1557 errorprone := ctx.ModuleForTests("foo", "android_common").Description("errorprone")
1558
1559 // Check that the errorprone plugins are not passed to javac, because they
1560 // will instead be passed to the separate errorprone compilation
1561 expectedSubstring := "-Xplugin:ErrorProne"
1562 if strings.Contains(javac.Args["javacFlags"], expectedSubstring) {
1563 t.Errorf("expected javacFlags to not contain %q, got %q", expectedSubstring, javac.Args["javacFlags"])
1564 }
1565
1566 // Check that the errorprone plugin is enabled
1567 if !strings.Contains(errorprone.Args["javacFlags"], expectedSubstring) {
1568 t.Errorf("expected errorprone to contain %q, got %q", expectedSubstring, javac.Args["javacFlags"])
1569 }
1570}
Sam Delmericob3342ce2022-01-20 21:10:28 +00001571
1572func TestDataDeviceBinsBuildsDeviceBinary(t *testing.T) {
Sam Delmericocc271e22022-06-01 15:45:02 +00001573 testCases := []struct {
1574 dataDeviceBinType string
1575 depCompileMultilib string
1576 variants []string
1577 expectedError string
1578 }{
1579 {
1580 dataDeviceBinType: "first",
1581 depCompileMultilib: "first",
1582 variants: []string{"android_arm64_armv8-a"},
1583 },
1584 {
1585 dataDeviceBinType: "first",
1586 depCompileMultilib: "both",
1587 variants: []string{"android_arm64_armv8-a"},
1588 },
1589 {
1590 // this is true because our testing framework is set up with
1591 // Targets ~ [<64bit target>, <32bit target>], where 64bit is "first"
1592 dataDeviceBinType: "first",
1593 depCompileMultilib: "32",
1594 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1595 },
1596 {
1597 dataDeviceBinType: "first",
1598 depCompileMultilib: "64",
1599 variants: []string{"android_arm64_armv8-a"},
1600 },
1601 {
1602 dataDeviceBinType: "both",
1603 depCompileMultilib: "both",
1604 variants: []string{
1605 "android_arm_armv7-a-neon",
1606 "android_arm64_armv8-a",
1607 },
1608 },
1609 {
1610 dataDeviceBinType: "both",
1611 depCompileMultilib: "32",
1612 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1613 },
1614 {
1615 dataDeviceBinType: "both",
1616 depCompileMultilib: "64",
1617 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1618 },
1619 {
1620 dataDeviceBinType: "both",
1621 depCompileMultilib: "first",
1622 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1623 },
1624 {
1625 dataDeviceBinType: "32",
1626 depCompileMultilib: "32",
1627 variants: []string{"android_arm_armv7-a-neon"},
1628 },
1629 {
1630 dataDeviceBinType: "32",
1631 depCompileMultilib: "first",
1632 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1633 },
1634 {
1635 dataDeviceBinType: "32",
1636 depCompileMultilib: "both",
1637 variants: []string{"android_arm_armv7-a-neon"},
1638 },
1639 {
1640 dataDeviceBinType: "32",
1641 depCompileMultilib: "64",
1642 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1643 },
1644 {
1645 dataDeviceBinType: "64",
1646 depCompileMultilib: "64",
1647 variants: []string{"android_arm64_armv8-a"},
1648 },
1649 {
1650 dataDeviceBinType: "64",
1651 depCompileMultilib: "both",
1652 variants: []string{"android_arm64_armv8-a"},
1653 },
1654 {
1655 dataDeviceBinType: "64",
1656 depCompileMultilib: "first",
1657 variants: []string{"android_arm64_armv8-a"},
1658 },
1659 {
1660 dataDeviceBinType: "64",
1661 depCompileMultilib: "32",
1662 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1663 },
1664 {
1665 dataDeviceBinType: "prefer32",
1666 depCompileMultilib: "32",
1667 variants: []string{"android_arm_armv7-a-neon"},
1668 },
1669 {
1670 dataDeviceBinType: "prefer32",
1671 depCompileMultilib: "both",
1672 variants: []string{"android_arm_armv7-a-neon"},
1673 },
1674 {
1675 dataDeviceBinType: "prefer32",
1676 depCompileMultilib: "first",
1677 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1678 },
1679 {
1680 dataDeviceBinType: "prefer32",
1681 depCompileMultilib: "64",
1682 expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1683 },
Sam Delmericob3342ce2022-01-20 21:10:28 +00001684 }
Sam Delmericob3342ce2022-01-20 21:10:28 +00001685
Sam Delmericocc271e22022-06-01 15:45:02 +00001686 bpTemplate := `
Sam Delmericob3342ce2022-01-20 21:10:28 +00001687 java_test_host {
1688 name: "foo",
1689 srcs: ["test.java"],
Sam Delmericocc271e22022-06-01 15:45:02 +00001690 data_device_bins_%s: ["bar"],
Sam Delmericob3342ce2022-01-20 21:10:28 +00001691 }
1692
1693 cc_binary {
1694 name: "bar",
Sam Delmericocc271e22022-06-01 15:45:02 +00001695 compile_multilib: "%s",
Sam Delmericob3342ce2022-01-20 21:10:28 +00001696 }
1697 `
1698
Sam Delmericocc271e22022-06-01 15:45:02 +00001699 for _, tc := range testCases {
1700 bp := fmt.Sprintf(bpTemplate, tc.dataDeviceBinType, tc.depCompileMultilib)
Sam Delmericob3342ce2022-01-20 21:10:28 +00001701
Sam Delmericocc271e22022-06-01 15:45:02 +00001702 errorHandler := android.FixtureExpectsNoErrors
1703 if tc.expectedError != "" {
1704 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
1705 }
Sam Delmericob3342ce2022-01-20 21:10:28 +00001706
Sam Delmericocc271e22022-06-01 15:45:02 +00001707 testName := fmt.Sprintf(`data_device_bins_%s with compile_multilib:"%s"`, tc.dataDeviceBinType, tc.depCompileMultilib)
1708 t.Run(testName, func(t *testing.T) {
1709 ctx := android.GroupFixturePreparers(PrepareForIntegrationTestWithJava).
1710 ExtendWithErrorHandler(errorHandler).
1711 RunTestWithBp(t, bp)
1712 if tc.expectedError != "" {
1713 return
1714 }
1715
1716 buildOS := ctx.Config.BuildOS.String()
1717 fooVariant := ctx.ModuleForTests("foo", buildOS+"_common")
1718 fooMod := fooVariant.Module().(*TestHost)
1719 entries := android.AndroidMkEntriesForTest(t, ctx.TestContext, fooMod)[0]
1720
1721 expectedAutogenConfig := `<option name="push-file" key="bar" value="/data/local/tests/unrestricted/foo/bar" />`
1722 autogen := fooVariant.Rule("autogen")
1723 if !strings.Contains(autogen.Args["extraConfigs"], expectedAutogenConfig) {
1724 t.Errorf("foo extraConfigs %v does not contain %q", autogen.Args["extraConfigs"], expectedAutogenConfig)
1725 }
1726
1727 expectedData := []string{}
1728 for _, variant := range tc.variants {
1729 barVariant := ctx.ModuleForTests("bar", variant)
1730 relocated := barVariant.Output("bar")
1731 expectedInput := fmt.Sprintf("out/soong/.intermediates/bar/%s/unstripped/bar", variant)
1732 android.AssertPathRelativeToTopEquals(t, "relocation input", expectedInput, relocated.Input)
1733
1734 expectedData = append(expectedData, fmt.Sprintf("out/soong/.intermediates/bar/%s/bar:bar", variant))
1735 }
1736
1737 actualData := entries.EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
1738 android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_TEST_DATA", ctx.Config, expectedData, actualData)
1739 })
Sam Delmericob3342ce2022-01-20 21:10:28 +00001740 }
1741}
Sam Delmerico277795c2022-02-25 17:04:37 +00001742
1743func TestImportMixedBuild(t *testing.T) {
1744 bp := `
1745 java_import {
1746 name: "baz",
1747 jars: [
1748 "test1.jar",
1749 "test2.jar",
1750 ],
1751 bazel_module: { label: "//foo/bar:baz" },
1752 }
1753 `
1754
1755 ctx := android.GroupFixturePreparers(
1756 prepareForJavaTest,
1757 android.FixtureModifyConfig(func(config android.Config) {
1758 config.BazelContext = android.MockBazelContext{
1759 OutputBaseDir: "outputbase",
1760 LabelToOutputFiles: map[string][]string{
1761 "//foo/bar:baz": []string{"test1.jar", "test2.jar"},
1762 },
1763 }
1764 }),
1765 ).RunTestWithBp(t, bp)
1766
1767 bazMod := ctx.ModuleForTests("baz", "android_common").Module()
1768 producer := bazMod.(android.OutputFileProducer)
1769 expectedOutputFiles := []string{".intermediates/baz/android_common/bazelCombined/baz.jar"}
1770
1771 outputFiles, err := producer.OutputFiles("")
1772 if err != nil {
1773 t.Errorf("Unexpected error getting java_import outputfiles %s", err)
1774 }
1775 actualOutputFiles := android.NormalizePathsForTesting(outputFiles)
1776 android.AssertDeepEquals(t, "Output files are produced", expectedOutputFiles, actualOutputFiles)
1777
1778 javaInfoProvider := ctx.ModuleProvider(bazMod, JavaInfoProvider)
1779 javaInfo, ok := javaInfoProvider.(JavaInfo)
1780 if !ok {
1781 t.Error("could not get JavaInfo from java_import module")
1782 }
1783 android.AssertDeepEquals(t, "Header JARs are produced", expectedOutputFiles, android.NormalizePathsForTesting(javaInfo.HeaderJars))
1784 android.AssertDeepEquals(t, "Implementation/Resources JARs are produced", expectedOutputFiles, android.NormalizePathsForTesting(javaInfo.ImplementationAndResourcesJars))
1785 android.AssertDeepEquals(t, "Implementation JARs are produced", expectedOutputFiles, android.NormalizePathsForTesting(javaInfo.ImplementationJars))
1786}
Sam Delmerico2351eac2022-05-24 17:10:02 +00001787
1788func TestGenAidlIncludeFlagsForMixedBuilds(t *testing.T) {
1789 bazelOutputBaseDir := filepath.Join("out", "bazel")
1790 result := android.GroupFixturePreparers(
1791 PrepareForIntegrationTestWithJava,
1792 android.FixtureModifyConfig(func(config android.Config) {
1793 config.BazelContext = android.MockBazelContext{
1794 OutputBaseDir: bazelOutputBaseDir,
1795 }
1796 }),
1797 ).RunTest(t)
1798
1799 ctx := &android.TestPathContext{TestResult: result}
1800
1801 srcDirectory := filepath.Join("frameworks", "base")
1802 srcDirectoryAlreadyIncluded := filepath.Join("frameworks", "base", "core", "java")
1803 bazelSrcDirectory := android.PathForBazelOut(ctx, srcDirectory)
1804 bazelSrcDirectoryAlreadyIncluded := android.PathForBazelOut(ctx, srcDirectoryAlreadyIncluded)
1805 srcs := android.Paths{
1806 android.PathForTestingWithRel(bazelSrcDirectory.String(), "bazelAidl.aidl"),
1807 android.PathForTestingWithRel(bazelSrcDirectory.String(), "bazelAidl2.aidl"),
1808 android.PathForTestingWithRel(bazelSrcDirectoryAlreadyIncluded.String(), "bazelAidlExclude.aidl"),
1809 android.PathForTestingWithRel(bazelSrcDirectoryAlreadyIncluded.String(), "bazelAidl2Exclude.aidl"),
1810 }
1811 dirsAlreadyIncluded := android.Paths{
1812 android.PathForTesting(srcDirectoryAlreadyIncluded),
1813 }
1814
1815 expectedFlags := " -Iout/bazel/execroot/__main__/frameworks/base"
1816 flags := genAidlIncludeFlags(ctx, srcs, dirsAlreadyIncluded)
1817 if flags != expectedFlags {
1818 t.Errorf("expected flags to be %q; was %q", expectedFlags, flags)
1819 }
1820}
Zi Wangca65b402022-10-10 13:45:06 -07001821
1822func TestDeviceBinaryWrapperGeneration(t *testing.T) {
1823 // Scenario 1: java_binary has main_class property in its bp
1824 ctx, _ := testJava(t, `
1825 java_binary {
1826 name: "foo",
1827 srcs: ["foo.java"],
1828 main_class: "foo.bar.jb",
1829 }
1830 `)
1831 wrapperPath := fmt.Sprint(ctx.ModuleForTests("foo", "android_arm64_armv8-a").AllOutputs())
1832 if !strings.Contains(wrapperPath, "foo.sh") {
1833 t.Errorf("wrapper file foo.sh is not generated")
1834 }
1835
1836 // Scenario 2: java_binary has neither wrapper nor main_class, its build
1837 // is expected to be failed.
1838 testJavaError(t, "main_class property is required for device binary if no default wrapper is assigned", `
1839 java_binary {
1840 name: "foo",
1841 srcs: ["foo.java"],
1842 }`)
1843}
Jihoon Kang0ac87c22022-11-15 19:06:14 +00001844
Jihoon Kang3198f3c2023-01-26 08:08:52 +00001845func TestJavaApiContributionEmptyApiFile(t *testing.T) {
Jihoon Kang063ec002023-06-28 01:16:23 +00001846 android.GroupFixturePreparers(
1847 prepareForJavaTest,
1848 android.FixtureMergeEnv(
1849 map[string]string{
1850 "DISABLE_STUB_VALIDATION": "true",
1851 },
1852 ),
1853 ).ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Jihoon Kang3198f3c2023-01-26 08:08:52 +00001854 "Error: foo has an empty api file.",
Jihoon Kang063ec002023-06-28 01:16:23 +00001855 )).RunTestWithBp(t, `
1856 java_api_contribution {
Jihoon Kang3198f3c2023-01-26 08:08:52 +00001857 name: "foo",
1858 }
1859 java_api_library {
1860 name: "bar",
1861 api_surface: "public",
1862 api_contributions: ["foo"],
1863 }
1864 `)
1865}
1866
Jihoon Kang0ac87c22022-11-15 19:06:14 +00001867func TestJavaApiLibraryAndProviderLink(t *testing.T) {
1868 provider_bp_a := `
1869 java_api_contribution {
1870 name: "foo1",
Jihoon Kang84473f52023-08-11 22:36:33 +00001871 api_file: "current.txt",
Jihoon Kang8fe19822023-09-14 06:27:36 +00001872 api_surface: "public",
Jihoon Kang0ac87c22022-11-15 19:06:14 +00001873 }
1874 `
1875 provider_bp_b := `java_api_contribution {
1876 name: "foo2",
Jihoon Kang84473f52023-08-11 22:36:33 +00001877 api_file: "current.txt",
Jihoon Kang8fe19822023-09-14 06:27:36 +00001878 api_surface: "public",
Jihoon Kang0ac87c22022-11-15 19:06:14 +00001879 }
1880 `
Jihoon Kang063ec002023-06-28 01:16:23 +00001881 ctx := android.GroupFixturePreparers(
1882 prepareForJavaTest,
1883 android.FixtureMergeMockFs(
1884 map[string][]byte{
1885 "a/Android.bp": []byte(provider_bp_a),
1886 "b/Android.bp": []byte(provider_bp_b),
1887 },
1888 ),
1889 android.FixtureMergeEnv(
1890 map[string]string{
1891 "DISABLE_STUB_VALIDATION": "true",
1892 },
1893 ),
1894 ).RunTestWithBp(t, `
Jihoon Kang0ac87c22022-11-15 19:06:14 +00001895 java_api_library {
1896 name: "bar1",
1897 api_surface: "public",
Jihoon Kang60d4a092022-11-17 23:47:43 +00001898 api_contributions: ["foo1"],
Jihoon Kang0ac87c22022-11-15 19:06:14 +00001899 }
1900
1901 java_api_library {
1902 name: "bar2",
1903 api_surface: "system",
Jihoon Kang60d4a092022-11-17 23:47:43 +00001904 api_contributions: ["foo1", "foo2"],
Jihoon Kang0ac87c22022-11-15 19:06:14 +00001905 }
Jihoon Kang063ec002023-06-28 01:16:23 +00001906 `)
Jihoon Kang0ac87c22022-11-15 19:06:14 +00001907
1908 testcases := []struct {
1909 moduleName string
1910 sourceTextFileDirs []string
1911 }{
1912 {
1913 moduleName: "bar1",
Jihoon Kang84473f52023-08-11 22:36:33 +00001914 sourceTextFileDirs: []string{"a/current.txt"},
Jihoon Kang0ac87c22022-11-15 19:06:14 +00001915 },
1916 {
1917 moduleName: "bar2",
Jihoon Kang6be0f002023-09-20 23:03:01 +00001918 sourceTextFileDirs: []string{"a/current.txt", "b/current.txt"},
Jihoon Kang0ac87c22022-11-15 19:06:14 +00001919 },
1920 }
1921 for _, c := range testcases {
1922 m := ctx.ModuleForTests(c.moduleName, "android_common")
1923 manifest := m.Output("metalava.sbox.textproto")
1924 sboxProto := android.RuleBuilderSboxProtoForTests(t, manifest)
1925 manifestCommand := sboxProto.Commands[0].GetCommand()
1926 sourceFilesFlag := "--source-files " + strings.Join(c.sourceTextFileDirs, " ")
1927 android.AssertStringDoesContain(t, "source text files not present", manifestCommand, sourceFilesFlag)
1928 }
1929}
1930
Jihoon Kang1c51f502023-01-09 23:42:40 +00001931func TestJavaApiLibraryAndDefaultsLink(t *testing.T) {
Jihoon Kang362aa9d2023-01-20 19:44:07 +00001932 provider_bp_a := `
1933 java_api_contribution {
Jihoon Kang1c51f502023-01-09 23:42:40 +00001934 name: "foo1",
Jihoon Kang84473f52023-08-11 22:36:33 +00001935 api_file: "current.txt",
Jihoon Kang8fe19822023-09-14 06:27:36 +00001936 api_surface: "public",
Jihoon Kang1c51f502023-01-09 23:42:40 +00001937 }
1938 `
Jihoon Kang362aa9d2023-01-20 19:44:07 +00001939 provider_bp_b := `
1940 java_api_contribution {
Jihoon Kang1c51f502023-01-09 23:42:40 +00001941 name: "foo2",
Jihoon Kang84473f52023-08-11 22:36:33 +00001942 api_file: "current.txt",
Jihoon Kang8fe19822023-09-14 06:27:36 +00001943 api_surface: "public",
Jihoon Kang1c51f502023-01-09 23:42:40 +00001944 }
1945 `
Jihoon Kang362aa9d2023-01-20 19:44:07 +00001946 provider_bp_c := `
1947 java_api_contribution {
Jihoon Kang1c51f502023-01-09 23:42:40 +00001948 name: "foo3",
Jihoon Kang8fe19822023-09-14 06:27:36 +00001949 api_file: "system-current.txt",
1950 api_surface: "system",
Jihoon Kang1c51f502023-01-09 23:42:40 +00001951 }
1952 `
Jihoon Kang362aa9d2023-01-20 19:44:07 +00001953 provider_bp_d := `
1954 java_api_contribution {
Jihoon Kang1c51f502023-01-09 23:42:40 +00001955 name: "foo4",
Jihoon Kang8fe19822023-09-14 06:27:36 +00001956 api_file: "system-current.txt",
1957 api_surface: "system",
Jihoon Kang1c51f502023-01-09 23:42:40 +00001958 }
1959 `
Jihoon Kang063ec002023-06-28 01:16:23 +00001960 ctx := android.GroupFixturePreparers(
1961 prepareForJavaTest,
1962 android.FixtureMergeMockFs(
1963 map[string][]byte{
1964 "a/Android.bp": []byte(provider_bp_a),
1965 "b/Android.bp": []byte(provider_bp_b),
1966 "c/Android.bp": []byte(provider_bp_c),
1967 "d/Android.bp": []byte(provider_bp_d),
1968 },
1969 ),
1970 android.FixtureMergeEnv(
1971 map[string]string{
1972 "DISABLE_STUB_VALIDATION": "true",
1973 },
1974 ),
1975 ).RunTestWithBp(t, `
Jihoon Kang1c51f502023-01-09 23:42:40 +00001976 java_defaults {
1977 name: "baz1",
1978 api_surface: "public",
1979 api_contributions: ["foo1", "foo2"],
1980 }
1981
1982 java_defaults {
1983 name: "baz2",
1984 api_surface: "system",
1985 api_contributions: ["foo3"],
1986 }
1987
1988 java_api_library {
1989 name: "bar1",
1990 api_surface: "public",
1991 api_contributions: ["foo1"],
1992 }
1993
1994 java_api_library {
1995 name: "bar2",
1996 api_surface: "public",
1997 defaults:["baz1"],
1998 }
1999
2000 java_api_library {
2001 name: "bar3",
2002 api_surface: "system",
2003 defaults:["baz1", "baz2"],
2004 api_contributions: ["foo4"],
Jihoon Kang1c51f502023-01-09 23:42:40 +00002005 }
Jihoon Kang063ec002023-06-28 01:16:23 +00002006 `)
Jihoon Kang1c51f502023-01-09 23:42:40 +00002007
2008 testcases := []struct {
2009 moduleName string
2010 sourceTextFileDirs []string
2011 }{
2012 {
2013 moduleName: "bar1",
Jihoon Kang84473f52023-08-11 22:36:33 +00002014 sourceTextFileDirs: []string{"a/current.txt"},
Jihoon Kang1c51f502023-01-09 23:42:40 +00002015 },
2016 {
2017 moduleName: "bar2",
Jihoon Kang84473f52023-08-11 22:36:33 +00002018 sourceTextFileDirs: []string{"a/current.txt", "b/current.txt"},
Jihoon Kang1c51f502023-01-09 23:42:40 +00002019 },
2020 {
Jihoon Kang8fe19822023-09-14 06:27:36 +00002021 moduleName: "bar3",
2022 // API text files need to be sorted from the narrower api scope to the wider api scope
Jihoon Kang6be0f002023-09-20 23:03:01 +00002023 sourceTextFileDirs: []string{"a/current.txt", "b/current.txt", "c/system-current.txt", "d/system-current.txt"},
Jihoon Kang1c51f502023-01-09 23:42:40 +00002024 },
2025 }
2026 for _, c := range testcases {
2027 m := ctx.ModuleForTests(c.moduleName, "android_common")
2028 manifest := m.Output("metalava.sbox.textproto")
2029 sboxProto := android.RuleBuilderSboxProtoForTests(t, manifest)
2030 manifestCommand := sboxProto.Commands[0].GetCommand()
2031 sourceFilesFlag := "--source-files " + strings.Join(c.sourceTextFileDirs, " ")
2032 android.AssertStringDoesContain(t, "source text files not present", manifestCommand, sourceFilesFlag)
2033 }
2034}
2035
Jihoon Kang0ac87c22022-11-15 19:06:14 +00002036func TestJavaApiLibraryJarGeneration(t *testing.T) {
2037 provider_bp_a := `
2038 java_api_contribution {
2039 name: "foo1",
Jihoon Kang84473f52023-08-11 22:36:33 +00002040 api_file: "current.txt",
Jihoon Kang8fe19822023-09-14 06:27:36 +00002041 api_surface: "public",
Jihoon Kang0ac87c22022-11-15 19:06:14 +00002042 }
2043 `
Jihoon Kang362aa9d2023-01-20 19:44:07 +00002044 provider_bp_b := `
2045 java_api_contribution {
Jihoon Kang0ac87c22022-11-15 19:06:14 +00002046 name: "foo2",
Jihoon Kang84473f52023-08-11 22:36:33 +00002047 api_file: "current.txt",
Jihoon Kang8fe19822023-09-14 06:27:36 +00002048 api_surface: "public",
Jihoon Kang0ac87c22022-11-15 19:06:14 +00002049 }
2050 `
Jihoon Kang063ec002023-06-28 01:16:23 +00002051 ctx := android.GroupFixturePreparers(
2052 prepareForJavaTest,
2053 android.FixtureMergeMockFs(
2054 map[string][]byte{
2055 "a/Android.bp": []byte(provider_bp_a),
2056 "b/Android.bp": []byte(provider_bp_b),
2057 },
2058 ),
2059 android.FixtureMergeEnv(
2060 map[string]string{
2061 "DISABLE_STUB_VALIDATION": "true",
2062 },
2063 ),
2064 ).RunTestWithBp(t, `
Jihoon Kang0ac87c22022-11-15 19:06:14 +00002065 java_api_library {
2066 name: "bar1",
2067 api_surface: "public",
Jihoon Kang60d4a092022-11-17 23:47:43 +00002068 api_contributions: ["foo1"],
Jihoon Kang0ac87c22022-11-15 19:06:14 +00002069 }
2070
2071 java_api_library {
2072 name: "bar2",
2073 api_surface: "system",
Jihoon Kang60d4a092022-11-17 23:47:43 +00002074 api_contributions: ["foo1", "foo2"],
Jihoon Kang0ac87c22022-11-15 19:06:14 +00002075 }
Jihoon Kang063ec002023-06-28 01:16:23 +00002076 `)
Jihoon Kang0ac87c22022-11-15 19:06:14 +00002077
2078 testcases := []struct {
2079 moduleName string
2080 outputJarName string
2081 }{
2082 {
2083 moduleName: "bar1",
Jihoon Kang25857f52023-03-01 00:27:32 +00002084 outputJarName: "bar1/bar1.jar",
Jihoon Kang0ac87c22022-11-15 19:06:14 +00002085 },
2086 {
2087 moduleName: "bar2",
Jihoon Kang25857f52023-03-01 00:27:32 +00002088 outputJarName: "bar2/bar2.jar",
Jihoon Kang0ac87c22022-11-15 19:06:14 +00002089 },
2090 }
2091 for _, c := range testcases {
2092 m := ctx.ModuleForTests(c.moduleName, "android_common")
2093 outputs := fmt.Sprint(m.AllOutputs())
2094 if !strings.Contains(outputs, c.outputJarName) {
2095 t.Errorf("Module output does not contain expected jar %s", c.outputJarName)
2096 }
2097 }
2098}
Cole Faust21680542022-12-07 18:18:37 -08002099
Jihoon Kang362aa9d2023-01-20 19:44:07 +00002100func TestJavaApiLibraryLibsLink(t *testing.T) {
2101 provider_bp_a := `
2102 java_api_contribution {
2103 name: "foo1",
Jihoon Kang84473f52023-08-11 22:36:33 +00002104 api_file: "current.txt",
Jihoon Kang8fe19822023-09-14 06:27:36 +00002105 api_surface: "public",
Jihoon Kang362aa9d2023-01-20 19:44:07 +00002106 }
2107 `
2108 provider_bp_b := `
2109 java_api_contribution {
2110 name: "foo2",
Jihoon Kang84473f52023-08-11 22:36:33 +00002111 api_file: "current.txt",
Jihoon Kang8fe19822023-09-14 06:27:36 +00002112 api_surface: "public",
Jihoon Kang362aa9d2023-01-20 19:44:07 +00002113 }
2114 `
2115 lib_bp_a := `
2116 java_library {
2117 name: "lib1",
2118 srcs: ["Lib.java"],
2119 }
2120 `
2121 lib_bp_b := `
2122 java_library {
2123 name: "lib2",
2124 srcs: ["Lib.java"],
2125 }
2126 `
2127
Jihoon Kang063ec002023-06-28 01:16:23 +00002128 ctx := android.GroupFixturePreparers(
2129 prepareForJavaTest,
2130 android.FixtureMergeMockFs(
2131 map[string][]byte{
2132 "a/Android.bp": []byte(provider_bp_a),
2133 "b/Android.bp": []byte(provider_bp_b),
2134 "c/Android.bp": []byte(lib_bp_a),
2135 "c/Lib.java": {},
2136 "d/Android.bp": []byte(lib_bp_b),
2137 "d/Lib.java": {},
2138 },
2139 ),
2140 android.FixtureMergeEnv(
2141 map[string]string{
2142 "DISABLE_STUB_VALIDATION": "true",
2143 },
2144 ),
2145 ).RunTestWithBp(t, `
Jihoon Kang362aa9d2023-01-20 19:44:07 +00002146 java_api_library {
2147 name: "bar1",
2148 api_surface: "public",
2149 api_contributions: ["foo1"],
2150 libs: ["lib1"],
2151 }
2152
2153 java_api_library {
2154 name: "bar2",
2155 api_surface: "system",
2156 api_contributions: ["foo1", "foo2"],
2157 libs: ["lib1", "lib2", "bar1"],
2158 }
Jihoon Kang063ec002023-06-28 01:16:23 +00002159 `)
Jihoon Kang362aa9d2023-01-20 19:44:07 +00002160
2161 testcases := []struct {
2162 moduleName string
2163 classPathJarNames []string
2164 }{
2165 {
2166 moduleName: "bar1",
2167 classPathJarNames: []string{"lib1.jar"},
2168 },
2169 {
2170 moduleName: "bar2",
Jihoon Kang25857f52023-03-01 00:27:32 +00002171 classPathJarNames: []string{"lib1.jar", "lib2.jar", "bar1/bar1.jar"},
Jihoon Kang362aa9d2023-01-20 19:44:07 +00002172 },
2173 }
2174 for _, c := range testcases {
2175 m := ctx.ModuleForTests(c.moduleName, "android_common")
2176 javacRules := m.Rule("javac")
2177 classPathArgs := javacRules.Args["classpath"]
2178 for _, jarName := range c.classPathJarNames {
2179 if !strings.Contains(classPathArgs, jarName) {
2180 t.Errorf("Module output does not contain expected jar %s", jarName)
2181 }
2182 }
2183 }
2184}
2185
Jihoon Kange30fff02023-02-14 20:18:20 +00002186func TestJavaApiLibraryStaticLibsLink(t *testing.T) {
2187 provider_bp_a := `
2188 java_api_contribution {
2189 name: "foo1",
Jihoon Kang84473f52023-08-11 22:36:33 +00002190 api_file: "current.txt",
Jihoon Kang8fe19822023-09-14 06:27:36 +00002191 api_surface: "public",
Jihoon Kange30fff02023-02-14 20:18:20 +00002192 }
2193 `
2194 provider_bp_b := `
2195 java_api_contribution {
2196 name: "foo2",
Jihoon Kang84473f52023-08-11 22:36:33 +00002197 api_file: "current.txt",
Jihoon Kang8fe19822023-09-14 06:27:36 +00002198 api_surface: "public",
Jihoon Kange30fff02023-02-14 20:18:20 +00002199 }
2200 `
2201 lib_bp_a := `
2202 java_library {
2203 name: "lib1",
2204 srcs: ["Lib.java"],
2205 }
2206 `
2207 lib_bp_b := `
2208 java_library {
2209 name: "lib2",
2210 srcs: ["Lib.java"],
2211 }
2212 `
2213
Jihoon Kang063ec002023-06-28 01:16:23 +00002214 ctx := android.GroupFixturePreparers(
2215 prepareForJavaTest,
2216 android.FixtureMergeMockFs(
2217 map[string][]byte{
2218 "a/Android.bp": []byte(provider_bp_a),
2219 "b/Android.bp": []byte(provider_bp_b),
2220 "c/Android.bp": []byte(lib_bp_a),
2221 "c/Lib.java": {},
2222 "d/Android.bp": []byte(lib_bp_b),
2223 "d/Lib.java": {},
2224 },
2225 ),
2226 android.FixtureMergeEnv(
2227 map[string]string{
2228 "DISABLE_STUB_VALIDATION": "true",
2229 },
2230 ),
2231 ).RunTestWithBp(t, `
Jihoon Kange30fff02023-02-14 20:18:20 +00002232 java_api_library {
2233 name: "bar1",
2234 api_surface: "public",
2235 api_contributions: ["foo1"],
2236 static_libs: ["lib1"],
2237 }
2238
2239 java_api_library {
2240 name: "bar2",
2241 api_surface: "system",
2242 api_contributions: ["foo1", "foo2"],
2243 static_libs: ["lib1", "lib2", "bar1"],
2244 }
Jihoon Kang063ec002023-06-28 01:16:23 +00002245 `)
Jihoon Kange30fff02023-02-14 20:18:20 +00002246
2247 testcases := []struct {
2248 moduleName string
2249 staticLibJarNames []string
2250 }{
2251 {
2252 moduleName: "bar1",
2253 staticLibJarNames: []string{"lib1.jar"},
2254 },
2255 {
2256 moduleName: "bar2",
Jihoon Kang25857f52023-03-01 00:27:32 +00002257 staticLibJarNames: []string{"lib1.jar", "lib2.jar", "bar1/bar1.jar"},
Jihoon Kange30fff02023-02-14 20:18:20 +00002258 },
2259 }
2260 for _, c := range testcases {
2261 m := ctx.ModuleForTests(c.moduleName, "android_common")
2262 mergeZipsCommand := m.Rule("merge_zips").RuleParams.Command
2263 for _, jarName := range c.staticLibJarNames {
2264 if !strings.Contains(mergeZipsCommand, jarName) {
2265 t.Errorf("merge_zips command does not contain expected jar %s", jarName)
2266 }
2267 }
2268 }
2269}
2270
Jihoon Kangca198c22023-06-22 23:13:51 +00002271func TestJavaApiLibraryFullApiSurfaceStub(t *testing.T) {
Jihoon Kang01e522c2023-03-14 01:09:34 +00002272 provider_bp_a := `
2273 java_api_contribution {
2274 name: "foo1",
Jihoon Kang84473f52023-08-11 22:36:33 +00002275 api_file: "current.txt",
Jihoon Kang8fe19822023-09-14 06:27:36 +00002276 api_surface: "public",
Jihoon Kang01e522c2023-03-14 01:09:34 +00002277 }
2278 `
2279 provider_bp_b := `
2280 java_api_contribution {
2281 name: "foo2",
Jihoon Kang84473f52023-08-11 22:36:33 +00002282 api_file: "current.txt",
Jihoon Kang8fe19822023-09-14 06:27:36 +00002283 api_surface: "public",
Jihoon Kang01e522c2023-03-14 01:09:34 +00002284 }
2285 `
2286 lib_bp_a := `
2287 java_api_library {
2288 name: "lib1",
2289 api_surface: "public",
2290 api_contributions: ["foo1", "foo2"],
2291 }
2292 `
2293
Jihoon Kang063ec002023-06-28 01:16:23 +00002294 ctx := android.GroupFixturePreparers(
2295 prepareForJavaTest,
2296 android.FixtureMergeMockFs(
2297 map[string][]byte{
2298 "a/Android.bp": []byte(provider_bp_a),
2299 "b/Android.bp": []byte(provider_bp_b),
2300 "c/Android.bp": []byte(lib_bp_a),
2301 },
2302 ),
2303 android.FixtureMergeEnv(
2304 map[string]string{
2305 "DISABLE_STUB_VALIDATION": "true",
2306 },
2307 ),
2308 ).RunTestWithBp(t, `
Jihoon Kang01e522c2023-03-14 01:09:34 +00002309 java_api_library {
2310 name: "bar1",
2311 api_surface: "public",
2312 api_contributions: ["foo1"],
Jihoon Kangca198c22023-06-22 23:13:51 +00002313 full_api_surface_stub: "lib1",
Jihoon Kang01e522c2023-03-14 01:09:34 +00002314 }
Jihoon Kang063ec002023-06-28 01:16:23 +00002315 `)
Jihoon Kang01e522c2023-03-14 01:09:34 +00002316
2317 m := ctx.ModuleForTests("bar1", "android_common")
2318 manifest := m.Output("metalava.sbox.textproto")
2319 sboxProto := android.RuleBuilderSboxProtoForTests(t, manifest)
2320 manifestCommand := sboxProto.Commands[0].GetCommand()
Jihoon Kangca198c22023-06-22 23:13:51 +00002321 android.AssertStringDoesContain(t, "Command expected to contain full_api_surface_stub output jar", manifestCommand, "lib1.jar")
Jihoon Kang01e522c2023-03-14 01:09:34 +00002322}
2323
Anton Hansson0e73f9e2023-09-20 13:39:57 +00002324func TestTransitiveSrcFiles(t *testing.T) {
2325 ctx, _ := testJava(t, `
2326 java_library {
2327 name: "a",
2328 srcs: ["a.java"],
2329 }
2330 java_library {
2331 name: "b",
2332 srcs: ["b.java"],
2333 }
2334 java_library {
2335 name: "c",
2336 srcs: ["c.java"],
2337 libs: ["a"],
2338 static_libs: ["b"],
2339 }
2340 `)
2341 c := ctx.ModuleForTests("c", "android_common").Module()
2342 transitiveSrcFiles := android.Paths(ctx.ModuleProvider(c, JavaInfoProvider).(JavaInfo).TransitiveSrcFiles.ToList())
2343 android.AssertArrayString(t, "unexpected jar deps", []string{"b.java", "c.java"}, transitiveSrcFiles.Strings())
2344}
2345
Cole Faust21680542022-12-07 18:18:37 -08002346func TestTradefedOptions(t *testing.T) {
2347 result := PrepareForTestWithJavaBuildComponents.RunTestWithBp(t, `
2348java_test_host {
2349 name: "foo",
2350 test_options: {
2351 tradefed_options: [
2352 {
2353 name: "exclude-path",
2354 value: "org/apache"
2355 }
2356 ]
2357 }
2358}
2359`)
2360
2361 buildOS := result.Config.BuildOS.String()
2362 args := result.ModuleForTests("foo", buildOS+"_common").
2363 Output("out/soong/.intermediates/foo/" + buildOS + "_common/foo.config").Args
2364 expected := proptools.NinjaAndShellEscape("<option name=\"exclude-path\" value=\"org/apache\" />")
2365 if args["extraConfigs"] != expected {
2366 t.Errorf("Expected args[\"extraConfigs\"] to equal %q, was %q", expected, args["extraConfigs"])
2367 }
2368}
Dan Shiec731432023-05-26 04:21:44 +00002369
2370func TestTestRunnerOptions(t *testing.T) {
2371 result := PrepareForTestWithJavaBuildComponents.RunTestWithBp(t, `
2372java_test_host {
2373 name: "foo",
2374 test_options: {
2375 test_runner_options: [
2376 {
2377 name: "test-timeout",
2378 value: "10m"
2379 }
2380 ]
2381 }
2382}
2383`)
2384
2385 buildOS := result.Config.BuildOS.String()
2386 args := result.ModuleForTests("foo", buildOS+"_common").
2387 Output("out/soong/.intermediates/foo/" + buildOS + "_common/foo.config").Args
2388 expected := proptools.NinjaAndShellEscape("<option name=\"test-timeout\" value=\"10m\" />\\n ")
2389 if args["extraTestRunnerConfigs"] != expected {
2390 t.Errorf("Expected args[\"extraTestRunnerConfigs\"] to equal %q, was %q", expected, args["extraTestRunnerConfigs"])
2391 }
2392}
Jihoon Kang381c2fa2023-06-01 22:17:32 +00002393
2394func TestJavaExcludeStaticLib(t *testing.T) {
2395 ctx, _ := testJava(t, `
2396 java_library {
2397 name: "bar",
2398 }
2399 java_library {
2400 name: "foo",
2401 }
2402 java_library {
2403 name: "baz",
2404 static_libs: [
2405 "foo",
2406 "bar",
2407 ],
2408 exclude_static_libs: [
2409 "bar",
2410 ],
2411 }
2412 `)
2413
2414 // "bar" not included as dependency of "baz"
2415 CheckModuleDependencies(t, ctx, "baz", "android_common", []string{
2416 `core-lambda-stubs`,
2417 `ext`,
2418 `foo`,
2419 `framework`,
2420 `stable-core-platform-api-stubs-system-modules`,
2421 `stable.core.platform.api.stubs`,
2422 })
2423}
Jihoon Kang1bfb6f22023-07-01 00:13:47 +00002424
2425func TestJavaLibraryWithResourcesStem(t *testing.T) {
2426 ctx, _ := testJavaWithFS(t, `
2427 java_library {
2428 name: "foo",
2429 java_resource_dirs: ["test-jar"],
2430 stem: "test",
2431 }
2432 `,
2433 map[string][]byte{
2434 "test-jar/test/resource.txt": nil,
2435 })
2436
2437 m := ctx.ModuleForTests("foo", "android_common")
2438 outputs := fmt.Sprint(m.AllOutputs())
2439 if !strings.Contains(outputs, "test.jar") {
2440 t.Errorf("Module output does not contain expected jar %s", "test.jar")
2441 }
2442}
Mark Whitea15790a2023-08-22 21:28:11 +00002443
2444func TestHeadersOnly(t *testing.T) {
2445 ctx, _ := testJava(t, `
2446 java_library {
2447 name: "foo",
2448 srcs: ["a.java"],
2449 headers_only: true,
2450 }
2451 `)
2452
2453 turbine := ctx.ModuleForTests("foo", "android_common").Rule("turbine")
2454 if len(turbine.Inputs) != 1 || turbine.Inputs[0].String() != "a.java" {
2455 t.Errorf(`foo inputs %v != ["a.java"]`, turbine.Inputs)
2456 }
2457
2458 javac := ctx.ModuleForTests("foo", "android_common").MaybeRule("javac")
2459 android.AssertDeepEquals(t, "javac rule", nil, javac.Rule)
2460}
Jihoon Kangfdf32362023-09-12 00:36:43 +00002461
2462func TestJavaApiContributionImport(t *testing.T) {
Jihoon Kang063ec002023-06-28 01:16:23 +00002463 ctx := android.GroupFixturePreparers(
2464 prepareForJavaTest,
2465 android.FixtureMergeEnv(
2466 map[string]string{
2467 "DISABLE_STUB_VALIDATION": "true",
2468 },
2469 ),
2470 ).RunTestWithBp(t, `
Jihoon Kangfdf32362023-09-12 00:36:43 +00002471 java_api_library {
2472 name: "foo",
2473 api_contributions: ["bar"],
2474 }
2475 java_api_contribution_import {
2476 name: "bar",
2477 api_file: "current.txt",
Jihoon Kang8fe19822023-09-14 06:27:36 +00002478 api_surface: "public",
Jihoon Kangfdf32362023-09-12 00:36:43 +00002479 }
2480 `)
2481 m := ctx.ModuleForTests("foo", "android_common")
2482 manifest := m.Output("metalava.sbox.textproto")
2483 sboxProto := android.RuleBuilderSboxProtoForTests(t, manifest)
2484 manifestCommand := sboxProto.Commands[0].GetCommand()
2485 sourceFilesFlag := "--source-files current.txt"
2486 android.AssertStringDoesContain(t, "source text files not present", manifestCommand, sourceFilesFlag)
2487}
Jihoon Kanga96a7b12023-09-20 23:43:32 +00002488
2489func TestJavaApiLibraryApiFilesSorting(t *testing.T) {
2490 ctx, _ := testJava(t, `
2491 java_api_library {
2492 name: "foo",
2493 api_contributions: [
2494 "system-server-api-stubs-docs-non-updatable.api.contribution",
2495 "test-api-stubs-docs-non-updatable.api.contribution",
2496 "system-api-stubs-docs-non-updatable.api.contribution",
2497 "module-lib-api-stubs-docs-non-updatable.api.contribution",
2498 "api-stubs-docs-non-updatable.api.contribution",
2499 ],
2500 }
2501 `)
2502 m := ctx.ModuleForTests("foo", "android_common")
2503 manifest := m.Output("metalava.sbox.textproto")
2504 sboxProto := android.RuleBuilderSboxProtoForTests(t, manifest)
2505 manifestCommand := sboxProto.Commands[0].GetCommand()
2506
2507 // Api files are sorted from the narrowest api scope to the widest api scope.
2508 // test api and module lib api surface do not have subset/superset relationship,
2509 // but they will never be passed as inputs at the same time.
2510 sourceFilesFlag := "--source-files default/java/api/current.txt " +
2511 "default/java/api/system-current.txt default/java/api/test-current.txt " +
2512 "default/java/api/module-lib-current.txt default/java/api/system-server-current.txt"
2513 android.AssertStringDoesContain(t, "source text files not in api scope order", manifestCommand, sourceFilesFlag)
2514}
Jihoon Kang4ec24872023-10-05 17:26:09 +00002515
2516func TestSdkLibraryProvidesSystemModulesToApiLibrary(t *testing.T) {
2517 result := android.GroupFixturePreparers(
2518 prepareForJavaTest,
2519 PrepareForTestWithJavaSdkLibraryFiles,
2520 FixtureWithLastReleaseApis("foo"),
2521 android.FixtureModifyConfig(func(config android.Config) {
2522 config.SetApiLibraries([]string{"foo"})
2523 }),
2524 android.FixtureMergeMockFs(
2525 map[string][]byte{
2526 "A.java": nil,
2527 },
2528 ),
2529 ).RunTestWithBp(t, `
2530 java_library {
2531 name: "bar",
2532 srcs: ["a.java"],
2533 }
2534 java_system_modules {
2535 name: "baz",
2536 libs: ["bar"],
2537 }
2538 java_sdk_library {
2539 name: "foo",
2540 srcs: ["A.java"],
2541 system_modules: "baz",
2542 }
2543 `)
2544 m := result.ModuleForTests(apiScopePublic.apiLibraryModuleName("foo"), "android_common")
2545 manifest := m.Output("metalava.sbox.textproto")
2546 sboxProto := android.RuleBuilderSboxProtoForTests(t, manifest)
2547 manifestCommand := sboxProto.Commands[0].GetCommand()
2548 classPathFlag := "--classpath __SBOX_SANDBOX_DIR__/out/.intermediates/bar/android_common/turbine-combined/bar.jar"
2549 android.AssertStringDoesContain(t, "command expected to contain classpath flag", manifestCommand, classPathFlag)
2550}
Jihoon Kang063ec002023-06-28 01:16:23 +00002551
2552func TestApiLibraryDroidstubsDependency(t *testing.T) {
2553 result := android.GroupFixturePreparers(
2554 prepareForJavaTest,
2555 PrepareForTestWithJavaSdkLibraryFiles,
2556 FixtureWithLastReleaseApis("foo"),
2557 android.FixtureModifyConfig(func(config android.Config) {
2558 config.SetApiLibraries([]string{"foo"})
2559 }),
2560 android.FixtureMergeMockFs(
2561 map[string][]byte{
2562 "A.java": nil,
2563 },
2564 ),
2565 ).RunTestWithBp(t, `
2566 java_api_library {
2567 name: "foo",
2568 api_contributions: [
2569 "api-stubs-docs-non-updatable.api.contribution",
2570 ],
2571 enable_validation: true,
2572 }
2573 java_api_library {
2574 name: "bar",
2575 api_contributions: [
2576 "api-stubs-docs-non-updatable.api.contribution",
2577 ],
2578 enable_validation: false,
2579 }
2580 `)
2581
2582 currentApiTimestampPath := "api-stubs-docs-non-updatable/android_common/metalava/check_current_api.timestamp"
2583 foo := result.ModuleForTests("foo", "android_common").Module().(*ApiLibrary)
2584 fooValidationPathsString := strings.Join(foo.validationPaths.Strings(), " ")
2585 bar := result.ModuleForTests("bar", "android_common").Module().(*ApiLibrary)
2586 barValidationPathsString := strings.Join(bar.validationPaths.Strings(), " ")
2587 android.AssertStringDoesContain(t,
2588 "Module expected to have validation",
2589 fooValidationPathsString,
2590 currentApiTimestampPath,
2591 )
2592 android.AssertStringDoesNotContain(t,
2593 "Module expected to not have validation",
2594 barValidationPathsString,
2595 currentApiTimestampPath,
2596 )
2597}
Jihoon Kang1975d3e2023-10-16 23:24:11 +00002598
2599func TestDisableFromTextStubForCoverageBuild(t *testing.T) {
2600 result := android.GroupFixturePreparers(
2601 prepareForJavaTest,
2602 PrepareForTestWithJavaSdkLibraryFiles,
2603 PrepareForTestWithJacocoInstrumentation,
2604 FixtureWithLastReleaseApis("foo"),
2605 android.FixtureModifyConfig(func(config android.Config) {
2606 config.SetApiLibraries([]string{"foo"})
2607 config.SetBuildFromTextStub(true)
2608 }),
2609 android.FixtureModifyEnv(func(env map[string]string) {
2610 env["EMMA_INSTRUMENT"] = "true"
2611 }),
2612 ).RunTestWithBp(t, `
2613 java_sdk_library {
2614 name: "foo",
2615 srcs: ["A.java"],
2616 }
2617 `)
2618 android.AssertBoolEquals(t, "stub module expected to depend on from-source stub",
2619 true, CheckModuleHasDependency(t, result.TestContext,
2620 apiScopePublic.stubsLibraryModuleName("foo"), "android_common",
2621 apiScopePublic.sourceStubLibraryModuleName("foo")))
2622
2623 android.AssertBoolEquals(t, "stub module expected to not depend on from-text stub",
2624 false, CheckModuleHasDependency(t, result.TestContext,
2625 apiScopePublic.stubsLibraryModuleName("foo"), "android_common",
2626 apiScopePublic.apiLibraryModuleName("foo")))
2627}