bootclasspath_fragment_sdk_test.go 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849
  1. // 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. package sdk
  15. import (
  16. "fmt"
  17. "path/filepath"
  18. "testing"
  19. "android/soong/android"
  20. "android/soong/java"
  21. )
  22. // fixtureAddPlatformBootclasspathForBootclasspathFragment adds a platform_bootclasspath module that
  23. // references the bootclasspath fragment.
  24. func fixtureAddPlatformBootclasspathForBootclasspathFragment(apex, fragment string) android.FixturePreparer {
  25. return android.GroupFixturePreparers(
  26. // Add a platform_bootclasspath module.
  27. android.FixtureAddTextFile("frameworks/base/boot/Android.bp", fmt.Sprintf(`
  28. platform_bootclasspath {
  29. name: "platform-bootclasspath",
  30. fragments: [
  31. {
  32. apex: "%s",
  33. module: "%s",
  34. },
  35. ],
  36. }
  37. `, apex, fragment)),
  38. android.FixtureAddFile("frameworks/base/config/boot-profile.txt", nil),
  39. android.FixtureAddFile("frameworks/base/config/boot-image-profile.txt", nil),
  40. android.FixtureAddFile("build/soong/scripts/check_boot_jars/package_allowed_list.txt", nil),
  41. )
  42. }
  43. // fixtureAddPrebuiltApexForBootclasspathFragment adds a prebuilt_apex that exports the fragment.
  44. func fixtureAddPrebuiltApexForBootclasspathFragment(apex, fragment string) android.FixturePreparer {
  45. apexFile := fmt.Sprintf("%s.apex", apex)
  46. dir := "prebuilts/apex"
  47. return android.GroupFixturePreparers(
  48. // A preparer to add a prebuilt apex to the test fixture.
  49. android.FixtureAddTextFile(filepath.Join(dir, "Android.bp"), fmt.Sprintf(`
  50. prebuilt_apex {
  51. name: "%s",
  52. src: "%s",
  53. exported_bootclasspath_fragments: [
  54. "%s",
  55. ],
  56. }
  57. `, apex, apexFile, fragment)),
  58. android.FixtureAddFile(filepath.Join(dir, apexFile), nil),
  59. )
  60. }
  61. func TestSnapshotWithBootclasspathFragment_ImageName(t *testing.T) {
  62. result := android.GroupFixturePreparers(
  63. prepareForSdkTestWithJava,
  64. java.PrepareForTestWithJavaDefaultModules,
  65. prepareForSdkTestWithApex,
  66. // Some additional files needed for the art apex.
  67. android.FixtureMergeMockFs(android.MockFS{
  68. "com.android.art.avbpubkey": nil,
  69. "com.android.art.pem": nil,
  70. "system/sepolicy/apex/com.android.art-file_contexts": nil,
  71. }),
  72. // Add a platform_bootclasspath that depends on the fragment.
  73. fixtureAddPlatformBootclasspathForBootclasspathFragment("com.android.art", "mybootclasspathfragment"),
  74. java.FixtureConfigureBootJars("com.android.art:mybootlib"),
  75. android.FixtureWithRootAndroidBp(`
  76. sdk {
  77. name: "mysdk",
  78. bootclasspath_fragments: ["mybootclasspathfragment"],
  79. }
  80. apex {
  81. name: "com.android.art",
  82. key: "com.android.art.key",
  83. bootclasspath_fragments: [
  84. "mybootclasspathfragment",
  85. ],
  86. updatable: false,
  87. }
  88. bootclasspath_fragment {
  89. name: "mybootclasspathfragment",
  90. image_name: "art",
  91. contents: ["mybootlib"],
  92. apex_available: ["com.android.art"],
  93. hidden_api: {
  94. split_packages: ["*"],
  95. },
  96. }
  97. apex_key {
  98. name: "com.android.art.key",
  99. public_key: "com.android.art.avbpubkey",
  100. private_key: "com.android.art.pem",
  101. }
  102. java_library {
  103. name: "mybootlib",
  104. srcs: ["Test.java"],
  105. system_modules: "none",
  106. sdk_version: "none",
  107. compile_dex: true,
  108. apex_available: ["com.android.art"],
  109. }
  110. `),
  111. ).RunTest(t)
  112. // A preparer to update the test fixture used when processing an unpackage snapshot.
  113. preparerForSnapshot := fixtureAddPrebuiltApexForBootclasspathFragment("com.android.art", "mybootclasspathfragment")
  114. CheckSnapshot(t, result, "mysdk", "",
  115. checkAndroidBpContents(`
  116. // This is auto-generated. DO NOT EDIT.
  117. prebuilt_bootclasspath_fragment {
  118. name: "mybootclasspathfragment",
  119. prefer: false,
  120. visibility: ["//visibility:public"],
  121. apex_available: ["com.android.art"],
  122. image_name: "art",
  123. contents: ["mybootlib"],
  124. hidden_api: {
  125. annotation_flags: "hiddenapi/annotation-flags.csv",
  126. metadata: "hiddenapi/metadata.csv",
  127. index: "hiddenapi/index.csv",
  128. signature_patterns: "hiddenapi/signature-patterns.csv",
  129. filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv",
  130. filtered_flags: "hiddenapi/filtered-flags.csv",
  131. },
  132. }
  133. java_import {
  134. name: "mybootlib",
  135. prefer: false,
  136. visibility: ["//visibility:public"],
  137. apex_available: ["com.android.art"],
  138. jars: ["java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar"],
  139. }
  140. `),
  141. checkAllCopyRules(`
  142. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv
  143. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv
  144. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/index.csv -> hiddenapi/index.csv
  145. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/signature-patterns.csv -> hiddenapi/signature-patterns.csv
  146. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/filtered-stub-flags.csv -> hiddenapi/filtered-stub-flags.csv
  147. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/filtered-flags.csv -> hiddenapi/filtered-flags.csv
  148. .intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar
  149. `),
  150. snapshotTestPreparer(checkSnapshotWithoutSource, preparerForSnapshot),
  151. // Check the behavior of the snapshot without the source.
  152. snapshotTestChecker(checkSnapshotWithoutSource, func(t *testing.T, result *android.TestResult) {
  153. // Make sure that the boot jars package check rule includes the dex jar retrieved from the prebuilt apex.
  154. checkBootJarsPackageCheckRule(t, result, "out/soong/.intermediates/prebuilts/apex/com.android.art.deapexer/android_common/deapexer/javalib/mybootlib.jar")
  155. }),
  156. snapshotTestPreparer(checkSnapshotWithSourcePreferred, preparerForSnapshot),
  157. snapshotTestPreparer(checkSnapshotPreferredWithSource, preparerForSnapshot),
  158. )
  159. // Make sure that the boot jars package check rule includes the dex jar created from the source.
  160. checkBootJarsPackageCheckRule(t, result, "out/soong/.intermediates/mybootlib/android_common_apex10000/aligned/mybootlib.jar")
  161. }
  162. // checkBootJarsPackageCheckRule checks that the supplied module is an input to the boot jars
  163. // package check rule.
  164. func checkBootJarsPackageCheckRule(t *testing.T, result *android.TestResult, expectedModule string) {
  165. platformBcp := result.ModuleForTests("platform-bootclasspath", "android_common")
  166. bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
  167. command := bootJarsCheckRule.RuleParams.Command
  168. expectedCommandArgs := " out/soong/host/linux-x86/bin/dexdump build/soong/scripts/check_boot_jars/package_allowed_list.txt " + expectedModule + " &&"
  169. android.AssertStringDoesContain(t, "boot jars package check", command, expectedCommandArgs)
  170. }
  171. func testSnapshotWithBootClasspathFragment_Contents(t *testing.T, sdk string, copyRules string) {
  172. result := android.GroupFixturePreparers(
  173. prepareForSdkTestWithJava,
  174. java.PrepareForTestWithJavaDefaultModules,
  175. java.PrepareForTestWithJavaSdkLibraryFiles,
  176. java.FixtureWithLastReleaseApis("mysdklibrary", "myothersdklibrary", "mycoreplatform"),
  177. java.FixtureConfigureApexBootJars("myapex:mybootlib", "myapex:myothersdklibrary"),
  178. prepareForSdkTestWithApex,
  179. // Add a platform_bootclasspath that depends on the fragment.
  180. fixtureAddPlatformBootclasspathForBootclasspathFragment("myapex", "mybootclasspathfragment"),
  181. android.FixtureWithRootAndroidBp(sdk+`
  182. apex {
  183. name: "myapex",
  184. key: "myapex.key",
  185. min_sdk_version: "2",
  186. bootclasspath_fragments: ["mybootclasspathfragment"],
  187. }
  188. bootclasspath_fragment {
  189. name: "mybootclasspathfragment",
  190. apex_available: ["myapex"],
  191. contents: [
  192. // This should be automatically added to the sdk_snapshot as a java_boot_libs module.
  193. "mybootlib",
  194. // This should be automatically added to the sdk_snapshot as a java_sdk_libs module.
  195. "myothersdklibrary",
  196. ],
  197. api: {
  198. stub_libs: ["mysdklibrary"],
  199. },
  200. core_platform_api: {
  201. // This should be automatically added to the sdk_snapshot as a java_sdk_libs module.
  202. stub_libs: ["mycoreplatform"],
  203. },
  204. hidden_api: {
  205. split_packages: ["*"],
  206. },
  207. }
  208. java_library {
  209. name: "mybootlib",
  210. apex_available: ["myapex"],
  211. srcs: ["Test.java"],
  212. system_modules: "none",
  213. sdk_version: "none",
  214. min_sdk_version: "2",
  215. compile_dex: true,
  216. permitted_packages: ["mybootlib"],
  217. }
  218. java_sdk_library {
  219. name: "mysdklibrary",
  220. apex_available: ["myapex"],
  221. srcs: ["Test.java"],
  222. shared_library: false,
  223. public: {enabled: true},
  224. min_sdk_version: "2",
  225. }
  226. java_sdk_library {
  227. name: "myothersdklibrary",
  228. apex_available: ["myapex"],
  229. srcs: ["Test.java"],
  230. compile_dex: true,
  231. public: {enabled: true},
  232. min_sdk_version: "2",
  233. permitted_packages: ["myothersdklibrary"],
  234. }
  235. java_sdk_library {
  236. name: "mycoreplatform",
  237. apex_available: ["myapex"],
  238. srcs: ["Test.java"],
  239. compile_dex: true,
  240. public: {enabled: true},
  241. min_sdk_version: "2",
  242. }
  243. `),
  244. ).RunTest(t)
  245. // A preparer to update the test fixture used when processing an unpackage snapshot.
  246. preparerForSnapshot := fixtureAddPrebuiltApexForBootclasspathFragment("myapex", "mybootclasspathfragment")
  247. CheckSnapshot(t, result, "mysdk", "",
  248. checkAndroidBpContents(`
  249. // This is auto-generated. DO NOT EDIT.
  250. prebuilt_bootclasspath_fragment {
  251. name: "mybootclasspathfragment",
  252. prefer: false,
  253. visibility: ["//visibility:public"],
  254. apex_available: ["myapex"],
  255. contents: [
  256. "mybootlib",
  257. "myothersdklibrary",
  258. ],
  259. api: {
  260. stub_libs: ["mysdklibrary"],
  261. },
  262. core_platform_api: {
  263. stub_libs: ["mycoreplatform"],
  264. },
  265. hidden_api: {
  266. annotation_flags: "hiddenapi/annotation-flags.csv",
  267. metadata: "hiddenapi/metadata.csv",
  268. index: "hiddenapi/index.csv",
  269. signature_patterns: "hiddenapi/signature-patterns.csv",
  270. filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv",
  271. filtered_flags: "hiddenapi/filtered-flags.csv",
  272. },
  273. }
  274. java_import {
  275. name: "mybootlib",
  276. prefer: false,
  277. visibility: ["//visibility:public"],
  278. apex_available: ["myapex"],
  279. jars: ["java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar"],
  280. permitted_packages: ["mybootlib"],
  281. }
  282. java_sdk_library_import {
  283. name: "myothersdklibrary",
  284. prefer: false,
  285. visibility: ["//visibility:public"],
  286. apex_available: ["myapex"],
  287. shared_library: true,
  288. compile_dex: true,
  289. permitted_packages: ["myothersdklibrary"],
  290. public: {
  291. jars: ["sdk_library/public/myothersdklibrary-stubs.jar"],
  292. stub_srcs: ["sdk_library/public/myothersdklibrary_stub_sources"],
  293. current_api: "sdk_library/public/myothersdklibrary.txt",
  294. removed_api: "sdk_library/public/myothersdklibrary-removed.txt",
  295. sdk_version: "current",
  296. },
  297. }
  298. java_sdk_library_import {
  299. name: "mysdklibrary",
  300. prefer: false,
  301. visibility: ["//visibility:public"],
  302. apex_available: ["myapex"],
  303. shared_library: false,
  304. public: {
  305. jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
  306. stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
  307. current_api: "sdk_library/public/mysdklibrary.txt",
  308. removed_api: "sdk_library/public/mysdklibrary-removed.txt",
  309. sdk_version: "current",
  310. },
  311. }
  312. java_sdk_library_import {
  313. name: "mycoreplatform",
  314. prefer: false,
  315. visibility: ["//visibility:public"],
  316. apex_available: ["myapex"],
  317. shared_library: true,
  318. compile_dex: true,
  319. public: {
  320. jars: ["sdk_library/public/mycoreplatform-stubs.jar"],
  321. stub_srcs: ["sdk_library/public/mycoreplatform_stub_sources"],
  322. current_api: "sdk_library/public/mycoreplatform.txt",
  323. removed_api: "sdk_library/public/mycoreplatform-removed.txt",
  324. sdk_version: "current",
  325. },
  326. }
  327. `),
  328. checkAllCopyRules(copyRules),
  329. snapshotTestPreparer(checkSnapshotWithoutSource, preparerForSnapshot),
  330. snapshotTestChecker(checkSnapshotWithoutSource, func(t *testing.T, result *android.TestResult) {
  331. module := result.ModuleForTests("platform-bootclasspath", "android_common")
  332. var rule android.TestingBuildParams
  333. rule = module.Output("out/soong/hiddenapi/hiddenapi-flags.csv")
  334. java.CheckHiddenAPIRuleInputs(t, "monolithic flags", `
  335. out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/annotation-flags-from-classes.csv
  336. out/soong/hiddenapi/hiddenapi-stub-flags.txt
  337. snapshot/hiddenapi/annotation-flags.csv
  338. `, rule)
  339. rule = module.Output("out/soong/hiddenapi/hiddenapi-unsupported.csv")
  340. java.CheckHiddenAPIRuleInputs(t, "monolithic metadata", `
  341. out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/metadata-from-classes.csv
  342. snapshot/hiddenapi/metadata.csv
  343. `, rule)
  344. rule = module.Output("out/soong/hiddenapi/hiddenapi-index.csv")
  345. java.CheckHiddenAPIRuleInputs(t, "monolithic index", `
  346. out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
  347. snapshot/hiddenapi/index.csv
  348. `, rule)
  349. rule = module.Output("out/soong/hiddenapi/hiddenapi-flags.csv.valid")
  350. android.AssertStringDoesContain(t, "verify-overlaps", rule.RuleParams.Command, " snapshot/hiddenapi/filtered-flags.csv:snapshot/hiddenapi/signature-patterns.csv ")
  351. }),
  352. snapshotTestPreparer(checkSnapshotWithSourcePreferred, preparerForSnapshot),
  353. snapshotTestChecker(checkSnapshotWithSourcePreferred, func(t *testing.T, result *android.TestResult) {
  354. module := result.ModuleForTests("platform-bootclasspath", "android_common")
  355. rule := module.Output("out/soong/hiddenapi/hiddenapi-flags.csv.valid")
  356. android.AssertStringDoesContain(t, "verify-overlaps", rule.RuleParams.Command, " out/soong/.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/filtered-flags.csv:out/soong/.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/signature-patterns.csv ")
  357. }),
  358. snapshotTestPreparer(checkSnapshotPreferredWithSource, preparerForSnapshot),
  359. )
  360. }
  361. func TestSnapshotWithBootClasspathFragment_Contents(t *testing.T) {
  362. t.Run("added-directly", func(t *testing.T) {
  363. testSnapshotWithBootClasspathFragment_Contents(t, `
  364. sdk {
  365. name: "mysdk",
  366. bootclasspath_fragments: ["mybootclasspathfragment"],
  367. java_sdk_libs: [
  368. // This is not strictly needed as it should be automatically added to the sdk_snapshot as
  369. // a java_sdk_libs module because it is used in the mybootclasspathfragment's
  370. // api.stub_libs property. However, it is specified here to ensure that duplicates are
  371. // correctly deduped.
  372. "mysdklibrary",
  373. ],
  374. }
  375. `, `
  376. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv
  377. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv
  378. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/index.csv -> hiddenapi/index.csv
  379. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/signature-patterns.csv -> hiddenapi/signature-patterns.csv
  380. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/filtered-stub-flags.csv -> hiddenapi/filtered-stub-flags.csv
  381. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/filtered-flags.csv -> hiddenapi/filtered-flags.csv
  382. .intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar
  383. .intermediates/myothersdklibrary.stubs/android_common/javac/myothersdklibrary.stubs.jar -> sdk_library/public/myothersdklibrary-stubs.jar
  384. .intermediates/myothersdklibrary.stubs.source/android_common/metalava/myothersdklibrary.stubs.source_api.txt -> sdk_library/public/myothersdklibrary.txt
  385. .intermediates/myothersdklibrary.stubs.source/android_common/metalava/myothersdklibrary.stubs.source_removed.txt -> sdk_library/public/myothersdklibrary-removed.txt
  386. .intermediates/mysdklibrary.stubs/android_common/javac/mysdklibrary.stubs.jar -> sdk_library/public/mysdklibrary-stubs.jar
  387. .intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt
  388. .intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_removed.txt -> sdk_library/public/mysdklibrary-removed.txt
  389. .intermediates/mycoreplatform.stubs/android_common/javac/mycoreplatform.stubs.jar -> sdk_library/public/mycoreplatform-stubs.jar
  390. .intermediates/mycoreplatform.stubs.source/android_common/metalava/mycoreplatform.stubs.source_api.txt -> sdk_library/public/mycoreplatform.txt
  391. .intermediates/mycoreplatform.stubs.source/android_common/metalava/mycoreplatform.stubs.source_removed.txt -> sdk_library/public/mycoreplatform-removed.txt
  392. `)
  393. })
  394. copyBootclasspathFragmentFromApexVariantRules := `
  395. .intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv
  396. .intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv
  397. .intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/index.csv -> hiddenapi/index.csv
  398. .intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/signature-patterns.csv -> hiddenapi/signature-patterns.csv
  399. .intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/filtered-stub-flags.csv -> hiddenapi/filtered-stub-flags.csv
  400. .intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/filtered-flags.csv -> hiddenapi/filtered-flags.csv
  401. .intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar
  402. .intermediates/myothersdklibrary.stubs/android_common/javac/myothersdklibrary.stubs.jar -> sdk_library/public/myothersdklibrary-stubs.jar
  403. .intermediates/myothersdklibrary.stubs.source/android_common/metalava/myothersdklibrary.stubs.source_api.txt -> sdk_library/public/myothersdklibrary.txt
  404. .intermediates/myothersdklibrary.stubs.source/android_common/metalava/myothersdklibrary.stubs.source_removed.txt -> sdk_library/public/myothersdklibrary-removed.txt
  405. .intermediates/mysdklibrary.stubs/android_common/javac/mysdklibrary.stubs.jar -> sdk_library/public/mysdklibrary-stubs.jar
  406. .intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt
  407. .intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_removed.txt -> sdk_library/public/mysdklibrary-removed.txt
  408. .intermediates/mycoreplatform.stubs/android_common/javac/mycoreplatform.stubs.jar -> sdk_library/public/mycoreplatform-stubs.jar
  409. .intermediates/mycoreplatform.stubs.source/android_common/metalava/mycoreplatform.stubs.source_api.txt -> sdk_library/public/mycoreplatform.txt
  410. .intermediates/mycoreplatform.stubs.source/android_common/metalava/mycoreplatform.stubs.source_removed.txt -> sdk_library/public/mycoreplatform-removed.txt
  411. `
  412. t.Run("added-via-apex", func(t *testing.T) {
  413. testSnapshotWithBootClasspathFragment_Contents(t, `
  414. sdk {
  415. name: "mysdk",
  416. apexes: ["myapex"],
  417. }
  418. `, copyBootclasspathFragmentFromApexVariantRules)
  419. })
  420. t.Run("added-directly-and-indirectly", func(t *testing.T) {
  421. testSnapshotWithBootClasspathFragment_Contents(t, `
  422. sdk {
  423. name: "mysdk",
  424. apexes: ["myapex"],
  425. // This is not strictly needed as it should be automatically added to the sdk_snapshot as
  426. // a bootclasspath_fragments module because it is used in the myapex's
  427. // bootclasspath_fragments property. However, it is specified here to ensure that duplicates
  428. // are correctly deduped.
  429. bootclasspath_fragments: ["mybootclasspathfragment"],
  430. java_sdk_libs: [
  431. // This is not strictly needed as it should be automatically added to the sdk_snapshot as
  432. // a java_sdk_libs module because it is used in the mybootclasspathfragment's
  433. // api.stub_libs property. However, it is specified here to ensure that duplicates are
  434. // correctly deduped.
  435. "mysdklibrary",
  436. ],
  437. }
  438. `, copyBootclasspathFragmentFromApexVariantRules)
  439. })
  440. }
  441. // TestSnapshotWithBootClasspathFragment_Fragments makes sure that the fragments property of a
  442. // bootclasspath_fragment is correctly output to the sdk snapshot.
  443. func TestSnapshotWithBootClasspathFragment_Fragments(t *testing.T) {
  444. result := android.GroupFixturePreparers(
  445. prepareForSdkTestWithJava,
  446. java.PrepareForTestWithJavaDefaultModules,
  447. java.PrepareForTestWithJavaSdkLibraryFiles,
  448. java.FixtureWithLastReleaseApis("mysdklibrary", "myothersdklibrary"),
  449. java.FixtureConfigureApexBootJars("someapex:mysdklibrary", "myotherapex:myotherlib"),
  450. prepareForSdkTestWithApex,
  451. // Some additional files needed for the myotherapex.
  452. android.FixtureMergeMockFs(android.MockFS{
  453. "system/sepolicy/apex/myotherapex-file_contexts": nil,
  454. "myotherapex/apex_manifest.json": nil,
  455. "myotherapex/Test.java": nil,
  456. }),
  457. android.FixtureAddTextFile("myotherapex/Android.bp", `
  458. apex {
  459. name: "myotherapex",
  460. key: "myapex.key",
  461. min_sdk_version: "2",
  462. bootclasspath_fragments: ["myotherbootclasspathfragment"],
  463. }
  464. bootclasspath_fragment {
  465. name: "myotherbootclasspathfragment",
  466. apex_available: ["myotherapex"],
  467. contents: [
  468. "myotherlib",
  469. ],
  470. hidden_api: {
  471. split_packages: ["*"],
  472. },
  473. }
  474. java_library {
  475. name: "myotherlib",
  476. apex_available: ["myotherapex"],
  477. srcs: ["Test.java"],
  478. min_sdk_version: "2",
  479. permitted_packages: ["myothersdklibrary"],
  480. compile_dex: true,
  481. }
  482. `),
  483. android.FixtureWithRootAndroidBp(`
  484. sdk {
  485. name: "mysdk",
  486. bootclasspath_fragments: ["mybootclasspathfragment"],
  487. }
  488. bootclasspath_fragment {
  489. name: "mybootclasspathfragment",
  490. contents: [
  491. "mysdklibrary",
  492. ],
  493. fragments: [
  494. {
  495. apex: "myotherapex",
  496. module: "myotherbootclasspathfragment"
  497. },
  498. ],
  499. hidden_api: {
  500. split_packages: ["*"],
  501. },
  502. }
  503. java_sdk_library {
  504. name: "mysdklibrary",
  505. srcs: ["Test.java"],
  506. shared_library: false,
  507. public: {enabled: true},
  508. min_sdk_version: "2",
  509. }
  510. `),
  511. ).RunTest(t)
  512. // A preparer to update the test fixture used when processing an unpackage snapshot.
  513. preparerForSnapshot := fixtureAddPrebuiltApexForBootclasspathFragment("myapex", "mybootclasspathfragment")
  514. CheckSnapshot(t, result, "mysdk", "",
  515. checkAndroidBpContents(`
  516. // This is auto-generated. DO NOT EDIT.
  517. prebuilt_bootclasspath_fragment {
  518. name: "mybootclasspathfragment",
  519. prefer: false,
  520. visibility: ["//visibility:public"],
  521. apex_available: ["//apex_available:platform"],
  522. contents: ["mysdklibrary"],
  523. fragments: [
  524. {
  525. apex: "myotherapex",
  526. module: "myotherbootclasspathfragment",
  527. },
  528. ],
  529. hidden_api: {
  530. annotation_flags: "hiddenapi/annotation-flags.csv",
  531. metadata: "hiddenapi/metadata.csv",
  532. index: "hiddenapi/index.csv",
  533. signature_patterns: "hiddenapi/signature-patterns.csv",
  534. filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv",
  535. filtered_flags: "hiddenapi/filtered-flags.csv",
  536. },
  537. }
  538. java_sdk_library_import {
  539. name: "mysdklibrary",
  540. prefer: false,
  541. visibility: ["//visibility:public"],
  542. apex_available: ["//apex_available:platform"],
  543. shared_library: false,
  544. public: {
  545. jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
  546. stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
  547. current_api: "sdk_library/public/mysdklibrary.txt",
  548. removed_api: "sdk_library/public/mysdklibrary-removed.txt",
  549. sdk_version: "current",
  550. },
  551. }
  552. `),
  553. snapshotTestPreparer(checkSnapshotWithoutSource, preparerForSnapshot),
  554. snapshotTestPreparer(checkSnapshotWithSourcePreferred, preparerForSnapshot),
  555. snapshotTestPreparer(checkSnapshotPreferredWithSource, preparerForSnapshot),
  556. )
  557. }
  558. // Test that bootclasspath_fragment works with sdk.
  559. func TestBasicSdkWithBootclasspathFragment(t *testing.T) {
  560. android.GroupFixturePreparers(
  561. prepareForSdkTestWithApex,
  562. prepareForSdkTestWithJava,
  563. android.FixtureAddFile("java/mybootlib.jar", nil),
  564. android.FixtureWithRootAndroidBp(`
  565. sdk {
  566. name: "mysdk",
  567. bootclasspath_fragments: ["mybootclasspathfragment"],
  568. }
  569. bootclasspath_fragment {
  570. name: "mybootclasspathfragment",
  571. image_name: "art",
  572. contents: ["mybootlib"],
  573. apex_available: ["myapex"],
  574. hidden_api: {
  575. split_packages: ["*"],
  576. },
  577. }
  578. java_library {
  579. name: "mybootlib",
  580. apex_available: ["myapex"],
  581. srcs: ["Test.java"],
  582. system_modules: "none",
  583. sdk_version: "none",
  584. min_sdk_version: "1",
  585. compile_dex: true,
  586. }
  587. sdk_snapshot {
  588. name: "mysdk@1",
  589. bootclasspath_fragments: ["mysdk_mybootclasspathfragment@1"],
  590. }
  591. prebuilt_bootclasspath_fragment {
  592. name: "mysdk_mybootclasspathfragment@1",
  593. sdk_member_name: "mybootclasspathfragment",
  594. prefer: false,
  595. visibility: ["//visibility:public"],
  596. apex_available: [
  597. "myapex",
  598. ],
  599. image_name: "art",
  600. contents: ["mysdk_mybootlib@1"],
  601. }
  602. java_import {
  603. name: "mysdk_mybootlib@1",
  604. sdk_member_name: "mybootlib",
  605. visibility: ["//visibility:public"],
  606. apex_available: ["com.android.art"],
  607. jars: ["java/mybootlib.jar"],
  608. }
  609. `),
  610. ).RunTest(t)
  611. }
  612. func TestSnapshotWithBootclasspathFragment_HiddenAPI(t *testing.T) {
  613. result := android.GroupFixturePreparers(
  614. prepareForSdkTestWithJava,
  615. java.PrepareForTestWithJavaDefaultModules,
  616. java.PrepareForTestWithJavaSdkLibraryFiles,
  617. java.FixtureWithLastReleaseApis("mysdklibrary"),
  618. java.FixtureConfigureApexBootJars("myapex:mybootlib"),
  619. prepareForSdkTestWithApex,
  620. // Add a platform_bootclasspath that depends on the fragment.
  621. fixtureAddPlatformBootclasspathForBootclasspathFragment("myapex", "mybootclasspathfragment"),
  622. android.MockFS{
  623. "my-blocked.txt": nil,
  624. "my-max-target-o-low-priority.txt": nil,
  625. "my-max-target-p.txt": nil,
  626. "my-max-target-q.txt": nil,
  627. "my-max-target-r-low-priority.txt": nil,
  628. "my-removed.txt": nil,
  629. "my-unsupported-packages.txt": nil,
  630. "my-unsupported.txt": nil,
  631. }.AddToFixture(),
  632. android.FixtureWithRootAndroidBp(`
  633. sdk {
  634. name: "mysdk",
  635. bootclasspath_fragments: ["mybootclasspathfragment"],
  636. }
  637. apex {
  638. name: "myapex",
  639. key: "myapex.key",
  640. min_sdk_version: "1",
  641. bootclasspath_fragments: ["mybootclasspathfragment"],
  642. }
  643. bootclasspath_fragment {
  644. name: "mybootclasspathfragment",
  645. apex_available: ["myapex"],
  646. contents: ["mybootlib"],
  647. api: {
  648. stub_libs: ["mysdklibrary"],
  649. },
  650. hidden_api: {
  651. unsupported: [
  652. "my-unsupported.txt",
  653. ],
  654. removed: [
  655. "my-removed.txt",
  656. ],
  657. max_target_r_low_priority: [
  658. "my-max-target-r-low-priority.txt",
  659. ],
  660. max_target_q: [
  661. "my-max-target-q.txt",
  662. ],
  663. max_target_p: [
  664. "my-max-target-p.txt",
  665. ],
  666. max_target_o_low_priority: [
  667. "my-max-target-o-low-priority.txt",
  668. ],
  669. blocked: [
  670. "my-blocked.txt",
  671. ],
  672. unsupported_packages: [
  673. "my-unsupported-packages.txt",
  674. ],
  675. split_packages: ["*"],
  676. },
  677. }
  678. java_library {
  679. name: "mybootlib",
  680. apex_available: ["myapex"],
  681. srcs: ["Test.java"],
  682. system_modules: "none",
  683. sdk_version: "none",
  684. min_sdk_version: "1",
  685. compile_dex: true,
  686. permitted_packages: ["mybootlib"],
  687. }
  688. java_sdk_library {
  689. name: "mysdklibrary",
  690. srcs: ["Test.java"],
  691. compile_dex: true,
  692. public: {enabled: true},
  693. permitted_packages: ["mysdklibrary"],
  694. }
  695. `),
  696. ).RunTest(t)
  697. // A preparer to update the test fixture used when processing an unpackage snapshot.
  698. preparerForSnapshot := fixtureAddPrebuiltApexForBootclasspathFragment("myapex", "mybootclasspathfragment")
  699. CheckSnapshot(t, result, "mysdk", "",
  700. checkAndroidBpContents(`
  701. // This is auto-generated. DO NOT EDIT.
  702. prebuilt_bootclasspath_fragment {
  703. name: "mybootclasspathfragment",
  704. prefer: false,
  705. visibility: ["//visibility:public"],
  706. apex_available: ["myapex"],
  707. contents: ["mybootlib"],
  708. api: {
  709. stub_libs: ["mysdklibrary"],
  710. },
  711. hidden_api: {
  712. unsupported: ["hiddenapi/my-unsupported.txt"],
  713. removed: ["hiddenapi/my-removed.txt"],
  714. max_target_r_low_priority: ["hiddenapi/my-max-target-r-low-priority.txt"],
  715. max_target_q: ["hiddenapi/my-max-target-q.txt"],
  716. max_target_p: ["hiddenapi/my-max-target-p.txt"],
  717. max_target_o_low_priority: ["hiddenapi/my-max-target-o-low-priority.txt"],
  718. blocked: ["hiddenapi/my-blocked.txt"],
  719. unsupported_packages: ["hiddenapi/my-unsupported-packages.txt"],
  720. annotation_flags: "hiddenapi/annotation-flags.csv",
  721. metadata: "hiddenapi/metadata.csv",
  722. index: "hiddenapi/index.csv",
  723. signature_patterns: "hiddenapi/signature-patterns.csv",
  724. filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv",
  725. filtered_flags: "hiddenapi/filtered-flags.csv",
  726. },
  727. }
  728. java_import {
  729. name: "mybootlib",
  730. prefer: false,
  731. visibility: ["//visibility:public"],
  732. apex_available: ["myapex"],
  733. jars: ["java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar"],
  734. permitted_packages: ["mybootlib"],
  735. }
  736. java_sdk_library_import {
  737. name: "mysdklibrary",
  738. prefer: false,
  739. visibility: ["//visibility:public"],
  740. apex_available: ["//apex_available:platform"],
  741. shared_library: true,
  742. compile_dex: true,
  743. permitted_packages: ["mysdklibrary"],
  744. public: {
  745. jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
  746. stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
  747. current_api: "sdk_library/public/mysdklibrary.txt",
  748. removed_api: "sdk_library/public/mysdklibrary-removed.txt",
  749. sdk_version: "current",
  750. },
  751. }
  752. `),
  753. checkAllCopyRules(`
  754. my-unsupported.txt -> hiddenapi/my-unsupported.txt
  755. my-removed.txt -> hiddenapi/my-removed.txt
  756. my-max-target-r-low-priority.txt -> hiddenapi/my-max-target-r-low-priority.txt
  757. my-max-target-q.txt -> hiddenapi/my-max-target-q.txt
  758. my-max-target-p.txt -> hiddenapi/my-max-target-p.txt
  759. my-max-target-o-low-priority.txt -> hiddenapi/my-max-target-o-low-priority.txt
  760. my-blocked.txt -> hiddenapi/my-blocked.txt
  761. my-unsupported-packages.txt -> hiddenapi/my-unsupported-packages.txt
  762. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv
  763. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv
  764. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/index.csv -> hiddenapi/index.csv
  765. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/signature-patterns.csv -> hiddenapi/signature-patterns.csv
  766. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/filtered-stub-flags.csv -> hiddenapi/filtered-stub-flags.csv
  767. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/filtered-flags.csv -> hiddenapi/filtered-flags.csv
  768. .intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar
  769. .intermediates/mysdklibrary.stubs/android_common/javac/mysdklibrary.stubs.jar -> sdk_library/public/mysdklibrary-stubs.jar
  770. .intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt
  771. .intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_removed.txt -> sdk_library/public/mysdklibrary-removed.txt
  772. `),
  773. snapshotTestPreparer(checkSnapshotWithoutSource, preparerForSnapshot),
  774. snapshotTestPreparer(checkSnapshotWithSourcePreferred, preparerForSnapshot),
  775. snapshotTestPreparer(checkSnapshotPreferredWithSource, preparerForSnapshot),
  776. )
  777. }