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 "github.com/google/blueprint/proptools" 24*333d2b36SAndroid Build Coastguard Worker 25*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 26*333d2b36SAndroid Build Coastguard Worker) 27*333d2b36SAndroid Build Coastguard Worker 28*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport(t *testing.T) { 29*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 30*333d2b36SAndroid Build Coastguard Worker android_app_import { 31*333d2b36SAndroid Build Coastguard Worker name: "foo", 32*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 33*333d2b36SAndroid Build Coastguard Worker certificate: "platform", 34*333d2b36SAndroid Build Coastguard Worker dex_preopt: { 35*333d2b36SAndroid Build Coastguard Worker enabled: true, 36*333d2b36SAndroid Build Coastguard Worker }, 37*333d2b36SAndroid Build Coastguard Worker } 38*333d2b36SAndroid Build Coastguard Worker `) 39*333d2b36SAndroid Build Coastguard Worker 40*333d2b36SAndroid Build Coastguard Worker variant := ctx.ModuleForTests("foo", "android_common") 41*333d2b36SAndroid Build Coastguard Worker 42*333d2b36SAndroid Build Coastguard Worker // Check dexpreopt outputs. 43*333d2b36SAndroid Build Coastguard Worker if variant.MaybeOutput("dexpreopt/foo/oat/arm64/package.vdex").Rule == nil || 44*333d2b36SAndroid Build Coastguard Worker variant.MaybeOutput("dexpreopt/foo/oat/arm64/package.odex").Rule == nil { 45*333d2b36SAndroid Build Coastguard Worker t.Errorf("can't find dexpreopt outputs") 46*333d2b36SAndroid Build Coastguard Worker } 47*333d2b36SAndroid Build Coastguard Worker 48*333d2b36SAndroid Build Coastguard Worker // Check cert signing flag. 49*333d2b36SAndroid Build Coastguard Worker signedApk := variant.Output("signed/foo.apk") 50*333d2b36SAndroid Build Coastguard Worker signingFlag := signedApk.Args["certificates"] 51*333d2b36SAndroid Build Coastguard Worker expected := "build/make/target/product/security/platform.x509.pem build/make/target/product/security/platform.pk8" 52*333d2b36SAndroid Build Coastguard Worker if expected != signingFlag { 53*333d2b36SAndroid Build Coastguard Worker t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected, signingFlag) 54*333d2b36SAndroid Build Coastguard Worker } 55*333d2b36SAndroid Build Coastguard Worker rule := variant.Rule("genProvenanceMetaData") 56*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid input", "prebuilts/apk/app.apk", rule.Inputs[0].String()) 57*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", rule.Output.String()) 58*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", "foo", rule.Args["module_name"]) 59*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", "/system/app/foo/foo.apk", rule.Args["install_path"]) 60*333d2b36SAndroid Build Coastguard Worker} 61*333d2b36SAndroid Build Coastguard Worker 62*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport_NoDexPreopt(t *testing.T) { 63*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 64*333d2b36SAndroid Build Coastguard Worker android_app_import { 65*333d2b36SAndroid Build Coastguard Worker name: "foo", 66*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 67*333d2b36SAndroid Build Coastguard Worker certificate: "platform", 68*333d2b36SAndroid Build Coastguard Worker dex_preopt: { 69*333d2b36SAndroid Build Coastguard Worker enabled: false, 70*333d2b36SAndroid Build Coastguard Worker }, 71*333d2b36SAndroid Build Coastguard Worker } 72*333d2b36SAndroid Build Coastguard Worker `) 73*333d2b36SAndroid Build Coastguard Worker 74*333d2b36SAndroid Build Coastguard Worker variant := ctx.ModuleForTests("foo", "android_common") 75*333d2b36SAndroid Build Coastguard Worker 76*333d2b36SAndroid Build Coastguard Worker // Check dexpreopt outputs. They shouldn't exist. 77*333d2b36SAndroid Build Coastguard Worker if variant.MaybeOutput("dexpreopt/foo/oat/arm64/package.vdex").Rule != nil || 78*333d2b36SAndroid Build Coastguard Worker variant.MaybeOutput("dexpreopt/foo/oat/arm64/package.odex").Rule != nil { 79*333d2b36SAndroid Build Coastguard Worker t.Errorf("dexpreopt shouldn't have run.") 80*333d2b36SAndroid Build Coastguard Worker } 81*333d2b36SAndroid Build Coastguard Worker 82*333d2b36SAndroid Build Coastguard Worker rule := variant.Rule("genProvenanceMetaData") 83*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid input", "prebuilts/apk/app.apk", rule.Inputs[0].String()) 84*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", rule.Output.String()) 85*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", "foo", rule.Args["module_name"]) 86*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", "/system/app/foo/foo.apk", rule.Args["install_path"]) 87*333d2b36SAndroid Build Coastguard Worker} 88*333d2b36SAndroid Build Coastguard Worker 89*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport_Presigned(t *testing.T) { 90*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 91*333d2b36SAndroid Build Coastguard Worker android_app_import { 92*333d2b36SAndroid Build Coastguard Worker name: "foo", 93*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 94*333d2b36SAndroid Build Coastguard Worker presigned: true, 95*333d2b36SAndroid Build Coastguard Worker dex_preopt: { 96*333d2b36SAndroid Build Coastguard Worker enabled: true, 97*333d2b36SAndroid Build Coastguard Worker }, 98*333d2b36SAndroid Build Coastguard Worker } 99*333d2b36SAndroid Build Coastguard Worker `) 100*333d2b36SAndroid Build Coastguard Worker 101*333d2b36SAndroid Build Coastguard Worker variant := ctx.ModuleForTests("foo", "android_common") 102*333d2b36SAndroid Build Coastguard Worker 103*333d2b36SAndroid Build Coastguard Worker // Check dexpreopt outputs. 104*333d2b36SAndroid Build Coastguard Worker if variant.MaybeOutput("dexpreopt/foo/oat/arm64/package.vdex").Rule == nil || 105*333d2b36SAndroid Build Coastguard Worker variant.MaybeOutput("dexpreopt/foo/oat/arm64/package.odex").Rule == nil { 106*333d2b36SAndroid Build Coastguard Worker t.Errorf("can't find dexpreopt outputs") 107*333d2b36SAndroid Build Coastguard Worker } 108*333d2b36SAndroid Build Coastguard Worker // Make sure signing was skipped and aligning was done. 109*333d2b36SAndroid Build Coastguard Worker if variant.MaybeOutput("signed/foo.apk").Rule != nil { 110*333d2b36SAndroid Build Coastguard Worker t.Errorf("signing rule shouldn't be included.") 111*333d2b36SAndroid Build Coastguard Worker } 112*333d2b36SAndroid Build Coastguard Worker if variant.MaybeOutput("zip-aligned/foo.apk").Rule == nil { 113*333d2b36SAndroid Build Coastguard Worker t.Errorf("can't find aligning rule") 114*333d2b36SAndroid Build Coastguard Worker } 115*333d2b36SAndroid Build Coastguard Worker 116*333d2b36SAndroid Build Coastguard Worker rule := variant.Rule("genProvenanceMetaData") 117*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid input", "prebuilts/apk/app.apk", rule.Inputs[0].String()) 118*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", rule.Output.String()) 119*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", "foo", rule.Args["module_name"]) 120*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", "/system/app/foo/foo.apk", rule.Args["install_path"]) 121*333d2b36SAndroid Build Coastguard Worker} 122*333d2b36SAndroid Build Coastguard Worker 123*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport_SigningLineage(t *testing.T) { 124*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 125*333d2b36SAndroid Build Coastguard Worker android_app_import { 126*333d2b36SAndroid Build Coastguard Worker name: "foo", 127*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 128*333d2b36SAndroid Build Coastguard Worker certificate: "platform", 129*333d2b36SAndroid Build Coastguard Worker additional_certificates: [":additional_certificate"], 130*333d2b36SAndroid Build Coastguard Worker lineage: "lineage.bin", 131*333d2b36SAndroid Build Coastguard Worker rotationMinSdkVersion: "32", 132*333d2b36SAndroid Build Coastguard Worker } 133*333d2b36SAndroid Build Coastguard Worker 134*333d2b36SAndroid Build Coastguard Worker android_app_certificate { 135*333d2b36SAndroid Build Coastguard Worker name: "additional_certificate", 136*333d2b36SAndroid Build Coastguard Worker certificate: "cert/additional_cert", 137*333d2b36SAndroid Build Coastguard Worker } 138*333d2b36SAndroid Build Coastguard Worker `) 139*333d2b36SAndroid Build Coastguard Worker 140*333d2b36SAndroid Build Coastguard Worker variant := ctx.ModuleForTests("foo", "android_common") 141*333d2b36SAndroid Build Coastguard Worker 142*333d2b36SAndroid Build Coastguard Worker signedApk := variant.Output("signed/foo.apk") 143*333d2b36SAndroid Build Coastguard Worker // Check certificates 144*333d2b36SAndroid Build Coastguard Worker certificatesFlag := signedApk.Args["certificates"] 145*333d2b36SAndroid Build Coastguard Worker expected := "build/make/target/product/security/platform.x509.pem " + 146*333d2b36SAndroid Build Coastguard Worker "build/make/target/product/security/platform.pk8 " + 147*333d2b36SAndroid Build Coastguard Worker "cert/additional_cert.x509.pem cert/additional_cert.pk8" 148*333d2b36SAndroid Build Coastguard Worker if expected != certificatesFlag { 149*333d2b36SAndroid Build Coastguard Worker t.Errorf("Incorrect certificates flags, expected: %q, got: %q", expected, certificatesFlag) 150*333d2b36SAndroid Build Coastguard Worker } 151*333d2b36SAndroid Build Coastguard Worker 152*333d2b36SAndroid Build Coastguard Worker // Check cert signing flags. 153*333d2b36SAndroid Build Coastguard Worker actualCertSigningFlags := signedApk.Args["flags"] 154*333d2b36SAndroid Build Coastguard Worker expectedCertSigningFlags := "--lineage lineage.bin --rotation-min-sdk-version 32" 155*333d2b36SAndroid Build Coastguard Worker if expectedCertSigningFlags != actualCertSigningFlags { 156*333d2b36SAndroid Build Coastguard Worker t.Errorf("Incorrect signing flags, expected: %q, got: %q", expectedCertSigningFlags, actualCertSigningFlags) 157*333d2b36SAndroid Build Coastguard Worker } 158*333d2b36SAndroid Build Coastguard Worker 159*333d2b36SAndroid Build Coastguard Worker rule := variant.Rule("genProvenanceMetaData") 160*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid input", "prebuilts/apk/app.apk", rule.Inputs[0].String()) 161*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", rule.Output.String()) 162*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", "foo", rule.Args["module_name"]) 163*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", "/system/app/foo/foo.apk", rule.Args["install_path"]) 164*333d2b36SAndroid Build Coastguard Worker} 165*333d2b36SAndroid Build Coastguard Worker 166*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport_SigningLineageFilegroup(t *testing.T) { 167*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 168*333d2b36SAndroid Build Coastguard Worker android_app_import { 169*333d2b36SAndroid Build Coastguard Worker name: "foo", 170*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 171*333d2b36SAndroid Build Coastguard Worker certificate: "platform", 172*333d2b36SAndroid Build Coastguard Worker lineage: ":lineage_bin", 173*333d2b36SAndroid Build Coastguard Worker } 174*333d2b36SAndroid Build Coastguard Worker 175*333d2b36SAndroid Build Coastguard Worker filegroup { 176*333d2b36SAndroid Build Coastguard Worker name: "lineage_bin", 177*333d2b36SAndroid Build Coastguard Worker srcs: ["lineage.bin"], 178*333d2b36SAndroid Build Coastguard Worker } 179*333d2b36SAndroid Build Coastguard Worker `) 180*333d2b36SAndroid Build Coastguard Worker 181*333d2b36SAndroid Build Coastguard Worker variant := ctx.ModuleForTests("foo", "android_common") 182*333d2b36SAndroid Build Coastguard Worker 183*333d2b36SAndroid Build Coastguard Worker signedApk := variant.Output("signed/foo.apk") 184*333d2b36SAndroid Build Coastguard Worker // Check cert signing lineage flag. 185*333d2b36SAndroid Build Coastguard Worker signingFlag := signedApk.Args["flags"] 186*333d2b36SAndroid Build Coastguard Worker expected := "--lineage lineage.bin" 187*333d2b36SAndroid Build Coastguard Worker if expected != signingFlag { 188*333d2b36SAndroid Build Coastguard Worker t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected, signingFlag) 189*333d2b36SAndroid Build Coastguard Worker } 190*333d2b36SAndroid Build Coastguard Worker 191*333d2b36SAndroid Build Coastguard Worker rule := variant.Rule("genProvenanceMetaData") 192*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid input", "prebuilts/apk/app.apk", rule.Inputs[0].String()) 193*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", rule.Output.String()) 194*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", "foo", rule.Args["module_name"]) 195*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", "/system/app/foo/foo.apk", rule.Args["install_path"]) 196*333d2b36SAndroid Build Coastguard Worker} 197*333d2b36SAndroid Build Coastguard Worker 198*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport_DefaultDevCert(t *testing.T) { 199*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 200*333d2b36SAndroid Build Coastguard Worker android_app_import { 201*333d2b36SAndroid Build Coastguard Worker name: "foo", 202*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 203*333d2b36SAndroid Build Coastguard Worker default_dev_cert: true, 204*333d2b36SAndroid Build Coastguard Worker dex_preopt: { 205*333d2b36SAndroid Build Coastguard Worker enabled: true, 206*333d2b36SAndroid Build Coastguard Worker }, 207*333d2b36SAndroid Build Coastguard Worker } 208*333d2b36SAndroid Build Coastguard Worker `) 209*333d2b36SAndroid Build Coastguard Worker 210*333d2b36SAndroid Build Coastguard Worker variant := ctx.ModuleForTests("foo", "android_common") 211*333d2b36SAndroid Build Coastguard Worker 212*333d2b36SAndroid Build Coastguard Worker // Check dexpreopt outputs. 213*333d2b36SAndroid Build Coastguard Worker if variant.MaybeOutput("dexpreopt/foo/oat/arm64/package.vdex").Rule == nil || 214*333d2b36SAndroid Build Coastguard Worker variant.MaybeOutput("dexpreopt/foo/oat/arm64/package.odex").Rule == nil { 215*333d2b36SAndroid Build Coastguard Worker t.Errorf("can't find dexpreopt outputs") 216*333d2b36SAndroid Build Coastguard Worker } 217*333d2b36SAndroid Build Coastguard Worker 218*333d2b36SAndroid Build Coastguard Worker // Check cert signing flag. 219*333d2b36SAndroid Build Coastguard Worker signedApk := variant.Output("signed/foo.apk") 220*333d2b36SAndroid Build Coastguard Worker signingFlag := signedApk.Args["certificates"] 221*333d2b36SAndroid Build Coastguard Worker expected := "build/make/target/product/security/testkey.x509.pem build/make/target/product/security/testkey.pk8" 222*333d2b36SAndroid Build Coastguard Worker if expected != signingFlag { 223*333d2b36SAndroid Build Coastguard Worker t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected, signingFlag) 224*333d2b36SAndroid Build Coastguard Worker } 225*333d2b36SAndroid Build Coastguard Worker 226*333d2b36SAndroid Build Coastguard Worker rule := variant.Rule("genProvenanceMetaData") 227*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid input", "prebuilts/apk/app.apk", rule.Inputs[0].String()) 228*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", rule.Output.String()) 229*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", "foo", rule.Args["module_name"]) 230*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", "/system/app/foo/foo.apk", rule.Args["install_path"]) 231*333d2b36SAndroid Build Coastguard Worker} 232*333d2b36SAndroid Build Coastguard Worker 233*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport_DpiVariants(t *testing.T) { 234*333d2b36SAndroid Build Coastguard Worker bp := ` 235*333d2b36SAndroid Build Coastguard Worker android_app_import { 236*333d2b36SAndroid Build Coastguard Worker name: "foo", 237*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 238*333d2b36SAndroid Build Coastguard Worker dpi_variants: { 239*333d2b36SAndroid Build Coastguard Worker xhdpi: { 240*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app_xhdpi.apk", 241*333d2b36SAndroid Build Coastguard Worker }, 242*333d2b36SAndroid Build Coastguard Worker xxhdpi: { 243*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app_xxhdpi.apk", 244*333d2b36SAndroid Build Coastguard Worker }, 245*333d2b36SAndroid Build Coastguard Worker }, 246*333d2b36SAndroid Build Coastguard Worker presigned: true, 247*333d2b36SAndroid Build Coastguard Worker dex_preopt: { 248*333d2b36SAndroid Build Coastguard Worker enabled: true, 249*333d2b36SAndroid Build Coastguard Worker }, 250*333d2b36SAndroid Build Coastguard Worker } 251*333d2b36SAndroid Build Coastguard Worker ` 252*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 253*333d2b36SAndroid Build Coastguard Worker name string 254*333d2b36SAndroid Build Coastguard Worker aaptPreferredConfig *string 255*333d2b36SAndroid Build Coastguard Worker aaptPrebuiltDPI []string 256*333d2b36SAndroid Build Coastguard Worker expected string 257*333d2b36SAndroid Build Coastguard Worker expectedProvenanceMetaDataArtifactPath string 258*333d2b36SAndroid Build Coastguard Worker }{ 259*333d2b36SAndroid Build Coastguard Worker { 260*333d2b36SAndroid Build Coastguard Worker name: "no preferred", 261*333d2b36SAndroid Build Coastguard Worker aaptPreferredConfig: nil, 262*333d2b36SAndroid Build Coastguard Worker aaptPrebuiltDPI: []string{}, 263*333d2b36SAndroid Build Coastguard Worker expected: "verify_uses_libraries/apk/app.apk", 264*333d2b36SAndroid Build Coastguard Worker expectedProvenanceMetaDataArtifactPath: "prebuilts/apk/app.apk", 265*333d2b36SAndroid Build Coastguard Worker }, 266*333d2b36SAndroid Build Coastguard Worker { 267*333d2b36SAndroid Build Coastguard Worker name: "AAPTPreferredConfig matches", 268*333d2b36SAndroid Build Coastguard Worker aaptPreferredConfig: proptools.StringPtr("xhdpi"), 269*333d2b36SAndroid Build Coastguard Worker aaptPrebuiltDPI: []string{"xxhdpi", "ldpi"}, 270*333d2b36SAndroid Build Coastguard Worker expected: "verify_uses_libraries/apk/app_xhdpi.apk", 271*333d2b36SAndroid Build Coastguard Worker expectedProvenanceMetaDataArtifactPath: "prebuilts/apk/app_xhdpi.apk", 272*333d2b36SAndroid Build Coastguard Worker }, 273*333d2b36SAndroid Build Coastguard Worker { 274*333d2b36SAndroid Build Coastguard Worker name: "AAPTPrebuiltDPI matches", 275*333d2b36SAndroid Build Coastguard Worker aaptPreferredConfig: proptools.StringPtr("mdpi"), 276*333d2b36SAndroid Build Coastguard Worker aaptPrebuiltDPI: []string{"xxhdpi", "xhdpi"}, 277*333d2b36SAndroid Build Coastguard Worker expected: "verify_uses_libraries/apk/app_xxhdpi.apk", 278*333d2b36SAndroid Build Coastguard Worker expectedProvenanceMetaDataArtifactPath: "prebuilts/apk/app_xxhdpi.apk", 279*333d2b36SAndroid Build Coastguard Worker }, 280*333d2b36SAndroid Build Coastguard Worker { 281*333d2b36SAndroid Build Coastguard Worker name: "non-first AAPTPrebuiltDPI matches", 282*333d2b36SAndroid Build Coastguard Worker aaptPreferredConfig: proptools.StringPtr("mdpi"), 283*333d2b36SAndroid Build Coastguard Worker aaptPrebuiltDPI: []string{"ldpi", "xhdpi"}, 284*333d2b36SAndroid Build Coastguard Worker expected: "verify_uses_libraries/apk/app_xhdpi.apk", 285*333d2b36SAndroid Build Coastguard Worker expectedProvenanceMetaDataArtifactPath: "prebuilts/apk/app_xhdpi.apk", 286*333d2b36SAndroid Build Coastguard Worker }, 287*333d2b36SAndroid Build Coastguard Worker { 288*333d2b36SAndroid Build Coastguard Worker name: "no matches", 289*333d2b36SAndroid Build Coastguard Worker aaptPreferredConfig: proptools.StringPtr("mdpi"), 290*333d2b36SAndroid Build Coastguard Worker aaptPrebuiltDPI: []string{"ldpi", "xxxhdpi"}, 291*333d2b36SAndroid Build Coastguard Worker expected: "verify_uses_libraries/apk/app.apk", 292*333d2b36SAndroid Build Coastguard Worker expectedProvenanceMetaDataArtifactPath: "prebuilts/apk/app.apk", 293*333d2b36SAndroid Build Coastguard Worker }, 294*333d2b36SAndroid Build Coastguard Worker } 295*333d2b36SAndroid Build Coastguard Worker 296*333d2b36SAndroid Build Coastguard Worker for _, test := range testCases { 297*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 298*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 299*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 300*333d2b36SAndroid Build Coastguard Worker variables.AAPTPreferredConfig = test.aaptPreferredConfig 301*333d2b36SAndroid Build Coastguard Worker variables.AAPTPrebuiltDPI = test.aaptPrebuiltDPI 302*333d2b36SAndroid Build Coastguard Worker }), 303*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 304*333d2b36SAndroid Build Coastguard Worker 305*333d2b36SAndroid Build Coastguard Worker variant := result.ModuleForTests("foo", "android_common") 306*333d2b36SAndroid Build Coastguard Worker input := variant.Output("jnis-uncompressed/foo.apk").Input.String() 307*333d2b36SAndroid Build Coastguard Worker if strings.HasSuffix(input, test.expected) { 308*333d2b36SAndroid Build Coastguard Worker t.Errorf("wrong src apk, expected: %q got: %q", test.expected, input) 309*333d2b36SAndroid Build Coastguard Worker } 310*333d2b36SAndroid Build Coastguard Worker 311*333d2b36SAndroid Build Coastguard Worker provenanceMetaDataRule := variant.Rule("genProvenanceMetaData") 312*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid input", test.expectedProvenanceMetaDataArtifactPath, provenanceMetaDataRule.Inputs[0].String()) 313*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", provenanceMetaDataRule.Output.String()) 314*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", "foo", provenanceMetaDataRule.Args["module_name"]) 315*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", "/system/app/foo/foo.apk", provenanceMetaDataRule.Args["install_path"]) 316*333d2b36SAndroid Build Coastguard Worker } 317*333d2b36SAndroid Build Coastguard Worker} 318*333d2b36SAndroid Build Coastguard Worker 319*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport_Filename(t *testing.T) { 320*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 321*333d2b36SAndroid Build Coastguard Worker android_app_import { 322*333d2b36SAndroid Build Coastguard Worker name: "foo", 323*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 324*333d2b36SAndroid Build Coastguard Worker presigned: true, 325*333d2b36SAndroid Build Coastguard Worker } 326*333d2b36SAndroid Build Coastguard Worker 327*333d2b36SAndroid Build Coastguard Worker android_app_import { 328*333d2b36SAndroid Build Coastguard Worker name: "bar", 329*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 330*333d2b36SAndroid Build Coastguard Worker presigned: true, 331*333d2b36SAndroid Build Coastguard Worker filename: "bar_sample.apk" 332*333d2b36SAndroid Build Coastguard Worker } 333*333d2b36SAndroid Build Coastguard Worker `) 334*333d2b36SAndroid Build Coastguard Worker 335*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 336*333d2b36SAndroid Build Coastguard Worker name string 337*333d2b36SAndroid Build Coastguard Worker expected string 338*333d2b36SAndroid Build Coastguard Worker onDevice string 339*333d2b36SAndroid Build Coastguard Worker expectedArtifactPath string 340*333d2b36SAndroid Build Coastguard Worker expectedMetaDataPath string 341*333d2b36SAndroid Build Coastguard Worker }{ 342*333d2b36SAndroid Build Coastguard Worker { 343*333d2b36SAndroid Build Coastguard Worker name: "foo", 344*333d2b36SAndroid Build Coastguard Worker expected: "foo.apk", 345*333d2b36SAndroid Build Coastguard Worker onDevice: "/system/app/foo/foo.apk", 346*333d2b36SAndroid Build Coastguard Worker expectedArtifactPath: "prebuilts/apk/app.apk", 347*333d2b36SAndroid Build Coastguard Worker expectedMetaDataPath: "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", 348*333d2b36SAndroid Build Coastguard Worker }, 349*333d2b36SAndroid Build Coastguard Worker { 350*333d2b36SAndroid Build Coastguard Worker name: "bar", 351*333d2b36SAndroid Build Coastguard Worker expected: "bar_sample.apk", 352*333d2b36SAndroid Build Coastguard Worker onDevice: "/system/app/bar/bar_sample.apk", 353*333d2b36SAndroid Build Coastguard Worker expectedArtifactPath: "prebuilts/apk/app.apk", 354*333d2b36SAndroid Build Coastguard Worker expectedMetaDataPath: "out/soong/.intermediates/provenance_metadata/bar/provenance_metadata.textproto", 355*333d2b36SAndroid Build Coastguard Worker }, 356*333d2b36SAndroid Build Coastguard Worker } 357*333d2b36SAndroid Build Coastguard Worker 358*333d2b36SAndroid Build Coastguard Worker for _, test := range testCases { 359*333d2b36SAndroid Build Coastguard Worker variant := ctx.ModuleForTests(test.name, "android_common") 360*333d2b36SAndroid Build Coastguard Worker if variant.MaybeOutput(test.expected).Rule == nil { 361*333d2b36SAndroid Build Coastguard Worker t.Errorf("can't find output named %q - all outputs: %v", test.expected, variant.AllOutputs()) 362*333d2b36SAndroid Build Coastguard Worker } 363*333d2b36SAndroid Build Coastguard Worker 364*333d2b36SAndroid Build Coastguard Worker a := variant.Module().(*AndroidAppImport) 365*333d2b36SAndroid Build Coastguard Worker expectedValues := []string{test.expected} 366*333d2b36SAndroid Build Coastguard Worker entries := android.AndroidMkEntriesForTest(t, ctx, a)[0] 367*333d2b36SAndroid Build Coastguard Worker actualValues := entries.EntryMap["LOCAL_INSTALLED_MODULE_STEM"] 368*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(actualValues, expectedValues) { 369*333d2b36SAndroid Build Coastguard Worker t.Errorf("Incorrect LOCAL_INSTALLED_MODULE_STEM value '%s', expected '%s'", 370*333d2b36SAndroid Build Coastguard Worker actualValues, expectedValues) 371*333d2b36SAndroid Build Coastguard Worker } 372*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "android_app_import", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0]) 373*333d2b36SAndroid Build Coastguard Worker 374*333d2b36SAndroid Build Coastguard Worker rule := variant.Rule("genProvenanceMetaData") 375*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid input", test.expectedArtifactPath, rule.Inputs[0].String()) 376*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid output", test.expectedMetaDataPath, rule.Output.String()) 377*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", test.name, rule.Args["module_name"]) 378*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", test.onDevice, rule.Args["install_path"]) 379*333d2b36SAndroid Build Coastguard Worker } 380*333d2b36SAndroid Build Coastguard Worker} 381*333d2b36SAndroid Build Coastguard Worker 382*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport_ArchVariants(t *testing.T) { 383*333d2b36SAndroid Build Coastguard Worker // The test config's target arch is ARM64. 384*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 385*333d2b36SAndroid Build Coastguard Worker name string 386*333d2b36SAndroid Build Coastguard Worker bp string 387*333d2b36SAndroid Build Coastguard Worker expected string 388*333d2b36SAndroid Build Coastguard Worker artifactPath string 389*333d2b36SAndroid Build Coastguard Worker metaDataPath string 390*333d2b36SAndroid Build Coastguard Worker installPath string 391*333d2b36SAndroid Build Coastguard Worker }{ 392*333d2b36SAndroid Build Coastguard Worker { 393*333d2b36SAndroid Build Coastguard Worker name: "matching arch", 394*333d2b36SAndroid Build Coastguard Worker bp: ` 395*333d2b36SAndroid Build Coastguard Worker android_app_import { 396*333d2b36SAndroid Build Coastguard Worker name: "foo", 397*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 398*333d2b36SAndroid Build Coastguard Worker arch: { 399*333d2b36SAndroid Build Coastguard Worker arm64: { 400*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app_arm64.apk", 401*333d2b36SAndroid Build Coastguard Worker }, 402*333d2b36SAndroid Build Coastguard Worker }, 403*333d2b36SAndroid Build Coastguard Worker presigned: true, 404*333d2b36SAndroid Build Coastguard Worker dex_preopt: { 405*333d2b36SAndroid Build Coastguard Worker enabled: true, 406*333d2b36SAndroid Build Coastguard Worker }, 407*333d2b36SAndroid Build Coastguard Worker } 408*333d2b36SAndroid Build Coastguard Worker `, 409*333d2b36SAndroid Build Coastguard Worker expected: "verify_uses_libraries/apk/app_arm64.apk", 410*333d2b36SAndroid Build Coastguard Worker artifactPath: "prebuilts/apk/app_arm64.apk", 411*333d2b36SAndroid Build Coastguard Worker installPath: "/system/app/foo/foo.apk", 412*333d2b36SAndroid Build Coastguard Worker }, 413*333d2b36SAndroid Build Coastguard Worker { 414*333d2b36SAndroid Build Coastguard Worker name: "matching arch without default", 415*333d2b36SAndroid Build Coastguard Worker bp: ` 416*333d2b36SAndroid Build Coastguard Worker android_app_import { 417*333d2b36SAndroid Build Coastguard Worker name: "foo", 418*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 419*333d2b36SAndroid Build Coastguard Worker arch: { 420*333d2b36SAndroid Build Coastguard Worker arm64: { 421*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app_arm64.apk", 422*333d2b36SAndroid Build Coastguard Worker }, 423*333d2b36SAndroid Build Coastguard Worker }, 424*333d2b36SAndroid Build Coastguard Worker presigned: true, 425*333d2b36SAndroid Build Coastguard Worker dex_preopt: { 426*333d2b36SAndroid Build Coastguard Worker enabled: true, 427*333d2b36SAndroid Build Coastguard Worker }, 428*333d2b36SAndroid Build Coastguard Worker } 429*333d2b36SAndroid Build Coastguard Worker `, 430*333d2b36SAndroid Build Coastguard Worker expected: "verify_uses_libraries/apk/app_arm64.apk", 431*333d2b36SAndroid Build Coastguard Worker artifactPath: "prebuilts/apk/app_arm64.apk", 432*333d2b36SAndroid Build Coastguard Worker installPath: "/system/app/foo/foo.apk", 433*333d2b36SAndroid Build Coastguard Worker }, 434*333d2b36SAndroid Build Coastguard Worker { 435*333d2b36SAndroid Build Coastguard Worker name: "no matching arch", 436*333d2b36SAndroid Build Coastguard Worker bp: ` 437*333d2b36SAndroid Build Coastguard Worker android_app_import { 438*333d2b36SAndroid Build Coastguard Worker name: "foo", 439*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 440*333d2b36SAndroid Build Coastguard Worker arch: { 441*333d2b36SAndroid Build Coastguard Worker arm: { 442*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app_arm.apk", 443*333d2b36SAndroid Build Coastguard Worker }, 444*333d2b36SAndroid Build Coastguard Worker }, 445*333d2b36SAndroid Build Coastguard Worker presigned: true, 446*333d2b36SAndroid Build Coastguard Worker dex_preopt: { 447*333d2b36SAndroid Build Coastguard Worker enabled: true, 448*333d2b36SAndroid Build Coastguard Worker }, 449*333d2b36SAndroid Build Coastguard Worker } 450*333d2b36SAndroid Build Coastguard Worker `, 451*333d2b36SAndroid Build Coastguard Worker expected: "verify_uses_libraries/apk/app.apk", 452*333d2b36SAndroid Build Coastguard Worker artifactPath: "prebuilts/apk/app.apk", 453*333d2b36SAndroid Build Coastguard Worker installPath: "/system/app/foo/foo.apk", 454*333d2b36SAndroid Build Coastguard Worker }, 455*333d2b36SAndroid Build Coastguard Worker { 456*333d2b36SAndroid Build Coastguard Worker name: "no matching arch without default", 457*333d2b36SAndroid Build Coastguard Worker bp: ` 458*333d2b36SAndroid Build Coastguard Worker android_app_import { 459*333d2b36SAndroid Build Coastguard Worker name: "foo", 460*333d2b36SAndroid Build Coastguard Worker arch: { 461*333d2b36SAndroid Build Coastguard Worker arm: { 462*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app_arm.apk", 463*333d2b36SAndroid Build Coastguard Worker }, 464*333d2b36SAndroid Build Coastguard Worker }, 465*333d2b36SAndroid Build Coastguard Worker presigned: true, 466*333d2b36SAndroid Build Coastguard Worker dex_preopt: { 467*333d2b36SAndroid Build Coastguard Worker enabled: true, 468*333d2b36SAndroid Build Coastguard Worker }, 469*333d2b36SAndroid Build Coastguard Worker } 470*333d2b36SAndroid Build Coastguard Worker `, 471*333d2b36SAndroid Build Coastguard Worker expected: "", 472*333d2b36SAndroid Build Coastguard Worker artifactPath: "prebuilts/apk/app_arm.apk", 473*333d2b36SAndroid Build Coastguard Worker installPath: "/system/app/foo/foo.apk", 474*333d2b36SAndroid Build Coastguard Worker }, 475*333d2b36SAndroid Build Coastguard Worker { 476*333d2b36SAndroid Build Coastguard Worker name: "matching arch and dpi_variants", 477*333d2b36SAndroid Build Coastguard Worker bp: ` 478*333d2b36SAndroid Build Coastguard Worker android_app_import { 479*333d2b36SAndroid Build Coastguard Worker name: "foo", 480*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 481*333d2b36SAndroid Build Coastguard Worker arch: { 482*333d2b36SAndroid Build Coastguard Worker arm64: { 483*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app_arm64.apk", 484*333d2b36SAndroid Build Coastguard Worker dpi_variants: { 485*333d2b36SAndroid Build Coastguard Worker mdpi: { 486*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app_arm64_mdpi.apk", 487*333d2b36SAndroid Build Coastguard Worker }, 488*333d2b36SAndroid Build Coastguard Worker xhdpi: { 489*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app_arm64_xhdpi.apk", 490*333d2b36SAndroid Build Coastguard Worker }, 491*333d2b36SAndroid Build Coastguard Worker }, 492*333d2b36SAndroid Build Coastguard Worker }, 493*333d2b36SAndroid Build Coastguard Worker }, 494*333d2b36SAndroid Build Coastguard Worker presigned: true, 495*333d2b36SAndroid Build Coastguard Worker dex_preopt: { 496*333d2b36SAndroid Build Coastguard Worker enabled: true, 497*333d2b36SAndroid Build Coastguard Worker }, 498*333d2b36SAndroid Build Coastguard Worker } 499*333d2b36SAndroid Build Coastguard Worker `, 500*333d2b36SAndroid Build Coastguard Worker expected: "verify_uses_libraries/apk/app_arm64_xhdpi.apk", 501*333d2b36SAndroid Build Coastguard Worker artifactPath: "prebuilts/apk/app_arm64_xhdpi.apk", 502*333d2b36SAndroid Build Coastguard Worker installPath: "/system/app/foo/foo.apk", 503*333d2b36SAndroid Build Coastguard Worker }, 504*333d2b36SAndroid Build Coastguard Worker } 505*333d2b36SAndroid Build Coastguard Worker 506*333d2b36SAndroid Build Coastguard Worker for _, test := range testCases { 507*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 508*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, test.bp) 509*333d2b36SAndroid Build Coastguard Worker 510*333d2b36SAndroid Build Coastguard Worker variant := ctx.ModuleForTests("foo", "android_common") 511*333d2b36SAndroid Build Coastguard Worker if test.expected == "" { 512*333d2b36SAndroid Build Coastguard Worker if variant.Module().Enabled(android.PanickingConfigAndErrorContext(ctx)) { 513*333d2b36SAndroid Build Coastguard Worker t.Error("module should have been disabled, but wasn't") 514*333d2b36SAndroid Build Coastguard Worker } 515*333d2b36SAndroid Build Coastguard Worker rule := variant.MaybeRule("genProvenanceMetaData") 516*333d2b36SAndroid Build Coastguard Worker android.AssertDeepEquals(t, "Provenance metadata is not empty", android.TestingBuildParams{}, rule) 517*333d2b36SAndroid Build Coastguard Worker return 518*333d2b36SAndroid Build Coastguard Worker } 519*333d2b36SAndroid Build Coastguard Worker input := variant.Output("jnis-uncompressed/foo.apk").Input.String() 520*333d2b36SAndroid Build Coastguard Worker if strings.HasSuffix(input, test.expected) { 521*333d2b36SAndroid Build Coastguard Worker t.Errorf("wrong src apk, expected: %q got: %q", test.expected, input) 522*333d2b36SAndroid Build Coastguard Worker } 523*333d2b36SAndroid Build Coastguard Worker rule := variant.Rule("genProvenanceMetaData") 524*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid input", test.artifactPath, rule.Inputs[0].String()) 525*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", rule.Output.String()) 526*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", "foo", rule.Args["module_name"]) 527*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", test.installPath, rule.Args["install_path"]) 528*333d2b36SAndroid Build Coastguard Worker }) 529*333d2b36SAndroid Build Coastguard Worker } 530*333d2b36SAndroid Build Coastguard Worker} 531*333d2b36SAndroid Build Coastguard Worker 532*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport_SoongConfigVariables(t *testing.T) { 533*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 534*333d2b36SAndroid Build Coastguard Worker name string 535*333d2b36SAndroid Build Coastguard Worker bp string 536*333d2b36SAndroid Build Coastguard Worker expected string 537*333d2b36SAndroid Build Coastguard Worker artifactPath string 538*333d2b36SAndroid Build Coastguard Worker metaDataPath string 539*333d2b36SAndroid Build Coastguard Worker installPath string 540*333d2b36SAndroid Build Coastguard Worker }{ 541*333d2b36SAndroid Build Coastguard Worker { 542*333d2b36SAndroid Build Coastguard Worker name: "matching arch", 543*333d2b36SAndroid Build Coastguard Worker bp: ` 544*333d2b36SAndroid Build Coastguard Worker soong_config_module_type { 545*333d2b36SAndroid Build Coastguard Worker name: "my_android_app_import", 546*333d2b36SAndroid Build Coastguard Worker module_type: "android_app_import", 547*333d2b36SAndroid Build Coastguard Worker config_namespace: "my_namespace", 548*333d2b36SAndroid Build Coastguard Worker value_variables: ["my_apk_var"], 549*333d2b36SAndroid Build Coastguard Worker properties: ["apk"], 550*333d2b36SAndroid Build Coastguard Worker } 551*333d2b36SAndroid Build Coastguard Worker soong_config_value_variable { 552*333d2b36SAndroid Build Coastguard Worker name: "my_apk_var", 553*333d2b36SAndroid Build Coastguard Worker } 554*333d2b36SAndroid Build Coastguard Worker my_android_app_import { 555*333d2b36SAndroid Build Coastguard Worker name: "foo", 556*333d2b36SAndroid Build Coastguard Worker soong_config_variables: { 557*333d2b36SAndroid Build Coastguard Worker my_apk_var: { 558*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/%s.apk", 559*333d2b36SAndroid Build Coastguard Worker }, 560*333d2b36SAndroid Build Coastguard Worker }, 561*333d2b36SAndroid Build Coastguard Worker presigned: true, 562*333d2b36SAndroid Build Coastguard Worker dex_preopt: { 563*333d2b36SAndroid Build Coastguard Worker enabled: true, 564*333d2b36SAndroid Build Coastguard Worker }, 565*333d2b36SAndroid Build Coastguard Worker } 566*333d2b36SAndroid Build Coastguard Worker `, 567*333d2b36SAndroid Build Coastguard Worker expected: "verify_uses_libraries/apk/name_from_soong_config.apk", 568*333d2b36SAndroid Build Coastguard Worker artifactPath: "prebuilts/apk/name_from_soong_config.apk", 569*333d2b36SAndroid Build Coastguard Worker installPath: "/system/app/foo/foo.apk", 570*333d2b36SAndroid Build Coastguard Worker }, 571*333d2b36SAndroid Build Coastguard Worker } 572*333d2b36SAndroid Build Coastguard Worker 573*333d2b36SAndroid Build Coastguard Worker for _, test := range testCases { 574*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 575*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers( 576*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 577*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithSoongConfigModuleBuildComponents, 578*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 579*333d2b36SAndroid Build Coastguard Worker variables.VendorVars = map[string]map[string]string{ 580*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 581*333d2b36SAndroid Build Coastguard Worker "my_apk_var": "name_from_soong_config", 582*333d2b36SAndroid Build Coastguard Worker }, 583*333d2b36SAndroid Build Coastguard Worker } 584*333d2b36SAndroid Build Coastguard Worker }), 585*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, test.bp).TestContext 586*333d2b36SAndroid Build Coastguard Worker 587*333d2b36SAndroid Build Coastguard Worker variant := ctx.ModuleForTests("foo", "android_common") 588*333d2b36SAndroid Build Coastguard Worker if test.expected == "" { 589*333d2b36SAndroid Build Coastguard Worker if variant.Module().Enabled(android.PanickingConfigAndErrorContext(ctx)) { 590*333d2b36SAndroid Build Coastguard Worker t.Error("module should have been disabled, but wasn't") 591*333d2b36SAndroid Build Coastguard Worker } 592*333d2b36SAndroid Build Coastguard Worker rule := variant.MaybeRule("genProvenanceMetaData") 593*333d2b36SAndroid Build Coastguard Worker android.AssertDeepEquals(t, "Provenance metadata is not empty", android.TestingBuildParams{}, rule) 594*333d2b36SAndroid Build Coastguard Worker return 595*333d2b36SAndroid Build Coastguard Worker } 596*333d2b36SAndroid Build Coastguard Worker input := variant.Output("jnis-uncompressed/foo.apk").Input.String() 597*333d2b36SAndroid Build Coastguard Worker if strings.HasSuffix(input, test.expected) { 598*333d2b36SAndroid Build Coastguard Worker t.Errorf("wrong src apk, expected: %q got: %q", test.expected, input) 599*333d2b36SAndroid Build Coastguard Worker } 600*333d2b36SAndroid Build Coastguard Worker rule := variant.Rule("genProvenanceMetaData") 601*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid input", test.artifactPath, rule.Inputs[0].String()) 602*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/foo/provenance_metadata.textproto", rule.Output.String()) 603*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", "foo", rule.Args["module_name"]) 604*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", test.installPath, rule.Args["install_path"]) 605*333d2b36SAndroid Build Coastguard Worker }) 606*333d2b36SAndroid Build Coastguard Worker } 607*333d2b36SAndroid Build Coastguard Worker} 608*333d2b36SAndroid Build Coastguard Worker 609*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport_overridesDisabledAndroidApp(t *testing.T) { 610*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 611*333d2b36SAndroid Build Coastguard Worker android_app { 612*333d2b36SAndroid Build Coastguard Worker name: "foo", 613*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 614*333d2b36SAndroid Build Coastguard Worker enabled: false, 615*333d2b36SAndroid Build Coastguard Worker } 616*333d2b36SAndroid Build Coastguard Worker 617*333d2b36SAndroid Build Coastguard Worker android_app_import { 618*333d2b36SAndroid Build Coastguard Worker name: "foo", 619*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 620*333d2b36SAndroid Build Coastguard Worker certificate: "platform", 621*333d2b36SAndroid Build Coastguard Worker prefer: true, 622*333d2b36SAndroid Build Coastguard Worker } 623*333d2b36SAndroid Build Coastguard Worker `) 624*333d2b36SAndroid Build Coastguard Worker 625*333d2b36SAndroid Build Coastguard Worker variant := ctx.ModuleForTests("prebuilt_foo", "android_common") 626*333d2b36SAndroid Build Coastguard Worker a := variant.Module().(*AndroidAppImport) 627*333d2b36SAndroid Build Coastguard Worker // The prebuilt module should still be enabled and active even if the source-based counterpart 628*333d2b36SAndroid Build Coastguard Worker // is disabled. 629*333d2b36SAndroid Build Coastguard Worker if !a.prebuilt.UsePrebuilt() { 630*333d2b36SAndroid Build Coastguard Worker t.Errorf("prebuilt foo module is not active") 631*333d2b36SAndroid Build Coastguard Worker } 632*333d2b36SAndroid Build Coastguard Worker if !a.Enabled(android.PanickingConfigAndErrorContext(ctx)) { 633*333d2b36SAndroid Build Coastguard Worker t.Errorf("prebuilt foo module is disabled") 634*333d2b36SAndroid Build Coastguard Worker } 635*333d2b36SAndroid Build Coastguard Worker} 636*333d2b36SAndroid Build Coastguard Worker 637*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport_relativeInstallPath(t *testing.T) { 638*333d2b36SAndroid Build Coastguard Worker bp := ` 639*333d2b36SAndroid Build Coastguard Worker android_app_import { 640*333d2b36SAndroid Build Coastguard Worker name: "no_relative_install_path", 641*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 642*333d2b36SAndroid Build Coastguard Worker presigned: true, 643*333d2b36SAndroid Build Coastguard Worker } 644*333d2b36SAndroid Build Coastguard Worker 645*333d2b36SAndroid Build Coastguard Worker android_app_import { 646*333d2b36SAndroid Build Coastguard Worker name: "relative_install_path", 647*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 648*333d2b36SAndroid Build Coastguard Worker presigned: true, 649*333d2b36SAndroid Build Coastguard Worker relative_install_path: "my/path", 650*333d2b36SAndroid Build Coastguard Worker } 651*333d2b36SAndroid Build Coastguard Worker 652*333d2b36SAndroid Build Coastguard Worker android_app_import { 653*333d2b36SAndroid Build Coastguard Worker name: "privileged_relative_install_path", 654*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 655*333d2b36SAndroid Build Coastguard Worker presigned: true, 656*333d2b36SAndroid Build Coastguard Worker privileged: true, 657*333d2b36SAndroid Build Coastguard Worker relative_install_path: "my/path" 658*333d2b36SAndroid Build Coastguard Worker } 659*333d2b36SAndroid Build Coastguard Worker ` 660*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 661*333d2b36SAndroid Build Coastguard Worker name string 662*333d2b36SAndroid Build Coastguard Worker expectedInstallPath string 663*333d2b36SAndroid Build Coastguard Worker errorMessage string 664*333d2b36SAndroid Build Coastguard Worker }{ 665*333d2b36SAndroid Build Coastguard Worker { 666*333d2b36SAndroid Build Coastguard Worker name: "no_relative_install_path", 667*333d2b36SAndroid Build Coastguard Worker expectedInstallPath: "out/soong/target/product/test_device/system/app/no_relative_install_path/no_relative_install_path.apk", 668*333d2b36SAndroid Build Coastguard Worker errorMessage: "Install path is not correct when relative_install_path is missing", 669*333d2b36SAndroid Build Coastguard Worker }, 670*333d2b36SAndroid Build Coastguard Worker { 671*333d2b36SAndroid Build Coastguard Worker name: "relative_install_path", 672*333d2b36SAndroid Build Coastguard Worker expectedInstallPath: "out/soong/target/product/test_device/system/app/my/path/relative_install_path/relative_install_path.apk", 673*333d2b36SAndroid Build Coastguard Worker errorMessage: "Install path is not correct for app when relative_install_path is present", 674*333d2b36SAndroid Build Coastguard Worker }, 675*333d2b36SAndroid Build Coastguard Worker { 676*333d2b36SAndroid Build Coastguard Worker name: "privileged_relative_install_path", 677*333d2b36SAndroid Build Coastguard Worker expectedInstallPath: "out/soong/target/product/test_device/system/priv-app/my/path/privileged_relative_install_path/privileged_relative_install_path.apk", 678*333d2b36SAndroid Build Coastguard Worker errorMessage: "Install path is not correct for privileged app when relative_install_path is present", 679*333d2b36SAndroid Build Coastguard Worker }, 680*333d2b36SAndroid Build Coastguard Worker } 681*333d2b36SAndroid Build Coastguard Worker for _, testCase := range testCases { 682*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, bp) 683*333d2b36SAndroid Build Coastguard Worker mod := ctx.ModuleForTests(testCase.name, "android_common").Module().(*AndroidAppImport) 684*333d2b36SAndroid Build Coastguard Worker android.AssertPathRelativeToTopEquals(t, testCase.errorMessage, testCase.expectedInstallPath, mod.installPath) 685*333d2b36SAndroid Build Coastguard Worker } 686*333d2b36SAndroid Build Coastguard Worker} 687*333d2b36SAndroid Build Coastguard Worker 688*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidTestImport(t *testing.T) { 689*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 690*333d2b36SAndroid Build Coastguard Worker android_test_import { 691*333d2b36SAndroid Build Coastguard Worker name: "foo", 692*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 693*333d2b36SAndroid Build Coastguard Worker presigned: true, 694*333d2b36SAndroid Build Coastguard Worker data: [ 695*333d2b36SAndroid Build Coastguard Worker "testdata/data", 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 test := ctx.ModuleForTests("foo", "android_common").Module().(*AndroidTestImport) 701*333d2b36SAndroid Build Coastguard Worker 702*333d2b36SAndroid Build Coastguard Worker // Check android mks. 703*333d2b36SAndroid Build Coastguard Worker entries := android.AndroidMkEntriesForTest(t, ctx, test)[0] 704*333d2b36SAndroid Build Coastguard Worker expected := []string{"tests"} 705*333d2b36SAndroid Build Coastguard Worker actual := entries.EntryMap["LOCAL_MODULE_TAGS"] 706*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(expected, actual) { 707*333d2b36SAndroid Build Coastguard Worker t.Errorf("Unexpected module tags - expected: %q, actual: %q", expected, actual) 708*333d2b36SAndroid Build Coastguard Worker } 709*333d2b36SAndroid Build Coastguard Worker expected = []string{"testdata/data:testdata/data"} 710*333d2b36SAndroid Build Coastguard Worker actual = entries.EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"] 711*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(expected, actual) { 712*333d2b36SAndroid Build Coastguard Worker t.Errorf("Unexpected test data - expected: %q, actual: %q", expected, actual) 713*333d2b36SAndroid Build Coastguard Worker } 714*333d2b36SAndroid Build Coastguard Worker} 715*333d2b36SAndroid Build Coastguard Worker 716*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidTestImport_NoJinUncompressForPresigned(t *testing.T) { 717*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 718*333d2b36SAndroid Build Coastguard Worker android_test_import { 719*333d2b36SAndroid Build Coastguard Worker name: "foo", 720*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 721*333d2b36SAndroid Build Coastguard Worker certificate: "cert/new_cert", 722*333d2b36SAndroid Build Coastguard Worker data: [ 723*333d2b36SAndroid Build Coastguard Worker "testdata/data", 724*333d2b36SAndroid Build Coastguard Worker ], 725*333d2b36SAndroid Build Coastguard Worker } 726*333d2b36SAndroid Build Coastguard Worker 727*333d2b36SAndroid Build Coastguard Worker android_test_import { 728*333d2b36SAndroid Build Coastguard Worker name: "foo_presigned", 729*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 730*333d2b36SAndroid Build Coastguard Worker presigned: true, 731*333d2b36SAndroid Build Coastguard Worker data: [ 732*333d2b36SAndroid Build Coastguard Worker "testdata/data", 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 variant := ctx.ModuleForTests("foo", "android_common") 738*333d2b36SAndroid Build Coastguard Worker jniRule := variant.Output("jnis-uncompressed/foo.apk").BuildParams.Rule.String() 739*333d2b36SAndroid Build Coastguard Worker if jniRule == android.Cp.String() { 740*333d2b36SAndroid Build Coastguard Worker t.Errorf("Unexpected JNI uncompress rule command: " + jniRule) 741*333d2b36SAndroid Build Coastguard Worker } 742*333d2b36SAndroid Build Coastguard Worker 743*333d2b36SAndroid Build Coastguard Worker variant = ctx.ModuleForTests("foo_presigned", "android_common") 744*333d2b36SAndroid Build Coastguard Worker jniRule = variant.Output("jnis-uncompressed/foo_presigned.apk").BuildParams.Rule.String() 745*333d2b36SAndroid Build Coastguard Worker if jniRule != android.Cp.String() { 746*333d2b36SAndroid Build Coastguard Worker t.Errorf("Unexpected JNI uncompress rule: " + jniRule) 747*333d2b36SAndroid Build Coastguard Worker } 748*333d2b36SAndroid Build Coastguard Worker if variant.MaybeOutput("zip-aligned/foo_presigned.apk").Rule == nil { 749*333d2b36SAndroid Build Coastguard Worker t.Errorf("Presigned test apk should be aligned") 750*333d2b36SAndroid Build Coastguard Worker } 751*333d2b36SAndroid Build Coastguard Worker} 752*333d2b36SAndroid Build Coastguard Worker 753*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidTestImport_Preprocessed(t *testing.T) { 754*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 755*333d2b36SAndroid Build Coastguard Worker android_test_import { 756*333d2b36SAndroid Build Coastguard Worker name: "foo", 757*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 758*333d2b36SAndroid Build Coastguard Worker presigned: true, 759*333d2b36SAndroid Build Coastguard Worker preprocessed: true, 760*333d2b36SAndroid Build Coastguard Worker } 761*333d2b36SAndroid Build Coastguard Worker `) 762*333d2b36SAndroid Build Coastguard Worker 763*333d2b36SAndroid Build Coastguard Worker apkName := "foo.apk" 764*333d2b36SAndroid Build Coastguard Worker variant := ctx.ModuleForTests("foo", "android_common") 765*333d2b36SAndroid Build Coastguard Worker jniRule := variant.Output("jnis-uncompressed/" + apkName).BuildParams.Rule.String() 766*333d2b36SAndroid Build Coastguard Worker if jniRule != android.Cp.String() { 767*333d2b36SAndroid Build Coastguard Worker t.Errorf("Unexpected JNI uncompress rule: " + jniRule) 768*333d2b36SAndroid Build Coastguard Worker } 769*333d2b36SAndroid Build Coastguard Worker 770*333d2b36SAndroid Build Coastguard Worker // Make sure signing and aligning were skipped. 771*333d2b36SAndroid Build Coastguard Worker if variant.MaybeOutput("signed/"+apkName).Rule != nil { 772*333d2b36SAndroid Build Coastguard Worker t.Errorf("signing rule shouldn't be included for preprocessed.") 773*333d2b36SAndroid Build Coastguard Worker } 774*333d2b36SAndroid Build Coastguard Worker if variant.MaybeOutput("zip-aligned/"+apkName).Rule != nil { 775*333d2b36SAndroid Build Coastguard Worker t.Errorf("aligning rule shouldn't be for preprocessed") 776*333d2b36SAndroid Build Coastguard Worker } 777*333d2b36SAndroid Build Coastguard Worker} 778*333d2b36SAndroid Build Coastguard Worker 779*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppImport_Preprocessed(t *testing.T) { 780*333d2b36SAndroid Build Coastguard Worker for _, dontUncompressPrivAppDexs := range []bool{false, true} { 781*333d2b36SAndroid Build Coastguard Worker name := fmt.Sprintf("dontUncompressPrivAppDexs:%t", dontUncompressPrivAppDexs) 782*333d2b36SAndroid Build Coastguard Worker t.Run(name, func(t *testing.T) { 783*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 784*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 785*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 786*333d2b36SAndroid Build Coastguard Worker variables.UncompressPrivAppDex = proptools.BoolPtr(!dontUncompressPrivAppDexs) 787*333d2b36SAndroid Build Coastguard Worker }), 788*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 789*333d2b36SAndroid Build Coastguard Worker android_app_import { 790*333d2b36SAndroid Build Coastguard Worker name: "foo", 791*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 792*333d2b36SAndroid Build Coastguard Worker presigned: true, 793*333d2b36SAndroid Build Coastguard Worker preprocessed: true, 794*333d2b36SAndroid Build Coastguard Worker } 795*333d2b36SAndroid Build Coastguard Worker 796*333d2b36SAndroid Build Coastguard Worker android_app_import { 797*333d2b36SAndroid Build Coastguard Worker name: "bar", 798*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 799*333d2b36SAndroid Build Coastguard Worker presigned: true, 800*333d2b36SAndroid Build Coastguard Worker privileged: true, 801*333d2b36SAndroid Build Coastguard Worker preprocessed: true, 802*333d2b36SAndroid Build Coastguard Worker } 803*333d2b36SAndroid Build Coastguard Worker `) 804*333d2b36SAndroid Build Coastguard Worker 805*333d2b36SAndroid Build Coastguard Worker // non-privileged app 806*333d2b36SAndroid Build Coastguard Worker apkName := "foo.apk" 807*333d2b36SAndroid Build Coastguard Worker variant := result.ModuleForTests("foo", "android_common") 808*333d2b36SAndroid Build Coastguard Worker outputBuildParams := variant.Output(apkName).BuildParams 809*333d2b36SAndroid Build Coastguard Worker if outputBuildParams.Rule.String() != android.Cp.String() { 810*333d2b36SAndroid Build Coastguard Worker t.Errorf("Unexpected prebuilt android_app_import rule: " + outputBuildParams.Rule.String()) 811*333d2b36SAndroid Build Coastguard Worker } 812*333d2b36SAndroid Build Coastguard Worker 813*333d2b36SAndroid Build Coastguard Worker // Make sure compression and aligning were validated. 814*333d2b36SAndroid Build Coastguard Worker if outputBuildParams.Validation == nil { 815*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected validation rule, but was not found") 816*333d2b36SAndroid Build Coastguard Worker } 817*333d2b36SAndroid Build Coastguard Worker 818*333d2b36SAndroid Build Coastguard Worker validationBuildParams := variant.Output("validated-prebuilt/check.stamp").BuildParams 819*333d2b36SAndroid Build Coastguard Worker if validationBuildParams.Rule.String() != checkPresignedApkRule.String() { 820*333d2b36SAndroid Build Coastguard Worker t.Errorf("Unexpected validation rule: " + validationBuildParams.Rule.String()) 821*333d2b36SAndroid Build Coastguard Worker } 822*333d2b36SAndroid Build Coastguard Worker 823*333d2b36SAndroid Build Coastguard Worker expectedScriptArgs := "--preprocessed" 824*333d2b36SAndroid Build Coastguard Worker actualScriptArgs := validationBuildParams.Args["extraArgs"] 825*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "check script extraArgs", expectedScriptArgs, actualScriptArgs) 826*333d2b36SAndroid Build Coastguard Worker 827*333d2b36SAndroid Build Coastguard Worker // privileged app 828*333d2b36SAndroid Build Coastguard Worker apkName = "bar.apk" 829*333d2b36SAndroid Build Coastguard Worker variant = result.ModuleForTests("bar", "android_common") 830*333d2b36SAndroid Build Coastguard Worker outputBuildParams = variant.Output(apkName).BuildParams 831*333d2b36SAndroid Build Coastguard Worker if outputBuildParams.Rule.String() != android.Cp.String() { 832*333d2b36SAndroid Build Coastguard Worker t.Errorf("Unexpected prebuilt android_app_import rule: " + outputBuildParams.Rule.String()) 833*333d2b36SAndroid Build Coastguard Worker } 834*333d2b36SAndroid Build Coastguard Worker 835*333d2b36SAndroid Build Coastguard Worker // Make sure compression and aligning were validated. 836*333d2b36SAndroid Build Coastguard Worker if outputBuildParams.Validation == nil { 837*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected validation rule, but was not found") 838*333d2b36SAndroid Build Coastguard Worker } 839*333d2b36SAndroid Build Coastguard Worker 840*333d2b36SAndroid Build Coastguard Worker validationBuildParams = variant.Output("validated-prebuilt/check.stamp").BuildParams 841*333d2b36SAndroid Build Coastguard Worker if validationBuildParams.Rule.String() != checkPresignedApkRule.String() { 842*333d2b36SAndroid Build Coastguard Worker t.Errorf("Unexpected validation rule: " + validationBuildParams.Rule.String()) 843*333d2b36SAndroid Build Coastguard Worker } 844*333d2b36SAndroid Build Coastguard Worker 845*333d2b36SAndroid Build Coastguard Worker expectedScriptArgs = "--privileged" 846*333d2b36SAndroid Build Coastguard Worker if !dontUncompressPrivAppDexs { 847*333d2b36SAndroid Build Coastguard Worker expectedScriptArgs += " --uncompress-priv-app-dex" 848*333d2b36SAndroid Build Coastguard Worker } 849*333d2b36SAndroid Build Coastguard Worker expectedScriptArgs += " --preprocessed" 850*333d2b36SAndroid Build Coastguard Worker actualScriptArgs = validationBuildParams.Args["extraArgs"] 851*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "check script extraArgs", expectedScriptArgs, actualScriptArgs) 852*333d2b36SAndroid Build Coastguard Worker }) 853*333d2b36SAndroid Build Coastguard Worker } 854*333d2b36SAndroid Build Coastguard Worker} 855*333d2b36SAndroid Build Coastguard Worker 856*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidTestImport_UncompressDex(t *testing.T) { 857*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 858*333d2b36SAndroid Build Coastguard Worker name string 859*333d2b36SAndroid Build Coastguard Worker bp string 860*333d2b36SAndroid Build Coastguard Worker }{ 861*333d2b36SAndroid Build Coastguard Worker { 862*333d2b36SAndroid Build Coastguard Worker name: "normal", 863*333d2b36SAndroid Build Coastguard Worker bp: ` 864*333d2b36SAndroid Build Coastguard Worker android_app_import { 865*333d2b36SAndroid Build Coastguard Worker name: "foo", 866*333d2b36SAndroid Build Coastguard Worker presigned: true, 867*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 868*333d2b36SAndroid Build Coastguard Worker } 869*333d2b36SAndroid Build Coastguard Worker `, 870*333d2b36SAndroid Build Coastguard Worker }, 871*333d2b36SAndroid Build Coastguard Worker { 872*333d2b36SAndroid Build Coastguard Worker name: "privileged", 873*333d2b36SAndroid Build Coastguard Worker bp: ` 874*333d2b36SAndroid Build Coastguard Worker android_app_import { 875*333d2b36SAndroid Build Coastguard Worker name: "foo", 876*333d2b36SAndroid Build Coastguard Worker presigned: true, 877*333d2b36SAndroid Build Coastguard Worker privileged: true, 878*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 879*333d2b36SAndroid Build Coastguard Worker } 880*333d2b36SAndroid Build Coastguard Worker `, 881*333d2b36SAndroid Build Coastguard Worker }, 882*333d2b36SAndroid Build Coastguard Worker } 883*333d2b36SAndroid Build Coastguard Worker 884*333d2b36SAndroid Build Coastguard Worker test := func(t *testing.T, bp string, unbundled bool, dontUncompressPrivAppDexs bool) { 885*333d2b36SAndroid Build Coastguard Worker t.Helper() 886*333d2b36SAndroid Build Coastguard Worker 887*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 888*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 889*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 890*333d2b36SAndroid Build Coastguard Worker if unbundled { 891*333d2b36SAndroid Build Coastguard Worker variables.Unbundled_build = proptools.BoolPtr(true) 892*333d2b36SAndroid Build Coastguard Worker } 893*333d2b36SAndroid Build Coastguard Worker variables.UncompressPrivAppDex = proptools.BoolPtr(!dontUncompressPrivAppDexs) 894*333d2b36SAndroid Build Coastguard Worker }), 895*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 896*333d2b36SAndroid Build Coastguard Worker 897*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", "android_common") 898*333d2b36SAndroid Build Coastguard Worker actual := foo.MaybeRule("uncompress-dex").Rule != nil 899*333d2b36SAndroid Build Coastguard Worker 900*333d2b36SAndroid Build Coastguard Worker expect := !unbundled 901*333d2b36SAndroid Build Coastguard Worker if strings.Contains(bp, "privileged: true") { 902*333d2b36SAndroid Build Coastguard Worker if dontUncompressPrivAppDexs { 903*333d2b36SAndroid Build Coastguard Worker expect = false 904*333d2b36SAndroid Build Coastguard Worker } else { 905*333d2b36SAndroid Build Coastguard Worker // TODO(b/194504107): shouldn't priv-apps be always uncompressed unless 906*333d2b36SAndroid Build Coastguard Worker // DONT_UNCOMPRESS_PRIV_APPS_DEXS is true (regardless of unbundling)? 907*333d2b36SAndroid Build Coastguard Worker // expect = true 908*333d2b36SAndroid Build Coastguard Worker } 909*333d2b36SAndroid Build Coastguard Worker } 910*333d2b36SAndroid Build Coastguard Worker 911*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, "uncompress dex", expect, actual) 912*333d2b36SAndroid Build Coastguard Worker } 913*333d2b36SAndroid Build Coastguard Worker 914*333d2b36SAndroid Build Coastguard Worker for _, unbundled := range []bool{false, true} { 915*333d2b36SAndroid Build Coastguard Worker for _, dontUncompressPrivAppDexs := range []bool{false, true} { 916*333d2b36SAndroid Build Coastguard Worker for _, tt := range testCases { 917*333d2b36SAndroid Build Coastguard Worker name := fmt.Sprintf("%s,unbundled:%t,dontUncompressPrivAppDexs:%t", 918*333d2b36SAndroid Build Coastguard Worker tt.name, unbundled, dontUncompressPrivAppDexs) 919*333d2b36SAndroid Build Coastguard Worker t.Run(name, func(t *testing.T) { 920*333d2b36SAndroid Build Coastguard Worker test(t, tt.bp, unbundled, dontUncompressPrivAppDexs) 921*333d2b36SAndroid Build Coastguard Worker }) 922*333d2b36SAndroid Build Coastguard Worker } 923*333d2b36SAndroid Build Coastguard Worker } 924*333d2b36SAndroid Build Coastguard Worker } 925*333d2b36SAndroid Build Coastguard Worker} 926*333d2b36SAndroid Build Coastguard Worker 927*333d2b36SAndroid Build Coastguard Workerfunc TestAppImportMissingCertificateAllowMissingDependencies(t *testing.T) { 928*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 929*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 930*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithAllowMissingDependencies, 931*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithAndroidMk, 932*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 933*333d2b36SAndroid Build Coastguard Worker android_app_import { 934*333d2b36SAndroid Build Coastguard Worker name: "foo", 935*333d2b36SAndroid Build Coastguard Worker apk: "a.apk", 936*333d2b36SAndroid Build Coastguard Worker certificate: ":missing_certificate", 937*333d2b36SAndroid Build Coastguard Worker }`) 938*333d2b36SAndroid Build Coastguard Worker 939*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", "android_common") 940*333d2b36SAndroid Build Coastguard Worker fooApk := foo.Output("signed/foo.apk") 941*333d2b36SAndroid Build Coastguard Worker if fooApk.Rule != android.ErrorRule { 942*333d2b36SAndroid Build Coastguard Worker t.Fatalf("expected ErrorRule for foo.apk, got %s", fooApk.Rule.String()) 943*333d2b36SAndroid Build Coastguard Worker } 944*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected error rule message", fooApk.Args["error"], "missing dependencies: missing_certificate\n") 945*333d2b36SAndroid Build Coastguard Worker} 946