app_import_test.go 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807
  1. // Copyright 2020 Google Inc. All rights reserved.
  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 java
  15. import (
  16. "fmt"
  17. "reflect"
  18. "regexp"
  19. "strings"
  20. "testing"
  21. "github.com/google/blueprint/proptools"
  22. "android/soong/android"
  23. )
  24. func TestAndroidAppImport(t *testing.T) {
  25. ctx, _ := testJava(t, `
  26. android_app_import {
  27. name: "foo",
  28. apk: "prebuilts/apk/app.apk",
  29. certificate: "platform",
  30. dex_preopt: {
  31. enabled: true,
  32. },
  33. }
  34. `)
  35. variant := ctx.ModuleForTests("foo", "android_common")
  36. // Check dexpreopt outputs.
  37. if variant.MaybeOutput("dexpreopt/oat/arm64/package.vdex").Rule == nil ||
  38. variant.MaybeOutput("dexpreopt/oat/arm64/package.odex").Rule == nil {
  39. t.Errorf("can't find dexpreopt outputs")
  40. }
  41. // Check cert signing flag.
  42. signedApk := variant.Output("signed/foo.apk")
  43. signingFlag := signedApk.Args["certificates"]
  44. expected := "build/make/target/product/security/platform.x509.pem build/make/target/product/security/platform.pk8"
  45. if expected != signingFlag {
  46. t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected, signingFlag)
  47. }
  48. rule := variant.Rule("genProvenanceMetaData")
  49. android.AssertStringEquals(t, "Invalid input", "prebuilts/apk/app.apk", rule.Inputs[0].String())
  50. android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", rule.Output.String())
  51. android.AssertStringEquals(t, "Invalid args", "foo", rule.Args["module_name"])
  52. android.AssertStringEquals(t, "Invalid args", "/system/app/foo/foo.apk", rule.Args["install_path"])
  53. }
  54. func TestAndroidAppImport_NoDexPreopt(t *testing.T) {
  55. ctx, _ := testJava(t, `
  56. android_app_import {
  57. name: "foo",
  58. apk: "prebuilts/apk/app.apk",
  59. certificate: "platform",
  60. dex_preopt: {
  61. enabled: false,
  62. },
  63. }
  64. `)
  65. variant := ctx.ModuleForTests("foo", "android_common")
  66. // Check dexpreopt outputs. They shouldn't exist.
  67. if variant.MaybeOutput("dexpreopt/oat/arm64/package.vdex").Rule != nil ||
  68. variant.MaybeOutput("dexpreopt/oat/arm64/package.odex").Rule != nil {
  69. t.Errorf("dexpreopt shouldn't have run.")
  70. }
  71. rule := variant.Rule("genProvenanceMetaData")
  72. android.AssertStringEquals(t, "Invalid input", "prebuilts/apk/app.apk", rule.Inputs[0].String())
  73. android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", rule.Output.String())
  74. android.AssertStringEquals(t, "Invalid args", "foo", rule.Args["module_name"])
  75. android.AssertStringEquals(t, "Invalid args", "/system/app/foo/foo.apk", rule.Args["install_path"])
  76. }
  77. func TestAndroidAppImport_Presigned(t *testing.T) {
  78. ctx, _ := testJava(t, `
  79. android_app_import {
  80. name: "foo",
  81. apk: "prebuilts/apk/app.apk",
  82. presigned: true,
  83. dex_preopt: {
  84. enabled: true,
  85. },
  86. }
  87. `)
  88. variant := ctx.ModuleForTests("foo", "android_common")
  89. // Check dexpreopt outputs.
  90. if variant.MaybeOutput("dexpreopt/oat/arm64/package.vdex").Rule == nil ||
  91. variant.MaybeOutput("dexpreopt/oat/arm64/package.odex").Rule == nil {
  92. t.Errorf("can't find dexpreopt outputs")
  93. }
  94. // Make sure signing was skipped and aligning was done.
  95. if variant.MaybeOutput("signed/foo.apk").Rule != nil {
  96. t.Errorf("signing rule shouldn't be included.")
  97. }
  98. if variant.MaybeOutput("zip-aligned/foo.apk").Rule == nil {
  99. t.Errorf("can't find aligning rule")
  100. }
  101. rule := variant.Rule("genProvenanceMetaData")
  102. android.AssertStringEquals(t, "Invalid input", "prebuilts/apk/app.apk", rule.Inputs[0].String())
  103. android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", rule.Output.String())
  104. android.AssertStringEquals(t, "Invalid args", "foo", rule.Args["module_name"])
  105. android.AssertStringEquals(t, "Invalid args", "/system/app/foo/foo.apk", rule.Args["install_path"])
  106. }
  107. func TestAndroidAppImport_SigningLineage(t *testing.T) {
  108. ctx, _ := testJava(t, `
  109. android_app_import {
  110. name: "foo",
  111. apk: "prebuilts/apk/app.apk",
  112. certificate: "platform",
  113. additional_certificates: [":additional_certificate"],
  114. lineage: "lineage.bin",
  115. }
  116. android_app_certificate {
  117. name: "additional_certificate",
  118. certificate: "cert/additional_cert",
  119. }
  120. `)
  121. variant := ctx.ModuleForTests("foo", "android_common")
  122. signedApk := variant.Output("signed/foo.apk")
  123. // Check certificates
  124. certificatesFlag := signedApk.Args["certificates"]
  125. expected := "build/make/target/product/security/platform.x509.pem " +
  126. "build/make/target/product/security/platform.pk8 " +
  127. "cert/additional_cert.x509.pem cert/additional_cert.pk8"
  128. if expected != certificatesFlag {
  129. t.Errorf("Incorrect certificates flags, expected: %q, got: %q", expected, certificatesFlag)
  130. }
  131. // Check cert signing lineage flag.
  132. signingFlag := signedApk.Args["flags"]
  133. expected = "--lineage lineage.bin"
  134. if expected != signingFlag {
  135. t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected, signingFlag)
  136. }
  137. rule := variant.Rule("genProvenanceMetaData")
  138. android.AssertStringEquals(t, "Invalid input", "prebuilts/apk/app.apk", rule.Inputs[0].String())
  139. android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", rule.Output.String())
  140. android.AssertStringEquals(t, "Invalid args", "foo", rule.Args["module_name"])
  141. android.AssertStringEquals(t, "Invalid args", "/system/app/foo/foo.apk", rule.Args["install_path"])
  142. }
  143. func TestAndroidAppImport_SigningLineageFilegroup(t *testing.T) {
  144. ctx, _ := testJava(t, `
  145. android_app_import {
  146. name: "foo",
  147. apk: "prebuilts/apk/app.apk",
  148. certificate: "platform",
  149. lineage: ":lineage_bin",
  150. }
  151. filegroup {
  152. name: "lineage_bin",
  153. srcs: ["lineage.bin"],
  154. }
  155. `)
  156. variant := ctx.ModuleForTests("foo", "android_common")
  157. signedApk := variant.Output("signed/foo.apk")
  158. // Check cert signing lineage flag.
  159. signingFlag := signedApk.Args["flags"]
  160. expected := "--lineage lineage.bin"
  161. if expected != signingFlag {
  162. t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected, signingFlag)
  163. }
  164. rule := variant.Rule("genProvenanceMetaData")
  165. android.AssertStringEquals(t, "Invalid input", "prebuilts/apk/app.apk", rule.Inputs[0].String())
  166. android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", rule.Output.String())
  167. android.AssertStringEquals(t, "Invalid args", "foo", rule.Args["module_name"])
  168. android.AssertStringEquals(t, "Invalid args", "/system/app/foo/foo.apk", rule.Args["install_path"])
  169. }
  170. func TestAndroidAppImport_DefaultDevCert(t *testing.T) {
  171. ctx, _ := testJava(t, `
  172. android_app_import {
  173. name: "foo",
  174. apk: "prebuilts/apk/app.apk",
  175. default_dev_cert: true,
  176. dex_preopt: {
  177. enabled: true,
  178. },
  179. }
  180. `)
  181. variant := ctx.ModuleForTests("foo", "android_common")
  182. // Check dexpreopt outputs.
  183. if variant.MaybeOutput("dexpreopt/oat/arm64/package.vdex").Rule == nil ||
  184. variant.MaybeOutput("dexpreopt/oat/arm64/package.odex").Rule == nil {
  185. t.Errorf("can't find dexpreopt outputs")
  186. }
  187. // Check cert signing flag.
  188. signedApk := variant.Output("signed/foo.apk")
  189. signingFlag := signedApk.Args["certificates"]
  190. expected := "build/make/target/product/security/testkey.x509.pem build/make/target/product/security/testkey.pk8"
  191. if expected != signingFlag {
  192. t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected, signingFlag)
  193. }
  194. rule := variant.Rule("genProvenanceMetaData")
  195. android.AssertStringEquals(t, "Invalid input", "prebuilts/apk/app.apk", rule.Inputs[0].String())
  196. android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", rule.Output.String())
  197. android.AssertStringEquals(t, "Invalid args", "foo", rule.Args["module_name"])
  198. android.AssertStringEquals(t, "Invalid args", "/system/app/foo/foo.apk", rule.Args["install_path"])
  199. }
  200. func TestAndroidAppImport_DpiVariants(t *testing.T) {
  201. bp := `
  202. android_app_import {
  203. name: "foo",
  204. apk: "prebuilts/apk/app.apk",
  205. dpi_variants: {
  206. xhdpi: {
  207. apk: "prebuilts/apk/app_xhdpi.apk",
  208. },
  209. xxhdpi: {
  210. apk: "prebuilts/apk/app_xxhdpi.apk",
  211. },
  212. },
  213. presigned: true,
  214. dex_preopt: {
  215. enabled: true,
  216. },
  217. }
  218. `
  219. testCases := []struct {
  220. name string
  221. aaptPreferredConfig *string
  222. aaptPrebuiltDPI []string
  223. expected string
  224. expectedProvenanceMetaDataArtifactPath string
  225. }{
  226. {
  227. name: "no preferred",
  228. aaptPreferredConfig: nil,
  229. aaptPrebuiltDPI: []string{},
  230. expected: "verify_uses_libraries/apk/app.apk",
  231. expectedProvenanceMetaDataArtifactPath: "prebuilts/apk/app.apk",
  232. },
  233. {
  234. name: "AAPTPreferredConfig matches",
  235. aaptPreferredConfig: proptools.StringPtr("xhdpi"),
  236. aaptPrebuiltDPI: []string{"xxhdpi", "ldpi"},
  237. expected: "verify_uses_libraries/apk/app_xhdpi.apk",
  238. expectedProvenanceMetaDataArtifactPath: "prebuilts/apk/app_xhdpi.apk",
  239. },
  240. {
  241. name: "AAPTPrebuiltDPI matches",
  242. aaptPreferredConfig: proptools.StringPtr("mdpi"),
  243. aaptPrebuiltDPI: []string{"xxhdpi", "xhdpi"},
  244. expected: "verify_uses_libraries/apk/app_xxhdpi.apk",
  245. expectedProvenanceMetaDataArtifactPath: "prebuilts/apk/app_xxhdpi.apk",
  246. },
  247. {
  248. name: "non-first AAPTPrebuiltDPI matches",
  249. aaptPreferredConfig: proptools.StringPtr("mdpi"),
  250. aaptPrebuiltDPI: []string{"ldpi", "xhdpi"},
  251. expected: "verify_uses_libraries/apk/app_xhdpi.apk",
  252. expectedProvenanceMetaDataArtifactPath: "prebuilts/apk/app_xhdpi.apk",
  253. },
  254. {
  255. name: "no matches",
  256. aaptPreferredConfig: proptools.StringPtr("mdpi"),
  257. aaptPrebuiltDPI: []string{"ldpi", "xxxhdpi"},
  258. expected: "verify_uses_libraries/apk/app.apk",
  259. expectedProvenanceMetaDataArtifactPath: "prebuilts/apk/app.apk",
  260. },
  261. }
  262. jniRuleRe := regexp.MustCompile("^if \\(zipinfo (\\S+)")
  263. for _, test := range testCases {
  264. result := android.GroupFixturePreparers(
  265. PrepareForTestWithJavaDefaultModules,
  266. android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
  267. variables.AAPTPreferredConfig = test.aaptPreferredConfig
  268. variables.AAPTPrebuiltDPI = test.aaptPrebuiltDPI
  269. }),
  270. ).RunTestWithBp(t, bp)
  271. variant := result.ModuleForTests("foo", "android_common")
  272. jniRuleCommand := variant.Output("jnis-uncompressed/foo.apk").RuleParams.Command
  273. matches := jniRuleRe.FindStringSubmatch(jniRuleCommand)
  274. if len(matches) != 2 {
  275. t.Errorf("failed to extract the src apk path from %q", jniRuleCommand)
  276. }
  277. if strings.HasSuffix(matches[1], test.expected) {
  278. t.Errorf("wrong src apk, expected: %q got: %q", test.expected, matches[1])
  279. }
  280. provenanceMetaDataRule := variant.Rule("genProvenanceMetaData")
  281. android.AssertStringEquals(t, "Invalid input", test.expectedProvenanceMetaDataArtifactPath, provenanceMetaDataRule.Inputs[0].String())
  282. android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", provenanceMetaDataRule.Output.String())
  283. android.AssertStringEquals(t, "Invalid args", "foo", provenanceMetaDataRule.Args["module_name"])
  284. android.AssertStringEquals(t, "Invalid args", "/system/app/foo/foo.apk", provenanceMetaDataRule.Args["install_path"])
  285. }
  286. }
  287. func TestAndroidAppImport_Filename(t *testing.T) {
  288. ctx, _ := testJava(t, `
  289. android_app_import {
  290. name: "foo",
  291. apk: "prebuilts/apk/app.apk",
  292. presigned: true,
  293. }
  294. android_app_import {
  295. name: "bar",
  296. apk: "prebuilts/apk/app.apk",
  297. presigned: true,
  298. filename: "bar_sample.apk"
  299. }
  300. `)
  301. testCases := []struct {
  302. name string
  303. expected string
  304. onDevice string
  305. expectedArtifactPath string
  306. expectedMetaDataPath string
  307. }{
  308. {
  309. name: "foo",
  310. expected: "foo.apk",
  311. onDevice: "/system/app/foo/foo.apk",
  312. expectedArtifactPath: "prebuilts/apk/app.apk",
  313. expectedMetaDataPath: "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto",
  314. },
  315. {
  316. name: "bar",
  317. expected: "bar_sample.apk",
  318. onDevice: "/system/app/bar/bar_sample.apk",
  319. expectedArtifactPath: "prebuilts/apk/app.apk",
  320. expectedMetaDataPath: "out/soong/.intermediates/provenance_metadata/bar/provenance_metadata.textproto",
  321. },
  322. }
  323. for _, test := range testCases {
  324. variant := ctx.ModuleForTests(test.name, "android_common")
  325. if variant.MaybeOutput(test.expected).Rule == nil {
  326. t.Errorf("can't find output named %q - all outputs: %v", test.expected, variant.AllOutputs())
  327. }
  328. a := variant.Module().(*AndroidAppImport)
  329. expectedValues := []string{test.expected}
  330. actualValues := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_INSTALLED_MODULE_STEM"]
  331. if !reflect.DeepEqual(actualValues, expectedValues) {
  332. t.Errorf("Incorrect LOCAL_INSTALLED_MODULE_STEM value '%s', expected '%s'",
  333. actualValues, expectedValues)
  334. }
  335. rule := variant.Rule("genProvenanceMetaData")
  336. android.AssertStringEquals(t, "Invalid input", test.expectedArtifactPath, rule.Inputs[0].String())
  337. android.AssertStringEquals(t, "Invalid output", test.expectedMetaDataPath, rule.Output.String())
  338. android.AssertStringEquals(t, "Invalid args", test.name, rule.Args["module_name"])
  339. android.AssertStringEquals(t, "Invalid args", test.onDevice, rule.Args["install_path"])
  340. }
  341. }
  342. func TestAndroidAppImport_ArchVariants(t *testing.T) {
  343. // The test config's target arch is ARM64.
  344. testCases := []struct {
  345. name string
  346. bp string
  347. expected string
  348. artifactPath string
  349. metaDataPath string
  350. installPath string
  351. }{
  352. {
  353. name: "matching arch",
  354. bp: `
  355. android_app_import {
  356. name: "foo",
  357. apk: "prebuilts/apk/app.apk",
  358. arch: {
  359. arm64: {
  360. apk: "prebuilts/apk/app_arm64.apk",
  361. },
  362. },
  363. presigned: true,
  364. dex_preopt: {
  365. enabled: true,
  366. },
  367. }
  368. `,
  369. expected: "verify_uses_libraries/apk/app_arm64.apk",
  370. artifactPath: "prebuilts/apk/app_arm64.apk",
  371. installPath: "/system/app/foo/foo.apk",
  372. },
  373. {
  374. name: "no matching arch",
  375. bp: `
  376. android_app_import {
  377. name: "foo",
  378. apk: "prebuilts/apk/app.apk",
  379. arch: {
  380. arm: {
  381. apk: "prebuilts/apk/app_arm.apk",
  382. },
  383. },
  384. presigned: true,
  385. dex_preopt: {
  386. enabled: true,
  387. },
  388. }
  389. `,
  390. expected: "verify_uses_libraries/apk/app.apk",
  391. artifactPath: "prebuilts/apk/app.apk",
  392. installPath: "/system/app/foo/foo.apk",
  393. },
  394. {
  395. name: "no matching arch without default",
  396. bp: `
  397. android_app_import {
  398. name: "foo",
  399. arch: {
  400. arm: {
  401. apk: "prebuilts/apk/app_arm.apk",
  402. },
  403. },
  404. presigned: true,
  405. dex_preopt: {
  406. enabled: true,
  407. },
  408. }
  409. `,
  410. expected: "",
  411. artifactPath: "prebuilts/apk/app_arm.apk",
  412. installPath: "/system/app/foo/foo.apk",
  413. },
  414. }
  415. jniRuleRe := regexp.MustCompile("^if \\(zipinfo (\\S+)")
  416. for _, test := range testCases {
  417. ctx, _ := testJava(t, test.bp)
  418. variant := ctx.ModuleForTests("foo", "android_common")
  419. if test.expected == "" {
  420. if variant.Module().Enabled() {
  421. t.Error("module should have been disabled, but wasn't")
  422. }
  423. rule := variant.MaybeRule("genProvenanceMetaData")
  424. android.AssertDeepEquals(t, "Provenance metadata is not empty", android.TestingBuildParams{}, rule)
  425. continue
  426. }
  427. jniRuleCommand := variant.Output("jnis-uncompressed/foo.apk").RuleParams.Command
  428. matches := jniRuleRe.FindStringSubmatch(jniRuleCommand)
  429. if len(matches) != 2 {
  430. t.Errorf("failed to extract the src apk path from %q", jniRuleCommand)
  431. }
  432. if strings.HasSuffix(matches[1], test.expected) {
  433. t.Errorf("wrong src apk, expected: %q got: %q", test.expected, matches[1])
  434. }
  435. rule := variant.Rule("genProvenanceMetaData")
  436. android.AssertStringEquals(t, "Invalid input", test.artifactPath, rule.Inputs[0].String())
  437. android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", rule.Output.String())
  438. android.AssertStringEquals(t, "Invalid args", "foo", rule.Args["module_name"])
  439. android.AssertStringEquals(t, "Invalid args", test.installPath, rule.Args["install_path"])
  440. }
  441. }
  442. func TestAndroidAppImport_overridesDisabledAndroidApp(t *testing.T) {
  443. ctx, _ := testJava(t, `
  444. android_app {
  445. name: "foo",
  446. srcs: ["a.java"],
  447. enabled: false,
  448. }
  449. android_app_import {
  450. name: "foo",
  451. apk: "prebuilts/apk/app.apk",
  452. certificate: "platform",
  453. prefer: true,
  454. }
  455. `)
  456. variant := ctx.ModuleForTests("prebuilt_foo", "android_common")
  457. a := variant.Module().(*AndroidAppImport)
  458. // The prebuilt module should still be enabled and active even if the source-based counterpart
  459. // is disabled.
  460. if !a.prebuilt.UsePrebuilt() {
  461. t.Errorf("prebuilt foo module is not active")
  462. }
  463. if !a.Enabled() {
  464. t.Errorf("prebuilt foo module is disabled")
  465. }
  466. }
  467. func TestAndroidAppImport_frameworkRes(t *testing.T) {
  468. ctx, _ := testJava(t, `
  469. android_app_import {
  470. name: "framework-res",
  471. certificate: "platform",
  472. apk: "package-res.apk",
  473. prefer: true,
  474. export_package_resources: true,
  475. // Disable dexpreopt and verify_uses_libraries check as the app
  476. // contains no Java code to be dexpreopted.
  477. enforce_uses_libs: false,
  478. dex_preopt: {
  479. enabled: false,
  480. },
  481. }
  482. `)
  483. mod := ctx.ModuleForTests("prebuilt_framework-res", "android_common").Module()
  484. a := mod.(*AndroidAppImport)
  485. if !a.preprocessed {
  486. t.Errorf("prebuilt framework-res is not preprocessed")
  487. }
  488. expectedInstallPath := "out/soong/target/product/test_device/system/framework/framework-res.apk"
  489. android.AssertPathRelativeToTopEquals(t, "prebuilt framework-res install location", expectedInstallPath, a.dexpreopter.installPath)
  490. entries := android.AndroidMkEntriesForTest(t, ctx, mod)[0]
  491. expectedPath := "."
  492. // From apk property above, in the root of the source tree.
  493. expectedPrebuiltModuleFile := "package-res.apk"
  494. // Verify that the apk is preprocessed: The export package is the same
  495. // as the prebuilt.
  496. expectedSoongResourceExportPackage := expectedPrebuiltModuleFile
  497. actualPath := entries.EntryMap["LOCAL_PATH"]
  498. actualPrebuiltModuleFile := entries.EntryMap["LOCAL_PREBUILT_MODULE_FILE"]
  499. actualSoongResourceExportPackage := entries.EntryMap["LOCAL_SOONG_RESOURCE_EXPORT_PACKAGE"]
  500. if len(actualPath) != 1 {
  501. t.Errorf("LOCAL_PATH incorrect len %d", len(actualPath))
  502. } else if actualPath[0] != expectedPath {
  503. t.Errorf("LOCAL_PATH mismatch, actual: %s, expected: %s", actualPath[0], expectedPath)
  504. }
  505. if len(actualPrebuiltModuleFile) != 1 {
  506. t.Errorf("LOCAL_PREBUILT_MODULE_FILE incorrect len %d", len(actualPrebuiltModuleFile))
  507. } else if actualPrebuiltModuleFile[0] != expectedPrebuiltModuleFile {
  508. t.Errorf("LOCAL_PREBUILT_MODULE_FILE mismatch, actual: %s, expected: %s", actualPrebuiltModuleFile[0], expectedPrebuiltModuleFile)
  509. }
  510. if len(actualSoongResourceExportPackage) != 1 {
  511. t.Errorf("LOCAL_SOONG_RESOURCE_EXPORT_PACKAGE incorrect len %d", len(actualSoongResourceExportPackage))
  512. } else if actualSoongResourceExportPackage[0] != expectedSoongResourceExportPackage {
  513. t.Errorf("LOCAL_SOONG_RESOURCE_EXPORT_PACKAGE mismatch, actual: %s, expected: %s", actualSoongResourceExportPackage[0], expectedSoongResourceExportPackage)
  514. }
  515. }
  516. func TestAndroidAppImport_relativeInstallPath(t *testing.T) {
  517. bp := `
  518. android_app_import {
  519. name: "no_relative_install_path",
  520. apk: "prebuilts/apk/app.apk",
  521. presigned: true,
  522. }
  523. android_app_import {
  524. name: "relative_install_path",
  525. apk: "prebuilts/apk/app.apk",
  526. presigned: true,
  527. relative_install_path: "my/path",
  528. }
  529. android_app_import {
  530. name: "framework-res",
  531. apk: "prebuilts/apk/app.apk",
  532. presigned: true,
  533. prefer: true,
  534. }
  535. android_app_import {
  536. name: "privileged_relative_install_path",
  537. apk: "prebuilts/apk/app.apk",
  538. presigned: true,
  539. privileged: true,
  540. relative_install_path: "my/path"
  541. }
  542. `
  543. testCases := []struct {
  544. name string
  545. expectedInstallPath string
  546. errorMessage string
  547. }{
  548. {
  549. name: "no_relative_install_path",
  550. expectedInstallPath: "out/soong/target/product/test_device/system/app/no_relative_install_path/no_relative_install_path.apk",
  551. errorMessage: "Install path is not correct when relative_install_path is missing",
  552. },
  553. {
  554. name: "relative_install_path",
  555. expectedInstallPath: "out/soong/target/product/test_device/system/app/my/path/relative_install_path/relative_install_path.apk",
  556. errorMessage: "Install path is not correct for app when relative_install_path is present",
  557. },
  558. {
  559. name: "prebuilt_framework-res",
  560. expectedInstallPath: "out/soong/target/product/test_device/system/framework/framework-res.apk",
  561. errorMessage: "Install path is not correct for framework-res",
  562. },
  563. {
  564. name: "privileged_relative_install_path",
  565. expectedInstallPath: "out/soong/target/product/test_device/system/priv-app/my/path/privileged_relative_install_path/privileged_relative_install_path.apk",
  566. errorMessage: "Install path is not correct for privileged app when relative_install_path is present",
  567. },
  568. }
  569. for _, testCase := range testCases {
  570. ctx, _ := testJava(t, bp)
  571. mod := ctx.ModuleForTests(testCase.name, "android_common").Module().(*AndroidAppImport)
  572. android.AssertPathRelativeToTopEquals(t, testCase.errorMessage, testCase.expectedInstallPath, mod.installPath)
  573. }
  574. }
  575. func TestAndroidTestImport(t *testing.T) {
  576. ctx, _ := testJava(t, `
  577. android_test_import {
  578. name: "foo",
  579. apk: "prebuilts/apk/app.apk",
  580. presigned: true,
  581. data: [
  582. "testdata/data",
  583. ],
  584. }
  585. `)
  586. test := ctx.ModuleForTests("foo", "android_common").Module().(*AndroidTestImport)
  587. // Check android mks.
  588. entries := android.AndroidMkEntriesForTest(t, ctx, test)[0]
  589. expected := []string{"tests"}
  590. actual := entries.EntryMap["LOCAL_MODULE_TAGS"]
  591. if !reflect.DeepEqual(expected, actual) {
  592. t.Errorf("Unexpected module tags - expected: %q, actual: %q", expected, actual)
  593. }
  594. expected = []string{"testdata/data:testdata/data"}
  595. actual = entries.EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
  596. if !reflect.DeepEqual(expected, actual) {
  597. t.Errorf("Unexpected test data - expected: %q, actual: %q", expected, actual)
  598. }
  599. }
  600. func TestAndroidTestImport_NoJinUncompressForPresigned(t *testing.T) {
  601. ctx, _ := testJava(t, `
  602. android_test_import {
  603. name: "foo",
  604. apk: "prebuilts/apk/app.apk",
  605. certificate: "cert/new_cert",
  606. data: [
  607. "testdata/data",
  608. ],
  609. }
  610. android_test_import {
  611. name: "foo_presigned",
  612. apk: "prebuilts/apk/app.apk",
  613. presigned: true,
  614. data: [
  615. "testdata/data",
  616. ],
  617. }
  618. `)
  619. variant := ctx.ModuleForTests("foo", "android_common")
  620. jniRule := variant.Output("jnis-uncompressed/foo.apk").RuleParams.Command
  621. if !strings.HasPrefix(jniRule, "if (zipinfo") {
  622. t.Errorf("Unexpected JNI uncompress rule command: " + jniRule)
  623. }
  624. variant = ctx.ModuleForTests("foo_presigned", "android_common")
  625. jniRule = variant.Output("jnis-uncompressed/foo_presigned.apk").BuildParams.Rule.String()
  626. if jniRule != android.Cp.String() {
  627. t.Errorf("Unexpected JNI uncompress rule: " + jniRule)
  628. }
  629. if variant.MaybeOutput("zip-aligned/foo_presigned.apk").Rule == nil {
  630. t.Errorf("Presigned test apk should be aligned")
  631. }
  632. }
  633. func TestAndroidTestImport_Preprocessed(t *testing.T) {
  634. ctx, _ := testJava(t, `
  635. android_test_import {
  636. name: "foo",
  637. apk: "prebuilts/apk/app.apk",
  638. presigned: true,
  639. preprocessed: true,
  640. }
  641. android_test_import {
  642. name: "foo_cert",
  643. apk: "prebuilts/apk/app.apk",
  644. certificate: "cert/new_cert",
  645. preprocessed: true,
  646. }
  647. `)
  648. testModules := []string{"foo", "foo_cert"}
  649. for _, m := range testModules {
  650. apkName := m + ".apk"
  651. variant := ctx.ModuleForTests(m, "android_common")
  652. jniRule := variant.Output("jnis-uncompressed/" + apkName).BuildParams.Rule.String()
  653. if jniRule != android.Cp.String() {
  654. t.Errorf("Unexpected JNI uncompress rule: " + jniRule)
  655. }
  656. // Make sure signing and aligning were skipped.
  657. if variant.MaybeOutput("signed/"+apkName).Rule != nil {
  658. t.Errorf("signing rule shouldn't be included for preprocessed.")
  659. }
  660. if variant.MaybeOutput("zip-aligned/"+apkName).Rule != nil {
  661. t.Errorf("aligning rule shouldn't be for preprocessed")
  662. }
  663. }
  664. }
  665. func TestAndroidTestImport_UncompressDex(t *testing.T) {
  666. testCases := []struct {
  667. name string
  668. bp string
  669. }{
  670. {
  671. name: "normal",
  672. bp: `
  673. android_app_import {
  674. name: "foo",
  675. presigned: true,
  676. apk: "prebuilts/apk/app.apk",
  677. }
  678. `,
  679. },
  680. {
  681. name: "privileged",
  682. bp: `
  683. android_app_import {
  684. name: "foo",
  685. presigned: true,
  686. privileged: true,
  687. apk: "prebuilts/apk/app.apk",
  688. }
  689. `,
  690. },
  691. }
  692. test := func(t *testing.T, bp string, unbundled bool, dontUncompressPrivAppDexs bool) {
  693. t.Helper()
  694. result := android.GroupFixturePreparers(
  695. prepareForJavaTest,
  696. android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
  697. if unbundled {
  698. variables.Unbundled_build = proptools.BoolPtr(true)
  699. }
  700. variables.UncompressPrivAppDex = proptools.BoolPtr(!dontUncompressPrivAppDexs)
  701. }),
  702. ).RunTestWithBp(t, bp)
  703. foo := result.ModuleForTests("foo", "android_common")
  704. actual := foo.MaybeRule("uncompress-dex").Rule != nil
  705. expect := !unbundled
  706. if strings.Contains(bp, "privileged: true") {
  707. if dontUncompressPrivAppDexs {
  708. expect = false
  709. } else {
  710. // TODO(b/194504107): shouldn't priv-apps be always uncompressed unless
  711. // DONT_UNCOMPRESS_PRIV_APPS_DEXS is true (regardless of unbundling)?
  712. // expect = true
  713. }
  714. }
  715. android.AssertBoolEquals(t, "uncompress dex", expect, actual)
  716. }
  717. for _, unbundled := range []bool{false, true} {
  718. for _, dontUncompressPrivAppDexs := range []bool{false, true} {
  719. for _, tt := range testCases {
  720. name := fmt.Sprintf("%s,unbundled:%t,dontUncompressPrivAppDexs:%t",
  721. tt.name, unbundled, dontUncompressPrivAppDexs)
  722. t.Run(name, func(t *testing.T) {
  723. test(t, tt.bp, unbundled, dontUncompressPrivAppDexs)
  724. })
  725. }
  726. }
  727. }
  728. }