1*333d2b36SAndroid Build Coastguard Worker// Copyright 2020 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage java 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "reflect" 19*333d2b36SAndroid Build Coastguard Worker "strings" 20*333d2b36SAndroid Build Coastguard Worker "testing" 21*333d2b36SAndroid Build Coastguard Worker 22*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 23*333d2b36SAndroid Build Coastguard Worker "android/soong/shared" 24*333d2b36SAndroid Build Coastguard Worker) 25*333d2b36SAndroid Build Coastguard Worker 26*333d2b36SAndroid Build Coastguard Workerfunc TestRuntimeResourceOverlay(t *testing.T) { 27*333d2b36SAndroid Build Coastguard Worker fs := android.MockFS{ 28*333d2b36SAndroid Build Coastguard Worker "baz/res/res/values/strings.xml": nil, 29*333d2b36SAndroid Build Coastguard Worker "bar/res/res/values/strings.xml": nil, 30*333d2b36SAndroid Build Coastguard Worker } 31*333d2b36SAndroid Build Coastguard Worker bp := ` 32*333d2b36SAndroid Build Coastguard Worker runtime_resource_overlay { 33*333d2b36SAndroid Build Coastguard Worker name: "foo", 34*333d2b36SAndroid Build Coastguard Worker certificate: "platform", 35*333d2b36SAndroid Build Coastguard Worker lineage: "lineage.bin", 36*333d2b36SAndroid Build Coastguard Worker rotationMinSdkVersion: "32", 37*333d2b36SAndroid Build Coastguard Worker product_specific: true, 38*333d2b36SAndroid Build Coastguard Worker static_libs: ["bar"], 39*333d2b36SAndroid Build Coastguard Worker resource_libs: ["baz"], 40*333d2b36SAndroid Build Coastguard Worker aaptflags: ["--keep-raw-values"], 41*333d2b36SAndroid Build Coastguard Worker } 42*333d2b36SAndroid Build Coastguard Worker 43*333d2b36SAndroid Build Coastguard Worker runtime_resource_overlay { 44*333d2b36SAndroid Build Coastguard Worker name: "foo_themed", 45*333d2b36SAndroid Build Coastguard Worker certificate: "platform", 46*333d2b36SAndroid Build Coastguard Worker product_specific: true, 47*333d2b36SAndroid Build Coastguard Worker theme: "faza", 48*333d2b36SAndroid Build Coastguard Worker overrides: ["foo"], 49*333d2b36SAndroid Build Coastguard Worker } 50*333d2b36SAndroid Build Coastguard Worker 51*333d2b36SAndroid Build Coastguard Worker android_library { 52*333d2b36SAndroid Build Coastguard Worker name: "bar", 53*333d2b36SAndroid Build Coastguard Worker resource_dirs: ["bar/res"], 54*333d2b36SAndroid Build Coastguard Worker } 55*333d2b36SAndroid Build Coastguard Worker 56*333d2b36SAndroid Build Coastguard Worker android_app { 57*333d2b36SAndroid Build Coastguard Worker name: "baz", 58*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 59*333d2b36SAndroid Build Coastguard Worker resource_dirs: ["baz/res"], 60*333d2b36SAndroid Build Coastguard Worker } 61*333d2b36SAndroid Build Coastguard Worker ` 62*333d2b36SAndroid Build Coastguard Worker 63*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 64*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 65*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyConfig(android.SetKatiEnabledForTests), 66*333d2b36SAndroid Build Coastguard Worker fs.AddToFixture(), 67*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 68*333d2b36SAndroid Build Coastguard Worker 69*333d2b36SAndroid Build Coastguard Worker m := result.ModuleForTests("foo", "android_common") 70*333d2b36SAndroid Build Coastguard Worker 71*333d2b36SAndroid Build Coastguard Worker // Check AAPT2 link flags. 72*333d2b36SAndroid Build Coastguard Worker aapt2Flags := m.Output("package-res.apk").Args["flags"] 73*333d2b36SAndroid Build Coastguard Worker expectedFlags := []string{"--keep-raw-values", "--no-resource-deduping", "--no-resource-removal"} 74*333d2b36SAndroid Build Coastguard Worker absentFlags := android.RemoveListFromList(expectedFlags, strings.Split(aapt2Flags, " ")) 75*333d2b36SAndroid Build Coastguard Worker if len(absentFlags) > 0 { 76*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected values, %q are missing in aapt2 link flags, %q", absentFlags, aapt2Flags) 77*333d2b36SAndroid Build Coastguard Worker } 78*333d2b36SAndroid Build Coastguard Worker 79*333d2b36SAndroid Build Coastguard Worker // Check overlay.list output for static_libs dependency. 80*333d2b36SAndroid Build Coastguard Worker overlayList := android.PathsRelativeToTop(m.Output("aapt2/overlay.list").Inputs) 81*333d2b36SAndroid Build Coastguard Worker staticLibPackage := "out/soong/.intermediates/bar/android_common/package-res.apk" 82*333d2b36SAndroid Build Coastguard Worker if !inList(staticLibPackage, overlayList) { 83*333d2b36SAndroid Build Coastguard Worker t.Errorf("Stactic lib res package %q missing in overlay list: %q", staticLibPackage, overlayList) 84*333d2b36SAndroid Build Coastguard Worker } 85*333d2b36SAndroid Build Coastguard Worker 86*333d2b36SAndroid Build Coastguard Worker // Check AAPT2 link flags for resource_libs dependency. 87*333d2b36SAndroid Build Coastguard Worker resourceLibFlag := "-I " + "out/soong/.intermediates/baz/android_common/package-res.apk" 88*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(aapt2Flags, resourceLibFlag) { 89*333d2b36SAndroid Build Coastguard Worker t.Errorf("Resource lib flag %q missing in aapt2 link flags: %q", resourceLibFlag, aapt2Flags) 90*333d2b36SAndroid Build Coastguard Worker } 91*333d2b36SAndroid Build Coastguard Worker 92*333d2b36SAndroid Build Coastguard Worker // Check cert signing flags. 93*333d2b36SAndroid Build Coastguard Worker signedApk := m.Output("signed/foo.apk") 94*333d2b36SAndroid Build Coastguard Worker actualCertSigningFlags := signedApk.Args["flags"] 95*333d2b36SAndroid Build Coastguard Worker expectedCertSigningFlags := "--lineage lineage.bin --rotation-min-sdk-version 32" 96*333d2b36SAndroid Build Coastguard Worker if expectedCertSigningFlags != actualCertSigningFlags { 97*333d2b36SAndroid Build Coastguard Worker t.Errorf("Incorrect cert signing flags, expected: %q, got: %q", expectedCertSigningFlags, actualCertSigningFlags) 98*333d2b36SAndroid Build Coastguard Worker } 99*333d2b36SAndroid Build Coastguard Worker 100*333d2b36SAndroid Build Coastguard Worker signingFlag := signedApk.Args["certificates"] 101*333d2b36SAndroid Build Coastguard Worker expected := "build/make/target/product/security/platform.x509.pem build/make/target/product/security/platform.pk8" 102*333d2b36SAndroid Build Coastguard Worker if expected != signingFlag { 103*333d2b36SAndroid Build Coastguard Worker t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected, signingFlag) 104*333d2b36SAndroid Build Coastguard Worker } 105*333d2b36SAndroid Build Coastguard Worker androidMkEntries := android.AndroidMkEntriesForTest(t, result.TestContext, m.Module())[0] 106*333d2b36SAndroid Build Coastguard Worker path := androidMkEntries.EntryMap["LOCAL_CERTIFICATE"] 107*333d2b36SAndroid Build Coastguard Worker expectedPath := []string{"build/make/target/product/security/platform.x509.pem"} 108*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(path, expectedPath) { 109*333d2b36SAndroid Build Coastguard Worker t.Errorf("Unexpected LOCAL_CERTIFICATE value: %v, expected: %v", path, expectedPath) 110*333d2b36SAndroid Build Coastguard Worker } 111*333d2b36SAndroid Build Coastguard Worker 112*333d2b36SAndroid Build Coastguard Worker // Check device location. 113*333d2b36SAndroid Build Coastguard Worker path = androidMkEntries.EntryMap["LOCAL_MODULE_PATH"] 114*333d2b36SAndroid Build Coastguard Worker expectedPath = []string{shared.JoinPath("out/target/product/test_device/product/overlay")} 115*333d2b36SAndroid Build Coastguard Worker android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_MODULE_PATH", result.Config, expectedPath, path) 116*333d2b36SAndroid Build Coastguard Worker 117*333d2b36SAndroid Build Coastguard Worker // A themed module has a different device location 118*333d2b36SAndroid Build Coastguard Worker m = result.ModuleForTests("foo_themed", "android_common") 119*333d2b36SAndroid Build Coastguard Worker androidMkEntries = android.AndroidMkEntriesForTest(t, result.TestContext, m.Module())[0] 120*333d2b36SAndroid Build Coastguard Worker path = androidMkEntries.EntryMap["LOCAL_MODULE_PATH"] 121*333d2b36SAndroid Build Coastguard Worker expectedPath = []string{shared.JoinPath("out/target/product/test_device/product/overlay/faza")} 122*333d2b36SAndroid Build Coastguard Worker android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_MODULE_PATH", result.Config, expectedPath, path) 123*333d2b36SAndroid Build Coastguard Worker 124*333d2b36SAndroid Build Coastguard Worker overrides := androidMkEntries.EntryMap["LOCAL_OVERRIDES_PACKAGES"] 125*333d2b36SAndroid Build Coastguard Worker expectedOverrides := []string{"foo"} 126*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(overrides, expectedOverrides) { 127*333d2b36SAndroid Build Coastguard Worker t.Errorf("Unexpected LOCAL_OVERRIDES_PACKAGES value: %v, expected: %v", overrides, expectedOverrides) 128*333d2b36SAndroid Build Coastguard Worker } 129*333d2b36SAndroid Build Coastguard Worker} 130*333d2b36SAndroid Build Coastguard Worker 131*333d2b36SAndroid Build Coastguard Workerfunc TestRuntimeResourceOverlay_JavaDefaults(t *testing.T) { 132*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 133*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 134*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyConfig(android.SetKatiEnabledForTests), 135*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 136*333d2b36SAndroid Build Coastguard Worker java_defaults { 137*333d2b36SAndroid Build Coastguard Worker name: "rro_defaults", 138*333d2b36SAndroid Build Coastguard Worker theme: "default_theme", 139*333d2b36SAndroid Build Coastguard Worker product_specific: true, 140*333d2b36SAndroid Build Coastguard Worker aaptflags: ["--keep-raw-values"], 141*333d2b36SAndroid Build Coastguard Worker } 142*333d2b36SAndroid Build Coastguard Worker 143*333d2b36SAndroid Build Coastguard Worker runtime_resource_overlay { 144*333d2b36SAndroid Build Coastguard Worker name: "foo_with_defaults", 145*333d2b36SAndroid Build Coastguard Worker defaults: ["rro_defaults"], 146*333d2b36SAndroid Build Coastguard Worker } 147*333d2b36SAndroid Build Coastguard Worker 148*333d2b36SAndroid Build Coastguard Worker runtime_resource_overlay { 149*333d2b36SAndroid Build Coastguard Worker name: "foo_barebones", 150*333d2b36SAndroid Build Coastguard Worker } 151*333d2b36SAndroid Build Coastguard Worker `) 152*333d2b36SAndroid Build Coastguard Worker 153*333d2b36SAndroid Build Coastguard Worker // 154*333d2b36SAndroid Build Coastguard Worker // RRO module with defaults 155*333d2b36SAndroid Build Coastguard Worker // 156*333d2b36SAndroid Build Coastguard Worker m := result.ModuleForTests("foo_with_defaults", "android_common") 157*333d2b36SAndroid Build Coastguard Worker 158*333d2b36SAndroid Build Coastguard Worker // Check AAPT2 link flags. 159*333d2b36SAndroid Build Coastguard Worker aapt2Flags := strings.Split(m.Output("package-res.apk").Args["flags"], " ") 160*333d2b36SAndroid Build Coastguard Worker expectedFlags := []string{"--keep-raw-values", "--no-resource-deduping", "--no-resource-removal"} 161*333d2b36SAndroid Build Coastguard Worker absentFlags := android.RemoveListFromList(expectedFlags, aapt2Flags) 162*333d2b36SAndroid Build Coastguard Worker if len(absentFlags) > 0 { 163*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected values, %q are missing in aapt2 link flags, %q", absentFlags, aapt2Flags) 164*333d2b36SAndroid Build Coastguard Worker } 165*333d2b36SAndroid Build Coastguard Worker 166*333d2b36SAndroid Build Coastguard Worker // Check device location. 167*333d2b36SAndroid Build Coastguard Worker path := android.AndroidMkEntriesForTest(t, result.TestContext, m.Module())[0].EntryMap["LOCAL_MODULE_PATH"] 168*333d2b36SAndroid Build Coastguard Worker expectedPath := []string{shared.JoinPath("out/target/product/test_device/product/overlay/default_theme")} 169*333d2b36SAndroid Build Coastguard Worker android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_MODULE_PATH", result.Config, expectedPath, path) 170*333d2b36SAndroid Build Coastguard Worker 171*333d2b36SAndroid Build Coastguard Worker // 172*333d2b36SAndroid Build Coastguard Worker // RRO module without defaults 173*333d2b36SAndroid Build Coastguard Worker // 174*333d2b36SAndroid Build Coastguard Worker m = result.ModuleForTests("foo_barebones", "android_common") 175*333d2b36SAndroid Build Coastguard Worker 176*333d2b36SAndroid Build Coastguard Worker // Check AAPT2 link flags. 177*333d2b36SAndroid Build Coastguard Worker aapt2Flags = strings.Split(m.Output("package-res.apk").Args["flags"], " ") 178*333d2b36SAndroid Build Coastguard Worker unexpectedFlags := "--keep-raw-values" 179*333d2b36SAndroid Build Coastguard Worker if inList(unexpectedFlags, aapt2Flags) { 180*333d2b36SAndroid Build Coastguard Worker t.Errorf("unexpected value, %q is present in aapt2 link flags, %q", unexpectedFlags, aapt2Flags) 181*333d2b36SAndroid Build Coastguard Worker } 182*333d2b36SAndroid Build Coastguard Worker 183*333d2b36SAndroid Build Coastguard Worker // Check device location. 184*333d2b36SAndroid Build Coastguard Worker path = android.AndroidMkEntriesForTest(t, result.TestContext, m.Module())[0].EntryMap["LOCAL_MODULE_PATH"] 185*333d2b36SAndroid Build Coastguard Worker expectedPath = []string{shared.JoinPath("out/target/product/test_device/product/overlay")} 186*333d2b36SAndroid Build Coastguard Worker android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_MODULE_PATH", result.Config, expectedPath, path) 187*333d2b36SAndroid Build Coastguard Worker} 188*333d2b36SAndroid Build Coastguard Worker 189*333d2b36SAndroid Build Coastguard Workerfunc TestOverrideRuntimeResourceOverlay(t *testing.T) { 190*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 191*333d2b36SAndroid Build Coastguard Worker runtime_resource_overlay { 192*333d2b36SAndroid Build Coastguard Worker name: "foo_overlay", 193*333d2b36SAndroid Build Coastguard Worker certificate: "platform", 194*333d2b36SAndroid Build Coastguard Worker product_specific: true, 195*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 196*333d2b36SAndroid Build Coastguard Worker } 197*333d2b36SAndroid Build Coastguard Worker 198*333d2b36SAndroid Build Coastguard Worker override_runtime_resource_overlay { 199*333d2b36SAndroid Build Coastguard Worker name: "bar_overlay", 200*333d2b36SAndroid Build Coastguard Worker base: "foo_overlay", 201*333d2b36SAndroid Build Coastguard Worker package_name: "com.android.bar.overlay", 202*333d2b36SAndroid Build Coastguard Worker target_package_name: "com.android.bar", 203*333d2b36SAndroid Build Coastguard Worker category: "mycategory", 204*333d2b36SAndroid Build Coastguard Worker } 205*333d2b36SAndroid Build Coastguard Worker `) 206*333d2b36SAndroid Build Coastguard Worker 207*333d2b36SAndroid Build Coastguard Worker expectedVariants := []struct { 208*333d2b36SAndroid Build Coastguard Worker moduleName string 209*333d2b36SAndroid Build Coastguard Worker variantName string 210*333d2b36SAndroid Build Coastguard Worker apkPath string 211*333d2b36SAndroid Build Coastguard Worker overrides []string 212*333d2b36SAndroid Build Coastguard Worker targetVariant string 213*333d2b36SAndroid Build Coastguard Worker packageFlag string 214*333d2b36SAndroid Build Coastguard Worker targetPackageFlag string 215*333d2b36SAndroid Build Coastguard Worker categoryFlag string 216*333d2b36SAndroid Build Coastguard Worker }{ 217*333d2b36SAndroid Build Coastguard Worker { 218*333d2b36SAndroid Build Coastguard Worker variantName: "android_common", 219*333d2b36SAndroid Build Coastguard Worker apkPath: "out/soong/target/product/test_device/product/overlay/foo_overlay.apk", 220*333d2b36SAndroid Build Coastguard Worker overrides: nil, 221*333d2b36SAndroid Build Coastguard Worker targetVariant: "android_common", 222*333d2b36SAndroid Build Coastguard Worker packageFlag: "", 223*333d2b36SAndroid Build Coastguard Worker targetPackageFlag: "", 224*333d2b36SAndroid Build Coastguard Worker }, 225*333d2b36SAndroid Build Coastguard Worker { 226*333d2b36SAndroid Build Coastguard Worker variantName: "android_common_bar_overlay", 227*333d2b36SAndroid Build Coastguard Worker apkPath: "out/soong/target/product/test_device/product/overlay/bar_overlay.apk", 228*333d2b36SAndroid Build Coastguard Worker overrides: []string{"foo_overlay"}, 229*333d2b36SAndroid Build Coastguard Worker targetVariant: "android_common_bar", 230*333d2b36SAndroid Build Coastguard Worker packageFlag: "com.android.bar.overlay", 231*333d2b36SAndroid Build Coastguard Worker targetPackageFlag: "com.android.bar", 232*333d2b36SAndroid Build Coastguard Worker categoryFlag: "mycategory", 233*333d2b36SAndroid Build Coastguard Worker }, 234*333d2b36SAndroid Build Coastguard Worker } 235*333d2b36SAndroid Build Coastguard Worker for _, expected := range expectedVariants { 236*333d2b36SAndroid Build Coastguard Worker variant := ctx.ModuleForTests("foo_overlay", expected.variantName) 237*333d2b36SAndroid Build Coastguard Worker 238*333d2b36SAndroid Build Coastguard Worker // Check the final apk name 239*333d2b36SAndroid Build Coastguard Worker variant.Output(expected.apkPath) 240*333d2b36SAndroid Build Coastguard Worker 241*333d2b36SAndroid Build Coastguard Worker // Check if the overrides field values are correctly aggregated. 242*333d2b36SAndroid Build Coastguard Worker mod := variant.Module().(*RuntimeResourceOverlay) 243*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(expected.overrides, mod.properties.Overrides) { 244*333d2b36SAndroid Build Coastguard Worker t.Errorf("Incorrect overrides property value, expected: %q, got: %q", 245*333d2b36SAndroid Build Coastguard Worker expected.overrides, mod.properties.Overrides) 246*333d2b36SAndroid Build Coastguard Worker } 247*333d2b36SAndroid Build Coastguard Worker 248*333d2b36SAndroid Build Coastguard Worker // Check aapt2 flags. 249*333d2b36SAndroid Build Coastguard Worker res := variant.Output("package-res.apk") 250*333d2b36SAndroid Build Coastguard Worker aapt2Flags := res.Args["flags"] 251*333d2b36SAndroid Build Coastguard Worker checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag) 252*333d2b36SAndroid Build Coastguard Worker checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", "") 253*333d2b36SAndroid Build Coastguard Worker checkAapt2LinkFlag(t, aapt2Flags, "rename-overlay-target-package", expected.targetPackageFlag) 254*333d2b36SAndroid Build Coastguard Worker checkAapt2LinkFlag(t, aapt2Flags, "rename-overlay-category", expected.categoryFlag) 255*333d2b36SAndroid Build Coastguard Worker } 256*333d2b36SAndroid Build Coastguard Worker} 257*333d2b36SAndroid Build Coastguard Worker 258*333d2b36SAndroid Build Coastguard Workerfunc TestRuntimeResourceOverlayPartition(t *testing.T) { 259*333d2b36SAndroid Build Coastguard Worker bp := ` 260*333d2b36SAndroid Build Coastguard Worker runtime_resource_overlay { 261*333d2b36SAndroid Build Coastguard Worker name: "device_specific", 262*333d2b36SAndroid Build Coastguard Worker device_specific: true, 263*333d2b36SAndroid Build Coastguard Worker } 264*333d2b36SAndroid Build Coastguard Worker runtime_resource_overlay { 265*333d2b36SAndroid Build Coastguard Worker name: "soc_specific", 266*333d2b36SAndroid Build Coastguard Worker soc_specific: true, 267*333d2b36SAndroid Build Coastguard Worker } 268*333d2b36SAndroid Build Coastguard Worker runtime_resource_overlay { 269*333d2b36SAndroid Build Coastguard Worker name: "system_ext_specific", 270*333d2b36SAndroid Build Coastguard Worker system_ext_specific: true, 271*333d2b36SAndroid Build Coastguard Worker } 272*333d2b36SAndroid Build Coastguard Worker runtime_resource_overlay { 273*333d2b36SAndroid Build Coastguard Worker name: "product_specific", 274*333d2b36SAndroid Build Coastguard Worker product_specific: true, 275*333d2b36SAndroid Build Coastguard Worker } 276*333d2b36SAndroid Build Coastguard Worker runtime_resource_overlay { 277*333d2b36SAndroid Build Coastguard Worker name: "default" 278*333d2b36SAndroid Build Coastguard Worker } 279*333d2b36SAndroid Build Coastguard Worker ` 280*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 281*333d2b36SAndroid Build Coastguard Worker name string 282*333d2b36SAndroid Build Coastguard Worker expectedPath string 283*333d2b36SAndroid Build Coastguard Worker }{ 284*333d2b36SAndroid Build Coastguard Worker { 285*333d2b36SAndroid Build Coastguard Worker name: "device_specific", 286*333d2b36SAndroid Build Coastguard Worker expectedPath: "out/soong/target/product/test_device/odm/overlay", 287*333d2b36SAndroid Build Coastguard Worker }, 288*333d2b36SAndroid Build Coastguard Worker { 289*333d2b36SAndroid Build Coastguard Worker name: "soc_specific", 290*333d2b36SAndroid Build Coastguard Worker expectedPath: "out/soong/target/product/test_device/vendor/overlay", 291*333d2b36SAndroid Build Coastguard Worker }, 292*333d2b36SAndroid Build Coastguard Worker { 293*333d2b36SAndroid Build Coastguard Worker name: "system_ext_specific", 294*333d2b36SAndroid Build Coastguard Worker expectedPath: "out/soong/target/product/test_device/system_ext/overlay", 295*333d2b36SAndroid Build Coastguard Worker }, 296*333d2b36SAndroid Build Coastguard Worker { 297*333d2b36SAndroid Build Coastguard Worker name: "product_specific", 298*333d2b36SAndroid Build Coastguard Worker expectedPath: "out/soong/target/product/test_device/product/overlay", 299*333d2b36SAndroid Build Coastguard Worker }, 300*333d2b36SAndroid Build Coastguard Worker { 301*333d2b36SAndroid Build Coastguard Worker name: "default", 302*333d2b36SAndroid Build Coastguard Worker expectedPath: "out/soong/target/product/test_device/product/overlay", 303*333d2b36SAndroid Build Coastguard Worker }, 304*333d2b36SAndroid Build Coastguard Worker } 305*333d2b36SAndroid Build Coastguard Worker for _, testCase := range testCases { 306*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, bp) 307*333d2b36SAndroid Build Coastguard Worker mod := ctx.ModuleForTests(testCase.name, "android_common").Module().(*RuntimeResourceOverlay) 308*333d2b36SAndroid Build Coastguard Worker android.AssertPathRelativeToTopEquals(t, "Install dir is not correct for "+testCase.name, testCase.expectedPath, mod.installDir) 309*333d2b36SAndroid Build Coastguard Worker } 310*333d2b36SAndroid Build Coastguard Worker} 311*333d2b36SAndroid Build Coastguard Worker 312*333d2b36SAndroid Build Coastguard Workerfunc TestRuntimeResourceOverlayFlagsPackages(t *testing.T) { 313*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 314*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 315*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 316*333d2b36SAndroid Build Coastguard Worker runtime_resource_overlay { 317*333d2b36SAndroid Build Coastguard Worker name: "foo", 318*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 319*333d2b36SAndroid Build Coastguard Worker flags_packages: [ 320*333d2b36SAndroid Build Coastguard Worker "bar", 321*333d2b36SAndroid Build Coastguard Worker "baz", 322*333d2b36SAndroid Build Coastguard Worker ], 323*333d2b36SAndroid Build Coastguard Worker } 324*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 325*333d2b36SAndroid Build Coastguard Worker name: "bar", 326*333d2b36SAndroid Build Coastguard Worker package: "com.example.package.bar", 327*333d2b36SAndroid Build Coastguard Worker container: "com.android.foo", 328*333d2b36SAndroid Build Coastguard Worker srcs: [ 329*333d2b36SAndroid Build Coastguard Worker "bar.aconfig", 330*333d2b36SAndroid Build Coastguard Worker ], 331*333d2b36SAndroid Build Coastguard Worker } 332*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 333*333d2b36SAndroid Build Coastguard Worker name: "baz", 334*333d2b36SAndroid Build Coastguard Worker package: "com.example.package.baz", 335*333d2b36SAndroid Build Coastguard Worker container: "com.android.foo", 336*333d2b36SAndroid Build Coastguard Worker srcs: [ 337*333d2b36SAndroid Build Coastguard Worker "baz.aconfig", 338*333d2b36SAndroid Build Coastguard Worker ], 339*333d2b36SAndroid Build Coastguard Worker } 340*333d2b36SAndroid Build Coastguard Worker `) 341*333d2b36SAndroid Build Coastguard Worker 342*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", "android_common") 343*333d2b36SAndroid Build Coastguard Worker 344*333d2b36SAndroid Build Coastguard Worker // runtime_resource_overlay module depends on aconfig_declarations listed in flags_packages 345*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, "foo expected to depend on bar", true, 346*333d2b36SAndroid Build Coastguard Worker CheckModuleHasDependency(t, result.TestContext, "foo", "android_common", "bar")) 347*333d2b36SAndroid Build Coastguard Worker 348*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, "foo expected to depend on baz", true, 349*333d2b36SAndroid Build Coastguard Worker CheckModuleHasDependency(t, result.TestContext, "foo", "android_common", "baz")) 350*333d2b36SAndroid Build Coastguard Worker 351*333d2b36SAndroid Build Coastguard Worker aapt2LinkRule := foo.Rule("android/soong/java.aapt2Link") 352*333d2b36SAndroid Build Coastguard Worker linkInFlags := aapt2LinkRule.Args["inFlags"] 353*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, 354*333d2b36SAndroid Build Coastguard Worker "aapt2 link command expected to pass feature flags arguments", 355*333d2b36SAndroid Build Coastguard Worker linkInFlags, 356*333d2b36SAndroid Build Coastguard Worker "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt", 357*333d2b36SAndroid Build Coastguard Worker ) 358*333d2b36SAndroid Build Coastguard Worker} 359