bootclasspath_fragment_sdk_test.go 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251
  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. "strings"
  19. "testing"
  20. "android/soong/android"
  21. "android/soong/java"
  22. )
  23. // fixtureAddPlatformBootclasspathForBootclasspathFragment adds a platform_bootclasspath module that
  24. // references the bootclasspath fragment.
  25. func fixtureAddPlatformBootclasspathForBootclasspathFragment(apex, fragment string) android.FixturePreparer {
  26. return fixtureAddPlatformBootclasspathForBootclasspathFragmentWithExtra(apex, fragment, "")
  27. }
  28. // fixtureAddPlatformBootclasspathForBootclasspathFragmentWithExtra is the same as above, but also adds extra fragments.
  29. func fixtureAddPlatformBootclasspathForBootclasspathFragmentWithExtra(apex, fragment, extraFragments string) android.FixturePreparer {
  30. return android.GroupFixturePreparers(
  31. // Add a platform_bootclasspath module.
  32. android.FixtureAddTextFile("frameworks/base/boot/Android.bp", fmt.Sprintf(`
  33. platform_bootclasspath {
  34. name: "platform-bootclasspath",
  35. fragments: [
  36. {
  37. apex: "%s",
  38. module: "%s",
  39. },
  40. %s
  41. ],
  42. }
  43. `, apex, fragment, extraFragments)),
  44. android.FixtureAddFile("frameworks/base/config/boot-profile.txt", nil),
  45. android.FixtureAddFile("frameworks/base/config/boot-image-profile.txt", nil),
  46. android.FixtureAddFile("build/soong/scripts/check_boot_jars/package_allowed_list.txt", nil),
  47. )
  48. }
  49. // fixtureAddPrebuiltApexForBootclasspathFragment adds a prebuilt_apex that exports the fragment.
  50. func fixtureAddPrebuiltApexForBootclasspathFragment(apex, fragment string) android.FixturePreparer {
  51. apexFile := fmt.Sprintf("%s.apex", apex)
  52. dir := "prebuilts/apex"
  53. return android.GroupFixturePreparers(
  54. // A preparer to add a prebuilt apex to the test fixture.
  55. android.FixtureAddTextFile(filepath.Join(dir, "Android.bp"), fmt.Sprintf(`
  56. prebuilt_apex {
  57. name: "%s",
  58. src: "%s",
  59. exported_bootclasspath_fragments: [
  60. "%s",
  61. ],
  62. }
  63. `, apex, apexFile, fragment)),
  64. android.FixtureAddFile(filepath.Join(dir, apexFile), nil),
  65. )
  66. }
  67. func TestSnapshotWithBootclasspathFragment_ImageName(t *testing.T) {
  68. result := android.GroupFixturePreparers(
  69. prepareForSdkTestWithJava,
  70. java.PrepareForTestWithDexpreopt,
  71. prepareForSdkTestWithApex,
  72. // Some additional files needed for the art apex.
  73. android.FixtureMergeMockFs(android.MockFS{
  74. "com.android.art.avbpubkey": nil,
  75. "com.android.art.pem": nil,
  76. "system/sepolicy/apex/com.android.art-file_contexts": nil,
  77. }),
  78. // Add a platform_bootclasspath that depends on the fragment.
  79. fixtureAddPlatformBootclasspathForBootclasspathFragmentWithExtra(
  80. "com.android.art", "mybootclasspathfragment", java.ApexBootJarFragmentsForPlatformBootclasspath),
  81. java.PrepareForBootImageConfigTest,
  82. java.PrepareApexBootJarConfigsAndModules,
  83. android.FixtureWithRootAndroidBp(`
  84. sdk {
  85. name: "mysdk",
  86. bootclasspath_fragments: ["mybootclasspathfragment"],
  87. }
  88. apex {
  89. name: "com.android.art",
  90. key: "com.android.art.key",
  91. bootclasspath_fragments: [
  92. "mybootclasspathfragment",
  93. ],
  94. updatable: false,
  95. }
  96. bootclasspath_fragment {
  97. name: "mybootclasspathfragment",
  98. image_name: "art",
  99. contents: ["core1", "core2"],
  100. apex_available: ["com.android.art"],
  101. hidden_api: {
  102. split_packages: ["*"],
  103. },
  104. }
  105. apex_key {
  106. name: "com.android.art.key",
  107. public_key: "com.android.art.avbpubkey",
  108. private_key: "com.android.art.pem",
  109. }
  110. java_library {
  111. name: "core1",
  112. srcs: ["Test.java"],
  113. system_modules: "none",
  114. sdk_version: "none",
  115. compile_dex: true,
  116. apex_available: ["com.android.art"],
  117. }
  118. java_library {
  119. name: "core2",
  120. srcs: ["Test.java"],
  121. system_modules: "none",
  122. sdk_version: "none",
  123. compile_dex: true,
  124. apex_available: ["com.android.art"],
  125. }
  126. `),
  127. ).RunTest(t)
  128. // A preparer to update the test fixture used when processing an unpackage snapshot.
  129. preparerForSnapshot := fixtureAddPrebuiltApexForBootclasspathFragment("com.android.art", "mybootclasspathfragment")
  130. // Check that source on its own configures the bootImageConfig correctly.
  131. java.CheckMutatedArtBootImageConfig(t, result, "out/soong/.intermediates/mybootclasspathfragment/android_common_apex10000/meta_lic")
  132. java.CheckMutatedFrameworkBootImageConfig(t, result, "out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/meta_lic")
  133. CheckSnapshot(t, result, "mysdk", "",
  134. checkAndroidBpContents(`
  135. // This is auto-generated. DO NOT EDIT.
  136. prebuilt_bootclasspath_fragment {
  137. name: "mybootclasspathfragment",
  138. prefer: false,
  139. visibility: ["//visibility:public"],
  140. apex_available: ["com.android.art"],
  141. image_name: "art",
  142. contents: [
  143. "core1",
  144. "core2",
  145. ],
  146. hidden_api: {
  147. annotation_flags: "hiddenapi/annotation-flags.csv",
  148. metadata: "hiddenapi/metadata.csv",
  149. index: "hiddenapi/index.csv",
  150. signature_patterns: "hiddenapi/signature-patterns.csv",
  151. filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv",
  152. filtered_flags: "hiddenapi/filtered-flags.csv",
  153. },
  154. }
  155. java_import {
  156. name: "core1",
  157. prefer: false,
  158. visibility: ["//visibility:public"],
  159. apex_available: ["com.android.art"],
  160. jars: ["java_boot_libs/snapshot/jars/are/invalid/core1.jar"],
  161. }
  162. java_import {
  163. name: "core2",
  164. prefer: false,
  165. visibility: ["//visibility:public"],
  166. apex_available: ["com.android.art"],
  167. jars: ["java_boot_libs/snapshot/jars/are/invalid/core2.jar"],
  168. }
  169. `),
  170. checkAllCopyRules(`
  171. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv
  172. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv
  173. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/index.csv -> hiddenapi/index.csv
  174. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/signature-patterns.csv -> hiddenapi/signature-patterns.csv
  175. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/filtered-stub-flags.csv -> hiddenapi/filtered-stub-flags.csv
  176. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/filtered-flags.csv -> hiddenapi/filtered-flags.csv
  177. .intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/core1.jar
  178. .intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/core2.jar
  179. `),
  180. snapshotTestPreparer(checkSnapshotWithoutSource, preparerForSnapshot),
  181. // Check the behavior of the snapshot without the source.
  182. snapshotTestChecker(checkSnapshotWithoutSource, func(t *testing.T, result *android.TestResult) {
  183. // Make sure that the boot jars package check rule includes the dex jars retrieved from the prebuilt apex.
  184. checkBootJarsPackageCheckRule(t, result,
  185. append(
  186. []string{
  187. "out/soong/.intermediates/prebuilts/apex/com.android.art.deapexer/android_common/deapexer/javalib/core1.jar",
  188. "out/soong/.intermediates/prebuilts/apex/com.android.art.deapexer/android_common/deapexer/javalib/core2.jar",
  189. "out/soong/.intermediates/default/java/framework/android_common/aligned/framework.jar",
  190. },
  191. java.ApexBootJarDexJarPaths...,
  192. )...,
  193. )
  194. java.CheckMutatedArtBootImageConfig(t, result, "out/soong/.intermediates/snapshot/mybootclasspathfragment/android_common_com.android.art/meta_lic")
  195. java.CheckMutatedFrameworkBootImageConfig(t, result, "out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/meta_lic")
  196. }),
  197. snapshotTestPreparer(checkSnapshotWithSourcePreferred, preparerForSnapshot),
  198. // Check the behavior of the snapshot when the source is preferred.
  199. snapshotTestChecker(checkSnapshotWithSourcePreferred, func(t *testing.T, result *android.TestResult) {
  200. java.CheckMutatedArtBootImageConfig(t, result, "out/soong/.intermediates/mybootclasspathfragment/android_common_apex10000/meta_lic")
  201. java.CheckMutatedFrameworkBootImageConfig(t, result, "out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/meta_lic")
  202. }),
  203. snapshotTestPreparer(checkSnapshotPreferredWithSource, preparerForSnapshot),
  204. // Check the behavior of the snapshot when it is preferred.
  205. snapshotTestChecker(checkSnapshotPreferredWithSource, func(t *testing.T, result *android.TestResult) {
  206. java.CheckMutatedArtBootImageConfig(t, result, "out/soong/.intermediates/snapshot/prebuilt_mybootclasspathfragment/android_common_com.android.art/meta_lic")
  207. java.CheckMutatedFrameworkBootImageConfig(t, result, "out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/meta_lic")
  208. }),
  209. )
  210. // Make sure that the boot jars package check rule includes the dex jars created from the source.
  211. checkBootJarsPackageCheckRule(t, result,
  212. append(
  213. []string{
  214. "out/soong/.intermediates/core1/android_common_apex10000/aligned/core1.jar",
  215. "out/soong/.intermediates/core2/android_common_apex10000/aligned/core2.jar",
  216. "out/soong/.intermediates/default/java/framework/android_common/aligned/framework.jar",
  217. },
  218. java.ApexBootJarDexJarPaths...,
  219. )...,
  220. )
  221. }
  222. // checkBootJarsPackageCheckRule checks that the supplied module is an input to the boot jars
  223. // package check rule.
  224. func checkBootJarsPackageCheckRule(t *testing.T, result *android.TestResult, expectedModules ...string) {
  225. t.Helper()
  226. platformBcp := result.ModuleForTests("platform-bootclasspath", "android_common")
  227. bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
  228. command := bootJarsCheckRule.RuleParams.Command
  229. expectedCommandArgs := " build/soong/scripts/check_boot_jars/package_allowed_list.txt " + strings.Join(expectedModules, " ") + " &&"
  230. android.AssertStringDoesContain(t, "boot jars package check", command, expectedCommandArgs)
  231. }
  232. func testSnapshotWithBootClasspathFragment_Contents(t *testing.T, sdk string, copyRules string) {
  233. result := android.GroupFixturePreparers(
  234. prepareForSdkTestWithJava,
  235. java.PrepareForTestWithJavaDefaultModules,
  236. java.PrepareForTestWithJavaSdkLibraryFiles,
  237. java.FixtureWithLastReleaseApis("mysdklibrary", "myothersdklibrary", "mycoreplatform"),
  238. java.FixtureConfigureApexBootJars("myapex:mybootlib", "myapex:myothersdklibrary"),
  239. prepareForSdkTestWithApex,
  240. // Add a platform_bootclasspath that depends on the fragment.
  241. fixtureAddPlatformBootclasspathForBootclasspathFragment("myapex", "mybootclasspathfragment"),
  242. android.FixtureWithRootAndroidBp(sdk+`
  243. apex {
  244. name: "myapex",
  245. key: "myapex.key",
  246. min_sdk_version: "2",
  247. bootclasspath_fragments: ["mybootclasspathfragment"],
  248. }
  249. bootclasspath_fragment {
  250. name: "mybootclasspathfragment",
  251. apex_available: ["myapex"],
  252. contents: [
  253. // This should be automatically added to the sdk_snapshot as a java_boot_libs module.
  254. "mybootlib",
  255. // This should be automatically added to the sdk_snapshot as a java_sdk_libs module.
  256. "myothersdklibrary",
  257. ],
  258. api: {
  259. stub_libs: ["mysdklibrary"],
  260. },
  261. core_platform_api: {
  262. // This should be automatically added to the sdk_snapshot as a java_sdk_libs module.
  263. stub_libs: ["mycoreplatform"],
  264. },
  265. hidden_api: {
  266. split_packages: ["*"],
  267. },
  268. }
  269. java_library {
  270. name: "mybootlib",
  271. apex_available: ["myapex"],
  272. srcs: ["Test.java"],
  273. system_modules: "none",
  274. sdk_version: "none",
  275. min_sdk_version: "2",
  276. compile_dex: true,
  277. permitted_packages: ["mybootlib"],
  278. }
  279. java_sdk_library {
  280. name: "mysdklibrary",
  281. apex_available: ["myapex"],
  282. srcs: ["Test.java"],
  283. shared_library: false,
  284. public: {enabled: true},
  285. min_sdk_version: "2",
  286. }
  287. java_sdk_library {
  288. name: "myothersdklibrary",
  289. apex_available: ["myapex"],
  290. srcs: ["Test.java"],
  291. compile_dex: true,
  292. public: {enabled: true},
  293. min_sdk_version: "2",
  294. permitted_packages: ["myothersdklibrary"],
  295. }
  296. java_sdk_library {
  297. name: "mycoreplatform",
  298. apex_available: ["myapex"],
  299. srcs: ["Test.java"],
  300. compile_dex: true,
  301. public: {enabled: true},
  302. min_sdk_version: "2",
  303. }
  304. `),
  305. ).RunTest(t)
  306. // A preparer to update the test fixture used when processing an unpackage snapshot.
  307. preparerForSnapshot := fixtureAddPrebuiltApexForBootclasspathFragment("myapex", "mybootclasspathfragment")
  308. CheckSnapshot(t, result, "mysdk", "",
  309. checkAndroidBpContents(`
  310. // This is auto-generated. DO NOT EDIT.
  311. prebuilt_bootclasspath_fragment {
  312. name: "mybootclasspathfragment",
  313. prefer: false,
  314. visibility: ["//visibility:public"],
  315. apex_available: ["myapex"],
  316. contents: [
  317. "mybootlib",
  318. "myothersdklibrary",
  319. ],
  320. api: {
  321. stub_libs: ["mysdklibrary"],
  322. },
  323. core_platform_api: {
  324. stub_libs: ["mycoreplatform"],
  325. },
  326. hidden_api: {
  327. annotation_flags: "hiddenapi/annotation-flags.csv",
  328. metadata: "hiddenapi/metadata.csv",
  329. index: "hiddenapi/index.csv",
  330. signature_patterns: "hiddenapi/signature-patterns.csv",
  331. filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv",
  332. filtered_flags: "hiddenapi/filtered-flags.csv",
  333. },
  334. }
  335. java_import {
  336. name: "mybootlib",
  337. prefer: false,
  338. visibility: ["//visibility:public"],
  339. apex_available: ["myapex"],
  340. jars: ["java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar"],
  341. min_sdk_version: "2",
  342. permitted_packages: ["mybootlib"],
  343. }
  344. java_sdk_library_import {
  345. name: "myothersdklibrary",
  346. prefer: false,
  347. visibility: ["//visibility:public"],
  348. apex_available: ["myapex"],
  349. shared_library: true,
  350. compile_dex: true,
  351. permitted_packages: ["myothersdklibrary"],
  352. public: {
  353. jars: ["sdk_library/public/myothersdklibrary-stubs.jar"],
  354. stub_srcs: ["sdk_library/public/myothersdklibrary_stub_sources"],
  355. current_api: "sdk_library/public/myothersdklibrary.txt",
  356. removed_api: "sdk_library/public/myothersdklibrary-removed.txt",
  357. sdk_version: "current",
  358. },
  359. }
  360. java_sdk_library_import {
  361. name: "mysdklibrary",
  362. prefer: false,
  363. visibility: ["//visibility:public"],
  364. apex_available: ["myapex"],
  365. shared_library: false,
  366. public: {
  367. jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
  368. stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
  369. current_api: "sdk_library/public/mysdklibrary.txt",
  370. removed_api: "sdk_library/public/mysdklibrary-removed.txt",
  371. sdk_version: "current",
  372. },
  373. }
  374. java_sdk_library_import {
  375. name: "mycoreplatform",
  376. prefer: false,
  377. visibility: ["//visibility:public"],
  378. apex_available: ["myapex"],
  379. shared_library: true,
  380. compile_dex: true,
  381. public: {
  382. jars: ["sdk_library/public/mycoreplatform-stubs.jar"],
  383. stub_srcs: ["sdk_library/public/mycoreplatform_stub_sources"],
  384. current_api: "sdk_library/public/mycoreplatform.txt",
  385. removed_api: "sdk_library/public/mycoreplatform-removed.txt",
  386. sdk_version: "current",
  387. },
  388. }
  389. `),
  390. checkAllCopyRules(copyRules),
  391. snapshotTestPreparer(checkSnapshotWithoutSource, preparerForSnapshot),
  392. snapshotTestChecker(checkSnapshotWithoutSource, func(t *testing.T, result *android.TestResult) {
  393. module := result.ModuleForTests("platform-bootclasspath", "android_common")
  394. var rule android.TestingBuildParams
  395. rule = module.Output("out/soong/hiddenapi/hiddenapi-flags.csv")
  396. java.CheckHiddenAPIRuleInputs(t, "monolithic flags", `
  397. out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/annotation-flags-from-classes.csv
  398. out/soong/hiddenapi/hiddenapi-stub-flags.txt
  399. snapshot/hiddenapi/annotation-flags.csv
  400. `, rule)
  401. rule = module.Output("out/soong/hiddenapi/hiddenapi-unsupported.csv")
  402. java.CheckHiddenAPIRuleInputs(t, "monolithic metadata", `
  403. out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/metadata-from-classes.csv
  404. snapshot/hiddenapi/metadata.csv
  405. `, rule)
  406. rule = module.Output("out/soong/hiddenapi/hiddenapi-index.csv")
  407. java.CheckHiddenAPIRuleInputs(t, "monolithic index", `
  408. out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
  409. snapshot/hiddenapi/index.csv
  410. `, rule)
  411. rule = module.Output("out/soong/hiddenapi/hiddenapi-flags.csv.valid")
  412. android.AssertStringDoesContain(t, "verify-overlaps", rule.RuleParams.Command, " snapshot/hiddenapi/filtered-flags.csv:snapshot/hiddenapi/signature-patterns.csv ")
  413. }),
  414. snapshotTestPreparer(checkSnapshotWithSourcePreferred, preparerForSnapshot),
  415. snapshotTestChecker(checkSnapshotWithSourcePreferred, func(t *testing.T, result *android.TestResult) {
  416. module := result.ModuleForTests("platform-bootclasspath", "android_common")
  417. rule := module.Output("out/soong/hiddenapi/hiddenapi-flags.csv.valid")
  418. 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 ")
  419. }),
  420. snapshotTestPreparer(checkSnapshotPreferredWithSource, preparerForSnapshot),
  421. )
  422. }
  423. func TestSnapshotWithBootClasspathFragment_Contents(t *testing.T) {
  424. t.Run("added-directly", func(t *testing.T) {
  425. testSnapshotWithBootClasspathFragment_Contents(t, `
  426. sdk {
  427. name: "mysdk",
  428. bootclasspath_fragments: ["mybootclasspathfragment"],
  429. java_sdk_libs: [
  430. // This is not strictly needed as it should be automatically added to the sdk_snapshot as
  431. // a java_sdk_libs module because it is used in the mybootclasspathfragment's
  432. // api.stub_libs property. However, it is specified here to ensure that duplicates are
  433. // correctly deduped.
  434. "mysdklibrary",
  435. ],
  436. }
  437. `, `
  438. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv
  439. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv
  440. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/index.csv -> hiddenapi/index.csv
  441. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/signature-patterns.csv -> hiddenapi/signature-patterns.csv
  442. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/filtered-stub-flags.csv -> hiddenapi/filtered-stub-flags.csv
  443. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/filtered-flags.csv -> hiddenapi/filtered-flags.csv
  444. .intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar
  445. .intermediates/myothersdklibrary.stubs/android_common/combined/myothersdklibrary.stubs.jar -> sdk_library/public/myothersdklibrary-stubs.jar
  446. .intermediates/myothersdklibrary.stubs.source/android_common/metalava/myothersdklibrary.stubs.source_api.txt -> sdk_library/public/myothersdklibrary.txt
  447. .intermediates/myothersdklibrary.stubs.source/android_common/metalava/myothersdklibrary.stubs.source_removed.txt -> sdk_library/public/myothersdklibrary-removed.txt
  448. .intermediates/mysdklibrary.stubs/android_common/combined/mysdklibrary.stubs.jar -> sdk_library/public/mysdklibrary-stubs.jar
  449. .intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt
  450. .intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_removed.txt -> sdk_library/public/mysdklibrary-removed.txt
  451. .intermediates/mycoreplatform.stubs/android_common/combined/mycoreplatform.stubs.jar -> sdk_library/public/mycoreplatform-stubs.jar
  452. .intermediates/mycoreplatform.stubs.source/android_common/metalava/mycoreplatform.stubs.source_api.txt -> sdk_library/public/mycoreplatform.txt
  453. .intermediates/mycoreplatform.stubs.source/android_common/metalava/mycoreplatform.stubs.source_removed.txt -> sdk_library/public/mycoreplatform-removed.txt
  454. `)
  455. })
  456. copyBootclasspathFragmentFromApexVariantRules := `
  457. .intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv
  458. .intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv
  459. .intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/index.csv -> hiddenapi/index.csv
  460. .intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/signature-patterns.csv -> hiddenapi/signature-patterns.csv
  461. .intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/filtered-stub-flags.csv -> hiddenapi/filtered-stub-flags.csv
  462. .intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/filtered-flags.csv -> hiddenapi/filtered-flags.csv
  463. .intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar
  464. .intermediates/myothersdklibrary.stubs/android_common/combined/myothersdklibrary.stubs.jar -> sdk_library/public/myothersdklibrary-stubs.jar
  465. .intermediates/myothersdklibrary.stubs.source/android_common/metalava/myothersdklibrary.stubs.source_api.txt -> sdk_library/public/myothersdklibrary.txt
  466. .intermediates/myothersdklibrary.stubs.source/android_common/metalava/myothersdklibrary.stubs.source_removed.txt -> sdk_library/public/myothersdklibrary-removed.txt
  467. .intermediates/mysdklibrary.stubs/android_common/combined/mysdklibrary.stubs.jar -> sdk_library/public/mysdklibrary-stubs.jar
  468. .intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt
  469. .intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_removed.txt -> sdk_library/public/mysdklibrary-removed.txt
  470. .intermediates/mycoreplatform.stubs/android_common/combined/mycoreplatform.stubs.jar -> sdk_library/public/mycoreplatform-stubs.jar
  471. .intermediates/mycoreplatform.stubs.source/android_common/metalava/mycoreplatform.stubs.source_api.txt -> sdk_library/public/mycoreplatform.txt
  472. .intermediates/mycoreplatform.stubs.source/android_common/metalava/mycoreplatform.stubs.source_removed.txt -> sdk_library/public/mycoreplatform-removed.txt
  473. `
  474. t.Run("added-via-apex", func(t *testing.T) {
  475. testSnapshotWithBootClasspathFragment_Contents(t, `
  476. sdk {
  477. name: "mysdk",
  478. apexes: ["myapex"],
  479. }
  480. `, copyBootclasspathFragmentFromApexVariantRules)
  481. })
  482. t.Run("added-directly-and-indirectly", func(t *testing.T) {
  483. testSnapshotWithBootClasspathFragment_Contents(t, `
  484. sdk {
  485. name: "mysdk",
  486. apexes: ["myapex"],
  487. // This is not strictly needed as it should be automatically added to the sdk_snapshot as
  488. // a bootclasspath_fragments module because it is used in the myapex's
  489. // bootclasspath_fragments property. However, it is specified here to ensure that duplicates
  490. // are correctly deduped.
  491. bootclasspath_fragments: ["mybootclasspathfragment"],
  492. java_sdk_libs: [
  493. // This is not strictly needed as it should be automatically added to the sdk_snapshot as
  494. // a java_sdk_libs module because it is used in the mybootclasspathfragment's
  495. // api.stub_libs property. However, it is specified here to ensure that duplicates are
  496. // correctly deduped.
  497. "mysdklibrary",
  498. ],
  499. }
  500. `, copyBootclasspathFragmentFromApexVariantRules)
  501. })
  502. }
  503. // TestSnapshotWithBootClasspathFragment_Fragments makes sure that the fragments property of a
  504. // bootclasspath_fragment is correctly output to the sdk snapshot.
  505. func TestSnapshotWithBootClasspathFragment_Fragments(t *testing.T) {
  506. result := android.GroupFixturePreparers(
  507. prepareForSdkTestWithJava,
  508. java.PrepareForTestWithJavaDefaultModules,
  509. java.PrepareForTestWithJavaSdkLibraryFiles,
  510. java.FixtureWithLastReleaseApis("mysdklibrary", "myothersdklibrary"),
  511. java.FixtureConfigureApexBootJars("someapex:mysdklibrary", "myotherapex:myotherlib"),
  512. prepareForSdkTestWithApex,
  513. // Some additional files needed for the myotherapex.
  514. android.FixtureMergeMockFs(android.MockFS{
  515. "system/sepolicy/apex/myotherapex-file_contexts": nil,
  516. "myotherapex/apex_manifest.json": nil,
  517. "myotherapex/Test.java": nil,
  518. }),
  519. android.FixtureAddTextFile("myotherapex/Android.bp", `
  520. apex {
  521. name: "myotherapex",
  522. key: "myapex.key",
  523. min_sdk_version: "2",
  524. bootclasspath_fragments: ["myotherbootclasspathfragment"],
  525. }
  526. bootclasspath_fragment {
  527. name: "myotherbootclasspathfragment",
  528. apex_available: ["myotherapex"],
  529. contents: [
  530. "myotherlib",
  531. ],
  532. hidden_api: {
  533. split_packages: ["*"],
  534. },
  535. }
  536. java_library {
  537. name: "myotherlib",
  538. apex_available: ["myotherapex"],
  539. srcs: ["Test.java"],
  540. min_sdk_version: "2",
  541. permitted_packages: ["myothersdklibrary"],
  542. compile_dex: true,
  543. }
  544. `),
  545. android.FixtureWithRootAndroidBp(`
  546. sdk {
  547. name: "mysdk",
  548. bootclasspath_fragments: ["mybootclasspathfragment"],
  549. }
  550. bootclasspath_fragment {
  551. name: "mybootclasspathfragment",
  552. contents: [
  553. "mysdklibrary",
  554. ],
  555. fragments: [
  556. {
  557. apex: "myotherapex",
  558. module: "myotherbootclasspathfragment"
  559. },
  560. ],
  561. hidden_api: {
  562. split_packages: ["*"],
  563. },
  564. }
  565. java_sdk_library {
  566. name: "mysdklibrary",
  567. srcs: ["Test.java"],
  568. shared_library: false,
  569. public: {enabled: true},
  570. min_sdk_version: "2",
  571. }
  572. `),
  573. ).RunTest(t)
  574. // A preparer to update the test fixture used when processing an unpackage snapshot.
  575. preparerForSnapshot := fixtureAddPrebuiltApexForBootclasspathFragment("myapex", "mybootclasspathfragment")
  576. CheckSnapshot(t, result, "mysdk", "",
  577. checkAndroidBpContents(`
  578. // This is auto-generated. DO NOT EDIT.
  579. prebuilt_bootclasspath_fragment {
  580. name: "mybootclasspathfragment",
  581. prefer: false,
  582. visibility: ["//visibility:public"],
  583. apex_available: ["//apex_available:platform"],
  584. contents: ["mysdklibrary"],
  585. fragments: [
  586. {
  587. apex: "myotherapex",
  588. module: "myotherbootclasspathfragment",
  589. },
  590. ],
  591. hidden_api: {
  592. annotation_flags: "hiddenapi/annotation-flags.csv",
  593. metadata: "hiddenapi/metadata.csv",
  594. index: "hiddenapi/index.csv",
  595. signature_patterns: "hiddenapi/signature-patterns.csv",
  596. filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv",
  597. filtered_flags: "hiddenapi/filtered-flags.csv",
  598. },
  599. }
  600. java_sdk_library_import {
  601. name: "mysdklibrary",
  602. prefer: false,
  603. visibility: ["//visibility:public"],
  604. apex_available: ["//apex_available:platform"],
  605. shared_library: false,
  606. public: {
  607. jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
  608. stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
  609. current_api: "sdk_library/public/mysdklibrary.txt",
  610. removed_api: "sdk_library/public/mysdklibrary-removed.txt",
  611. sdk_version: "current",
  612. },
  613. }
  614. `),
  615. snapshotTestPreparer(checkSnapshotWithoutSource, preparerForSnapshot),
  616. snapshotTestPreparer(checkSnapshotWithSourcePreferred, preparerForSnapshot),
  617. snapshotTestPreparer(checkSnapshotPreferredWithSource, preparerForSnapshot),
  618. )
  619. }
  620. // Test that bootclasspath_fragment works with sdk.
  621. func TestBasicSdkWithBootclasspathFragment(t *testing.T) {
  622. android.GroupFixturePreparers(
  623. prepareForSdkTestWithApex,
  624. prepareForSdkTestWithJava,
  625. android.FixtureMergeMockFs(android.MockFS{
  626. "java/mybootlib.jar": nil,
  627. "hiddenapi/annotation-flags.csv": nil,
  628. "hiddenapi/index.csv": nil,
  629. "hiddenapi/metadata.csv": nil,
  630. "hiddenapi/signature-patterns.csv": nil,
  631. "hiddenapi/filtered-stub-flags.csv": nil,
  632. "hiddenapi/filtered-flags.csv": nil,
  633. }),
  634. android.FixtureWithRootAndroidBp(`
  635. sdk {
  636. name: "mysdk",
  637. bootclasspath_fragments: ["mybootclasspathfragment"],
  638. }
  639. bootclasspath_fragment {
  640. name: "mybootclasspathfragment",
  641. image_name: "art",
  642. contents: ["mybootlib"],
  643. apex_available: ["myapex"],
  644. hidden_api: {
  645. split_packages: ["*"],
  646. },
  647. }
  648. java_library {
  649. name: "mybootlib",
  650. apex_available: ["myapex"],
  651. srcs: ["Test.java"],
  652. system_modules: "none",
  653. sdk_version: "none",
  654. min_sdk_version: "1",
  655. compile_dex: true,
  656. }
  657. prebuilt_bootclasspath_fragment {
  658. name: "mybootclasspathfragment",
  659. prefer: false,
  660. visibility: ["//visibility:public"],
  661. apex_available: [
  662. "myapex",
  663. ],
  664. image_name: "art",
  665. contents: ["mybootlib"],
  666. hidden_api: {
  667. annotation_flags: "hiddenapi/annotation-flags.csv",
  668. metadata: "hiddenapi/metadata.csv",
  669. index: "hiddenapi/index.csv",
  670. signature_patterns: "hiddenapi/signature-patterns.csv",
  671. filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv",
  672. filtered_flags: "hiddenapi/filtered-flags.csv",
  673. },
  674. }
  675. java_import {
  676. name: "mybootlib",
  677. visibility: ["//visibility:public"],
  678. apex_available: ["com.android.art"],
  679. jars: ["java/mybootlib.jar"],
  680. }
  681. `),
  682. ).RunTest(t)
  683. }
  684. func TestSnapshotWithBootclasspathFragment_HiddenAPI(t *testing.T) {
  685. result := android.GroupFixturePreparers(
  686. prepareForSdkTestWithJava,
  687. java.PrepareForTestWithJavaDefaultModules,
  688. java.PrepareForTestWithJavaSdkLibraryFiles,
  689. java.FixtureWithLastReleaseApis("mysdklibrary", "mynewlibrary"),
  690. java.FixtureConfigureApexBootJars("myapex:mybootlib", "myapex:mynewlibrary"),
  691. prepareForSdkTestWithApex,
  692. // Add a platform_bootclasspath that depends on the fragment.
  693. fixtureAddPlatformBootclasspathForBootclasspathFragment("myapex", "mybootclasspathfragment"),
  694. android.MockFS{
  695. "my-blocked.txt": nil,
  696. "my-max-target-o-low-priority.txt": nil,
  697. "my-max-target-p.txt": nil,
  698. "my-max-target-q.txt": nil,
  699. "my-max-target-r-low-priority.txt": nil,
  700. "my-removed.txt": nil,
  701. "my-unsupported-packages.txt": nil,
  702. "my-unsupported.txt": nil,
  703. "my-new-max-target-q.txt": nil,
  704. }.AddToFixture(),
  705. android.FixtureWithRootAndroidBp(`
  706. sdk {
  707. name: "mysdk",
  708. bootclasspath_fragments: ["mybootclasspathfragment"],
  709. }
  710. apex {
  711. name: "myapex",
  712. key: "myapex.key",
  713. min_sdk_version: "1",
  714. bootclasspath_fragments: ["mybootclasspathfragment"],
  715. }
  716. bootclasspath_fragment {
  717. name: "mybootclasspathfragment",
  718. apex_available: ["myapex"],
  719. contents: ["mybootlib", "mynewlibrary"],
  720. api: {
  721. stub_libs: ["mysdklibrary"],
  722. },
  723. hidden_api: {
  724. unsupported: [
  725. "my-unsupported.txt",
  726. ],
  727. removed: [
  728. "my-removed.txt",
  729. ],
  730. max_target_r_low_priority: [
  731. "my-max-target-r-low-priority.txt",
  732. ],
  733. max_target_q: [
  734. "my-max-target-q.txt",
  735. ],
  736. max_target_p: [
  737. "my-max-target-p.txt",
  738. ],
  739. max_target_o_low_priority: [
  740. "my-max-target-o-low-priority.txt",
  741. ],
  742. blocked: [
  743. "my-blocked.txt",
  744. ],
  745. unsupported_packages: [
  746. "my-unsupported-packages.txt",
  747. ],
  748. split_packages: ["sdklibrary"],
  749. package_prefixes: ["sdklibrary.all.mine"],
  750. single_packages: ["sdklibrary.mine"],
  751. },
  752. }
  753. java_library {
  754. name: "mybootlib",
  755. apex_available: ["myapex"],
  756. srcs: ["Test.java"],
  757. system_modules: "none",
  758. sdk_version: "none",
  759. min_sdk_version: "1",
  760. compile_dex: true,
  761. permitted_packages: ["mybootlib"],
  762. }
  763. java_sdk_library {
  764. name: "mysdklibrary",
  765. srcs: ["Test.java"],
  766. compile_dex: true,
  767. public: {enabled: true},
  768. permitted_packages: ["mysdklibrary"],
  769. min_sdk_version: "current",
  770. }
  771. java_sdk_library {
  772. name: "mynewlibrary",
  773. apex_available: ["myapex"],
  774. srcs: ["Test.java"],
  775. min_sdk_version: "10",
  776. compile_dex: true,
  777. public: {enabled: true},
  778. permitted_packages: ["mysdklibrary"],
  779. hidden_api: {
  780. max_target_q: [
  781. "my-new-max-target-q.txt",
  782. ],
  783. split_packages: ["sdklibrary", "newlibrary"],
  784. package_prefixes: ["newlibrary.all.mine"],
  785. single_packages: ["newlibrary.mine"],
  786. },
  787. }
  788. `),
  789. ).RunTest(t)
  790. // A preparer to update the test fixture used when processing an unpackage snapshot.
  791. preparerForSnapshot := fixtureAddPrebuiltApexForBootclasspathFragment("myapex", "mybootclasspathfragment")
  792. CheckSnapshot(t, result, "mysdk", "",
  793. checkAndroidBpContents(`
  794. // This is auto-generated. DO NOT EDIT.
  795. prebuilt_bootclasspath_fragment {
  796. name: "mybootclasspathfragment",
  797. prefer: false,
  798. visibility: ["//visibility:public"],
  799. apex_available: ["myapex"],
  800. contents: [
  801. "mybootlib",
  802. "mynewlibrary",
  803. ],
  804. api: {
  805. stub_libs: ["mysdklibrary"],
  806. },
  807. hidden_api: {
  808. unsupported: ["hiddenapi/my-unsupported.txt"],
  809. removed: ["hiddenapi/my-removed.txt"],
  810. max_target_r_low_priority: ["hiddenapi/my-max-target-r-low-priority.txt"],
  811. max_target_q: [
  812. "hiddenapi/my-max-target-q.txt",
  813. "hiddenapi/my-new-max-target-q.txt",
  814. ],
  815. max_target_p: ["hiddenapi/my-max-target-p.txt"],
  816. max_target_o_low_priority: ["hiddenapi/my-max-target-o-low-priority.txt"],
  817. blocked: ["hiddenapi/my-blocked.txt"],
  818. unsupported_packages: ["hiddenapi/my-unsupported-packages.txt"],
  819. annotation_flags: "hiddenapi/annotation-flags.csv",
  820. metadata: "hiddenapi/metadata.csv",
  821. index: "hiddenapi/index.csv",
  822. signature_patterns: "hiddenapi/signature-patterns.csv",
  823. filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv",
  824. filtered_flags: "hiddenapi/filtered-flags.csv",
  825. },
  826. }
  827. java_import {
  828. name: "mybootlib",
  829. prefer: false,
  830. visibility: ["//visibility:public"],
  831. apex_available: ["myapex"],
  832. jars: ["java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar"],
  833. min_sdk_version: "1",
  834. permitted_packages: ["mybootlib"],
  835. }
  836. java_sdk_library_import {
  837. name: "mynewlibrary",
  838. prefer: false,
  839. visibility: ["//visibility:public"],
  840. apex_available: ["myapex"],
  841. shared_library: true,
  842. compile_dex: true,
  843. permitted_packages: ["mysdklibrary"],
  844. public: {
  845. jars: ["sdk_library/public/mynewlibrary-stubs.jar"],
  846. stub_srcs: ["sdk_library/public/mynewlibrary_stub_sources"],
  847. current_api: "sdk_library/public/mynewlibrary.txt",
  848. removed_api: "sdk_library/public/mynewlibrary-removed.txt",
  849. sdk_version: "current",
  850. },
  851. }
  852. java_sdk_library_import {
  853. name: "mysdklibrary",
  854. prefer: false,
  855. visibility: ["//visibility:public"],
  856. apex_available: ["//apex_available:platform"],
  857. shared_library: true,
  858. compile_dex: true,
  859. permitted_packages: ["mysdklibrary"],
  860. public: {
  861. jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
  862. stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
  863. current_api: "sdk_library/public/mysdklibrary.txt",
  864. removed_api: "sdk_library/public/mysdklibrary-removed.txt",
  865. sdk_version: "current",
  866. },
  867. }
  868. `),
  869. checkAllCopyRules(`
  870. my-unsupported.txt -> hiddenapi/my-unsupported.txt
  871. my-removed.txt -> hiddenapi/my-removed.txt
  872. my-max-target-r-low-priority.txt -> hiddenapi/my-max-target-r-low-priority.txt
  873. my-max-target-q.txt -> hiddenapi/my-max-target-q.txt
  874. my-new-max-target-q.txt -> hiddenapi/my-new-max-target-q.txt
  875. my-max-target-p.txt -> hiddenapi/my-max-target-p.txt
  876. my-max-target-o-low-priority.txt -> hiddenapi/my-max-target-o-low-priority.txt
  877. my-blocked.txt -> hiddenapi/my-blocked.txt
  878. my-unsupported-packages.txt -> hiddenapi/my-unsupported-packages.txt
  879. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv
  880. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv
  881. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/index.csv -> hiddenapi/index.csv
  882. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/signature-patterns.csv -> hiddenapi/signature-patterns.csv
  883. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/filtered-stub-flags.csv -> hiddenapi/filtered-stub-flags.csv
  884. .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/filtered-flags.csv -> hiddenapi/filtered-flags.csv
  885. .intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar
  886. .intermediates/mynewlibrary.stubs/android_common/combined/mynewlibrary.stubs.jar -> sdk_library/public/mynewlibrary-stubs.jar
  887. .intermediates/mynewlibrary.stubs.source/android_common/metalava/mynewlibrary.stubs.source_api.txt -> sdk_library/public/mynewlibrary.txt
  888. .intermediates/mynewlibrary.stubs.source/android_common/metalava/mynewlibrary.stubs.source_removed.txt -> sdk_library/public/mynewlibrary-removed.txt
  889. .intermediates/mysdklibrary.stubs/android_common/combined/mysdklibrary.stubs.jar -> sdk_library/public/mysdklibrary-stubs.jar
  890. .intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt
  891. .intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_removed.txt -> sdk_library/public/mysdklibrary-removed.txt
  892. `),
  893. snapshotTestPreparer(checkSnapshotWithoutSource, preparerForSnapshot),
  894. snapshotTestPreparer(checkSnapshotWithSourcePreferred, preparerForSnapshot),
  895. snapshotTestPreparer(checkSnapshotPreferredWithSource, preparerForSnapshot),
  896. )
  897. }
  898. func testSnapshotWithBootClasspathFragment_MinSdkVersion(t *testing.T, targetBuildRelease string,
  899. expectedSdkSnapshot string,
  900. expectedCopyRules string,
  901. expectedStubFlagsInputs []string,
  902. suffix string) {
  903. result := android.GroupFixturePreparers(
  904. prepareForSdkTestWithJava,
  905. java.PrepareForTestWithJavaDefaultModules,
  906. java.PrepareForTestWithJavaSdkLibraryFiles,
  907. java.FixtureWithLastReleaseApis("mysdklibrary", "mynewsdklibrary"),
  908. java.FixtureConfigureApexBootJars("myapex:mysdklibrary", "myapex:mynewsdklibrary"),
  909. prepareForSdkTestWithApex,
  910. // Add a platform_bootclasspath that depends on the fragment.
  911. fixtureAddPlatformBootclasspathForBootclasspathFragment("myapex", "mybootclasspathfragment"),
  912. android.FixtureMergeEnv(map[string]string{
  913. "SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE": targetBuildRelease,
  914. }),
  915. android.FixtureWithRootAndroidBp(`
  916. sdk {
  917. name: "mysdk",
  918. apexes: ["myapex"],
  919. }
  920. apex {
  921. name: "myapex",
  922. key: "myapex.key",
  923. min_sdk_version: "S",
  924. bootclasspath_fragments: ["mybootclasspathfragment"],
  925. }
  926. bootclasspath_fragment {
  927. name: "mybootclasspathfragment",
  928. apex_available: ["myapex"],
  929. contents: [
  930. "mysdklibrary",
  931. "mynewsdklibrary",
  932. ],
  933. hidden_api: {
  934. split_packages: [],
  935. },
  936. }
  937. java_sdk_library {
  938. name: "mysdklibrary",
  939. apex_available: ["myapex"],
  940. srcs: ["Test.java"],
  941. shared_library: false,
  942. public: {enabled: true},
  943. min_sdk_version: "S",
  944. }
  945. java_sdk_library {
  946. name: "mynewsdklibrary",
  947. apex_available: ["myapex"],
  948. srcs: ["Test.java"],
  949. compile_dex: true,
  950. public: {enabled: true},
  951. min_sdk_version: "Tiramisu",
  952. permitted_packages: ["mynewsdklibrary"],
  953. }
  954. `),
  955. ).RunTest(t)
  956. bcpf := result.ModuleForTests("mybootclasspathfragment", "android_common")
  957. rule := bcpf.Output("out/soong/.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi" + suffix + "/stub-flags.csv")
  958. android.AssertPathsRelativeToTopEquals(t, "stub flags inputs", expectedStubFlagsInputs, rule.Implicits)
  959. CheckSnapshot(t, result, "mysdk", "",
  960. checkAndroidBpContents(expectedSdkSnapshot),
  961. checkAllCopyRules(expectedCopyRules),
  962. )
  963. }
  964. func TestSnapshotWithBootClasspathFragment_MinSdkVersion(t *testing.T) {
  965. t.Run("target S build", func(t *testing.T) {
  966. expectedSnapshot := `
  967. // This is auto-generated. DO NOT EDIT.
  968. prebuilt_bootclasspath_fragment {
  969. name: "mybootclasspathfragment",
  970. prefer: false,
  971. visibility: ["//visibility:public"],
  972. apex_available: ["myapex"],
  973. contents: ["mysdklibrary"],
  974. hidden_api: {
  975. annotation_flags: "hiddenapi/annotation-flags.csv",
  976. metadata: "hiddenapi/metadata.csv",
  977. index: "hiddenapi/index.csv",
  978. stub_flags: "hiddenapi/stub-flags.csv",
  979. all_flags: "hiddenapi/all-flags.csv",
  980. },
  981. }
  982. java_sdk_library_import {
  983. name: "mysdklibrary",
  984. prefer: false,
  985. visibility: ["//visibility:public"],
  986. apex_available: ["myapex"],
  987. shared_library: false,
  988. public: {
  989. jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
  990. stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
  991. current_api: "sdk_library/public/mysdklibrary.txt",
  992. removed_api: "sdk_library/public/mysdklibrary-removed.txt",
  993. sdk_version: "current",
  994. },
  995. }
  996. `
  997. expectedCopyRules := `
  998. .intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi-for-sdk-snapshot/annotation-flags.csv -> hiddenapi/annotation-flags.csv
  999. .intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi-for-sdk-snapshot/metadata.csv -> hiddenapi/metadata.csv
  1000. .intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi-for-sdk-snapshot/index.csv -> hiddenapi/index.csv
  1001. .intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi-for-sdk-snapshot/stub-flags.csv -> hiddenapi/stub-flags.csv
  1002. .intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi-for-sdk-snapshot/all-flags.csv -> hiddenapi/all-flags.csv
  1003. .intermediates/mysdklibrary.stubs/android_common/combined/mysdklibrary.stubs.jar -> sdk_library/public/mysdklibrary-stubs.jar
  1004. .intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt
  1005. .intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_removed.txt -> sdk_library/public/mysdklibrary-removed.txt
  1006. `
  1007. // On S the stub flags should only be generated from mysdklibrary as mynewsdklibrary is not part
  1008. // of the snapshot.
  1009. expectedStubFlagsInputs := []string{
  1010. "out/soong/.intermediates/mysdklibrary.stubs/android_common/dex/mysdklibrary.stubs.jar",
  1011. "out/soong/.intermediates/mysdklibrary/android_common/aligned/mysdklibrary.jar",
  1012. }
  1013. testSnapshotWithBootClasspathFragment_MinSdkVersion(t, "S",
  1014. expectedSnapshot, expectedCopyRules, expectedStubFlagsInputs, "-for-sdk-snapshot")
  1015. })
  1016. t.Run("target-Tiramisu-build", func(t *testing.T) {
  1017. expectedSnapshot := `
  1018. // This is auto-generated. DO NOT EDIT.
  1019. prebuilt_bootclasspath_fragment {
  1020. name: "mybootclasspathfragment",
  1021. prefer: false,
  1022. visibility: ["//visibility:public"],
  1023. apex_available: ["myapex"],
  1024. contents: [
  1025. "mysdklibrary",
  1026. "mynewsdklibrary",
  1027. ],
  1028. hidden_api: {
  1029. annotation_flags: "hiddenapi/annotation-flags.csv",
  1030. metadata: "hiddenapi/metadata.csv",
  1031. index: "hiddenapi/index.csv",
  1032. signature_patterns: "hiddenapi/signature-patterns.csv",
  1033. filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv",
  1034. filtered_flags: "hiddenapi/filtered-flags.csv",
  1035. },
  1036. }
  1037. java_sdk_library_import {
  1038. name: "mysdklibrary",
  1039. prefer: false,
  1040. visibility: ["//visibility:public"],
  1041. apex_available: ["myapex"],
  1042. shared_library: false,
  1043. public: {
  1044. jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
  1045. stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
  1046. current_api: "sdk_library/public/mysdklibrary.txt",
  1047. removed_api: "sdk_library/public/mysdklibrary-removed.txt",
  1048. sdk_version: "current",
  1049. },
  1050. }
  1051. java_sdk_library_import {
  1052. name: "mynewsdklibrary",
  1053. prefer: false,
  1054. visibility: ["//visibility:public"],
  1055. apex_available: ["myapex"],
  1056. shared_library: true,
  1057. compile_dex: true,
  1058. permitted_packages: ["mynewsdklibrary"],
  1059. public: {
  1060. jars: ["sdk_library/public/mynewsdklibrary-stubs.jar"],
  1061. stub_srcs: ["sdk_library/public/mynewsdklibrary_stub_sources"],
  1062. current_api: "sdk_library/public/mynewsdklibrary.txt",
  1063. removed_api: "sdk_library/public/mynewsdklibrary-removed.txt",
  1064. sdk_version: "current",
  1065. },
  1066. }
  1067. `
  1068. expectedCopyRules := `
  1069. .intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv
  1070. .intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv
  1071. .intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/index.csv -> hiddenapi/index.csv
  1072. .intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/signature-patterns.csv -> hiddenapi/signature-patterns.csv
  1073. .intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/filtered-stub-flags.csv -> hiddenapi/filtered-stub-flags.csv
  1074. .intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/filtered-flags.csv -> hiddenapi/filtered-flags.csv
  1075. .intermediates/mysdklibrary.stubs/android_common/combined/mysdklibrary.stubs.jar -> sdk_library/public/mysdklibrary-stubs.jar
  1076. .intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt
  1077. .intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_removed.txt -> sdk_library/public/mysdklibrary-removed.txt
  1078. .intermediates/mynewsdklibrary.stubs/android_common/combined/mynewsdklibrary.stubs.jar -> sdk_library/public/mynewsdklibrary-stubs.jar
  1079. .intermediates/mynewsdklibrary.stubs.source/android_common/metalava/mynewsdklibrary.stubs.source_api.txt -> sdk_library/public/mynewsdklibrary.txt
  1080. .intermediates/mynewsdklibrary.stubs.source/android_common/metalava/mynewsdklibrary.stubs.source_removed.txt -> sdk_library/public/mynewsdklibrary-removed.txt
  1081. `
  1082. // On tiramisu the stub flags should be generated from both mynewsdklibrary and mysdklibrary as
  1083. // they are both part of the snapshot.
  1084. expectedStubFlagsInputs := []string{
  1085. "out/soong/.intermediates/mynewsdklibrary.stubs/android_common/dex/mynewsdklibrary.stubs.jar",
  1086. "out/soong/.intermediates/mynewsdklibrary/android_common/aligned/mynewsdklibrary.jar",
  1087. "out/soong/.intermediates/mysdklibrary.stubs/android_common/dex/mysdklibrary.stubs.jar",
  1088. "out/soong/.intermediates/mysdklibrary/android_common/aligned/mysdklibrary.jar",
  1089. }
  1090. testSnapshotWithBootClasspathFragment_MinSdkVersion(t, "Tiramisu",
  1091. expectedSnapshot, expectedCopyRules, expectedStubFlagsInputs, "")
  1092. })
  1093. }
  1094. func TestSnapshotWithEmptyBootClasspathFragment(t *testing.T) {
  1095. result := android.GroupFixturePreparers(
  1096. prepareForSdkTestWithJava,
  1097. java.PrepareForTestWithJavaDefaultModules,
  1098. java.PrepareForTestWithJavaSdkLibraryFiles,
  1099. java.FixtureWithLastReleaseApis("mysdklibrary", "mynewsdklibrary"),
  1100. java.FixtureConfigureApexBootJars("myapex:mysdklibrary", "myapex:mynewsdklibrary"),
  1101. prepareForSdkTestWithApex,
  1102. // Add a platform_bootclasspath that depends on the fragment.
  1103. fixtureAddPlatformBootclasspathForBootclasspathFragment("myapex", "mybootclasspathfragment"),
  1104. android.FixtureMergeEnv(map[string]string{
  1105. "SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE": "S",
  1106. }),
  1107. android.FixtureWithRootAndroidBp(`
  1108. sdk {
  1109. name: "mysdk",
  1110. apexes: ["myapex"],
  1111. }
  1112. apex {
  1113. name: "myapex",
  1114. key: "myapex.key",
  1115. min_sdk_version: "S",
  1116. bootclasspath_fragments: ["mybootclasspathfragment"],
  1117. }
  1118. bootclasspath_fragment {
  1119. name: "mybootclasspathfragment",
  1120. apex_available: ["myapex"],
  1121. contents: ["mysdklibrary", "mynewsdklibrary"],
  1122. hidden_api: {
  1123. split_packages: [],
  1124. },
  1125. }
  1126. java_sdk_library {
  1127. name: "mysdklibrary",
  1128. apex_available: ["myapex"],
  1129. srcs: ["Test.java"],
  1130. shared_library: false,
  1131. public: {enabled: true},
  1132. min_sdk_version: "Tiramisu",
  1133. }
  1134. java_sdk_library {
  1135. name: "mynewsdklibrary",
  1136. apex_available: ["myapex"],
  1137. srcs: ["Test.java"],
  1138. compile_dex: true,
  1139. public: {enabled: true},
  1140. min_sdk_version: "Tiramisu",
  1141. permitted_packages: ["mynewsdklibrary"],
  1142. }
  1143. `),
  1144. ).RunTest(t)
  1145. CheckSnapshot(t, result, "mysdk", "", checkAndroidBpContents(`// This is auto-generated. DO NOT EDIT.`))
  1146. }