bootclasspath_fragment_sdk_test.go 28 KB

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