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