1*333d2b36SAndroid Build Coastguard Worker// Copyright 2017 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 "path/filepath" 20*333d2b36SAndroid Build Coastguard Worker "reflect" 21*333d2b36SAndroid Build Coastguard Worker "sort" 22*333d2b36SAndroid Build Coastguard Worker "strings" 23*333d2b36SAndroid Build Coastguard Worker "testing" 24*333d2b36SAndroid Build Coastguard Worker 25*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 26*333d2b36SAndroid Build Coastguard Worker 27*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 28*333d2b36SAndroid Build Coastguard Worker "android/soong/cc" 29*333d2b36SAndroid Build Coastguard Worker "android/soong/dexpreopt" 30*333d2b36SAndroid Build Coastguard Worker) 31*333d2b36SAndroid Build Coastguard Worker 32*333d2b36SAndroid Build Coastguard Worker// testApp runs tests using the prepareForJavaTest 33*333d2b36SAndroid Build Coastguard Worker// 34*333d2b36SAndroid Build Coastguard Worker// See testJava for an explanation as to how to stop using this deprecated method. 35*333d2b36SAndroid Build Coastguard Worker// 36*333d2b36SAndroid Build Coastguard Worker// deprecated 37*333d2b36SAndroid Build Coastguard Workerfunc testApp(t *testing.T, bp string) *android.TestContext { 38*333d2b36SAndroid Build Coastguard Worker t.Helper() 39*333d2b36SAndroid Build Coastguard Worker result := prepareForJavaTest.RunTestWithBp(t, bp) 40*333d2b36SAndroid Build Coastguard Worker return result.TestContext 41*333d2b36SAndroid Build Coastguard Worker} 42*333d2b36SAndroid Build Coastguard Worker 43*333d2b36SAndroid Build Coastguard Workerfunc TestApp(t *testing.T) { 44*333d2b36SAndroid Build Coastguard Worker resourceFiles := []string{ 45*333d2b36SAndroid Build Coastguard Worker "res/layout/layout.xml", 46*333d2b36SAndroid Build Coastguard Worker "res/values/strings.xml", 47*333d2b36SAndroid Build Coastguard Worker "res/values-en-rUS/strings.xml", 48*333d2b36SAndroid Build Coastguard Worker } 49*333d2b36SAndroid Build Coastguard Worker 50*333d2b36SAndroid Build Coastguard Worker compiledResourceFiles := []string{ 51*333d2b36SAndroid Build Coastguard Worker "aapt2/res/layout_layout.xml.flat", 52*333d2b36SAndroid Build Coastguard Worker "aapt2/res/values_strings.arsc.flat", 53*333d2b36SAndroid Build Coastguard Worker "aapt2/res/values-en-rUS_strings.arsc.flat", 54*333d2b36SAndroid Build Coastguard Worker } 55*333d2b36SAndroid Build Coastguard Worker 56*333d2b36SAndroid Build Coastguard Worker for _, moduleType := range []string{"android_app", "android_library"} { 57*333d2b36SAndroid Build Coastguard Worker t.Run(moduleType, func(t *testing.T) { 58*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 59*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 60*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyMockFS(func(fs android.MockFS) { 61*333d2b36SAndroid Build Coastguard Worker for _, file := range resourceFiles { 62*333d2b36SAndroid Build Coastguard Worker fs[file] = nil 63*333d2b36SAndroid Build Coastguard Worker } 64*333d2b36SAndroid Build Coastguard Worker }), 65*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, moduleType+` { 66*333d2b36SAndroid Build Coastguard Worker name: "foo", 67*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 68*333d2b36SAndroid Build Coastguard Worker sdk_version: "current" 69*333d2b36SAndroid Build Coastguard Worker } 70*333d2b36SAndroid Build Coastguard Worker `) 71*333d2b36SAndroid Build Coastguard Worker 72*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", "android_common") 73*333d2b36SAndroid Build Coastguard Worker 74*333d2b36SAndroid Build Coastguard Worker var expectedLinkImplicits []string 75*333d2b36SAndroid Build Coastguard Worker 76*333d2b36SAndroid Build Coastguard Worker manifestFixer := foo.Output("manifest_fixer/AndroidManifest.xml") 77*333d2b36SAndroid Build Coastguard Worker expectedLinkImplicits = append(expectedLinkImplicits, manifestFixer.Output.String()) 78*333d2b36SAndroid Build Coastguard Worker 79*333d2b36SAndroid Build Coastguard Worker frameworkRes := result.ModuleForTests("framework-res", "android_common") 80*333d2b36SAndroid Build Coastguard Worker expectedLinkImplicits = append(expectedLinkImplicits, 81*333d2b36SAndroid Build Coastguard Worker frameworkRes.Output("package-res.apk").Output.String()) 82*333d2b36SAndroid Build Coastguard Worker 83*333d2b36SAndroid Build Coastguard Worker // Test the mapping from input files to compiled output file names 84*333d2b36SAndroid Build Coastguard Worker compile := foo.Output(compiledResourceFiles[0]) 85*333d2b36SAndroid Build Coastguard Worker android.AssertDeepEquals(t, "aapt2 compile inputs", resourceFiles, compile.Inputs.Strings()) 86*333d2b36SAndroid Build Coastguard Worker 87*333d2b36SAndroid Build Coastguard Worker compiledResourceOutputs := compile.Outputs.Strings() 88*333d2b36SAndroid Build Coastguard Worker sort.Strings(compiledResourceOutputs) 89*333d2b36SAndroid Build Coastguard Worker 90*333d2b36SAndroid Build Coastguard Worker expectedLinkImplicits = append(expectedLinkImplicits, compiledResourceOutputs...) 91*333d2b36SAndroid Build Coastguard Worker 92*333d2b36SAndroid Build Coastguard Worker list := foo.Output("aapt2/res.list") 93*333d2b36SAndroid Build Coastguard Worker expectedLinkImplicits = append(expectedLinkImplicits, list.Output.String()) 94*333d2b36SAndroid Build Coastguard Worker 95*333d2b36SAndroid Build Coastguard Worker // Check that the link rule uses 96*333d2b36SAndroid Build Coastguard Worker res := result.ModuleForTests("foo", "android_common").Output("package-res.apk") 97*333d2b36SAndroid Build Coastguard Worker android.AssertDeepEquals(t, "aapt2 link implicits", expectedLinkImplicits, res.Implicits.Strings()) 98*333d2b36SAndroid Build Coastguard Worker }) 99*333d2b36SAndroid Build Coastguard Worker } 100*333d2b36SAndroid Build Coastguard Worker} 101*333d2b36SAndroid Build Coastguard Worker 102*333d2b36SAndroid Build Coastguard Workerfunc TestAppSplits(t *testing.T) { 103*333d2b36SAndroid Build Coastguard Worker ctx := testApp(t, ` 104*333d2b36SAndroid Build Coastguard Worker android_app { 105*333d2b36SAndroid Build Coastguard Worker name: "foo", 106*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 107*333d2b36SAndroid Build Coastguard Worker package_splits: ["v4", "v7,hdpi"], 108*333d2b36SAndroid Build Coastguard Worker sdk_version: "current" 109*333d2b36SAndroid Build Coastguard Worker }`) 110*333d2b36SAndroid Build Coastguard Worker 111*333d2b36SAndroid Build Coastguard Worker foo := ctx.ModuleForTests("foo", "android_common") 112*333d2b36SAndroid Build Coastguard Worker 113*333d2b36SAndroid Build Coastguard Worker expectedOutputs := []string{ 114*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/foo/android_common/foo.apk", 115*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/foo/android_common/foo_v4.apk", 116*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/foo/android_common/foo_v7_hdpi.apk", 117*333d2b36SAndroid Build Coastguard Worker } 118*333d2b36SAndroid Build Coastguard Worker for _, expectedOutput := range expectedOutputs { 119*333d2b36SAndroid Build Coastguard Worker foo.Output(expectedOutput) 120*333d2b36SAndroid Build Coastguard Worker } 121*333d2b36SAndroid Build Coastguard Worker 122*333d2b36SAndroid Build Coastguard Worker outputFiles := foo.OutputFiles(ctx, t, "") 123*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, `OutputFiles("")`, expectedOutputs, outputFiles) 124*333d2b36SAndroid Build Coastguard Worker} 125*333d2b36SAndroid Build Coastguard Worker 126*333d2b36SAndroid Build Coastguard Workerfunc TestPlatformAPIs(t *testing.T) { 127*333d2b36SAndroid Build Coastguard Worker testJava(t, ` 128*333d2b36SAndroid Build Coastguard Worker android_app { 129*333d2b36SAndroid Build Coastguard Worker name: "foo", 130*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 131*333d2b36SAndroid Build Coastguard Worker platform_apis: true, 132*333d2b36SAndroid Build Coastguard Worker } 133*333d2b36SAndroid Build Coastguard Worker `) 134*333d2b36SAndroid Build Coastguard Worker 135*333d2b36SAndroid Build Coastguard Worker testJava(t, ` 136*333d2b36SAndroid Build Coastguard Worker android_app { 137*333d2b36SAndroid Build Coastguard Worker name: "foo", 138*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 139*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 140*333d2b36SAndroid Build Coastguard Worker } 141*333d2b36SAndroid Build Coastguard Worker `) 142*333d2b36SAndroid Build Coastguard Worker 143*333d2b36SAndroid Build Coastguard Worker testJavaError(t, "This module has conflicting settings. sdk_version is empty, which means that this module is build against platform APIs. However platform_apis is not set to true", ` 144*333d2b36SAndroid Build Coastguard Worker android_app { 145*333d2b36SAndroid Build Coastguard Worker name: "bar", 146*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 147*333d2b36SAndroid Build Coastguard Worker } 148*333d2b36SAndroid Build Coastguard Worker `) 149*333d2b36SAndroid Build Coastguard Worker 150*333d2b36SAndroid Build Coastguard Worker testJavaError(t, "This module has conflicting settings. sdk_version is not empty, which means this module cannot use platform APIs. However platform_apis is set to true.", ` 151*333d2b36SAndroid Build Coastguard Worker android_app { 152*333d2b36SAndroid Build Coastguard Worker name: "bar", 153*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 154*333d2b36SAndroid Build Coastguard Worker sdk_version: "system_current", 155*333d2b36SAndroid Build Coastguard Worker platform_apis: true, 156*333d2b36SAndroid Build Coastguard Worker } 157*333d2b36SAndroid Build Coastguard Worker `) 158*333d2b36SAndroid Build Coastguard Worker} 159*333d2b36SAndroid Build Coastguard Worker 160*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppLinkType(t *testing.T) { 161*333d2b36SAndroid Build Coastguard Worker testJava(t, ` 162*333d2b36SAndroid Build Coastguard Worker android_app { 163*333d2b36SAndroid Build Coastguard Worker name: "foo", 164*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 165*333d2b36SAndroid Build Coastguard Worker libs: ["bar"], 166*333d2b36SAndroid Build Coastguard Worker static_libs: ["baz"], 167*333d2b36SAndroid Build Coastguard Worker platform_apis: true, 168*333d2b36SAndroid Build Coastguard Worker } 169*333d2b36SAndroid Build Coastguard Worker 170*333d2b36SAndroid Build Coastguard Worker java_library { 171*333d2b36SAndroid Build Coastguard Worker name: "bar", 172*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 173*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 174*333d2b36SAndroid Build Coastguard Worker } 175*333d2b36SAndroid Build Coastguard Worker 176*333d2b36SAndroid Build Coastguard Worker android_library { 177*333d2b36SAndroid Build Coastguard Worker name: "baz", 178*333d2b36SAndroid Build Coastguard Worker sdk_version: "system_current", 179*333d2b36SAndroid Build Coastguard Worker srcs: ["c.java"], 180*333d2b36SAndroid Build Coastguard Worker } 181*333d2b36SAndroid Build Coastguard Worker `) 182*333d2b36SAndroid Build Coastguard Worker 183*333d2b36SAndroid Build Coastguard Worker testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", ` 184*333d2b36SAndroid Build Coastguard Worker android_app { 185*333d2b36SAndroid Build Coastguard Worker name: "foo", 186*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 187*333d2b36SAndroid Build Coastguard Worker libs: ["bar"], 188*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 189*333d2b36SAndroid Build Coastguard Worker static_libs: ["baz"], 190*333d2b36SAndroid Build Coastguard Worker } 191*333d2b36SAndroid Build Coastguard Worker 192*333d2b36SAndroid Build Coastguard Worker java_library { 193*333d2b36SAndroid Build Coastguard Worker name: "bar", 194*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 195*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 196*333d2b36SAndroid Build Coastguard Worker } 197*333d2b36SAndroid Build Coastguard Worker 198*333d2b36SAndroid Build Coastguard Worker android_library { 199*333d2b36SAndroid Build Coastguard Worker name: "baz", 200*333d2b36SAndroid Build Coastguard Worker sdk_version: "system_current", 201*333d2b36SAndroid Build Coastguard Worker srcs: ["c.java"], 202*333d2b36SAndroid Build Coastguard Worker } 203*333d2b36SAndroid Build Coastguard Worker `) 204*333d2b36SAndroid Build Coastguard Worker 205*333d2b36SAndroid Build Coastguard Worker testJava(t, ` 206*333d2b36SAndroid Build Coastguard Worker android_app { 207*333d2b36SAndroid Build Coastguard Worker name: "foo", 208*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 209*333d2b36SAndroid Build Coastguard Worker libs: ["bar"], 210*333d2b36SAndroid Build Coastguard Worker sdk_version: "system_current", 211*333d2b36SAndroid Build Coastguard Worker static_libs: ["baz"], 212*333d2b36SAndroid Build Coastguard Worker } 213*333d2b36SAndroid Build Coastguard Worker 214*333d2b36SAndroid Build Coastguard Worker java_library { 215*333d2b36SAndroid Build Coastguard Worker name: "bar", 216*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 217*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 218*333d2b36SAndroid Build Coastguard Worker } 219*333d2b36SAndroid Build Coastguard Worker 220*333d2b36SAndroid Build Coastguard Worker android_library { 221*333d2b36SAndroid Build Coastguard Worker name: "baz", 222*333d2b36SAndroid Build Coastguard Worker sdk_version: "system_current", 223*333d2b36SAndroid Build Coastguard Worker srcs: ["c.java"], 224*333d2b36SAndroid Build Coastguard Worker } 225*333d2b36SAndroid Build Coastguard Worker `) 226*333d2b36SAndroid Build Coastguard Worker 227*333d2b36SAndroid Build Coastguard Worker testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", ` 228*333d2b36SAndroid Build Coastguard Worker android_app { 229*333d2b36SAndroid Build Coastguard Worker name: "foo", 230*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 231*333d2b36SAndroid Build Coastguard Worker libs: ["bar"], 232*333d2b36SAndroid Build Coastguard Worker sdk_version: "system_current", 233*333d2b36SAndroid Build Coastguard Worker static_libs: ["baz"], 234*333d2b36SAndroid Build Coastguard Worker } 235*333d2b36SAndroid Build Coastguard Worker 236*333d2b36SAndroid Build Coastguard Worker java_library { 237*333d2b36SAndroid Build Coastguard Worker name: "bar", 238*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 239*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 240*333d2b36SAndroid Build Coastguard Worker } 241*333d2b36SAndroid Build Coastguard Worker 242*333d2b36SAndroid Build Coastguard Worker android_library { 243*333d2b36SAndroid Build Coastguard Worker name: "baz", 244*333d2b36SAndroid Build Coastguard Worker srcs: ["c.java"], 245*333d2b36SAndroid Build Coastguard Worker } 246*333d2b36SAndroid Build Coastguard Worker `) 247*333d2b36SAndroid Build Coastguard Worker} 248*333d2b36SAndroid Build Coastguard Worker 249*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatableApps(t *testing.T) { 250*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 251*333d2b36SAndroid Build Coastguard Worker name string 252*333d2b36SAndroid Build Coastguard Worker bp string 253*333d2b36SAndroid Build Coastguard Worker expectedError string 254*333d2b36SAndroid Build Coastguard Worker }{ 255*333d2b36SAndroid Build Coastguard Worker { 256*333d2b36SAndroid Build Coastguard Worker name: "Stable public SDK", 257*333d2b36SAndroid Build Coastguard Worker bp: `android_app { 258*333d2b36SAndroid Build Coastguard Worker name: "foo", 259*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 260*333d2b36SAndroid Build Coastguard Worker sdk_version: "29", 261*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 262*333d2b36SAndroid Build Coastguard Worker updatable: true, 263*333d2b36SAndroid Build Coastguard Worker }`, 264*333d2b36SAndroid Build Coastguard Worker }, 265*333d2b36SAndroid Build Coastguard Worker { 266*333d2b36SAndroid Build Coastguard Worker name: "Stable system SDK", 267*333d2b36SAndroid Build Coastguard Worker bp: `android_app { 268*333d2b36SAndroid Build Coastguard Worker name: "foo", 269*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 270*333d2b36SAndroid Build Coastguard Worker sdk_version: "system_29", 271*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 272*333d2b36SAndroid Build Coastguard Worker updatable: true, 273*333d2b36SAndroid Build Coastguard Worker }`, 274*333d2b36SAndroid Build Coastguard Worker }, 275*333d2b36SAndroid Build Coastguard Worker { 276*333d2b36SAndroid Build Coastguard Worker name: "Current public SDK", 277*333d2b36SAndroid Build Coastguard Worker bp: `android_app { 278*333d2b36SAndroid Build Coastguard Worker name: "foo", 279*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 280*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 281*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 282*333d2b36SAndroid Build Coastguard Worker updatable: true, 283*333d2b36SAndroid Build Coastguard Worker }`, 284*333d2b36SAndroid Build Coastguard Worker }, 285*333d2b36SAndroid Build Coastguard Worker { 286*333d2b36SAndroid Build Coastguard Worker name: "Current system SDK", 287*333d2b36SAndroid Build Coastguard Worker bp: `android_app { 288*333d2b36SAndroid Build Coastguard Worker name: "foo", 289*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 290*333d2b36SAndroid Build Coastguard Worker sdk_version: "system_current", 291*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 292*333d2b36SAndroid Build Coastguard Worker updatable: true, 293*333d2b36SAndroid Build Coastguard Worker }`, 294*333d2b36SAndroid Build Coastguard Worker }, 295*333d2b36SAndroid Build Coastguard Worker { 296*333d2b36SAndroid Build Coastguard Worker name: "Current module SDK", 297*333d2b36SAndroid Build Coastguard Worker bp: `android_app { 298*333d2b36SAndroid Build Coastguard Worker name: "foo", 299*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 300*333d2b36SAndroid Build Coastguard Worker sdk_version: "module_current", 301*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 302*333d2b36SAndroid Build Coastguard Worker updatable: true, 303*333d2b36SAndroid Build Coastguard Worker }`, 304*333d2b36SAndroid Build Coastguard Worker }, 305*333d2b36SAndroid Build Coastguard Worker { 306*333d2b36SAndroid Build Coastguard Worker name: "Current core SDK", 307*333d2b36SAndroid Build Coastguard Worker bp: `android_app { 308*333d2b36SAndroid Build Coastguard Worker name: "foo", 309*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 310*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_current", 311*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 312*333d2b36SAndroid Build Coastguard Worker updatable: true, 313*333d2b36SAndroid Build Coastguard Worker }`, 314*333d2b36SAndroid Build Coastguard Worker }, 315*333d2b36SAndroid Build Coastguard Worker { 316*333d2b36SAndroid Build Coastguard Worker name: "No Platform APIs", 317*333d2b36SAndroid Build Coastguard Worker bp: `android_app { 318*333d2b36SAndroid Build Coastguard Worker name: "foo", 319*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 320*333d2b36SAndroid Build Coastguard Worker platform_apis: true, 321*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 322*333d2b36SAndroid Build Coastguard Worker updatable: true, 323*333d2b36SAndroid Build Coastguard Worker }`, 324*333d2b36SAndroid Build Coastguard Worker expectedError: "Updatable apps must use stable SDKs", 325*333d2b36SAndroid Build Coastguard Worker }, 326*333d2b36SAndroid Build Coastguard Worker { 327*333d2b36SAndroid Build Coastguard Worker name: "No Core Platform APIs", 328*333d2b36SAndroid Build Coastguard Worker bp: `android_app { 329*333d2b36SAndroid Build Coastguard Worker name: "foo", 330*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 331*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_platform", 332*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 333*333d2b36SAndroid Build Coastguard Worker updatable: true, 334*333d2b36SAndroid Build Coastguard Worker }`, 335*333d2b36SAndroid Build Coastguard Worker expectedError: "Updatable apps must use stable SDKs", 336*333d2b36SAndroid Build Coastguard Worker }, 337*333d2b36SAndroid Build Coastguard Worker { 338*333d2b36SAndroid Build Coastguard Worker name: "No unspecified APIs", 339*333d2b36SAndroid Build Coastguard Worker bp: `android_app { 340*333d2b36SAndroid Build Coastguard Worker name: "foo", 341*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 342*333d2b36SAndroid Build Coastguard Worker updatable: true, 343*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 344*333d2b36SAndroid Build Coastguard Worker }`, 345*333d2b36SAndroid Build Coastguard Worker expectedError: "Updatable apps must use stable SDK", 346*333d2b36SAndroid Build Coastguard Worker }, 347*333d2b36SAndroid Build Coastguard Worker { 348*333d2b36SAndroid Build Coastguard Worker name: "Must specify min_sdk_version", 349*333d2b36SAndroid Build Coastguard Worker bp: `android_app { 350*333d2b36SAndroid Build Coastguard Worker name: "app_without_min_sdk_version", 351*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 352*333d2b36SAndroid Build Coastguard Worker sdk_version: "29", 353*333d2b36SAndroid Build Coastguard Worker updatable: true, 354*333d2b36SAndroid Build Coastguard Worker }`, 355*333d2b36SAndroid Build Coastguard Worker expectedError: "updatable apps must set min_sdk_version.", 356*333d2b36SAndroid Build Coastguard Worker }, 357*333d2b36SAndroid Build Coastguard Worker } 358*333d2b36SAndroid Build Coastguard Worker 359*333d2b36SAndroid Build Coastguard Worker for _, test := range testCases { 360*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 361*333d2b36SAndroid Build Coastguard Worker errorHandler := android.FixtureExpectsNoErrors 362*333d2b36SAndroid Build Coastguard Worker if test.expectedError != "" { 363*333d2b36SAndroid Build Coastguard Worker errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError) 364*333d2b36SAndroid Build Coastguard Worker } 365*333d2b36SAndroid Build Coastguard Worker android.GroupFixturePreparers( 366*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, FixtureWithPrebuiltApis(map[string][]string{ 367*333d2b36SAndroid Build Coastguard Worker "29": {"foo"}, 368*333d2b36SAndroid Build Coastguard Worker })). 369*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, test.bp) 370*333d2b36SAndroid Build Coastguard Worker }) 371*333d2b36SAndroid Build Coastguard Worker } 372*333d2b36SAndroid Build Coastguard Worker} 373*333d2b36SAndroid Build Coastguard Worker 374*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatableApps_TransitiveDepsShouldSetMinSdkVersion(t *testing.T) { 375*333d2b36SAndroid Build Coastguard Worker testJavaError(t, `module "bar".*: should support min_sdk_version\(29\)`, cc.GatherRequiredDepsForTest(android.Android)+` 376*333d2b36SAndroid Build Coastguard Worker android_app { 377*333d2b36SAndroid Build Coastguard Worker name: "foo", 378*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 379*333d2b36SAndroid Build Coastguard Worker updatable: true, 380*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 381*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 382*333d2b36SAndroid Build Coastguard Worker static_libs: ["bar"], 383*333d2b36SAndroid Build Coastguard Worker } 384*333d2b36SAndroid Build Coastguard Worker 385*333d2b36SAndroid Build Coastguard Worker java_library { 386*333d2b36SAndroid Build Coastguard Worker name: "bar", 387*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 388*333d2b36SAndroid Build Coastguard Worker } 389*333d2b36SAndroid Build Coastguard Worker `) 390*333d2b36SAndroid Build Coastguard Worker} 391*333d2b36SAndroid Build Coastguard Worker 392*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatableApps_JniLibsShouldShouldSupportMinSdkVersion(t *testing.T) { 393*333d2b36SAndroid Build Coastguard Worker testJava(t, cc.GatherRequiredDepsForTest(android.Android)+` 394*333d2b36SAndroid Build Coastguard Worker android_app { 395*333d2b36SAndroid Build Coastguard Worker name: "foo", 396*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 397*333d2b36SAndroid Build Coastguard Worker updatable: true, 398*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 399*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "current", 400*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 401*333d2b36SAndroid Build Coastguard Worker } 402*333d2b36SAndroid Build Coastguard Worker 403*333d2b36SAndroid Build Coastguard Worker cc_library { 404*333d2b36SAndroid Build Coastguard Worker name: "libjni", 405*333d2b36SAndroid Build Coastguard Worker stl: "none", 406*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 407*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 408*333d2b36SAndroid Build Coastguard Worker } 409*333d2b36SAndroid Build Coastguard Worker `) 410*333d2b36SAndroid Build Coastguard Worker} 411*333d2b36SAndroid Build Coastguard Worker 412*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatableApps_JniLibShouldBeBuiltAgainstMinSdkVersion(t *testing.T) { 413*333d2b36SAndroid Build Coastguard Worker bp := cc.GatherRequiredDepsForTest(android.Android) + ` 414*333d2b36SAndroid Build Coastguard Worker android_app { 415*333d2b36SAndroid Build Coastguard Worker name: "foo", 416*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 417*333d2b36SAndroid Build Coastguard Worker updatable: true, 418*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 419*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 420*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 421*333d2b36SAndroid Build Coastguard Worker } 422*333d2b36SAndroid Build Coastguard Worker 423*333d2b36SAndroid Build Coastguard Worker cc_library { 424*333d2b36SAndroid Build Coastguard Worker name: "libjni", 425*333d2b36SAndroid Build Coastguard Worker stl: "none", 426*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 427*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 428*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 429*333d2b36SAndroid Build Coastguard Worker } 430*333d2b36SAndroid Build Coastguard Worker ` 431*333d2b36SAndroid Build Coastguard Worker fs := map[string][]byte{ 432*333d2b36SAndroid Build Coastguard Worker "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtbegin_so.o": nil, 433*333d2b36SAndroid Build Coastguard Worker "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtend_so.o": nil, 434*333d2b36SAndroid Build Coastguard Worker "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtbegin_so.o": nil, 435*333d2b36SAndroid Build Coastguard Worker "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtend_so.o": nil, 436*333d2b36SAndroid Build Coastguard Worker } 437*333d2b36SAndroid Build Coastguard Worker 438*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJavaWithFS(t, bp, fs) 439*333d2b36SAndroid Build Coastguard Worker 440*333d2b36SAndroid Build Coastguard Worker inputs := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").Description("link").Implicits 441*333d2b36SAndroid Build Coastguard Worker var crtbeginFound, crtendFound bool 442*333d2b36SAndroid Build Coastguard Worker expectedCrtBegin := ctx.ModuleForTests("crtbegin_so", 443*333d2b36SAndroid Build Coastguard Worker "android_arm64_armv8-a_sdk_29").Rule("noAddrSig").Output 444*333d2b36SAndroid Build Coastguard Worker expectedCrtEnd := ctx.ModuleForTests("crtend_so", 445*333d2b36SAndroid Build Coastguard Worker "android_arm64_armv8-a_sdk_29").Rule("noAddrSig").Output 446*333d2b36SAndroid Build Coastguard Worker implicits := []string{} 447*333d2b36SAndroid Build Coastguard Worker for _, input := range inputs { 448*333d2b36SAndroid Build Coastguard Worker implicits = append(implicits, input.String()) 449*333d2b36SAndroid Build Coastguard Worker if strings.HasSuffix(input.String(), expectedCrtBegin.String()) { 450*333d2b36SAndroid Build Coastguard Worker crtbeginFound = true 451*333d2b36SAndroid Build Coastguard Worker } else if strings.HasSuffix(input.String(), expectedCrtEnd.String()) { 452*333d2b36SAndroid Build Coastguard Worker crtendFound = true 453*333d2b36SAndroid Build Coastguard Worker } 454*333d2b36SAndroid Build Coastguard Worker } 455*333d2b36SAndroid Build Coastguard Worker if !crtbeginFound { 456*333d2b36SAndroid Build Coastguard Worker t.Error(fmt.Sprintf( 457*333d2b36SAndroid Build Coastguard Worker "expected implicit with suffix %q, have the following implicits:\n%s", 458*333d2b36SAndroid Build Coastguard Worker expectedCrtBegin, strings.Join(implicits, "\n"))) 459*333d2b36SAndroid Build Coastguard Worker } 460*333d2b36SAndroid Build Coastguard Worker if !crtendFound { 461*333d2b36SAndroid Build Coastguard Worker t.Error(fmt.Sprintf( 462*333d2b36SAndroid Build Coastguard Worker "expected implicit with suffix %q, have the following implicits:\n%s", 463*333d2b36SAndroid Build Coastguard Worker expectedCrtEnd, strings.Join(implicits, "\n"))) 464*333d2b36SAndroid Build Coastguard Worker } 465*333d2b36SAndroid Build Coastguard Worker} 466*333d2b36SAndroid Build Coastguard Worker 467*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatableApps_ErrorIfJniLibDoesntSupportMinSdkVersion(t *testing.T) { 468*333d2b36SAndroid Build Coastguard Worker bp := cc.GatherRequiredDepsForTest(android.Android) + ` 469*333d2b36SAndroid Build Coastguard Worker android_app { 470*333d2b36SAndroid Build Coastguard Worker name: "foo", 471*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 472*333d2b36SAndroid Build Coastguard Worker updatable: true, 473*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 474*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", // this APK should support 29 475*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 476*333d2b36SAndroid Build Coastguard Worker } 477*333d2b36SAndroid Build Coastguard Worker 478*333d2b36SAndroid Build Coastguard Worker cc_library { 479*333d2b36SAndroid Build Coastguard Worker name: "libjni", 480*333d2b36SAndroid Build Coastguard Worker stl: "none", 481*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 482*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "current", 483*333d2b36SAndroid Build Coastguard Worker } 484*333d2b36SAndroid Build Coastguard Worker ` 485*333d2b36SAndroid Build Coastguard Worker testJavaError(t, `"libjni" .*: min_sdk_version\(current\) is higher than min_sdk_version\(29\)`, bp) 486*333d2b36SAndroid Build Coastguard Worker} 487*333d2b36SAndroid Build Coastguard Worker 488*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatableApps_ErrorIfDepMinSdkVersionIsHigher(t *testing.T) { 489*333d2b36SAndroid Build Coastguard Worker bp := cc.GatherRequiredDepsForTest(android.Android) + ` 490*333d2b36SAndroid Build Coastguard Worker android_app { 491*333d2b36SAndroid Build Coastguard Worker name: "foo", 492*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 493*333d2b36SAndroid Build Coastguard Worker updatable: true, 494*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 495*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", // this APK should support 29 496*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 497*333d2b36SAndroid Build Coastguard Worker } 498*333d2b36SAndroid Build Coastguard Worker 499*333d2b36SAndroid Build Coastguard Worker cc_library { 500*333d2b36SAndroid Build Coastguard Worker name: "libjni", 501*333d2b36SAndroid Build Coastguard Worker stl: "none", 502*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbar"], 503*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 504*333d2b36SAndroid Build Coastguard Worker sdk_version: "27", 505*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "27", 506*333d2b36SAndroid Build Coastguard Worker } 507*333d2b36SAndroid Build Coastguard Worker 508*333d2b36SAndroid Build Coastguard Worker cc_library { 509*333d2b36SAndroid Build Coastguard Worker name: "libbar", 510*333d2b36SAndroid Build Coastguard Worker stl: "none", 511*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 512*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 513*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "current", 514*333d2b36SAndroid Build Coastguard Worker } 515*333d2b36SAndroid Build Coastguard Worker ` 516*333d2b36SAndroid Build Coastguard Worker testJavaError(t, `"libjni" .*: links "libbar" built against newer API version "current"`, bp) 517*333d2b36SAndroid Build Coastguard Worker} 518*333d2b36SAndroid Build Coastguard Worker 519*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatableApps_ApplyDefaultUpdatableModuleVersion(t *testing.T) { 520*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 521*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 522*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 523*333d2b36SAndroid Build Coastguard Worker android_app { 524*333d2b36SAndroid Build Coastguard Worker name: "com.android.foo", 525*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 526*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 527*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "31", 528*333d2b36SAndroid Build Coastguard Worker updatable: true, 529*333d2b36SAndroid Build Coastguard Worker } 530*333d2b36SAndroid Build Coastguard Worker `) 531*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer") 532*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, 533*333d2b36SAndroid Build Coastguard Worker "com.android.foo: expected manifest fixer to set override-placeholder-version to RELEASE_DEFAULT_UPDATABLE_MODULE_VERSION", 534*333d2b36SAndroid Build Coastguard Worker foo.BuildParams.Args["args"], 535*333d2b36SAndroid Build Coastguard Worker fmt.Sprintf("--override-placeholder-version %s", testDefaultUpdatableModuleVersion), 536*333d2b36SAndroid Build Coastguard Worker ) 537*333d2b36SAndroid Build Coastguard Worker} 538*333d2b36SAndroid Build Coastguard Worker 539*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatableApps_ApplyOverrideApexManifestDefaultVersion(t *testing.T) { 540*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 541*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 542*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeEnv(map[string]string{ 543*333d2b36SAndroid Build Coastguard Worker "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234", 544*333d2b36SAndroid Build Coastguard Worker }), 545*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 546*333d2b36SAndroid Build Coastguard Worker android_app { 547*333d2b36SAndroid Build Coastguard Worker name: "com.android.foo", 548*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 549*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 550*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "31", 551*333d2b36SAndroid Build Coastguard Worker updatable: true, 552*333d2b36SAndroid Build Coastguard Worker } 553*333d2b36SAndroid Build Coastguard Worker `) 554*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer") 555*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, 556*333d2b36SAndroid Build Coastguard Worker "com.android.foo: expected manifest fixer to set override-placeholder-version to 1234", 557*333d2b36SAndroid Build Coastguard Worker foo.BuildParams.Args["args"], 558*333d2b36SAndroid Build Coastguard Worker "--override-placeholder-version 1234", 559*333d2b36SAndroid Build Coastguard Worker ) 560*333d2b36SAndroid Build Coastguard Worker} 561*333d2b36SAndroid Build Coastguard Worker 562*333d2b36SAndroid Build Coastguard Workerfunc TestResourceDirs(t *testing.T) { 563*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 564*333d2b36SAndroid Build Coastguard Worker name string 565*333d2b36SAndroid Build Coastguard Worker prop string 566*333d2b36SAndroid Build Coastguard Worker resources []string 567*333d2b36SAndroid Build Coastguard Worker }{ 568*333d2b36SAndroid Build Coastguard Worker { 569*333d2b36SAndroid Build Coastguard Worker name: "no resource_dirs", 570*333d2b36SAndroid Build Coastguard Worker prop: "", 571*333d2b36SAndroid Build Coastguard Worker resources: []string{"res/res/values/strings.xml"}, 572*333d2b36SAndroid Build Coastguard Worker }, 573*333d2b36SAndroid Build Coastguard Worker { 574*333d2b36SAndroid Build Coastguard Worker name: "resource_dirs", 575*333d2b36SAndroid Build Coastguard Worker prop: `resource_dirs: ["res"]`, 576*333d2b36SAndroid Build Coastguard Worker resources: []string{"res/res/values/strings.xml"}, 577*333d2b36SAndroid Build Coastguard Worker }, 578*333d2b36SAndroid Build Coastguard Worker { 579*333d2b36SAndroid Build Coastguard Worker name: "empty resource_dirs", 580*333d2b36SAndroid Build Coastguard Worker prop: `resource_dirs: []`, 581*333d2b36SAndroid Build Coastguard Worker resources: nil, 582*333d2b36SAndroid Build Coastguard Worker }, 583*333d2b36SAndroid Build Coastguard Worker } 584*333d2b36SAndroid Build Coastguard Worker 585*333d2b36SAndroid Build Coastguard Worker fs := android.MockFS{ 586*333d2b36SAndroid Build Coastguard Worker "res/res/values/strings.xml": nil, 587*333d2b36SAndroid Build Coastguard Worker } 588*333d2b36SAndroid Build Coastguard Worker 589*333d2b36SAndroid Build Coastguard Worker bp := ` 590*333d2b36SAndroid Build Coastguard Worker android_app { 591*333d2b36SAndroid Build Coastguard Worker name: "foo", 592*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 593*333d2b36SAndroid Build Coastguard Worker %s 594*333d2b36SAndroid Build Coastguard Worker } 595*333d2b36SAndroid Build Coastguard Worker ` 596*333d2b36SAndroid Build Coastguard Worker 597*333d2b36SAndroid Build Coastguard Worker for _, testCase := range testCases { 598*333d2b36SAndroid Build Coastguard Worker t.Run(testCase.name, func(t *testing.T) { 599*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 600*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 601*333d2b36SAndroid Build Coastguard Worker fs.AddToFixture(), 602*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, fmt.Sprintf(bp, testCase.prop)) 603*333d2b36SAndroid Build Coastguard Worker 604*333d2b36SAndroid Build Coastguard Worker module := result.ModuleForTests("foo", "android_common") 605*333d2b36SAndroid Build Coastguard Worker resourceList := module.MaybeOutput("aapt2/res.list") 606*333d2b36SAndroid Build Coastguard Worker 607*333d2b36SAndroid Build Coastguard Worker var resources []string 608*333d2b36SAndroid Build Coastguard Worker if resourceList.Rule != nil { 609*333d2b36SAndroid Build Coastguard Worker for _, compiledResource := range resourceList.Inputs.Strings() { 610*333d2b36SAndroid Build Coastguard Worker resources = append(resources, module.Output(compiledResource).Inputs.Strings()...) 611*333d2b36SAndroid Build Coastguard Worker } 612*333d2b36SAndroid Build Coastguard Worker } 613*333d2b36SAndroid Build Coastguard Worker 614*333d2b36SAndroid Build Coastguard Worker android.AssertDeepEquals(t, "resource files", testCase.resources, resources) 615*333d2b36SAndroid Build Coastguard Worker }) 616*333d2b36SAndroid Build Coastguard Worker } 617*333d2b36SAndroid Build Coastguard Worker} 618*333d2b36SAndroid Build Coastguard Worker 619*333d2b36SAndroid Build Coastguard Workerfunc TestLibraryAssets(t *testing.T) { 620*333d2b36SAndroid Build Coastguard Worker bp := ` 621*333d2b36SAndroid Build Coastguard Worker android_app { 622*333d2b36SAndroid Build Coastguard Worker name: "foo", 623*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 624*333d2b36SAndroid Build Coastguard Worker static_libs: ["lib1", "lib2", "lib3"], 625*333d2b36SAndroid Build Coastguard Worker } 626*333d2b36SAndroid Build Coastguard Worker 627*333d2b36SAndroid Build Coastguard Worker android_library { 628*333d2b36SAndroid Build Coastguard Worker name: "lib1", 629*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 630*333d2b36SAndroid Build Coastguard Worker asset_dirs: ["assets_a"], 631*333d2b36SAndroid Build Coastguard Worker } 632*333d2b36SAndroid Build Coastguard Worker 633*333d2b36SAndroid Build Coastguard Worker android_library { 634*333d2b36SAndroid Build Coastguard Worker name: "lib2", 635*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 636*333d2b36SAndroid Build Coastguard Worker } 637*333d2b36SAndroid Build Coastguard Worker 638*333d2b36SAndroid Build Coastguard Worker android_library { 639*333d2b36SAndroid Build Coastguard Worker name: "lib3", 640*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 641*333d2b36SAndroid Build Coastguard Worker static_libs: ["lib4", "import"], 642*333d2b36SAndroid Build Coastguard Worker } 643*333d2b36SAndroid Build Coastguard Worker 644*333d2b36SAndroid Build Coastguard Worker android_library { 645*333d2b36SAndroid Build Coastguard Worker name: "lib4", 646*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 647*333d2b36SAndroid Build Coastguard Worker asset_dirs: ["assets_b"], 648*333d2b36SAndroid Build Coastguard Worker } 649*333d2b36SAndroid Build Coastguard Worker 650*333d2b36SAndroid Build Coastguard Worker android_library { 651*333d2b36SAndroid Build Coastguard Worker name: "lib5", 652*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 653*333d2b36SAndroid Build Coastguard Worker assets: [ 654*333d2b36SAndroid Build Coastguard Worker "path/to/asset_file_1", 655*333d2b36SAndroid Build Coastguard Worker "path/to/asset_file_2", 656*333d2b36SAndroid Build Coastguard Worker ], 657*333d2b36SAndroid Build Coastguard Worker } 658*333d2b36SAndroid Build Coastguard Worker 659*333d2b36SAndroid Build Coastguard Worker android_library_import { 660*333d2b36SAndroid Build Coastguard Worker name: "import", 661*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 662*333d2b36SAndroid Build Coastguard Worker aars: ["import.aar"], 663*333d2b36SAndroid Build Coastguard Worker } 664*333d2b36SAndroid Build Coastguard Worker ` 665*333d2b36SAndroid Build Coastguard Worker 666*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 667*333d2b36SAndroid Build Coastguard Worker name string 668*333d2b36SAndroid Build Coastguard Worker assetFlag string 669*333d2b36SAndroid Build Coastguard Worker assetPackages []string 670*333d2b36SAndroid Build Coastguard Worker tmpAssetDirInputs []string 671*333d2b36SAndroid Build Coastguard Worker tmpAssetDirOutputs []string 672*333d2b36SAndroid Build Coastguard Worker }{ 673*333d2b36SAndroid Build Coastguard Worker { 674*333d2b36SAndroid Build Coastguard Worker name: "foo", 675*333d2b36SAndroid Build Coastguard Worker // lib1 has its own assets. lib3 doesn't have any, but lib4 and import have assets. 676*333d2b36SAndroid Build Coastguard Worker assetPackages: []string{ 677*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/foo/android_common/aapt2/package-res.apk", 678*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/lib1/android_common/assets.zip", 679*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/lib4/android_common/assets.zip", 680*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/import/android_common/assets.zip", 681*333d2b36SAndroid Build Coastguard Worker }, 682*333d2b36SAndroid Build Coastguard Worker }, 683*333d2b36SAndroid Build Coastguard Worker { 684*333d2b36SAndroid Build Coastguard Worker name: "lib1", 685*333d2b36SAndroid Build Coastguard Worker assetFlag: "-A assets_a", 686*333d2b36SAndroid Build Coastguard Worker }, 687*333d2b36SAndroid Build Coastguard Worker { 688*333d2b36SAndroid Build Coastguard Worker name: "lib2", 689*333d2b36SAndroid Build Coastguard Worker }, 690*333d2b36SAndroid Build Coastguard Worker { 691*333d2b36SAndroid Build Coastguard Worker name: "lib3", 692*333d2b36SAndroid Build Coastguard Worker }, 693*333d2b36SAndroid Build Coastguard Worker { 694*333d2b36SAndroid Build Coastguard Worker name: "lib4", 695*333d2b36SAndroid Build Coastguard Worker assetFlag: "-A assets_b", 696*333d2b36SAndroid Build Coastguard Worker }, 697*333d2b36SAndroid Build Coastguard Worker { 698*333d2b36SAndroid Build Coastguard Worker name: "lib5", 699*333d2b36SAndroid Build Coastguard Worker assetFlag: "-A out/soong/.intermediates/lib5/android_common/tmp_asset_dir", 700*333d2b36SAndroid Build Coastguard Worker tmpAssetDirInputs: []string{ 701*333d2b36SAndroid Build Coastguard Worker "path/to/asset_file_1", 702*333d2b36SAndroid Build Coastguard Worker "path/to/asset_file_2", 703*333d2b36SAndroid Build Coastguard Worker }, 704*333d2b36SAndroid Build Coastguard Worker tmpAssetDirOutputs: []string{ 705*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/lib5/android_common/tmp_asset_dir/path/to/asset_file_1", 706*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/lib5/android_common/tmp_asset_dir/path/to/asset_file_2", 707*333d2b36SAndroid Build Coastguard Worker }, 708*333d2b36SAndroid Build Coastguard Worker }, 709*333d2b36SAndroid Build Coastguard Worker } 710*333d2b36SAndroid Build Coastguard Worker ctx := testApp(t, bp) 711*333d2b36SAndroid Build Coastguard Worker 712*333d2b36SAndroid Build Coastguard Worker for _, test := range testCases { 713*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 714*333d2b36SAndroid Build Coastguard Worker m := ctx.ModuleForTests(test.name, "android_common") 715*333d2b36SAndroid Build Coastguard Worker 716*333d2b36SAndroid Build Coastguard Worker // Check asset flag in aapt2 link flags 717*333d2b36SAndroid Build Coastguard Worker var aapt2link android.TestingBuildParams 718*333d2b36SAndroid Build Coastguard Worker if len(test.assetPackages) > 0 { 719*333d2b36SAndroid Build Coastguard Worker aapt2link = m.Output("aapt2/package-res.apk") 720*333d2b36SAndroid Build Coastguard Worker } else { 721*333d2b36SAndroid Build Coastguard Worker aapt2link = m.Output("package-res.apk") 722*333d2b36SAndroid Build Coastguard Worker } 723*333d2b36SAndroid Build Coastguard Worker aapt2link = aapt2link 724*333d2b36SAndroid Build Coastguard Worker aapt2Flags := aapt2link.Args["flags"] 725*333d2b36SAndroid Build Coastguard Worker if test.assetFlag != "" { 726*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "asset flag", aapt2Flags, test.assetFlag) 727*333d2b36SAndroid Build Coastguard Worker } else { 728*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, "aapt2 link flags", aapt2Flags, " -A ") 729*333d2b36SAndroid Build Coastguard Worker } 730*333d2b36SAndroid Build Coastguard Worker 731*333d2b36SAndroid Build Coastguard Worker // Check asset merge rule. 732*333d2b36SAndroid Build Coastguard Worker if len(test.assetPackages) > 0 { 733*333d2b36SAndroid Build Coastguard Worker mergeAssets := m.Output("package-res.apk") 734*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "mergeAssets inputs", test.assetPackages, mergeAssets.Inputs) 735*333d2b36SAndroid Build Coastguard Worker } 736*333d2b36SAndroid Build Coastguard Worker 737*333d2b36SAndroid Build Coastguard Worker if len(test.tmpAssetDirInputs) > 0 { 738*333d2b36SAndroid Build Coastguard Worker rule := m.Rule("tmp_asset_dir") 739*333d2b36SAndroid Build Coastguard Worker inputs := rule.Implicits 740*333d2b36SAndroid Build Coastguard Worker outputs := append(android.WritablePaths{rule.Output}, rule.ImplicitOutputs...).Paths() 741*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "tmp_asset_dir inputs", test.tmpAssetDirInputs, inputs) 742*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "tmp_asset_dir outputs", test.tmpAssetDirOutputs, outputs) 743*333d2b36SAndroid Build Coastguard Worker } 744*333d2b36SAndroid Build Coastguard Worker }) 745*333d2b36SAndroid Build Coastguard Worker } 746*333d2b36SAndroid Build Coastguard Worker} 747*333d2b36SAndroid Build Coastguard Worker 748*333d2b36SAndroid Build Coastguard Workerfunc TestAppJavaResources(t *testing.T) { 749*333d2b36SAndroid Build Coastguard Worker bp := ` 750*333d2b36SAndroid Build Coastguard Worker android_app { 751*333d2b36SAndroid Build Coastguard Worker name: "foo", 752*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 753*333d2b36SAndroid Build Coastguard Worker java_resources: ["resources/a"], 754*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 755*333d2b36SAndroid Build Coastguard Worker } 756*333d2b36SAndroid Build Coastguard Worker 757*333d2b36SAndroid Build Coastguard Worker android_app { 758*333d2b36SAndroid Build Coastguard Worker name: "bar", 759*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 760*333d2b36SAndroid Build Coastguard Worker java_resources: ["resources/a"], 761*333d2b36SAndroid Build Coastguard Worker } 762*333d2b36SAndroid Build Coastguard Worker ` 763*333d2b36SAndroid Build Coastguard Worker 764*333d2b36SAndroid Build Coastguard Worker ctx := testApp(t, bp) 765*333d2b36SAndroid Build Coastguard Worker 766*333d2b36SAndroid Build Coastguard Worker foo := ctx.ModuleForTests("foo", "android_common") 767*333d2b36SAndroid Build Coastguard Worker fooResources := foo.Output("res/foo.jar") 768*333d2b36SAndroid Build Coastguard Worker fooDexJar := foo.Output("dex-withres/foo.jar") 769*333d2b36SAndroid Build Coastguard Worker fooDexJarAligned := foo.Output("dex-withres-aligned/foo.jar") 770*333d2b36SAndroid Build Coastguard Worker fooApk := foo.Rule("combineApk") 771*333d2b36SAndroid Build Coastguard Worker 772*333d2b36SAndroid Build Coastguard Worker if g, w := fooDexJar.Inputs.Strings(), fooResources.Output.String(); !android.InList(w, g) { 773*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected resource jar %q in foo dex jar inputs %q", w, g) 774*333d2b36SAndroid Build Coastguard Worker } 775*333d2b36SAndroid Build Coastguard Worker 776*333d2b36SAndroid Build Coastguard Worker if g, w := fooDexJarAligned.Input.String(), fooDexJar.Output.String(); g != w { 777*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected dex jar %q in foo aligned dex jar inputs %q", w, g) 778*333d2b36SAndroid Build Coastguard Worker } 779*333d2b36SAndroid Build Coastguard Worker 780*333d2b36SAndroid Build Coastguard Worker if g, w := fooApk.Inputs.Strings(), fooDexJarAligned.Output.String(); !android.InList(w, g) { 781*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected aligned dex jar %q in foo apk inputs %q", w, g) 782*333d2b36SAndroid Build Coastguard Worker } 783*333d2b36SAndroid Build Coastguard Worker 784*333d2b36SAndroid Build Coastguard Worker bar := ctx.ModuleForTests("bar", "android_common") 785*333d2b36SAndroid Build Coastguard Worker barResources := bar.Output("res/bar.jar") 786*333d2b36SAndroid Build Coastguard Worker barApk := bar.Rule("combineApk") 787*333d2b36SAndroid Build Coastguard Worker 788*333d2b36SAndroid Build Coastguard Worker if g, w := barApk.Inputs.Strings(), barResources.Output.String(); !android.InList(w, g) { 789*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected resources jar %q in bar apk inputs %q", w, g) 790*333d2b36SAndroid Build Coastguard Worker } 791*333d2b36SAndroid Build Coastguard Worker} 792*333d2b36SAndroid Build Coastguard Worker 793*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidResourceProcessor(t *testing.T) { 794*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 795*333d2b36SAndroid Build Coastguard Worker name string 796*333d2b36SAndroid Build Coastguard Worker appUsesRP bool 797*333d2b36SAndroid Build Coastguard Worker directLibUsesRP bool 798*333d2b36SAndroid Build Coastguard Worker transitiveLibUsesRP bool 799*333d2b36SAndroid Build Coastguard Worker sharedLibUsesRP bool 800*333d2b36SAndroid Build Coastguard Worker sharedTransitiveStaticLibUsesRP bool 801*333d2b36SAndroid Build Coastguard Worker sharedTransitiveSharedLibUsesRP bool 802*333d2b36SAndroid Build Coastguard Worker 803*333d2b36SAndroid Build Coastguard Worker dontVerifyApp bool 804*333d2b36SAndroid Build Coastguard Worker appResources []string 805*333d2b36SAndroid Build Coastguard Worker appOverlays []string 806*333d2b36SAndroid Build Coastguard Worker appImports []string 807*333d2b36SAndroid Build Coastguard Worker appSrcJars []string 808*333d2b36SAndroid Build Coastguard Worker appClasspath []string 809*333d2b36SAndroid Build Coastguard Worker appCombined []string 810*333d2b36SAndroid Build Coastguard Worker 811*333d2b36SAndroid Build Coastguard Worker dontVerifyDirect bool 812*333d2b36SAndroid Build Coastguard Worker directResources []string 813*333d2b36SAndroid Build Coastguard Worker directOverlays []string 814*333d2b36SAndroid Build Coastguard Worker directImports []string 815*333d2b36SAndroid Build Coastguard Worker directSrcJars []string 816*333d2b36SAndroid Build Coastguard Worker directClasspath []string 817*333d2b36SAndroid Build Coastguard Worker directCombined []string 818*333d2b36SAndroid Build Coastguard Worker 819*333d2b36SAndroid Build Coastguard Worker dontVerifyTransitive bool 820*333d2b36SAndroid Build Coastguard Worker transitiveResources []string 821*333d2b36SAndroid Build Coastguard Worker transitiveOverlays []string 822*333d2b36SAndroid Build Coastguard Worker transitiveImports []string 823*333d2b36SAndroid Build Coastguard Worker transitiveSrcJars []string 824*333d2b36SAndroid Build Coastguard Worker transitiveClasspath []string 825*333d2b36SAndroid Build Coastguard Worker transitiveCombined []string 826*333d2b36SAndroid Build Coastguard Worker 827*333d2b36SAndroid Build Coastguard Worker dontVerifyDirectImport bool 828*333d2b36SAndroid Build Coastguard Worker directImportResources []string 829*333d2b36SAndroid Build Coastguard Worker directImportOverlays []string 830*333d2b36SAndroid Build Coastguard Worker directImportImports []string 831*333d2b36SAndroid Build Coastguard Worker 832*333d2b36SAndroid Build Coastguard Worker dontVerifyTransitiveImport bool 833*333d2b36SAndroid Build Coastguard Worker transitiveImportResources []string 834*333d2b36SAndroid Build Coastguard Worker transitiveImportOverlays []string 835*333d2b36SAndroid Build Coastguard Worker transitiveImportImports []string 836*333d2b36SAndroid Build Coastguard Worker 837*333d2b36SAndroid Build Coastguard Worker dontVerifyShared bool 838*333d2b36SAndroid Build Coastguard Worker sharedResources []string 839*333d2b36SAndroid Build Coastguard Worker sharedOverlays []string 840*333d2b36SAndroid Build Coastguard Worker sharedImports []string 841*333d2b36SAndroid Build Coastguard Worker sharedSrcJars []string 842*333d2b36SAndroid Build Coastguard Worker sharedClasspath []string 843*333d2b36SAndroid Build Coastguard Worker sharedCombined []string 844*333d2b36SAndroid Build Coastguard Worker }{ 845*333d2b36SAndroid Build Coastguard Worker { 846*333d2b36SAndroid Build Coastguard Worker // Test with all modules set to use_resource_processor: false (except android_library_import modules, 847*333d2b36SAndroid Build Coastguard Worker // which always use resource processor). 848*333d2b36SAndroid Build Coastguard Worker name: "legacy", 849*333d2b36SAndroid Build Coastguard Worker appUsesRP: false, 850*333d2b36SAndroid Build Coastguard Worker directLibUsesRP: false, 851*333d2b36SAndroid Build Coastguard Worker transitiveLibUsesRP: false, 852*333d2b36SAndroid Build Coastguard Worker 853*333d2b36SAndroid Build Coastguard Worker appResources: nil, 854*333d2b36SAndroid Build Coastguard Worker appOverlays: []string{ 855*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive/android_common/package-res.apk", 856*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk", 857*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import/android_common/package-res.apk", 858*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct/android_common/package-res.apk", 859*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk", 860*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct_import/android_common/package-res.apk", 861*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat", 862*333d2b36SAndroid Build Coastguard Worker }, 863*333d2b36SAndroid Build Coastguard Worker appImports: []string{ 864*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared/android_common/package-res.apk", 865*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk", 866*333d2b36SAndroid Build Coastguard Worker }, 867*333d2b36SAndroid Build Coastguard Worker appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"}, 868*333d2b36SAndroid Build Coastguard Worker appClasspath: []string{ 869*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar", 870*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar", 871*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar", 872*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar", 873*333d2b36SAndroid Build Coastguard Worker }, 874*333d2b36SAndroid Build Coastguard Worker appCombined: []string{ 875*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/app/android_common/javac/app.jar", 876*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct/android_common/combined/direct.jar", 877*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar", 878*333d2b36SAndroid Build Coastguard Worker }, 879*333d2b36SAndroid Build Coastguard Worker 880*333d2b36SAndroid Build Coastguard Worker directResources: nil, 881*333d2b36SAndroid Build Coastguard Worker directOverlays: []string{ 882*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive/android_common/package-res.apk", 883*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk", 884*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import/android_common/package-res.apk", 885*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat", 886*333d2b36SAndroid Build Coastguard Worker }, 887*333d2b36SAndroid Build Coastguard Worker directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"}, 888*333d2b36SAndroid Build Coastguard Worker directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"}, 889*333d2b36SAndroid Build Coastguard Worker directClasspath: []string{ 890*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar", 891*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar", 892*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import/android_common/turbine-combined/transitive_import.jar", 893*333d2b36SAndroid Build Coastguard Worker }, 894*333d2b36SAndroid Build Coastguard Worker directCombined: []string{ 895*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct/android_common/javac/direct.jar", 896*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive/android_common/javac/transitive.jar", 897*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import/android_common/combined/transitive_import.jar", 898*333d2b36SAndroid Build Coastguard Worker }, 899*333d2b36SAndroid Build Coastguard Worker 900*333d2b36SAndroid Build Coastguard Worker transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"}, 901*333d2b36SAndroid Build Coastguard Worker transitiveOverlays: nil, 902*333d2b36SAndroid Build Coastguard Worker transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"}, 903*333d2b36SAndroid Build Coastguard Worker transitiveSrcJars: []string{"out/soong/.intermediates/transitive/android_common/gen/android/R.srcjar"}, 904*333d2b36SAndroid Build Coastguard Worker transitiveClasspath: []string{"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar"}, 905*333d2b36SAndroid Build Coastguard Worker transitiveCombined: nil, 906*333d2b36SAndroid Build Coastguard Worker 907*333d2b36SAndroid Build Coastguard Worker sharedResources: nil, 908*333d2b36SAndroid Build Coastguard Worker sharedOverlays: []string{ 909*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared_transitive_static/android_common/package-res.apk", 910*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared/android_common/aapt2/shared/res/values_strings.arsc.flat", 911*333d2b36SAndroid Build Coastguard Worker }, 912*333d2b36SAndroid Build Coastguard Worker sharedImports: []string{ 913*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared_transitive_shared/android_common/package-res.apk", 914*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk", 915*333d2b36SAndroid Build Coastguard Worker }, 916*333d2b36SAndroid Build Coastguard Worker sharedSrcJars: []string{"out/soong/.intermediates/shared/android_common/gen/android/R.srcjar"}, 917*333d2b36SAndroid Build Coastguard Worker sharedClasspath: []string{ 918*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar", 919*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared_transitive_shared/android_common/turbine-combined/shared_transitive_shared.jar", 920*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared_transitive_static/android_common/turbine-combined/shared_transitive_static.jar", 921*333d2b36SAndroid Build Coastguard Worker }, 922*333d2b36SAndroid Build Coastguard Worker sharedCombined: []string{ 923*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared/android_common/javac/shared.jar", 924*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared_transitive_static/android_common/javac/shared_transitive_static.jar", 925*333d2b36SAndroid Build Coastguard Worker }, 926*333d2b36SAndroid Build Coastguard Worker 927*333d2b36SAndroid Build Coastguard Worker directImportResources: nil, 928*333d2b36SAndroid Build Coastguard Worker directImportOverlays: []string{"out/soong/.intermediates/direct_import/android_common/flat-res/gen_res.flata"}, 929*333d2b36SAndroid Build Coastguard Worker directImportImports: []string{ 930*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk", 931*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk", 932*333d2b36SAndroid Build Coastguard Worker }, 933*333d2b36SAndroid Build Coastguard Worker 934*333d2b36SAndroid Build Coastguard Worker transitiveImportResources: nil, 935*333d2b36SAndroid Build Coastguard Worker transitiveImportOverlays: []string{"out/soong/.intermediates/transitive_import/android_common/flat-res/gen_res.flata"}, 936*333d2b36SAndroid Build Coastguard Worker transitiveImportImports: []string{ 937*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk", 938*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk", 939*333d2b36SAndroid Build Coastguard Worker }, 940*333d2b36SAndroid Build Coastguard Worker }, 941*333d2b36SAndroid Build Coastguard Worker { 942*333d2b36SAndroid Build Coastguard Worker // Test with all modules set to use_resource_processor: true. 943*333d2b36SAndroid Build Coastguard Worker name: "resource_processor", 944*333d2b36SAndroid Build Coastguard Worker appUsesRP: true, 945*333d2b36SAndroid Build Coastguard Worker directLibUsesRP: true, 946*333d2b36SAndroid Build Coastguard Worker transitiveLibUsesRP: true, 947*333d2b36SAndroid Build Coastguard Worker sharedLibUsesRP: true, 948*333d2b36SAndroid Build Coastguard Worker sharedTransitiveSharedLibUsesRP: true, 949*333d2b36SAndroid Build Coastguard Worker sharedTransitiveStaticLibUsesRP: true, 950*333d2b36SAndroid Build Coastguard Worker 951*333d2b36SAndroid Build Coastguard Worker appResources: nil, 952*333d2b36SAndroid Build Coastguard Worker appOverlays: []string{ 953*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive/android_common/package-res.apk", 954*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk", 955*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import/android_common/package-res.apk", 956*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct/android_common/package-res.apk", 957*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk", 958*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct_import/android_common/package-res.apk", 959*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat", 960*333d2b36SAndroid Build Coastguard Worker }, 961*333d2b36SAndroid Build Coastguard Worker appImports: []string{ 962*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared/android_common/package-res.apk", 963*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk", 964*333d2b36SAndroid Build Coastguard Worker }, 965*333d2b36SAndroid Build Coastguard Worker appSrcJars: nil, 966*333d2b36SAndroid Build Coastguard Worker appClasspath: []string{ 967*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar", 968*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/app/android_common/busybox/R.jar", 969*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar", 970*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar", 971*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar", 972*333d2b36SAndroid Build Coastguard Worker }, 973*333d2b36SAndroid Build Coastguard Worker appCombined: []string{ 974*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/app/android_common/javac/app.jar", 975*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/app/android_common/busybox/R.jar", 976*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct/android_common/combined/direct.jar", 977*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar", 978*333d2b36SAndroid Build Coastguard Worker }, 979*333d2b36SAndroid Build Coastguard Worker 980*333d2b36SAndroid Build Coastguard Worker directResources: nil, 981*333d2b36SAndroid Build Coastguard Worker directOverlays: []string{"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat"}, 982*333d2b36SAndroid Build Coastguard Worker directImports: []string{ 983*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk", 984*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import/android_common/package-res.apk", 985*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk", 986*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive/android_common/package-res.apk", 987*333d2b36SAndroid Build Coastguard Worker }, 988*333d2b36SAndroid Build Coastguard Worker directSrcJars: nil, 989*333d2b36SAndroid Build Coastguard Worker directClasspath: []string{ 990*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar", 991*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct/android_common/busybox/R.jar", 992*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive/android_common/busybox/R.jar", 993*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import_dep/android_common/busybox/R.jar", 994*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import/android_common/busybox/R.jar", 995*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar", 996*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import/android_common/turbine-combined/transitive_import.jar", 997*333d2b36SAndroid Build Coastguard Worker }, 998*333d2b36SAndroid Build Coastguard Worker directCombined: []string{ 999*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct/android_common/javac/direct.jar", 1000*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive/android_common/javac/transitive.jar", 1001*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import/android_common/combined/transitive_import.jar", 1002*333d2b36SAndroid Build Coastguard Worker }, 1003*333d2b36SAndroid Build Coastguard Worker 1004*333d2b36SAndroid Build Coastguard Worker transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"}, 1005*333d2b36SAndroid Build Coastguard Worker transitiveOverlays: nil, 1006*333d2b36SAndroid Build Coastguard Worker transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"}, 1007*333d2b36SAndroid Build Coastguard Worker transitiveSrcJars: nil, 1008*333d2b36SAndroid Build Coastguard Worker transitiveClasspath: []string{ 1009*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar", 1010*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive/android_common/busybox/R.jar", 1011*333d2b36SAndroid Build Coastguard Worker }, 1012*333d2b36SAndroid Build Coastguard Worker transitiveCombined: nil, 1013*333d2b36SAndroid Build Coastguard Worker 1014*333d2b36SAndroid Build Coastguard Worker sharedResources: nil, 1015*333d2b36SAndroid Build Coastguard Worker sharedOverlays: []string{"out/soong/.intermediates/shared/android_common/aapt2/shared/res/values_strings.arsc.flat"}, 1016*333d2b36SAndroid Build Coastguard Worker sharedImports: []string{ 1017*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared_transitive_shared/android_common/package-res.apk", 1018*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk", 1019*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared_transitive_static/android_common/package-res.apk", 1020*333d2b36SAndroid Build Coastguard Worker }, 1021*333d2b36SAndroid Build Coastguard Worker sharedSrcJars: nil, 1022*333d2b36SAndroid Build Coastguard Worker sharedClasspath: []string{ 1023*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar", 1024*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared/android_common/busybox/R.jar", 1025*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared_transitive_static/android_common/busybox/R.jar", 1026*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared_transitive_shared/android_common/busybox/R.jar", 1027*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared_transitive_shared/android_common/turbine-combined/shared_transitive_shared.jar", 1028*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared_transitive_static/android_common/turbine-combined/shared_transitive_static.jar", 1029*333d2b36SAndroid Build Coastguard Worker }, 1030*333d2b36SAndroid Build Coastguard Worker sharedCombined: []string{ 1031*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared/android_common/javac/shared.jar", 1032*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared_transitive_static/android_common/javac/shared_transitive_static.jar", 1033*333d2b36SAndroid Build Coastguard Worker }, 1034*333d2b36SAndroid Build Coastguard Worker 1035*333d2b36SAndroid Build Coastguard Worker directImportResources: nil, 1036*333d2b36SAndroid Build Coastguard Worker directImportOverlays: []string{"out/soong/.intermediates/direct_import/android_common/flat-res/gen_res.flata"}, 1037*333d2b36SAndroid Build Coastguard Worker directImportImports: []string{ 1038*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk", 1039*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk", 1040*333d2b36SAndroid Build Coastguard Worker }, 1041*333d2b36SAndroid Build Coastguard Worker 1042*333d2b36SAndroid Build Coastguard Worker transitiveImportResources: nil, 1043*333d2b36SAndroid Build Coastguard Worker transitiveImportOverlays: []string{"out/soong/.intermediates/transitive_import/android_common/flat-res/gen_res.flata"}, 1044*333d2b36SAndroid Build Coastguard Worker transitiveImportImports: []string{ 1045*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk", 1046*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk", 1047*333d2b36SAndroid Build Coastguard Worker }, 1048*333d2b36SAndroid Build Coastguard Worker }, { 1049*333d2b36SAndroid Build Coastguard Worker // Test an app building with resource processor enabled but with dependencies built without 1050*333d2b36SAndroid Build Coastguard Worker // resource processor. 1051*333d2b36SAndroid Build Coastguard Worker name: "app_resource_processor", 1052*333d2b36SAndroid Build Coastguard Worker appUsesRP: true, 1053*333d2b36SAndroid Build Coastguard Worker directLibUsesRP: false, 1054*333d2b36SAndroid Build Coastguard Worker transitiveLibUsesRP: false, 1055*333d2b36SAndroid Build Coastguard Worker 1056*333d2b36SAndroid Build Coastguard Worker appResources: nil, 1057*333d2b36SAndroid Build Coastguard Worker appOverlays: []string{ 1058*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive/android_common/package-res.apk", 1059*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk", 1060*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import/android_common/package-res.apk", 1061*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct/android_common/package-res.apk", 1062*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk", 1063*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct_import/android_common/package-res.apk", 1064*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat", 1065*333d2b36SAndroid Build Coastguard Worker }, 1066*333d2b36SAndroid Build Coastguard Worker appImports: []string{ 1067*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared/android_common/package-res.apk", 1068*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk", 1069*333d2b36SAndroid Build Coastguard Worker }, 1070*333d2b36SAndroid Build Coastguard Worker appSrcJars: nil, 1071*333d2b36SAndroid Build Coastguard Worker appClasspath: []string{ 1072*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar", 1073*333d2b36SAndroid Build Coastguard Worker // R.jar has to come before direct.jar 1074*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/app/android_common/busybox/R.jar", 1075*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar", 1076*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar", 1077*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar", 1078*333d2b36SAndroid Build Coastguard Worker }, 1079*333d2b36SAndroid Build Coastguard Worker appCombined: []string{ 1080*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/app/android_common/javac/app.jar", 1081*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/app/android_common/busybox/R.jar", 1082*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct/android_common/combined/direct.jar", 1083*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar", 1084*333d2b36SAndroid Build Coastguard Worker }, 1085*333d2b36SAndroid Build Coastguard Worker 1086*333d2b36SAndroid Build Coastguard Worker dontVerifyDirect: true, 1087*333d2b36SAndroid Build Coastguard Worker dontVerifyTransitive: true, 1088*333d2b36SAndroid Build Coastguard Worker dontVerifyShared: true, 1089*333d2b36SAndroid Build Coastguard Worker dontVerifyDirectImport: true, 1090*333d2b36SAndroid Build Coastguard Worker dontVerifyTransitiveImport: true, 1091*333d2b36SAndroid Build Coastguard Worker }, 1092*333d2b36SAndroid Build Coastguard Worker { 1093*333d2b36SAndroid Build Coastguard Worker // Test an app building without resource processor enabled but with a dependency built with 1094*333d2b36SAndroid Build Coastguard Worker // resource processor. 1095*333d2b36SAndroid Build Coastguard Worker name: "app_dependency_lib_resource_processor", 1096*333d2b36SAndroid Build Coastguard Worker appUsesRP: false, 1097*333d2b36SAndroid Build Coastguard Worker directLibUsesRP: true, 1098*333d2b36SAndroid Build Coastguard Worker transitiveLibUsesRP: false, 1099*333d2b36SAndroid Build Coastguard Worker 1100*333d2b36SAndroid Build Coastguard Worker appOverlays: []string{ 1101*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive/android_common/package-res.apk", 1102*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk", 1103*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import/android_common/package-res.apk", 1104*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct/android_common/package-res.apk", 1105*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk", 1106*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct_import/android_common/package-res.apk", 1107*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat", 1108*333d2b36SAndroid Build Coastguard Worker }, 1109*333d2b36SAndroid Build Coastguard Worker appImports: []string{ 1110*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared/android_common/package-res.apk", 1111*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk", 1112*333d2b36SAndroid Build Coastguard Worker }, 1113*333d2b36SAndroid Build Coastguard Worker appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"}, 1114*333d2b36SAndroid Build Coastguard Worker appClasspath: []string{ 1115*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar", 1116*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar", 1117*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar", 1118*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar", 1119*333d2b36SAndroid Build Coastguard Worker }, 1120*333d2b36SAndroid Build Coastguard Worker appCombined: []string{ 1121*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/app/android_common/javac/app.jar", 1122*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct/android_common/combined/direct.jar", 1123*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar", 1124*333d2b36SAndroid Build Coastguard Worker }, 1125*333d2b36SAndroid Build Coastguard Worker 1126*333d2b36SAndroid Build Coastguard Worker directResources: nil, 1127*333d2b36SAndroid Build Coastguard Worker directOverlays: []string{"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat"}, 1128*333d2b36SAndroid Build Coastguard Worker directImports: []string{ 1129*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk", 1130*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import/android_common/package-res.apk", 1131*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk", 1132*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive/android_common/package-res.apk", 1133*333d2b36SAndroid Build Coastguard Worker }, 1134*333d2b36SAndroid Build Coastguard Worker directSrcJars: nil, 1135*333d2b36SAndroid Build Coastguard Worker directClasspath: []string{ 1136*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar", 1137*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct/android_common/busybox/R.jar", 1138*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import_dep/android_common/busybox/R.jar", 1139*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import/android_common/busybox/R.jar", 1140*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar", 1141*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import/android_common/turbine-combined/transitive_import.jar", 1142*333d2b36SAndroid Build Coastguard Worker }, 1143*333d2b36SAndroid Build Coastguard Worker directCombined: []string{ 1144*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct/android_common/javac/direct.jar", 1145*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive/android_common/javac/transitive.jar", 1146*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import/android_common/combined/transitive_import.jar", 1147*333d2b36SAndroid Build Coastguard Worker }, 1148*333d2b36SAndroid Build Coastguard Worker 1149*333d2b36SAndroid Build Coastguard Worker dontVerifyTransitive: true, 1150*333d2b36SAndroid Build Coastguard Worker dontVerifyShared: true, 1151*333d2b36SAndroid Build Coastguard Worker dontVerifyDirectImport: true, 1152*333d2b36SAndroid Build Coastguard Worker dontVerifyTransitiveImport: true, 1153*333d2b36SAndroid Build Coastguard Worker }, 1154*333d2b36SAndroid Build Coastguard Worker { 1155*333d2b36SAndroid Build Coastguard Worker // Test a library building without resource processor enabled but with a dependency built with 1156*333d2b36SAndroid Build Coastguard Worker // resource processor. 1157*333d2b36SAndroid Build Coastguard Worker name: "lib_dependency_lib_resource_processor", 1158*333d2b36SAndroid Build Coastguard Worker appUsesRP: false, 1159*333d2b36SAndroid Build Coastguard Worker directLibUsesRP: false, 1160*333d2b36SAndroid Build Coastguard Worker transitiveLibUsesRP: true, 1161*333d2b36SAndroid Build Coastguard Worker 1162*333d2b36SAndroid Build Coastguard Worker appOverlays: []string{ 1163*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive/android_common/package-res.apk", 1164*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk", 1165*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import/android_common/package-res.apk", 1166*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct/android_common/package-res.apk", 1167*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk", 1168*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct_import/android_common/package-res.apk", 1169*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat", 1170*333d2b36SAndroid Build Coastguard Worker }, 1171*333d2b36SAndroid Build Coastguard Worker appImports: []string{ 1172*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared/android_common/package-res.apk", 1173*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk", 1174*333d2b36SAndroid Build Coastguard Worker }, 1175*333d2b36SAndroid Build Coastguard Worker appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"}, 1176*333d2b36SAndroid Build Coastguard Worker appClasspath: []string{ 1177*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar", 1178*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar", 1179*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar", 1180*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar", 1181*333d2b36SAndroid Build Coastguard Worker }, 1182*333d2b36SAndroid Build Coastguard Worker appCombined: []string{ 1183*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/app/android_common/javac/app.jar", 1184*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct/android_common/combined/direct.jar", 1185*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar", 1186*333d2b36SAndroid Build Coastguard Worker }, 1187*333d2b36SAndroid Build Coastguard Worker 1188*333d2b36SAndroid Build Coastguard Worker directResources: nil, 1189*333d2b36SAndroid Build Coastguard Worker directOverlays: []string{ 1190*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive/android_common/package-res.apk", 1191*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk", 1192*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import/android_common/package-res.apk", 1193*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat", 1194*333d2b36SAndroid Build Coastguard Worker }, 1195*333d2b36SAndroid Build Coastguard Worker directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"}, 1196*333d2b36SAndroid Build Coastguard Worker directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"}, 1197*333d2b36SAndroid Build Coastguard Worker directClasspath: []string{ 1198*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar", 1199*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar", 1200*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import/android_common/turbine-combined/transitive_import.jar", 1201*333d2b36SAndroid Build Coastguard Worker }, 1202*333d2b36SAndroid Build Coastguard Worker directCombined: []string{ 1203*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/direct/android_common/javac/direct.jar", 1204*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive/android_common/javac/transitive.jar", 1205*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive_import/android_common/combined/transitive_import.jar", 1206*333d2b36SAndroid Build Coastguard Worker }, 1207*333d2b36SAndroid Build Coastguard Worker 1208*333d2b36SAndroid Build Coastguard Worker transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"}, 1209*333d2b36SAndroid Build Coastguard Worker transitiveOverlays: nil, 1210*333d2b36SAndroid Build Coastguard Worker transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"}, 1211*333d2b36SAndroid Build Coastguard Worker transitiveSrcJars: nil, 1212*333d2b36SAndroid Build Coastguard Worker transitiveClasspath: []string{ 1213*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar", 1214*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/transitive/android_common/busybox/R.jar", 1215*333d2b36SAndroid Build Coastguard Worker }, 1216*333d2b36SAndroid Build Coastguard Worker transitiveCombined: nil, 1217*333d2b36SAndroid Build Coastguard Worker 1218*333d2b36SAndroid Build Coastguard Worker dontVerifyShared: true, 1219*333d2b36SAndroid Build Coastguard Worker dontVerifyDirectImport: true, 1220*333d2b36SAndroid Build Coastguard Worker dontVerifyTransitiveImport: true, 1221*333d2b36SAndroid Build Coastguard Worker }, 1222*333d2b36SAndroid Build Coastguard Worker } 1223*333d2b36SAndroid Build Coastguard Worker 1224*333d2b36SAndroid Build Coastguard Worker for _, testCase := range testCases { 1225*333d2b36SAndroid Build Coastguard Worker t.Run(testCase.name, func(t *testing.T) { 1226*333d2b36SAndroid Build Coastguard Worker bp := fmt.Sprintf(` 1227*333d2b36SAndroid Build Coastguard Worker android_app { 1228*333d2b36SAndroid Build Coastguard Worker name: "app", 1229*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 1230*333d2b36SAndroid Build Coastguard Worker srcs: ["app/app.java"], 1231*333d2b36SAndroid Build Coastguard Worker resource_dirs: ["app/res"], 1232*333d2b36SAndroid Build Coastguard Worker manifest: "app/AndroidManifest.xml", 1233*333d2b36SAndroid Build Coastguard Worker libs: ["shared"], 1234*333d2b36SAndroid Build Coastguard Worker static_libs: ["direct", "direct_import"], 1235*333d2b36SAndroid Build Coastguard Worker use_resource_processor: %v, 1236*333d2b36SAndroid Build Coastguard Worker } 1237*333d2b36SAndroid Build Coastguard Worker 1238*333d2b36SAndroid Build Coastguard Worker android_library { 1239*333d2b36SAndroid Build Coastguard Worker name: "direct", 1240*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 1241*333d2b36SAndroid Build Coastguard Worker srcs: ["direct/direct.java"], 1242*333d2b36SAndroid Build Coastguard Worker resource_dirs: ["direct/res"], 1243*333d2b36SAndroid Build Coastguard Worker manifest: "direct/AndroidManifest.xml", 1244*333d2b36SAndroid Build Coastguard Worker static_libs: ["transitive", "transitive_import"], 1245*333d2b36SAndroid Build Coastguard Worker use_resource_processor: %v, 1246*333d2b36SAndroid Build Coastguard Worker } 1247*333d2b36SAndroid Build Coastguard Worker 1248*333d2b36SAndroid Build Coastguard Worker android_library { 1249*333d2b36SAndroid Build Coastguard Worker name: "transitive", 1250*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 1251*333d2b36SAndroid Build Coastguard Worker srcs: ["transitive/transitive.java"], 1252*333d2b36SAndroid Build Coastguard Worker resource_dirs: ["transitive/res"], 1253*333d2b36SAndroid Build Coastguard Worker manifest: "transitive/AndroidManifest.xml", 1254*333d2b36SAndroid Build Coastguard Worker use_resource_processor: %v, 1255*333d2b36SAndroid Build Coastguard Worker } 1256*333d2b36SAndroid Build Coastguard Worker 1257*333d2b36SAndroid Build Coastguard Worker android_library { 1258*333d2b36SAndroid Build Coastguard Worker name: "shared", 1259*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 1260*333d2b36SAndroid Build Coastguard Worker srcs: ["shared/shared.java"], 1261*333d2b36SAndroid Build Coastguard Worker resource_dirs: ["shared/res"], 1262*333d2b36SAndroid Build Coastguard Worker manifest: "shared/AndroidManifest.xml", 1263*333d2b36SAndroid Build Coastguard Worker use_resource_processor: %v, 1264*333d2b36SAndroid Build Coastguard Worker libs: ["shared_transitive_shared"], 1265*333d2b36SAndroid Build Coastguard Worker static_libs: ["shared_transitive_static"], 1266*333d2b36SAndroid Build Coastguard Worker } 1267*333d2b36SAndroid Build Coastguard Worker 1268*333d2b36SAndroid Build Coastguard Worker android_library { 1269*333d2b36SAndroid Build Coastguard Worker name: "shared_transitive_shared", 1270*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 1271*333d2b36SAndroid Build Coastguard Worker srcs: ["shared_transitive_shared/shared_transitive_shared.java"], 1272*333d2b36SAndroid Build Coastguard Worker resource_dirs: ["shared_transitive_shared/res"], 1273*333d2b36SAndroid Build Coastguard Worker manifest: "shared_transitive_shared/AndroidManifest.xml", 1274*333d2b36SAndroid Build Coastguard Worker use_resource_processor: %v, 1275*333d2b36SAndroid Build Coastguard Worker } 1276*333d2b36SAndroid Build Coastguard Worker 1277*333d2b36SAndroid Build Coastguard Worker android_library { 1278*333d2b36SAndroid Build Coastguard Worker name: "shared_transitive_static", 1279*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 1280*333d2b36SAndroid Build Coastguard Worker srcs: ["shared_transitive_static/shared.java"], 1281*333d2b36SAndroid Build Coastguard Worker resource_dirs: ["shared_transitive_static/res"], 1282*333d2b36SAndroid Build Coastguard Worker manifest: "shared_transitive_static/AndroidManifest.xml", 1283*333d2b36SAndroid Build Coastguard Worker use_resource_processor: %v, 1284*333d2b36SAndroid Build Coastguard Worker } 1285*333d2b36SAndroid Build Coastguard Worker 1286*333d2b36SAndroid Build Coastguard Worker android_library_import { 1287*333d2b36SAndroid Build Coastguard Worker name: "direct_import", 1288*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 1289*333d2b36SAndroid Build Coastguard Worker aars: ["direct_import.aar"], 1290*333d2b36SAndroid Build Coastguard Worker static_libs: ["direct_import_dep"], 1291*333d2b36SAndroid Build Coastguard Worker } 1292*333d2b36SAndroid Build Coastguard Worker 1293*333d2b36SAndroid Build Coastguard Worker android_library_import { 1294*333d2b36SAndroid Build Coastguard Worker name: "direct_import_dep", 1295*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 1296*333d2b36SAndroid Build Coastguard Worker aars: ["direct_import_dep.aar"], 1297*333d2b36SAndroid Build Coastguard Worker } 1298*333d2b36SAndroid Build Coastguard Worker 1299*333d2b36SAndroid Build Coastguard Worker android_library_import { 1300*333d2b36SAndroid Build Coastguard Worker name: "transitive_import", 1301*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 1302*333d2b36SAndroid Build Coastguard Worker aars: ["transitive_import.aar"], 1303*333d2b36SAndroid Build Coastguard Worker static_libs: ["transitive_import_dep"], 1304*333d2b36SAndroid Build Coastguard Worker } 1305*333d2b36SAndroid Build Coastguard Worker 1306*333d2b36SAndroid Build Coastguard Worker android_library_import { 1307*333d2b36SAndroid Build Coastguard Worker name: "transitive_import_dep", 1308*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 1309*333d2b36SAndroid Build Coastguard Worker aars: ["transitive_import_dep.aar"], 1310*333d2b36SAndroid Build Coastguard Worker } 1311*333d2b36SAndroid Build Coastguard Worker `, testCase.appUsesRP, testCase.directLibUsesRP, testCase.transitiveLibUsesRP, 1312*333d2b36SAndroid Build Coastguard Worker testCase.sharedLibUsesRP, testCase.sharedTransitiveSharedLibUsesRP, testCase.sharedTransitiveStaticLibUsesRP) 1313*333d2b36SAndroid Build Coastguard Worker 1314*333d2b36SAndroid Build Coastguard Worker fs := android.MockFS{ 1315*333d2b36SAndroid Build Coastguard Worker "app/res/values/strings.xml": nil, 1316*333d2b36SAndroid Build Coastguard Worker "direct/res/values/strings.xml": nil, 1317*333d2b36SAndroid Build Coastguard Worker "transitive/res/values/strings.xml": nil, 1318*333d2b36SAndroid Build Coastguard Worker "shared/res/values/strings.xml": nil, 1319*333d2b36SAndroid Build Coastguard Worker "shared_transitive_static/res/values/strings.xml": nil, 1320*333d2b36SAndroid Build Coastguard Worker "shared_transitive_shared/res/values/strings.xml": nil, 1321*333d2b36SAndroid Build Coastguard Worker } 1322*333d2b36SAndroid Build Coastguard Worker 1323*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 1324*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 1325*333d2b36SAndroid Build Coastguard Worker fs.AddToFixture(), 1326*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 1327*333d2b36SAndroid Build Coastguard Worker 1328*333d2b36SAndroid Build Coastguard Worker type aaptInfo struct { 1329*333d2b36SAndroid Build Coastguard Worker resources, overlays, imports, srcJars, classpath, combined android.Paths 1330*333d2b36SAndroid Build Coastguard Worker } 1331*333d2b36SAndroid Build Coastguard Worker 1332*333d2b36SAndroid Build Coastguard Worker getAaptInfo := func(moduleName string) (aaptInfo aaptInfo) { 1333*333d2b36SAndroid Build Coastguard Worker mod := result.ModuleForTests(moduleName, "android_common") 1334*333d2b36SAndroid Build Coastguard Worker resourceListRule := mod.MaybeOutput("aapt2/res.list") 1335*333d2b36SAndroid Build Coastguard Worker overlayListRule := mod.MaybeOutput("aapt2/overlay.list") 1336*333d2b36SAndroid Build Coastguard Worker aaptRule := mod.Rule("aapt2Link") 1337*333d2b36SAndroid Build Coastguard Worker javacRule := mod.MaybeRule("javac") 1338*333d2b36SAndroid Build Coastguard Worker combinedRule := mod.MaybeOutput("combined/" + moduleName + ".jar") 1339*333d2b36SAndroid Build Coastguard Worker 1340*333d2b36SAndroid Build Coastguard Worker aaptInfo.resources = resourceListRule.Inputs 1341*333d2b36SAndroid Build Coastguard Worker aaptInfo.overlays = overlayListRule.Inputs 1342*333d2b36SAndroid Build Coastguard Worker 1343*333d2b36SAndroid Build Coastguard Worker aaptFlags := strings.Split(aaptRule.Args["flags"], " ") 1344*333d2b36SAndroid Build Coastguard Worker for i, flag := range aaptFlags { 1345*333d2b36SAndroid Build Coastguard Worker if flag == "-I" && i+1 < len(aaptFlags) { 1346*333d2b36SAndroid Build Coastguard Worker aaptInfo.imports = append(aaptInfo.imports, android.PathForTesting(aaptFlags[i+1])) 1347*333d2b36SAndroid Build Coastguard Worker } 1348*333d2b36SAndroid Build Coastguard Worker } 1349*333d2b36SAndroid Build Coastguard Worker 1350*333d2b36SAndroid Build Coastguard Worker if len(javacRule.Args["srcJars"]) > 0 { 1351*333d2b36SAndroid Build Coastguard Worker aaptInfo.srcJars = android.PathsForTesting(strings.Split(javacRule.Args["srcJars"], " ")...) 1352*333d2b36SAndroid Build Coastguard Worker } 1353*333d2b36SAndroid Build Coastguard Worker 1354*333d2b36SAndroid Build Coastguard Worker if len(javacRule.Args["classpath"]) > 0 { 1355*333d2b36SAndroid Build Coastguard Worker classpathArg := strings.TrimPrefix(javacRule.Args["classpath"], "-classpath ") 1356*333d2b36SAndroid Build Coastguard Worker aaptInfo.classpath = android.PathsForTesting(strings.Split(classpathArg, ":")...) 1357*333d2b36SAndroid Build Coastguard Worker } 1358*333d2b36SAndroid Build Coastguard Worker 1359*333d2b36SAndroid Build Coastguard Worker aaptInfo.combined = combinedRule.Inputs 1360*333d2b36SAndroid Build Coastguard Worker return 1361*333d2b36SAndroid Build Coastguard Worker } 1362*333d2b36SAndroid Build Coastguard Worker 1363*333d2b36SAndroid Build Coastguard Worker app := getAaptInfo("app") 1364*333d2b36SAndroid Build Coastguard Worker direct := getAaptInfo("direct") 1365*333d2b36SAndroid Build Coastguard Worker transitive := getAaptInfo("transitive") 1366*333d2b36SAndroid Build Coastguard Worker shared := getAaptInfo("shared") 1367*333d2b36SAndroid Build Coastguard Worker directImport := getAaptInfo("direct_import") 1368*333d2b36SAndroid Build Coastguard Worker transitiveImport := getAaptInfo("transitive_import") 1369*333d2b36SAndroid Build Coastguard Worker 1370*333d2b36SAndroid Build Coastguard Worker if !testCase.dontVerifyApp { 1371*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "app resources", testCase.appResources, app.resources) 1372*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "app overlays", testCase.appOverlays, app.overlays) 1373*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "app imports", testCase.appImports, app.imports) 1374*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "app srcjars", testCase.appSrcJars, app.srcJars) 1375*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "app classpath", testCase.appClasspath, app.classpath) 1376*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "app combined", testCase.appCombined, app.combined) 1377*333d2b36SAndroid Build Coastguard Worker } 1378*333d2b36SAndroid Build Coastguard Worker 1379*333d2b36SAndroid Build Coastguard Worker if !testCase.dontVerifyDirect { 1380*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "direct resources", testCase.directResources, direct.resources) 1381*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "direct overlays", testCase.directOverlays, direct.overlays) 1382*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "direct imports", testCase.directImports, direct.imports) 1383*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "direct srcjars", testCase.directSrcJars, direct.srcJars) 1384*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "direct classpath", testCase.directClasspath, direct.classpath) 1385*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "direct combined", testCase.directCombined, direct.combined) 1386*333d2b36SAndroid Build Coastguard Worker } 1387*333d2b36SAndroid Build Coastguard Worker 1388*333d2b36SAndroid Build Coastguard Worker if !testCase.dontVerifyTransitive { 1389*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "transitive resources", testCase.transitiveResources, transitive.resources) 1390*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "transitive overlays", testCase.transitiveOverlays, transitive.overlays) 1391*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "transitive imports", testCase.transitiveImports, transitive.imports) 1392*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "transitive srcjars", testCase.transitiveSrcJars, transitive.srcJars) 1393*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "transitive classpath", testCase.transitiveClasspath, transitive.classpath) 1394*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "transitive combined", testCase.transitiveCombined, transitive.combined) 1395*333d2b36SAndroid Build Coastguard Worker } 1396*333d2b36SAndroid Build Coastguard Worker 1397*333d2b36SAndroid Build Coastguard Worker if !testCase.dontVerifyShared { 1398*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "shared resources", testCase.sharedResources, shared.resources) 1399*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "shared overlays", testCase.sharedOverlays, shared.overlays) 1400*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "shared imports", testCase.sharedImports, shared.imports) 1401*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "shared srcjars", testCase.sharedSrcJars, shared.srcJars) 1402*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "shared classpath", testCase.sharedClasspath, shared.classpath) 1403*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "shared combined", testCase.sharedCombined, shared.combined) 1404*333d2b36SAndroid Build Coastguard Worker } 1405*333d2b36SAndroid Build Coastguard Worker 1406*333d2b36SAndroid Build Coastguard Worker if !testCase.dontVerifyDirectImport { 1407*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "direct_import resources", testCase.directImportResources, directImport.resources) 1408*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "direct_import overlays", testCase.directImportOverlays, directImport.overlays) 1409*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "direct_import imports", testCase.directImportImports, directImport.imports) 1410*333d2b36SAndroid Build Coastguard Worker } 1411*333d2b36SAndroid Build Coastguard Worker 1412*333d2b36SAndroid Build Coastguard Worker if !testCase.dontVerifyTransitiveImport { 1413*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "transitive_import resources", testCase.transitiveImportResources, transitiveImport.resources) 1414*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "transitive_import overlays", testCase.transitiveImportOverlays, transitiveImport.overlays) 1415*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "transitive_import imports", testCase.transitiveImportImports, transitiveImport.imports) 1416*333d2b36SAndroid Build Coastguard Worker } 1417*333d2b36SAndroid Build Coastguard Worker }) 1418*333d2b36SAndroid Build Coastguard Worker } 1419*333d2b36SAndroid Build Coastguard Worker} 1420*333d2b36SAndroid Build Coastguard Worker 1421*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidResourceOverlays(t *testing.T) { 1422*333d2b36SAndroid Build Coastguard Worker type moduleAndVariant struct { 1423*333d2b36SAndroid Build Coastguard Worker module string 1424*333d2b36SAndroid Build Coastguard Worker variant string 1425*333d2b36SAndroid Build Coastguard Worker } 1426*333d2b36SAndroid Build Coastguard Worker 1427*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 1428*333d2b36SAndroid Build Coastguard Worker name string 1429*333d2b36SAndroid Build Coastguard Worker enforceRROTargets []string 1430*333d2b36SAndroid Build Coastguard Worker enforceRROExcludedOverlays []string 1431*333d2b36SAndroid Build Coastguard Worker resourceFiles map[moduleAndVariant][]string 1432*333d2b36SAndroid Build Coastguard Worker overlayFiles map[moduleAndVariant][]string 1433*333d2b36SAndroid Build Coastguard Worker rroDirs map[moduleAndVariant][]string 1434*333d2b36SAndroid Build Coastguard Worker }{ 1435*333d2b36SAndroid Build Coastguard Worker { 1436*333d2b36SAndroid Build Coastguard Worker name: "no RRO", 1437*333d2b36SAndroid Build Coastguard Worker enforceRROTargets: nil, 1438*333d2b36SAndroid Build Coastguard Worker enforceRROExcludedOverlays: nil, 1439*333d2b36SAndroid Build Coastguard Worker resourceFiles: map[moduleAndVariant][]string{ 1440*333d2b36SAndroid Build Coastguard Worker {"foo", "android_common"}: nil, 1441*333d2b36SAndroid Build Coastguard Worker {"bar", "android_common"}: {"bar/res/res/values/strings.xml"}, 1442*333d2b36SAndroid Build Coastguard Worker {"lib", "android_common"}: nil, 1443*333d2b36SAndroid Build Coastguard Worker {"lib2", "android_common"}: {"lib2/res/res/values/strings.xml"}, 1444*333d2b36SAndroid Build Coastguard Worker }, 1445*333d2b36SAndroid Build Coastguard Worker overlayFiles: map[moduleAndVariant][]string{ 1446*333d2b36SAndroid Build Coastguard Worker {"foo", "android_common"}: { 1447*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/lib2/android_common/package-res.apk", 1448*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/lib/android_common/package-res.apk", 1449*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/lib3/android_common/package-res.apk", 1450*333d2b36SAndroid Build Coastguard Worker "foo/res/res/values/strings.xml", 1451*333d2b36SAndroid Build Coastguard Worker "device/vendor/blah/static_overlay/foo/res/values/strings.xml", 1452*333d2b36SAndroid Build Coastguard Worker "device/vendor/blah/overlay/foo/res/values/strings.xml", 1453*333d2b36SAndroid Build Coastguard Worker "product/vendor/blah/overlay/foo/res/values/strings.xml", 1454*333d2b36SAndroid Build Coastguard Worker }, 1455*333d2b36SAndroid Build Coastguard Worker {"bar", "android_common"}: { 1456*333d2b36SAndroid Build Coastguard Worker "device/vendor/blah/static_overlay/bar/res/values/strings.xml", 1457*333d2b36SAndroid Build Coastguard Worker "device/vendor/blah/overlay/bar/res/values/strings.xml", 1458*333d2b36SAndroid Build Coastguard Worker }, 1459*333d2b36SAndroid Build Coastguard Worker {"lib", "android_common"}: { 1460*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/lib2/android_common/package-res.apk", 1461*333d2b36SAndroid Build Coastguard Worker "lib/res/res/values/strings.xml", 1462*333d2b36SAndroid Build Coastguard Worker "device/vendor/blah/overlay/lib/res/values/strings.xml", 1463*333d2b36SAndroid Build Coastguard Worker }, 1464*333d2b36SAndroid Build Coastguard Worker }, 1465*333d2b36SAndroid Build Coastguard Worker rroDirs: map[moduleAndVariant][]string{ 1466*333d2b36SAndroid Build Coastguard Worker {"foo", "android_common"}: nil, 1467*333d2b36SAndroid Build Coastguard Worker {"bar", "android_common"}: nil, 1468*333d2b36SAndroid Build Coastguard Worker }, 1469*333d2b36SAndroid Build Coastguard Worker }, 1470*333d2b36SAndroid Build Coastguard Worker { 1471*333d2b36SAndroid Build Coastguard Worker name: "enforce RRO on foo", 1472*333d2b36SAndroid Build Coastguard Worker enforceRROTargets: []string{"foo"}, 1473*333d2b36SAndroid Build Coastguard Worker enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"}, 1474*333d2b36SAndroid Build Coastguard Worker resourceFiles: map[moduleAndVariant][]string{ 1475*333d2b36SAndroid Build Coastguard Worker {"foo", "android_common"}: nil, 1476*333d2b36SAndroid Build Coastguard Worker {"bar", "android_common"}: {"bar/res/res/values/strings.xml"}, 1477*333d2b36SAndroid Build Coastguard Worker {"lib", "android_common"}: nil, 1478*333d2b36SAndroid Build Coastguard Worker {"lib", "android_common_rro"}: nil, 1479*333d2b36SAndroid Build Coastguard Worker {"lib2", "android_common"}: {"lib2/res/res/values/strings.xml"}, 1480*333d2b36SAndroid Build Coastguard Worker {"lib2", "android_common_rro"}: {"lib2/res/res/values/strings.xml"}, 1481*333d2b36SAndroid Build Coastguard Worker }, 1482*333d2b36SAndroid Build Coastguard Worker overlayFiles: map[moduleAndVariant][]string{ 1483*333d2b36SAndroid Build Coastguard Worker {"foo", "android_common"}: { 1484*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/lib2/android_common_rro/package-res.apk", 1485*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/lib/android_common_rro/package-res.apk", 1486*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/lib3/android_common_rro/package-res.apk", 1487*333d2b36SAndroid Build Coastguard Worker "foo/res/res/values/strings.xml", 1488*333d2b36SAndroid Build Coastguard Worker "device/vendor/blah/static_overlay/foo/res/values/strings.xml", 1489*333d2b36SAndroid Build Coastguard Worker }, 1490*333d2b36SAndroid Build Coastguard Worker {"bar", "android_common"}: { 1491*333d2b36SAndroid Build Coastguard Worker "device/vendor/blah/static_overlay/bar/res/values/strings.xml", 1492*333d2b36SAndroid Build Coastguard Worker "device/vendor/blah/overlay/bar/res/values/strings.xml", 1493*333d2b36SAndroid Build Coastguard Worker }, 1494*333d2b36SAndroid Build Coastguard Worker {"lib", "android_common"}: { 1495*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/lib2/android_common/package-res.apk", 1496*333d2b36SAndroid Build Coastguard Worker "lib/res/res/values/strings.xml", 1497*333d2b36SAndroid Build Coastguard Worker "device/vendor/blah/overlay/lib/res/values/strings.xml", 1498*333d2b36SAndroid Build Coastguard Worker }, 1499*333d2b36SAndroid Build Coastguard Worker {"lib", "android_common_rro"}: { 1500*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/lib2/android_common_rro/package-res.apk", 1501*333d2b36SAndroid Build Coastguard Worker "lib/res/res/values/strings.xml", 1502*333d2b36SAndroid Build Coastguard Worker }, 1503*333d2b36SAndroid Build Coastguard Worker }, 1504*333d2b36SAndroid Build Coastguard Worker 1505*333d2b36SAndroid Build Coastguard Worker rroDirs: map[moduleAndVariant][]string{ 1506*333d2b36SAndroid Build Coastguard Worker {"foo", "android_common"}: { 1507*333d2b36SAndroid Build Coastguard Worker "device:device/vendor/blah/overlay/foo/res", 1508*333d2b36SAndroid Build Coastguard Worker "product:product/vendor/blah/overlay/foo/res", 1509*333d2b36SAndroid Build Coastguard Worker "device:device/vendor/blah/overlay/lib/res", 1510*333d2b36SAndroid Build Coastguard Worker }, 1511*333d2b36SAndroid Build Coastguard Worker {"bar", "android_common"}: nil, 1512*333d2b36SAndroid Build Coastguard Worker {"lib", "android_common"}: nil, 1513*333d2b36SAndroid Build Coastguard Worker {"lib", "android_common_rro"}: {"device:device/vendor/blah/overlay/lib/res"}, 1514*333d2b36SAndroid Build Coastguard Worker }, 1515*333d2b36SAndroid Build Coastguard Worker }, 1516*333d2b36SAndroid Build Coastguard Worker { 1517*333d2b36SAndroid Build Coastguard Worker name: "enforce RRO on all", 1518*333d2b36SAndroid Build Coastguard Worker enforceRROTargets: []string{"*"}, 1519*333d2b36SAndroid Build Coastguard Worker enforceRROExcludedOverlays: []string{ 1520*333d2b36SAndroid Build Coastguard Worker // Excluding specific apps/res directories also allowed. 1521*333d2b36SAndroid Build Coastguard Worker "device/vendor/blah/static_overlay/foo", 1522*333d2b36SAndroid Build Coastguard Worker "device/vendor/blah/static_overlay/bar/res", 1523*333d2b36SAndroid Build Coastguard Worker }, 1524*333d2b36SAndroid Build Coastguard Worker resourceFiles: map[moduleAndVariant][]string{ 1525*333d2b36SAndroid Build Coastguard Worker {"foo", "android_common"}: nil, 1526*333d2b36SAndroid Build Coastguard Worker {"bar", "android_common"}: {"bar/res/res/values/strings.xml"}, 1527*333d2b36SAndroid Build Coastguard Worker {"lib", "android_common"}: nil, 1528*333d2b36SAndroid Build Coastguard Worker {"lib2", "android_common"}: {"lib2/res/res/values/strings.xml"}, 1529*333d2b36SAndroid Build Coastguard Worker }, 1530*333d2b36SAndroid Build Coastguard Worker overlayFiles: map[moduleAndVariant][]string{ 1531*333d2b36SAndroid Build Coastguard Worker {"foo", "android_common"}: { 1532*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/lib2/android_common/package-res.apk", 1533*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/lib/android_common/package-res.apk", 1534*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/lib3/android_common/package-res.apk", 1535*333d2b36SAndroid Build Coastguard Worker "foo/res/res/values/strings.xml", 1536*333d2b36SAndroid Build Coastguard Worker "device/vendor/blah/static_overlay/foo/res/values/strings.xml", 1537*333d2b36SAndroid Build Coastguard Worker }, 1538*333d2b36SAndroid Build Coastguard Worker {"bar", "android_common"}: {"device/vendor/blah/static_overlay/bar/res/values/strings.xml"}, 1539*333d2b36SAndroid Build Coastguard Worker {"lib", "android_common"}: { 1540*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/lib2/android_common/package-res.apk", 1541*333d2b36SAndroid Build Coastguard Worker "lib/res/res/values/strings.xml", 1542*333d2b36SAndroid Build Coastguard Worker }, 1543*333d2b36SAndroid Build Coastguard Worker }, 1544*333d2b36SAndroid Build Coastguard Worker rroDirs: map[moduleAndVariant][]string{ 1545*333d2b36SAndroid Build Coastguard Worker {"foo", "android_common"}: { 1546*333d2b36SAndroid Build Coastguard Worker "device:device/vendor/blah/overlay/foo/res", 1547*333d2b36SAndroid Build Coastguard Worker "product:product/vendor/blah/overlay/foo/res", 1548*333d2b36SAndroid Build Coastguard Worker // Lib dep comes after the direct deps 1549*333d2b36SAndroid Build Coastguard Worker "device:device/vendor/blah/overlay/lib/res", 1550*333d2b36SAndroid Build Coastguard Worker }, 1551*333d2b36SAndroid Build Coastguard Worker {"bar", "android_common"}: {"device:device/vendor/blah/overlay/bar/res"}, 1552*333d2b36SAndroid Build Coastguard Worker {"lib", "android_common"}: {"device:device/vendor/blah/overlay/lib/res"}, 1553*333d2b36SAndroid Build Coastguard Worker }, 1554*333d2b36SAndroid Build Coastguard Worker }, 1555*333d2b36SAndroid Build Coastguard Worker } 1556*333d2b36SAndroid Build Coastguard Worker 1557*333d2b36SAndroid Build Coastguard Worker deviceResourceOverlays := []string{ 1558*333d2b36SAndroid Build Coastguard Worker "device/vendor/blah/overlay", 1559*333d2b36SAndroid Build Coastguard Worker "device/vendor/blah/overlay2", 1560*333d2b36SAndroid Build Coastguard Worker "device/vendor/blah/static_overlay", 1561*333d2b36SAndroid Build Coastguard Worker } 1562*333d2b36SAndroid Build Coastguard Worker 1563*333d2b36SAndroid Build Coastguard Worker productResourceOverlays := []string{ 1564*333d2b36SAndroid Build Coastguard Worker "product/vendor/blah/overlay", 1565*333d2b36SAndroid Build Coastguard Worker } 1566*333d2b36SAndroid Build Coastguard Worker 1567*333d2b36SAndroid Build Coastguard Worker fs := android.MockFS{ 1568*333d2b36SAndroid Build Coastguard Worker "foo/res/res/values/strings.xml": nil, 1569*333d2b36SAndroid Build Coastguard Worker "bar/res/res/values/strings.xml": nil, 1570*333d2b36SAndroid Build Coastguard Worker "lib/res/res/values/strings.xml": nil, 1571*333d2b36SAndroid Build Coastguard Worker "lib2/res/res/values/strings.xml": nil, 1572*333d2b36SAndroid Build Coastguard Worker "device/vendor/blah/overlay/foo/res/values/strings.xml": nil, 1573*333d2b36SAndroid Build Coastguard Worker "device/vendor/blah/overlay/bar/res/values/strings.xml": nil, 1574*333d2b36SAndroid Build Coastguard Worker "device/vendor/blah/overlay/lib/res/values/strings.xml": nil, 1575*333d2b36SAndroid Build Coastguard Worker "device/vendor/blah/static_overlay/foo/res/values/strings.xml": nil, 1576*333d2b36SAndroid Build Coastguard Worker "device/vendor/blah/static_overlay/bar/res/values/strings.xml": nil, 1577*333d2b36SAndroid Build Coastguard Worker "device/vendor/blah/overlay2/res/values/strings.xml": nil, 1578*333d2b36SAndroid Build Coastguard Worker "product/vendor/blah/overlay/foo/res/values/strings.xml": nil, 1579*333d2b36SAndroid Build Coastguard Worker } 1580*333d2b36SAndroid Build Coastguard Worker 1581*333d2b36SAndroid Build Coastguard Worker bp := ` 1582*333d2b36SAndroid Build Coastguard Worker android_app { 1583*333d2b36SAndroid Build Coastguard Worker name: "foo", 1584*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 1585*333d2b36SAndroid Build Coastguard Worker resource_dirs: ["foo/res"], 1586*333d2b36SAndroid Build Coastguard Worker static_libs: ["lib", "lib3"], 1587*333d2b36SAndroid Build Coastguard Worker } 1588*333d2b36SAndroid Build Coastguard Worker 1589*333d2b36SAndroid Build Coastguard Worker android_app { 1590*333d2b36SAndroid Build Coastguard Worker name: "bar", 1591*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 1592*333d2b36SAndroid Build Coastguard Worker resource_dirs: ["bar/res"], 1593*333d2b36SAndroid Build Coastguard Worker } 1594*333d2b36SAndroid Build Coastguard Worker 1595*333d2b36SAndroid Build Coastguard Worker android_library { 1596*333d2b36SAndroid Build Coastguard Worker name: "lib", 1597*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 1598*333d2b36SAndroid Build Coastguard Worker resource_dirs: ["lib/res"], 1599*333d2b36SAndroid Build Coastguard Worker static_libs: ["lib2"], 1600*333d2b36SAndroid Build Coastguard Worker } 1601*333d2b36SAndroid Build Coastguard Worker 1602*333d2b36SAndroid Build Coastguard Worker android_library { 1603*333d2b36SAndroid Build Coastguard Worker name: "lib2", 1604*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 1605*333d2b36SAndroid Build Coastguard Worker resource_dirs: ["lib2/res"], 1606*333d2b36SAndroid Build Coastguard Worker } 1607*333d2b36SAndroid Build Coastguard Worker 1608*333d2b36SAndroid Build Coastguard Worker // This library has the same resources as lib (should not lead to dupe RROs) 1609*333d2b36SAndroid Build Coastguard Worker android_library { 1610*333d2b36SAndroid Build Coastguard Worker name: "lib3", 1611*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 1612*333d2b36SAndroid Build Coastguard Worker resource_dirs: ["lib/res"] 1613*333d2b36SAndroid Build Coastguard Worker } 1614*333d2b36SAndroid Build Coastguard Worker ` 1615*333d2b36SAndroid Build Coastguard Worker 1616*333d2b36SAndroid Build Coastguard Worker for _, testCase := range testCases { 1617*333d2b36SAndroid Build Coastguard Worker t.Run(testCase.name, func(t *testing.T) { 1618*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 1619*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 1620*333d2b36SAndroid Build Coastguard Worker fs.AddToFixture(), 1621*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 1622*333d2b36SAndroid Build Coastguard Worker variables.DeviceResourceOverlays = deviceResourceOverlays 1623*333d2b36SAndroid Build Coastguard Worker variables.ProductResourceOverlays = productResourceOverlays 1624*333d2b36SAndroid Build Coastguard Worker if testCase.enforceRROTargets != nil { 1625*333d2b36SAndroid Build Coastguard Worker variables.EnforceRROTargets = testCase.enforceRROTargets 1626*333d2b36SAndroid Build Coastguard Worker } 1627*333d2b36SAndroid Build Coastguard Worker if testCase.enforceRROExcludedOverlays != nil { 1628*333d2b36SAndroid Build Coastguard Worker variables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays 1629*333d2b36SAndroid Build Coastguard Worker } 1630*333d2b36SAndroid Build Coastguard Worker }), 1631*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 1632*333d2b36SAndroid Build Coastguard Worker 1633*333d2b36SAndroid Build Coastguard Worker resourceListToFiles := func(module android.TestingModule, list []string) (files []string) { 1634*333d2b36SAndroid Build Coastguard Worker for _, o := range list { 1635*333d2b36SAndroid Build Coastguard Worker res := module.MaybeOutput(o) 1636*333d2b36SAndroid Build Coastguard Worker if res.Rule != nil { 1637*333d2b36SAndroid Build Coastguard Worker // If the overlay is compiled as part of this moduleAndVariant (i.e. a .arsc.flat file), 1638*333d2b36SAndroid Build Coastguard Worker // verify the inputs to the .arsc.flat rule. 1639*333d2b36SAndroid Build Coastguard Worker files = append(files, res.Inputs.Strings()...) 1640*333d2b36SAndroid Build Coastguard Worker } else { 1641*333d2b36SAndroid Build Coastguard Worker // Otherwise, verify the full path to the output of the other moduleAndVariant 1642*333d2b36SAndroid Build Coastguard Worker files = append(files, o) 1643*333d2b36SAndroid Build Coastguard Worker } 1644*333d2b36SAndroid Build Coastguard Worker } 1645*333d2b36SAndroid Build Coastguard Worker return files 1646*333d2b36SAndroid Build Coastguard Worker } 1647*333d2b36SAndroid Build Coastguard Worker 1648*333d2b36SAndroid Build Coastguard Worker getResources := func(moduleName, variantName string) (resourceFiles, overlayFiles, rroDirs []string) { 1649*333d2b36SAndroid Build Coastguard Worker module := result.ModuleForTests(moduleName, variantName) 1650*333d2b36SAndroid Build Coastguard Worker resourceList := module.MaybeOutput("aapt2/res.list") 1651*333d2b36SAndroid Build Coastguard Worker if resourceList.Rule != nil { 1652*333d2b36SAndroid Build Coastguard Worker resourceFiles = resourceListToFiles(module, android.PathsRelativeToTop(resourceList.Inputs)) 1653*333d2b36SAndroid Build Coastguard Worker } 1654*333d2b36SAndroid Build Coastguard Worker overlayList := module.MaybeOutput("aapt2/overlay.list") 1655*333d2b36SAndroid Build Coastguard Worker if overlayList.Rule != nil { 1656*333d2b36SAndroid Build Coastguard Worker overlayFiles = resourceListToFiles(module, android.PathsRelativeToTop(overlayList.Inputs)) 1657*333d2b36SAndroid Build Coastguard Worker } 1658*333d2b36SAndroid Build Coastguard Worker 1659*333d2b36SAndroid Build Coastguard Worker for _, d := range module.Module().(AndroidLibraryDependency).RRODirsDepSet().ToList() { 1660*333d2b36SAndroid Build Coastguard Worker var prefix string 1661*333d2b36SAndroid Build Coastguard Worker if d.overlayType == device { 1662*333d2b36SAndroid Build Coastguard Worker prefix = "device:" 1663*333d2b36SAndroid Build Coastguard Worker } else if d.overlayType == product { 1664*333d2b36SAndroid Build Coastguard Worker prefix = "product:" 1665*333d2b36SAndroid Build Coastguard Worker } else { 1666*333d2b36SAndroid Build Coastguard Worker t.Fatalf("Unexpected overlayType %d", d.overlayType) 1667*333d2b36SAndroid Build Coastguard Worker } 1668*333d2b36SAndroid Build Coastguard Worker rroDirs = append(rroDirs, prefix+android.PathRelativeToTop(d.path)) 1669*333d2b36SAndroid Build Coastguard Worker } 1670*333d2b36SAndroid Build Coastguard Worker 1671*333d2b36SAndroid Build Coastguard Worker return resourceFiles, overlayFiles, rroDirs 1672*333d2b36SAndroid Build Coastguard Worker } 1673*333d2b36SAndroid Build Coastguard Worker 1674*333d2b36SAndroid Build Coastguard Worker modules := []moduleAndVariant{ 1675*333d2b36SAndroid Build Coastguard Worker {"foo", "android_common"}, 1676*333d2b36SAndroid Build Coastguard Worker {"foo", "android_common_rro"}, 1677*333d2b36SAndroid Build Coastguard Worker {"bar", "android_common"}, 1678*333d2b36SAndroid Build Coastguard Worker {"bar", "android_common_rro"}, 1679*333d2b36SAndroid Build Coastguard Worker {"lib", "android_common"}, 1680*333d2b36SAndroid Build Coastguard Worker {"lib", "android_common_rro"}, 1681*333d2b36SAndroid Build Coastguard Worker {"lib2", "android_common"}, 1682*333d2b36SAndroid Build Coastguard Worker {"lib2", "android_common_rro"}, 1683*333d2b36SAndroid Build Coastguard Worker } 1684*333d2b36SAndroid Build Coastguard Worker for _, moduleAndVariant := range modules { 1685*333d2b36SAndroid Build Coastguard Worker if _, exists := testCase.resourceFiles[moduleAndVariant]; !exists { 1686*333d2b36SAndroid Build Coastguard Worker continue 1687*333d2b36SAndroid Build Coastguard Worker } 1688*333d2b36SAndroid Build Coastguard Worker resourceFiles, overlayFiles, rroDirs := getResources(moduleAndVariant.module, moduleAndVariant.variant) 1689*333d2b36SAndroid Build Coastguard Worker 1690*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(resourceFiles, testCase.resourceFiles[moduleAndVariant]) { 1691*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected %s resource files:\n %#v\n got:\n %#v", 1692*333d2b36SAndroid Build Coastguard Worker moduleAndVariant, testCase.resourceFiles[moduleAndVariant], resourceFiles) 1693*333d2b36SAndroid Build Coastguard Worker } 1694*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(overlayFiles, testCase.overlayFiles[moduleAndVariant]) { 1695*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected %s overlay files:\n %#v\n got:\n %#v", 1696*333d2b36SAndroid Build Coastguard Worker moduleAndVariant, testCase.overlayFiles[moduleAndVariant], overlayFiles) 1697*333d2b36SAndroid Build Coastguard Worker } 1698*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(rroDirs, testCase.rroDirs[moduleAndVariant]) { 1699*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected %s rroDirs: %#v\n got:\n %#v", 1700*333d2b36SAndroid Build Coastguard Worker moduleAndVariant, testCase.rroDirs[moduleAndVariant], rroDirs) 1701*333d2b36SAndroid Build Coastguard Worker } 1702*333d2b36SAndroid Build Coastguard Worker } 1703*333d2b36SAndroid Build Coastguard Worker }) 1704*333d2b36SAndroid Build Coastguard Worker } 1705*333d2b36SAndroid Build Coastguard Worker} 1706*333d2b36SAndroid Build Coastguard Worker 1707*333d2b36SAndroid Build Coastguard Workerfunc checkSdkVersion(t *testing.T, result *android.TestResult, expectedSdkVersion string) { 1708*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", "android_common") 1709*333d2b36SAndroid Build Coastguard Worker link := foo.Output("package-res.apk") 1710*333d2b36SAndroid Build Coastguard Worker linkFlags := strings.Split(link.Args["flags"], " ") 1711*333d2b36SAndroid Build Coastguard Worker min := android.IndexList("--min-sdk-version", linkFlags) 1712*333d2b36SAndroid Build Coastguard Worker target := android.IndexList("--target-sdk-version", linkFlags) 1713*333d2b36SAndroid Build Coastguard Worker 1714*333d2b36SAndroid Build Coastguard Worker if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 { 1715*333d2b36SAndroid Build Coastguard Worker t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags) 1716*333d2b36SAndroid Build Coastguard Worker } 1717*333d2b36SAndroid Build Coastguard Worker 1718*333d2b36SAndroid Build Coastguard Worker gotMinSdkVersion := linkFlags[min+1] 1719*333d2b36SAndroid Build Coastguard Worker gotTargetSdkVersion := linkFlags[target+1] 1720*333d2b36SAndroid Build Coastguard Worker 1721*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "incorrect --min-sdk-version", expectedSdkVersion, gotMinSdkVersion) 1722*333d2b36SAndroid Build Coastguard Worker 1723*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "incorrect --target-sdk-version", expectedSdkVersion, gotTargetSdkVersion) 1724*333d2b36SAndroid Build Coastguard Worker} 1725*333d2b36SAndroid Build Coastguard Worker 1726*333d2b36SAndroid Build Coastguard Workerfunc TestAppSdkVersion(t *testing.T) { 1727*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 1728*333d2b36SAndroid Build Coastguard Worker name string 1729*333d2b36SAndroid Build Coastguard Worker sdkVersion string 1730*333d2b36SAndroid Build Coastguard Worker platformSdkInt int 1731*333d2b36SAndroid Build Coastguard Worker platformSdkCodename string 1732*333d2b36SAndroid Build Coastguard Worker platformSdkFinal bool 1733*333d2b36SAndroid Build Coastguard Worker minSdkVersionBp string 1734*333d2b36SAndroid Build Coastguard Worker expectedMinSdkVersion string 1735*333d2b36SAndroid Build Coastguard Worker platformApis bool 1736*333d2b36SAndroid Build Coastguard Worker activeCodenames []string 1737*333d2b36SAndroid Build Coastguard Worker }{ 1738*333d2b36SAndroid Build Coastguard Worker { 1739*333d2b36SAndroid Build Coastguard Worker name: "current final SDK", 1740*333d2b36SAndroid Build Coastguard Worker sdkVersion: "current", 1741*333d2b36SAndroid Build Coastguard Worker platformSdkInt: 27, 1742*333d2b36SAndroid Build Coastguard Worker platformSdkCodename: "REL", 1743*333d2b36SAndroid Build Coastguard Worker platformSdkFinal: true, 1744*333d2b36SAndroid Build Coastguard Worker expectedMinSdkVersion: "27", 1745*333d2b36SAndroid Build Coastguard Worker }, 1746*333d2b36SAndroid Build Coastguard Worker { 1747*333d2b36SAndroid Build Coastguard Worker name: "current non-final SDK", 1748*333d2b36SAndroid Build Coastguard Worker sdkVersion: "current", 1749*333d2b36SAndroid Build Coastguard Worker platformSdkInt: 27, 1750*333d2b36SAndroid Build Coastguard Worker platformSdkCodename: "OMR1", 1751*333d2b36SAndroid Build Coastguard Worker platformSdkFinal: false, 1752*333d2b36SAndroid Build Coastguard Worker expectedMinSdkVersion: "OMR1", 1753*333d2b36SAndroid Build Coastguard Worker activeCodenames: []string{"OMR1"}, 1754*333d2b36SAndroid Build Coastguard Worker }, 1755*333d2b36SAndroid Build Coastguard Worker { 1756*333d2b36SAndroid Build Coastguard Worker name: "default final SDK", 1757*333d2b36SAndroid Build Coastguard Worker sdkVersion: "", 1758*333d2b36SAndroid Build Coastguard Worker platformApis: true, 1759*333d2b36SAndroid Build Coastguard Worker platformSdkInt: 27, 1760*333d2b36SAndroid Build Coastguard Worker platformSdkCodename: "REL", 1761*333d2b36SAndroid Build Coastguard Worker platformSdkFinal: true, 1762*333d2b36SAndroid Build Coastguard Worker expectedMinSdkVersion: "27", 1763*333d2b36SAndroid Build Coastguard Worker }, 1764*333d2b36SAndroid Build Coastguard Worker { 1765*333d2b36SAndroid Build Coastguard Worker name: "default non-final SDK", 1766*333d2b36SAndroid Build Coastguard Worker sdkVersion: "", 1767*333d2b36SAndroid Build Coastguard Worker platformApis: true, 1768*333d2b36SAndroid Build Coastguard Worker platformSdkInt: 27, 1769*333d2b36SAndroid Build Coastguard Worker platformSdkCodename: "OMR1", 1770*333d2b36SAndroid Build Coastguard Worker platformSdkFinal: false, 1771*333d2b36SAndroid Build Coastguard Worker expectedMinSdkVersion: "OMR1", 1772*333d2b36SAndroid Build Coastguard Worker activeCodenames: []string{"OMR1"}, 1773*333d2b36SAndroid Build Coastguard Worker }, 1774*333d2b36SAndroid Build Coastguard Worker { 1775*333d2b36SAndroid Build Coastguard Worker name: "14", 1776*333d2b36SAndroid Build Coastguard Worker sdkVersion: "14", 1777*333d2b36SAndroid Build Coastguard Worker expectedMinSdkVersion: "14", 1778*333d2b36SAndroid Build Coastguard Worker platformSdkCodename: "S", 1779*333d2b36SAndroid Build Coastguard Worker activeCodenames: []string{"S"}, 1780*333d2b36SAndroid Build Coastguard Worker }, 1781*333d2b36SAndroid Build Coastguard Worker { 1782*333d2b36SAndroid Build Coastguard Worker name: "two active SDKs", 1783*333d2b36SAndroid Build Coastguard Worker sdkVersion: "module_current", 1784*333d2b36SAndroid Build Coastguard Worker minSdkVersionBp: "UpsideDownCake", 1785*333d2b36SAndroid Build Coastguard Worker expectedMinSdkVersion: "UpsideDownCake", // And not VanillaIceCream 1786*333d2b36SAndroid Build Coastguard Worker platformSdkCodename: "VanillaIceCream", 1787*333d2b36SAndroid Build Coastguard Worker activeCodenames: []string{"UpsideDownCake", "VanillaIceCream"}, 1788*333d2b36SAndroid Build Coastguard Worker }, 1789*333d2b36SAndroid Build Coastguard Worker } 1790*333d2b36SAndroid Build Coastguard Worker 1791*333d2b36SAndroid Build Coastguard Worker for _, moduleType := range []string{"android_app", "android_library"} { 1792*333d2b36SAndroid Build Coastguard Worker for _, test := range testCases { 1793*333d2b36SAndroid Build Coastguard Worker t.Run(moduleType+" "+test.name, func(t *testing.T) { 1794*333d2b36SAndroid Build Coastguard Worker platformApiProp := "" 1795*333d2b36SAndroid Build Coastguard Worker if test.platformApis { 1796*333d2b36SAndroid Build Coastguard Worker platformApiProp = "platform_apis: true," 1797*333d2b36SAndroid Build Coastguard Worker } 1798*333d2b36SAndroid Build Coastguard Worker minSdkVersionProp := "" 1799*333d2b36SAndroid Build Coastguard Worker if test.minSdkVersionBp != "" { 1800*333d2b36SAndroid Build Coastguard Worker minSdkVersionProp = fmt.Sprintf(` min_sdk_version: "%s",`, test.minSdkVersionBp) 1801*333d2b36SAndroid Build Coastguard Worker } 1802*333d2b36SAndroid Build Coastguard Worker bp := fmt.Sprintf(`%s { 1803*333d2b36SAndroid Build Coastguard Worker name: "foo", 1804*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 1805*333d2b36SAndroid Build Coastguard Worker sdk_version: "%s", 1806*333d2b36SAndroid Build Coastguard Worker %s 1807*333d2b36SAndroid Build Coastguard Worker %s 1808*333d2b36SAndroid Build Coastguard Worker }`, moduleType, test.sdkVersion, platformApiProp, minSdkVersionProp) 1809*333d2b36SAndroid Build Coastguard Worker 1810*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 1811*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 1812*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 1813*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_version = &test.platformSdkInt 1814*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_codename = &test.platformSdkCodename 1815*333d2b36SAndroid Build Coastguard Worker variables.Platform_version_active_codenames = test.activeCodenames 1816*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_final = &test.platformSdkFinal 1817*333d2b36SAndroid Build Coastguard Worker }), 1818*333d2b36SAndroid Build Coastguard Worker FixtureWithPrebuiltApis(map[string][]string{ 1819*333d2b36SAndroid Build Coastguard Worker "14": {"foo"}, 1820*333d2b36SAndroid Build Coastguard Worker }), 1821*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 1822*333d2b36SAndroid Build Coastguard Worker 1823*333d2b36SAndroid Build Coastguard Worker checkSdkVersion(t, result, test.expectedMinSdkVersion) 1824*333d2b36SAndroid Build Coastguard Worker }) 1825*333d2b36SAndroid Build Coastguard Worker } 1826*333d2b36SAndroid Build Coastguard Worker } 1827*333d2b36SAndroid Build Coastguard Worker} 1828*333d2b36SAndroid Build Coastguard Worker 1829*333d2b36SAndroid Build Coastguard Workerfunc TestVendorAppSdkVersion(t *testing.T) { 1830*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 1831*333d2b36SAndroid Build Coastguard Worker name string 1832*333d2b36SAndroid Build Coastguard Worker sdkVersion string 1833*333d2b36SAndroid Build Coastguard Worker platformSdkInt int 1834*333d2b36SAndroid Build Coastguard Worker platformSdkCodename string 1835*333d2b36SAndroid Build Coastguard Worker platformSdkFinal bool 1836*333d2b36SAndroid Build Coastguard Worker deviceCurrentApiLevelForVendorModules string 1837*333d2b36SAndroid Build Coastguard Worker expectedMinSdkVersion string 1838*333d2b36SAndroid Build Coastguard Worker }{ 1839*333d2b36SAndroid Build Coastguard Worker { 1840*333d2b36SAndroid Build Coastguard Worker name: "current final SDK", 1841*333d2b36SAndroid Build Coastguard Worker sdkVersion: "current", 1842*333d2b36SAndroid Build Coastguard Worker platformSdkInt: 29, 1843*333d2b36SAndroid Build Coastguard Worker platformSdkCodename: "REL", 1844*333d2b36SAndroid Build Coastguard Worker platformSdkFinal: true, 1845*333d2b36SAndroid Build Coastguard Worker deviceCurrentApiLevelForVendorModules: "29", 1846*333d2b36SAndroid Build Coastguard Worker expectedMinSdkVersion: "29", 1847*333d2b36SAndroid Build Coastguard Worker }, 1848*333d2b36SAndroid Build Coastguard Worker { 1849*333d2b36SAndroid Build Coastguard Worker name: "current final SDK", 1850*333d2b36SAndroid Build Coastguard Worker sdkVersion: "current", 1851*333d2b36SAndroid Build Coastguard Worker platformSdkInt: 29, 1852*333d2b36SAndroid Build Coastguard Worker platformSdkCodename: "REL", 1853*333d2b36SAndroid Build Coastguard Worker platformSdkFinal: true, 1854*333d2b36SAndroid Build Coastguard Worker deviceCurrentApiLevelForVendorModules: "28", 1855*333d2b36SAndroid Build Coastguard Worker expectedMinSdkVersion: "28", 1856*333d2b36SAndroid Build Coastguard Worker }, 1857*333d2b36SAndroid Build Coastguard Worker { 1858*333d2b36SAndroid Build Coastguard Worker name: "current final SDK", 1859*333d2b36SAndroid Build Coastguard Worker sdkVersion: "current", 1860*333d2b36SAndroid Build Coastguard Worker platformSdkInt: 29, 1861*333d2b36SAndroid Build Coastguard Worker platformSdkCodename: "Q", 1862*333d2b36SAndroid Build Coastguard Worker platformSdkFinal: false, 1863*333d2b36SAndroid Build Coastguard Worker deviceCurrentApiLevelForVendorModules: "28", 1864*333d2b36SAndroid Build Coastguard Worker expectedMinSdkVersion: "28", 1865*333d2b36SAndroid Build Coastguard Worker }, 1866*333d2b36SAndroid Build Coastguard Worker } 1867*333d2b36SAndroid Build Coastguard Worker 1868*333d2b36SAndroid Build Coastguard Worker for _, moduleType := range []string{"android_app", "android_library"} { 1869*333d2b36SAndroid Build Coastguard Worker for _, sdkKind := range []string{"", "system_"} { 1870*333d2b36SAndroid Build Coastguard Worker for _, test := range testCases { 1871*333d2b36SAndroid Build Coastguard Worker t.Run(moduleType+" "+test.name, func(t *testing.T) { 1872*333d2b36SAndroid Build Coastguard Worker bp := fmt.Sprintf(`%s { 1873*333d2b36SAndroid Build Coastguard Worker name: "foo", 1874*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 1875*333d2b36SAndroid Build Coastguard Worker sdk_version: "%s%s", 1876*333d2b36SAndroid Build Coastguard Worker vendor: true, 1877*333d2b36SAndroid Build Coastguard Worker }`, moduleType, sdkKind, test.sdkVersion) 1878*333d2b36SAndroid Build Coastguard Worker 1879*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 1880*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 1881*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 1882*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_version = &test.platformSdkInt 1883*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_codename = &test.platformSdkCodename 1884*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_final = &test.platformSdkFinal 1885*333d2b36SAndroid Build Coastguard Worker variables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules 1886*333d2b36SAndroid Build Coastguard Worker variables.DeviceSystemSdkVersions = []string{"28", "29"} 1887*333d2b36SAndroid Build Coastguard Worker }), 1888*333d2b36SAndroid Build Coastguard Worker FixtureWithPrebuiltApis(map[string][]string{ 1889*333d2b36SAndroid Build Coastguard Worker "28": {"foo"}, 1890*333d2b36SAndroid Build Coastguard Worker "29": {"foo"}, 1891*333d2b36SAndroid Build Coastguard Worker "current": {"foo"}, 1892*333d2b36SAndroid Build Coastguard Worker }), 1893*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 1894*333d2b36SAndroid Build Coastguard Worker 1895*333d2b36SAndroid Build Coastguard Worker checkSdkVersion(t, result, test.expectedMinSdkVersion) 1896*333d2b36SAndroid Build Coastguard Worker }) 1897*333d2b36SAndroid Build Coastguard Worker } 1898*333d2b36SAndroid Build Coastguard Worker } 1899*333d2b36SAndroid Build Coastguard Worker } 1900*333d2b36SAndroid Build Coastguard Worker} 1901*333d2b36SAndroid Build Coastguard Worker 1902*333d2b36SAndroid Build Coastguard Workerfunc TestJNIABI(t *testing.T) { 1903*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+` 1904*333d2b36SAndroid Build Coastguard Worker cc_library { 1905*333d2b36SAndroid Build Coastguard Worker name: "libjni", 1906*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1907*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 1908*333d2b36SAndroid Build Coastguard Worker stl: "none", 1909*333d2b36SAndroid Build Coastguard Worker } 1910*333d2b36SAndroid Build Coastguard Worker 1911*333d2b36SAndroid Build Coastguard Worker android_test { 1912*333d2b36SAndroid Build Coastguard Worker name: "test", 1913*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_platform", 1914*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 1915*333d2b36SAndroid Build Coastguard Worker } 1916*333d2b36SAndroid Build Coastguard Worker 1917*333d2b36SAndroid Build Coastguard Worker android_test { 1918*333d2b36SAndroid Build Coastguard Worker name: "test_first", 1919*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_platform", 1920*333d2b36SAndroid Build Coastguard Worker compile_multilib: "first", 1921*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 1922*333d2b36SAndroid Build Coastguard Worker } 1923*333d2b36SAndroid Build Coastguard Worker 1924*333d2b36SAndroid Build Coastguard Worker android_test { 1925*333d2b36SAndroid Build Coastguard Worker name: "test_both", 1926*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_platform", 1927*333d2b36SAndroid Build Coastguard Worker compile_multilib: "both", 1928*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 1929*333d2b36SAndroid Build Coastguard Worker } 1930*333d2b36SAndroid Build Coastguard Worker 1931*333d2b36SAndroid Build Coastguard Worker android_test { 1932*333d2b36SAndroid Build Coastguard Worker name: "test_32", 1933*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_platform", 1934*333d2b36SAndroid Build Coastguard Worker compile_multilib: "32", 1935*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 1936*333d2b36SAndroid Build Coastguard Worker } 1937*333d2b36SAndroid Build Coastguard Worker 1938*333d2b36SAndroid Build Coastguard Worker android_test { 1939*333d2b36SAndroid Build Coastguard Worker name: "test_64", 1940*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_platform", 1941*333d2b36SAndroid Build Coastguard Worker compile_multilib: "64", 1942*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 1943*333d2b36SAndroid Build Coastguard Worker } 1944*333d2b36SAndroid Build Coastguard Worker `) 1945*333d2b36SAndroid Build Coastguard Worker 1946*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 1947*333d2b36SAndroid Build Coastguard Worker name string 1948*333d2b36SAndroid Build Coastguard Worker abis []string 1949*333d2b36SAndroid Build Coastguard Worker }{ 1950*333d2b36SAndroid Build Coastguard Worker {"test", []string{"arm64-v8a"}}, 1951*333d2b36SAndroid Build Coastguard Worker {"test_first", []string{"arm64-v8a"}}, 1952*333d2b36SAndroid Build Coastguard Worker {"test_both", []string{"arm64-v8a", "armeabi-v7a"}}, 1953*333d2b36SAndroid Build Coastguard Worker {"test_32", []string{"armeabi-v7a"}}, 1954*333d2b36SAndroid Build Coastguard Worker {"test_64", []string{"arm64-v8a"}}, 1955*333d2b36SAndroid Build Coastguard Worker } 1956*333d2b36SAndroid Build Coastguard Worker 1957*333d2b36SAndroid Build Coastguard Worker for _, test := range testCases { 1958*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 1959*333d2b36SAndroid Build Coastguard Worker app := ctx.ModuleForTests(test.name, "android_common") 1960*333d2b36SAndroid Build Coastguard Worker jniLibZip := app.Output("jnilibs.zip") 1961*333d2b36SAndroid Build Coastguard Worker var abis []string 1962*333d2b36SAndroid Build Coastguard Worker args := strings.Fields(jniLibZip.Args["jarArgs"]) 1963*333d2b36SAndroid Build Coastguard Worker for i := 0; i < len(args); i++ { 1964*333d2b36SAndroid Build Coastguard Worker if args[i] == "-P" { 1965*333d2b36SAndroid Build Coastguard Worker abis = append(abis, filepath.Base(args[i+1])) 1966*333d2b36SAndroid Build Coastguard Worker i++ 1967*333d2b36SAndroid Build Coastguard Worker } 1968*333d2b36SAndroid Build Coastguard Worker } 1969*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(abis, test.abis) { 1970*333d2b36SAndroid Build Coastguard Worker t.Errorf("want abis %v, got %v", test.abis, abis) 1971*333d2b36SAndroid Build Coastguard Worker } 1972*333d2b36SAndroid Build Coastguard Worker }) 1973*333d2b36SAndroid Build Coastguard Worker } 1974*333d2b36SAndroid Build Coastguard Worker} 1975*333d2b36SAndroid Build Coastguard Worker 1976*333d2b36SAndroid Build Coastguard Workerfunc TestAppSdkVersionByPartition(t *testing.T) { 1977*333d2b36SAndroid Build Coastguard Worker testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", ` 1978*333d2b36SAndroid Build Coastguard Worker android_app { 1979*333d2b36SAndroid Build Coastguard Worker name: "foo", 1980*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 1981*333d2b36SAndroid Build Coastguard Worker vendor: true, 1982*333d2b36SAndroid Build Coastguard Worker platform_apis: true, 1983*333d2b36SAndroid Build Coastguard Worker } 1984*333d2b36SAndroid Build Coastguard Worker `) 1985*333d2b36SAndroid Build Coastguard Worker 1986*333d2b36SAndroid Build Coastguard Worker testJava(t, ` 1987*333d2b36SAndroid Build Coastguard Worker android_app { 1988*333d2b36SAndroid Build Coastguard Worker name: "bar", 1989*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 1990*333d2b36SAndroid Build Coastguard Worker platform_apis: true, 1991*333d2b36SAndroid Build Coastguard Worker } 1992*333d2b36SAndroid Build Coastguard Worker `) 1993*333d2b36SAndroid Build Coastguard Worker 1994*333d2b36SAndroid Build Coastguard Worker for _, enforce := range []bool{true, false} { 1995*333d2b36SAndroid Build Coastguard Worker bp := ` 1996*333d2b36SAndroid Build Coastguard Worker android_app { 1997*333d2b36SAndroid Build Coastguard Worker name: "foo", 1998*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 1999*333d2b36SAndroid Build Coastguard Worker product_specific: true, 2000*333d2b36SAndroid Build Coastguard Worker platform_apis: true, 2001*333d2b36SAndroid Build Coastguard Worker } 2002*333d2b36SAndroid Build Coastguard Worker ` 2003*333d2b36SAndroid Build Coastguard Worker 2004*333d2b36SAndroid Build Coastguard Worker errorHandler := android.FixtureExpectsNoErrors 2005*333d2b36SAndroid Build Coastguard Worker if enforce { 2006*333d2b36SAndroid Build Coastguard Worker errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern("sdk_version must have a value when the module is located at vendor or product") 2007*333d2b36SAndroid Build Coastguard Worker } 2008*333d2b36SAndroid Build Coastguard Worker 2009*333d2b36SAndroid Build Coastguard Worker android.GroupFixturePreparers( 2010*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 2011*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 2012*333d2b36SAndroid Build Coastguard Worker variables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce) 2013*333d2b36SAndroid Build Coastguard Worker }), 2014*333d2b36SAndroid Build Coastguard Worker ). 2015*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(errorHandler). 2016*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, bp) 2017*333d2b36SAndroid Build Coastguard Worker } 2018*333d2b36SAndroid Build Coastguard Worker} 2019*333d2b36SAndroid Build Coastguard Worker 2020*333d2b36SAndroid Build Coastguard Workerfunc TestJNIPackaging(t *testing.T) { 2021*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+` 2022*333d2b36SAndroid Build Coastguard Worker cc_library { 2023*333d2b36SAndroid Build Coastguard Worker name: "libjni", 2024*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 2025*333d2b36SAndroid Build Coastguard Worker stl: "none", 2026*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2027*333d2b36SAndroid Build Coastguard Worker } 2028*333d2b36SAndroid Build Coastguard Worker 2029*333d2b36SAndroid Build Coastguard Worker android_app { 2030*333d2b36SAndroid Build Coastguard Worker name: "app", 2031*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 2032*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2033*333d2b36SAndroid Build Coastguard Worker } 2034*333d2b36SAndroid Build Coastguard Worker 2035*333d2b36SAndroid Build Coastguard Worker android_app { 2036*333d2b36SAndroid Build Coastguard Worker name: "app_noembed", 2037*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 2038*333d2b36SAndroid Build Coastguard Worker use_embedded_native_libs: false, 2039*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2040*333d2b36SAndroid Build Coastguard Worker } 2041*333d2b36SAndroid Build Coastguard Worker 2042*333d2b36SAndroid Build Coastguard Worker android_app { 2043*333d2b36SAndroid Build Coastguard Worker name: "app_embed", 2044*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 2045*333d2b36SAndroid Build Coastguard Worker use_embedded_native_libs: true, 2046*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2047*333d2b36SAndroid Build Coastguard Worker } 2048*333d2b36SAndroid Build Coastguard Worker 2049*333d2b36SAndroid Build Coastguard Worker android_test { 2050*333d2b36SAndroid Build Coastguard Worker name: "test", 2051*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2052*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 2053*333d2b36SAndroid Build Coastguard Worker } 2054*333d2b36SAndroid Build Coastguard Worker 2055*333d2b36SAndroid Build Coastguard Worker android_test { 2056*333d2b36SAndroid Build Coastguard Worker name: "test_noembed", 2057*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2058*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 2059*333d2b36SAndroid Build Coastguard Worker use_embedded_native_libs: false, 2060*333d2b36SAndroid Build Coastguard Worker } 2061*333d2b36SAndroid Build Coastguard Worker 2062*333d2b36SAndroid Build Coastguard Worker android_test_helper_app { 2063*333d2b36SAndroid Build Coastguard Worker name: "test_helper", 2064*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2065*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 2066*333d2b36SAndroid Build Coastguard Worker } 2067*333d2b36SAndroid Build Coastguard Worker 2068*333d2b36SAndroid Build Coastguard Worker android_test_helper_app { 2069*333d2b36SAndroid Build Coastguard Worker name: "test_helper_noembed", 2070*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2071*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 2072*333d2b36SAndroid Build Coastguard Worker use_embedded_native_libs: false, 2073*333d2b36SAndroid Build Coastguard Worker } 2074*333d2b36SAndroid Build Coastguard Worker `) 2075*333d2b36SAndroid Build Coastguard Worker 2076*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 2077*333d2b36SAndroid Build Coastguard Worker name string 2078*333d2b36SAndroid Build Coastguard Worker packaged bool 2079*333d2b36SAndroid Build Coastguard Worker compressed bool 2080*333d2b36SAndroid Build Coastguard Worker }{ 2081*333d2b36SAndroid Build Coastguard Worker {"app", false, false}, 2082*333d2b36SAndroid Build Coastguard Worker {"app_noembed", false, false}, 2083*333d2b36SAndroid Build Coastguard Worker {"app_embed", true, false}, 2084*333d2b36SAndroid Build Coastguard Worker {"test", true, false}, 2085*333d2b36SAndroid Build Coastguard Worker {"test_noembed", true, true}, 2086*333d2b36SAndroid Build Coastguard Worker {"test_helper", true, false}, 2087*333d2b36SAndroid Build Coastguard Worker {"test_helper_noembed", true, true}, 2088*333d2b36SAndroid Build Coastguard Worker } 2089*333d2b36SAndroid Build Coastguard Worker 2090*333d2b36SAndroid Build Coastguard Worker for _, test := range testCases { 2091*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 2092*333d2b36SAndroid Build Coastguard Worker app := ctx.ModuleForTests(test.name, "android_common") 2093*333d2b36SAndroid Build Coastguard Worker jniLibZip := app.MaybeOutput("jnilibs.zip") 2094*333d2b36SAndroid Build Coastguard Worker if g, w := (jniLibZip.Rule != nil), test.packaged; g != w { 2095*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected jni packaged %v, got %v", w, g) 2096*333d2b36SAndroid Build Coastguard Worker } 2097*333d2b36SAndroid Build Coastguard Worker 2098*333d2b36SAndroid Build Coastguard Worker if jniLibZip.Rule != nil { 2099*333d2b36SAndroid Build Coastguard Worker if g, w := !strings.Contains(jniLibZip.Args["jarArgs"], "-L 0"), test.compressed; g != w { 2100*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected jni compressed %v, got %v", w, g) 2101*333d2b36SAndroid Build Coastguard Worker } 2102*333d2b36SAndroid Build Coastguard Worker 2103*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(jniLibZip.Implicits[0].String(), "_sdk_") { 2104*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected input %q to use sdk variant", jniLibZip.Implicits[0].String()) 2105*333d2b36SAndroid Build Coastguard Worker } 2106*333d2b36SAndroid Build Coastguard Worker } 2107*333d2b36SAndroid Build Coastguard Worker }) 2108*333d2b36SAndroid Build Coastguard Worker } 2109*333d2b36SAndroid Build Coastguard Worker} 2110*333d2b36SAndroid Build Coastguard Worker 2111*333d2b36SAndroid Build Coastguard Workerfunc TestJNISDK(t *testing.T) { 2112*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+` 2113*333d2b36SAndroid Build Coastguard Worker cc_library { 2114*333d2b36SAndroid Build Coastguard Worker name: "libjni", 2115*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 2116*333d2b36SAndroid Build Coastguard Worker stl: "none", 2117*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2118*333d2b36SAndroid Build Coastguard Worker } 2119*333d2b36SAndroid Build Coastguard Worker 2120*333d2b36SAndroid Build Coastguard Worker android_test { 2121*333d2b36SAndroid Build Coastguard Worker name: "app_platform", 2122*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 2123*333d2b36SAndroid Build Coastguard Worker platform_apis: true, 2124*333d2b36SAndroid Build Coastguard Worker } 2125*333d2b36SAndroid Build Coastguard Worker 2126*333d2b36SAndroid Build Coastguard Worker android_test { 2127*333d2b36SAndroid Build Coastguard Worker name: "app_sdk", 2128*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 2129*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2130*333d2b36SAndroid Build Coastguard Worker } 2131*333d2b36SAndroid Build Coastguard Worker 2132*333d2b36SAndroid Build Coastguard Worker android_test { 2133*333d2b36SAndroid Build Coastguard Worker name: "app_force_platform", 2134*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 2135*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2136*333d2b36SAndroid Build Coastguard Worker jni_uses_platform_apis: true, 2137*333d2b36SAndroid Build Coastguard Worker } 2138*333d2b36SAndroid Build Coastguard Worker 2139*333d2b36SAndroid Build Coastguard Worker android_test { 2140*333d2b36SAndroid Build Coastguard Worker name: "app_force_sdk", 2141*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 2142*333d2b36SAndroid Build Coastguard Worker platform_apis: true, 2143*333d2b36SAndroid Build Coastguard Worker jni_uses_sdk_apis: true, 2144*333d2b36SAndroid Build Coastguard Worker } 2145*333d2b36SAndroid Build Coastguard Worker 2146*333d2b36SAndroid Build Coastguard Worker cc_library { 2147*333d2b36SAndroid Build Coastguard Worker name: "libvendorjni", 2148*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 2149*333d2b36SAndroid Build Coastguard Worker stl: "none", 2150*333d2b36SAndroid Build Coastguard Worker vendor: true, 2151*333d2b36SAndroid Build Coastguard Worker } 2152*333d2b36SAndroid Build Coastguard Worker 2153*333d2b36SAndroid Build Coastguard Worker android_test { 2154*333d2b36SAndroid Build Coastguard Worker name: "app_vendor", 2155*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libvendorjni"], 2156*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2157*333d2b36SAndroid Build Coastguard Worker vendor: true, 2158*333d2b36SAndroid Build Coastguard Worker } 2159*333d2b36SAndroid Build Coastguard Worker `) 2160*333d2b36SAndroid Build Coastguard Worker 2161*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 2162*333d2b36SAndroid Build Coastguard Worker name string 2163*333d2b36SAndroid Build Coastguard Worker sdkJNI bool 2164*333d2b36SAndroid Build Coastguard Worker vendorJNI bool 2165*333d2b36SAndroid Build Coastguard Worker }{ 2166*333d2b36SAndroid Build Coastguard Worker {name: "app_platform"}, 2167*333d2b36SAndroid Build Coastguard Worker {name: "app_sdk", sdkJNI: true}, 2168*333d2b36SAndroid Build Coastguard Worker {name: "app_force_platform"}, 2169*333d2b36SAndroid Build Coastguard Worker {name: "app_force_sdk", sdkJNI: true}, 2170*333d2b36SAndroid Build Coastguard Worker {name: "app_vendor", vendorJNI: true}, 2171*333d2b36SAndroid Build Coastguard Worker } 2172*333d2b36SAndroid Build Coastguard Worker 2173*333d2b36SAndroid Build Coastguard Worker platformJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_shared"). 2174*333d2b36SAndroid Build Coastguard Worker Output("libjni.so").Output.String() 2175*333d2b36SAndroid Build Coastguard Worker sdkJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared"). 2176*333d2b36SAndroid Build Coastguard Worker Output("libjni.so").Output.String() 2177*333d2b36SAndroid Build Coastguard Worker vendorJNI := ctx.ModuleForTests("libvendorjni", "android_vendor_arm64_armv8-a_shared"). 2178*333d2b36SAndroid Build Coastguard Worker Output("libvendorjni.so").Output.String() 2179*333d2b36SAndroid Build Coastguard Worker 2180*333d2b36SAndroid Build Coastguard Worker for _, test := range testCases { 2181*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 2182*333d2b36SAndroid Build Coastguard Worker app := ctx.ModuleForTests(test.name, "android_common") 2183*333d2b36SAndroid Build Coastguard Worker 2184*333d2b36SAndroid Build Coastguard Worker jniLibZip := app.MaybeOutput("jnilibs.zip") 2185*333d2b36SAndroid Build Coastguard Worker if len(jniLibZip.Implicits) != 1 { 2186*333d2b36SAndroid Build Coastguard Worker t.Fatalf("expected exactly one jni library, got %q", jniLibZip.Implicits.Strings()) 2187*333d2b36SAndroid Build Coastguard Worker } 2188*333d2b36SAndroid Build Coastguard Worker gotJNI := jniLibZip.Implicits[0].String() 2189*333d2b36SAndroid Build Coastguard Worker 2190*333d2b36SAndroid Build Coastguard Worker if test.sdkJNI { 2191*333d2b36SAndroid Build Coastguard Worker if gotJNI != sdkJNI { 2192*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected SDK JNI library %q, got %q", sdkJNI, gotJNI) 2193*333d2b36SAndroid Build Coastguard Worker } 2194*333d2b36SAndroid Build Coastguard Worker } else if test.vendorJNI { 2195*333d2b36SAndroid Build Coastguard Worker if gotJNI != vendorJNI { 2196*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected platform JNI library %q, got %q", vendorJNI, gotJNI) 2197*333d2b36SAndroid Build Coastguard Worker } 2198*333d2b36SAndroid Build Coastguard Worker } else { 2199*333d2b36SAndroid Build Coastguard Worker if gotJNI != platformJNI { 2200*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected platform JNI library %q, got %q", platformJNI, gotJNI) 2201*333d2b36SAndroid Build Coastguard Worker } 2202*333d2b36SAndroid Build Coastguard Worker } 2203*333d2b36SAndroid Build Coastguard Worker }) 2204*333d2b36SAndroid Build Coastguard Worker } 2205*333d2b36SAndroid Build Coastguard Worker 2206*333d2b36SAndroid Build Coastguard Worker t.Run("jni_uses_platform_apis_error", func(t *testing.T) { 2207*333d2b36SAndroid Build Coastguard Worker testJavaError(t, `jni_uses_platform_apis: can only be set for modules that set sdk_version`, ` 2208*333d2b36SAndroid Build Coastguard Worker android_test { 2209*333d2b36SAndroid Build Coastguard Worker name: "app_platform", 2210*333d2b36SAndroid Build Coastguard Worker platform_apis: true, 2211*333d2b36SAndroid Build Coastguard Worker jni_uses_platform_apis: true, 2212*333d2b36SAndroid Build Coastguard Worker } 2213*333d2b36SAndroid Build Coastguard Worker `) 2214*333d2b36SAndroid Build Coastguard Worker }) 2215*333d2b36SAndroid Build Coastguard Worker 2216*333d2b36SAndroid Build Coastguard Worker t.Run("jni_uses_sdk_apis_error", func(t *testing.T) { 2217*333d2b36SAndroid Build Coastguard Worker testJavaError(t, `jni_uses_sdk_apis: can only be set for modules that do not set sdk_version`, ` 2218*333d2b36SAndroid Build Coastguard Worker android_test { 2219*333d2b36SAndroid Build Coastguard Worker name: "app_sdk", 2220*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2221*333d2b36SAndroid Build Coastguard Worker jni_uses_sdk_apis: true, 2222*333d2b36SAndroid Build Coastguard Worker } 2223*333d2b36SAndroid Build Coastguard Worker `) 2224*333d2b36SAndroid Build Coastguard Worker }) 2225*333d2b36SAndroid Build Coastguard Worker 2226*333d2b36SAndroid Build Coastguard Worker} 2227*333d2b36SAndroid Build Coastguard Worker 2228*333d2b36SAndroid Build Coastguard Workerfunc TestCertificates(t *testing.T) { 2229*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 2230*333d2b36SAndroid Build Coastguard Worker name string 2231*333d2b36SAndroid Build Coastguard Worker bp string 2232*333d2b36SAndroid Build Coastguard Worker allowMissingDependencies bool 2233*333d2b36SAndroid Build Coastguard Worker certificateOverride string 2234*333d2b36SAndroid Build Coastguard Worker expectedCertSigningFlags string 2235*333d2b36SAndroid Build Coastguard Worker expectedCertificate string 2236*333d2b36SAndroid Build Coastguard Worker }{ 2237*333d2b36SAndroid Build Coastguard Worker { 2238*333d2b36SAndroid Build Coastguard Worker name: "default", 2239*333d2b36SAndroid Build Coastguard Worker bp: ` 2240*333d2b36SAndroid Build Coastguard Worker android_app { 2241*333d2b36SAndroid Build Coastguard Worker name: "foo", 2242*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2243*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2244*333d2b36SAndroid Build Coastguard Worker } 2245*333d2b36SAndroid Build Coastguard Worker `, 2246*333d2b36SAndroid Build Coastguard Worker certificateOverride: "", 2247*333d2b36SAndroid Build Coastguard Worker expectedCertSigningFlags: "", 2248*333d2b36SAndroid Build Coastguard Worker expectedCertificate: "build/make/target/product/security/testkey", 2249*333d2b36SAndroid Build Coastguard Worker }, 2250*333d2b36SAndroid Build Coastguard Worker { 2251*333d2b36SAndroid Build Coastguard Worker name: "module certificate property", 2252*333d2b36SAndroid Build Coastguard Worker bp: ` 2253*333d2b36SAndroid Build Coastguard Worker android_app { 2254*333d2b36SAndroid Build Coastguard Worker name: "foo", 2255*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2256*333d2b36SAndroid Build Coastguard Worker certificate: ":new_certificate", 2257*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2258*333d2b36SAndroid Build Coastguard Worker } 2259*333d2b36SAndroid Build Coastguard Worker 2260*333d2b36SAndroid Build Coastguard Worker android_app_certificate { 2261*333d2b36SAndroid Build Coastguard Worker name: "new_certificate", 2262*333d2b36SAndroid Build Coastguard Worker certificate: "cert/new_cert", 2263*333d2b36SAndroid Build Coastguard Worker } 2264*333d2b36SAndroid Build Coastguard Worker `, 2265*333d2b36SAndroid Build Coastguard Worker certificateOverride: "", 2266*333d2b36SAndroid Build Coastguard Worker expectedCertSigningFlags: "", 2267*333d2b36SAndroid Build Coastguard Worker expectedCertificate: "cert/new_cert", 2268*333d2b36SAndroid Build Coastguard Worker }, 2269*333d2b36SAndroid Build Coastguard Worker { 2270*333d2b36SAndroid Build Coastguard Worker name: "path certificate property", 2271*333d2b36SAndroid Build Coastguard Worker bp: ` 2272*333d2b36SAndroid Build Coastguard Worker android_app { 2273*333d2b36SAndroid Build Coastguard Worker name: "foo", 2274*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2275*333d2b36SAndroid Build Coastguard Worker certificate: "expiredkey", 2276*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2277*333d2b36SAndroid Build Coastguard Worker } 2278*333d2b36SAndroid Build Coastguard Worker `, 2279*333d2b36SAndroid Build Coastguard Worker certificateOverride: "", 2280*333d2b36SAndroid Build Coastguard Worker expectedCertSigningFlags: "", 2281*333d2b36SAndroid Build Coastguard Worker expectedCertificate: "build/make/target/product/security/expiredkey", 2282*333d2b36SAndroid Build Coastguard Worker }, 2283*333d2b36SAndroid Build Coastguard Worker { 2284*333d2b36SAndroid Build Coastguard Worker name: "certificate overrides", 2285*333d2b36SAndroid Build Coastguard Worker bp: ` 2286*333d2b36SAndroid Build Coastguard Worker android_app { 2287*333d2b36SAndroid Build Coastguard Worker name: "foo", 2288*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2289*333d2b36SAndroid Build Coastguard Worker certificate: "expiredkey", 2290*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2291*333d2b36SAndroid Build Coastguard Worker } 2292*333d2b36SAndroid Build Coastguard Worker 2293*333d2b36SAndroid Build Coastguard Worker android_app_certificate { 2294*333d2b36SAndroid Build Coastguard Worker name: "new_certificate", 2295*333d2b36SAndroid Build Coastguard Worker certificate: "cert/new_cert", 2296*333d2b36SAndroid Build Coastguard Worker } 2297*333d2b36SAndroid Build Coastguard Worker `, 2298*333d2b36SAndroid Build Coastguard Worker certificateOverride: "foo:new_certificate", 2299*333d2b36SAndroid Build Coastguard Worker expectedCertSigningFlags: "", 2300*333d2b36SAndroid Build Coastguard Worker expectedCertificate: "cert/new_cert", 2301*333d2b36SAndroid Build Coastguard Worker }, 2302*333d2b36SAndroid Build Coastguard Worker { 2303*333d2b36SAndroid Build Coastguard Worker name: "certificate signing flags", 2304*333d2b36SAndroid Build Coastguard Worker bp: ` 2305*333d2b36SAndroid Build Coastguard Worker android_app { 2306*333d2b36SAndroid Build Coastguard Worker name: "foo", 2307*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2308*333d2b36SAndroid Build Coastguard Worker certificate: ":new_certificate", 2309*333d2b36SAndroid Build Coastguard Worker lineage: "lineage.bin", 2310*333d2b36SAndroid Build Coastguard Worker rotationMinSdkVersion: "32", 2311*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2312*333d2b36SAndroid Build Coastguard Worker } 2313*333d2b36SAndroid Build Coastguard Worker 2314*333d2b36SAndroid Build Coastguard Worker android_app_certificate { 2315*333d2b36SAndroid Build Coastguard Worker name: "new_certificate", 2316*333d2b36SAndroid Build Coastguard Worker certificate: "cert/new_cert", 2317*333d2b36SAndroid Build Coastguard Worker } 2318*333d2b36SAndroid Build Coastguard Worker `, 2319*333d2b36SAndroid Build Coastguard Worker certificateOverride: "", 2320*333d2b36SAndroid Build Coastguard Worker expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32", 2321*333d2b36SAndroid Build Coastguard Worker expectedCertificate: "cert/new_cert", 2322*333d2b36SAndroid Build Coastguard Worker }, 2323*333d2b36SAndroid Build Coastguard Worker { 2324*333d2b36SAndroid Build Coastguard Worker name: "cert signing flags from filegroup", 2325*333d2b36SAndroid Build Coastguard Worker bp: ` 2326*333d2b36SAndroid Build Coastguard Worker android_app { 2327*333d2b36SAndroid Build Coastguard Worker name: "foo", 2328*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2329*333d2b36SAndroid Build Coastguard Worker certificate: ":new_certificate", 2330*333d2b36SAndroid Build Coastguard Worker lineage: ":lineage_bin", 2331*333d2b36SAndroid Build Coastguard Worker rotationMinSdkVersion: "32", 2332*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2333*333d2b36SAndroid Build Coastguard Worker } 2334*333d2b36SAndroid Build Coastguard Worker 2335*333d2b36SAndroid Build Coastguard Worker android_app_certificate { 2336*333d2b36SAndroid Build Coastguard Worker name: "new_certificate", 2337*333d2b36SAndroid Build Coastguard Worker certificate: "cert/new_cert", 2338*333d2b36SAndroid Build Coastguard Worker } 2339*333d2b36SAndroid Build Coastguard Worker 2340*333d2b36SAndroid Build Coastguard Worker filegroup { 2341*333d2b36SAndroid Build Coastguard Worker name: "lineage_bin", 2342*333d2b36SAndroid Build Coastguard Worker srcs: ["lineage.bin"], 2343*333d2b36SAndroid Build Coastguard Worker } 2344*333d2b36SAndroid Build Coastguard Worker `, 2345*333d2b36SAndroid Build Coastguard Worker certificateOverride: "", 2346*333d2b36SAndroid Build Coastguard Worker expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32", 2347*333d2b36SAndroid Build Coastguard Worker expectedCertificate: "cert/new_cert", 2348*333d2b36SAndroid Build Coastguard Worker }, 2349*333d2b36SAndroid Build Coastguard Worker { 2350*333d2b36SAndroid Build Coastguard Worker name: "missing with AllowMissingDependencies", 2351*333d2b36SAndroid Build Coastguard Worker bp: ` 2352*333d2b36SAndroid Build Coastguard Worker android_app { 2353*333d2b36SAndroid Build Coastguard Worker name: "foo", 2354*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2355*333d2b36SAndroid Build Coastguard Worker certificate: ":new_certificate", 2356*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2357*333d2b36SAndroid Build Coastguard Worker } 2358*333d2b36SAndroid Build Coastguard Worker `, 2359*333d2b36SAndroid Build Coastguard Worker expectedCertificate: "out/soong/.intermediates/foo/android_common/missing", 2360*333d2b36SAndroid Build Coastguard Worker allowMissingDependencies: true, 2361*333d2b36SAndroid Build Coastguard Worker }, 2362*333d2b36SAndroid Build Coastguard Worker } 2363*333d2b36SAndroid Build Coastguard Worker 2364*333d2b36SAndroid Build Coastguard Worker for _, test := range testCases { 2365*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 2366*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 2367*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 2368*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 2369*333d2b36SAndroid Build Coastguard Worker if test.certificateOverride != "" { 2370*333d2b36SAndroid Build Coastguard Worker variables.CertificateOverrides = []string{test.certificateOverride} 2371*333d2b36SAndroid Build Coastguard Worker } 2372*333d2b36SAndroid Build Coastguard Worker if test.allowMissingDependencies { 2373*333d2b36SAndroid Build Coastguard Worker variables.Allow_missing_dependencies = proptools.BoolPtr(true) 2374*333d2b36SAndroid Build Coastguard Worker } 2375*333d2b36SAndroid Build Coastguard Worker }), 2376*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyContext(func(ctx *android.TestContext) { 2377*333d2b36SAndroid Build Coastguard Worker ctx.SetAllowMissingDependencies(test.allowMissingDependencies) 2378*333d2b36SAndroid Build Coastguard Worker }), 2379*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, test.bp) 2380*333d2b36SAndroid Build Coastguard Worker 2381*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", "android_common") 2382*333d2b36SAndroid Build Coastguard Worker 2383*333d2b36SAndroid Build Coastguard Worker certificate := foo.Module().(*AndroidApp).certificate 2384*333d2b36SAndroid Build Coastguard Worker android.AssertPathRelativeToTopEquals(t, "certificates key", test.expectedCertificate+".pk8", certificate.Key) 2385*333d2b36SAndroid Build Coastguard Worker // The sign_target_files_apks and check_target_files_signatures 2386*333d2b36SAndroid Build Coastguard Worker // tools require that certificates have a .x509.pem extension. 2387*333d2b36SAndroid Build Coastguard Worker android.AssertPathRelativeToTopEquals(t, "certificates pem", test.expectedCertificate+".x509.pem", certificate.Pem) 2388*333d2b36SAndroid Build Coastguard Worker 2389*333d2b36SAndroid Build Coastguard Worker signapk := foo.Output("foo.apk") 2390*333d2b36SAndroid Build Coastguard Worker if signapk.Rule != android.ErrorRule { 2391*333d2b36SAndroid Build Coastguard Worker signCertificateFlags := signapk.Args["certificates"] 2392*333d2b36SAndroid Build Coastguard Worker expectedFlags := certificate.Pem.String() + " " + certificate.Key.String() 2393*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "certificates flags", expectedFlags, signCertificateFlags) 2394*333d2b36SAndroid Build Coastguard Worker 2395*333d2b36SAndroid Build Coastguard Worker certSigningFlags := signapk.Args["flags"] 2396*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "cert signing flags", test.expectedCertSigningFlags, certSigningFlags) 2397*333d2b36SAndroid Build Coastguard Worker } 2398*333d2b36SAndroid Build Coastguard Worker }) 2399*333d2b36SAndroid Build Coastguard Worker } 2400*333d2b36SAndroid Build Coastguard Worker} 2401*333d2b36SAndroid Build Coastguard Worker 2402*333d2b36SAndroid Build Coastguard Workerfunc TestRequestV4SigningFlag(t *testing.T) { 2403*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 2404*333d2b36SAndroid Build Coastguard Worker name string 2405*333d2b36SAndroid Build Coastguard Worker bp string 2406*333d2b36SAndroid Build Coastguard Worker expected string 2407*333d2b36SAndroid Build Coastguard Worker }{ 2408*333d2b36SAndroid Build Coastguard Worker { 2409*333d2b36SAndroid Build Coastguard Worker name: "default", 2410*333d2b36SAndroid Build Coastguard Worker bp: ` 2411*333d2b36SAndroid Build Coastguard Worker android_app { 2412*333d2b36SAndroid Build Coastguard Worker name: "foo", 2413*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2414*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2415*333d2b36SAndroid Build Coastguard Worker } 2416*333d2b36SAndroid Build Coastguard Worker `, 2417*333d2b36SAndroid Build Coastguard Worker expected: "", 2418*333d2b36SAndroid Build Coastguard Worker }, 2419*333d2b36SAndroid Build Coastguard Worker { 2420*333d2b36SAndroid Build Coastguard Worker name: "default", 2421*333d2b36SAndroid Build Coastguard Worker bp: ` 2422*333d2b36SAndroid Build Coastguard Worker android_app { 2423*333d2b36SAndroid Build Coastguard Worker name: "foo", 2424*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2425*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2426*333d2b36SAndroid Build Coastguard Worker v4_signature: false, 2427*333d2b36SAndroid Build Coastguard Worker } 2428*333d2b36SAndroid Build Coastguard Worker `, 2429*333d2b36SAndroid Build Coastguard Worker expected: "", 2430*333d2b36SAndroid Build Coastguard Worker }, 2431*333d2b36SAndroid Build Coastguard Worker { 2432*333d2b36SAndroid Build Coastguard Worker name: "module certificate property", 2433*333d2b36SAndroid Build Coastguard Worker bp: ` 2434*333d2b36SAndroid Build Coastguard Worker android_app { 2435*333d2b36SAndroid Build Coastguard Worker name: "foo", 2436*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2437*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2438*333d2b36SAndroid Build Coastguard Worker v4_signature: true, 2439*333d2b36SAndroid Build Coastguard Worker } 2440*333d2b36SAndroid Build Coastguard Worker `, 2441*333d2b36SAndroid Build Coastguard Worker expected: "--enable-v4", 2442*333d2b36SAndroid Build Coastguard Worker }, 2443*333d2b36SAndroid Build Coastguard Worker } 2444*333d2b36SAndroid Build Coastguard Worker 2445*333d2b36SAndroid Build Coastguard Worker for _, test := range testCases { 2446*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 2447*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 2448*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 2449*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, test.bp) 2450*333d2b36SAndroid Build Coastguard Worker 2451*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", "android_common") 2452*333d2b36SAndroid Build Coastguard Worker 2453*333d2b36SAndroid Build Coastguard Worker signapk := foo.Output("foo.apk") 2454*333d2b36SAndroid Build Coastguard Worker signFlags := signapk.Args["flags"] 2455*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "signing flags", test.expected, signFlags) 2456*333d2b36SAndroid Build Coastguard Worker }) 2457*333d2b36SAndroid Build Coastguard Worker } 2458*333d2b36SAndroid Build Coastguard Worker} 2459*333d2b36SAndroid Build Coastguard Worker 2460*333d2b36SAndroid Build Coastguard Workerfunc TestPackageNameOverride(t *testing.T) { 2461*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 2462*333d2b36SAndroid Build Coastguard Worker name string 2463*333d2b36SAndroid Build Coastguard Worker bp string 2464*333d2b36SAndroid Build Coastguard Worker packageNameOverride string 2465*333d2b36SAndroid Build Coastguard Worker expected []string 2466*333d2b36SAndroid Build Coastguard Worker }{ 2467*333d2b36SAndroid Build Coastguard Worker { 2468*333d2b36SAndroid Build Coastguard Worker name: "default", 2469*333d2b36SAndroid Build Coastguard Worker bp: ` 2470*333d2b36SAndroid Build Coastguard Worker android_app { 2471*333d2b36SAndroid Build Coastguard Worker name: "foo", 2472*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2473*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2474*333d2b36SAndroid Build Coastguard Worker } 2475*333d2b36SAndroid Build Coastguard Worker `, 2476*333d2b36SAndroid Build Coastguard Worker packageNameOverride: "", 2477*333d2b36SAndroid Build Coastguard Worker expected: []string{ 2478*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/foo/android_common/foo.apk", 2479*333d2b36SAndroid Build Coastguard Worker "out/soong/target/product/test_device/system/app/foo/foo.apk", 2480*333d2b36SAndroid Build Coastguard Worker }, 2481*333d2b36SAndroid Build Coastguard Worker }, 2482*333d2b36SAndroid Build Coastguard Worker { 2483*333d2b36SAndroid Build Coastguard Worker name: "overridden via PRODUCT_PACKAGE_NAME_OVERRIDES", 2484*333d2b36SAndroid Build Coastguard Worker bp: ` 2485*333d2b36SAndroid Build Coastguard Worker android_app { 2486*333d2b36SAndroid Build Coastguard Worker name: "foo", 2487*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2488*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2489*333d2b36SAndroid Build Coastguard Worker } 2490*333d2b36SAndroid Build Coastguard Worker `, 2491*333d2b36SAndroid Build Coastguard Worker packageNameOverride: "foo:bar", 2492*333d2b36SAndroid Build Coastguard Worker expected: []string{ 2493*333d2b36SAndroid Build Coastguard Worker // The package apk should be still be the original name for test dependencies. 2494*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/foo/android_common/bar.apk", 2495*333d2b36SAndroid Build Coastguard Worker "out/soong/target/product/test_device/system/app/bar/bar.apk", 2496*333d2b36SAndroid Build Coastguard Worker }, 2497*333d2b36SAndroid Build Coastguard Worker }, 2498*333d2b36SAndroid Build Coastguard Worker { 2499*333d2b36SAndroid Build Coastguard Worker name: "overridden via stem", 2500*333d2b36SAndroid Build Coastguard Worker bp: ` 2501*333d2b36SAndroid Build Coastguard Worker android_app { 2502*333d2b36SAndroid Build Coastguard Worker name: "foo", 2503*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2504*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2505*333d2b36SAndroid Build Coastguard Worker stem: "bar", 2506*333d2b36SAndroid Build Coastguard Worker } 2507*333d2b36SAndroid Build Coastguard Worker `, 2508*333d2b36SAndroid Build Coastguard Worker packageNameOverride: "", 2509*333d2b36SAndroid Build Coastguard Worker expected: []string{ 2510*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/foo/android_common/bar.apk", 2511*333d2b36SAndroid Build Coastguard Worker "out/soong/target/product/test_device/system/app/bar/bar.apk", 2512*333d2b36SAndroid Build Coastguard Worker }, 2513*333d2b36SAndroid Build Coastguard Worker }, 2514*333d2b36SAndroid Build Coastguard Worker } 2515*333d2b36SAndroid Build Coastguard Worker 2516*333d2b36SAndroid Build Coastguard Worker for _, test := range testCases { 2517*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 2518*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 2519*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 2520*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 2521*333d2b36SAndroid Build Coastguard Worker if test.packageNameOverride != "" { 2522*333d2b36SAndroid Build Coastguard Worker variables.PackageNameOverrides = []string{test.packageNameOverride} 2523*333d2b36SAndroid Build Coastguard Worker } 2524*333d2b36SAndroid Build Coastguard Worker }), 2525*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, test.bp) 2526*333d2b36SAndroid Build Coastguard Worker 2527*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", "android_common") 2528*333d2b36SAndroid Build Coastguard Worker 2529*333d2b36SAndroid Build Coastguard Worker outSoongDir := result.Config.SoongOutDir() 2530*333d2b36SAndroid Build Coastguard Worker 2531*333d2b36SAndroid Build Coastguard Worker outputs := foo.AllOutputs() 2532*333d2b36SAndroid Build Coastguard Worker outputMap := make(map[string]bool) 2533*333d2b36SAndroid Build Coastguard Worker for _, o := range outputs { 2534*333d2b36SAndroid Build Coastguard Worker outputMap[android.StringPathRelativeToTop(outSoongDir, o)] = true 2535*333d2b36SAndroid Build Coastguard Worker } 2536*333d2b36SAndroid Build Coastguard Worker for _, e := range test.expected { 2537*333d2b36SAndroid Build Coastguard Worker if _, exist := outputMap[e]; !exist { 2538*333d2b36SAndroid Build Coastguard Worker t.Errorf("Can't find %q in output files.\nAll outputs:%v", e, outputs) 2539*333d2b36SAndroid Build Coastguard Worker } 2540*333d2b36SAndroid Build Coastguard Worker } 2541*333d2b36SAndroid Build Coastguard Worker }) 2542*333d2b36SAndroid Build Coastguard Worker } 2543*333d2b36SAndroid Build Coastguard Worker} 2544*333d2b36SAndroid Build Coastguard Worker 2545*333d2b36SAndroid Build Coastguard Workerfunc TestInstrumentationTargetOverridden(t *testing.T) { 2546*333d2b36SAndroid Build Coastguard Worker bp := ` 2547*333d2b36SAndroid Build Coastguard Worker android_app { 2548*333d2b36SAndroid Build Coastguard Worker name: "foo", 2549*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2550*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2551*333d2b36SAndroid Build Coastguard Worker } 2552*333d2b36SAndroid Build Coastguard Worker 2553*333d2b36SAndroid Build Coastguard Worker android_test { 2554*333d2b36SAndroid Build Coastguard Worker name: "bar", 2555*333d2b36SAndroid Build Coastguard Worker instrumentation_for: "foo", 2556*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2557*333d2b36SAndroid Build Coastguard Worker } 2558*333d2b36SAndroid Build Coastguard Worker ` 2559*333d2b36SAndroid Build Coastguard Worker 2560*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 2561*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 2562*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 2563*333d2b36SAndroid Build Coastguard Worker variables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"} 2564*333d2b36SAndroid Build Coastguard Worker }), 2565*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 2566*333d2b36SAndroid Build Coastguard Worker 2567*333d2b36SAndroid Build Coastguard Worker bar := result.ModuleForTests("bar", "android_common") 2568*333d2b36SAndroid Build Coastguard Worker res := bar.Output("package-res.apk") 2569*333d2b36SAndroid Build Coastguard Worker aapt2Flags := res.Args["flags"] 2570*333d2b36SAndroid Build Coastguard Worker e := "--rename-instrumentation-target-package org.dandroid.bp" 2571*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(aapt2Flags, e) { 2572*333d2b36SAndroid Build Coastguard Worker t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags) 2573*333d2b36SAndroid Build Coastguard Worker } 2574*333d2b36SAndroid Build Coastguard Worker} 2575*333d2b36SAndroid Build Coastguard Worker 2576*333d2b36SAndroid Build Coastguard Workerfunc TestOverrideAndroidApp(t *testing.T) { 2577*333d2b36SAndroid Build Coastguard Worker result := PrepareForTestWithJavaDefaultModules.RunTestWithBp( 2578*333d2b36SAndroid Build Coastguard Worker t, ` 2579*333d2b36SAndroid Build Coastguard Worker android_app { 2580*333d2b36SAndroid Build Coastguard Worker name: "foo", 2581*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2582*333d2b36SAndroid Build Coastguard Worker certificate: "expiredkey", 2583*333d2b36SAndroid Build Coastguard Worker overrides: ["qux"], 2584*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2585*333d2b36SAndroid Build Coastguard Worker } 2586*333d2b36SAndroid Build Coastguard Worker 2587*333d2b36SAndroid Build Coastguard Worker override_android_app { 2588*333d2b36SAndroid Build Coastguard Worker name: "bar", 2589*333d2b36SAndroid Build Coastguard Worker base: "foo", 2590*333d2b36SAndroid Build Coastguard Worker certificate: ":new_certificate", 2591*333d2b36SAndroid Build Coastguard Worker lineage: "lineage.bin", 2592*333d2b36SAndroid Build Coastguard Worker rotationMinSdkVersion: "32", 2593*333d2b36SAndroid Build Coastguard Worker logging_parent: "bah", 2594*333d2b36SAndroid Build Coastguard Worker } 2595*333d2b36SAndroid Build Coastguard Worker 2596*333d2b36SAndroid Build Coastguard Worker android_app_certificate { 2597*333d2b36SAndroid Build Coastguard Worker name: "new_certificate", 2598*333d2b36SAndroid Build Coastguard Worker certificate: "cert/new_cert", 2599*333d2b36SAndroid Build Coastguard Worker } 2600*333d2b36SAndroid Build Coastguard Worker 2601*333d2b36SAndroid Build Coastguard Worker override_android_app { 2602*333d2b36SAndroid Build Coastguard Worker name: "baz", 2603*333d2b36SAndroid Build Coastguard Worker base: "foo", 2604*333d2b36SAndroid Build Coastguard Worker package_name: "org.dandroid.bp", 2605*333d2b36SAndroid Build Coastguard Worker } 2606*333d2b36SAndroid Build Coastguard Worker 2607*333d2b36SAndroid Build Coastguard Worker override_android_app { 2608*333d2b36SAndroid Build Coastguard Worker name: "baz_no_rename_resources", 2609*333d2b36SAndroid Build Coastguard Worker base: "foo", 2610*333d2b36SAndroid Build Coastguard Worker package_name: "org.dandroid.bp", 2611*333d2b36SAndroid Build Coastguard Worker rename_resources_package: false, 2612*333d2b36SAndroid Build Coastguard Worker } 2613*333d2b36SAndroid Build Coastguard Worker 2614*333d2b36SAndroid Build Coastguard Worker android_app { 2615*333d2b36SAndroid Build Coastguard Worker name: "foo_no_rename_resources", 2616*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2617*333d2b36SAndroid Build Coastguard Worker certificate: "expiredkey", 2618*333d2b36SAndroid Build Coastguard Worker overrides: ["qux"], 2619*333d2b36SAndroid Build Coastguard Worker rename_resources_package: false, 2620*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2621*333d2b36SAndroid Build Coastguard Worker } 2622*333d2b36SAndroid Build Coastguard Worker 2623*333d2b36SAndroid Build Coastguard Worker override_android_app { 2624*333d2b36SAndroid Build Coastguard Worker name: "baz_base_no_rename_resources", 2625*333d2b36SAndroid Build Coastguard Worker base: "foo_no_rename_resources", 2626*333d2b36SAndroid Build Coastguard Worker package_name: "org.dandroid.bp", 2627*333d2b36SAndroid Build Coastguard Worker } 2628*333d2b36SAndroid Build Coastguard Worker 2629*333d2b36SAndroid Build Coastguard Worker override_android_app { 2630*333d2b36SAndroid Build Coastguard Worker name: "baz_override_base_rename_resources", 2631*333d2b36SAndroid Build Coastguard Worker base: "foo_no_rename_resources", 2632*333d2b36SAndroid Build Coastguard Worker package_name: "org.dandroid.bp", 2633*333d2b36SAndroid Build Coastguard Worker rename_resources_package: true, 2634*333d2b36SAndroid Build Coastguard Worker } 2635*333d2b36SAndroid Build Coastguard Worker `) 2636*333d2b36SAndroid Build Coastguard Worker 2637*333d2b36SAndroid Build Coastguard Worker expectedVariants := []struct { 2638*333d2b36SAndroid Build Coastguard Worker name string 2639*333d2b36SAndroid Build Coastguard Worker moduleName string 2640*333d2b36SAndroid Build Coastguard Worker variantName string 2641*333d2b36SAndroid Build Coastguard Worker apkName string 2642*333d2b36SAndroid Build Coastguard Worker apkPath string 2643*333d2b36SAndroid Build Coastguard Worker certFlag string 2644*333d2b36SAndroid Build Coastguard Worker certSigningFlags string 2645*333d2b36SAndroid Build Coastguard Worker overrides []string 2646*333d2b36SAndroid Build Coastguard Worker packageFlag string 2647*333d2b36SAndroid Build Coastguard Worker renameResources bool 2648*333d2b36SAndroid Build Coastguard Worker logging_parent string 2649*333d2b36SAndroid Build Coastguard Worker }{ 2650*333d2b36SAndroid Build Coastguard Worker { 2651*333d2b36SAndroid Build Coastguard Worker name: "foo", 2652*333d2b36SAndroid Build Coastguard Worker moduleName: "foo", 2653*333d2b36SAndroid Build Coastguard Worker variantName: "android_common", 2654*333d2b36SAndroid Build Coastguard Worker apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk", 2655*333d2b36SAndroid Build Coastguard Worker certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8", 2656*333d2b36SAndroid Build Coastguard Worker certSigningFlags: "", 2657*333d2b36SAndroid Build Coastguard Worker overrides: []string{"qux"}, 2658*333d2b36SAndroid Build Coastguard Worker packageFlag: "", 2659*333d2b36SAndroid Build Coastguard Worker renameResources: false, 2660*333d2b36SAndroid Build Coastguard Worker logging_parent: "", 2661*333d2b36SAndroid Build Coastguard Worker }, 2662*333d2b36SAndroid Build Coastguard Worker { 2663*333d2b36SAndroid Build Coastguard Worker name: "foo", 2664*333d2b36SAndroid Build Coastguard Worker moduleName: "bar", 2665*333d2b36SAndroid Build Coastguard Worker variantName: "android_common_bar", 2666*333d2b36SAndroid Build Coastguard Worker apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk", 2667*333d2b36SAndroid Build Coastguard Worker certFlag: "cert/new_cert.x509.pem cert/new_cert.pk8", 2668*333d2b36SAndroid Build Coastguard Worker certSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32", 2669*333d2b36SAndroid Build Coastguard Worker overrides: []string{"qux", "foo"}, 2670*333d2b36SAndroid Build Coastguard Worker packageFlag: "", 2671*333d2b36SAndroid Build Coastguard Worker renameResources: false, 2672*333d2b36SAndroid Build Coastguard Worker logging_parent: "bah", 2673*333d2b36SAndroid Build Coastguard Worker }, 2674*333d2b36SAndroid Build Coastguard Worker { 2675*333d2b36SAndroid Build Coastguard Worker name: "foo", 2676*333d2b36SAndroid Build Coastguard Worker moduleName: "baz", 2677*333d2b36SAndroid Build Coastguard Worker variantName: "android_common_baz", 2678*333d2b36SAndroid Build Coastguard Worker apkPath: "out/soong/target/product/test_device/system/app/baz/baz.apk", 2679*333d2b36SAndroid Build Coastguard Worker certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8", 2680*333d2b36SAndroid Build Coastguard Worker certSigningFlags: "", 2681*333d2b36SAndroid Build Coastguard Worker overrides: []string{"qux", "foo"}, 2682*333d2b36SAndroid Build Coastguard Worker packageFlag: "org.dandroid.bp", 2683*333d2b36SAndroid Build Coastguard Worker renameResources: true, 2684*333d2b36SAndroid Build Coastguard Worker logging_parent: "", 2685*333d2b36SAndroid Build Coastguard Worker }, 2686*333d2b36SAndroid Build Coastguard Worker { 2687*333d2b36SAndroid Build Coastguard Worker name: "foo", 2688*333d2b36SAndroid Build Coastguard Worker moduleName: "baz_no_rename_resources", 2689*333d2b36SAndroid Build Coastguard Worker variantName: "android_common_baz_no_rename_resources", 2690*333d2b36SAndroid Build Coastguard Worker apkPath: "out/soong/target/product/test_device/system/app/baz_no_rename_resources/baz_no_rename_resources.apk", 2691*333d2b36SAndroid Build Coastguard Worker certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8", 2692*333d2b36SAndroid Build Coastguard Worker certSigningFlags: "", 2693*333d2b36SAndroid Build Coastguard Worker overrides: []string{"qux", "foo"}, 2694*333d2b36SAndroid Build Coastguard Worker packageFlag: "org.dandroid.bp", 2695*333d2b36SAndroid Build Coastguard Worker renameResources: false, 2696*333d2b36SAndroid Build Coastguard Worker logging_parent: "", 2697*333d2b36SAndroid Build Coastguard Worker }, 2698*333d2b36SAndroid Build Coastguard Worker { 2699*333d2b36SAndroid Build Coastguard Worker name: "foo_no_rename_resources", 2700*333d2b36SAndroid Build Coastguard Worker moduleName: "baz_base_no_rename_resources", 2701*333d2b36SAndroid Build Coastguard Worker variantName: "android_common_baz_base_no_rename_resources", 2702*333d2b36SAndroid Build Coastguard Worker apkPath: "out/soong/target/product/test_device/system/app/baz_base_no_rename_resources/baz_base_no_rename_resources.apk", 2703*333d2b36SAndroid Build Coastguard Worker certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8", 2704*333d2b36SAndroid Build Coastguard Worker certSigningFlags: "", 2705*333d2b36SAndroid Build Coastguard Worker overrides: []string{"qux", "foo_no_rename_resources"}, 2706*333d2b36SAndroid Build Coastguard Worker packageFlag: "org.dandroid.bp", 2707*333d2b36SAndroid Build Coastguard Worker renameResources: false, 2708*333d2b36SAndroid Build Coastguard Worker logging_parent: "", 2709*333d2b36SAndroid Build Coastguard Worker }, 2710*333d2b36SAndroid Build Coastguard Worker { 2711*333d2b36SAndroid Build Coastguard Worker name: "foo_no_rename_resources", 2712*333d2b36SAndroid Build Coastguard Worker moduleName: "baz_override_base_rename_resources", 2713*333d2b36SAndroid Build Coastguard Worker variantName: "android_common_baz_override_base_rename_resources", 2714*333d2b36SAndroid Build Coastguard Worker apkPath: "out/soong/target/product/test_device/system/app/baz_override_base_rename_resources/baz_override_base_rename_resources.apk", 2715*333d2b36SAndroid Build Coastguard Worker certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8", 2716*333d2b36SAndroid Build Coastguard Worker certSigningFlags: "", 2717*333d2b36SAndroid Build Coastguard Worker overrides: []string{"qux", "foo_no_rename_resources"}, 2718*333d2b36SAndroid Build Coastguard Worker packageFlag: "org.dandroid.bp", 2719*333d2b36SAndroid Build Coastguard Worker renameResources: true, 2720*333d2b36SAndroid Build Coastguard Worker logging_parent: "", 2721*333d2b36SAndroid Build Coastguard Worker }, 2722*333d2b36SAndroid Build Coastguard Worker } 2723*333d2b36SAndroid Build Coastguard Worker for _, expected := range expectedVariants { 2724*333d2b36SAndroid Build Coastguard Worker variant := result.ModuleForTests(expected.name, expected.variantName) 2725*333d2b36SAndroid Build Coastguard Worker 2726*333d2b36SAndroid Build Coastguard Worker // Check the final apk name 2727*333d2b36SAndroid Build Coastguard Worker variant.Output(expected.apkPath) 2728*333d2b36SAndroid Build Coastguard Worker 2729*333d2b36SAndroid Build Coastguard Worker // Check the certificate paths 2730*333d2b36SAndroid Build Coastguard Worker signapk := variant.Output(expected.moduleName + ".apk") 2731*333d2b36SAndroid Build Coastguard Worker certFlag := signapk.Args["certificates"] 2732*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "certificates flags", expected.certFlag, certFlag) 2733*333d2b36SAndroid Build Coastguard Worker 2734*333d2b36SAndroid Build Coastguard Worker // Check the cert signing flags 2735*333d2b36SAndroid Build Coastguard Worker certSigningFlags := signapk.Args["flags"] 2736*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "cert signing flags", expected.certSigningFlags, certSigningFlags) 2737*333d2b36SAndroid Build Coastguard Worker 2738*333d2b36SAndroid Build Coastguard Worker // Check if the overrides field values are correctly aggregated. 2739*333d2b36SAndroid Build Coastguard Worker mod := variant.Module().(*AndroidApp) 2740*333d2b36SAndroid Build Coastguard Worker android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides) 2741*333d2b36SAndroid Build Coastguard Worker 2742*333d2b36SAndroid Build Coastguard Worker // Test Overridable property: Logging_parent 2743*333d2b36SAndroid Build Coastguard Worker logging_parent := mod.aapt.LoggingParent 2744*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "overrides property value for logging parent", expected.logging_parent, logging_parent) 2745*333d2b36SAndroid Build Coastguard Worker 2746*333d2b36SAndroid Build Coastguard Worker // Check the package renaming flag, if exists. 2747*333d2b36SAndroid Build Coastguard Worker res := variant.Output("package-res.apk") 2748*333d2b36SAndroid Build Coastguard Worker aapt2Flags := res.Args["flags"] 2749*333d2b36SAndroid Build Coastguard Worker checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag) 2750*333d2b36SAndroid Build Coastguard Worker expectedPackage := expected.packageFlag 2751*333d2b36SAndroid Build Coastguard Worker if !expected.renameResources { 2752*333d2b36SAndroid Build Coastguard Worker expectedPackage = "" 2753*333d2b36SAndroid Build Coastguard Worker } 2754*333d2b36SAndroid Build Coastguard Worker checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expectedPackage) 2755*333d2b36SAndroid Build Coastguard Worker } 2756*333d2b36SAndroid Build Coastguard Worker} 2757*333d2b36SAndroid Build Coastguard Worker 2758*333d2b36SAndroid Build Coastguard Workerfunc TestOverrideAndroidAppOverrides(t *testing.T) { 2759*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava( 2760*333d2b36SAndroid Build Coastguard Worker t, ` 2761*333d2b36SAndroid Build Coastguard Worker android_app { 2762*333d2b36SAndroid Build Coastguard Worker name: "foo", 2763*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2764*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2765*333d2b36SAndroid Build Coastguard Worker overrides: ["qux"] 2766*333d2b36SAndroid Build Coastguard Worker } 2767*333d2b36SAndroid Build Coastguard Worker 2768*333d2b36SAndroid Build Coastguard Worker android_app { 2769*333d2b36SAndroid Build Coastguard Worker name: "bar", 2770*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 2771*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2772*333d2b36SAndroid Build Coastguard Worker overrides: ["foo"] 2773*333d2b36SAndroid Build Coastguard Worker } 2774*333d2b36SAndroid Build Coastguard Worker 2775*333d2b36SAndroid Build Coastguard Worker override_android_app { 2776*333d2b36SAndroid Build Coastguard Worker name: "foo_override", 2777*333d2b36SAndroid Build Coastguard Worker base: "foo", 2778*333d2b36SAndroid Build Coastguard Worker overrides: ["bar"] 2779*333d2b36SAndroid Build Coastguard Worker } 2780*333d2b36SAndroid Build Coastguard Worker `) 2781*333d2b36SAndroid Build Coastguard Worker 2782*333d2b36SAndroid Build Coastguard Worker expectedVariants := []struct { 2783*333d2b36SAndroid Build Coastguard Worker name string 2784*333d2b36SAndroid Build Coastguard Worker moduleName string 2785*333d2b36SAndroid Build Coastguard Worker variantName string 2786*333d2b36SAndroid Build Coastguard Worker overrides []string 2787*333d2b36SAndroid Build Coastguard Worker }{ 2788*333d2b36SAndroid Build Coastguard Worker { 2789*333d2b36SAndroid Build Coastguard Worker name: "foo", 2790*333d2b36SAndroid Build Coastguard Worker moduleName: "foo", 2791*333d2b36SAndroid Build Coastguard Worker variantName: "android_common", 2792*333d2b36SAndroid Build Coastguard Worker overrides: []string{"qux"}, 2793*333d2b36SAndroid Build Coastguard Worker }, 2794*333d2b36SAndroid Build Coastguard Worker { 2795*333d2b36SAndroid Build Coastguard Worker name: "bar", 2796*333d2b36SAndroid Build Coastguard Worker moduleName: "bar", 2797*333d2b36SAndroid Build Coastguard Worker variantName: "android_common", 2798*333d2b36SAndroid Build Coastguard Worker overrides: []string{"foo"}, 2799*333d2b36SAndroid Build Coastguard Worker }, 2800*333d2b36SAndroid Build Coastguard Worker { 2801*333d2b36SAndroid Build Coastguard Worker name: "foo", 2802*333d2b36SAndroid Build Coastguard Worker moduleName: "foo_override", 2803*333d2b36SAndroid Build Coastguard Worker variantName: "android_common_foo_override", 2804*333d2b36SAndroid Build Coastguard Worker overrides: []string{"bar", "foo"}, 2805*333d2b36SAndroid Build Coastguard Worker }, 2806*333d2b36SAndroid Build Coastguard Worker } 2807*333d2b36SAndroid Build Coastguard Worker for _, expected := range expectedVariants { 2808*333d2b36SAndroid Build Coastguard Worker variant := ctx.ModuleForTests(expected.name, expected.variantName) 2809*333d2b36SAndroid Build Coastguard Worker 2810*333d2b36SAndroid Build Coastguard Worker // Check if the overrides field values are correctly aggregated. 2811*333d2b36SAndroid Build Coastguard Worker mod := variant.Module().(*AndroidApp) 2812*333d2b36SAndroid Build Coastguard Worker android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides) 2813*333d2b36SAndroid Build Coastguard Worker } 2814*333d2b36SAndroid Build Coastguard Worker} 2815*333d2b36SAndroid Build Coastguard Worker 2816*333d2b36SAndroid Build Coastguard Workerfunc TestOverrideAndroidAppWithPrebuilt(t *testing.T) { 2817*333d2b36SAndroid Build Coastguard Worker result := PrepareForTestWithJavaDefaultModules.RunTestWithBp( 2818*333d2b36SAndroid Build Coastguard Worker t, ` 2819*333d2b36SAndroid Build Coastguard Worker android_app { 2820*333d2b36SAndroid Build Coastguard Worker name: "foo", 2821*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2822*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2823*333d2b36SAndroid Build Coastguard Worker } 2824*333d2b36SAndroid Build Coastguard Worker 2825*333d2b36SAndroid Build Coastguard Worker override_android_app { 2826*333d2b36SAndroid Build Coastguard Worker name: "bar", 2827*333d2b36SAndroid Build Coastguard Worker base: "foo", 2828*333d2b36SAndroid Build Coastguard Worker } 2829*333d2b36SAndroid Build Coastguard Worker 2830*333d2b36SAndroid Build Coastguard Worker android_app_import { 2831*333d2b36SAndroid Build Coastguard Worker name: "bar", 2832*333d2b36SAndroid Build Coastguard Worker prefer: true, 2833*333d2b36SAndroid Build Coastguard Worker apk: "bar.apk", 2834*333d2b36SAndroid Build Coastguard Worker presigned: true, 2835*333d2b36SAndroid Build Coastguard Worker } 2836*333d2b36SAndroid Build Coastguard Worker `) 2837*333d2b36SAndroid Build Coastguard Worker 2838*333d2b36SAndroid Build Coastguard Worker // An app that has an override that also has a prebuilt should not be hidden. 2839*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", "android_common") 2840*333d2b36SAndroid Build Coastguard Worker if foo.Module().IsHideFromMake() { 2841*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected foo to have HideFromMake false") 2842*333d2b36SAndroid Build Coastguard Worker } 2843*333d2b36SAndroid Build Coastguard Worker 2844*333d2b36SAndroid Build Coastguard Worker // An override that also has a prebuilt should be hidden. 2845*333d2b36SAndroid Build Coastguard Worker barOverride := result.ModuleForTests("foo", "android_common_bar") 2846*333d2b36SAndroid Build Coastguard Worker if !barOverride.Module().IsHideFromMake() { 2847*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected bar override variant of foo to have HideFromMake true") 2848*333d2b36SAndroid Build Coastguard Worker } 2849*333d2b36SAndroid Build Coastguard Worker} 2850*333d2b36SAndroid Build Coastguard Worker 2851*333d2b36SAndroid Build Coastguard Workerfunc TestOverrideAndroidAppStem(t *testing.T) { 2852*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 2853*333d2b36SAndroid Build Coastguard Worker android_app { 2854*333d2b36SAndroid Build Coastguard Worker name: "foo", 2855*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2856*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2857*333d2b36SAndroid Build Coastguard Worker } 2858*333d2b36SAndroid Build Coastguard Worker override_android_app { 2859*333d2b36SAndroid Build Coastguard Worker name: "bar", 2860*333d2b36SAndroid Build Coastguard Worker base: "foo", 2861*333d2b36SAndroid Build Coastguard Worker } 2862*333d2b36SAndroid Build Coastguard Worker override_android_app { 2863*333d2b36SAndroid Build Coastguard Worker name: "baz", 2864*333d2b36SAndroid Build Coastguard Worker base: "foo", 2865*333d2b36SAndroid Build Coastguard Worker stem: "baz_stem", 2866*333d2b36SAndroid Build Coastguard Worker } 2867*333d2b36SAndroid Build Coastguard Worker android_app { 2868*333d2b36SAndroid Build Coastguard Worker name: "foo2", 2869*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2870*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2871*333d2b36SAndroid Build Coastguard Worker stem: "foo2_stem", 2872*333d2b36SAndroid Build Coastguard Worker } 2873*333d2b36SAndroid Build Coastguard Worker override_android_app { 2874*333d2b36SAndroid Build Coastguard Worker name: "bar2", 2875*333d2b36SAndroid Build Coastguard Worker base: "foo2", 2876*333d2b36SAndroid Build Coastguard Worker } 2877*333d2b36SAndroid Build Coastguard Worker override_android_app { 2878*333d2b36SAndroid Build Coastguard Worker name: "baz2", 2879*333d2b36SAndroid Build Coastguard Worker base: "foo2", 2880*333d2b36SAndroid Build Coastguard Worker stem: "baz2_stem", 2881*333d2b36SAndroid Build Coastguard Worker } 2882*333d2b36SAndroid Build Coastguard Worker `) 2883*333d2b36SAndroid Build Coastguard Worker for _, expected := range []struct { 2884*333d2b36SAndroid Build Coastguard Worker moduleName string 2885*333d2b36SAndroid Build Coastguard Worker variantName string 2886*333d2b36SAndroid Build Coastguard Worker apkPath string 2887*333d2b36SAndroid Build Coastguard Worker }{ 2888*333d2b36SAndroid Build Coastguard Worker { 2889*333d2b36SAndroid Build Coastguard Worker moduleName: "foo", 2890*333d2b36SAndroid Build Coastguard Worker variantName: "android_common", 2891*333d2b36SAndroid Build Coastguard Worker apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk", 2892*333d2b36SAndroid Build Coastguard Worker }, 2893*333d2b36SAndroid Build Coastguard Worker { 2894*333d2b36SAndroid Build Coastguard Worker moduleName: "foo", 2895*333d2b36SAndroid Build Coastguard Worker variantName: "android_common_bar", 2896*333d2b36SAndroid Build Coastguard Worker apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk", 2897*333d2b36SAndroid Build Coastguard Worker }, 2898*333d2b36SAndroid Build Coastguard Worker { 2899*333d2b36SAndroid Build Coastguard Worker moduleName: "foo", 2900*333d2b36SAndroid Build Coastguard Worker variantName: "android_common_baz", 2901*333d2b36SAndroid Build Coastguard Worker apkPath: "out/soong/target/product/test_device/system/app/baz_stem/baz_stem.apk", 2902*333d2b36SAndroid Build Coastguard Worker }, 2903*333d2b36SAndroid Build Coastguard Worker { 2904*333d2b36SAndroid Build Coastguard Worker moduleName: "foo2", 2905*333d2b36SAndroid Build Coastguard Worker variantName: "android_common", 2906*333d2b36SAndroid Build Coastguard Worker apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk", 2907*333d2b36SAndroid Build Coastguard Worker }, 2908*333d2b36SAndroid Build Coastguard Worker { 2909*333d2b36SAndroid Build Coastguard Worker moduleName: "foo2", 2910*333d2b36SAndroid Build Coastguard Worker variantName: "android_common_bar2", 2911*333d2b36SAndroid Build Coastguard Worker // Note that this may cause the duplicate output error. 2912*333d2b36SAndroid Build Coastguard Worker apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk", 2913*333d2b36SAndroid Build Coastguard Worker }, 2914*333d2b36SAndroid Build Coastguard Worker { 2915*333d2b36SAndroid Build Coastguard Worker moduleName: "foo2", 2916*333d2b36SAndroid Build Coastguard Worker variantName: "android_common_baz2", 2917*333d2b36SAndroid Build Coastguard Worker apkPath: "out/soong/target/product/test_device/system/app/baz2_stem/baz2_stem.apk", 2918*333d2b36SAndroid Build Coastguard Worker }, 2919*333d2b36SAndroid Build Coastguard Worker } { 2920*333d2b36SAndroid Build Coastguard Worker variant := ctx.ModuleForTests(expected.moduleName, expected.variantName) 2921*333d2b36SAndroid Build Coastguard Worker variant.Output(expected.apkPath) 2922*333d2b36SAndroid Build Coastguard Worker } 2923*333d2b36SAndroid Build Coastguard Worker} 2924*333d2b36SAndroid Build Coastguard Worker 2925*333d2b36SAndroid Build Coastguard Workerfunc TestOverrideAndroidAppDependency(t *testing.T) { 2926*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 2927*333d2b36SAndroid Build Coastguard Worker android_app { 2928*333d2b36SAndroid Build Coastguard Worker name: "foo", 2929*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2930*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2931*333d2b36SAndroid Build Coastguard Worker } 2932*333d2b36SAndroid Build Coastguard Worker 2933*333d2b36SAndroid Build Coastguard Worker override_android_app { 2934*333d2b36SAndroid Build Coastguard Worker name: "bar", 2935*333d2b36SAndroid Build Coastguard Worker base: "foo", 2936*333d2b36SAndroid Build Coastguard Worker package_name: "org.dandroid.bp", 2937*333d2b36SAndroid Build Coastguard Worker } 2938*333d2b36SAndroid Build Coastguard Worker 2939*333d2b36SAndroid Build Coastguard Worker android_test { 2940*333d2b36SAndroid Build Coastguard Worker name: "baz", 2941*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 2942*333d2b36SAndroid Build Coastguard Worker instrumentation_for: "foo", 2943*333d2b36SAndroid Build Coastguard Worker } 2944*333d2b36SAndroid Build Coastguard Worker 2945*333d2b36SAndroid Build Coastguard Worker android_test { 2946*333d2b36SAndroid Build Coastguard Worker name: "qux", 2947*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 2948*333d2b36SAndroid Build Coastguard Worker instrumentation_for: "bar", 2949*333d2b36SAndroid Build Coastguard Worker } 2950*333d2b36SAndroid Build Coastguard Worker `) 2951*333d2b36SAndroid Build Coastguard Worker 2952*333d2b36SAndroid Build Coastguard Worker // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg. 2953*333d2b36SAndroid Build Coastguard Worker javac := ctx.ModuleForTests("baz", "android_common").Rule("javac") 2954*333d2b36SAndroid Build Coastguard Worker fooTurbine := "out/soong/.intermediates/foo/android_common/turbine-combined/foo.jar" 2955*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(javac.Args["classpath"], fooTurbine) { 2956*333d2b36SAndroid Build Coastguard Worker t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine) 2957*333d2b36SAndroid Build Coastguard Worker } 2958*333d2b36SAndroid Build Coastguard Worker 2959*333d2b36SAndroid Build Coastguard Worker // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg. 2960*333d2b36SAndroid Build Coastguard Worker javac = ctx.ModuleForTests("qux", "android_common").Rule("javac") 2961*333d2b36SAndroid Build Coastguard Worker barTurbine := "out/soong/.intermediates/foo/android_common_bar/turbine-combined/foo.jar" 2962*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(javac.Args["classpath"], barTurbine) { 2963*333d2b36SAndroid Build Coastguard Worker t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine) 2964*333d2b36SAndroid Build Coastguard Worker } 2965*333d2b36SAndroid Build Coastguard Worker} 2966*333d2b36SAndroid Build Coastguard Worker 2967*333d2b36SAndroid Build Coastguard Workerfunc TestOverrideAndroidTest(t *testing.T) { 2968*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 2969*333d2b36SAndroid Build Coastguard Worker android_app { 2970*333d2b36SAndroid Build Coastguard Worker name: "foo", 2971*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2972*333d2b36SAndroid Build Coastguard Worker package_name: "com.android.foo", 2973*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2974*333d2b36SAndroid Build Coastguard Worker } 2975*333d2b36SAndroid Build Coastguard Worker 2976*333d2b36SAndroid Build Coastguard Worker override_android_app { 2977*333d2b36SAndroid Build Coastguard Worker name: "bar", 2978*333d2b36SAndroid Build Coastguard Worker base: "foo", 2979*333d2b36SAndroid Build Coastguard Worker package_name: "com.android.bar", 2980*333d2b36SAndroid Build Coastguard Worker } 2981*333d2b36SAndroid Build Coastguard Worker 2982*333d2b36SAndroid Build Coastguard Worker android_test { 2983*333d2b36SAndroid Build Coastguard Worker name: "foo_test", 2984*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 2985*333d2b36SAndroid Build Coastguard Worker instrumentation_for: "foo", 2986*333d2b36SAndroid Build Coastguard Worker } 2987*333d2b36SAndroid Build Coastguard Worker 2988*333d2b36SAndroid Build Coastguard Worker override_android_test { 2989*333d2b36SAndroid Build Coastguard Worker name: "bar_test", 2990*333d2b36SAndroid Build Coastguard Worker base: "foo_test", 2991*333d2b36SAndroid Build Coastguard Worker package_name: "com.android.bar.test", 2992*333d2b36SAndroid Build Coastguard Worker instrumentation_for: "bar", 2993*333d2b36SAndroid Build Coastguard Worker instrumentation_target_package: "com.android.bar", 2994*333d2b36SAndroid Build Coastguard Worker } 2995*333d2b36SAndroid Build Coastguard Worker `) 2996*333d2b36SAndroid Build Coastguard Worker 2997*333d2b36SAndroid Build Coastguard Worker expectedVariants := []struct { 2998*333d2b36SAndroid Build Coastguard Worker moduleName string 2999*333d2b36SAndroid Build Coastguard Worker variantName string 3000*333d2b36SAndroid Build Coastguard Worker apkPath string 3001*333d2b36SAndroid Build Coastguard Worker overrides []string 3002*333d2b36SAndroid Build Coastguard Worker targetVariant string 3003*333d2b36SAndroid Build Coastguard Worker packageFlag string 3004*333d2b36SAndroid Build Coastguard Worker targetPackageFlag string 3005*333d2b36SAndroid Build Coastguard Worker }{ 3006*333d2b36SAndroid Build Coastguard Worker { 3007*333d2b36SAndroid Build Coastguard Worker variantName: "android_common", 3008*333d2b36SAndroid Build Coastguard Worker apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk", 3009*333d2b36SAndroid Build Coastguard Worker overrides: nil, 3010*333d2b36SAndroid Build Coastguard Worker targetVariant: "android_common", 3011*333d2b36SAndroid Build Coastguard Worker packageFlag: "", 3012*333d2b36SAndroid Build Coastguard Worker targetPackageFlag: "", 3013*333d2b36SAndroid Build Coastguard Worker }, 3014*333d2b36SAndroid Build Coastguard Worker { 3015*333d2b36SAndroid Build Coastguard Worker variantName: "android_common_bar_test", 3016*333d2b36SAndroid Build Coastguard Worker apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk", 3017*333d2b36SAndroid Build Coastguard Worker overrides: []string{"foo_test"}, 3018*333d2b36SAndroid Build Coastguard Worker targetVariant: "android_common_bar", 3019*333d2b36SAndroid Build Coastguard Worker packageFlag: "com.android.bar.test", 3020*333d2b36SAndroid Build Coastguard Worker targetPackageFlag: "com.android.bar", 3021*333d2b36SAndroid Build Coastguard Worker }, 3022*333d2b36SAndroid Build Coastguard Worker } 3023*333d2b36SAndroid Build Coastguard Worker for _, expected := range expectedVariants { 3024*333d2b36SAndroid Build Coastguard Worker variant := ctx.ModuleForTests("foo_test", expected.variantName) 3025*333d2b36SAndroid Build Coastguard Worker 3026*333d2b36SAndroid Build Coastguard Worker // Check the final apk name 3027*333d2b36SAndroid Build Coastguard Worker variant.Output("out/soong" + expected.apkPath) 3028*333d2b36SAndroid Build Coastguard Worker 3029*333d2b36SAndroid Build Coastguard Worker // Check if the overrides field values are correctly aggregated. 3030*333d2b36SAndroid Build Coastguard Worker mod := variant.Module().(*AndroidTest) 3031*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(expected.overrides, mod.overridableAppProperties.Overrides) { 3032*333d2b36SAndroid Build Coastguard Worker t.Errorf("Incorrect overrides property value, expected: %q, got: %q", 3033*333d2b36SAndroid Build Coastguard Worker expected.overrides, mod.overridableAppProperties.Overrides) 3034*333d2b36SAndroid Build Coastguard Worker } 3035*333d2b36SAndroid Build Coastguard Worker 3036*333d2b36SAndroid Build Coastguard Worker // Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides. 3037*333d2b36SAndroid Build Coastguard Worker javac := variant.Rule("javac") 3038*333d2b36SAndroid Build Coastguard Worker turbine := filepath.Join("out", "soong", ".intermediates", "foo", expected.targetVariant, "turbine-combined", "foo.jar") 3039*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(javac.Args["classpath"], turbine) { 3040*333d2b36SAndroid Build Coastguard Worker t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine) 3041*333d2b36SAndroid Build Coastguard Worker } 3042*333d2b36SAndroid Build Coastguard Worker 3043*333d2b36SAndroid Build Coastguard Worker // Check aapt2 flags. 3044*333d2b36SAndroid Build Coastguard Worker res := variant.Output("package-res.apk") 3045*333d2b36SAndroid Build Coastguard Worker aapt2Flags := res.Args["flags"] 3046*333d2b36SAndroid Build Coastguard Worker checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag) 3047*333d2b36SAndroid Build Coastguard Worker checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag) 3048*333d2b36SAndroid Build Coastguard Worker checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag) 3049*333d2b36SAndroid Build Coastguard Worker } 3050*333d2b36SAndroid Build Coastguard Worker} 3051*333d2b36SAndroid Build Coastguard Worker 3052*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidTest_FixTestConfig(t *testing.T) { 3053*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 3054*333d2b36SAndroid Build Coastguard Worker android_app { 3055*333d2b36SAndroid Build Coastguard Worker name: "foo", 3056*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3057*333d2b36SAndroid Build Coastguard Worker package_name: "com.android.foo", 3058*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3059*333d2b36SAndroid Build Coastguard Worker } 3060*333d2b36SAndroid Build Coastguard Worker 3061*333d2b36SAndroid Build Coastguard Worker android_test { 3062*333d2b36SAndroid Build Coastguard Worker name: "foo_test", 3063*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 3064*333d2b36SAndroid Build Coastguard Worker instrumentation_for: "foo", 3065*333d2b36SAndroid Build Coastguard Worker } 3066*333d2b36SAndroid Build Coastguard Worker 3067*333d2b36SAndroid Build Coastguard Worker android_test { 3068*333d2b36SAndroid Build Coastguard Worker name: "bar_test", 3069*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 3070*333d2b36SAndroid Build Coastguard Worker package_name: "com.android.bar.test", 3071*333d2b36SAndroid Build Coastguard Worker instrumentation_for: "foo", 3072*333d2b36SAndroid Build Coastguard Worker mainline_package_name: "com.android.bar", 3073*333d2b36SAndroid Build Coastguard Worker } 3074*333d2b36SAndroid Build Coastguard Worker 3075*333d2b36SAndroid Build Coastguard Worker override_android_test { 3076*333d2b36SAndroid Build Coastguard Worker name: "baz_test", 3077*333d2b36SAndroid Build Coastguard Worker base: "foo_test", 3078*333d2b36SAndroid Build Coastguard Worker package_name: "com.android.baz.test", 3079*333d2b36SAndroid Build Coastguard Worker mainline_package_name: "com.android.baz", 3080*333d2b36SAndroid Build Coastguard Worker } 3081*333d2b36SAndroid Build Coastguard Worker `) 3082*333d2b36SAndroid Build Coastguard Worker 3083*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 3084*333d2b36SAndroid Build Coastguard Worker moduleName string 3085*333d2b36SAndroid Build Coastguard Worker variantName string 3086*333d2b36SAndroid Build Coastguard Worker expectedFlags []string 3087*333d2b36SAndroid Build Coastguard Worker }{ 3088*333d2b36SAndroid Build Coastguard Worker { 3089*333d2b36SAndroid Build Coastguard Worker moduleName: "foo_test", 3090*333d2b36SAndroid Build Coastguard Worker variantName: "android_common", 3091*333d2b36SAndroid Build Coastguard Worker }, 3092*333d2b36SAndroid Build Coastguard Worker { 3093*333d2b36SAndroid Build Coastguard Worker moduleName: "bar_test", 3094*333d2b36SAndroid Build Coastguard Worker variantName: "android_common", 3095*333d2b36SAndroid Build Coastguard Worker expectedFlags: []string{ 3096*333d2b36SAndroid Build Coastguard Worker "--manifest out/soong/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml", 3097*333d2b36SAndroid Build Coastguard Worker "--package-name com.android.bar.test", 3098*333d2b36SAndroid Build Coastguard Worker "--mainline-package-name com.android.bar", 3099*333d2b36SAndroid Build Coastguard Worker }, 3100*333d2b36SAndroid Build Coastguard Worker }, 3101*333d2b36SAndroid Build Coastguard Worker { 3102*333d2b36SAndroid Build Coastguard Worker moduleName: "foo_test", 3103*333d2b36SAndroid Build Coastguard Worker variantName: "android_common_baz_test", 3104*333d2b36SAndroid Build Coastguard Worker expectedFlags: []string{ 3105*333d2b36SAndroid Build Coastguard Worker "--manifest out/soong/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml", 3106*333d2b36SAndroid Build Coastguard Worker "--package-name com.android.baz.test", 3107*333d2b36SAndroid Build Coastguard Worker "--test-file-name baz_test.apk", 3108*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/foo_test/android_common_baz_test/test_config_fixer/AndroidTest.xml", 3109*333d2b36SAndroid Build Coastguard Worker "--mainline-package-name com.android.baz", 3110*333d2b36SAndroid Build Coastguard Worker }, 3111*333d2b36SAndroid Build Coastguard Worker }, 3112*333d2b36SAndroid Build Coastguard Worker } 3113*333d2b36SAndroid Build Coastguard Worker 3114*333d2b36SAndroid Build Coastguard Worker for _, test := range testCases { 3115*333d2b36SAndroid Build Coastguard Worker variant := ctx.ModuleForTests(test.moduleName, test.variantName) 3116*333d2b36SAndroid Build Coastguard Worker params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml") 3117*333d2b36SAndroid Build Coastguard Worker 3118*333d2b36SAndroid Build Coastguard Worker if len(test.expectedFlags) > 0 { 3119*333d2b36SAndroid Build Coastguard Worker if params.Rule == nil { 3120*333d2b36SAndroid Build Coastguard Worker t.Errorf("test_config_fixer was expected to run, but didn't") 3121*333d2b36SAndroid Build Coastguard Worker } else { 3122*333d2b36SAndroid Build Coastguard Worker for _, flag := range test.expectedFlags { 3123*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(params.RuleParams.Command, flag) { 3124*333d2b36SAndroid Build Coastguard Worker t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command) 3125*333d2b36SAndroid Build Coastguard Worker } 3126*333d2b36SAndroid Build Coastguard Worker } 3127*333d2b36SAndroid Build Coastguard Worker } 3128*333d2b36SAndroid Build Coastguard Worker } else { 3129*333d2b36SAndroid Build Coastguard Worker if params.Rule != nil { 3130*333d2b36SAndroid Build Coastguard Worker t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command) 3131*333d2b36SAndroid Build Coastguard Worker } 3132*333d2b36SAndroid Build Coastguard Worker } 3133*333d2b36SAndroid Build Coastguard Worker } 3134*333d2b36SAndroid Build Coastguard Worker} 3135*333d2b36SAndroid Build Coastguard Worker 3136*333d2b36SAndroid Build Coastguard Workerfunc TestInstrumentationTargetPrebuilt(t *testing.T) { 3137*333d2b36SAndroid Build Coastguard Worker bp := ` 3138*333d2b36SAndroid Build Coastguard Worker android_app_import { 3139*333d2b36SAndroid Build Coastguard Worker name: "foo", 3140*333d2b36SAndroid Build Coastguard Worker apk: "foo.apk", 3141*333d2b36SAndroid Build Coastguard Worker presigned: true, 3142*333d2b36SAndroid Build Coastguard Worker } 3143*333d2b36SAndroid Build Coastguard Worker 3144*333d2b36SAndroid Build Coastguard Worker android_test { 3145*333d2b36SAndroid Build Coastguard Worker name: "bar", 3146*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3147*333d2b36SAndroid Build Coastguard Worker instrumentation_for: "foo", 3148*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3149*333d2b36SAndroid Build Coastguard Worker } 3150*333d2b36SAndroid Build Coastguard Worker ` 3151*333d2b36SAndroid Build Coastguard Worker 3152*333d2b36SAndroid Build Coastguard Worker android.GroupFixturePreparers( 3153*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 3154*333d2b36SAndroid Build Coastguard Worker ).ExtendWithErrorHandler( 3155*333d2b36SAndroid Build Coastguard Worker android.FixtureExpectsAtLeastOneErrorMatchingPattern( 3156*333d2b36SAndroid Build Coastguard Worker "instrumentation_for: dependency \"foo\" of type \"android_app_import\" does not provide JavaInfo so is unsuitable for use with this property")). 3157*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, bp) 3158*333d2b36SAndroid Build Coastguard Worker} 3159*333d2b36SAndroid Build Coastguard Worker 3160*333d2b36SAndroid Build Coastguard Workerfunc TestStl(t *testing.T) { 3161*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+` 3162*333d2b36SAndroid Build Coastguard Worker cc_library { 3163*333d2b36SAndroid Build Coastguard Worker name: "libjni", 3164*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3165*333d2b36SAndroid Build Coastguard Worker stl: "c++_shared", 3166*333d2b36SAndroid Build Coastguard Worker } 3167*333d2b36SAndroid Build Coastguard Worker 3168*333d2b36SAndroid Build Coastguard Worker android_test { 3169*333d2b36SAndroid Build Coastguard Worker name: "stl", 3170*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 3171*333d2b36SAndroid Build Coastguard Worker compile_multilib: "both", 3172*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3173*333d2b36SAndroid Build Coastguard Worker stl: "c++_shared", 3174*333d2b36SAndroid Build Coastguard Worker } 3175*333d2b36SAndroid Build Coastguard Worker 3176*333d2b36SAndroid Build Coastguard Worker android_test { 3177*333d2b36SAndroid Build Coastguard Worker name: "system", 3178*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 3179*333d2b36SAndroid Build Coastguard Worker compile_multilib: "both", 3180*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3181*333d2b36SAndroid Build Coastguard Worker } 3182*333d2b36SAndroid Build Coastguard Worker `) 3183*333d2b36SAndroid Build Coastguard Worker 3184*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 3185*333d2b36SAndroid Build Coastguard Worker name string 3186*333d2b36SAndroid Build Coastguard Worker jnis []string 3187*333d2b36SAndroid Build Coastguard Worker }{ 3188*333d2b36SAndroid Build Coastguard Worker {"stl", 3189*333d2b36SAndroid Build Coastguard Worker []string{ 3190*333d2b36SAndroid Build Coastguard Worker "libjni.so", 3191*333d2b36SAndroid Build Coastguard Worker "libc++_shared.so", 3192*333d2b36SAndroid Build Coastguard Worker }, 3193*333d2b36SAndroid Build Coastguard Worker }, 3194*333d2b36SAndroid Build Coastguard Worker {"system", 3195*333d2b36SAndroid Build Coastguard Worker []string{ 3196*333d2b36SAndroid Build Coastguard Worker "libjni.so", 3197*333d2b36SAndroid Build Coastguard Worker }, 3198*333d2b36SAndroid Build Coastguard Worker }, 3199*333d2b36SAndroid Build Coastguard Worker } 3200*333d2b36SAndroid Build Coastguard Worker 3201*333d2b36SAndroid Build Coastguard Worker for _, test := range testCases { 3202*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 3203*333d2b36SAndroid Build Coastguard Worker app := ctx.ModuleForTests(test.name, "android_common") 3204*333d2b36SAndroid Build Coastguard Worker jniLibZip := app.Output("jnilibs.zip") 3205*333d2b36SAndroid Build Coastguard Worker var jnis []string 3206*333d2b36SAndroid Build Coastguard Worker args := strings.Fields(jniLibZip.Args["jarArgs"]) 3207*333d2b36SAndroid Build Coastguard Worker for i := 0; i < len(args); i++ { 3208*333d2b36SAndroid Build Coastguard Worker if args[i] == "-f" { 3209*333d2b36SAndroid Build Coastguard Worker jnis = append(jnis, args[i+1]) 3210*333d2b36SAndroid Build Coastguard Worker i += 1 3211*333d2b36SAndroid Build Coastguard Worker } 3212*333d2b36SAndroid Build Coastguard Worker } 3213*333d2b36SAndroid Build Coastguard Worker jnisJoined := strings.Join(jnis, " ") 3214*333d2b36SAndroid Build Coastguard Worker for _, jni := range test.jnis { 3215*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(jnisJoined, jni) { 3216*333d2b36SAndroid Build Coastguard Worker t.Errorf("missing jni %q in %q", jni, jnis) 3217*333d2b36SAndroid Build Coastguard Worker } 3218*333d2b36SAndroid Build Coastguard Worker } 3219*333d2b36SAndroid Build Coastguard Worker }) 3220*333d2b36SAndroid Build Coastguard Worker } 3221*333d2b36SAndroid Build Coastguard Worker} 3222*333d2b36SAndroid Build Coastguard Worker 3223*333d2b36SAndroid Build Coastguard Workerfunc TestUsesLibraries(t *testing.T) { 3224*333d2b36SAndroid Build Coastguard Worker bp := ` 3225*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 3226*333d2b36SAndroid Build Coastguard Worker name: "foo", 3227*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3228*333d2b36SAndroid Build Coastguard Worker api_packages: ["foo"], 3229*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3230*333d2b36SAndroid Build Coastguard Worker } 3231*333d2b36SAndroid Build Coastguard Worker 3232*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 3233*333d2b36SAndroid Build Coastguard Worker name: "qux", 3234*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3235*333d2b36SAndroid Build Coastguard Worker api_packages: ["qux"], 3236*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3237*333d2b36SAndroid Build Coastguard Worker } 3238*333d2b36SAndroid Build Coastguard Worker 3239*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 3240*333d2b36SAndroid Build Coastguard Worker name: "quuz", 3241*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3242*333d2b36SAndroid Build Coastguard Worker api_packages: ["quuz"], 3243*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3244*333d2b36SAndroid Build Coastguard Worker } 3245*333d2b36SAndroid Build Coastguard Worker 3246*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 3247*333d2b36SAndroid Build Coastguard Worker name: "fred", 3248*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3249*333d2b36SAndroid Build Coastguard Worker api_packages: ["fred"], 3250*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3251*333d2b36SAndroid Build Coastguard Worker } 3252*333d2b36SAndroid Build Coastguard Worker 3253*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 3254*333d2b36SAndroid Build Coastguard Worker name: "bar", 3255*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3256*333d2b36SAndroid Build Coastguard Worker api_packages: ["bar"], 3257*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3258*333d2b36SAndroid Build Coastguard Worker } 3259*333d2b36SAndroid Build Coastguard Worker 3260*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 3261*333d2b36SAndroid Build Coastguard Worker name: "runtime-library", 3262*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3263*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3264*333d2b36SAndroid Build Coastguard Worker } 3265*333d2b36SAndroid Build Coastguard Worker 3266*333d2b36SAndroid Build Coastguard Worker java_library { 3267*333d2b36SAndroid Build Coastguard Worker name: "static-runtime-helper", 3268*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3269*333d2b36SAndroid Build Coastguard Worker libs: ["runtime-library.impl"], 3270*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3271*333d2b36SAndroid Build Coastguard Worker } 3272*333d2b36SAndroid Build Coastguard Worker 3273*333d2b36SAndroid Build Coastguard Worker java_library { 3274*333d2b36SAndroid Build Coastguard Worker name: "runtime-required-x", 3275*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3276*333d2b36SAndroid Build Coastguard Worker installable: true, 3277*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3278*333d2b36SAndroid Build Coastguard Worker } 3279*333d2b36SAndroid Build Coastguard Worker 3280*333d2b36SAndroid Build Coastguard Worker java_library { 3281*333d2b36SAndroid Build Coastguard Worker name: "runtime-optional-x", 3282*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3283*333d2b36SAndroid Build Coastguard Worker installable: true, 3284*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3285*333d2b36SAndroid Build Coastguard Worker } 3286*333d2b36SAndroid Build Coastguard Worker 3287*333d2b36SAndroid Build Coastguard Worker android_library { 3288*333d2b36SAndroid Build Coastguard Worker name: "static-x", 3289*333d2b36SAndroid Build Coastguard Worker uses_libs: ["runtime-required-x"], 3290*333d2b36SAndroid Build Coastguard Worker optional_uses_libs: ["runtime-optional-x"], 3291*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3292*333d2b36SAndroid Build Coastguard Worker } 3293*333d2b36SAndroid Build Coastguard Worker 3294*333d2b36SAndroid Build Coastguard Worker java_library { 3295*333d2b36SAndroid Build Coastguard Worker name: "runtime-required-y", 3296*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3297*333d2b36SAndroid Build Coastguard Worker installable: true, 3298*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3299*333d2b36SAndroid Build Coastguard Worker } 3300*333d2b36SAndroid Build Coastguard Worker 3301*333d2b36SAndroid Build Coastguard Worker java_library { 3302*333d2b36SAndroid Build Coastguard Worker name: "runtime-optional-y", 3303*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3304*333d2b36SAndroid Build Coastguard Worker installable: true, 3305*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3306*333d2b36SAndroid Build Coastguard Worker } 3307*333d2b36SAndroid Build Coastguard Worker 3308*333d2b36SAndroid Build Coastguard Worker java_library { 3309*333d2b36SAndroid Build Coastguard Worker name: "static-y", 3310*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3311*333d2b36SAndroid Build Coastguard Worker uses_libs: ["runtime-required-y"], 3312*333d2b36SAndroid Build Coastguard Worker optional_uses_libs: [ 3313*333d2b36SAndroid Build Coastguard Worker "runtime-optional-y", 3314*333d2b36SAndroid Build Coastguard Worker "missing-lib-a", 3315*333d2b36SAndroid Build Coastguard Worker ], 3316*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3317*333d2b36SAndroid Build Coastguard Worker } 3318*333d2b36SAndroid Build Coastguard Worker 3319*333d2b36SAndroid Build Coastguard Worker // A library that has to use "provides_uses_lib", because: 3320*333d2b36SAndroid Build Coastguard Worker // - it is not an SDK library 3321*333d2b36SAndroid Build Coastguard Worker // - its library name is different from its module name 3322*333d2b36SAndroid Build Coastguard Worker java_library { 3323*333d2b36SAndroid Build Coastguard Worker name: "non-sdk-lib", 3324*333d2b36SAndroid Build Coastguard Worker provides_uses_lib: "com.non.sdk.lib", 3325*333d2b36SAndroid Build Coastguard Worker installable: true, 3326*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3327*333d2b36SAndroid Build Coastguard Worker } 3328*333d2b36SAndroid Build Coastguard Worker 3329*333d2b36SAndroid Build Coastguard Worker android_app { 3330*333d2b36SAndroid Build Coastguard Worker name: "app", 3331*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3332*333d2b36SAndroid Build Coastguard Worker libs: [ 3333*333d2b36SAndroid Build Coastguard Worker "qux.impl", 3334*333d2b36SAndroid Build Coastguard Worker "quuz.stubs" 3335*333d2b36SAndroid Build Coastguard Worker ], 3336*333d2b36SAndroid Build Coastguard Worker static_libs: [ 3337*333d2b36SAndroid Build Coastguard Worker "static-runtime-helper", 3338*333d2b36SAndroid Build Coastguard Worker // statically linked component libraries should not pull their SDK libraries, 3339*333d2b36SAndroid Build Coastguard Worker // so "fred" should not be added to class loader context 3340*333d2b36SAndroid Build Coastguard Worker "fred.stubs", 3341*333d2b36SAndroid Build Coastguard Worker "static-x", 3342*333d2b36SAndroid Build Coastguard Worker "static-y", 3343*333d2b36SAndroid Build Coastguard Worker ], 3344*333d2b36SAndroid Build Coastguard Worker uses_libs: [ 3345*333d2b36SAndroid Build Coastguard Worker "foo", 3346*333d2b36SAndroid Build Coastguard Worker "non-sdk-lib" 3347*333d2b36SAndroid Build Coastguard Worker ], 3348*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3349*333d2b36SAndroid Build Coastguard Worker optional_uses_libs: [ 3350*333d2b36SAndroid Build Coastguard Worker "bar", 3351*333d2b36SAndroid Build Coastguard Worker "missing-lib-b", 3352*333d2b36SAndroid Build Coastguard Worker ], 3353*333d2b36SAndroid Build Coastguard Worker } 3354*333d2b36SAndroid Build Coastguard Worker 3355*333d2b36SAndroid Build Coastguard Worker android_app_import { 3356*333d2b36SAndroid Build Coastguard Worker name: "prebuilt", 3357*333d2b36SAndroid Build Coastguard Worker apk: "prebuilts/apk/app.apk", 3358*333d2b36SAndroid Build Coastguard Worker certificate: "platform", 3359*333d2b36SAndroid Build Coastguard Worker uses_libs: [ 3360*333d2b36SAndroid Build Coastguard Worker "foo", 3361*333d2b36SAndroid Build Coastguard Worker "non-sdk-lib", 3362*333d2b36SAndroid Build Coastguard Worker "android.test.runner" 3363*333d2b36SAndroid Build Coastguard Worker ], 3364*333d2b36SAndroid Build Coastguard Worker optional_uses_libs: [ 3365*333d2b36SAndroid Build Coastguard Worker "bar", 3366*333d2b36SAndroid Build Coastguard Worker "missing-lib-b", 3367*333d2b36SAndroid Build Coastguard Worker ], 3368*333d2b36SAndroid Build Coastguard Worker } 3369*333d2b36SAndroid Build Coastguard Worker ` 3370*333d2b36SAndroid Build Coastguard Worker 3371*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 3372*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 3373*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaSdkLibraryFiles, 3374*333d2b36SAndroid Build Coastguard Worker FixtureWithLastReleaseApis("runtime-library", "foo", "quuz", "qux", "bar", "fred"), 3375*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 3376*333d2b36SAndroid Build Coastguard Worker variables.BuildWarningBadOptionalUsesLibsAllowlist = []string{"app", "prebuilt"} 3377*333d2b36SAndroid Build Coastguard Worker }), 3378*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 3379*333d2b36SAndroid Build Coastguard Worker 3380*333d2b36SAndroid Build Coastguard Worker app := result.ModuleForTests("app", "android_common") 3381*333d2b36SAndroid Build Coastguard Worker prebuilt := result.ModuleForTests("prebuilt", "android_common") 3382*333d2b36SAndroid Build Coastguard Worker 3383*333d2b36SAndroid Build Coastguard Worker // Test that implicit dependencies on java_sdk_library instances are passed to the manifest. 3384*333d2b36SAndroid Build Coastguard Worker // These also include explicit `uses_libs`/`optional_uses_libs` entries, as they may be 3385*333d2b36SAndroid Build Coastguard Worker // propagated from dependencies. 3386*333d2b36SAndroid Build Coastguard Worker actualManifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"] 3387*333d2b36SAndroid Build Coastguard Worker expectManifestFixerArgs := `--extract-native-libs=true ` + 3388*333d2b36SAndroid Build Coastguard Worker `--uses-library foo ` + 3389*333d2b36SAndroid Build Coastguard Worker `--uses-library com.non.sdk.lib ` + 3390*333d2b36SAndroid Build Coastguard Worker `--uses-library qux ` + 3391*333d2b36SAndroid Build Coastguard Worker `--uses-library quuz ` + 3392*333d2b36SAndroid Build Coastguard Worker `--uses-library runtime-library ` + 3393*333d2b36SAndroid Build Coastguard Worker `--uses-library runtime-required-x ` + 3394*333d2b36SAndroid Build Coastguard Worker `--uses-library runtime-required-y ` + 3395*333d2b36SAndroid Build Coastguard Worker `--optional-uses-library bar ` + 3396*333d2b36SAndroid Build Coastguard Worker `--optional-uses-library runtime-optional-x ` + 3397*333d2b36SAndroid Build Coastguard Worker `--optional-uses-library runtime-optional-y` 3398*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "manifest_fixer args", actualManifestFixerArgs, expectManifestFixerArgs) 3399*333d2b36SAndroid Build Coastguard Worker 3400*333d2b36SAndroid Build Coastguard Worker // Test that all libraries are verified (library order matters). 3401*333d2b36SAndroid Build Coastguard Worker verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command 3402*333d2b36SAndroid Build Coastguard Worker verifyArgs := `--uses-library foo ` + 3403*333d2b36SAndroid Build Coastguard Worker `--uses-library com.non.sdk.lib ` + 3404*333d2b36SAndroid Build Coastguard Worker `--uses-library qux ` + 3405*333d2b36SAndroid Build Coastguard Worker `--uses-library quuz ` + 3406*333d2b36SAndroid Build Coastguard Worker `--uses-library runtime-library ` + 3407*333d2b36SAndroid Build Coastguard Worker `--uses-library runtime-required-x ` + 3408*333d2b36SAndroid Build Coastguard Worker `--uses-library runtime-required-y ` + 3409*333d2b36SAndroid Build Coastguard Worker `--optional-uses-library bar ` + 3410*333d2b36SAndroid Build Coastguard Worker `--optional-uses-library runtime-optional-x ` + 3411*333d2b36SAndroid Build Coastguard Worker `--optional-uses-library runtime-optional-y ` + 3412*333d2b36SAndroid Build Coastguard Worker `--missing-optional-uses-library missing-lib-b ` + 3413*333d2b36SAndroid Build Coastguard Worker `--missing-optional-uses-library missing-lib-a` 3414*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "verify cmd args", verifyCmd, verifyArgs) 3415*333d2b36SAndroid Build Coastguard Worker 3416*333d2b36SAndroid Build Coastguard Worker // Test that all libraries are verified for an APK (library order matters). 3417*333d2b36SAndroid Build Coastguard Worker verifyApkCmd := prebuilt.Rule("verify_uses_libraries").RuleParams.Command 3418*333d2b36SAndroid Build Coastguard Worker verifyApkArgs := `--uses-library foo ` + 3419*333d2b36SAndroid Build Coastguard Worker `--uses-library com.non.sdk.lib ` + 3420*333d2b36SAndroid Build Coastguard Worker `--uses-library android.test.runner ` + 3421*333d2b36SAndroid Build Coastguard Worker `--optional-uses-library bar ` + 3422*333d2b36SAndroid Build Coastguard Worker `--missing-optional-uses-library missing-lib-b ` 3423*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "verify apk cmd args", verifyApkCmd, verifyApkArgs) 3424*333d2b36SAndroid Build Coastguard Worker 3425*333d2b36SAndroid Build Coastguard Worker // Test that necessary args are passed for constructing CLC in Ninja phase. 3426*333d2b36SAndroid Build Coastguard Worker cmd := app.Rule("dexpreopt").RuleParams.Command 3427*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "dexpreopt app cmd context", cmd, "--context-json=") 3428*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "dexpreopt app cmd product_packages", cmd, 3429*333d2b36SAndroid Build Coastguard Worker "--product-packages=out/soong/.intermediates/app/android_common/dexpreopt/app/product_packages.txt") 3430*333d2b36SAndroid Build Coastguard Worker} 3431*333d2b36SAndroid Build Coastguard Worker 3432*333d2b36SAndroid Build Coastguard Workerfunc TestDexpreoptBcp(t *testing.T) { 3433*333d2b36SAndroid Build Coastguard Worker bp := ` 3434*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 3435*333d2b36SAndroid Build Coastguard Worker name: "foo", 3436*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3437*333d2b36SAndroid Build Coastguard Worker api_packages: ["foo"], 3438*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3439*333d2b36SAndroid Build Coastguard Worker } 3440*333d2b36SAndroid Build Coastguard Worker 3441*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 3442*333d2b36SAndroid Build Coastguard Worker name: "bar", 3443*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3444*333d2b36SAndroid Build Coastguard Worker api_packages: ["bar"], 3445*333d2b36SAndroid Build Coastguard Worker permitted_packages: ["bar"], 3446*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3447*333d2b36SAndroid Build Coastguard Worker } 3448*333d2b36SAndroid Build Coastguard Worker 3449*333d2b36SAndroid Build Coastguard Worker android_app { 3450*333d2b36SAndroid Build Coastguard Worker name: "app", 3451*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3452*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3453*333d2b36SAndroid Build Coastguard Worker } 3454*333d2b36SAndroid Build Coastguard Worker ` 3455*333d2b36SAndroid Build Coastguard Worker 3456*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 3457*333d2b36SAndroid Build Coastguard Worker name string 3458*333d2b36SAndroid Build Coastguard Worker with bool 3459*333d2b36SAndroid Build Coastguard Worker expect string 3460*333d2b36SAndroid Build Coastguard Worker }{ 3461*333d2b36SAndroid Build Coastguard Worker { 3462*333d2b36SAndroid Build Coastguard Worker name: "with updatable bcp", 3463*333d2b36SAndroid Build Coastguard Worker with: true, 3464*333d2b36SAndroid Build Coastguard Worker expect: "/system/framework/foo.jar:/system/framework/bar.jar", 3465*333d2b36SAndroid Build Coastguard Worker }, 3466*333d2b36SAndroid Build Coastguard Worker { 3467*333d2b36SAndroid Build Coastguard Worker name: "without updatable bcp", 3468*333d2b36SAndroid Build Coastguard Worker with: false, 3469*333d2b36SAndroid Build Coastguard Worker expect: "/system/framework/foo.jar", 3470*333d2b36SAndroid Build Coastguard Worker }, 3471*333d2b36SAndroid Build Coastguard Worker } 3472*333d2b36SAndroid Build Coastguard Worker 3473*333d2b36SAndroid Build Coastguard Worker for _, test := range testCases { 3474*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 3475*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 3476*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 3477*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaSdkLibraryFiles, 3478*333d2b36SAndroid Build Coastguard Worker FixtureWithLastReleaseApis("runtime-library", "foo", "bar"), 3479*333d2b36SAndroid Build Coastguard Worker dexpreopt.FixtureSetBootJars("platform:foo"), 3480*333d2b36SAndroid Build Coastguard Worker dexpreopt.FixtureSetApexBootJars("platform:bar"), 3481*333d2b36SAndroid Build Coastguard Worker dexpreopt.FixtureSetPreoptWithUpdatableBcp(test.with), 3482*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 3483*333d2b36SAndroid Build Coastguard Worker 3484*333d2b36SAndroid Build Coastguard Worker app := result.ModuleForTests("app", "android_common") 3485*333d2b36SAndroid Build Coastguard Worker cmd := app.Rule("dexpreopt").RuleParams.Command 3486*333d2b36SAndroid Build Coastguard Worker bcp := " -Xbootclasspath-locations:" + test.expect + " " // space at the end matters 3487*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "dexpreopt app bcp", cmd, bcp) 3488*333d2b36SAndroid Build Coastguard Worker }) 3489*333d2b36SAndroid Build Coastguard Worker } 3490*333d2b36SAndroid Build Coastguard Worker} 3491*333d2b36SAndroid Build Coastguard Worker 3492*333d2b36SAndroid Build Coastguard Workerfunc TestCodelessApp(t *testing.T) { 3493*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 3494*333d2b36SAndroid Build Coastguard Worker name string 3495*333d2b36SAndroid Build Coastguard Worker bp string 3496*333d2b36SAndroid Build Coastguard Worker noCode bool 3497*333d2b36SAndroid Build Coastguard Worker }{ 3498*333d2b36SAndroid Build Coastguard Worker { 3499*333d2b36SAndroid Build Coastguard Worker name: "normal", 3500*333d2b36SAndroid Build Coastguard Worker bp: ` 3501*333d2b36SAndroid Build Coastguard Worker android_app { 3502*333d2b36SAndroid Build Coastguard Worker name: "foo", 3503*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3504*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3505*333d2b36SAndroid Build Coastguard Worker } 3506*333d2b36SAndroid Build Coastguard Worker `, 3507*333d2b36SAndroid Build Coastguard Worker noCode: false, 3508*333d2b36SAndroid Build Coastguard Worker }, 3509*333d2b36SAndroid Build Coastguard Worker { 3510*333d2b36SAndroid Build Coastguard Worker name: "app without sources", 3511*333d2b36SAndroid Build Coastguard Worker bp: ` 3512*333d2b36SAndroid Build Coastguard Worker android_app { 3513*333d2b36SAndroid Build Coastguard Worker name: "foo", 3514*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3515*333d2b36SAndroid Build Coastguard Worker } 3516*333d2b36SAndroid Build Coastguard Worker `, 3517*333d2b36SAndroid Build Coastguard Worker noCode: true, 3518*333d2b36SAndroid Build Coastguard Worker }, 3519*333d2b36SAndroid Build Coastguard Worker { 3520*333d2b36SAndroid Build Coastguard Worker name: "app with libraries", 3521*333d2b36SAndroid Build Coastguard Worker bp: ` 3522*333d2b36SAndroid Build Coastguard Worker android_app { 3523*333d2b36SAndroid Build Coastguard Worker name: "foo", 3524*333d2b36SAndroid Build Coastguard Worker static_libs: ["lib"], 3525*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3526*333d2b36SAndroid Build Coastguard Worker } 3527*333d2b36SAndroid Build Coastguard Worker 3528*333d2b36SAndroid Build Coastguard Worker java_library { 3529*333d2b36SAndroid Build Coastguard Worker name: "lib", 3530*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3531*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3532*333d2b36SAndroid Build Coastguard Worker } 3533*333d2b36SAndroid Build Coastguard Worker `, 3534*333d2b36SAndroid Build Coastguard Worker noCode: false, 3535*333d2b36SAndroid Build Coastguard Worker }, 3536*333d2b36SAndroid Build Coastguard Worker { 3537*333d2b36SAndroid Build Coastguard Worker name: "app with sourceless libraries", 3538*333d2b36SAndroid Build Coastguard Worker bp: ` 3539*333d2b36SAndroid Build Coastguard Worker android_app { 3540*333d2b36SAndroid Build Coastguard Worker name: "foo", 3541*333d2b36SAndroid Build Coastguard Worker static_libs: ["lib"], 3542*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3543*333d2b36SAndroid Build Coastguard Worker } 3544*333d2b36SAndroid Build Coastguard Worker 3545*333d2b36SAndroid Build Coastguard Worker java_library { 3546*333d2b36SAndroid Build Coastguard Worker name: "lib", 3547*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3548*333d2b36SAndroid Build Coastguard Worker } 3549*333d2b36SAndroid Build Coastguard Worker `, 3550*333d2b36SAndroid Build Coastguard Worker // TODO(jungjw): this should probably be true 3551*333d2b36SAndroid Build Coastguard Worker noCode: false, 3552*333d2b36SAndroid Build Coastguard Worker }, 3553*333d2b36SAndroid Build Coastguard Worker } 3554*333d2b36SAndroid Build Coastguard Worker 3555*333d2b36SAndroid Build Coastguard Worker for _, test := range testCases { 3556*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 3557*333d2b36SAndroid Build Coastguard Worker ctx := testApp(t, test.bp) 3558*333d2b36SAndroid Build Coastguard Worker 3559*333d2b36SAndroid Build Coastguard Worker foo := ctx.ModuleForTests("foo", "android_common") 3560*333d2b36SAndroid Build Coastguard Worker manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"] 3561*333d2b36SAndroid Build Coastguard Worker if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode { 3562*333d2b36SAndroid Build Coastguard Worker t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs) 3563*333d2b36SAndroid Build Coastguard Worker } 3564*333d2b36SAndroid Build Coastguard Worker }) 3565*333d2b36SAndroid Build Coastguard Worker } 3566*333d2b36SAndroid Build Coastguard Worker} 3567*333d2b36SAndroid Build Coastguard Worker 3568*333d2b36SAndroid Build Coastguard Workerfunc TestUncompressDex(t *testing.T) { 3569*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 3570*333d2b36SAndroid Build Coastguard Worker name string 3571*333d2b36SAndroid Build Coastguard Worker bp string 3572*333d2b36SAndroid Build Coastguard Worker 3573*333d2b36SAndroid Build Coastguard Worker uncompressedPlatform bool 3574*333d2b36SAndroid Build Coastguard Worker uncompressedUnbundled bool 3575*333d2b36SAndroid Build Coastguard Worker }{ 3576*333d2b36SAndroid Build Coastguard Worker { 3577*333d2b36SAndroid Build Coastguard Worker name: "normal", 3578*333d2b36SAndroid Build Coastguard Worker bp: ` 3579*333d2b36SAndroid Build Coastguard Worker android_app { 3580*333d2b36SAndroid Build Coastguard Worker name: "foo", 3581*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3582*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3583*333d2b36SAndroid Build Coastguard Worker } 3584*333d2b36SAndroid Build Coastguard Worker `, 3585*333d2b36SAndroid Build Coastguard Worker uncompressedPlatform: true, 3586*333d2b36SAndroid Build Coastguard Worker uncompressedUnbundled: false, 3587*333d2b36SAndroid Build Coastguard Worker }, 3588*333d2b36SAndroid Build Coastguard Worker { 3589*333d2b36SAndroid Build Coastguard Worker name: "use_embedded_dex", 3590*333d2b36SAndroid Build Coastguard Worker bp: ` 3591*333d2b36SAndroid Build Coastguard Worker android_app { 3592*333d2b36SAndroid Build Coastguard Worker name: "foo", 3593*333d2b36SAndroid Build Coastguard Worker use_embedded_dex: true, 3594*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3595*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3596*333d2b36SAndroid Build Coastguard Worker } 3597*333d2b36SAndroid Build Coastguard Worker `, 3598*333d2b36SAndroid Build Coastguard Worker uncompressedPlatform: true, 3599*333d2b36SAndroid Build Coastguard Worker uncompressedUnbundled: true, 3600*333d2b36SAndroid Build Coastguard Worker }, 3601*333d2b36SAndroid Build Coastguard Worker { 3602*333d2b36SAndroid Build Coastguard Worker name: "privileged", 3603*333d2b36SAndroid Build Coastguard Worker bp: ` 3604*333d2b36SAndroid Build Coastguard Worker android_app { 3605*333d2b36SAndroid Build Coastguard Worker name: "foo", 3606*333d2b36SAndroid Build Coastguard Worker privileged: true, 3607*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3608*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3609*333d2b36SAndroid Build Coastguard Worker } 3610*333d2b36SAndroid Build Coastguard Worker `, 3611*333d2b36SAndroid Build Coastguard Worker uncompressedPlatform: true, 3612*333d2b36SAndroid Build Coastguard Worker uncompressedUnbundled: true, 3613*333d2b36SAndroid Build Coastguard Worker }, 3614*333d2b36SAndroid Build Coastguard Worker { 3615*333d2b36SAndroid Build Coastguard Worker name: "normal_uncompress_dex_true", 3616*333d2b36SAndroid Build Coastguard Worker bp: ` 3617*333d2b36SAndroid Build Coastguard Worker android_app { 3618*333d2b36SAndroid Build Coastguard Worker name: "foo", 3619*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3620*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3621*333d2b36SAndroid Build Coastguard Worker uncompress_dex: true, 3622*333d2b36SAndroid Build Coastguard Worker } 3623*333d2b36SAndroid Build Coastguard Worker `, 3624*333d2b36SAndroid Build Coastguard Worker uncompressedPlatform: true, 3625*333d2b36SAndroid Build Coastguard Worker uncompressedUnbundled: true, 3626*333d2b36SAndroid Build Coastguard Worker }, 3627*333d2b36SAndroid Build Coastguard Worker { 3628*333d2b36SAndroid Build Coastguard Worker name: "normal_uncompress_dex_false", 3629*333d2b36SAndroid Build Coastguard Worker bp: ` 3630*333d2b36SAndroid Build Coastguard Worker android_app { 3631*333d2b36SAndroid Build Coastguard Worker name: "foo", 3632*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 3633*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3634*333d2b36SAndroid Build Coastguard Worker uncompress_dex: false, 3635*333d2b36SAndroid Build Coastguard Worker } 3636*333d2b36SAndroid Build Coastguard Worker `, 3637*333d2b36SAndroid Build Coastguard Worker uncompressedPlatform: false, 3638*333d2b36SAndroid Build Coastguard Worker uncompressedUnbundled: false, 3639*333d2b36SAndroid Build Coastguard Worker }, 3640*333d2b36SAndroid Build Coastguard Worker } 3641*333d2b36SAndroid Build Coastguard Worker 3642*333d2b36SAndroid Build Coastguard Worker test := func(t *testing.T, bp string, want bool, unbundled bool) { 3643*333d2b36SAndroid Build Coastguard Worker t.Helper() 3644*333d2b36SAndroid Build Coastguard Worker 3645*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 3646*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 3647*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithPrebuiltsOfCurrentApi, 3648*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 3649*333d2b36SAndroid Build Coastguard Worker if unbundled { 3650*333d2b36SAndroid Build Coastguard Worker variables.Unbundled_build = proptools.BoolPtr(true) 3651*333d2b36SAndroid Build Coastguard Worker variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true) 3652*333d2b36SAndroid Build Coastguard Worker } 3653*333d2b36SAndroid Build Coastguard Worker }), 3654*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 3655*333d2b36SAndroid Build Coastguard Worker 3656*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", "android_common") 3657*333d2b36SAndroid Build Coastguard Worker dex := foo.Rule("r8") 3658*333d2b36SAndroid Build Coastguard Worker uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0") 3659*333d2b36SAndroid Build Coastguard Worker aligned := foo.MaybeRule("zipalign").Rule != nil 3660*333d2b36SAndroid Build Coastguard Worker 3661*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, "uncompressed in dex", want, uncompressedInDexJar) 3662*333d2b36SAndroid Build Coastguard Worker 3663*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, "aligne", want, aligned) 3664*333d2b36SAndroid Build Coastguard Worker } 3665*333d2b36SAndroid Build Coastguard Worker 3666*333d2b36SAndroid Build Coastguard Worker for _, tt := range testCases { 3667*333d2b36SAndroid Build Coastguard Worker t.Run(tt.name, func(t *testing.T) { 3668*333d2b36SAndroid Build Coastguard Worker t.Run("platform", func(t *testing.T) { 3669*333d2b36SAndroid Build Coastguard Worker test(t, tt.bp, tt.uncompressedPlatform, false) 3670*333d2b36SAndroid Build Coastguard Worker }) 3671*333d2b36SAndroid Build Coastguard Worker t.Run("unbundled", func(t *testing.T) { 3672*333d2b36SAndroid Build Coastguard Worker test(t, tt.bp, tt.uncompressedUnbundled, true) 3673*333d2b36SAndroid Build Coastguard Worker }) 3674*333d2b36SAndroid Build Coastguard Worker }) 3675*333d2b36SAndroid Build Coastguard Worker } 3676*333d2b36SAndroid Build Coastguard Worker} 3677*333d2b36SAndroid Build Coastguard Worker 3678*333d2b36SAndroid Build Coastguard Workerfunc checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) { 3679*333d2b36SAndroid Build Coastguard Worker if expectedValue != "" { 3680*333d2b36SAndroid Build Coastguard Worker expectedFlag := "--" + flagName + " " + expectedValue 3681*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(aapt2Flags, expectedFlag) { 3682*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags) 3683*333d2b36SAndroid Build Coastguard Worker } 3684*333d2b36SAndroid Build Coastguard Worker } else { 3685*333d2b36SAndroid Build Coastguard Worker unexpectedFlag := "--" + flagName 3686*333d2b36SAndroid Build Coastguard Worker if strings.Contains(aapt2Flags, unexpectedFlag) { 3687*333d2b36SAndroid Build Coastguard Worker t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags) 3688*333d2b36SAndroid Build Coastguard Worker } 3689*333d2b36SAndroid Build Coastguard Worker } 3690*333d2b36SAndroid Build Coastguard Worker} 3691*333d2b36SAndroid Build Coastguard Worker 3692*333d2b36SAndroid Build Coastguard Workerfunc TestExportedProguardFlagFiles(t *testing.T) { 3693*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 3694*333d2b36SAndroid Build Coastguard Worker android_app { 3695*333d2b36SAndroid Build Coastguard Worker name: "foo", 3696*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3697*333d2b36SAndroid Build Coastguard Worker static_libs: [ 3698*333d2b36SAndroid Build Coastguard Worker "lib1", 3699*333d2b36SAndroid Build Coastguard Worker "lib3", 3700*333d2b36SAndroid Build Coastguard Worker ], 3701*333d2b36SAndroid Build Coastguard Worker } 3702*333d2b36SAndroid Build Coastguard Worker 3703*333d2b36SAndroid Build Coastguard Worker android_library { 3704*333d2b36SAndroid Build Coastguard Worker name: "lib1", 3705*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3706*333d2b36SAndroid Build Coastguard Worker optimize: { 3707*333d2b36SAndroid Build Coastguard Worker proguard_flags_files: ["lib1proguard.cfg"], 3708*333d2b36SAndroid Build Coastguard Worker }, 3709*333d2b36SAndroid Build Coastguard Worker static_libs: ["lib2"], 3710*333d2b36SAndroid Build Coastguard Worker } 3711*333d2b36SAndroid Build Coastguard Worker 3712*333d2b36SAndroid Build Coastguard Worker android_library { 3713*333d2b36SAndroid Build Coastguard Worker name: "lib2", 3714*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3715*333d2b36SAndroid Build Coastguard Worker optimize: { 3716*333d2b36SAndroid Build Coastguard Worker proguard_flags_files: ["lib2proguard.cfg"], 3717*333d2b36SAndroid Build Coastguard Worker } 3718*333d2b36SAndroid Build Coastguard Worker } 3719*333d2b36SAndroid Build Coastguard Worker 3720*333d2b36SAndroid Build Coastguard Worker android_library_import { 3721*333d2b36SAndroid Build Coastguard Worker name: "lib3", 3722*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3723*333d2b36SAndroid Build Coastguard Worker aars: ["lib3.aar"], 3724*333d2b36SAndroid Build Coastguard Worker static_libs: ["lib4"], 3725*333d2b36SAndroid Build Coastguard Worker } 3726*333d2b36SAndroid Build Coastguard Worker 3727*333d2b36SAndroid Build Coastguard Worker android_library { 3728*333d2b36SAndroid Build Coastguard Worker name: "lib4", 3729*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3730*333d2b36SAndroid Build Coastguard Worker optimize: { 3731*333d2b36SAndroid Build Coastguard Worker proguard_flags_files: ["lib4proguard.cfg"], 3732*333d2b36SAndroid Build Coastguard Worker } 3733*333d2b36SAndroid Build Coastguard Worker } 3734*333d2b36SAndroid Build Coastguard Worker 3735*333d2b36SAndroid Build Coastguard Worker 3736*333d2b36SAndroid Build Coastguard Worker `) 3737*333d2b36SAndroid Build Coastguard Worker 3738*333d2b36SAndroid Build Coastguard Worker m := ctx.ModuleForTests("foo", "android_common") 3739*333d2b36SAndroid Build Coastguard Worker r8 := m.Rule("java.r8") 3740*333d2b36SAndroid Build Coastguard Worker implicits := r8.Implicits.RelativeToTop().Strings() 3741*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "r8 implicits", implicits, "lib1proguard.cfg") 3742*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "r8 implicits", implicits, "lib2proguard.cfg") 3743*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "r8 implicits", implicits, "lib4proguard.cfg") 3744*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "r8 implicits", implicits, "out/soong/.intermediates/lib3/android_common/aar/proguard.txt") 3745*333d2b36SAndroid Build Coastguard Worker 3746*333d2b36SAndroid Build Coastguard Worker flags := r8.Args["r8Flags"] 3747*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib1proguard.cfg") 3748*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib2proguard.cfg") 3749*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib4proguard.cfg") 3750*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "r8 flags", flags, "-include out/soong/.intermediates/lib3/android_common/aar/proguard.txt") 3751*333d2b36SAndroid Build Coastguard Worker} 3752*333d2b36SAndroid Build Coastguard Worker 3753*333d2b36SAndroid Build Coastguard Workerfunc TestTargetSdkVersionManifestFixer(t *testing.T) { 3754*333d2b36SAndroid Build Coastguard Worker platform_sdk_codename := "Tiramisu" 3755*333d2b36SAndroid Build Coastguard Worker platform_sdk_version := 33 3756*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 3757*333d2b36SAndroid Build Coastguard Worker name string 3758*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp string 3759*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected string 3760*333d2b36SAndroid Build Coastguard Worker unbundledBuild bool 3761*333d2b36SAndroid Build Coastguard Worker platformSdkFinal bool 3762*333d2b36SAndroid Build Coastguard Worker }{ 3763*333d2b36SAndroid Build Coastguard Worker { 3764*333d2b36SAndroid Build Coastguard Worker name: "Non-Unbundled build: Android.bp has targetSdkVersion", 3765*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp: "30", 3766*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: "30", 3767*333d2b36SAndroid Build Coastguard Worker unbundledBuild: false, 3768*333d2b36SAndroid Build Coastguard Worker }, 3769*333d2b36SAndroid Build Coastguard Worker { 3770*333d2b36SAndroid Build Coastguard Worker name: "Unbundled build: Android.bp has targetSdkVersion", 3771*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp: "30", 3772*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: "30", 3773*333d2b36SAndroid Build Coastguard Worker unbundledBuild: true, 3774*333d2b36SAndroid Build Coastguard Worker }, 3775*333d2b36SAndroid Build Coastguard Worker { 3776*333d2b36SAndroid Build Coastguard Worker name: "Non-Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename", 3777*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp: platform_sdk_codename, 3778*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: platform_sdk_codename, 3779*333d2b36SAndroid Build Coastguard Worker unbundledBuild: false, 3780*333d2b36SAndroid Build Coastguard Worker }, 3781*333d2b36SAndroid Build Coastguard Worker { 3782*333d2b36SAndroid Build Coastguard Worker name: "Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename", 3783*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp: platform_sdk_codename, 3784*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: "10000", 3785*333d2b36SAndroid Build Coastguard Worker unbundledBuild: true, 3786*333d2b36SAndroid Build Coastguard Worker }, 3787*333d2b36SAndroid Build Coastguard Worker 3788*333d2b36SAndroid Build Coastguard Worker { 3789*333d2b36SAndroid Build Coastguard Worker name: "Non-Unbundled build: Android.bp has no targetSdkVersion", 3790*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: platform_sdk_codename, 3791*333d2b36SAndroid Build Coastguard Worker unbundledBuild: false, 3792*333d2b36SAndroid Build Coastguard Worker }, 3793*333d2b36SAndroid Build Coastguard Worker { 3794*333d2b36SAndroid Build Coastguard Worker name: "Unbundled build: Android.bp has no targetSdkVersion", 3795*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: "10000", 3796*333d2b36SAndroid Build Coastguard Worker unbundledBuild: true, 3797*333d2b36SAndroid Build Coastguard Worker }, 3798*333d2b36SAndroid Build Coastguard Worker { 3799*333d2b36SAndroid Build Coastguard Worker name: "Bundled build in REL branches", 3800*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: "33", 3801*333d2b36SAndroid Build Coastguard Worker unbundledBuild: false, 3802*333d2b36SAndroid Build Coastguard Worker platformSdkFinal: true, 3803*333d2b36SAndroid Build Coastguard Worker }, 3804*333d2b36SAndroid Build Coastguard Worker } 3805*333d2b36SAndroid Build Coastguard Worker for _, testCase := range testCases { 3806*333d2b36SAndroid Build Coastguard Worker targetSdkVersionTemplate := "" 3807*333d2b36SAndroid Build Coastguard Worker if testCase.targetSdkVersionInBp != "" { 3808*333d2b36SAndroid Build Coastguard Worker targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, testCase.targetSdkVersionInBp) 3809*333d2b36SAndroid Build Coastguard Worker } 3810*333d2b36SAndroid Build Coastguard Worker bp := fmt.Sprintf(` 3811*333d2b36SAndroid Build Coastguard Worker android_app { 3812*333d2b36SAndroid Build Coastguard Worker name: "foo", 3813*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3814*333d2b36SAndroid Build Coastguard Worker %s 3815*333d2b36SAndroid Build Coastguard Worker } 3816*333d2b36SAndroid Build Coastguard Worker `, targetSdkVersionTemplate) 3817*333d2b36SAndroid Build Coastguard Worker fixture := android.GroupFixturePreparers( 3818*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 3819*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 3820*333d2b36SAndroid Build Coastguard Worker if testCase.platformSdkFinal { 3821*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_final = proptools.BoolPtr(true) 3822*333d2b36SAndroid Build Coastguard Worker } 3823*333d2b36SAndroid Build Coastguard Worker // explicitly set platform_sdk_codename to make the test deterministic 3824*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_codename = &platform_sdk_codename 3825*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_version = &platform_sdk_version 3826*333d2b36SAndroid Build Coastguard Worker variables.Platform_version_active_codenames = []string{platform_sdk_codename} 3827*333d2b36SAndroid Build Coastguard Worker // create a non-empty list if unbundledBuild==true 3828*333d2b36SAndroid Build Coastguard Worker if testCase.unbundledBuild { 3829*333d2b36SAndroid Build Coastguard Worker variables.Unbundled_build_apps = []string{"apex_a", "apex_b"} 3830*333d2b36SAndroid Build Coastguard Worker } 3831*333d2b36SAndroid Build Coastguard Worker }), 3832*333d2b36SAndroid Build Coastguard Worker ) 3833*333d2b36SAndroid Build Coastguard Worker 3834*333d2b36SAndroid Build Coastguard Worker result := fixture.RunTestWithBp(t, bp) 3835*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", "android_common") 3836*333d2b36SAndroid Build Coastguard Worker 3837*333d2b36SAndroid Build Coastguard Worker manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"] 3838*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected) 3839*333d2b36SAndroid Build Coastguard Worker } 3840*333d2b36SAndroid Build Coastguard Worker} 3841*333d2b36SAndroid Build Coastguard Worker 3842*333d2b36SAndroid Build Coastguard Workerfunc TestDefaultAppTargetSdkVersionForUpdatableModules(t *testing.T) { 3843*333d2b36SAndroid Build Coastguard Worker platform_sdk_codename := "Tiramisu" 3844*333d2b36SAndroid Build Coastguard Worker platform_sdk_version := 33 3845*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 3846*333d2b36SAndroid Build Coastguard Worker name string 3847*333d2b36SAndroid Build Coastguard Worker platform_sdk_final bool 3848*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp *string 3849*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected *string 3850*333d2b36SAndroid Build Coastguard Worker updatable bool 3851*333d2b36SAndroid Build Coastguard Worker }{ 3852*333d2b36SAndroid Build Coastguard Worker { 3853*333d2b36SAndroid Build Coastguard Worker name: "Non-Updatable Module: Android.bp has older targetSdkVersion", 3854*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp: proptools.StringPtr("29"), 3855*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: proptools.StringPtr("29"), 3856*333d2b36SAndroid Build Coastguard Worker updatable: false, 3857*333d2b36SAndroid Build Coastguard Worker }, 3858*333d2b36SAndroid Build Coastguard Worker { 3859*333d2b36SAndroid Build Coastguard Worker name: "Updatable Module: Android.bp has older targetSdkVersion", 3860*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp: proptools.StringPtr("30"), 3861*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: proptools.StringPtr("30"), 3862*333d2b36SAndroid Build Coastguard Worker updatable: true, 3863*333d2b36SAndroid Build Coastguard Worker }, 3864*333d2b36SAndroid Build Coastguard Worker { 3865*333d2b36SAndroid Build Coastguard Worker name: "Updatable Module: Android.bp has no targetSdkVersion", 3866*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: proptools.StringPtr("10000"), 3867*333d2b36SAndroid Build Coastguard Worker updatable: true, 3868*333d2b36SAndroid Build Coastguard Worker }, 3869*333d2b36SAndroid Build Coastguard Worker { 3870*333d2b36SAndroid Build Coastguard Worker name: "[SDK finalised] Non-Updatable Module: Android.bp has older targetSdkVersion", 3871*333d2b36SAndroid Build Coastguard Worker platform_sdk_final: true, 3872*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp: proptools.StringPtr("30"), 3873*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: proptools.StringPtr("30"), 3874*333d2b36SAndroid Build Coastguard Worker updatable: false, 3875*333d2b36SAndroid Build Coastguard Worker }, 3876*333d2b36SAndroid Build Coastguard Worker { 3877*333d2b36SAndroid Build Coastguard Worker name: "[SDK finalised] Updatable Module: Android.bp has older targetSdkVersion", 3878*333d2b36SAndroid Build Coastguard Worker platform_sdk_final: true, 3879*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp: proptools.StringPtr("30"), 3880*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: proptools.StringPtr("30"), 3881*333d2b36SAndroid Build Coastguard Worker updatable: true, 3882*333d2b36SAndroid Build Coastguard Worker }, 3883*333d2b36SAndroid Build Coastguard Worker { 3884*333d2b36SAndroid Build Coastguard Worker name: "[SDK finalised] Updatable Module: Android.bp has targetSdkVersion as platform sdk codename", 3885*333d2b36SAndroid Build Coastguard Worker platform_sdk_final: true, 3886*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp: proptools.StringPtr(platform_sdk_codename), 3887*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: proptools.StringPtr("33"), 3888*333d2b36SAndroid Build Coastguard Worker updatable: true, 3889*333d2b36SAndroid Build Coastguard Worker }, 3890*333d2b36SAndroid Build Coastguard Worker { 3891*333d2b36SAndroid Build Coastguard Worker name: "[SDK finalised] Updatable Module: Android.bp has no targetSdkVersion", 3892*333d2b36SAndroid Build Coastguard Worker platform_sdk_final: true, 3893*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: proptools.StringPtr("33"), 3894*333d2b36SAndroid Build Coastguard Worker updatable: true, 3895*333d2b36SAndroid Build Coastguard Worker }, 3896*333d2b36SAndroid Build Coastguard Worker } 3897*333d2b36SAndroid Build Coastguard Worker for _, testCase := range testCases { 3898*333d2b36SAndroid Build Coastguard Worker targetSdkVersionTemplate := "" 3899*333d2b36SAndroid Build Coastguard Worker if testCase.targetSdkVersionInBp != nil { 3900*333d2b36SAndroid Build Coastguard Worker targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, *testCase.targetSdkVersionInBp) 3901*333d2b36SAndroid Build Coastguard Worker } 3902*333d2b36SAndroid Build Coastguard Worker bp := fmt.Sprintf(` 3903*333d2b36SAndroid Build Coastguard Worker android_app { 3904*333d2b36SAndroid Build Coastguard Worker name: "foo", 3905*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3906*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 3907*333d2b36SAndroid Build Coastguard Worker %s 3908*333d2b36SAndroid Build Coastguard Worker updatable: %t, 3909*333d2b36SAndroid Build Coastguard Worker enforce_default_target_sdk_version: %t 3910*333d2b36SAndroid Build Coastguard Worker } 3911*333d2b36SAndroid Build Coastguard Worker `, targetSdkVersionTemplate, testCase.updatable, testCase.updatable) // enforce default target sdk version if app is updatable 3912*333d2b36SAndroid Build Coastguard Worker 3913*333d2b36SAndroid Build Coastguard Worker fixture := android.GroupFixturePreparers( 3914*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 3915*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithAllowMissingDependencies, 3916*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithAndroidMk, 3917*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 3918*333d2b36SAndroid Build Coastguard Worker // explicitly set following platform variables to make the test deterministic 3919*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_final = &testCase.platform_sdk_final 3920*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_version = &platform_sdk_version 3921*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_codename = &platform_sdk_codename 3922*333d2b36SAndroid Build Coastguard Worker variables.Platform_version_active_codenames = []string{platform_sdk_codename} 3923*333d2b36SAndroid Build Coastguard Worker variables.Unbundled_build = proptools.BoolPtr(true) 3924*333d2b36SAndroid Build Coastguard Worker variables.Unbundled_build_apps = []string{"sampleModule"} 3925*333d2b36SAndroid Build Coastguard Worker }), 3926*333d2b36SAndroid Build Coastguard Worker ) 3927*333d2b36SAndroid Build Coastguard Worker 3928*333d2b36SAndroid Build Coastguard Worker result := fixture.RunTestWithBp(t, bp) 3929*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", "android_common") 3930*333d2b36SAndroid Build Coastguard Worker 3931*333d2b36SAndroid Build Coastguard Worker manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"] 3932*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+*testCase.targetSdkVersionExpected) 3933*333d2b36SAndroid Build Coastguard Worker } 3934*333d2b36SAndroid Build Coastguard Worker} 3935*333d2b36SAndroid Build Coastguard Worker 3936*333d2b36SAndroid Build Coastguard Workerfunc TestEnforceDefaultAppTargetSdkVersionFlag(t *testing.T) { 3937*333d2b36SAndroid Build Coastguard Worker platform_sdk_codename := "Tiramisu" 3938*333d2b36SAndroid Build Coastguard Worker platform_sdk_version := 33 3939*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 3940*333d2b36SAndroid Build Coastguard Worker name string 3941*333d2b36SAndroid Build Coastguard Worker enforceDefaultTargetSdkVersion bool 3942*333d2b36SAndroid Build Coastguard Worker expectedError string 3943*333d2b36SAndroid Build Coastguard Worker platform_sdk_final bool 3944*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp string 3945*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected string 3946*333d2b36SAndroid Build Coastguard Worker updatable bool 3947*333d2b36SAndroid Build Coastguard Worker }{ 3948*333d2b36SAndroid Build Coastguard Worker { 3949*333d2b36SAndroid Build Coastguard Worker name: "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion", 3950*333d2b36SAndroid Build Coastguard Worker enforceDefaultTargetSdkVersion: false, 3951*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp: "29", 3952*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: "29", 3953*333d2b36SAndroid Build Coastguard Worker updatable: false, 3954*333d2b36SAndroid Build Coastguard Worker }, 3955*333d2b36SAndroid Build Coastguard Worker { 3956*333d2b36SAndroid Build Coastguard Worker name: "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion", 3957*333d2b36SAndroid Build Coastguard Worker enforceDefaultTargetSdkVersion: true, 3958*333d2b36SAndroid Build Coastguard Worker platform_sdk_final: true, 3959*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp: "current", 3960*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: "33", 3961*333d2b36SAndroid Build Coastguard Worker updatable: true, 3962*333d2b36SAndroid Build Coastguard Worker }, 3963*333d2b36SAndroid Build Coastguard Worker { 3964*333d2b36SAndroid Build Coastguard Worker name: "Enforce Target SDK Version: Android.bp has current targetSdkVersion", 3965*333d2b36SAndroid Build Coastguard Worker enforceDefaultTargetSdkVersion: true, 3966*333d2b36SAndroid Build Coastguard Worker platform_sdk_final: false, 3967*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp: "current", 3968*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: "10000", 3969*333d2b36SAndroid Build Coastguard Worker updatable: false, 3970*333d2b36SAndroid Build Coastguard Worker }, 3971*333d2b36SAndroid Build Coastguard Worker { 3972*333d2b36SAndroid Build Coastguard Worker name: "Not enforcing Target SDK Version for Updatable app", 3973*333d2b36SAndroid Build Coastguard Worker enforceDefaultTargetSdkVersion: false, 3974*333d2b36SAndroid Build Coastguard Worker expectedError: "Updatable apps must enforce default target sdk version", 3975*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp: "29", 3976*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: "29", 3977*333d2b36SAndroid Build Coastguard Worker updatable: true, 3978*333d2b36SAndroid Build Coastguard Worker }, 3979*333d2b36SAndroid Build Coastguard Worker } 3980*333d2b36SAndroid Build Coastguard Worker for _, testCase := range testCases { 3981*333d2b36SAndroid Build Coastguard Worker errExpected := testCase.expectedError != "" 3982*333d2b36SAndroid Build Coastguard Worker bp := fmt.Sprintf(` 3983*333d2b36SAndroid Build Coastguard Worker android_app { 3984*333d2b36SAndroid Build Coastguard Worker name: "foo", 3985*333d2b36SAndroid Build Coastguard Worker enforce_default_target_sdk_version: %t, 3986*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 3987*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 3988*333d2b36SAndroid Build Coastguard Worker target_sdk_version: "%v", 3989*333d2b36SAndroid Build Coastguard Worker updatable: %t 3990*333d2b36SAndroid Build Coastguard Worker } 3991*333d2b36SAndroid Build Coastguard Worker `, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp, testCase.updatable) 3992*333d2b36SAndroid Build Coastguard Worker 3993*333d2b36SAndroid Build Coastguard Worker fixture := android.GroupFixturePreparers( 3994*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 3995*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithAllowMissingDependencies, 3996*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithAndroidMk, 3997*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 3998*333d2b36SAndroid Build Coastguard Worker // explicitly set following platform variables to make the test deterministic 3999*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_final = &testCase.platform_sdk_final 4000*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_version = &platform_sdk_version 4001*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_codename = &platform_sdk_codename 4002*333d2b36SAndroid Build Coastguard Worker variables.Unbundled_build = proptools.BoolPtr(true) 4003*333d2b36SAndroid Build Coastguard Worker variables.Unbundled_build_apps = []string{"sampleModule"} 4004*333d2b36SAndroid Build Coastguard Worker }), 4005*333d2b36SAndroid Build Coastguard Worker ) 4006*333d2b36SAndroid Build Coastguard Worker 4007*333d2b36SAndroid Build Coastguard Worker errorHandler := android.FixtureExpectsNoErrors 4008*333d2b36SAndroid Build Coastguard Worker if errExpected { 4009*333d2b36SAndroid Build Coastguard Worker errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError) 4010*333d2b36SAndroid Build Coastguard Worker } 4011*333d2b36SAndroid Build Coastguard Worker result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp) 4012*333d2b36SAndroid Build Coastguard Worker 4013*333d2b36SAndroid Build Coastguard Worker if !errExpected { 4014*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", "android_common") 4015*333d2b36SAndroid Build Coastguard Worker manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"] 4016*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected) 4017*333d2b36SAndroid Build Coastguard Worker } 4018*333d2b36SAndroid Build Coastguard Worker } 4019*333d2b36SAndroid Build Coastguard Worker} 4020*333d2b36SAndroid Build Coastguard Worker 4021*333d2b36SAndroid Build Coastguard Workerfunc TestEnforceDefaultAppTargetSdkVersionFlagForTests(t *testing.T) { 4022*333d2b36SAndroid Build Coastguard Worker platform_sdk_codename := "Tiramisu" 4023*333d2b36SAndroid Build Coastguard Worker platform_sdk_version := 33 4024*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 4025*333d2b36SAndroid Build Coastguard Worker name string 4026*333d2b36SAndroid Build Coastguard Worker enforceDefaultTargetSdkVersion bool 4027*333d2b36SAndroid Build Coastguard Worker expectedError string 4028*333d2b36SAndroid Build Coastguard Worker platform_sdk_final bool 4029*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp string 4030*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected string 4031*333d2b36SAndroid Build Coastguard Worker }{ 4032*333d2b36SAndroid Build Coastguard Worker { 4033*333d2b36SAndroid Build Coastguard Worker name: "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion", 4034*333d2b36SAndroid Build Coastguard Worker enforceDefaultTargetSdkVersion: false, 4035*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp: "29", 4036*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: "29", 4037*333d2b36SAndroid Build Coastguard Worker }, 4038*333d2b36SAndroid Build Coastguard Worker { 4039*333d2b36SAndroid Build Coastguard Worker name: "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion", 4040*333d2b36SAndroid Build Coastguard Worker enforceDefaultTargetSdkVersion: true, 4041*333d2b36SAndroid Build Coastguard Worker platform_sdk_final: true, 4042*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp: "current", 4043*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: "33", 4044*333d2b36SAndroid Build Coastguard Worker }, 4045*333d2b36SAndroid Build Coastguard Worker { 4046*333d2b36SAndroid Build Coastguard Worker name: "Enforce Target SDK Version: Android.bp has current targetSdkVersion", 4047*333d2b36SAndroid Build Coastguard Worker enforceDefaultTargetSdkVersion: true, 4048*333d2b36SAndroid Build Coastguard Worker platform_sdk_final: false, 4049*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp: "current", 4050*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: "10000", 4051*333d2b36SAndroid Build Coastguard Worker }, 4052*333d2b36SAndroid Build Coastguard Worker } 4053*333d2b36SAndroid Build Coastguard Worker for _, testCase := range testCases { 4054*333d2b36SAndroid Build Coastguard Worker errExpected := testCase.expectedError != "" 4055*333d2b36SAndroid Build Coastguard Worker bp := fmt.Sprintf(` 4056*333d2b36SAndroid Build Coastguard Worker android_test { 4057*333d2b36SAndroid Build Coastguard Worker name: "foo", 4058*333d2b36SAndroid Build Coastguard Worker enforce_default_target_sdk_version: %t, 4059*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 4060*333d2b36SAndroid Build Coastguard Worker target_sdk_version: "%v", 4061*333d2b36SAndroid Build Coastguard Worker } 4062*333d2b36SAndroid Build Coastguard Worker `, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp) 4063*333d2b36SAndroid Build Coastguard Worker 4064*333d2b36SAndroid Build Coastguard Worker fixture := android.GroupFixturePreparers( 4065*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 4066*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithAllowMissingDependencies, 4067*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithAndroidMk, 4068*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 4069*333d2b36SAndroid Build Coastguard Worker // explicitly set following platform variables to make the test deterministic 4070*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_final = &testCase.platform_sdk_final 4071*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_version = &platform_sdk_version 4072*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_codename = &platform_sdk_codename 4073*333d2b36SAndroid Build Coastguard Worker variables.Unbundled_build = proptools.BoolPtr(true) 4074*333d2b36SAndroid Build Coastguard Worker variables.Unbundled_build_apps = []string{"sampleModule"} 4075*333d2b36SAndroid Build Coastguard Worker }), 4076*333d2b36SAndroid Build Coastguard Worker ) 4077*333d2b36SAndroid Build Coastguard Worker 4078*333d2b36SAndroid Build Coastguard Worker errorHandler := android.FixtureExpectsNoErrors 4079*333d2b36SAndroid Build Coastguard Worker if errExpected { 4080*333d2b36SAndroid Build Coastguard Worker errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError) 4081*333d2b36SAndroid Build Coastguard Worker } 4082*333d2b36SAndroid Build Coastguard Worker result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp) 4083*333d2b36SAndroid Build Coastguard Worker 4084*333d2b36SAndroid Build Coastguard Worker if !errExpected { 4085*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", "android_common") 4086*333d2b36SAndroid Build Coastguard Worker manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"] 4087*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected) 4088*333d2b36SAndroid Build Coastguard Worker } 4089*333d2b36SAndroid Build Coastguard Worker } 4090*333d2b36SAndroid Build Coastguard Worker} 4091*333d2b36SAndroid Build Coastguard Worker 4092*333d2b36SAndroid Build Coastguard Workerfunc TestAppMissingCertificateAllowMissingDependencies(t *testing.T) { 4093*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 4094*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 4095*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithAllowMissingDependencies, 4096*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithAndroidMk, 4097*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 4098*333d2b36SAndroid Build Coastguard Worker android_app { 4099*333d2b36SAndroid Build Coastguard Worker name: "foo", 4100*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 4101*333d2b36SAndroid Build Coastguard Worker certificate: ":missing_certificate", 4102*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 4103*333d2b36SAndroid Build Coastguard Worker } 4104*333d2b36SAndroid Build Coastguard Worker 4105*333d2b36SAndroid Build Coastguard Worker android_app { 4106*333d2b36SAndroid Build Coastguard Worker name: "bar", 4107*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 4108*333d2b36SAndroid Build Coastguard Worker certificate: ":missing_certificate", 4109*333d2b36SAndroid Build Coastguard Worker product_specific: true, 4110*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 4111*333d2b36SAndroid Build Coastguard Worker }`) 4112*333d2b36SAndroid Build Coastguard Worker 4113*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", "android_common") 4114*333d2b36SAndroid Build Coastguard Worker fooApk := foo.Output("foo.apk") 4115*333d2b36SAndroid Build Coastguard Worker if fooApk.Rule != android.ErrorRule { 4116*333d2b36SAndroid Build Coastguard Worker t.Fatalf("expected ErrorRule for foo.apk, got %s", fooApk.Rule.String()) 4117*333d2b36SAndroid Build Coastguard Worker } 4118*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected error rule message", fooApk.Args["error"], "missing dependencies: missing_certificate\n") 4119*333d2b36SAndroid Build Coastguard Worker} 4120*333d2b36SAndroid Build Coastguard Worker 4121*333d2b36SAndroid Build Coastguard Workerfunc TestAppIncludesJniPackages(t *testing.T) { 4122*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers( 4123*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 4124*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 4125*333d2b36SAndroid Build Coastguard Worker android_library_import { 4126*333d2b36SAndroid Build Coastguard Worker name: "aary-nodeps", 4127*333d2b36SAndroid Build Coastguard Worker aars: ["aary.aar"], 4128*333d2b36SAndroid Build Coastguard Worker extract_jni: true, 4129*333d2b36SAndroid Build Coastguard Worker } 4130*333d2b36SAndroid Build Coastguard Worker 4131*333d2b36SAndroid Build Coastguard Worker android_library { 4132*333d2b36SAndroid Build Coastguard Worker name: "aary-lib", 4133*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 4134*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "21", 4135*333d2b36SAndroid Build Coastguard Worker static_libs: ["aary-nodeps"], 4136*333d2b36SAndroid Build Coastguard Worker } 4137*333d2b36SAndroid Build Coastguard Worker 4138*333d2b36SAndroid Build Coastguard Worker android_app { 4139*333d2b36SAndroid Build Coastguard Worker name: "aary-lib-dep", 4140*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 4141*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "21", 4142*333d2b36SAndroid Build Coastguard Worker manifest: "AndroidManifest.xml", 4143*333d2b36SAndroid Build Coastguard Worker static_libs: ["aary-lib"], 4144*333d2b36SAndroid Build Coastguard Worker use_embedded_native_libs: true, 4145*333d2b36SAndroid Build Coastguard Worker } 4146*333d2b36SAndroid Build Coastguard Worker 4147*333d2b36SAndroid Build Coastguard Worker android_app { 4148*333d2b36SAndroid Build Coastguard Worker name: "aary-import-dep", 4149*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 4150*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "21", 4151*333d2b36SAndroid Build Coastguard Worker manifest: "AndroidManifest.xml", 4152*333d2b36SAndroid Build Coastguard Worker static_libs: ["aary-nodeps"], 4153*333d2b36SAndroid Build Coastguard Worker use_embedded_native_libs: true, 4154*333d2b36SAndroid Build Coastguard Worker } 4155*333d2b36SAndroid Build Coastguard Worker 4156*333d2b36SAndroid Build Coastguard Worker android_app { 4157*333d2b36SAndroid Build Coastguard Worker name: "aary-no-use-embedded", 4158*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 4159*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "21", 4160*333d2b36SAndroid Build Coastguard Worker manifest: "AndroidManifest.xml", 4161*333d2b36SAndroid Build Coastguard Worker static_libs: ["aary-nodeps"], 4162*333d2b36SAndroid Build Coastguard Worker }`) 4163*333d2b36SAndroid Build Coastguard Worker 4164*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 4165*333d2b36SAndroid Build Coastguard Worker name string 4166*333d2b36SAndroid Build Coastguard Worker hasPackage bool 4167*333d2b36SAndroid Build Coastguard Worker }{ 4168*333d2b36SAndroid Build Coastguard Worker { 4169*333d2b36SAndroid Build Coastguard Worker name: "aary-import-dep", 4170*333d2b36SAndroid Build Coastguard Worker hasPackage: true, 4171*333d2b36SAndroid Build Coastguard Worker }, 4172*333d2b36SAndroid Build Coastguard Worker { 4173*333d2b36SAndroid Build Coastguard Worker name: "aary-lib-dep", 4174*333d2b36SAndroid Build Coastguard Worker hasPackage: true, 4175*333d2b36SAndroid Build Coastguard Worker }, 4176*333d2b36SAndroid Build Coastguard Worker { 4177*333d2b36SAndroid Build Coastguard Worker name: "aary-no-use-embedded", 4178*333d2b36SAndroid Build Coastguard Worker hasPackage: false, 4179*333d2b36SAndroid Build Coastguard Worker }, 4180*333d2b36SAndroid Build Coastguard Worker } 4181*333d2b36SAndroid Build Coastguard Worker 4182*333d2b36SAndroid Build Coastguard Worker for _, tc := range testCases { 4183*333d2b36SAndroid Build Coastguard Worker t.Run(tc.name, func(t *testing.T) { 4184*333d2b36SAndroid Build Coastguard Worker app := ctx.ModuleForTests(tc.name, "android_common") 4185*333d2b36SAndroid Build Coastguard Worker 4186*333d2b36SAndroid Build Coastguard Worker outputFile := "jnilibs.zip" 4187*333d2b36SAndroid Build Coastguard Worker jniOutputLibZip := app.MaybeOutput(outputFile) 4188*333d2b36SAndroid Build Coastguard Worker if jniOutputLibZip.Rule == nil && !tc.hasPackage { 4189*333d2b36SAndroid Build Coastguard Worker return 4190*333d2b36SAndroid Build Coastguard Worker } 4191*333d2b36SAndroid Build Coastguard Worker 4192*333d2b36SAndroid Build Coastguard Worker jniPackage := "arm64-v8a_jni.zip" 4193*333d2b36SAndroid Build Coastguard Worker inputs := jniOutputLibZip.Inputs 4194*333d2b36SAndroid Build Coastguard Worker foundPackage := false 4195*333d2b36SAndroid Build Coastguard Worker for i := 0; i < len(inputs); i++ { 4196*333d2b36SAndroid Build Coastguard Worker if strings.Contains(inputs[i].String(), jniPackage) { 4197*333d2b36SAndroid Build Coastguard Worker foundPackage = true 4198*333d2b36SAndroid Build Coastguard Worker } 4199*333d2b36SAndroid Build Coastguard Worker } 4200*333d2b36SAndroid Build Coastguard Worker if foundPackage != tc.hasPackage { 4201*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected to find %v in %v inputs; inputs = %v", jniPackage, outputFile, inputs) 4202*333d2b36SAndroid Build Coastguard Worker } 4203*333d2b36SAndroid Build Coastguard Worker }) 4204*333d2b36SAndroid Build Coastguard Worker } 4205*333d2b36SAndroid Build Coastguard Worker} 4206*333d2b36SAndroid Build Coastguard Worker 4207*333d2b36SAndroid Build Coastguard Workerfunc TestTargetSdkVersionMtsTests(t *testing.T) { 4208*333d2b36SAndroid Build Coastguard Worker platformSdkCodename := "Tiramisu" 4209*333d2b36SAndroid Build Coastguard Worker android_test := "android_test" 4210*333d2b36SAndroid Build Coastguard Worker android_test_helper_app := "android_test_helper_app" 4211*333d2b36SAndroid Build Coastguard Worker bpTemplate := ` 4212*333d2b36SAndroid Build Coastguard Worker %v { 4213*333d2b36SAndroid Build Coastguard Worker name: "mytest", 4214*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "34", 4215*333d2b36SAndroid Build Coastguard Worker target_sdk_version: "%v", 4216*333d2b36SAndroid Build Coastguard Worker test_suites: ["othersuite", "%v"], 4217*333d2b36SAndroid Build Coastguard Worker } 4218*333d2b36SAndroid Build Coastguard Worker ` 4219*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 4220*333d2b36SAndroid Build Coastguard Worker desc string 4221*333d2b36SAndroid Build Coastguard Worker moduleType string 4222*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp string 4223*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected string 4224*333d2b36SAndroid Build Coastguard Worker testSuites string 4225*333d2b36SAndroid Build Coastguard Worker }{ 4226*333d2b36SAndroid Build Coastguard Worker { 4227*333d2b36SAndroid Build Coastguard Worker desc: "Non-MTS android_test_apps targeting current should not be upgraded to 10000", 4228*333d2b36SAndroid Build Coastguard Worker moduleType: android_test, 4229*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp: "current", 4230*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: platformSdkCodename, 4231*333d2b36SAndroid Build Coastguard Worker testSuites: "non-mts-suite", 4232*333d2b36SAndroid Build Coastguard Worker }, 4233*333d2b36SAndroid Build Coastguard Worker { 4234*333d2b36SAndroid Build Coastguard Worker desc: "MTS android_test_apps targeting released sdks should not be upgraded to 10000", 4235*333d2b36SAndroid Build Coastguard Worker moduleType: android_test, 4236*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp: "29", 4237*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: "29", 4238*333d2b36SAndroid Build Coastguard Worker testSuites: "mts-suite", 4239*333d2b36SAndroid Build Coastguard Worker }, 4240*333d2b36SAndroid Build Coastguard Worker { 4241*333d2b36SAndroid Build Coastguard Worker desc: "MTS android_test_apps targeting current should be upgraded to 10000", 4242*333d2b36SAndroid Build Coastguard Worker moduleType: android_test, 4243*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp: "current", 4244*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: "10000", 4245*333d2b36SAndroid Build Coastguard Worker testSuites: "mts-suite", 4246*333d2b36SAndroid Build Coastguard Worker }, 4247*333d2b36SAndroid Build Coastguard Worker { 4248*333d2b36SAndroid Build Coastguard Worker desc: "MTS android_test_helper_apps targeting current should be upgraded to 10000", 4249*333d2b36SAndroid Build Coastguard Worker moduleType: android_test_helper_app, 4250*333d2b36SAndroid Build Coastguard Worker targetSdkVersionInBp: "current", 4251*333d2b36SAndroid Build Coastguard Worker targetSdkVersionExpected: "10000", 4252*333d2b36SAndroid Build Coastguard Worker testSuites: "mts-suite", 4253*333d2b36SAndroid Build Coastguard Worker }, 4254*333d2b36SAndroid Build Coastguard Worker } 4255*333d2b36SAndroid Build Coastguard Worker fixture := android.GroupFixturePreparers( 4256*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 4257*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 4258*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_codename = &platformSdkCodename 4259*333d2b36SAndroid Build Coastguard Worker variables.Platform_version_active_codenames = []string{platformSdkCodename} 4260*333d2b36SAndroid Build Coastguard Worker }), 4261*333d2b36SAndroid Build Coastguard Worker ) 4262*333d2b36SAndroid Build Coastguard Worker for _, testCase := range testCases { 4263*333d2b36SAndroid Build Coastguard Worker result := fixture.RunTestWithBp(t, fmt.Sprintf(bpTemplate, testCase.moduleType, testCase.targetSdkVersionInBp, testCase.testSuites)) 4264*333d2b36SAndroid Build Coastguard Worker mytest := result.ModuleForTests("mytest", "android_common") 4265*333d2b36SAndroid Build Coastguard Worker manifestFixerArgs := mytest.Output("manifest_fixer/AndroidManifest.xml").Args["args"] 4266*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, testCase.desc, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected) 4267*333d2b36SAndroid Build Coastguard Worker } 4268*333d2b36SAndroid Build Coastguard Worker} 4269*333d2b36SAndroid Build Coastguard Worker 4270*333d2b36SAndroid Build Coastguard Workerfunc TestPrivappAllowlist(t *testing.T) { 4271*333d2b36SAndroid Build Coastguard Worker testJavaError(t, "privileged must be set in order to use privapp_allowlist", ` 4272*333d2b36SAndroid Build Coastguard Worker android_app { 4273*333d2b36SAndroid Build Coastguard Worker name: "foo", 4274*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 4275*333d2b36SAndroid Build Coastguard Worker privapp_allowlist: "perms.xml", 4276*333d2b36SAndroid Build Coastguard Worker } 4277*333d2b36SAndroid Build Coastguard Worker `) 4278*333d2b36SAndroid Build Coastguard Worker 4279*333d2b36SAndroid Build Coastguard Worker result := PrepareForTestWithJavaDefaultModules.RunTestWithBp( 4280*333d2b36SAndroid Build Coastguard Worker t, 4281*333d2b36SAndroid Build Coastguard Worker ` 4282*333d2b36SAndroid Build Coastguard Worker android_app { 4283*333d2b36SAndroid Build Coastguard Worker name: "foo", 4284*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 4285*333d2b36SAndroid Build Coastguard Worker privapp_allowlist: "privapp_allowlist_com.android.foo.xml", 4286*333d2b36SAndroid Build Coastguard Worker privileged: true, 4287*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 4288*333d2b36SAndroid Build Coastguard Worker } 4289*333d2b36SAndroid Build Coastguard Worker override_android_app { 4290*333d2b36SAndroid Build Coastguard Worker name: "bar", 4291*333d2b36SAndroid Build Coastguard Worker base: "foo", 4292*333d2b36SAndroid Build Coastguard Worker package_name: "com.google.android.foo", 4293*333d2b36SAndroid Build Coastguard Worker } 4294*333d2b36SAndroid Build Coastguard Worker `, 4295*333d2b36SAndroid Build Coastguard Worker ) 4296*333d2b36SAndroid Build Coastguard Worker app := result.ModuleForTests("foo", "android_common") 4297*333d2b36SAndroid Build Coastguard Worker overrideApp := result.ModuleForTests("foo", "android_common_bar") 4298*333d2b36SAndroid Build Coastguard Worker 4299*333d2b36SAndroid Build Coastguard Worker // verify that privapp allowlist is created for override apps 4300*333d2b36SAndroid Build Coastguard Worker overrideApp.Output("out/soong/.intermediates/foo/android_common_bar/privapp_allowlist_com.google.android.foo.xml") 4301*333d2b36SAndroid Build Coastguard Worker expectedAllowlistInput := "privapp_allowlist_com.android.foo.xml" 4302*333d2b36SAndroid Build Coastguard Worker overrideActualAllowlistInput := overrideApp.Rule("modifyAllowlist").Input.String() 4303*333d2b36SAndroid Build Coastguard Worker if expectedAllowlistInput != overrideActualAllowlistInput { 4304*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected override allowlist to be %q; got %q", expectedAllowlistInput, overrideActualAllowlistInput) 4305*333d2b36SAndroid Build Coastguard Worker } 4306*333d2b36SAndroid Build Coastguard Worker 4307*333d2b36SAndroid Build Coastguard Worker // verify that permissions are copied to device 4308*333d2b36SAndroid Build Coastguard Worker app.Output("out/soong/target/product/test_device/system/etc/permissions/foo.xml") 4309*333d2b36SAndroid Build Coastguard Worker overrideApp.Output("out/soong/target/product/test_device/system/etc/permissions/bar.xml") 4310*333d2b36SAndroid Build Coastguard Worker} 4311*333d2b36SAndroid Build Coastguard Worker 4312*333d2b36SAndroid Build Coastguard Workerfunc TestPrivappAllowlistAndroidMk(t *testing.T) { 4313*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 4314*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 4315*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithAndroidMk, 4316*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp( 4317*333d2b36SAndroid Build Coastguard Worker t, 4318*333d2b36SAndroid Build Coastguard Worker ` 4319*333d2b36SAndroid Build Coastguard Worker android_app { 4320*333d2b36SAndroid Build Coastguard Worker name: "foo", 4321*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 4322*333d2b36SAndroid Build Coastguard Worker privapp_allowlist: "privapp_allowlist_com.android.foo.xml", 4323*333d2b36SAndroid Build Coastguard Worker privileged: true, 4324*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 4325*333d2b36SAndroid Build Coastguard Worker } 4326*333d2b36SAndroid Build Coastguard Worker override_android_app { 4327*333d2b36SAndroid Build Coastguard Worker name: "bar", 4328*333d2b36SAndroid Build Coastguard Worker base: "foo", 4329*333d2b36SAndroid Build Coastguard Worker package_name: "com.google.android.foo", 4330*333d2b36SAndroid Build Coastguard Worker } 4331*333d2b36SAndroid Build Coastguard Worker `, 4332*333d2b36SAndroid Build Coastguard Worker ) 4333*333d2b36SAndroid Build Coastguard Worker baseApp := result.ModuleForTests("foo", "android_common") 4334*333d2b36SAndroid Build Coastguard Worker overrideApp := result.ModuleForTests("foo", "android_common_bar") 4335*333d2b36SAndroid Build Coastguard Worker 4336*333d2b36SAndroid Build Coastguard Worker baseAndroidApp := baseApp.Module().(*AndroidApp) 4337*333d2b36SAndroid Build Coastguard Worker baseEntries := android.AndroidMkEntriesForTest(t, result.TestContext, baseAndroidApp)[0] 4338*333d2b36SAndroid Build Coastguard Worker android.AssertStringMatches( 4339*333d2b36SAndroid Build Coastguard Worker t, 4340*333d2b36SAndroid Build Coastguard Worker "androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find foo.apk", 4341*333d2b36SAndroid Build Coastguard Worker baseEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0], 4342*333d2b36SAndroid Build Coastguard Worker "\\S+foo.apk", 4343*333d2b36SAndroid Build Coastguard Worker ) 4344*333d2b36SAndroid Build Coastguard Worker android.AssertStringMatches( 4345*333d2b36SAndroid Build Coastguard Worker t, 4346*333d2b36SAndroid Build Coastguard Worker "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include foo.apk", 4347*333d2b36SAndroid Build Coastguard Worker baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0], 4348*333d2b36SAndroid Build Coastguard Worker "\\S+foo.apk", 4349*333d2b36SAndroid Build Coastguard Worker ) 4350*333d2b36SAndroid Build Coastguard Worker android.AssertStringMatches( 4351*333d2b36SAndroid Build Coastguard Worker t, 4352*333d2b36SAndroid Build Coastguard Worker "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app", 4353*333d2b36SAndroid Build Coastguard Worker baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0], 4354*333d2b36SAndroid Build Coastguard Worker "\\S+foo.apk:\\S+/target/product/test_device/system/priv-app/foo/foo.apk", 4355*333d2b36SAndroid Build Coastguard Worker ) 4356*333d2b36SAndroid Build Coastguard Worker android.AssertStringMatches( 4357*333d2b36SAndroid Build Coastguard Worker t, 4358*333d2b36SAndroid Build Coastguard Worker "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist", 4359*333d2b36SAndroid Build Coastguard Worker baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0], 4360*333d2b36SAndroid Build Coastguard Worker "privapp_allowlist_com.android.foo.xml:\\S+/target/product/test_device/system/etc/permissions/foo.xml", 4361*333d2b36SAndroid Build Coastguard Worker ) 4362*333d2b36SAndroid Build Coastguard Worker 4363*333d2b36SAndroid Build Coastguard Worker overrideAndroidApp := overrideApp.Module().(*AndroidApp) 4364*333d2b36SAndroid Build Coastguard Worker overrideEntries := android.AndroidMkEntriesForTest(t, result.TestContext, overrideAndroidApp)[0] 4365*333d2b36SAndroid Build Coastguard Worker android.AssertStringMatches( 4366*333d2b36SAndroid Build Coastguard Worker t, 4367*333d2b36SAndroid Build Coastguard Worker "androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find bar.apk", 4368*333d2b36SAndroid Build Coastguard Worker overrideEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0], 4369*333d2b36SAndroid Build Coastguard Worker "\\S+bar.apk", 4370*333d2b36SAndroid Build Coastguard Worker ) 4371*333d2b36SAndroid Build Coastguard Worker android.AssertStringMatches( 4372*333d2b36SAndroid Build Coastguard Worker t, 4373*333d2b36SAndroid Build Coastguard Worker "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include bar.apk", 4374*333d2b36SAndroid Build Coastguard Worker overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0], 4375*333d2b36SAndroid Build Coastguard Worker "\\S+bar.apk", 4376*333d2b36SAndroid Build Coastguard Worker ) 4377*333d2b36SAndroid Build Coastguard Worker android.AssertStringMatches( 4378*333d2b36SAndroid Build Coastguard Worker t, 4379*333d2b36SAndroid Build Coastguard Worker "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app", 4380*333d2b36SAndroid Build Coastguard Worker overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0], 4381*333d2b36SAndroid Build Coastguard Worker "\\S+bar.apk:\\S+/target/product/test_device/system/priv-app/bar/bar.apk", 4382*333d2b36SAndroid Build Coastguard Worker ) 4383*333d2b36SAndroid Build Coastguard Worker android.AssertStringMatches( 4384*333d2b36SAndroid Build Coastguard Worker t, 4385*333d2b36SAndroid Build Coastguard Worker "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist", 4386*333d2b36SAndroid Build Coastguard Worker overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0], 4387*333d2b36SAndroid Build Coastguard Worker "\\S+soong/.intermediates/foo/android_common_bar/privapp_allowlist_com.google.android.foo.xml:\\S+/target/product/test_device/system/etc/permissions/bar.xml", 4388*333d2b36SAndroid Build Coastguard Worker ) 4389*333d2b36SAndroid Build Coastguard Worker} 4390*333d2b36SAndroid Build Coastguard Worker 4391*333d2b36SAndroid Build Coastguard Workerfunc TestAppFlagsPackages(t *testing.T) { 4392*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers( 4393*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 4394*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs( 4395*333d2b36SAndroid Build Coastguard Worker map[string][]byte{ 4396*333d2b36SAndroid Build Coastguard Worker "res/layout/layout.xml": nil, 4397*333d2b36SAndroid Build Coastguard Worker "res/values/strings.xml": nil, 4398*333d2b36SAndroid Build Coastguard Worker "res/values-en-rUS/strings.xml": nil, 4399*333d2b36SAndroid Build Coastguard Worker }, 4400*333d2b36SAndroid Build Coastguard Worker ), 4401*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 4402*333d2b36SAndroid Build Coastguard Worker android_app { 4403*333d2b36SAndroid Build Coastguard Worker name: "foo", 4404*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 4405*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 4406*333d2b36SAndroid Build Coastguard Worker flags_packages: [ 4407*333d2b36SAndroid Build Coastguard Worker "bar", 4408*333d2b36SAndroid Build Coastguard Worker "baz", 4409*333d2b36SAndroid Build Coastguard Worker ], 4410*333d2b36SAndroid Build Coastguard Worker } 4411*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 4412*333d2b36SAndroid Build Coastguard Worker name: "bar", 4413*333d2b36SAndroid Build Coastguard Worker package: "com.example.package.bar", 4414*333d2b36SAndroid Build Coastguard Worker container: "com.android.foo", 4415*333d2b36SAndroid Build Coastguard Worker srcs: [ 4416*333d2b36SAndroid Build Coastguard Worker "bar.aconfig", 4417*333d2b36SAndroid Build Coastguard Worker ], 4418*333d2b36SAndroid Build Coastguard Worker } 4419*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 4420*333d2b36SAndroid Build Coastguard Worker name: "baz", 4421*333d2b36SAndroid Build Coastguard Worker package: "com.example.package.baz", 4422*333d2b36SAndroid Build Coastguard Worker container: "com.android.foo", 4423*333d2b36SAndroid Build Coastguard Worker srcs: [ 4424*333d2b36SAndroid Build Coastguard Worker "baz.aconfig", 4425*333d2b36SAndroid Build Coastguard Worker ], 4426*333d2b36SAndroid Build Coastguard Worker } 4427*333d2b36SAndroid Build Coastguard Worker `) 4428*333d2b36SAndroid Build Coastguard Worker 4429*333d2b36SAndroid Build Coastguard Worker foo := ctx.ModuleForTests("foo", "android_common") 4430*333d2b36SAndroid Build Coastguard Worker 4431*333d2b36SAndroid Build Coastguard Worker // android_app module depends on aconfig_declarations listed in flags_packages 4432*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, "foo expected to depend on bar", true, 4433*333d2b36SAndroid Build Coastguard Worker CheckModuleHasDependency(t, ctx.TestContext, "foo", "android_common", "bar")) 4434*333d2b36SAndroid Build Coastguard Worker 4435*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, "foo expected to depend on baz", true, 4436*333d2b36SAndroid Build Coastguard Worker CheckModuleHasDependency(t, ctx.TestContext, "foo", "android_common", "baz")) 4437*333d2b36SAndroid Build Coastguard Worker 4438*333d2b36SAndroid Build Coastguard Worker aapt2LinkRule := foo.Rule("android/soong/java.aapt2Link") 4439*333d2b36SAndroid Build Coastguard Worker linkInFlags := aapt2LinkRule.Args["inFlags"] 4440*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, 4441*333d2b36SAndroid Build Coastguard Worker "aapt2 link command expected to pass feature flags arguments", 4442*333d2b36SAndroid Build Coastguard Worker linkInFlags, 4443*333d2b36SAndroid Build Coastguard Worker "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt", 4444*333d2b36SAndroid Build Coastguard Worker ) 4445*333d2b36SAndroid Build Coastguard Worker 4446*333d2b36SAndroid Build Coastguard Worker aapt2CompileRule := foo.Rule("android/soong/java.aapt2Compile") 4447*333d2b36SAndroid Build Coastguard Worker compileFlags := aapt2CompileRule.Args["cFlags"] 4448*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, 4449*333d2b36SAndroid Build Coastguard Worker "aapt2 compile command expected to pass feature flags arguments", 4450*333d2b36SAndroid Build Coastguard Worker compileFlags, 4451*333d2b36SAndroid Build Coastguard Worker "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt", 4452*333d2b36SAndroid Build Coastguard Worker ) 4453*333d2b36SAndroid Build Coastguard Worker} 4454*333d2b36SAndroid Build Coastguard Worker 4455*333d2b36SAndroid Build Coastguard Workerfunc TestAppFlagsPackagesPropagation(t *testing.T) { 4456*333d2b36SAndroid Build Coastguard Worker ctx := testApp(t, ` 4457*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 4458*333d2b36SAndroid Build Coastguard Worker name: "foo", 4459*333d2b36SAndroid Build Coastguard Worker package: "com.example.package.foo", 4460*333d2b36SAndroid Build Coastguard Worker container: "com.android.foo", 4461*333d2b36SAndroid Build Coastguard Worker srcs: [ 4462*333d2b36SAndroid Build Coastguard Worker "foo.aconfig", 4463*333d2b36SAndroid Build Coastguard Worker ], 4464*333d2b36SAndroid Build Coastguard Worker } 4465*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 4466*333d2b36SAndroid Build Coastguard Worker name: "bar", 4467*333d2b36SAndroid Build Coastguard Worker package: "com.example.package.bar", 4468*333d2b36SAndroid Build Coastguard Worker container: "com.android.bar", 4469*333d2b36SAndroid Build Coastguard Worker srcs: [ 4470*333d2b36SAndroid Build Coastguard Worker "bar.aconfig", 4471*333d2b36SAndroid Build Coastguard Worker ], 4472*333d2b36SAndroid Build Coastguard Worker } 4473*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 4474*333d2b36SAndroid Build Coastguard Worker name: "baz", 4475*333d2b36SAndroid Build Coastguard Worker package: "com.example.package.baz", 4476*333d2b36SAndroid Build Coastguard Worker container: "com.android.baz", 4477*333d2b36SAndroid Build Coastguard Worker srcs: [ 4478*333d2b36SAndroid Build Coastguard Worker "baz.aconfig", 4479*333d2b36SAndroid Build Coastguard Worker ], 4480*333d2b36SAndroid Build Coastguard Worker } 4481*333d2b36SAndroid Build Coastguard Worker android_library { 4482*333d2b36SAndroid Build Coastguard Worker name: "foo_lib", 4483*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 4484*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 4485*333d2b36SAndroid Build Coastguard Worker flags_packages: [ 4486*333d2b36SAndroid Build Coastguard Worker "foo", 4487*333d2b36SAndroid Build Coastguard Worker ], 4488*333d2b36SAndroid Build Coastguard Worker } 4489*333d2b36SAndroid Build Coastguard Worker android_library { 4490*333d2b36SAndroid Build Coastguard Worker name: "bar_lib", 4491*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 4492*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 4493*333d2b36SAndroid Build Coastguard Worker flags_packages: [ 4494*333d2b36SAndroid Build Coastguard Worker "bar", 4495*333d2b36SAndroid Build Coastguard Worker ], 4496*333d2b36SAndroid Build Coastguard Worker } 4497*333d2b36SAndroid Build Coastguard Worker android_app { 4498*333d2b36SAndroid Build Coastguard Worker name: "baz_app", 4499*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 4500*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 4501*333d2b36SAndroid Build Coastguard Worker flags_packages: [ 4502*333d2b36SAndroid Build Coastguard Worker "baz", 4503*333d2b36SAndroid Build Coastguard Worker ], 4504*333d2b36SAndroid Build Coastguard Worker static_libs: [ 4505*333d2b36SAndroid Build Coastguard Worker "bar_lib", 4506*333d2b36SAndroid Build Coastguard Worker ], 4507*333d2b36SAndroid Build Coastguard Worker libs: [ 4508*333d2b36SAndroid Build Coastguard Worker "foo_lib", 4509*333d2b36SAndroid Build Coastguard Worker ], 4510*333d2b36SAndroid Build Coastguard Worker } 4511*333d2b36SAndroid Build Coastguard Worker `) 4512*333d2b36SAndroid Build Coastguard Worker 4513*333d2b36SAndroid Build Coastguard Worker bazApp := ctx.ModuleForTests("baz_app", "android_common") 4514*333d2b36SAndroid Build Coastguard Worker 4515*333d2b36SAndroid Build Coastguard Worker // android_app module depends on aconfig_declarations listed in flags_packages 4516*333d2b36SAndroid Build Coastguard Worker // and that of static libs, but not libs 4517*333d2b36SAndroid Build Coastguard Worker aapt2LinkRule := bazApp.Rule("android/soong/java.aapt2Link") 4518*333d2b36SAndroid Build Coastguard Worker linkInFlags := aapt2LinkRule.Args["inFlags"] 4519*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, 4520*333d2b36SAndroid Build Coastguard Worker "aapt2 link command expected to pass feature flags arguments of flags_packages and that of its static libs", 4521*333d2b36SAndroid Build Coastguard Worker linkInFlags, 4522*333d2b36SAndroid Build Coastguard Worker "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt", 4523*333d2b36SAndroid Build Coastguard Worker ) 4524*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, 4525*333d2b36SAndroid Build Coastguard Worker "aapt2 link command expected to not pass feature flags arguments of flags_packages of its libs", 4526*333d2b36SAndroid Build Coastguard Worker linkInFlags, 4527*333d2b36SAndroid Build Coastguard Worker "--feature-flags @out/soong/.intermediates/foo/intermediate.txt", 4528*333d2b36SAndroid Build Coastguard Worker ) 4529*333d2b36SAndroid Build Coastguard Worker} 4530*333d2b36SAndroid Build Coastguard Worker 4531*333d2b36SAndroid Build Coastguard Worker// Test that dexpreopt is disabled if an optional_uses_libs exists, but does not provide an implementation. 4532*333d2b36SAndroid Build Coastguard Workerfunc TestNoDexpreoptOptionalUsesLibDoesNotHaveImpl(t *testing.T) { 4533*333d2b36SAndroid Build Coastguard Worker bp := ` 4534*333d2b36SAndroid Build Coastguard Worker java_sdk_library_import { 4535*333d2b36SAndroid Build Coastguard Worker name: "sdklib_noimpl", 4536*333d2b36SAndroid Build Coastguard Worker public: { 4537*333d2b36SAndroid Build Coastguard Worker jars: ["stub.jar"], 4538*333d2b36SAndroid Build Coastguard Worker }, 4539*333d2b36SAndroid Build Coastguard Worker } 4540*333d2b36SAndroid Build Coastguard Worker android_app { 4541*333d2b36SAndroid Build Coastguard Worker name: "app", 4542*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 4543*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 4544*333d2b36SAndroid Build Coastguard Worker optional_uses_libs: [ 4545*333d2b36SAndroid Build Coastguard Worker "sdklib_noimpl", 4546*333d2b36SAndroid Build Coastguard Worker ], 4547*333d2b36SAndroid Build Coastguard Worker } 4548*333d2b36SAndroid Build Coastguard Worker ` 4549*333d2b36SAndroid Build Coastguard Worker result := prepareForJavaTest.RunTestWithBp(t, bp) 4550*333d2b36SAndroid Build Coastguard Worker dexpreopt := result.ModuleForTests("app", "android_common").MaybeRule("dexpreopt").Rule 4551*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, "dexpreopt should be disabled if optional_uses_libs does not have an implementation", true, dexpreopt == nil) 4552*333d2b36SAndroid Build Coastguard Worker} 4553*333d2b36SAndroid Build Coastguard Worker 4554*333d2b36SAndroid Build Coastguard Workerfunc TestTestOnlyApp(t *testing.T) { 4555*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4556*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers( 4557*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 4558*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 4559*333d2b36SAndroid Build Coastguard Worker // These should be test-only 4560*333d2b36SAndroid Build Coastguard Worker android_test { 4561*333d2b36SAndroid Build Coastguard Worker name: "android-test", 4562*333d2b36SAndroid Build Coastguard Worker } 4563*333d2b36SAndroid Build Coastguard Worker android_test_helper_app { 4564*333d2b36SAndroid Build Coastguard Worker name: "helper-app", 4565*333d2b36SAndroid Build Coastguard Worker } 4566*333d2b36SAndroid Build Coastguard Worker override_android_test { 4567*333d2b36SAndroid Build Coastguard Worker name: "override-test", 4568*333d2b36SAndroid Build Coastguard Worker base: "android-app", 4569*333d2b36SAndroid Build Coastguard Worker } 4570*333d2b36SAndroid Build Coastguard Worker // And these should not be 4571*333d2b36SAndroid Build Coastguard Worker android_app { 4572*333d2b36SAndroid Build Coastguard Worker name: "android-app", 4573*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 4574*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 4575*333d2b36SAndroid Build Coastguard Worker } 4576*333d2b36SAndroid Build Coastguard Worker `) 4577*333d2b36SAndroid Build Coastguard Worker 4578*333d2b36SAndroid Build Coastguard Worker expectedTestOnly := []string{ 4579*333d2b36SAndroid Build Coastguard Worker "android-test", 4580*333d2b36SAndroid Build Coastguard Worker "helper-app", 4581*333d2b36SAndroid Build Coastguard Worker "override-test", 4582*333d2b36SAndroid Build Coastguard Worker } 4583*333d2b36SAndroid Build Coastguard Worker 4584*333d2b36SAndroid Build Coastguard Worker expectedTopLevel := []string{ 4585*333d2b36SAndroid Build Coastguard Worker "android-test", 4586*333d2b36SAndroid Build Coastguard Worker "override-test", 4587*333d2b36SAndroid Build Coastguard Worker } 4588*333d2b36SAndroid Build Coastguard Worker 4589*333d2b36SAndroid Build Coastguard Worker assertTestOnlyAndTopLevel(t, ctx, expectedTestOnly, expectedTopLevel) 4590*333d2b36SAndroid Build Coastguard Worker} 4591*333d2b36SAndroid Build Coastguard Worker 4592*333d2b36SAndroid Build Coastguard Workerfunc TestAppStem(t *testing.T) { 4593*333d2b36SAndroid Build Coastguard Worker ctx := testApp(t, ` 4594*333d2b36SAndroid Build Coastguard Worker android_app { 4595*333d2b36SAndroid Build Coastguard Worker name: "foo", 4596*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 4597*333d2b36SAndroid Build Coastguard Worker stem: "foo-new", 4598*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 4599*333d2b36SAndroid Build Coastguard Worker }`) 4600*333d2b36SAndroid Build Coastguard Worker 4601*333d2b36SAndroid Build Coastguard Worker foo := ctx.ModuleForTests("foo", "android_common") 4602*333d2b36SAndroid Build Coastguard Worker 4603*333d2b36SAndroid Build Coastguard Worker outputs := fmt.Sprint(foo.AllOutputs()) 4604*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(outputs, "foo-new.apk") { 4605*333d2b36SAndroid Build Coastguard Worker t.Errorf("Module output does not contain expected apk %s", "foo-new.apk") 4606*333d2b36SAndroid Build Coastguard Worker } 4607*333d2b36SAndroid Build Coastguard Worker} 4608*333d2b36SAndroid Build Coastguard Worker 4609*333d2b36SAndroid Build Coastguard Workerfunc TestAppMinSdkVersionOverride(t *testing.T) { 4610*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 4611*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 4612*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 4613*333d2b36SAndroid Build Coastguard Worker android_app { 4614*333d2b36SAndroid Build Coastguard Worker name: "com.android.foo", 4615*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 4616*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 4617*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "31", 4618*333d2b36SAndroid Build Coastguard Worker updatable: true, 4619*333d2b36SAndroid Build Coastguard Worker } 4620*333d2b36SAndroid Build Coastguard Worker override_android_app { 4621*333d2b36SAndroid Build Coastguard Worker name: "com.android.go.foo", 4622*333d2b36SAndroid Build Coastguard Worker base: "com.android.foo", 4623*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "33", 4624*333d2b36SAndroid Build Coastguard Worker } 4625*333d2b36SAndroid Build Coastguard Worker `) 4626*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer") 4627*333d2b36SAndroid Build Coastguard Worker fooOverride := result.ModuleForTests("com.android.foo", "android_common_com.android.go.foo").Rule("manifestFixer") 4628*333d2b36SAndroid Build Coastguard Worker 4629*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, 4630*333d2b36SAndroid Build Coastguard Worker "com.android.foo: expected manifest fixer to set minSdkVersion to T", 4631*333d2b36SAndroid Build Coastguard Worker foo.BuildParams.Args["args"], 4632*333d2b36SAndroid Build Coastguard Worker "--minSdkVersion 31", 4633*333d2b36SAndroid Build Coastguard Worker ) 4634*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, 4635*333d2b36SAndroid Build Coastguard Worker "com.android.go.foo: expected manifest fixer to set minSdkVersion to T", 4636*333d2b36SAndroid Build Coastguard Worker fooOverride.BuildParams.Args["args"], 4637*333d2b36SAndroid Build Coastguard Worker "--minSdkVersion 33", 4638*333d2b36SAndroid Build Coastguard Worker ) 4639*333d2b36SAndroid Build Coastguard Worker 4640*333d2b36SAndroid Build Coastguard Worker} 4641*333d2b36SAndroid Build Coastguard Worker 4642*333d2b36SAndroid Build Coastguard Workerfunc TestNotApplyDefaultUpdatableModuleVersion(t *testing.T) { 4643*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 4644*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 4645*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 4646*333d2b36SAndroid Build Coastguard Worker android_app { 4647*333d2b36SAndroid Build Coastguard Worker name: "com.android.foo", 4648*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 4649*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 4650*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "31", 4651*333d2b36SAndroid Build Coastguard Worker } 4652*333d2b36SAndroid Build Coastguard Worker `) 4653*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer") 4654*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, 4655*333d2b36SAndroid Build Coastguard Worker "com.android.foo: expected manifest fixer to not set override-placeholder-version", 4656*333d2b36SAndroid Build Coastguard Worker foo.BuildParams.Args["args"], 4657*333d2b36SAndroid Build Coastguard Worker "--override-placeholder-version", 4658*333d2b36SAndroid Build Coastguard Worker ) 4659*333d2b36SAndroid Build Coastguard Worker} 4660*333d2b36SAndroid Build Coastguard Worker 4661*333d2b36SAndroid Build Coastguard Workerfunc TestNotApplyOverrideApexManifestDefaultVersion(t *testing.T) { 4662*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 4663*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 4664*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeEnv(map[string]string{ 4665*333d2b36SAndroid Build Coastguard Worker "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234", 4666*333d2b36SAndroid Build Coastguard Worker }), 4667*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 4668*333d2b36SAndroid Build Coastguard Worker android_app { 4669*333d2b36SAndroid Build Coastguard Worker name: "com.android.foo", 4670*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 4671*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 4672*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "31", 4673*333d2b36SAndroid Build Coastguard Worker } 4674*333d2b36SAndroid Build Coastguard Worker `) 4675*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer") 4676*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, 4677*333d2b36SAndroid Build Coastguard Worker "com.android.foo: expected manifest fixer to not set override-placeholder-version", 4678*333d2b36SAndroid Build Coastguard Worker foo.BuildParams.Args["args"], 4679*333d2b36SAndroid Build Coastguard Worker "--override-placeholder-version", 4680*333d2b36SAndroid Build Coastguard Worker ) 4681*333d2b36SAndroid Build Coastguard Worker} 4682*333d2b36SAndroid Build Coastguard Worker 4683*333d2b36SAndroid Build Coastguard Workerfunc TestResourcesWithFlagDirectories(t *testing.T) { 4684*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 4685*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 4686*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs(android.MockFS{ 4687*333d2b36SAndroid Build Coastguard Worker "res/flag(test.package.flag1)/values/bools.xml": nil, 4688*333d2b36SAndroid Build Coastguard Worker "res/flag(!test.package.flag2)/values/bools.xml": nil, 4689*333d2b36SAndroid Build Coastguard Worker "res/flag(test.package.flag1)/values-config/strings_google_services.xml": nil, 4690*333d2b36SAndroid Build Coastguard Worker "res/flags(test.package.flag1)/values/strings.xml": nil, 4691*333d2b36SAndroid Build Coastguard Worker }), 4692*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 4693*333d2b36SAndroid Build Coastguard Worker android_library { 4694*333d2b36SAndroid Build Coastguard Worker name: "foo", 4695*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 4696*333d2b36SAndroid Build Coastguard Worker use_resource_processor: true, 4697*333d2b36SAndroid Build Coastguard Worker resource_dirs: [ 4698*333d2b36SAndroid Build Coastguard Worker "res", 4699*333d2b36SAndroid Build Coastguard Worker ], 4700*333d2b36SAndroid Build Coastguard Worker } 4701*333d2b36SAndroid Build Coastguard Worker `) 4702*333d2b36SAndroid Build Coastguard Worker fooModule := result.ModuleForTests("foo", "android_common") 4703*333d2b36SAndroid Build Coastguard Worker compileOutputPaths := fooModule.Rule("aapt2Compile").Outputs.Strings() 4704*333d2b36SAndroid Build Coastguard Worker 4705*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains( 4706*333d2b36SAndroid Build Coastguard Worker t, 4707*333d2b36SAndroid Build Coastguard Worker "Expected to generate flag path", 4708*333d2b36SAndroid Build Coastguard Worker compileOutputPaths, 4709*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/foo/android_common/aapt2/res/values_bools.(test.package.flag1).arsc.flat", 4710*333d2b36SAndroid Build Coastguard Worker ) 4711*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains( 4712*333d2b36SAndroid Build Coastguard Worker t, 4713*333d2b36SAndroid Build Coastguard Worker "Expected to generate flag path with ! prefix in name", 4714*333d2b36SAndroid Build Coastguard Worker compileOutputPaths, 4715*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/foo/android_common/aapt2/res/values_bools.(!test.package.flag2).arsc.flat", 4716*333d2b36SAndroid Build Coastguard Worker ) 4717*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains( 4718*333d2b36SAndroid Build Coastguard Worker t, 4719*333d2b36SAndroid Build Coastguard Worker "Expected to generate flag path with configs", 4720*333d2b36SAndroid Build Coastguard Worker compileOutputPaths, 4721*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/foo/android_common/aapt2/res/values-config_strings_google_services.(test.package.flag1).arsc.flat", 4722*333d2b36SAndroid Build Coastguard Worker ) 4723*333d2b36SAndroid Build Coastguard Worker android.AssertStringListDoesNotContain( 4724*333d2b36SAndroid Build Coastguard Worker t, 4725*333d2b36SAndroid Build Coastguard Worker "Expected to not generate flag path with non-flag(flag_name) pattern", 4726*333d2b36SAndroid Build Coastguard Worker compileOutputPaths, 4727*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/foo/android_common/aapt2/res/values_strings.(test.package.flag1).arsc.flat", 4728*333d2b36SAndroid Build Coastguard Worker ) 4729*333d2b36SAndroid Build Coastguard Worker} 4730*333d2b36SAndroid Build Coastguard Worker 4731*333d2b36SAndroid Build Coastguard Workerfunc TestAutogeneratedStaticRro(t *testing.T) { 4732*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4733*333d2b36SAndroid Build Coastguard Worker bp := ` 4734*333d2b36SAndroid Build Coastguard Workerandroid_app { 4735*333d2b36SAndroid Build Coastguard Worker name: "foo", 4736*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 4737*333d2b36SAndroid Build Coastguard Worker platform_apis: true, 4738*333d2b36SAndroid Build Coastguard Worker} 4739*333d2b36SAndroid Build Coastguard Workeroverride_android_app { 4740*333d2b36SAndroid Build Coastguard Worker name: "override_foo", 4741*333d2b36SAndroid Build Coastguard Worker base: "foo", 4742*333d2b36SAndroid Build Coastguard Worker} 4743*333d2b36SAndroid Build Coastguard Worker` 4744*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 4745*333d2b36SAndroid Build Coastguard Worker desc string 4746*333d2b36SAndroid Build Coastguard Worker preparer android.FixturePreparer 4747*333d2b36SAndroid Build Coastguard Worker overlayApkExpected bool 4748*333d2b36SAndroid Build Coastguard Worker }{ 4749*333d2b36SAndroid Build Coastguard Worker { 4750*333d2b36SAndroid Build Coastguard Worker desc: "No DEVICE_PACKAGE_OVERLAYS, no overlay .apk file", 4751*333d2b36SAndroid Build Coastguard Worker overlayApkExpected: false, 4752*333d2b36SAndroid Build Coastguard Worker }, 4753*333d2b36SAndroid Build Coastguard Worker { 4754*333d2b36SAndroid Build Coastguard Worker desc: "DEVICE_PACKAGE_OVERLAYS exists, but the directory is empty", 4755*333d2b36SAndroid Build Coastguard Worker overlayApkExpected: false, 4756*333d2b36SAndroid Build Coastguard Worker preparer: android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 4757*333d2b36SAndroid Build Coastguard Worker variables.DeviceResourceOverlays = []string{"device/company/test_product"} 4758*333d2b36SAndroid Build Coastguard Worker }), 4759*333d2b36SAndroid Build Coastguard Worker }, 4760*333d2b36SAndroid Build Coastguard Worker { 4761*333d2b36SAndroid Build Coastguard Worker desc: "DEVICE_PACKAGE_OVERLAYS exists, directory is non-empty, but does not contain a matching resource dir", 4762*333d2b36SAndroid Build Coastguard Worker overlayApkExpected: false, 4763*333d2b36SAndroid Build Coastguard Worker preparer: android.GroupFixturePreparers( 4764*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 4765*333d2b36SAndroid Build Coastguard Worker variables.DeviceResourceOverlays = []string{"device/company/test_product"} 4766*333d2b36SAndroid Build Coastguard Worker }), 4767*333d2b36SAndroid Build Coastguard Worker android.MockFS{ 4768*333d2b36SAndroid Build Coastguard Worker "res/foo.xml": nil, 4769*333d2b36SAndroid Build Coastguard Worker "device/company/test_product/different_res/foo.xml": nil, // different dir 4770*333d2b36SAndroid Build Coastguard Worker }.AddToFixture(), 4771*333d2b36SAndroid Build Coastguard Worker ), 4772*333d2b36SAndroid Build Coastguard Worker }, 4773*333d2b36SAndroid Build Coastguard Worker { 4774*333d2b36SAndroid Build Coastguard Worker desc: "DEVICE_PACKAGE_OVERLAYS and the directory contain a matching resource dir", 4775*333d2b36SAndroid Build Coastguard Worker overlayApkExpected: true, 4776*333d2b36SAndroid Build Coastguard Worker preparer: android.GroupFixturePreparers( 4777*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 4778*333d2b36SAndroid Build Coastguard Worker variables.DeviceResourceOverlays = []string{"device/company/test_product"} 4779*333d2b36SAndroid Build Coastguard Worker }), 4780*333d2b36SAndroid Build Coastguard Worker android.MockFS{ 4781*333d2b36SAndroid Build Coastguard Worker "res/foo.xml": nil, 4782*333d2b36SAndroid Build Coastguard Worker "device/company/test_product/res/foo.xml": nil, 4783*333d2b36SAndroid Build Coastguard Worker }.AddToFixture(), 4784*333d2b36SAndroid Build Coastguard Worker ), 4785*333d2b36SAndroid Build Coastguard Worker }, 4786*333d2b36SAndroid Build Coastguard Worker } 4787*333d2b36SAndroid Build Coastguard Worker for _, tc := range testCases { 4788*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 4789*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 4790*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 4791*333d2b36SAndroid Build Coastguard Worker variables.EnforceRROTargets = []string{"*"} 4792*333d2b36SAndroid Build Coastguard Worker }), 4793*333d2b36SAndroid Build Coastguard Worker android.OptionalFixturePreparer(tc.preparer), 4794*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 4795*333d2b36SAndroid Build Coastguard Worker vendorOverlayApk := result.ModuleForTests("foo__test_product__auto_generated_rro_vendor", "android_arm64_armv8-a").MaybeOutput("foo__test_product__auto_generated_rro_vendor.apk") 4796*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, tc.desc, tc.overlayApkExpected, vendorOverlayApk.Rule != nil) 4797*333d2b36SAndroid Build Coastguard Worker overrideVendorOverlayApk := result.ModuleForTests("override_foo__test_product__auto_generated_rro_vendor", "android_arm64_armv8-a").MaybeOutput("override_foo__test_product__auto_generated_rro_vendor.apk") 4798*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, tc.desc, tc.overlayApkExpected, overrideVendorOverlayApk.Rule != nil) 4799*333d2b36SAndroid Build Coastguard Worker } 4800*333d2b36SAndroid Build Coastguard Worker} 4801*333d2b36SAndroid Build Coastguard Worker 4802*333d2b36SAndroid Build Coastguard Workerfunc TestNoAutogeneratedStaticRroForDisabledOverrideApps(t *testing.T) { 4803*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4804*333d2b36SAndroid Build Coastguard Worker bp := ` 4805*333d2b36SAndroid Build Coastguard Workersoong_config_module_type { 4806*333d2b36SAndroid Build Coastguard Worker name: "my_custom_override_android_app", 4807*333d2b36SAndroid Build Coastguard Worker module_type: "override_android_app", 4808*333d2b36SAndroid Build Coastguard Worker config_namespace: "my_namespace", 4809*333d2b36SAndroid Build Coastguard Worker value_variables: ["my_app_enabled"], 4810*333d2b36SAndroid Build Coastguard Worker properties: ["enabled"], 4811*333d2b36SAndroid Build Coastguard Worker} 4812*333d2b36SAndroid Build Coastguard Workersoong_config_bool_variable { 4813*333d2b36SAndroid Build Coastguard Worker name: "my_app_enabled", 4814*333d2b36SAndroid Build Coastguard Worker} 4815*333d2b36SAndroid Build Coastguard Workerandroid_app { 4816*333d2b36SAndroid Build Coastguard Worker name: "foo", 4817*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 4818*333d2b36SAndroid Build Coastguard Worker platform_apis: true, 4819*333d2b36SAndroid Build Coastguard Worker} 4820*333d2b36SAndroid Build Coastguard Workermy_custom_override_android_app { 4821*333d2b36SAndroid Build Coastguard Worker name: "override_foo", 4822*333d2b36SAndroid Build Coastguard Worker base: "foo", 4823*333d2b36SAndroid Build Coastguard Worker soong_config_variables: { 4824*333d2b36SAndroid Build Coastguard Worker my_app_enabled: { 4825*333d2b36SAndroid Build Coastguard Worker enabled: true, 4826*333d2b36SAndroid Build Coastguard Worker conditions_default: { 4827*333d2b36SAndroid Build Coastguard Worker enabled: false 4828*333d2b36SAndroid Build Coastguard Worker }, 4829*333d2b36SAndroid Build Coastguard Worker }, 4830*333d2b36SAndroid Build Coastguard Worker } 4831*333d2b36SAndroid Build Coastguard Worker} 4832*333d2b36SAndroid Build Coastguard Worker` 4833*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 4834*333d2b36SAndroid Build Coastguard Worker desc string 4835*333d2b36SAndroid Build Coastguard Worker preparer android.FixturePreparer 4836*333d2b36SAndroid Build Coastguard Worker overlayApkExpected bool 4837*333d2b36SAndroid Build Coastguard Worker }{ 4838*333d2b36SAndroid Build Coastguard Worker { 4839*333d2b36SAndroid Build Coastguard Worker desc: "my_app_enabled is empty", 4840*333d2b36SAndroid Build Coastguard Worker overlayApkExpected: false, 4841*333d2b36SAndroid Build Coastguard Worker }, 4842*333d2b36SAndroid Build Coastguard Worker { 4843*333d2b36SAndroid Build Coastguard Worker desc: "my_app_enabled is true", 4844*333d2b36SAndroid Build Coastguard Worker overlayApkExpected: true, 4845*333d2b36SAndroid Build Coastguard Worker preparer: android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 4846*333d2b36SAndroid Build Coastguard Worker variables.VendorVars = map[string]map[string]string{ 4847*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 4848*333d2b36SAndroid Build Coastguard Worker "my_app_enabled": "true", 4849*333d2b36SAndroid Build Coastguard Worker }, 4850*333d2b36SAndroid Build Coastguard Worker } 4851*333d2b36SAndroid Build Coastguard Worker }), 4852*333d2b36SAndroid Build Coastguard Worker }, 4853*333d2b36SAndroid Build Coastguard Worker } 4854*333d2b36SAndroid Build Coastguard Worker for _, tc := range testCases { 4855*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 4856*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 4857*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithSoongConfigModuleBuildComponents, 4858*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 4859*333d2b36SAndroid Build Coastguard Worker variables.EnforceRROTargets = []string{"*"} 4860*333d2b36SAndroid Build Coastguard Worker }), 4861*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 4862*333d2b36SAndroid Build Coastguard Worker variables.DeviceResourceOverlays = []string{"device/company/test_product"} 4863*333d2b36SAndroid Build Coastguard Worker }), 4864*333d2b36SAndroid Build Coastguard Worker android.MockFS{ 4865*333d2b36SAndroid Build Coastguard Worker "res/foo.xml": nil, 4866*333d2b36SAndroid Build Coastguard Worker "device/company/test_product/res/foo.xml": nil, 4867*333d2b36SAndroid Build Coastguard Worker }.AddToFixture(), 4868*333d2b36SAndroid Build Coastguard Worker android.OptionalFixturePreparer(tc.preparer), 4869*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 4870*333d2b36SAndroid Build Coastguard Worker overrideVendorOverlayApk := result.ModuleForTests("override_foo__test_product__auto_generated_rro_vendor", "android_arm64_armv8-a").Module().(*AutogenRuntimeResourceOverlay) 4871*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, tc.desc, tc.overlayApkExpected, overrideVendorOverlayApk.exportPackage != nil) 4872*333d2b36SAndroid Build Coastguard Worker } 4873*333d2b36SAndroid Build Coastguard Worker} 4874