main_test.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885
  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 main
  15. import (
  16. "bytes"
  17. "fmt"
  18. "reflect"
  19. "testing"
  20. "google.golang.org/protobuf/encoding/prototext"
  21. bp "android/soong/cmd/extract_apks/bundle_proto"
  22. "android/soong/third_party/zip"
  23. )
  24. type testConfigDesc struct {
  25. name string
  26. targetConfig TargetConfig
  27. expected SelectionResult
  28. }
  29. type testDesc struct {
  30. protoText string
  31. configs []testConfigDesc
  32. }
  33. func TestSelectApks_ApkSet(t *testing.T) {
  34. testCases := []testDesc{
  35. {
  36. protoText: `
  37. variant {
  38. targeting {
  39. sdk_version_targeting {
  40. value { min { value: 29 } } } }
  41. apk_set {
  42. module_metadata {
  43. name: "base" targeting {} delivery_type: INSTALL_TIME }
  44. apk_description {
  45. targeting {
  46. screen_density_targeting {
  47. value { density_alias: LDPI } }
  48. sdk_version_targeting {
  49. value { min { value: 21 } } } }
  50. path: "splits/base-ldpi.apk"
  51. split_apk_metadata { split_id: "config.ldpi" } }
  52. apk_description {
  53. targeting {
  54. screen_density_targeting {
  55. value { density_alias: MDPI } }
  56. sdk_version_targeting {
  57. value { min { value: 21 } } } }
  58. path: "splits/base-mdpi.apk"
  59. split_apk_metadata { split_id: "config.mdpi" } }
  60. apk_description {
  61. targeting {
  62. sdk_version_targeting {
  63. value { min { value: 21 } } } }
  64. path: "splits/base-master.apk"
  65. split_apk_metadata { is_master_split: true } }
  66. apk_description {
  67. targeting {
  68. abi_targeting {
  69. value { alias: ARMEABI_V7A }
  70. alternatives { alias: ARM64_V8A }
  71. alternatives { alias: X86 }
  72. alternatives { alias: X86_64 } }
  73. sdk_version_targeting {
  74. value { min { value: 21 } } } }
  75. path: "splits/base-armeabi_v7a.apk"
  76. split_apk_metadata { split_id: "config.armeabi_v7a" } }
  77. apk_description {
  78. targeting {
  79. abi_targeting {
  80. value { alias: ARM64_V8A }
  81. alternatives { alias: ARMEABI_V7A }
  82. alternatives { alias: X86 }
  83. alternatives { alias: X86_64 } }
  84. sdk_version_targeting {
  85. value { min { value: 21 } } } }
  86. path: "splits/base-arm64_v8a.apk"
  87. split_apk_metadata { split_id: "config.arm64_v8a" } }
  88. apk_description {
  89. targeting {
  90. abi_targeting {
  91. value { alias: X86 }
  92. alternatives { alias: ARMEABI_V7A }
  93. alternatives { alias: ARM64_V8A }
  94. alternatives { alias: X86_64 } }
  95. sdk_version_targeting {
  96. value { min { value: 21 } } } }
  97. path: "splits/base-x86.apk"
  98. split_apk_metadata { split_id: "config.x86" } }
  99. apk_description {
  100. targeting {
  101. abi_targeting {
  102. value { alias: X86_64 }
  103. alternatives { alias: ARMEABI_V7A }
  104. alternatives { alias: ARM64_V8A }
  105. alternatives { alias: X86 } }
  106. sdk_version_targeting {
  107. value { min { value: 21 } } } }
  108. path: "splits/base-x86_64.apk"
  109. split_apk_metadata { split_id: "config.x86_64" } } }
  110. }
  111. bundletool {
  112. version: "0.10.3" }
  113. `,
  114. configs: []testConfigDesc{
  115. {
  116. name: "one",
  117. targetConfig: TargetConfig{
  118. sdkVersion: 29,
  119. screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
  120. bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
  121. },
  122. abis: map[bp.Abi_AbiAlias]int{
  123. bp.Abi_ARMEABI_V7A: 0,
  124. bp.Abi_ARM64_V8A: 1,
  125. },
  126. },
  127. expected: SelectionResult{
  128. "base",
  129. []string{
  130. "splits/base-ldpi.apk",
  131. "splits/base-mdpi.apk",
  132. "splits/base-master.apk",
  133. "splits/base-armeabi_v7a.apk",
  134. },
  135. },
  136. },
  137. {
  138. name: "two",
  139. targetConfig: TargetConfig{
  140. sdkVersion: 29,
  141. screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
  142. bp.ScreenDensity_LDPI: true,
  143. },
  144. abis: map[bp.Abi_AbiAlias]int{},
  145. },
  146. expected: SelectionResult{
  147. "base",
  148. []string{
  149. "splits/base-ldpi.apk",
  150. "splits/base-master.apk",
  151. },
  152. },
  153. },
  154. {
  155. name: "three",
  156. targetConfig: TargetConfig{
  157. sdkVersion: 20,
  158. screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
  159. bp.ScreenDensity_LDPI: true,
  160. },
  161. abis: map[bp.Abi_AbiAlias]int{},
  162. },
  163. expected: SelectionResult{
  164. "",
  165. nil,
  166. },
  167. },
  168. {
  169. name: "four",
  170. targetConfig: TargetConfig{
  171. sdkVersion: 29,
  172. screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
  173. bp.ScreenDensity_MDPI: true,
  174. },
  175. abis: map[bp.Abi_AbiAlias]int{
  176. bp.Abi_ARM64_V8A: 0,
  177. bp.Abi_ARMEABI_V7A: 1,
  178. },
  179. },
  180. expected: SelectionResult{
  181. "base",
  182. []string{
  183. "splits/base-mdpi.apk",
  184. "splits/base-master.apk",
  185. "splits/base-arm64_v8a.apk",
  186. },
  187. },
  188. },
  189. },
  190. },
  191. {
  192. protoText: `
  193. variant {
  194. targeting {
  195. sdk_version_targeting {
  196. value { min { value: 10000 } } } }
  197. apk_set {
  198. module_metadata {
  199. name: "base" targeting {} delivery_type: INSTALL_TIME }
  200. apk_description {
  201. targeting {
  202. sdk_version_targeting {
  203. value { min { value: 21 } } } }
  204. path: "splits/base-master.apk"
  205. split_apk_metadata { is_master_split: true } } } }`,
  206. configs: []testConfigDesc{
  207. {
  208. name: "Prerelease",
  209. targetConfig: TargetConfig{
  210. sdkVersion: 30,
  211. screenDpi: map[bp.ScreenDensity_DensityAlias]bool{},
  212. abis: map[bp.Abi_AbiAlias]int{},
  213. allowPrereleased: true,
  214. },
  215. expected: SelectionResult{
  216. "base",
  217. []string{"splits/base-master.apk"},
  218. },
  219. },
  220. },
  221. },
  222. {
  223. protoText: `
  224. variant {
  225. targeting {
  226. sdk_version_targeting {
  227. value { min { value: 29 } } } }
  228. apk_set {
  229. module_metadata {
  230. name: "base" targeting {} delivery_type: INSTALL_TIME }
  231. apk_description {
  232. targeting {}
  233. path: "universal.apk"
  234. standalone_apk_metadata { fused_module_name: "base" } } } }`,
  235. configs: []testConfigDesc{
  236. {
  237. name: "Universal",
  238. targetConfig: TargetConfig{sdkVersion: 30},
  239. expected: SelectionResult{
  240. "base",
  241. []string{"universal.apk"},
  242. },
  243. },
  244. },
  245. },
  246. }
  247. for _, testCase := range testCases {
  248. var toc bp.BuildApksResult
  249. if err := prototext.Unmarshal([]byte(testCase.protoText), &toc); err != nil {
  250. t.Fatal(err)
  251. }
  252. for _, config := range testCase.configs {
  253. actual := selectApks(&toc, config.targetConfig)
  254. if !reflect.DeepEqual(config.expected, actual) {
  255. t.Errorf("%s: expected %v, got %v", config.name, config.expected, actual)
  256. }
  257. }
  258. }
  259. }
  260. func TestSelectApks_ApexSet(t *testing.T) {
  261. testCases := []testDesc{
  262. {
  263. protoText: `
  264. variant {
  265. targeting {
  266. sdk_version_targeting {
  267. value { min { value: 29 } } } }
  268. apk_set {
  269. module_metadata {
  270. name: "base" targeting {} delivery_type: INSTALL_TIME }
  271. apk_description {
  272. targeting {
  273. multi_abi_targeting {
  274. value { abi { alias: ARMEABI_V7A } }
  275. alternatives { abi { alias: ARM64_V8A } }
  276. alternatives { abi { alias: X86 } }
  277. alternatives { abi { alias: X86_64 } } }
  278. sdk_version_targeting {
  279. value { min { value: 21 } } } }
  280. path: "standalones/standalone-armeabi_v7a.apex"
  281. apex_apk_metadata { } }
  282. apk_description {
  283. targeting {
  284. multi_abi_targeting {
  285. value { abi { alias: ARM64_V8A } }
  286. alternatives { abi { alias: ARMEABI_V7A } }
  287. alternatives { abi { alias: X86 } }
  288. alternatives { abi { alias: X86_64 } } }
  289. sdk_version_targeting {
  290. value { min { value: 21 } } } }
  291. path: "standalones/standalone-arm64_v8a.apex"
  292. apex_apk_metadata { } }
  293. apk_description {
  294. targeting {
  295. multi_abi_targeting {
  296. value { abi { alias: X86 } }
  297. alternatives { abi { alias: ARMEABI_V7A } }
  298. alternatives { abi { alias: ARM64_V8A } }
  299. alternatives { abi { alias: X86_64 } } }
  300. sdk_version_targeting {
  301. value { min { value: 21 } } } }
  302. path: "standalones/standalone-x86.apex"
  303. apex_apk_metadata { } }
  304. apk_description {
  305. targeting {
  306. multi_abi_targeting {
  307. value { abi { alias: X86_64 } }
  308. alternatives { abi { alias: ARMEABI_V7A } }
  309. alternatives { abi { alias: ARM64_V8A } }
  310. alternatives { abi { alias: X86 } } }
  311. sdk_version_targeting {
  312. value { min { value: 21 } } } }
  313. path: "standalones/standalone-x86_64.apex"
  314. apex_apk_metadata { } } }
  315. }
  316. bundletool {
  317. version: "0.10.3" }
  318. `,
  319. configs: []testConfigDesc{
  320. {
  321. name: "order matches priorities",
  322. targetConfig: TargetConfig{
  323. sdkVersion: 29,
  324. screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
  325. bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
  326. },
  327. abis: map[bp.Abi_AbiAlias]int{
  328. bp.Abi_ARM64_V8A: 0,
  329. bp.Abi_ARMEABI_V7A: 1,
  330. },
  331. },
  332. expected: SelectionResult{
  333. "base",
  334. []string{
  335. "standalones/standalone-arm64_v8a.apex",
  336. },
  337. },
  338. },
  339. {
  340. name: "order doesn't match priorities",
  341. targetConfig: TargetConfig{
  342. sdkVersion: 29,
  343. screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
  344. bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
  345. },
  346. abis: map[bp.Abi_AbiAlias]int{
  347. bp.Abi_ARMEABI_V7A: 0,
  348. bp.Abi_ARM64_V8A: 1,
  349. },
  350. },
  351. expected: SelectionResult{
  352. "base",
  353. []string{
  354. "standalones/standalone-arm64_v8a.apex",
  355. },
  356. },
  357. },
  358. {
  359. name: "single choice",
  360. targetConfig: TargetConfig{
  361. sdkVersion: 29,
  362. screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
  363. bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
  364. },
  365. abis: map[bp.Abi_AbiAlias]int{
  366. bp.Abi_ARMEABI_V7A: 0,
  367. },
  368. },
  369. expected: SelectionResult{
  370. "base",
  371. []string{
  372. "standalones/standalone-armeabi_v7a.apex",
  373. },
  374. },
  375. },
  376. {
  377. name: "cross platform",
  378. targetConfig: TargetConfig{
  379. sdkVersion: 29,
  380. screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
  381. bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
  382. },
  383. abis: map[bp.Abi_AbiAlias]int{
  384. bp.Abi_ARM64_V8A: 0,
  385. bp.Abi_MIPS64: 1,
  386. bp.Abi_X86: 2,
  387. },
  388. },
  389. expected: SelectionResult{
  390. "base",
  391. []string{
  392. "standalones/standalone-x86.apex",
  393. },
  394. },
  395. },
  396. },
  397. },
  398. }
  399. for _, testCase := range testCases {
  400. var toc bp.BuildApksResult
  401. if err := prototext.Unmarshal([]byte(testCase.protoText), &toc); err != nil {
  402. t.Fatal(err)
  403. }
  404. for _, config := range testCase.configs {
  405. actual := selectApks(&toc, config.targetConfig)
  406. if !reflect.DeepEqual(config.expected, actual) {
  407. t.Errorf("%s: expected %v, got %v", config.name, config.expected, actual)
  408. }
  409. }
  410. }
  411. }
  412. func TestSelectApks_ApexSet_Variants(t *testing.T) {
  413. testCases := []testDesc{
  414. {
  415. protoText: `
  416. variant {
  417. targeting {
  418. sdk_version_targeting {value {min {value: 29}}}
  419. multi_abi_targeting {
  420. value {abi {alias: ARMEABI_V7A}}
  421. alternatives {
  422. abi {alias: ARMEABI_V7A}
  423. abi {alias: ARM64_V8A}
  424. }
  425. alternatives {abi {alias: ARM64_V8A}}
  426. alternatives {abi {alias: X86}}
  427. alternatives {
  428. abi {alias: X86}
  429. abi {alias: X86_64}
  430. }
  431. }
  432. }
  433. apk_set {
  434. module_metadata {
  435. name: "base"
  436. delivery_type: INSTALL_TIME
  437. }
  438. apk_description {
  439. targeting {
  440. multi_abi_targeting {
  441. value {abi {alias: ARMEABI_V7A}}
  442. alternatives {
  443. abi {alias: ARMEABI_V7A}
  444. abi {alias: ARM64_V8A}
  445. }
  446. alternatives {abi {alias: ARM64_V8A}}
  447. alternatives {abi {alias: X86}}
  448. alternatives {
  449. abi {alias: X86}
  450. abi {alias: X86_64}
  451. }
  452. }
  453. }
  454. path: "standalones/standalone-armeabi_v7a.apex"
  455. }
  456. }
  457. variant_number: 0
  458. }
  459. variant {
  460. targeting {
  461. sdk_version_targeting {value {min {value: 29}}}
  462. multi_abi_targeting {
  463. value {abi {alias: ARM64_V8A}}
  464. alternatives {abi {alias: ARMEABI_V7A}}
  465. alternatives {
  466. abi {alias: ARMEABI_V7A}
  467. abi {alias: ARM64_V8A}
  468. }
  469. alternatives {abi {alias: X86}}
  470. alternatives {
  471. abi {alias: X86}
  472. abi {alias: X86_64}
  473. }
  474. }
  475. }
  476. apk_set {
  477. module_metadata {
  478. name: "base"
  479. delivery_type: INSTALL_TIME
  480. }
  481. apk_description {
  482. targeting {
  483. multi_abi_targeting {
  484. value {abi {alias: ARM64_V8A}}
  485. alternatives {abi {alias: ARMEABI_V7A}}
  486. alternatives {
  487. abi {alias: ARMEABI_V7A}
  488. abi {alias: ARM64_V8A}
  489. }
  490. alternatives {abi {alias: X86}}
  491. alternatives {
  492. abi {alias: X86}
  493. abi {alias: X86_64}
  494. }
  495. }
  496. }
  497. path: "standalones/standalone-arm64_v8a.apex"
  498. }
  499. }
  500. variant_number: 1
  501. }
  502. variant {
  503. targeting {
  504. sdk_version_targeting {value {min {value: 29}}}
  505. multi_abi_targeting {
  506. value {
  507. abi {alias: ARMEABI_V7A}
  508. abi {alias: ARM64_V8A}
  509. }
  510. alternatives {abi {alias: ARMEABI_V7A}}
  511. alternatives {abi {alias: ARM64_V8A}}
  512. alternatives {abi {alias: X86}}
  513. alternatives {
  514. abi {alias: X86}
  515. abi {alias: X86_64}
  516. }
  517. }
  518. }
  519. apk_set {
  520. module_metadata {
  521. name: "base"
  522. delivery_type: INSTALL_TIME
  523. }
  524. apk_description {
  525. targeting {
  526. multi_abi_targeting {
  527. value {
  528. abi {alias: ARMEABI_V7A}
  529. abi {alias: ARM64_V8A}
  530. }
  531. alternatives {abi {alias: ARMEABI_V7A}}
  532. alternatives {abi {alias: ARM64_V8A}}
  533. alternatives {abi {alias: X86}}
  534. alternatives {
  535. abi {alias: X86}
  536. abi {alias: X86_64}
  537. }
  538. }
  539. }
  540. path: "standalones/standalone-armeabi_v7a.arm64_v8a.apex"
  541. }
  542. }
  543. variant_number: 2
  544. }
  545. variant {
  546. targeting {
  547. sdk_version_targeting {value {min {value: 29}}}
  548. multi_abi_targeting {
  549. value {abi {alias: X86}}
  550. alternatives {abi {alias: ARMEABI_V7A}}
  551. alternatives {
  552. abi {alias: ARMEABI_V7A}
  553. abi {alias: ARM64_V8A}
  554. }
  555. alternatives {abi {alias: ARM64_V8A}}
  556. alternatives {
  557. abi {alias: X86}
  558. abi {alias: X86_64}
  559. }
  560. }
  561. }
  562. apk_set {
  563. module_metadata {
  564. name: "base"
  565. delivery_type: INSTALL_TIME
  566. }
  567. apk_description {
  568. targeting {
  569. multi_abi_targeting {
  570. value {abi {alias: X86}}
  571. alternatives {abi {alias: ARMEABI_V7A}}
  572. alternatives {
  573. abi {alias: ARMEABI_V7A}
  574. abi {alias: ARM64_V8A}
  575. }
  576. alternatives {abi {alias: ARM64_V8A}}
  577. alternatives {
  578. abi {alias: X86}
  579. abi {alias: X86_64}
  580. }
  581. }
  582. }
  583. path: "standalones/standalone-x86.apex"
  584. }
  585. }
  586. variant_number: 3
  587. }
  588. variant {
  589. targeting {
  590. sdk_version_targeting {value {min {value: 29}}}
  591. multi_abi_targeting {
  592. value {
  593. abi {alias: X86}
  594. abi {alias: X86_64}
  595. }
  596. alternatives {abi {alias: ARMEABI_V7A}}
  597. alternatives {
  598. abi {alias: ARMEABI_V7A}
  599. abi {alias: ARM64_V8A}
  600. }
  601. alternatives {abi {alias: ARM64_V8A}}
  602. alternatives {abi {alias: X86}}
  603. }
  604. }
  605. apk_set {
  606. module_metadata {
  607. name: "base"
  608. delivery_type: INSTALL_TIME
  609. }
  610. apk_description {
  611. targeting {
  612. multi_abi_targeting {
  613. value {
  614. abi {alias: X86}
  615. abi {alias: X86_64}
  616. }
  617. alternatives {abi {alias: ARMEABI_V7A}}
  618. alternatives {
  619. abi {alias: ARMEABI_V7A}
  620. abi {alias: ARM64_V8A}
  621. }
  622. alternatives {abi {alias: ARM64_V8A}}
  623. alternatives {abi {alias: X86}}
  624. }
  625. }
  626. path: "standalones/standalone-x86.x86_64.apex"
  627. }
  628. }
  629. variant_number: 4
  630. }
  631. `,
  632. configs: []testConfigDesc{
  633. {
  634. name: "multi-variant multi-target ARM",
  635. targetConfig: TargetConfig{
  636. sdkVersion: 33,
  637. screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
  638. bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
  639. },
  640. abis: map[bp.Abi_AbiAlias]int{
  641. bp.Abi_ARM64_V8A: 0,
  642. bp.Abi_ARMEABI_V7A: 1,
  643. },
  644. },
  645. expected: SelectionResult{
  646. "base",
  647. []string{
  648. "standalones/standalone-armeabi_v7a.arm64_v8a.apex",
  649. },
  650. },
  651. },
  652. {
  653. name: "multi-variant single-target arm",
  654. targetConfig: TargetConfig{
  655. sdkVersion: 33,
  656. screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
  657. bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
  658. },
  659. abis: map[bp.Abi_AbiAlias]int{
  660. bp.Abi_ARMEABI_V7A: 0,
  661. },
  662. },
  663. expected: SelectionResult{
  664. "base",
  665. []string{
  666. "standalones/standalone-armeabi_v7a.apex",
  667. },
  668. },
  669. },
  670. {
  671. name: "multi-variant single-target arm64",
  672. targetConfig: TargetConfig{
  673. sdkVersion: 33,
  674. screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
  675. bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
  676. },
  677. abis: map[bp.Abi_AbiAlias]int{
  678. bp.Abi_ARM64_V8A: 0,
  679. },
  680. },
  681. expected: SelectionResult{
  682. "base",
  683. []string{
  684. "standalones/standalone-arm64_v8a.apex",
  685. },
  686. },
  687. },
  688. {
  689. name: "multi-variant multi-target x86",
  690. targetConfig: TargetConfig{
  691. sdkVersion: 33,
  692. screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
  693. bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
  694. },
  695. abis: map[bp.Abi_AbiAlias]int{
  696. bp.Abi_X86: 0,
  697. bp.Abi_X86_64: 1,
  698. },
  699. },
  700. expected: SelectionResult{
  701. "base",
  702. []string{
  703. "standalones/standalone-x86.x86_64.apex",
  704. },
  705. },
  706. },
  707. {
  708. name: "multi-variant single-target x86",
  709. targetConfig: TargetConfig{
  710. sdkVersion: 33,
  711. screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
  712. bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
  713. },
  714. abis: map[bp.Abi_AbiAlias]int{
  715. bp.Abi_X86: 0,
  716. },
  717. },
  718. expected: SelectionResult{
  719. "base",
  720. []string{
  721. "standalones/standalone-x86.apex",
  722. },
  723. },
  724. },
  725. {
  726. name: "multi-variant single-target x86_64",
  727. targetConfig: TargetConfig{
  728. sdkVersion: 33,
  729. screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
  730. bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
  731. },
  732. abis: map[bp.Abi_AbiAlias]int{
  733. bp.Abi_X86_64: 0,
  734. },
  735. },
  736. expected: SelectionResult{
  737. "base",
  738. []string{
  739. "standalones/standalone-x86.x86_64.apex",
  740. }},
  741. },
  742. {
  743. name: "multi-variant multi-target cross-target",
  744. targetConfig: TargetConfig{
  745. sdkVersion: 33,
  746. screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
  747. bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
  748. },
  749. abis: map[bp.Abi_AbiAlias]int{
  750. bp.Abi_ARM64_V8A: 0,
  751. bp.Abi_X86_64: 1,
  752. },
  753. },
  754. expected: SelectionResult{
  755. "base",
  756. []string{
  757. "standalones/standalone-arm64_v8a.apex",
  758. },
  759. },
  760. },
  761. },
  762. },
  763. }
  764. for _, testCase := range testCases {
  765. var toc bp.BuildApksResult
  766. if err := prototext.Unmarshal([]byte(testCase.protoText), &toc); err != nil {
  767. t.Fatal(err)
  768. }
  769. for _, config := range testCase.configs {
  770. t.Run(config.name, func(t *testing.T) {
  771. actual := selectApks(&toc, config.targetConfig)
  772. if !reflect.DeepEqual(config.expected, actual) {
  773. t.Errorf("expected %v, got %v", config.expected, actual)
  774. }
  775. })
  776. }
  777. }
  778. }
  779. type testZip2ZipWriter struct {
  780. entries map[string]string
  781. }
  782. func (w testZip2ZipWriter) CopyFrom(file *zip.File, out string) error {
  783. if x, ok := w.entries[out]; ok {
  784. return fmt.Errorf("%s and %s both write to %s", x, file.Name, out)
  785. }
  786. w.entries[out] = file.Name
  787. return nil
  788. }
  789. type testCaseWriteApks struct {
  790. name string
  791. moduleName string
  792. stem string
  793. partition string
  794. // what we write from what
  795. zipEntries map[string]string
  796. expectedApkcerts []string
  797. }
  798. func TestWriteApks(t *testing.T) {
  799. testCases := []testCaseWriteApks{
  800. {
  801. name: "splits",
  802. moduleName: "mybase",
  803. stem: "Foo",
  804. partition: "system",
  805. zipEntries: map[string]string{
  806. "Foo.apk": "splits/mybase-master.apk",
  807. "Foo-xhdpi.apk": "splits/mybase-xhdpi.apk",
  808. },
  809. expectedApkcerts: []string{
  810. `name="Foo-xhdpi.apk" certificate="PRESIGNED" private_key="" partition="system"`,
  811. `name="Foo.apk" certificate="PRESIGNED" private_key="" partition="system"`,
  812. },
  813. },
  814. {
  815. name: "universal",
  816. moduleName: "base",
  817. stem: "Bar",
  818. partition: "product",
  819. zipEntries: map[string]string{
  820. "Bar.apk": "universal.apk",
  821. },
  822. expectedApkcerts: []string{
  823. `name="Bar.apk" certificate="PRESIGNED" private_key="" partition="product"`,
  824. },
  825. },
  826. }
  827. for _, testCase := range testCases {
  828. t.Run(testCase.name, func(t *testing.T) {
  829. testZipBuf := &bytes.Buffer{}
  830. testZip := zip.NewWriter(testZipBuf)
  831. for _, in := range testCase.zipEntries {
  832. f, _ := testZip.Create(in)
  833. f.Write([]byte(in))
  834. }
  835. testZip.Close()
  836. zipReader, _ := zip.NewReader(bytes.NewReader(testZipBuf.Bytes()), int64(testZipBuf.Len()))
  837. apkSet := ApkSet{entries: make(map[string]*zip.File)}
  838. sel := SelectionResult{moduleName: testCase.moduleName}
  839. for _, f := range zipReader.File {
  840. apkSet.entries[f.Name] = f
  841. sel.entries = append(sel.entries, f.Name)
  842. }
  843. zipWriter := testZip2ZipWriter{make(map[string]string)}
  844. outWriter := &bytes.Buffer{}
  845. config := TargetConfig{stem: testCase.stem}
  846. apkcerts, err := apkSet.writeApks(sel, config, outWriter, zipWriter, testCase.partition)
  847. if err != nil {
  848. t.Error(err)
  849. }
  850. expectedZipEntries := make(map[string]string)
  851. for k, v := range testCase.zipEntries {
  852. if k != testCase.stem+".apk" {
  853. expectedZipEntries[k] = v
  854. }
  855. }
  856. if !reflect.DeepEqual(expectedZipEntries, zipWriter.entries) {
  857. t.Errorf("expected zip entries %v, got %v", testCase.zipEntries, zipWriter.entries)
  858. }
  859. if !reflect.DeepEqual(testCase.expectedApkcerts, apkcerts) {
  860. t.Errorf("expected apkcerts %v, got %v", testCase.expectedApkcerts, apkcerts)
  861. }
  862. if g, w := outWriter.String(), testCase.zipEntries[testCase.stem+".apk"]; !reflect.DeepEqual(g, w) {
  863. t.Errorf("expected output file contents %q, got %q", testCase.stem+".apk", outWriter.String())
  864. }
  865. })
  866. }
  867. }