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 java 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "fmt" 19*333d2b36SAndroid Build Coastguard Worker "reflect" 20*333d2b36SAndroid Build Coastguard Worker "strings" 21*333d2b36SAndroid Build Coastguard Worker "testing" 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 24*333d2b36SAndroid Build Coastguard Worker) 25*333d2b36SAndroid Build Coastguard Worker 26*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppSet(t *testing.T) { 27*333d2b36SAndroid Build Coastguard Worker result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(t, ` 28*333d2b36SAndroid Build Coastguard Worker android_app_set { 29*333d2b36SAndroid Build Coastguard Worker name: "foo", 30*333d2b36SAndroid Build Coastguard Worker set: "prebuilts/apks/app.apks", 31*333d2b36SAndroid Build Coastguard Worker prerelease: true, 32*333d2b36SAndroid Build Coastguard Worker }`) 33*333d2b36SAndroid Build Coastguard Worker module := result.ModuleForTests("foo", "android_common") 34*333d2b36SAndroid Build Coastguard Worker const packedSplitApks = "foo.zip" 35*333d2b36SAndroid Build Coastguard Worker params := module.Output(packedSplitApks) 36*333d2b36SAndroid Build Coastguard Worker if params.Rule == nil { 37*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected output %s is missing", packedSplitApks) 38*333d2b36SAndroid Build Coastguard Worker } 39*333d2b36SAndroid Build Coastguard Worker if s := params.Args["allow-prereleased"]; s != "true" { 40*333d2b36SAndroid Build Coastguard Worker t.Errorf("wrong allow-prereleased value: '%s', expected 'true'", s) 41*333d2b36SAndroid Build Coastguard Worker } 42*333d2b36SAndroid Build Coastguard Worker if s := params.Args["partition"]; s != "system" { 43*333d2b36SAndroid Build Coastguard Worker t.Errorf("wrong partition value: '%s', expected 'system'", s) 44*333d2b36SAndroid Build Coastguard Worker } 45*333d2b36SAndroid Build Coastguard Worker 46*333d2b36SAndroid Build Coastguard Worker android.AssertPathRelativeToTopEquals(t, "incorrect output path", 47*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/foo/android_common/foo.apk", params.Output) 48*333d2b36SAndroid Build Coastguard Worker 49*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "incorrect implicit output paths", 50*333d2b36SAndroid Build Coastguard Worker []string{ 51*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/foo/android_common/foo.zip", 52*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/foo/android_common/apkcerts.txt", 53*333d2b36SAndroid Build Coastguard Worker }, 54*333d2b36SAndroid Build Coastguard Worker params.ImplicitOutputs.Paths()) 55*333d2b36SAndroid Build Coastguard Worker 56*333d2b36SAndroid Build Coastguard Worker mkEntries := android.AndroidMkEntriesForTest(t, result.TestContext, module.Module())[0] 57*333d2b36SAndroid Build Coastguard Worker actualInstallFile := mkEntries.EntryMap["LOCAL_APK_SET_INSTALL_FILE"] 58*333d2b36SAndroid Build Coastguard Worker expectedInstallFile := []string{ 59*333d2b36SAndroid Build Coastguard Worker strings.Replace(params.ImplicitOutputs[0].String(), android.TestOutSoongDir, result.Config.SoongOutDir(), 1), 60*333d2b36SAndroid Build Coastguard Worker } 61*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(actualInstallFile, expectedInstallFile) { 62*333d2b36SAndroid Build Coastguard Worker t.Errorf("Unexpected LOCAL_APK_SET_INSTALL_FILE value: '%s', expected: '%s',", 63*333d2b36SAndroid Build Coastguard Worker actualInstallFile, expectedInstallFile) 64*333d2b36SAndroid Build Coastguard Worker } 65*333d2b36SAndroid Build Coastguard Worker} 66*333d2b36SAndroid Build Coastguard Worker 67*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppSet_Variants(t *testing.T) { 68*333d2b36SAndroid Build Coastguard Worker bp := ` 69*333d2b36SAndroid Build Coastguard Worker android_app_set { 70*333d2b36SAndroid Build Coastguard Worker name: "foo", 71*333d2b36SAndroid Build Coastguard Worker set: "prebuilts/apks/app.apks", 72*333d2b36SAndroid Build Coastguard Worker }` 73*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 74*333d2b36SAndroid Build Coastguard Worker name string 75*333d2b36SAndroid Build Coastguard Worker targets []android.Target 76*333d2b36SAndroid Build Coastguard Worker aaptPrebuiltDPI []string 77*333d2b36SAndroid Build Coastguard Worker sdkVersion int 78*333d2b36SAndroid Build Coastguard Worker expected map[string]string 79*333d2b36SAndroid Build Coastguard Worker }{ 80*333d2b36SAndroid Build Coastguard Worker { 81*333d2b36SAndroid Build Coastguard Worker name: "One", 82*333d2b36SAndroid Build Coastguard Worker targets: []android.Target{ 83*333d2b36SAndroid Build Coastguard Worker {Os: android.Android, Arch: android.Arch{ArchType: android.X86}}, 84*333d2b36SAndroid Build Coastguard Worker }, 85*333d2b36SAndroid Build Coastguard Worker aaptPrebuiltDPI: []string{"ldpi", "xxhdpi"}, 86*333d2b36SAndroid Build Coastguard Worker sdkVersion: 29, 87*333d2b36SAndroid Build Coastguard Worker expected: map[string]string{ 88*333d2b36SAndroid Build Coastguard Worker "abis": "X86", 89*333d2b36SAndroid Build Coastguard Worker "allow-prereleased": "false", 90*333d2b36SAndroid Build Coastguard Worker "screen-densities": "LDPI,XXHDPI", 91*333d2b36SAndroid Build Coastguard Worker "sdk-version": "29", 92*333d2b36SAndroid Build Coastguard Worker "skip-sdk-check": "false", 93*333d2b36SAndroid Build Coastguard Worker "stem": "foo", 94*333d2b36SAndroid Build Coastguard Worker }, 95*333d2b36SAndroid Build Coastguard Worker }, 96*333d2b36SAndroid Build Coastguard Worker { 97*333d2b36SAndroid Build Coastguard Worker name: "Two", 98*333d2b36SAndroid Build Coastguard Worker targets: []android.Target{ 99*333d2b36SAndroid Build Coastguard Worker {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64}}, 100*333d2b36SAndroid Build Coastguard Worker {Os: android.Android, Arch: android.Arch{ArchType: android.X86}}, 101*333d2b36SAndroid Build Coastguard Worker }, 102*333d2b36SAndroid Build Coastguard Worker aaptPrebuiltDPI: nil, 103*333d2b36SAndroid Build Coastguard Worker sdkVersion: 30, 104*333d2b36SAndroid Build Coastguard Worker expected: map[string]string{ 105*333d2b36SAndroid Build Coastguard Worker "abis": "X86_64,X86", 106*333d2b36SAndroid Build Coastguard Worker "allow-prereleased": "false", 107*333d2b36SAndroid Build Coastguard Worker "screen-densities": "all", 108*333d2b36SAndroid Build Coastguard Worker "sdk-version": "30", 109*333d2b36SAndroid Build Coastguard Worker "skip-sdk-check": "false", 110*333d2b36SAndroid Build Coastguard Worker "stem": "foo", 111*333d2b36SAndroid Build Coastguard Worker }, 112*333d2b36SAndroid Build Coastguard Worker }, 113*333d2b36SAndroid Build Coastguard Worker } 114*333d2b36SAndroid Build Coastguard Worker 115*333d2b36SAndroid Build Coastguard Worker for _, test := range testCases { 116*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers( 117*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 118*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 119*333d2b36SAndroid Build Coastguard Worker variables.AAPTPrebuiltDPI = test.aaptPrebuiltDPI 120*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_version = &test.sdkVersion 121*333d2b36SAndroid Build Coastguard Worker }), 122*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyConfig(func(config android.Config) { 123*333d2b36SAndroid Build Coastguard Worker config.Targets[android.Android] = test.targets 124*333d2b36SAndroid Build Coastguard Worker }), 125*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 126*333d2b36SAndroid Build Coastguard Worker 127*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests("foo", "android_common") 128*333d2b36SAndroid Build Coastguard Worker const packedSplitApks = "foo.zip" 129*333d2b36SAndroid Build Coastguard Worker params := module.Output(packedSplitApks) 130*333d2b36SAndroid Build Coastguard Worker for k, v := range test.expected { 131*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 132*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, fmt.Sprintf("arg value for `%s`", k), v, params.Args[k]) 133*333d2b36SAndroid Build Coastguard Worker }) 134*333d2b36SAndroid Build Coastguard Worker } 135*333d2b36SAndroid Build Coastguard Worker } 136*333d2b36SAndroid Build Coastguard Worker} 137