blob: 98d46143cbe901251651752d43d204d19c92f5ef [file] [log] [blame]
Paul Duffinbb7f1ac2021-03-29 22:18:45 +01001// Copyright (C) 2021 The Android Open Source Project
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 Duffin9b381ef2021-04-08 23:01:37 +010018 "fmt"
19 "strings"
Paul Duffinbb7f1ac2021-03-29 22:18:45 +010020 "testing"
21
22 "android/soong/android"
23 "android/soong/dexpreopt"
24)
25
26// Contains some simple tests for platform_bootclasspath.
27
28var prepareForTestWithPlatformBootclasspath = android.GroupFixturePreparers(
29 PrepareForTestWithJavaDefaultModules,
30 dexpreopt.PrepareForTestByEnablingDexpreopt,
31)
32
33func TestPlatformBootclasspath(t *testing.T) {
Paul Duffinb432df92021-03-22 22:09:42 +000034 preparer := android.GroupFixturePreparers(
35 prepareForTestWithPlatformBootclasspath,
Paul Duffin110b0ad2021-04-27 14:36:08 +010036 FixtureConfigureBootJars("platform:foo", "system_ext:bar"),
Paul Duffinb432df92021-03-22 22:09:42 +000037 android.FixtureWithRootAndroidBp(`
Paul Duffinbb7f1ac2021-03-29 22:18:45 +010038 platform_bootclasspath {
39 name: "platform-bootclasspath",
40 }
Paul Duffinb432df92021-03-22 22:09:42 +000041
42 java_library {
43 name: "bar",
44 srcs: ["a.java"],
45 system_modules: "none",
46 sdk_version: "none",
47 compile_dex: true,
Paul Duffin110b0ad2021-04-27 14:36:08 +010048 system_ext_specific: true,
Paul Duffinb432df92021-03-22 22:09:42 +000049 }
50 `),
51 )
52
53 var addSourceBootclassPathModule = android.FixtureAddTextFile("source/Android.bp", `
54 java_library {
55 name: "foo",
56 srcs: ["a.java"],
57 system_modules: "none",
58 sdk_version: "none",
59 compile_dex: true,
60 }
61 `)
62
63 var addPrebuiltBootclassPathModule = android.FixtureAddTextFile("prebuilt/Android.bp", `
64 java_import {
65 name: "foo",
66 jars: ["a.jar"],
67 compile_dex: true,
68 prefer: false,
69 }
70 `)
71
72 var addPrebuiltPreferredBootclassPathModule = android.FixtureAddTextFile("prebuilt/Android.bp", `
73 java_import {
74 name: "foo",
75 jars: ["a.jar"],
76 compile_dex: true,
77 prefer: true,
78 }
79 `)
80
81 t.Run("missing", func(t *testing.T) {
82 preparer.
83 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`"platform-bootclasspath" depends on undefined module "foo"`)).
84 RunTest(t)
85 })
86
87 t.Run("source", func(t *testing.T) {
88 result := android.GroupFixturePreparers(
89 preparer,
90 addSourceBootclassPathModule,
91 ).RunTest(t)
92
93 CheckPlatformBootclasspathModules(t, result, "platform-bootclasspath", []string{
94 "platform:foo",
95 "platform:bar",
96 })
97 })
98
99 t.Run("prebuilt", func(t *testing.T) {
100 result := android.GroupFixturePreparers(
101 preparer,
102 addPrebuiltBootclassPathModule,
103 ).RunTest(t)
104
105 CheckPlatformBootclasspathModules(t, result, "platform-bootclasspath", []string{
106 "platform:prebuilt_foo",
107 "platform:bar",
108 })
109 })
110
111 t.Run("source+prebuilt - source preferred", func(t *testing.T) {
112 result := android.GroupFixturePreparers(
113 preparer,
114 addSourceBootclassPathModule,
115 addPrebuiltBootclassPathModule,
116 ).RunTest(t)
117
118 CheckPlatformBootclasspathModules(t, result, "platform-bootclasspath", []string{
119 "platform:foo",
120 "platform:bar",
121 })
122 })
123
124 t.Run("source+prebuilt - prebuilt preferred", func(t *testing.T) {
125 result := android.GroupFixturePreparers(
126 preparer,
127 addSourceBootclassPathModule,
128 addPrebuiltPreferredBootclassPathModule,
129 ).RunTest(t)
130
131 CheckPlatformBootclasspathModules(t, result, "platform-bootclasspath", []string{
132 "platform:prebuilt_foo",
133 "platform:bar",
134 })
135 })
Paul Duffin49775402021-04-30 08:58:12 +0100136
137 t.Run("dex import", func(t *testing.T) {
138 result := android.GroupFixturePreparers(
139 preparer,
140 android.FixtureAddTextFile("deximport/Android.bp", `
141 dex_import {
142 name: "foo",
143 jars: ["a.jar"],
144 }
145 `),
146 ).RunTest(t)
147
148 CheckPlatformBootclasspathModules(t, result, "platform-bootclasspath", []string{
149 "platform:prebuilt_foo",
150 "platform:bar",
151 })
152 })
Paul Duffinbb7f1ac2021-03-29 22:18:45 +0100153}
Paul Duffin6a766452021-04-12 14:15:22 +0100154
Paul Duffin9b381ef2021-04-08 23:01:37 +0100155func TestPlatformBootclasspath_Fragments(t *testing.T) {
156 result := android.GroupFixturePreparers(
157 prepareForTestWithPlatformBootclasspath,
158 android.FixtureWithRootAndroidBp(`
159 platform_bootclasspath {
160 name: "platform-bootclasspath",
161 fragments: [
162 {module:"bar-fragment"},
163 ],
164 hidden_api: {
165 unsupported: [
166 "unsupported.txt",
167 ],
168 removed: [
169 "removed.txt",
170 ],
171 max_target_r_low_priority: [
172 "max-target-r-low-priority.txt",
173 ],
174 max_target_q: [
175 "max-target-q.txt",
176 ],
177 max_target_p: [
178 "max-target-p.txt",
179 ],
180 max_target_o_low_priority: [
181 "max-target-o-low-priority.txt",
182 ],
183 blocked: [
184 "blocked.txt",
185 ],
186 unsupported_packages: [
187 "unsupported-packages.txt",
188 ],
189 },
190 }
191
192 bootclasspath_fragment {
193 name: "bar-fragment",
194 contents: ["bar"],
195 hidden_api: {
196 unsupported: [
197 "bar-unsupported.txt",
198 ],
199 removed: [
200 "bar-removed.txt",
201 ],
202 max_target_r_low_priority: [
203 "bar-max-target-r-low-priority.txt",
204 ],
205 max_target_q: [
206 "bar-max-target-q.txt",
207 ],
208 max_target_p: [
209 "bar-max-target-p.txt",
210 ],
211 max_target_o_low_priority: [
212 "bar-max-target-o-low-priority.txt",
213 ],
214 blocked: [
215 "bar-blocked.txt",
216 ],
217 unsupported_packages: [
218 "bar-unsupported-packages.txt",
219 ],
220 },
221 }
222
223 java_library {
224 name: "bar",
225 srcs: ["a.java"],
226 system_modules: "none",
227 sdk_version: "none",
228 compile_dex: true,
229 }
230 `),
231 ).RunTest(t)
232
233 pbcp := result.Module("platform-bootclasspath", "android_common")
234 info := result.ModuleProvider(pbcp, hiddenAPIFlagFileInfoProvider).(hiddenAPIFlagFileInfo)
235
236 for _, category := range hiddenAPIFlagFileCategories {
237 name := category.propertyName
238 message := fmt.Sprintf("category %s", name)
239 filename := strings.ReplaceAll(name, "_", "-")
240 expected := []string{fmt.Sprintf("%s.txt", filename), fmt.Sprintf("bar-%s.txt", filename)}
241 android.AssertPathsRelativeToTopEquals(t, message, expected, info.categoryToPaths[category])
242 }
243}
244
Artur Satayev97259dc2021-04-07 15:17:14 +0100245func TestPlatformBootclasspathVariant(t *testing.T) {
246 result := android.GroupFixturePreparers(
247 prepareForTestWithPlatformBootclasspath,
248 android.FixtureWithRootAndroidBp(`
249 platform_bootclasspath {
250 name: "platform-bootclasspath",
251 }
252 `),
253 ).RunTest(t)
254
255 variants := result.ModuleVariantsForTests("platform-bootclasspath")
256 android.AssertIntEquals(t, "expect 1 variant", 1, len(variants))
257}
258
259func TestPlatformBootclasspath_ClasspathFragmentPaths(t *testing.T) {
260 result := android.GroupFixturePreparers(
261 prepareForTestWithPlatformBootclasspath,
262 android.FixtureWithRootAndroidBp(`
263 platform_bootclasspath {
264 name: "platform-bootclasspath",
265 }
266 `),
267 ).RunTest(t)
268
269 p := result.Module("platform-bootclasspath", "android_common").(*platformBootclasspathModule)
270 android.AssertStringEquals(t, "output filepath", p.Name()+".pb", p.ClasspathFragmentBase.outputFilepath.Base())
271 android.AssertPathRelativeToTopEquals(t, "install filepath", "out/soong/target/product/test_device/system/etc/classpaths", p.ClasspathFragmentBase.installDirPath)
272}
273
274func TestPlatformBootclasspathModule_AndroidMkEntries(t *testing.T) {
275 preparer := android.GroupFixturePreparers(
276 prepareForTestWithPlatformBootclasspath,
277 android.FixtureWithRootAndroidBp(`
278 platform_bootclasspath {
279 name: "platform-bootclasspath",
280 }
281 `),
282 )
283
284 t.Run("AndroidMkEntries", func(t *testing.T) {
285 result := preparer.RunTest(t)
286
287 p := result.Module("platform-bootclasspath", "android_common").(*platformBootclasspathModule)
288
289 entries := android.AndroidMkEntriesForTest(t, result.TestContext, p)
290 android.AssertIntEquals(t, "AndroidMkEntries count", 2, len(entries))
291 })
292
293 t.Run("hiddenapi-flags-entry", func(t *testing.T) {
294 result := preparer.RunTest(t)
295
296 p := result.Module("platform-bootclasspath", "android_common").(*platformBootclasspathModule)
297
298 entries := android.AndroidMkEntriesForTest(t, result.TestContext, p)
299 got := entries[0].OutputFile
300 android.AssertBoolEquals(t, "valid output path", true, got.Valid())
301 android.AssertSame(t, "output filepath", p.hiddenAPIFlagsCSV, got.Path())
302 })
303
304 t.Run("classpath-fragment-entry", func(t *testing.T) {
305 result := preparer.RunTest(t)
306
307 want := map[string][]string{
308 "LOCAL_MODULE": {"platform-bootclasspath"},
309 "LOCAL_MODULE_CLASS": {"ETC"},
310 "LOCAL_INSTALLED_MODULE_STEM": {"platform-bootclasspath.pb"},
311 // Output and Install paths are tested separately in TestPlatformBootclasspath_ClasspathFragmentPaths
312 }
313
314 p := result.Module("platform-bootclasspath", "android_common").(*platformBootclasspathModule)
315
316 entries := android.AndroidMkEntriesForTest(t, result.TestContext, p)
317 got := entries[1]
318 for k, expectedValue := range want {
319 if value, ok := got.EntryMap[k]; ok {
320 android.AssertDeepEquals(t, k, expectedValue, value)
321 } else {
322 t.Errorf("No %s defined, saw %q", k, got.EntryMap)
323 }
324 }
325 })
326}
327
Paul Duffin6a766452021-04-12 14:15:22 +0100328func TestPlatformBootclasspath_Dist(t *testing.T) {
329 result := android.GroupFixturePreparers(
330 prepareForTestWithPlatformBootclasspath,
Paul Duffin60264a02021-04-12 20:02:36 +0100331 FixtureConfigureBootJars("platform:foo", "platform:bar"),
Paul Duffin6a766452021-04-12 14:15:22 +0100332 android.PrepareForTestWithAndroidMk,
333 android.FixtureWithRootAndroidBp(`
334 platform_bootclasspath {
335 name: "platform-bootclasspath",
336 dists: [
337 {
338 targets: ["droidcore"],
339 tag: "hiddenapi-flags.csv",
340 },
341 ],
342 }
343
344 java_library {
345 name: "bar",
346 srcs: ["a.java"],
347 system_modules: "none",
348 sdk_version: "none",
349 compile_dex: true,
350 }
351
352 java_library {
353 name: "foo",
354 srcs: ["a.java"],
355 system_modules: "none",
356 sdk_version: "none",
357 compile_dex: true,
358 }
359 `),
360 ).RunTest(t)
361
362 platformBootclasspath := result.Module("platform-bootclasspath", "android_common").(*platformBootclasspathModule)
363 entries := android.AndroidMkEntriesForTest(t, result.TestContext, platformBootclasspath)
364 goals := entries[0].GetDistForGoals(platformBootclasspath)
365 android.AssertStringEquals(t, "platform dist goals phony", ".PHONY: droidcore\n", goals[0])
366 android.AssertStringEquals(t, "platform dist goals call", "$(call dist-for-goals,droidcore,out/soong/hiddenapi/hiddenapi-flags.csv:hiddenapi-flags.csv)\n", android.StringRelativeToTop(result.Config, goals[1]))
367}
Paul Duffin00b2bfd2021-04-12 17:24:36 +0100368
Paul Duffin85dee5d2021-04-13 00:14:38 +0100369func TestPlatformBootclasspath_HiddenAPIMonolithicFiles(t *testing.T) {
Paul Duffin00b2bfd2021-04-12 17:24:36 +0100370 result := android.GroupFixturePreparers(
371 hiddenApiFixtureFactory,
372 PrepareForTestWithJavaSdkLibraryFiles,
373 FixtureWithLastReleaseApis("bar"),
374 FixtureConfigureBootJars("platform:foo", "platform:bar"),
375 ).RunTestWithBp(t, `
376 java_library {
377 name: "foo",
378 srcs: ["a.java"],
379 compile_dex: true,
380
381 hiddenapi_additional_annotations: [
382 "foo-hiddenapi-annotations",
383 ],
384 }
385
386 java_library {
387 name: "foo-hiddenapi-annotations",
388 srcs: ["a.java"],
389 compile_dex: true,
390 }
391
392 java_import {
393 name: "foo",
394 jars: ["a.jar"],
395 compile_dex: true,
396 prefer: false,
397 }
398
399 java_sdk_library {
400 name: "bar",
401 srcs: ["a.java"],
402 compile_dex: true,
403 }
404
405 platform_bootclasspath {
406 name: "myplatform-bootclasspath",
407 }
408 `)
409
410 platformBootclasspath := result.ModuleForTests("myplatform-bootclasspath", "android_common")
411 indexRule := platformBootclasspath.Rule("platform-bootclasspath-monolithic-hiddenapi-index")
412 CheckHiddenAPIRuleInputs(t, `
413.intermediates/bar/android_common/hiddenapi/index.csv
414.intermediates/foo/android_common/hiddenapi/index.csv
415`,
416 indexRule)
417
418 // Make sure that the foo-hiddenapi-annotations.jar is included in the inputs to the rules that
419 // creates the index.csv file.
420 foo := result.ModuleForTests("foo", "android_common")
421 indexParams := foo.Output("hiddenapi/index.csv")
422 CheckHiddenAPIRuleInputs(t, `
423.intermediates/foo-hiddenapi-annotations/android_common/javac/foo-hiddenapi-annotations.jar
424.intermediates/foo/android_common/javac/foo.jar
425`, indexParams)
426}