systemserver_classpath_fragment_test.go 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452
  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 apex
  15. import (
  16. "strings"
  17. "testing"
  18. "android/soong/android"
  19. "android/soong/dexpreopt"
  20. "android/soong/java"
  21. )
  22. var prepareForTestWithSystemserverclasspathFragment = android.GroupFixturePreparers(
  23. java.PrepareForTestWithDexpreopt,
  24. PrepareForTestWithApexBuildComponents,
  25. )
  26. func TestSystemserverclasspathFragmentContents(t *testing.T) {
  27. result := android.GroupFixturePreparers(
  28. prepareForTestWithSystemserverclasspathFragment,
  29. prepareForTestWithMyapex,
  30. dexpreopt.FixtureSetApexSystemServerJars("myapex:foo", "myapex:bar", "myapex:baz"),
  31. ).RunTestWithBp(t, `
  32. apex {
  33. name: "myapex",
  34. key: "myapex.key",
  35. systemserverclasspath_fragments: [
  36. "mysystemserverclasspathfragment",
  37. ],
  38. updatable: false,
  39. }
  40. apex_key {
  41. name: "myapex.key",
  42. public_key: "testkey.avbpubkey",
  43. private_key: "testkey.pem",
  44. }
  45. java_library {
  46. name: "foo",
  47. srcs: ["b.java"],
  48. installable: true,
  49. apex_available: [
  50. "myapex",
  51. ],
  52. }
  53. java_library {
  54. name: "bar",
  55. srcs: ["c.java"],
  56. installable: true,
  57. dex_preopt: {
  58. profile: "bar-art-profile",
  59. },
  60. apex_available: [
  61. "myapex",
  62. ],
  63. }
  64. java_library {
  65. name: "baz",
  66. srcs: ["d.java"],
  67. installable: true,
  68. dex_preopt: {
  69. profile_guided: true, // ignored
  70. },
  71. apex_available: [
  72. "myapex",
  73. ],
  74. }
  75. systemserverclasspath_fragment {
  76. name: "mysystemserverclasspathfragment",
  77. contents: [
  78. "foo",
  79. "bar",
  80. "baz",
  81. ],
  82. apex_available: [
  83. "myapex",
  84. ],
  85. }
  86. `)
  87. ctx := result.TestContext
  88. ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
  89. "etc/classpaths/systemserverclasspath.pb",
  90. "javalib/foo.jar",
  91. "javalib/bar.jar",
  92. "javalib/bar.jar.prof",
  93. "javalib/baz.jar",
  94. })
  95. java.CheckModuleDependencies(t, ctx, "myapex", "android_common_myapex_image", []string{
  96. `myapex.key`,
  97. `mysystemserverclasspathfragment`,
  98. })
  99. assertProfileGuided(t, ctx, "foo", "android_common_apex10000", false)
  100. assertProfileGuided(t, ctx, "bar", "android_common_apex10000", true)
  101. assertProfileGuided(t, ctx, "baz", "android_common_apex10000", false)
  102. }
  103. func TestSystemserverclasspathFragmentNoGeneratedProto(t *testing.T) {
  104. result := android.GroupFixturePreparers(
  105. prepareForTestWithSystemserverclasspathFragment,
  106. prepareForTestWithMyapex,
  107. dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
  108. ).RunTestWithBp(t, `
  109. apex {
  110. name: "myapex",
  111. key: "myapex.key",
  112. systemserverclasspath_fragments: [
  113. "mysystemserverclasspathfragment",
  114. ],
  115. updatable: false,
  116. }
  117. apex_key {
  118. name: "myapex.key",
  119. public_key: "testkey.avbpubkey",
  120. private_key: "testkey.pem",
  121. }
  122. java_library {
  123. name: "foo",
  124. srcs: ["b.java"],
  125. installable: true,
  126. apex_available: [
  127. "myapex",
  128. ],
  129. }
  130. systemserverclasspath_fragment {
  131. name: "mysystemserverclasspathfragment",
  132. generate_classpaths_proto: false,
  133. contents: [
  134. "foo",
  135. ],
  136. apex_available: [
  137. "myapex",
  138. ],
  139. }
  140. `)
  141. ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
  142. "javalib/foo.jar",
  143. })
  144. java.CheckModuleDependencies(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
  145. `myapex.key`,
  146. `mysystemserverclasspathfragment`,
  147. })
  148. }
  149. func TestSystemServerClasspathFragmentWithContentNotInMake(t *testing.T) {
  150. android.GroupFixturePreparers(
  151. prepareForTestWithSystemserverclasspathFragment,
  152. prepareForTestWithMyapex,
  153. dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
  154. ).
  155. ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
  156. `in contents must also be declared in PRODUCT_APEX_SYSTEM_SERVER_JARS`)).
  157. RunTestWithBp(t, `
  158. apex {
  159. name: "myapex",
  160. key: "myapex.key",
  161. systemserverclasspath_fragments: [
  162. "mysystemserverclasspathfragment",
  163. ],
  164. updatable: false,
  165. }
  166. apex_key {
  167. name: "myapex.key",
  168. public_key: "testkey.avbpubkey",
  169. private_key: "testkey.pem",
  170. }
  171. java_library {
  172. name: "foo",
  173. srcs: ["b.java"],
  174. installable: true,
  175. apex_available: ["myapex"],
  176. }
  177. java_library {
  178. name: "bar",
  179. srcs: ["b.java"],
  180. installable: true,
  181. apex_available: ["myapex"],
  182. }
  183. systemserverclasspath_fragment {
  184. name: "mysystemserverclasspathfragment",
  185. contents: [
  186. "foo",
  187. "bar",
  188. ],
  189. apex_available: [
  190. "myapex",
  191. ],
  192. }
  193. `)
  194. }
  195. func TestPrebuiltSystemserverclasspathFragmentContents(t *testing.T) {
  196. result := android.GroupFixturePreparers(
  197. prepareForTestWithSystemserverclasspathFragment,
  198. prepareForTestWithMyapex,
  199. dexpreopt.FixtureSetApexSystemServerJars("myapex:foo", "myapex:bar"),
  200. ).RunTestWithBp(t, `
  201. prebuilt_apex {
  202. name: "myapex",
  203. arch: {
  204. arm64: {
  205. src: "myapex-arm64.apex",
  206. },
  207. arm: {
  208. src: "myapex-arm.apex",
  209. },
  210. },
  211. exported_systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
  212. }
  213. java_import {
  214. name: "foo",
  215. jars: ["foo.jar"],
  216. apex_available: [
  217. "myapex",
  218. ],
  219. }
  220. java_import {
  221. name: "bar",
  222. jars: ["bar.jar"],
  223. dex_preopt: {
  224. profile_guided: true,
  225. },
  226. apex_available: [
  227. "myapex",
  228. ],
  229. }
  230. prebuilt_systemserverclasspath_fragment {
  231. name: "mysystemserverclasspathfragment",
  232. prefer: true,
  233. contents: [
  234. "foo",
  235. "bar",
  236. ],
  237. apex_available: [
  238. "myapex",
  239. ],
  240. }
  241. `)
  242. ctx := result.TestContext
  243. java.CheckModuleDependencies(t, ctx, "myapex", "android_common_myapex", []string{
  244. `myapex.apex.selector`,
  245. `prebuilt_mysystemserverclasspathfragment`,
  246. })
  247. java.CheckModuleDependencies(t, ctx, "mysystemserverclasspathfragment", "android_common_myapex", []string{
  248. `myapex.deapexer`,
  249. `prebuilt_bar`,
  250. `prebuilt_foo`,
  251. })
  252. ensureExactDeapexedContents(t, ctx, "myapex", "android_common", []string{
  253. "javalib/foo.jar",
  254. "javalib/bar.jar",
  255. "javalib/bar.jar.prof",
  256. })
  257. assertProfileGuided(t, ctx, "foo", "android_common_myapex", false)
  258. assertProfileGuided(t, ctx, "bar", "android_common_myapex", true)
  259. }
  260. func TestSystemserverclasspathFragmentStandaloneContents(t *testing.T) {
  261. result := android.GroupFixturePreparers(
  262. prepareForTestWithSystemserverclasspathFragment,
  263. prepareForTestWithMyapex,
  264. dexpreopt.FixtureSetApexStandaloneSystemServerJars("myapex:foo", "myapex:bar", "myapex:baz"),
  265. ).RunTestWithBp(t, `
  266. apex {
  267. name: "myapex",
  268. key: "myapex.key",
  269. systemserverclasspath_fragments: [
  270. "mysystemserverclasspathfragment",
  271. ],
  272. updatable: false,
  273. }
  274. apex_key {
  275. name: "myapex.key",
  276. public_key: "testkey.avbpubkey",
  277. private_key: "testkey.pem",
  278. }
  279. java_library {
  280. name: "foo",
  281. srcs: ["b.java"],
  282. installable: true,
  283. apex_available: [
  284. "myapex",
  285. ],
  286. }
  287. java_library {
  288. name: "bar",
  289. srcs: ["c.java"],
  290. dex_preopt: {
  291. profile: "bar-art-profile",
  292. },
  293. installable: true,
  294. apex_available: [
  295. "myapex",
  296. ],
  297. }
  298. java_library {
  299. name: "baz",
  300. srcs: ["d.java"],
  301. dex_preopt: {
  302. profile_guided: true, // ignored
  303. },
  304. installable: true,
  305. apex_available: [
  306. "myapex",
  307. ],
  308. }
  309. systemserverclasspath_fragment {
  310. name: "mysystemserverclasspathfragment",
  311. standalone_contents: [
  312. "foo",
  313. "bar",
  314. "baz",
  315. ],
  316. apex_available: [
  317. "myapex",
  318. ],
  319. }
  320. `)
  321. ctx := result.TestContext
  322. ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
  323. "etc/classpaths/systemserverclasspath.pb",
  324. "javalib/foo.jar",
  325. "javalib/bar.jar",
  326. "javalib/bar.jar.prof",
  327. "javalib/baz.jar",
  328. })
  329. assertProfileGuided(t, ctx, "foo", "android_common_apex10000", false)
  330. assertProfileGuided(t, ctx, "bar", "android_common_apex10000", true)
  331. assertProfileGuided(t, ctx, "baz", "android_common_apex10000", false)
  332. }
  333. func TestPrebuiltStandaloneSystemserverclasspathFragmentContents(t *testing.T) {
  334. result := android.GroupFixturePreparers(
  335. prepareForTestWithSystemserverclasspathFragment,
  336. prepareForTestWithMyapex,
  337. dexpreopt.FixtureSetApexStandaloneSystemServerJars("myapex:foo", "myapex:bar"),
  338. ).RunTestWithBp(t, `
  339. prebuilt_apex {
  340. name: "myapex",
  341. arch: {
  342. arm64: {
  343. src: "myapex-arm64.apex",
  344. },
  345. arm: {
  346. src: "myapex-arm.apex",
  347. },
  348. },
  349. exported_systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
  350. }
  351. java_import {
  352. name: "foo",
  353. jars: ["foo.jar"],
  354. apex_available: [
  355. "myapex",
  356. ],
  357. }
  358. java_import {
  359. name: "bar",
  360. jars: ["bar.jar"],
  361. dex_preopt: {
  362. profile_guided: true,
  363. },
  364. apex_available: [
  365. "myapex",
  366. ],
  367. }
  368. prebuilt_systemserverclasspath_fragment {
  369. name: "mysystemserverclasspathfragment",
  370. prefer: true,
  371. standalone_contents: [
  372. "foo",
  373. "bar",
  374. ],
  375. apex_available: [
  376. "myapex",
  377. ],
  378. }
  379. `)
  380. ctx := result.TestContext
  381. java.CheckModuleDependencies(t, ctx, "mysystemserverclasspathfragment", "android_common_myapex", []string{
  382. `myapex.deapexer`,
  383. `prebuilt_bar`,
  384. `prebuilt_foo`,
  385. })
  386. ensureExactDeapexedContents(t, ctx, "myapex", "android_common", []string{
  387. "javalib/foo.jar",
  388. "javalib/bar.jar",
  389. "javalib/bar.jar.prof",
  390. })
  391. assertProfileGuided(t, ctx, "foo", "android_common_myapex", false)
  392. assertProfileGuided(t, ctx, "bar", "android_common_myapex", true)
  393. }
  394. func assertProfileGuided(t *testing.T, ctx *android.TestContext, moduleName string, variant string, expected bool) {
  395. dexpreopt := ctx.ModuleForTests(moduleName, variant).Rule("dexpreopt")
  396. actual := strings.Contains(dexpreopt.RuleParams.Command, "--profile-file=")
  397. if expected != actual {
  398. t.Fatalf("Expected profile-guided to be %v, got %v", expected, actual)
  399. }
  400. }