1*333d2b36SAndroid Build Coastguard Worker// Copyright 2018 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 apex 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "fmt" 19*333d2b36SAndroid Build Coastguard Worker "path" 20*333d2b36SAndroid Build Coastguard Worker "path/filepath" 21*333d2b36SAndroid Build Coastguard Worker "reflect" 22*333d2b36SAndroid Build Coastguard Worker "regexp" 23*333d2b36SAndroid Build Coastguard Worker "slices" 24*333d2b36SAndroid Build Coastguard Worker "sort" 25*333d2b36SAndroid Build Coastguard Worker "strconv" 26*333d2b36SAndroid Build Coastguard Worker "strings" 27*333d2b36SAndroid Build Coastguard Worker "testing" 28*333d2b36SAndroid Build Coastguard Worker 29*333d2b36SAndroid Build Coastguard Worker "android/soong/aconfig/codegen" 30*333d2b36SAndroid Build Coastguard Worker 31*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 32*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/bpmodify" 33*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 34*333d2b36SAndroid Build Coastguard Worker 35*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 36*333d2b36SAndroid Build Coastguard Worker "android/soong/bpf" 37*333d2b36SAndroid Build Coastguard Worker "android/soong/cc" 38*333d2b36SAndroid Build Coastguard Worker "android/soong/dexpreopt" 39*333d2b36SAndroid Build Coastguard Worker prebuilt_etc "android/soong/etc" 40*333d2b36SAndroid Build Coastguard Worker "android/soong/filesystem" 41*333d2b36SAndroid Build Coastguard Worker "android/soong/java" 42*333d2b36SAndroid Build Coastguard Worker "android/soong/rust" 43*333d2b36SAndroid Build Coastguard Worker "android/soong/sh" 44*333d2b36SAndroid Build Coastguard Worker) 45*333d2b36SAndroid Build Coastguard Worker 46*333d2b36SAndroid Build Coastguard Worker// names returns name list from white space separated string 47*333d2b36SAndroid Build Coastguard Workerfunc names(s string) (ns []string) { 48*333d2b36SAndroid Build Coastguard Worker for _, n := range strings.Split(s, " ") { 49*333d2b36SAndroid Build Coastguard Worker if len(n) > 0 { 50*333d2b36SAndroid Build Coastguard Worker ns = append(ns, n) 51*333d2b36SAndroid Build Coastguard Worker } 52*333d2b36SAndroid Build Coastguard Worker } 53*333d2b36SAndroid Build Coastguard Worker return 54*333d2b36SAndroid Build Coastguard Worker} 55*333d2b36SAndroid Build Coastguard Worker 56*333d2b36SAndroid Build Coastguard Workerfunc testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) { 57*333d2b36SAndroid Build Coastguard Worker t.Helper() 58*333d2b36SAndroid Build Coastguard Worker android.GroupFixturePreparers( 59*333d2b36SAndroid Build Coastguard Worker prepareForApexTest, 60*333d2b36SAndroid Build Coastguard Worker android.GroupFixturePreparers(preparers...), 61*333d2b36SAndroid Build Coastguard Worker ). 62*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)). 63*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, bp) 64*333d2b36SAndroid Build Coastguard Worker} 65*333d2b36SAndroid Build Coastguard Worker 66*333d2b36SAndroid Build Coastguard Workerfunc testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext { 67*333d2b36SAndroid Build Coastguard Worker t.Helper() 68*333d2b36SAndroid Build Coastguard Worker 69*333d2b36SAndroid Build Coastguard Worker optionalBpPreparer := android.NullFixturePreparer 70*333d2b36SAndroid Build Coastguard Worker if bp != "" { 71*333d2b36SAndroid Build Coastguard Worker optionalBpPreparer = android.FixtureWithRootAndroidBp(bp) 72*333d2b36SAndroid Build Coastguard Worker } 73*333d2b36SAndroid Build Coastguard Worker 74*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 75*333d2b36SAndroid Build Coastguard Worker prepareForApexTest, 76*333d2b36SAndroid Build Coastguard Worker android.GroupFixturePreparers(preparers...), 77*333d2b36SAndroid Build Coastguard Worker optionalBpPreparer, 78*333d2b36SAndroid Build Coastguard Worker ).RunTest(t) 79*333d2b36SAndroid Build Coastguard Worker 80*333d2b36SAndroid Build Coastguard Worker return result.TestContext 81*333d2b36SAndroid Build Coastguard Worker} 82*333d2b36SAndroid Build Coastguard Worker 83*333d2b36SAndroid Build Coastguard Workerfunc withFiles(files android.MockFS) android.FixturePreparer { 84*333d2b36SAndroid Build Coastguard Worker return files.AddToFixture() 85*333d2b36SAndroid Build Coastguard Worker} 86*333d2b36SAndroid Build Coastguard Worker 87*333d2b36SAndroid Build Coastguard Workerfunc withManifestPackageNameOverrides(specs []string) android.FixturePreparer { 88*333d2b36SAndroid Build Coastguard Worker return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 89*333d2b36SAndroid Build Coastguard Worker variables.ManifestPackageNameOverrides = specs 90*333d2b36SAndroid Build Coastguard Worker }) 91*333d2b36SAndroid Build Coastguard Worker} 92*333d2b36SAndroid Build Coastguard Worker 93*333d2b36SAndroid Build Coastguard Workerfunc withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer { 94*333d2b36SAndroid Build Coastguard Worker return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 95*333d2b36SAndroid Build Coastguard Worker variables.ApexGlobalMinSdkVersionOverride = minSdkOverride 96*333d2b36SAndroid Build Coastguard Worker }) 97*333d2b36SAndroid Build Coastguard Worker} 98*333d2b36SAndroid Build Coastguard Worker 99*333d2b36SAndroid Build Coastguard Workervar withBinder32bit = android.FixtureModifyProductVariables( 100*333d2b36SAndroid Build Coastguard Worker func(variables android.FixtureProductVariables) { 101*333d2b36SAndroid Build Coastguard Worker variables.Binder32bit = proptools.BoolPtr(true) 102*333d2b36SAndroid Build Coastguard Worker }, 103*333d2b36SAndroid Build Coastguard Worker) 104*333d2b36SAndroid Build Coastguard Worker 105*333d2b36SAndroid Build Coastguard Workervar withUnbundledBuild = android.FixtureModifyProductVariables( 106*333d2b36SAndroid Build Coastguard Worker func(variables android.FixtureProductVariables) { 107*333d2b36SAndroid Build Coastguard Worker variables.Unbundled_build = proptools.BoolPtr(true) 108*333d2b36SAndroid Build Coastguard Worker }, 109*333d2b36SAndroid Build Coastguard Worker) 110*333d2b36SAndroid Build Coastguard Worker 111*333d2b36SAndroid Build Coastguard Worker// Legacy preparer used for running tests within the apex package. 112*333d2b36SAndroid Build Coastguard Worker// 113*333d2b36SAndroid Build Coastguard Worker// This includes everything that was needed to run any test in the apex package prior to the 114*333d2b36SAndroid Build Coastguard Worker// introduction of the test fixtures. Tests that are being converted to use fixtures directly 115*333d2b36SAndroid Build Coastguard Worker// rather than through the testApex...() methods should avoid using this and instead use the 116*333d2b36SAndroid Build Coastguard Worker// various preparers directly, using android.GroupFixturePreparers(...) to group them when 117*333d2b36SAndroid Build Coastguard Worker// necessary. 118*333d2b36SAndroid Build Coastguard Worker// 119*333d2b36SAndroid Build Coastguard Worker// deprecated 120*333d2b36SAndroid Build Coastguard Workervar prepareForApexTest = android.GroupFixturePreparers( 121*333d2b36SAndroid Build Coastguard Worker // General preparers in alphabetical order as test infrastructure will enforce correct 122*333d2b36SAndroid Build Coastguard Worker // registration order. 123*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithAndroidBuildComponents, 124*333d2b36SAndroid Build Coastguard Worker bpf.PrepareForTestWithBpf, 125*333d2b36SAndroid Build Coastguard Worker cc.PrepareForTestWithCcBuildComponents, 126*333d2b36SAndroid Build Coastguard Worker java.PrepareForTestWithDexpreopt, 127*333d2b36SAndroid Build Coastguard Worker prebuilt_etc.PrepareForTestWithPrebuiltEtc, 128*333d2b36SAndroid Build Coastguard Worker rust.PrepareForTestWithRustDefaultModules, 129*333d2b36SAndroid Build Coastguard Worker sh.PrepareForTestWithShBuildComponents, 130*333d2b36SAndroid Build Coastguard Worker codegen.PrepareForTestWithAconfigBuildComponents, 131*333d2b36SAndroid Build Coastguard Worker 132*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithApexBuildComponents, 133*333d2b36SAndroid Build Coastguard Worker 134*333d2b36SAndroid Build Coastguard Worker // Additional apex test specific preparers. 135*333d2b36SAndroid Build Coastguard Worker android.FixtureAddTextFile("system/sepolicy/Android.bp", ` 136*333d2b36SAndroid Build Coastguard Worker filegroup { 137*333d2b36SAndroid Build Coastguard Worker name: "myapex-file_contexts", 138*333d2b36SAndroid Build Coastguard Worker srcs: [ 139*333d2b36SAndroid Build Coastguard Worker "apex/myapex-file_contexts", 140*333d2b36SAndroid Build Coastguard Worker ], 141*333d2b36SAndroid Build Coastguard Worker } 142*333d2b36SAndroid Build Coastguard Worker `), 143*333d2b36SAndroid Build Coastguard Worker prepareForTestWithMyapex, 144*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs(android.MockFS{ 145*333d2b36SAndroid Build Coastguard Worker "a.java": nil, 146*333d2b36SAndroid Build Coastguard Worker "PrebuiltAppFoo.apk": nil, 147*333d2b36SAndroid Build Coastguard Worker "PrebuiltAppFooPriv.apk": nil, 148*333d2b36SAndroid Build Coastguard Worker "apex_manifest.json": nil, 149*333d2b36SAndroid Build Coastguard Worker "AndroidManifest.xml": nil, 150*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/myapex.updatable-file_contexts": nil, 151*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/myapex2-file_contexts": nil, 152*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/otherapex-file_contexts": nil, 153*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/com.android.vndk-file_contexts": nil, 154*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil, 155*333d2b36SAndroid Build Coastguard Worker "mylib.cpp": nil, 156*333d2b36SAndroid Build Coastguard Worker "mytest.cpp": nil, 157*333d2b36SAndroid Build Coastguard Worker "mytest1.cpp": nil, 158*333d2b36SAndroid Build Coastguard Worker "mytest2.cpp": nil, 159*333d2b36SAndroid Build Coastguard Worker "mytest3.cpp": nil, 160*333d2b36SAndroid Build Coastguard Worker "myprebuilt": nil, 161*333d2b36SAndroid Build Coastguard Worker "my_include": nil, 162*333d2b36SAndroid Build Coastguard Worker "foo/bar/MyClass.java": nil, 163*333d2b36SAndroid Build Coastguard Worker "prebuilt.jar": nil, 164*333d2b36SAndroid Build Coastguard Worker "prebuilt.so": nil, 165*333d2b36SAndroid Build Coastguard Worker "vendor/foo/devkeys/test.x509.pem": nil, 166*333d2b36SAndroid Build Coastguard Worker "vendor/foo/devkeys/test.pk8": nil, 167*333d2b36SAndroid Build Coastguard Worker "testkey.x509.pem": nil, 168*333d2b36SAndroid Build Coastguard Worker "testkey.pk8": nil, 169*333d2b36SAndroid Build Coastguard Worker "testkey.override.x509.pem": nil, 170*333d2b36SAndroid Build Coastguard Worker "testkey.override.pk8": nil, 171*333d2b36SAndroid Build Coastguard Worker "vendor/foo/devkeys/testkey.avbpubkey": nil, 172*333d2b36SAndroid Build Coastguard Worker "vendor/foo/devkeys/testkey.pem": nil, 173*333d2b36SAndroid Build Coastguard Worker "NOTICE": nil, 174*333d2b36SAndroid Build Coastguard Worker "custom_notice": nil, 175*333d2b36SAndroid Build Coastguard Worker "custom_notice_for_static_lib": nil, 176*333d2b36SAndroid Build Coastguard Worker "testkey2.avbpubkey": nil, 177*333d2b36SAndroid Build Coastguard Worker "testkey2.pem": nil, 178*333d2b36SAndroid Build Coastguard Worker "myapex-arm64.apex": nil, 179*333d2b36SAndroid Build Coastguard Worker "myapex-arm.apex": nil, 180*333d2b36SAndroid Build Coastguard Worker "myapex.apks": nil, 181*333d2b36SAndroid Build Coastguard Worker "frameworks/base/api/current.txt": nil, 182*333d2b36SAndroid Build Coastguard Worker "framework/aidl/a.aidl": nil, 183*333d2b36SAndroid Build Coastguard Worker "dummy.txt": nil, 184*333d2b36SAndroid Build Coastguard Worker "baz": nil, 185*333d2b36SAndroid Build Coastguard Worker "bar/baz": nil, 186*333d2b36SAndroid Build Coastguard Worker "testdata/baz": nil, 187*333d2b36SAndroid Build Coastguard Worker "AppSet.apks": nil, 188*333d2b36SAndroid Build Coastguard Worker "foo.rs": nil, 189*333d2b36SAndroid Build Coastguard Worker "libfoo.jar": nil, 190*333d2b36SAndroid Build Coastguard Worker "libbar.jar": nil, 191*333d2b36SAndroid Build Coastguard Worker }, 192*333d2b36SAndroid Build Coastguard Worker ), 193*333d2b36SAndroid Build Coastguard Worker 194*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 195*333d2b36SAndroid Build Coastguard Worker variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test") 196*333d2b36SAndroid Build Coastguard Worker variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"} 197*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_codename = proptools.StringPtr("Q") 198*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_final = proptools.BoolPtr(false) 199*333d2b36SAndroid Build Coastguard Worker // "Tiramisu" needs to be in the next line for compatibility with soong code, 200*333d2b36SAndroid Build Coastguard Worker // not because of these tests specifically (it's not used by the tests) 201*333d2b36SAndroid Build Coastguard Worker variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"} 202*333d2b36SAndroid Build Coastguard Worker variables.BuildId = proptools.StringPtr("TEST.BUILD_ID") 203*333d2b36SAndroid Build Coastguard Worker }), 204*333d2b36SAndroid Build Coastguard Worker) 205*333d2b36SAndroid Build Coastguard Worker 206*333d2b36SAndroid Build Coastguard Workervar prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{ 207*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/myapex-file_contexts": nil, 208*333d2b36SAndroid Build Coastguard Worker}) 209*333d2b36SAndroid Build Coastguard Worker 210*333d2b36SAndroid Build Coastguard Workervar prepareForTestWithOtherapex = android.FixtureMergeMockFs(android.MockFS{ 211*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/otherapex-file_contexts": nil, 212*333d2b36SAndroid Build Coastguard Worker}) 213*333d2b36SAndroid Build Coastguard Worker 214*333d2b36SAndroid Build Coastguard Worker// ensure that 'result' equals 'expected' 215*333d2b36SAndroid Build Coastguard Workerfunc ensureEquals(t *testing.T, result string, expected string) { 216*333d2b36SAndroid Build Coastguard Worker t.Helper() 217*333d2b36SAndroid Build Coastguard Worker if result != expected { 218*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q != %q", expected, result) 219*333d2b36SAndroid Build Coastguard Worker } 220*333d2b36SAndroid Build Coastguard Worker} 221*333d2b36SAndroid Build Coastguard Worker 222*333d2b36SAndroid Build Coastguard Worker// ensure that 'result' contains 'expected' 223*333d2b36SAndroid Build Coastguard Workerfunc ensureContains(t *testing.T, result string, expected string) { 224*333d2b36SAndroid Build Coastguard Worker t.Helper() 225*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(result, expected) { 226*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q is not found in %q", expected, result) 227*333d2b36SAndroid Build Coastguard Worker } 228*333d2b36SAndroid Build Coastguard Worker} 229*333d2b36SAndroid Build Coastguard Worker 230*333d2b36SAndroid Build Coastguard Worker// ensure that 'result' contains 'expected' exactly one time 231*333d2b36SAndroid Build Coastguard Workerfunc ensureContainsOnce(t *testing.T, result string, expected string) { 232*333d2b36SAndroid Build Coastguard Worker t.Helper() 233*333d2b36SAndroid Build Coastguard Worker count := strings.Count(result, expected) 234*333d2b36SAndroid Build Coastguard Worker if count != 1 { 235*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result) 236*333d2b36SAndroid Build Coastguard Worker } 237*333d2b36SAndroid Build Coastguard Worker} 238*333d2b36SAndroid Build Coastguard Worker 239*333d2b36SAndroid Build Coastguard Worker// ensures that 'result' does not contain 'notExpected' 240*333d2b36SAndroid Build Coastguard Workerfunc ensureNotContains(t *testing.T, result string, notExpected string) { 241*333d2b36SAndroid Build Coastguard Worker t.Helper() 242*333d2b36SAndroid Build Coastguard Worker if strings.Contains(result, notExpected) { 243*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q is found in %q", notExpected, result) 244*333d2b36SAndroid Build Coastguard Worker } 245*333d2b36SAndroid Build Coastguard Worker} 246*333d2b36SAndroid Build Coastguard Worker 247*333d2b36SAndroid Build Coastguard Workerfunc ensureMatches(t *testing.T, result string, expectedRex string) { 248*333d2b36SAndroid Build Coastguard Worker t.Helper() 249*333d2b36SAndroid Build Coastguard Worker ok, err := regexp.MatchString(expectedRex, result) 250*333d2b36SAndroid Build Coastguard Worker if err != nil { 251*333d2b36SAndroid Build Coastguard Worker t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err) 252*333d2b36SAndroid Build Coastguard Worker return 253*333d2b36SAndroid Build Coastguard Worker } 254*333d2b36SAndroid Build Coastguard Worker if !ok { 255*333d2b36SAndroid Build Coastguard Worker t.Errorf("%s does not match regular expession %s", result, expectedRex) 256*333d2b36SAndroid Build Coastguard Worker } 257*333d2b36SAndroid Build Coastguard Worker} 258*333d2b36SAndroid Build Coastguard Worker 259*333d2b36SAndroid Build Coastguard Workerfunc ensureListContainsMatch(t *testing.T, result []string, expectedRex string) { 260*333d2b36SAndroid Build Coastguard Worker t.Helper() 261*333d2b36SAndroid Build Coastguard Worker p := regexp.MustCompile(expectedRex) 262*333d2b36SAndroid Build Coastguard Worker if android.IndexListPred(func(s string) bool { return p.MatchString(s) }, result) == -1 { 263*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q is not found in %v", expectedRex, result) 264*333d2b36SAndroid Build Coastguard Worker } 265*333d2b36SAndroid Build Coastguard Worker} 266*333d2b36SAndroid Build Coastguard Worker 267*333d2b36SAndroid Build Coastguard Workerfunc ensureListContains(t *testing.T, result []string, expected string) { 268*333d2b36SAndroid Build Coastguard Worker t.Helper() 269*333d2b36SAndroid Build Coastguard Worker if !android.InList(expected, result) { 270*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q is not found in %v", expected, result) 271*333d2b36SAndroid Build Coastguard Worker } 272*333d2b36SAndroid Build Coastguard Worker} 273*333d2b36SAndroid Build Coastguard Worker 274*333d2b36SAndroid Build Coastguard Workerfunc ensureListNotContains(t *testing.T, result []string, notExpected string) { 275*333d2b36SAndroid Build Coastguard Worker t.Helper() 276*333d2b36SAndroid Build Coastguard Worker if android.InList(notExpected, result) { 277*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q is found in %v", notExpected, result) 278*333d2b36SAndroid Build Coastguard Worker } 279*333d2b36SAndroid Build Coastguard Worker} 280*333d2b36SAndroid Build Coastguard Worker 281*333d2b36SAndroid Build Coastguard Workerfunc ensureListEmpty(t *testing.T, result []string) { 282*333d2b36SAndroid Build Coastguard Worker t.Helper() 283*333d2b36SAndroid Build Coastguard Worker if len(result) > 0 { 284*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q is expected to be empty", result) 285*333d2b36SAndroid Build Coastguard Worker } 286*333d2b36SAndroid Build Coastguard Worker} 287*333d2b36SAndroid Build Coastguard Worker 288*333d2b36SAndroid Build Coastguard Workerfunc ensureListNotEmpty(t *testing.T, result []string) { 289*333d2b36SAndroid Build Coastguard Worker t.Helper() 290*333d2b36SAndroid Build Coastguard Worker if len(result) == 0 { 291*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q is expected to be not empty", result) 292*333d2b36SAndroid Build Coastguard Worker } 293*333d2b36SAndroid Build Coastguard Worker} 294*333d2b36SAndroid Build Coastguard Worker 295*333d2b36SAndroid Build Coastguard Worker// Minimal test 296*333d2b36SAndroid Build Coastguard Workerfunc TestBasicApex(t *testing.T) { 297*333d2b36SAndroid Build Coastguard Worker t.Parallel() 298*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 299*333d2b36SAndroid Build Coastguard Worker apex_defaults { 300*333d2b36SAndroid Build Coastguard Worker name: "myapex-defaults", 301*333d2b36SAndroid Build Coastguard Worker manifest: ":myapex.manifest", 302*333d2b36SAndroid Build Coastguard Worker androidManifest: ":myapex.androidmanifest", 303*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 304*333d2b36SAndroid Build Coastguard Worker binaries: ["foo.rust"], 305*333d2b36SAndroid Build Coastguard Worker native_shared_libs: [ 306*333d2b36SAndroid Build Coastguard Worker "mylib", 307*333d2b36SAndroid Build Coastguard Worker "libfoo.ffi", 308*333d2b36SAndroid Build Coastguard Worker ], 309*333d2b36SAndroid Build Coastguard Worker rust_dyn_libs: ["libfoo.dylib.rust"], 310*333d2b36SAndroid Build Coastguard Worker multilib: { 311*333d2b36SAndroid Build Coastguard Worker both: { 312*333d2b36SAndroid Build Coastguard Worker binaries: ["foo"], 313*333d2b36SAndroid Build Coastguard Worker } 314*333d2b36SAndroid Build Coastguard Worker }, 315*333d2b36SAndroid Build Coastguard Worker java_libs: [ 316*333d2b36SAndroid Build Coastguard Worker "myjar", 317*333d2b36SAndroid Build Coastguard Worker "myjar_dex", 318*333d2b36SAndroid Build Coastguard Worker ], 319*333d2b36SAndroid Build Coastguard Worker updatable: false, 320*333d2b36SAndroid Build Coastguard Worker } 321*333d2b36SAndroid Build Coastguard Worker 322*333d2b36SAndroid Build Coastguard Worker apex { 323*333d2b36SAndroid Build Coastguard Worker name: "myapex", 324*333d2b36SAndroid Build Coastguard Worker defaults: ["myapex-defaults"], 325*333d2b36SAndroid Build Coastguard Worker } 326*333d2b36SAndroid Build Coastguard Worker 327*333d2b36SAndroid Build Coastguard Worker apex_key { 328*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 329*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 330*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 331*333d2b36SAndroid Build Coastguard Worker } 332*333d2b36SAndroid Build Coastguard Worker 333*333d2b36SAndroid Build Coastguard Worker filegroup { 334*333d2b36SAndroid Build Coastguard Worker name: "myapex.manifest", 335*333d2b36SAndroid Build Coastguard Worker srcs: ["apex_manifest.json"], 336*333d2b36SAndroid Build Coastguard Worker } 337*333d2b36SAndroid Build Coastguard Worker 338*333d2b36SAndroid Build Coastguard Worker filegroup { 339*333d2b36SAndroid Build Coastguard Worker name: "myapex.androidmanifest", 340*333d2b36SAndroid Build Coastguard Worker srcs: ["AndroidManifest.xml"], 341*333d2b36SAndroid Build Coastguard Worker } 342*333d2b36SAndroid Build Coastguard Worker 343*333d2b36SAndroid Build Coastguard Worker cc_library { 344*333d2b36SAndroid Build Coastguard Worker name: "mylib", 345*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 346*333d2b36SAndroid Build Coastguard Worker shared_libs: [ 347*333d2b36SAndroid Build Coastguard Worker "mylib2", 348*333d2b36SAndroid Build Coastguard Worker "libbar.ffi", 349*333d2b36SAndroid Build Coastguard Worker ], 350*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 351*333d2b36SAndroid Build Coastguard Worker stl: "none", 352*333d2b36SAndroid Build Coastguard Worker // TODO: remove //apex_available:platform 353*333d2b36SAndroid Build Coastguard Worker apex_available: [ 354*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 355*333d2b36SAndroid Build Coastguard Worker "myapex", 356*333d2b36SAndroid Build Coastguard Worker ], 357*333d2b36SAndroid Build Coastguard Worker } 358*333d2b36SAndroid Build Coastguard Worker 359*333d2b36SAndroid Build Coastguard Worker cc_binary { 360*333d2b36SAndroid Build Coastguard Worker name: "foo", 361*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 362*333d2b36SAndroid Build Coastguard Worker compile_multilib: "both", 363*333d2b36SAndroid Build Coastguard Worker multilib: { 364*333d2b36SAndroid Build Coastguard Worker lib32: { 365*333d2b36SAndroid Build Coastguard Worker suffix: "32", 366*333d2b36SAndroid Build Coastguard Worker }, 367*333d2b36SAndroid Build Coastguard Worker lib64: { 368*333d2b36SAndroid Build Coastguard Worker suffix: "64", 369*333d2b36SAndroid Build Coastguard Worker }, 370*333d2b36SAndroid Build Coastguard Worker }, 371*333d2b36SAndroid Build Coastguard Worker symlinks: ["foo_link_"], 372*333d2b36SAndroid Build Coastguard Worker symlink_preferred_arch: true, 373*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 374*333d2b36SAndroid Build Coastguard Worker stl: "none", 375*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 376*333d2b36SAndroid Build Coastguard Worker } 377*333d2b36SAndroid Build Coastguard Worker 378*333d2b36SAndroid Build Coastguard Worker rust_binary { 379*333d2b36SAndroid Build Coastguard Worker name: "foo.rust", 380*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 381*333d2b36SAndroid Build Coastguard Worker rlibs: ["libfoo.rlib.rust"], 382*333d2b36SAndroid Build Coastguard Worker rustlibs: ["libfoo.transitive.dylib.rust"], 383*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 384*333d2b36SAndroid Build Coastguard Worker } 385*333d2b36SAndroid Build Coastguard Worker 386*333d2b36SAndroid Build Coastguard Worker rust_library_rlib { 387*333d2b36SAndroid Build Coastguard Worker name: "libfoo.rlib.rust", 388*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 389*333d2b36SAndroid Build Coastguard Worker crate_name: "foo", 390*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 391*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libfoo.shared_from_rust"], 392*333d2b36SAndroid Build Coastguard Worker } 393*333d2b36SAndroid Build Coastguard Worker 394*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 395*333d2b36SAndroid Build Coastguard Worker name: "libfoo.shared_from_rust", 396*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 397*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 398*333d2b36SAndroid Build Coastguard Worker stl: "none", 399*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 400*333d2b36SAndroid Build Coastguard Worker } 401*333d2b36SAndroid Build Coastguard Worker 402*333d2b36SAndroid Build Coastguard Worker rust_library_dylib { 403*333d2b36SAndroid Build Coastguard Worker name: "libfoo.dylib.rust", 404*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 405*333d2b36SAndroid Build Coastguard Worker crate_name: "foo", 406*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 407*333d2b36SAndroid Build Coastguard Worker } 408*333d2b36SAndroid Build Coastguard Worker 409*333d2b36SAndroid Build Coastguard Worker rust_library_dylib { 410*333d2b36SAndroid Build Coastguard Worker name: "libfoo.transitive.dylib.rust", 411*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 412*333d2b36SAndroid Build Coastguard Worker crate_name: "foo", 413*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 414*333d2b36SAndroid Build Coastguard Worker } 415*333d2b36SAndroid Build Coastguard Worker 416*333d2b36SAndroid Build Coastguard Worker rust_ffi_shared { 417*333d2b36SAndroid Build Coastguard Worker name: "libfoo.ffi", 418*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 419*333d2b36SAndroid Build Coastguard Worker crate_name: "foo", 420*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 421*333d2b36SAndroid Build Coastguard Worker } 422*333d2b36SAndroid Build Coastguard Worker 423*333d2b36SAndroid Build Coastguard Worker rust_ffi_shared { 424*333d2b36SAndroid Build Coastguard Worker name: "libbar.ffi", 425*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 426*333d2b36SAndroid Build Coastguard Worker crate_name: "bar", 427*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 428*333d2b36SAndroid Build Coastguard Worker } 429*333d2b36SAndroid Build Coastguard Worker 430*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 431*333d2b36SAndroid Build Coastguard Worker name: "mylib2", 432*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 433*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 434*333d2b36SAndroid Build Coastguard Worker stl: "none", 435*333d2b36SAndroid Build Coastguard Worker static_libs: ["libstatic"], 436*333d2b36SAndroid Build Coastguard Worker // TODO: remove //apex_available:platform 437*333d2b36SAndroid Build Coastguard Worker apex_available: [ 438*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 439*333d2b36SAndroid Build Coastguard Worker "myapex", 440*333d2b36SAndroid Build Coastguard Worker ], 441*333d2b36SAndroid Build Coastguard Worker } 442*333d2b36SAndroid Build Coastguard Worker 443*333d2b36SAndroid Build Coastguard Worker cc_prebuilt_library_shared { 444*333d2b36SAndroid Build Coastguard Worker name: "mylib2", 445*333d2b36SAndroid Build Coastguard Worker srcs: ["prebuilt.so"], 446*333d2b36SAndroid Build Coastguard Worker // TODO: remove //apex_available:platform 447*333d2b36SAndroid Build Coastguard Worker apex_available: [ 448*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 449*333d2b36SAndroid Build Coastguard Worker "myapex", 450*333d2b36SAndroid Build Coastguard Worker ], 451*333d2b36SAndroid Build Coastguard Worker } 452*333d2b36SAndroid Build Coastguard Worker 453*333d2b36SAndroid Build Coastguard Worker cc_library_static { 454*333d2b36SAndroid Build Coastguard Worker name: "libstatic", 455*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 456*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 457*333d2b36SAndroid Build Coastguard Worker stl: "none", 458*333d2b36SAndroid Build Coastguard Worker // TODO: remove //apex_available:platform 459*333d2b36SAndroid Build Coastguard Worker apex_available: [ 460*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 461*333d2b36SAndroid Build Coastguard Worker "myapex", 462*333d2b36SAndroid Build Coastguard Worker ], 463*333d2b36SAndroid Build Coastguard Worker } 464*333d2b36SAndroid Build Coastguard Worker 465*333d2b36SAndroid Build Coastguard Worker java_library { 466*333d2b36SAndroid Build Coastguard Worker name: "myjar", 467*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 468*333d2b36SAndroid Build Coastguard Worker stem: "myjar_stem", 469*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 470*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 471*333d2b36SAndroid Build Coastguard Worker static_libs: ["myotherjar"], 472*333d2b36SAndroid Build Coastguard Worker libs: ["mysharedjar"], 473*333d2b36SAndroid Build Coastguard Worker // TODO: remove //apex_available:platform 474*333d2b36SAndroid Build Coastguard Worker apex_available: [ 475*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 476*333d2b36SAndroid Build Coastguard Worker "myapex", 477*333d2b36SAndroid Build Coastguard Worker ], 478*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 479*333d2b36SAndroid Build Coastguard Worker } 480*333d2b36SAndroid Build Coastguard Worker 481*333d2b36SAndroid Build Coastguard Worker dex_import { 482*333d2b36SAndroid Build Coastguard Worker name: "myjar_dex", 483*333d2b36SAndroid Build Coastguard Worker jars: ["prebuilt.jar"], 484*333d2b36SAndroid Build Coastguard Worker apex_available: [ 485*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 486*333d2b36SAndroid Build Coastguard Worker "myapex", 487*333d2b36SAndroid Build Coastguard Worker ], 488*333d2b36SAndroid Build Coastguard Worker } 489*333d2b36SAndroid Build Coastguard Worker 490*333d2b36SAndroid Build Coastguard Worker java_library { 491*333d2b36SAndroid Build Coastguard Worker name: "myotherjar", 492*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 493*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 494*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 495*333d2b36SAndroid Build Coastguard Worker // TODO: remove //apex_available:platform 496*333d2b36SAndroid Build Coastguard Worker apex_available: [ 497*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 498*333d2b36SAndroid Build Coastguard Worker "myapex", 499*333d2b36SAndroid Build Coastguard Worker ], 500*333d2b36SAndroid Build Coastguard Worker } 501*333d2b36SAndroid Build Coastguard Worker 502*333d2b36SAndroid Build Coastguard Worker java_library { 503*333d2b36SAndroid Build Coastguard Worker name: "mysharedjar", 504*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 505*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 506*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 507*333d2b36SAndroid Build Coastguard Worker } 508*333d2b36SAndroid Build Coastguard Worker `) 509*333d2b36SAndroid Build Coastguard Worker 510*333d2b36SAndroid Build Coastguard Worker apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule") 511*333d2b36SAndroid Build Coastguard Worker 512*333d2b36SAndroid Build Coastguard Worker // Make sure that Android.mk is created 513*333d2b36SAndroid Build Coastguard Worker ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) 514*333d2b36SAndroid Build Coastguard Worker data := android.AndroidMkDataForTest(t, ctx, ab) 515*333d2b36SAndroid Build Coastguard Worker var builder strings.Builder 516*333d2b36SAndroid Build Coastguard Worker data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data) 517*333d2b36SAndroid Build Coastguard Worker 518*333d2b36SAndroid Build Coastguard Worker androidMk := builder.String() 519*333d2b36SAndroid Build Coastguard Worker ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n") 520*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n") 521*333d2b36SAndroid Build Coastguard Worker 522*333d2b36SAndroid Build Coastguard Worker optFlags := apexRule.Args["opt_flags"] 523*333d2b36SAndroid Build Coastguard Worker ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey") 524*333d2b36SAndroid Build Coastguard Worker // Ensure that the NOTICE output is being packaged as an asset. 525*333d2b36SAndroid Build Coastguard Worker ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE") 526*333d2b36SAndroid Build Coastguard Worker 527*333d2b36SAndroid Build Coastguard Worker copyCmds := apexRule.Args["copy_commands"] 528*333d2b36SAndroid Build Coastguard Worker 529*333d2b36SAndroid Build Coastguard Worker // Ensure that main rule creates an output 530*333d2b36SAndroid Build Coastguard Worker ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned") 531*333d2b36SAndroid Build Coastguard Worker 532*333d2b36SAndroid Build Coastguard Worker // Ensure that apex variant is created for the direct dep 533*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000") 534*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000") 535*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000") 536*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000") 537*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000") 538*333d2b36SAndroid Build Coastguard Worker 539*333d2b36SAndroid Build Coastguard Worker // Ensure that apex variant is created for the indirect dep 540*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000") 541*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000") 542*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000") 543*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000") 544*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.transitive.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000") 545*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000") 546*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000") 547*333d2b36SAndroid Build Coastguard Worker 548*333d2b36SAndroid Build Coastguard Worker // Ensure that both direct and indirect deps are copied into apex 549*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/mylib.so") 550*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so") 551*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar") 552*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar") 553*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so") 554*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/libfoo.transitive.dylib.rust.dylib.so") 555*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so") 556*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so") 557*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so") 558*333d2b36SAndroid Build Coastguard Worker // .. but not for java libs 559*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar") 560*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar") 561*333d2b36SAndroid Build Coastguard Worker 562*333d2b36SAndroid Build Coastguard Worker // Ensure that the platform variant ends with _shared or _common 563*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared") 564*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared") 565*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common") 566*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common") 567*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common") 568*333d2b36SAndroid Build Coastguard Worker 569*333d2b36SAndroid Build Coastguard Worker // Ensure that dynamic dependency to java libs are not included 570*333d2b36SAndroid Build Coastguard Worker ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex") 571*333d2b36SAndroid Build Coastguard Worker 572*333d2b36SAndroid Build Coastguard Worker // Ensure that all symlinks are present. 573*333d2b36SAndroid Build Coastguard Worker found_foo_link_64 := false 574*333d2b36SAndroid Build Coastguard Worker found_foo := false 575*333d2b36SAndroid Build Coastguard Worker for _, cmd := range strings.Split(copyCmds, " && ") { 576*333d2b36SAndroid Build Coastguard Worker if strings.HasPrefix(cmd, "ln -sfn foo64") { 577*333d2b36SAndroid Build Coastguard Worker if strings.HasSuffix(cmd, "bin/foo") { 578*333d2b36SAndroid Build Coastguard Worker found_foo = true 579*333d2b36SAndroid Build Coastguard Worker } else if strings.HasSuffix(cmd, "bin/foo_link_64") { 580*333d2b36SAndroid Build Coastguard Worker found_foo_link_64 = true 581*333d2b36SAndroid Build Coastguard Worker } 582*333d2b36SAndroid Build Coastguard Worker } 583*333d2b36SAndroid Build Coastguard Worker } 584*333d2b36SAndroid Build Coastguard Worker good := found_foo && found_foo_link_64 585*333d2b36SAndroid Build Coastguard Worker if !good { 586*333d2b36SAndroid Build Coastguard Worker t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds) 587*333d2b36SAndroid Build Coastguard Worker } 588*333d2b36SAndroid Build Coastguard Worker 589*333d2b36SAndroid Build Coastguard Worker fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx, 590*333d2b36SAndroid Build Coastguard Worker ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n") 591*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex") 592*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib") 593*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar") 594*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar") 595*333d2b36SAndroid Build Coastguard Worker 596*333d2b36SAndroid Build Coastguard Worker flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx, 597*333d2b36SAndroid Build Coastguard Worker ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n") 598*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))") 599*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))") 600*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))") 601*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)") 602*333d2b36SAndroid Build Coastguard Worker} 603*333d2b36SAndroid Build Coastguard Worker 604*333d2b36SAndroid Build Coastguard Workerfunc TestDefaults(t *testing.T) { 605*333d2b36SAndroid Build Coastguard Worker t.Parallel() 606*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 607*333d2b36SAndroid Build Coastguard Worker apex_defaults { 608*333d2b36SAndroid Build Coastguard Worker name: "myapex-defaults", 609*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 610*333d2b36SAndroid Build Coastguard Worker prebuilts: ["myetc"], 611*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 612*333d2b36SAndroid Build Coastguard Worker java_libs: ["myjar"], 613*333d2b36SAndroid Build Coastguard Worker apps: ["AppFoo"], 614*333d2b36SAndroid Build Coastguard Worker rros: ["rro"], 615*333d2b36SAndroid Build Coastguard Worker bpfs: ["bpf", "netdTest"], 616*333d2b36SAndroid Build Coastguard Worker updatable: false, 617*333d2b36SAndroid Build Coastguard Worker } 618*333d2b36SAndroid Build Coastguard Worker 619*333d2b36SAndroid Build Coastguard Worker prebuilt_etc { 620*333d2b36SAndroid Build Coastguard Worker name: "myetc", 621*333d2b36SAndroid Build Coastguard Worker src: "myprebuilt", 622*333d2b36SAndroid Build Coastguard Worker } 623*333d2b36SAndroid Build Coastguard Worker 624*333d2b36SAndroid Build Coastguard Worker apex { 625*333d2b36SAndroid Build Coastguard Worker name: "myapex", 626*333d2b36SAndroid Build Coastguard Worker defaults: ["myapex-defaults"], 627*333d2b36SAndroid Build Coastguard Worker } 628*333d2b36SAndroid Build Coastguard Worker 629*333d2b36SAndroid Build Coastguard Worker apex_key { 630*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 631*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 632*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 633*333d2b36SAndroid Build Coastguard Worker } 634*333d2b36SAndroid Build Coastguard Worker 635*333d2b36SAndroid Build Coastguard Worker cc_library { 636*333d2b36SAndroid Build Coastguard Worker name: "mylib", 637*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 638*333d2b36SAndroid Build Coastguard Worker stl: "none", 639*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 640*333d2b36SAndroid Build Coastguard Worker } 641*333d2b36SAndroid Build Coastguard Worker 642*333d2b36SAndroid Build Coastguard Worker java_library { 643*333d2b36SAndroid Build Coastguard Worker name: "myjar", 644*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 645*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 646*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 647*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 648*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 649*333d2b36SAndroid Build Coastguard Worker } 650*333d2b36SAndroid Build Coastguard Worker 651*333d2b36SAndroid Build Coastguard Worker android_app { 652*333d2b36SAndroid Build Coastguard Worker name: "AppFoo", 653*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 654*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 655*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 656*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 657*333d2b36SAndroid Build Coastguard Worker } 658*333d2b36SAndroid Build Coastguard Worker 659*333d2b36SAndroid Build Coastguard Worker runtime_resource_overlay { 660*333d2b36SAndroid Build Coastguard Worker name: "rro", 661*333d2b36SAndroid Build Coastguard Worker theme: "blue", 662*333d2b36SAndroid Build Coastguard Worker } 663*333d2b36SAndroid Build Coastguard Worker 664*333d2b36SAndroid Build Coastguard Worker bpf { 665*333d2b36SAndroid Build Coastguard Worker name: "bpf", 666*333d2b36SAndroid Build Coastguard Worker srcs: ["bpf.c", "bpf2.c"], 667*333d2b36SAndroid Build Coastguard Worker } 668*333d2b36SAndroid Build Coastguard Worker 669*333d2b36SAndroid Build Coastguard Worker bpf { 670*333d2b36SAndroid Build Coastguard Worker name: "netdTest", 671*333d2b36SAndroid Build Coastguard Worker srcs: ["netdTest.c"], 672*333d2b36SAndroid Build Coastguard Worker sub_dir: "netd", 673*333d2b36SAndroid Build Coastguard Worker } 674*333d2b36SAndroid Build Coastguard Worker 675*333d2b36SAndroid Build Coastguard Worker `) 676*333d2b36SAndroid Build Coastguard Worker ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{ 677*333d2b36SAndroid Build Coastguard Worker "etc/myetc", 678*333d2b36SAndroid Build Coastguard Worker "javalib/myjar.jar", 679*333d2b36SAndroid Build Coastguard Worker "lib64/mylib.so", 680*333d2b36SAndroid Build Coastguard Worker "app/AppFoo@TEST.BUILD_ID/AppFoo.apk", 681*333d2b36SAndroid Build Coastguard Worker "overlay/blue/rro.apk", 682*333d2b36SAndroid Build Coastguard Worker "etc/bpf/bpf.o", 683*333d2b36SAndroid Build Coastguard Worker "etc/bpf/bpf2.o", 684*333d2b36SAndroid Build Coastguard Worker "etc/bpf/netd/netdTest.o", 685*333d2b36SAndroid Build Coastguard Worker }) 686*333d2b36SAndroid Build Coastguard Worker} 687*333d2b36SAndroid Build Coastguard Worker 688*333d2b36SAndroid Build Coastguard Workerfunc TestApexManifest(t *testing.T) { 689*333d2b36SAndroid Build Coastguard Worker t.Parallel() 690*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 691*333d2b36SAndroid Build Coastguard Worker apex { 692*333d2b36SAndroid Build Coastguard Worker name: "myapex", 693*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 694*333d2b36SAndroid Build Coastguard Worker updatable: false, 695*333d2b36SAndroid Build Coastguard Worker } 696*333d2b36SAndroid Build Coastguard Worker 697*333d2b36SAndroid Build Coastguard Worker apex_key { 698*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 699*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 700*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 701*333d2b36SAndroid Build Coastguard Worker } 702*333d2b36SAndroid Build Coastguard Worker `) 703*333d2b36SAndroid Build Coastguard Worker 704*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests("myapex", "android_common_myapex") 705*333d2b36SAndroid Build Coastguard Worker args := module.Rule("apexRule").Args 706*333d2b36SAndroid Build Coastguard Worker if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() { 707*333d2b36SAndroid Build Coastguard Worker t.Error("manifest should be apex_manifest.pb, but " + manifest) 708*333d2b36SAndroid Build Coastguard Worker } 709*333d2b36SAndroid Build Coastguard Worker} 710*333d2b36SAndroid Build Coastguard Worker 711*333d2b36SAndroid Build Coastguard Workerfunc TestApexManifestMinSdkVersion(t *testing.T) { 712*333d2b36SAndroid Build Coastguard Worker t.Parallel() 713*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 714*333d2b36SAndroid Build Coastguard Worker apex_defaults { 715*333d2b36SAndroid Build Coastguard Worker name: "my_defaults", 716*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 717*333d2b36SAndroid Build Coastguard Worker product_specific: true, 718*333d2b36SAndroid Build Coastguard Worker file_contexts: ":my-file-contexts", 719*333d2b36SAndroid Build Coastguard Worker updatable: false, 720*333d2b36SAndroid Build Coastguard Worker } 721*333d2b36SAndroid Build Coastguard Worker apex { 722*333d2b36SAndroid Build Coastguard Worker name: "myapex_30", 723*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "30", 724*333d2b36SAndroid Build Coastguard Worker defaults: ["my_defaults"], 725*333d2b36SAndroid Build Coastguard Worker } 726*333d2b36SAndroid Build Coastguard Worker 727*333d2b36SAndroid Build Coastguard Worker apex { 728*333d2b36SAndroid Build Coastguard Worker name: "myapex_current", 729*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "current", 730*333d2b36SAndroid Build Coastguard Worker defaults: ["my_defaults"], 731*333d2b36SAndroid Build Coastguard Worker } 732*333d2b36SAndroid Build Coastguard Worker 733*333d2b36SAndroid Build Coastguard Worker apex { 734*333d2b36SAndroid Build Coastguard Worker name: "myapex_none", 735*333d2b36SAndroid Build Coastguard Worker defaults: ["my_defaults"], 736*333d2b36SAndroid Build Coastguard Worker } 737*333d2b36SAndroid Build Coastguard Worker 738*333d2b36SAndroid Build Coastguard Worker apex_key { 739*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 740*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 741*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 742*333d2b36SAndroid Build Coastguard Worker } 743*333d2b36SAndroid Build Coastguard Worker 744*333d2b36SAndroid Build Coastguard Worker filegroup { 745*333d2b36SAndroid Build Coastguard Worker name: "my-file-contexts", 746*333d2b36SAndroid Build Coastguard Worker srcs: ["product_specific_file_contexts"], 747*333d2b36SAndroid Build Coastguard Worker } 748*333d2b36SAndroid Build Coastguard Worker `, withFiles(map[string][]byte{ 749*333d2b36SAndroid Build Coastguard Worker "product_specific_file_contexts": nil, 750*333d2b36SAndroid Build Coastguard Worker }), android.FixtureModifyProductVariables( 751*333d2b36SAndroid Build Coastguard Worker func(variables android.FixtureProductVariables) { 752*333d2b36SAndroid Build Coastguard Worker variables.Unbundled_build = proptools.BoolPtr(true) 753*333d2b36SAndroid Build Coastguard Worker variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false) 754*333d2b36SAndroid Build Coastguard Worker }), android.FixtureMergeEnv(map[string]string{ 755*333d2b36SAndroid Build Coastguard Worker "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true", 756*333d2b36SAndroid Build Coastguard Worker })) 757*333d2b36SAndroid Build Coastguard Worker 758*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 759*333d2b36SAndroid Build Coastguard Worker module string 760*333d2b36SAndroid Build Coastguard Worker minSdkVersion string 761*333d2b36SAndroid Build Coastguard Worker }{ 762*333d2b36SAndroid Build Coastguard Worker { 763*333d2b36SAndroid Build Coastguard Worker module: "myapex_30", 764*333d2b36SAndroid Build Coastguard Worker minSdkVersion: "30", 765*333d2b36SAndroid Build Coastguard Worker }, 766*333d2b36SAndroid Build Coastguard Worker { 767*333d2b36SAndroid Build Coastguard Worker module: "myapex_current", 768*333d2b36SAndroid Build Coastguard Worker minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)", 769*333d2b36SAndroid Build Coastguard Worker }, 770*333d2b36SAndroid Build Coastguard Worker { 771*333d2b36SAndroid Build Coastguard Worker module: "myapex_none", 772*333d2b36SAndroid Build Coastguard Worker minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)", 773*333d2b36SAndroid Build Coastguard Worker }, 774*333d2b36SAndroid Build Coastguard Worker } 775*333d2b36SAndroid Build Coastguard Worker for _, tc := range testCases { 776*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module) 777*333d2b36SAndroid Build Coastguard Worker args := module.Rule("apexRule").Args 778*333d2b36SAndroid Build Coastguard Worker optFlags := args["opt_flags"] 779*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) { 780*333d2b36SAndroid Build Coastguard Worker t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags) 781*333d2b36SAndroid Build Coastguard Worker } 782*333d2b36SAndroid Build Coastguard Worker } 783*333d2b36SAndroid Build Coastguard Worker} 784*333d2b36SAndroid Build Coastguard Worker 785*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithDessertSha(t *testing.T) { 786*333d2b36SAndroid Build Coastguard Worker t.Parallel() 787*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 788*333d2b36SAndroid Build Coastguard Worker apex_defaults { 789*333d2b36SAndroid Build Coastguard Worker name: "my_defaults", 790*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 791*333d2b36SAndroid Build Coastguard Worker product_specific: true, 792*333d2b36SAndroid Build Coastguard Worker file_contexts: ":my-file-contexts", 793*333d2b36SAndroid Build Coastguard Worker updatable: false, 794*333d2b36SAndroid Build Coastguard Worker } 795*333d2b36SAndroid Build Coastguard Worker apex { 796*333d2b36SAndroid Build Coastguard Worker name: "myapex_30", 797*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "30", 798*333d2b36SAndroid Build Coastguard Worker defaults: ["my_defaults"], 799*333d2b36SAndroid Build Coastguard Worker } 800*333d2b36SAndroid Build Coastguard Worker 801*333d2b36SAndroid Build Coastguard Worker apex { 802*333d2b36SAndroid Build Coastguard Worker name: "myapex_current", 803*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "current", 804*333d2b36SAndroid Build Coastguard Worker defaults: ["my_defaults"], 805*333d2b36SAndroid Build Coastguard Worker } 806*333d2b36SAndroid Build Coastguard Worker 807*333d2b36SAndroid Build Coastguard Worker apex { 808*333d2b36SAndroid Build Coastguard Worker name: "myapex_none", 809*333d2b36SAndroid Build Coastguard Worker defaults: ["my_defaults"], 810*333d2b36SAndroid Build Coastguard Worker } 811*333d2b36SAndroid Build Coastguard Worker 812*333d2b36SAndroid Build Coastguard Worker apex_key { 813*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 814*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 815*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 816*333d2b36SAndroid Build Coastguard Worker } 817*333d2b36SAndroid Build Coastguard Worker 818*333d2b36SAndroid Build Coastguard Worker filegroup { 819*333d2b36SAndroid Build Coastguard Worker name: "my-file-contexts", 820*333d2b36SAndroid Build Coastguard Worker srcs: ["product_specific_file_contexts"], 821*333d2b36SAndroid Build Coastguard Worker } 822*333d2b36SAndroid Build Coastguard Worker `, withFiles(map[string][]byte{ 823*333d2b36SAndroid Build Coastguard Worker "product_specific_file_contexts": nil, 824*333d2b36SAndroid Build Coastguard Worker }), android.FixtureModifyProductVariables( 825*333d2b36SAndroid Build Coastguard Worker func(variables android.FixtureProductVariables) { 826*333d2b36SAndroid Build Coastguard Worker variables.Unbundled_build = proptools.BoolPtr(true) 827*333d2b36SAndroid Build Coastguard Worker variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false) 828*333d2b36SAndroid Build Coastguard Worker }), android.FixtureMergeEnv(map[string]string{ 829*333d2b36SAndroid Build Coastguard Worker "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456", 830*333d2b36SAndroid Build Coastguard Worker })) 831*333d2b36SAndroid Build Coastguard Worker 832*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 833*333d2b36SAndroid Build Coastguard Worker module string 834*333d2b36SAndroid Build Coastguard Worker minSdkVersion string 835*333d2b36SAndroid Build Coastguard Worker }{ 836*333d2b36SAndroid Build Coastguard Worker { 837*333d2b36SAndroid Build Coastguard Worker module: "myapex_30", 838*333d2b36SAndroid Build Coastguard Worker minSdkVersion: "30", 839*333d2b36SAndroid Build Coastguard Worker }, 840*333d2b36SAndroid Build Coastguard Worker { 841*333d2b36SAndroid Build Coastguard Worker module: "myapex_current", 842*333d2b36SAndroid Build Coastguard Worker minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456", 843*333d2b36SAndroid Build Coastguard Worker }, 844*333d2b36SAndroid Build Coastguard Worker { 845*333d2b36SAndroid Build Coastguard Worker module: "myapex_none", 846*333d2b36SAndroid Build Coastguard Worker minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456", 847*333d2b36SAndroid Build Coastguard Worker }, 848*333d2b36SAndroid Build Coastguard Worker } 849*333d2b36SAndroid Build Coastguard Worker for _, tc := range testCases { 850*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module) 851*333d2b36SAndroid Build Coastguard Worker args := module.Rule("apexRule").Args 852*333d2b36SAndroid Build Coastguard Worker optFlags := args["opt_flags"] 853*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) { 854*333d2b36SAndroid Build Coastguard Worker t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags) 855*333d2b36SAndroid Build Coastguard Worker } 856*333d2b36SAndroid Build Coastguard Worker } 857*333d2b36SAndroid Build Coastguard Worker} 858*333d2b36SAndroid Build Coastguard Worker 859*333d2b36SAndroid Build Coastguard Workerfunc TestFileContexts(t *testing.T) { 860*333d2b36SAndroid Build Coastguard Worker t.Parallel() 861*333d2b36SAndroid Build Coastguard Worker for _, vendor := range []bool{true, false} { 862*333d2b36SAndroid Build Coastguard Worker prop := "" 863*333d2b36SAndroid Build Coastguard Worker if vendor { 864*333d2b36SAndroid Build Coastguard Worker prop = "vendor: true,\n" 865*333d2b36SAndroid Build Coastguard Worker } 866*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 867*333d2b36SAndroid Build Coastguard Worker apex { 868*333d2b36SAndroid Build Coastguard Worker name: "myapex", 869*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 870*333d2b36SAndroid Build Coastguard Worker updatable: false, 871*333d2b36SAndroid Build Coastguard Worker `+prop+` 872*333d2b36SAndroid Build Coastguard Worker } 873*333d2b36SAndroid Build Coastguard Worker 874*333d2b36SAndroid Build Coastguard Worker apex_key { 875*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 876*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 877*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 878*333d2b36SAndroid Build Coastguard Worker } 879*333d2b36SAndroid Build Coastguard Worker `) 880*333d2b36SAndroid Build Coastguard Worker 881*333d2b36SAndroid Build Coastguard Worker rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts") 882*333d2b36SAndroid Build Coastguard Worker if vendor { 883*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file", 884*333d2b36SAndroid Build Coastguard Worker rule.RuleParams.Command, 885*333d2b36SAndroid Build Coastguard Worker "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0") 886*333d2b36SAndroid Build Coastguard Worker } else { 887*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "should force-label as system_file", 888*333d2b36SAndroid Build Coastguard Worker rule.RuleParams.Command, 889*333d2b36SAndroid Build Coastguard Worker "apex_manifest\\\\.pb u:object_r:system_file:s0") 890*333d2b36SAndroid Build Coastguard Worker } 891*333d2b36SAndroid Build Coastguard Worker } 892*333d2b36SAndroid Build Coastguard Worker} 893*333d2b36SAndroid Build Coastguard Worker 894*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithStubs(t *testing.T) { 895*333d2b36SAndroid Build Coastguard Worker t.Parallel() 896*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 897*333d2b36SAndroid Build Coastguard Worker apex { 898*333d2b36SAndroid Build Coastguard Worker name: "myapex", 899*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 900*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib", "mylib3"], 901*333d2b36SAndroid Build Coastguard Worker binaries: ["foo.rust"], 902*333d2b36SAndroid Build Coastguard Worker updatable: false, 903*333d2b36SAndroid Build Coastguard Worker } 904*333d2b36SAndroid Build Coastguard Worker 905*333d2b36SAndroid Build Coastguard Worker apex_key { 906*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 907*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 908*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 909*333d2b36SAndroid Build Coastguard Worker } 910*333d2b36SAndroid Build Coastguard Worker 911*333d2b36SAndroid Build Coastguard Worker cc_library { 912*333d2b36SAndroid Build Coastguard Worker name: "mylib", 913*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 914*333d2b36SAndroid Build Coastguard Worker shared_libs: ["mylib2", "mylib3#impl", "my_prebuilt_platform_lib", "my_prebuilt_platform_stub_only_lib"], 915*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 916*333d2b36SAndroid Build Coastguard Worker stl: "none", 917*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 918*333d2b36SAndroid Build Coastguard Worker } 919*333d2b36SAndroid Build Coastguard Worker 920*333d2b36SAndroid Build Coastguard Worker cc_library { 921*333d2b36SAndroid Build Coastguard Worker name: "mylib2", 922*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 923*333d2b36SAndroid Build Coastguard Worker cflags: ["-include mylib.h"], 924*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 925*333d2b36SAndroid Build Coastguard Worker stl: "none", 926*333d2b36SAndroid Build Coastguard Worker stubs: { 927*333d2b36SAndroid Build Coastguard Worker symbol_file: "mylib2.map.txt", 928*333d2b36SAndroid Build Coastguard Worker versions: ["1", "2", "3"], 929*333d2b36SAndroid Build Coastguard Worker }, 930*333d2b36SAndroid Build Coastguard Worker } 931*333d2b36SAndroid Build Coastguard Worker 932*333d2b36SAndroid Build Coastguard Worker cc_library { 933*333d2b36SAndroid Build Coastguard Worker name: "mylib3", 934*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 935*333d2b36SAndroid Build Coastguard Worker shared_libs: ["mylib4"], 936*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 937*333d2b36SAndroid Build Coastguard Worker stl: "none", 938*333d2b36SAndroid Build Coastguard Worker stubs: { 939*333d2b36SAndroid Build Coastguard Worker symbol_file: "mylib3.map.txt", 940*333d2b36SAndroid Build Coastguard Worker versions: ["10", "11", "12"], 941*333d2b36SAndroid Build Coastguard Worker }, 942*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 943*333d2b36SAndroid Build Coastguard Worker } 944*333d2b36SAndroid Build Coastguard Worker 945*333d2b36SAndroid Build Coastguard Worker cc_library { 946*333d2b36SAndroid Build Coastguard Worker name: "mylib4", 947*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 948*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 949*333d2b36SAndroid Build Coastguard Worker stl: "none", 950*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 951*333d2b36SAndroid Build Coastguard Worker } 952*333d2b36SAndroid Build Coastguard Worker 953*333d2b36SAndroid Build Coastguard Worker cc_prebuilt_library_shared { 954*333d2b36SAndroid Build Coastguard Worker name: "my_prebuilt_platform_lib", 955*333d2b36SAndroid Build Coastguard Worker stubs: { 956*333d2b36SAndroid Build Coastguard Worker symbol_file: "my_prebuilt_platform_lib.map.txt", 957*333d2b36SAndroid Build Coastguard Worker versions: ["1", "2", "3"], 958*333d2b36SAndroid Build Coastguard Worker }, 959*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.so"], 960*333d2b36SAndroid Build Coastguard Worker } 961*333d2b36SAndroid Build Coastguard Worker 962*333d2b36SAndroid Build Coastguard Worker // Similar to my_prebuilt_platform_lib, but this library only provides stubs, i.e. srcs is empty 963*333d2b36SAndroid Build Coastguard Worker cc_prebuilt_library_shared { 964*333d2b36SAndroid Build Coastguard Worker name: "my_prebuilt_platform_stub_only_lib", 965*333d2b36SAndroid Build Coastguard Worker stubs: { 966*333d2b36SAndroid Build Coastguard Worker symbol_file: "my_prebuilt_platform_stub_only_lib.map.txt", 967*333d2b36SAndroid Build Coastguard Worker versions: ["1", "2", "3"], 968*333d2b36SAndroid Build Coastguard Worker } 969*333d2b36SAndroid Build Coastguard Worker } 970*333d2b36SAndroid Build Coastguard Worker 971*333d2b36SAndroid Build Coastguard Worker rust_binary { 972*333d2b36SAndroid Build Coastguard Worker name: "foo.rust", 973*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 974*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libfoo.shared_from_rust"], 975*333d2b36SAndroid Build Coastguard Worker prefer_rlib: true, 976*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 977*333d2b36SAndroid Build Coastguard Worker } 978*333d2b36SAndroid Build Coastguard Worker 979*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 980*333d2b36SAndroid Build Coastguard Worker name: "libfoo.shared_from_rust", 981*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 982*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 983*333d2b36SAndroid Build Coastguard Worker stl: "none", 984*333d2b36SAndroid Build Coastguard Worker stubs: { 985*333d2b36SAndroid Build Coastguard Worker versions: ["10", "11", "12"], 986*333d2b36SAndroid Build Coastguard Worker }, 987*333d2b36SAndroid Build Coastguard Worker } 988*333d2b36SAndroid Build Coastguard Worker 989*333d2b36SAndroid Build Coastguard Worker `) 990*333d2b36SAndroid Build Coastguard Worker 991*333d2b36SAndroid Build Coastguard Worker apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule") 992*333d2b36SAndroid Build Coastguard Worker copyCmds := apexRule.Args["copy_commands"] 993*333d2b36SAndroid Build Coastguard Worker 994*333d2b36SAndroid Build Coastguard Worker // Ensure that direct non-stubs dep is always included 995*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/mylib.so") 996*333d2b36SAndroid Build Coastguard Worker 997*333d2b36SAndroid Build Coastguard Worker // Ensure that indirect stubs dep is not included 998*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so") 999*333d2b36SAndroid Build Coastguard Worker 1000*333d2b36SAndroid Build Coastguard Worker // Ensure that direct stubs dep is included 1001*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so") 1002*333d2b36SAndroid Build Coastguard Worker 1003*333d2b36SAndroid Build Coastguard Worker mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"] 1004*333d2b36SAndroid Build Coastguard Worker 1005*333d2b36SAndroid Build Coastguard Worker // Ensure that mylib is linking with the latest version of stubs for mylib2 1006*333d2b36SAndroid Build Coastguard Worker ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so") 1007*333d2b36SAndroid Build Coastguard Worker // ... and not linking to the non-stub (impl) variant of mylib2 1008*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so") 1009*333d2b36SAndroid Build Coastguard Worker 1010*333d2b36SAndroid Build Coastguard Worker // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because the dependency is added with mylib3#impl) 1011*333d2b36SAndroid Build Coastguard Worker ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so") 1012*333d2b36SAndroid Build Coastguard Worker // .. and not linking to the stubs variant of mylib3 1013*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so") 1014*333d2b36SAndroid Build Coastguard Worker 1015*333d2b36SAndroid Build Coastguard Worker // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go 1016*333d2b36SAndroid Build Coastguard Worker // is replaced by sharing of "cFlags" in cc/builder.go. 1017*333d2b36SAndroid Build Coastguard Worker // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the 1018*333d2b36SAndroid Build Coastguard Worker // module variable representing "cflags". So it was not detected by ensureNotContains. 1019*333d2b36SAndroid Build Coastguard Worker // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous 1020*333d2b36SAndroid Build Coastguard Worker // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1, 1021*333d2b36SAndroid Build Coastguard Worker // including the original cflags's "-include mylib.h". 1022*333d2b36SAndroid Build Coastguard Worker // 1023*333d2b36SAndroid Build Coastguard Worker // Ensure that stubs libs are built without -include flags 1024*333d2b36SAndroid Build Coastguard Worker // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"] 1025*333d2b36SAndroid Build Coastguard Worker // ensureNotContains(t, mylib2Cflags, "-include ") 1026*333d2b36SAndroid Build Coastguard Worker 1027*333d2b36SAndroid Build Coastguard Worker // Ensure that genstub for platform-provided lib is invoked with --systemapi 1028*333d2b36SAndroid Build Coastguard Worker ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi") 1029*333d2b36SAndroid Build Coastguard Worker // Ensure that genstub for apex-provided lib is invoked with --apex 1030*333d2b36SAndroid Build Coastguard Worker ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex") 1031*333d2b36SAndroid Build Coastguard Worker 1032*333d2b36SAndroid Build Coastguard Worker ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{ 1033*333d2b36SAndroid Build Coastguard Worker "lib64/mylib.so", 1034*333d2b36SAndroid Build Coastguard Worker "lib64/mylib3.so", 1035*333d2b36SAndroid Build Coastguard Worker "lib64/mylib4.so", 1036*333d2b36SAndroid Build Coastguard Worker "bin/foo.rust", 1037*333d2b36SAndroid Build Coastguard Worker "lib64/libc++.so", // by the implicit dependency from foo.rust 1038*333d2b36SAndroid Build Coastguard Worker "lib64/liblog.so", // by the implicit dependency from foo.rust 1039*333d2b36SAndroid Build Coastguard Worker }) 1040*333d2b36SAndroid Build Coastguard Worker 1041*333d2b36SAndroid Build Coastguard Worker // Ensure that stub dependency from a rust module is not included 1042*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so") 1043*333d2b36SAndroid Build Coastguard Worker // The rust module is linked to the stub cc library 1044*333d2b36SAndroid Build Coastguard Worker rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"] 1045*333d2b36SAndroid Build Coastguard Worker ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so") 1046*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so") 1047*333d2b36SAndroid Build Coastguard Worker 1048*333d2b36SAndroid Build Coastguard Worker apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule") 1049*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so") 1050*333d2b36SAndroid Build Coastguard Worker 1051*333d2b36SAndroid Build Coastguard Worker // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib 1052*333d2b36SAndroid Build Coastguard Worker ensureContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_lib.so") 1053*333d2b36SAndroid Build Coastguard Worker // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib 1054*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_lib.so") 1055*333d2b36SAndroid Build Coastguard Worker // Ensure that genstub for platform-provided lib is invoked with --systemapi 1056*333d2b36SAndroid Build Coastguard Worker ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi") 1057*333d2b36SAndroid Build Coastguard Worker 1058*333d2b36SAndroid Build Coastguard Worker // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib 1059*333d2b36SAndroid Build Coastguard Worker ensureContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_stub_only_lib.so") 1060*333d2b36SAndroid Build Coastguard Worker // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib 1061*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_stub_only_lib.so") 1062*333d2b36SAndroid Build Coastguard Worker // Ensure that genstub for platform-provided lib is invoked with --systemapi 1063*333d2b36SAndroid Build Coastguard Worker ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_stub_only_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi") 1064*333d2b36SAndroid Build Coastguard Worker} 1065*333d2b36SAndroid Build Coastguard Worker 1066*333d2b36SAndroid Build Coastguard Workerfunc TestApexShouldNotEmbedStubVariant(t *testing.T) { 1067*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1068*333d2b36SAndroid Build Coastguard Worker testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, ` 1069*333d2b36SAndroid Build Coastguard Worker apex { 1070*333d2b36SAndroid Build Coastguard Worker name: "myapex", 1071*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 1072*333d2b36SAndroid Build Coastguard Worker vendor: true, 1073*333d2b36SAndroid Build Coastguard Worker updatable: false, 1074*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex 1075*333d2b36SAndroid Build Coastguard Worker } 1076*333d2b36SAndroid Build Coastguard Worker 1077*333d2b36SAndroid Build Coastguard Worker apex_key { 1078*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 1079*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 1080*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 1081*333d2b36SAndroid Build Coastguard Worker } 1082*333d2b36SAndroid Build Coastguard Worker 1083*333d2b36SAndroid Build Coastguard Worker cc_library { 1084*333d2b36SAndroid Build Coastguard Worker name: "libbar", 1085*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1086*333d2b36SAndroid Build Coastguard Worker llndk: { 1087*333d2b36SAndroid Build Coastguard Worker symbol_file: "libbar.map.txt", 1088*333d2b36SAndroid Build Coastguard Worker } 1089*333d2b36SAndroid Build Coastguard Worker } 1090*333d2b36SAndroid Build Coastguard Worker `) 1091*333d2b36SAndroid Build Coastguard Worker} 1092*333d2b36SAndroid Build Coastguard Worker 1093*333d2b36SAndroid Build Coastguard Workerfunc TestApexCanUsePrivateApis(t *testing.T) { 1094*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1095*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 1096*333d2b36SAndroid Build Coastguard Worker apex { 1097*333d2b36SAndroid Build Coastguard Worker name: "myapex", 1098*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 1099*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 1100*333d2b36SAndroid Build Coastguard Worker binaries: ["foo.rust"], 1101*333d2b36SAndroid Build Coastguard Worker updatable: false, 1102*333d2b36SAndroid Build Coastguard Worker platform_apis: true, 1103*333d2b36SAndroid Build Coastguard Worker } 1104*333d2b36SAndroid Build Coastguard Worker 1105*333d2b36SAndroid Build Coastguard Worker apex_key { 1106*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 1107*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 1108*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 1109*333d2b36SAndroid Build Coastguard Worker } 1110*333d2b36SAndroid Build Coastguard Worker 1111*333d2b36SAndroid Build Coastguard Worker cc_library { 1112*333d2b36SAndroid Build Coastguard Worker name: "mylib", 1113*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1114*333d2b36SAndroid Build Coastguard Worker shared_libs: ["mylib2"], 1115*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1116*333d2b36SAndroid Build Coastguard Worker stl: "none", 1117*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 1118*333d2b36SAndroid Build Coastguard Worker } 1119*333d2b36SAndroid Build Coastguard Worker 1120*333d2b36SAndroid Build Coastguard Worker cc_library { 1121*333d2b36SAndroid Build Coastguard Worker name: "mylib2", 1122*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1123*333d2b36SAndroid Build Coastguard Worker cflags: ["-include mylib.h"], 1124*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1125*333d2b36SAndroid Build Coastguard Worker stl: "none", 1126*333d2b36SAndroid Build Coastguard Worker stubs: { 1127*333d2b36SAndroid Build Coastguard Worker versions: ["1", "2", "3"], 1128*333d2b36SAndroid Build Coastguard Worker }, 1129*333d2b36SAndroid Build Coastguard Worker } 1130*333d2b36SAndroid Build Coastguard Worker 1131*333d2b36SAndroid Build Coastguard Worker rust_binary { 1132*333d2b36SAndroid Build Coastguard Worker name: "foo.rust", 1133*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 1134*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libfoo.shared_from_rust"], 1135*333d2b36SAndroid Build Coastguard Worker prefer_rlib: true, 1136*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 1137*333d2b36SAndroid Build Coastguard Worker } 1138*333d2b36SAndroid Build Coastguard Worker 1139*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 1140*333d2b36SAndroid Build Coastguard Worker name: "libfoo.shared_from_rust", 1141*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1142*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1143*333d2b36SAndroid Build Coastguard Worker stl: "none", 1144*333d2b36SAndroid Build Coastguard Worker stubs: { 1145*333d2b36SAndroid Build Coastguard Worker versions: ["10", "11", "12"], 1146*333d2b36SAndroid Build Coastguard Worker }, 1147*333d2b36SAndroid Build Coastguard Worker } 1148*333d2b36SAndroid Build Coastguard Worker `) 1149*333d2b36SAndroid Build Coastguard Worker 1150*333d2b36SAndroid Build Coastguard Worker apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule") 1151*333d2b36SAndroid Build Coastguard Worker copyCmds := apexRule.Args["copy_commands"] 1152*333d2b36SAndroid Build Coastguard Worker 1153*333d2b36SAndroid Build Coastguard Worker // Ensure that indirect stubs dep is not included 1154*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so") 1155*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so") 1156*333d2b36SAndroid Build Coastguard Worker 1157*333d2b36SAndroid Build Coastguard Worker // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because 1158*333d2b36SAndroid Build Coastguard Worker // of the platform_apis: true) 1159*333d2b36SAndroid Build Coastguard Worker mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"] 1160*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so") 1161*333d2b36SAndroid Build Coastguard Worker ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so") 1162*333d2b36SAndroid Build Coastguard Worker rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"] 1163*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so") 1164*333d2b36SAndroid Build Coastguard Worker ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so") 1165*333d2b36SAndroid Build Coastguard Worker} 1166*333d2b36SAndroid Build Coastguard Worker 1167*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithStubsWithMinSdkVersion(t *testing.T) { 1168*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1169*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 1170*333d2b36SAndroid Build Coastguard Worker apex { 1171*333d2b36SAndroid Build Coastguard Worker name: "myapex", 1172*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 1173*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib", "mylib3"], 1174*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 1175*333d2b36SAndroid Build Coastguard Worker } 1176*333d2b36SAndroid Build Coastguard Worker 1177*333d2b36SAndroid Build Coastguard Worker apex_key { 1178*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 1179*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 1180*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 1181*333d2b36SAndroid Build Coastguard Worker } 1182*333d2b36SAndroid Build Coastguard Worker 1183*333d2b36SAndroid Build Coastguard Worker cc_library { 1184*333d2b36SAndroid Build Coastguard Worker name: "mylib", 1185*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1186*333d2b36SAndroid Build Coastguard Worker shared_libs: ["mylib2", "mylib3#impl"], 1187*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1188*333d2b36SAndroid Build Coastguard Worker stl: "none", 1189*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 1190*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "28", 1191*333d2b36SAndroid Build Coastguard Worker } 1192*333d2b36SAndroid Build Coastguard Worker 1193*333d2b36SAndroid Build Coastguard Worker cc_library { 1194*333d2b36SAndroid Build Coastguard Worker name: "mylib2", 1195*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1196*333d2b36SAndroid Build Coastguard Worker cflags: ["-include mylib.h"], 1197*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1198*333d2b36SAndroid Build Coastguard Worker stl: "none", 1199*333d2b36SAndroid Build Coastguard Worker stubs: { 1200*333d2b36SAndroid Build Coastguard Worker symbol_file: "mylib2.map.txt", 1201*333d2b36SAndroid Build Coastguard Worker versions: ["28", "29", "30", "current"], 1202*333d2b36SAndroid Build Coastguard Worker }, 1203*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "28", 1204*333d2b36SAndroid Build Coastguard Worker } 1205*333d2b36SAndroid Build Coastguard Worker 1206*333d2b36SAndroid Build Coastguard Worker cc_library { 1207*333d2b36SAndroid Build Coastguard Worker name: "mylib3", 1208*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1209*333d2b36SAndroid Build Coastguard Worker shared_libs: ["mylib4"], 1210*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1211*333d2b36SAndroid Build Coastguard Worker stl: "none", 1212*333d2b36SAndroid Build Coastguard Worker stubs: { 1213*333d2b36SAndroid Build Coastguard Worker symbol_file: "mylib3.map.txt", 1214*333d2b36SAndroid Build Coastguard Worker versions: ["28", "29", "30", "current"], 1215*333d2b36SAndroid Build Coastguard Worker }, 1216*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 1217*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "28", 1218*333d2b36SAndroid Build Coastguard Worker } 1219*333d2b36SAndroid Build Coastguard Worker 1220*333d2b36SAndroid Build Coastguard Worker cc_library { 1221*333d2b36SAndroid Build Coastguard Worker name: "mylib4", 1222*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1223*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1224*333d2b36SAndroid Build Coastguard Worker stl: "none", 1225*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 1226*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "28", 1227*333d2b36SAndroid Build Coastguard Worker } 1228*333d2b36SAndroid Build Coastguard Worker `) 1229*333d2b36SAndroid Build Coastguard Worker 1230*333d2b36SAndroid Build Coastguard Worker apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule") 1231*333d2b36SAndroid Build Coastguard Worker copyCmds := apexRule.Args["copy_commands"] 1232*333d2b36SAndroid Build Coastguard Worker 1233*333d2b36SAndroid Build Coastguard Worker // Ensure that direct non-stubs dep is always included 1234*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/mylib.so") 1235*333d2b36SAndroid Build Coastguard Worker 1236*333d2b36SAndroid Build Coastguard Worker // Ensure that indirect stubs dep is not included 1237*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so") 1238*333d2b36SAndroid Build Coastguard Worker 1239*333d2b36SAndroid Build Coastguard Worker // Ensure that direct stubs dep is included 1240*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so") 1241*333d2b36SAndroid Build Coastguard Worker 1242*333d2b36SAndroid Build Coastguard Worker mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"] 1243*333d2b36SAndroid Build Coastguard Worker 1244*333d2b36SAndroid Build Coastguard Worker // Ensure that mylib is linking with the latest version of stub for mylib2 1245*333d2b36SAndroid Build Coastguard Worker ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so") 1246*333d2b36SAndroid Build Coastguard Worker // ... and not linking to the non-stub (impl) variant of mylib2 1247*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so") 1248*333d2b36SAndroid Build Coastguard Worker 1249*333d2b36SAndroid Build Coastguard Worker // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because the dependency is added with mylib3#impl) 1250*333d2b36SAndroid Build Coastguard Worker ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so") 1251*333d2b36SAndroid Build Coastguard Worker // .. and not linking to the stubs variant of mylib3 1252*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so") 1253*333d2b36SAndroid Build Coastguard Worker 1254*333d2b36SAndroid Build Coastguard Worker // Ensure that stubs libs are built without -include flags 1255*333d2b36SAndroid Build Coastguard Worker mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"] 1256*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, mylib2Cflags, "-include ") 1257*333d2b36SAndroid Build Coastguard Worker 1258*333d2b36SAndroid Build Coastguard Worker // Ensure that genstub is invoked with --systemapi 1259*333d2b36SAndroid Build Coastguard Worker ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi") 1260*333d2b36SAndroid Build Coastguard Worker 1261*333d2b36SAndroid Build Coastguard Worker ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{ 1262*333d2b36SAndroid Build Coastguard Worker "lib64/mylib.so", 1263*333d2b36SAndroid Build Coastguard Worker "lib64/mylib3.so", 1264*333d2b36SAndroid Build Coastguard Worker "lib64/mylib4.so", 1265*333d2b36SAndroid Build Coastguard Worker }) 1266*333d2b36SAndroid Build Coastguard Worker} 1267*333d2b36SAndroid Build Coastguard Worker 1268*333d2b36SAndroid Build Coastguard Workerfunc TestApex_PlatformUsesLatestStubFromApex(t *testing.T) { 1269*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1270*333d2b36SAndroid Build Coastguard Worker // myapex (Z) 1271*333d2b36SAndroid Build Coastguard Worker // mylib -----------------. 1272*333d2b36SAndroid Build Coastguard Worker // | 1273*333d2b36SAndroid Build Coastguard Worker // otherapex (29) | 1274*333d2b36SAndroid Build Coastguard Worker // libstub's versions: 29 Z current 1275*333d2b36SAndroid Build Coastguard Worker // | 1276*333d2b36SAndroid Build Coastguard Worker // <platform> | 1277*333d2b36SAndroid Build Coastguard Worker // libplatform ----------------' 1278*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 1279*333d2b36SAndroid Build Coastguard Worker apex { 1280*333d2b36SAndroid Build Coastguard Worker name: "myapex", 1281*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 1282*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 1283*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "Z", // non-final 1284*333d2b36SAndroid Build Coastguard Worker } 1285*333d2b36SAndroid Build Coastguard Worker 1286*333d2b36SAndroid Build Coastguard Worker cc_library { 1287*333d2b36SAndroid Build Coastguard Worker name: "mylib", 1288*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1289*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libstub"], 1290*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 1291*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "Z", 1292*333d2b36SAndroid Build Coastguard Worker } 1293*333d2b36SAndroid Build Coastguard Worker 1294*333d2b36SAndroid Build Coastguard Worker apex_key { 1295*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 1296*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 1297*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 1298*333d2b36SAndroid Build Coastguard Worker } 1299*333d2b36SAndroid Build Coastguard Worker 1300*333d2b36SAndroid Build Coastguard Worker apex { 1301*333d2b36SAndroid Build Coastguard Worker name: "otherapex", 1302*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 1303*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libstub"], 1304*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 1305*333d2b36SAndroid Build Coastguard Worker } 1306*333d2b36SAndroid Build Coastguard Worker 1307*333d2b36SAndroid Build Coastguard Worker cc_library { 1308*333d2b36SAndroid Build Coastguard Worker name: "libstub", 1309*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1310*333d2b36SAndroid Build Coastguard Worker stubs: { 1311*333d2b36SAndroid Build Coastguard Worker versions: ["29", "Z", "current"], 1312*333d2b36SAndroid Build Coastguard Worker }, 1313*333d2b36SAndroid Build Coastguard Worker apex_available: ["otherapex"], 1314*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 1315*333d2b36SAndroid Build Coastguard Worker } 1316*333d2b36SAndroid Build Coastguard Worker 1317*333d2b36SAndroid Build Coastguard Worker // platform module depending on libstub from otherapex should use the latest stub("current") 1318*333d2b36SAndroid Build Coastguard Worker cc_library { 1319*333d2b36SAndroid Build Coastguard Worker name: "libplatform", 1320*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1321*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libstub"], 1322*333d2b36SAndroid Build Coastguard Worker } 1323*333d2b36SAndroid Build Coastguard Worker `, 1324*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 1325*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_codename = proptools.StringPtr("Z") 1326*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_final = proptools.BoolPtr(false) 1327*333d2b36SAndroid Build Coastguard Worker variables.Platform_version_active_codenames = []string{"Z"} 1328*333d2b36SAndroid Build Coastguard Worker }), 1329*333d2b36SAndroid Build Coastguard Worker ) 1330*333d2b36SAndroid Build Coastguard Worker 1331*333d2b36SAndroid Build Coastguard Worker // Ensure that mylib from myapex is built against the latest stub (current) 1332*333d2b36SAndroid Build Coastguard Worker mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"] 1333*333d2b36SAndroid Build Coastguard Worker ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ") 1334*333d2b36SAndroid Build Coastguard Worker mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"] 1335*333d2b36SAndroid Build Coastguard Worker ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ") 1336*333d2b36SAndroid Build Coastguard Worker 1337*333d2b36SAndroid Build Coastguard Worker // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex 1338*333d2b36SAndroid Build Coastguard Worker libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"] 1339*333d2b36SAndroid Build Coastguard Worker ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000 1340*333d2b36SAndroid Build Coastguard Worker libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"] 1341*333d2b36SAndroid Build Coastguard Worker ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ") 1342*333d2b36SAndroid Build Coastguard Worker} 1343*333d2b36SAndroid Build Coastguard Worker 1344*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithExplicitStubsDependency(t *testing.T) { 1345*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1346*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 1347*333d2b36SAndroid Build Coastguard Worker apex { 1348*333d2b36SAndroid Build Coastguard Worker name: "myapex2", 1349*333d2b36SAndroid Build Coastguard Worker key: "myapex2.key", 1350*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 1351*333d2b36SAndroid Build Coastguard Worker updatable: false, 1352*333d2b36SAndroid Build Coastguard Worker } 1353*333d2b36SAndroid Build Coastguard Worker 1354*333d2b36SAndroid Build Coastguard Worker apex_key { 1355*333d2b36SAndroid Build Coastguard Worker name: "myapex2.key", 1356*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 1357*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 1358*333d2b36SAndroid Build Coastguard Worker } 1359*333d2b36SAndroid Build Coastguard Worker 1360*333d2b36SAndroid Build Coastguard Worker cc_library { 1361*333d2b36SAndroid Build Coastguard Worker name: "mylib", 1362*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1363*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libfoo#10"], 1364*333d2b36SAndroid Build Coastguard Worker static_libs: ["libbaz"], 1365*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1366*333d2b36SAndroid Build Coastguard Worker stl: "none", 1367*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex2" ], 1368*333d2b36SAndroid Build Coastguard Worker } 1369*333d2b36SAndroid Build Coastguard Worker 1370*333d2b36SAndroid Build Coastguard Worker cc_library { 1371*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 1372*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1373*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbar"], 1374*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1375*333d2b36SAndroid Build Coastguard Worker stl: "none", 1376*333d2b36SAndroid Build Coastguard Worker stubs: { 1377*333d2b36SAndroid Build Coastguard Worker versions: ["10", "20", "30"], 1378*333d2b36SAndroid Build Coastguard Worker }, 1379*333d2b36SAndroid Build Coastguard Worker } 1380*333d2b36SAndroid Build Coastguard Worker 1381*333d2b36SAndroid Build Coastguard Worker cc_library { 1382*333d2b36SAndroid Build Coastguard Worker name: "libbar", 1383*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1384*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1385*333d2b36SAndroid Build Coastguard Worker stl: "none", 1386*333d2b36SAndroid Build Coastguard Worker } 1387*333d2b36SAndroid Build Coastguard Worker 1388*333d2b36SAndroid Build Coastguard Worker cc_library_static { 1389*333d2b36SAndroid Build Coastguard Worker name: "libbaz", 1390*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1391*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1392*333d2b36SAndroid Build Coastguard Worker stl: "none", 1393*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex2" ], 1394*333d2b36SAndroid Build Coastguard Worker } 1395*333d2b36SAndroid Build Coastguard Worker 1396*333d2b36SAndroid Build Coastguard Worker `) 1397*333d2b36SAndroid Build Coastguard Worker 1398*333d2b36SAndroid Build Coastguard Worker apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule") 1399*333d2b36SAndroid Build Coastguard Worker copyCmds := apexRule.Args["copy_commands"] 1400*333d2b36SAndroid Build Coastguard Worker 1401*333d2b36SAndroid Build Coastguard Worker // Ensure that direct non-stubs dep is always included 1402*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/mylib.so") 1403*333d2b36SAndroid Build Coastguard Worker 1404*333d2b36SAndroid Build Coastguard Worker // Ensure that indirect stubs dep is not included 1405*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so") 1406*333d2b36SAndroid Build Coastguard Worker 1407*333d2b36SAndroid Build Coastguard Worker // Ensure that dependency of stubs is not included 1408*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so") 1409*333d2b36SAndroid Build Coastguard Worker 1410*333d2b36SAndroid Build Coastguard Worker mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"] 1411*333d2b36SAndroid Build Coastguard Worker 1412*333d2b36SAndroid Build Coastguard Worker // Ensure that mylib is linking with version 10 of libfoo 1413*333d2b36SAndroid Build Coastguard Worker ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so") 1414*333d2b36SAndroid Build Coastguard Worker // ... and not linking to the non-stub (impl) variant of libfoo 1415*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so") 1416*333d2b36SAndroid Build Coastguard Worker 1417*333d2b36SAndroid Build Coastguard Worker libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"] 1418*333d2b36SAndroid Build Coastguard Worker 1419*333d2b36SAndroid Build Coastguard Worker // Ensure that libfoo stubs is not linking to libbar (since it is a stubs) 1420*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, libFooStubsLdFlags, "libbar.so") 1421*333d2b36SAndroid Build Coastguard Worker 1422*333d2b36SAndroid Build Coastguard Worker fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx, 1423*333d2b36SAndroid Build Coastguard Worker ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n") 1424*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib") 1425*333d2b36SAndroid Build Coastguard Worker 1426*333d2b36SAndroid Build Coastguard Worker flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx, 1427*333d2b36SAndroid Build Coastguard Worker ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n") 1428*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)") 1429*333d2b36SAndroid Build Coastguard Worker} 1430*333d2b36SAndroid Build Coastguard Worker 1431*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithRuntimeLibsDependency(t *testing.T) { 1432*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1433*333d2b36SAndroid Build Coastguard Worker /* 1434*333d2b36SAndroid Build Coastguard Worker myapex 1435*333d2b36SAndroid Build Coastguard Worker | 1436*333d2b36SAndroid Build Coastguard Worker v (runtime_libs) 1437*333d2b36SAndroid Build Coastguard Worker mylib ------+------> libfoo [provides stub] 1438*333d2b36SAndroid Build Coastguard Worker | 1439*333d2b36SAndroid Build Coastguard Worker `------> libbar 1440*333d2b36SAndroid Build Coastguard Worker */ 1441*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 1442*333d2b36SAndroid Build Coastguard Worker apex { 1443*333d2b36SAndroid Build Coastguard Worker name: "myapex", 1444*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 1445*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 1446*333d2b36SAndroid Build Coastguard Worker updatable: false, 1447*333d2b36SAndroid Build Coastguard Worker } 1448*333d2b36SAndroid Build Coastguard Worker 1449*333d2b36SAndroid Build Coastguard Worker apex_key { 1450*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 1451*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 1452*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 1453*333d2b36SAndroid Build Coastguard Worker } 1454*333d2b36SAndroid Build Coastguard Worker 1455*333d2b36SAndroid Build Coastguard Worker cc_library { 1456*333d2b36SAndroid Build Coastguard Worker name: "mylib", 1457*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1458*333d2b36SAndroid Build Coastguard Worker static_libs: ["libstatic"], 1459*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libshared"], 1460*333d2b36SAndroid Build Coastguard Worker runtime_libs: ["libfoo", "libbar"], 1461*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1462*333d2b36SAndroid Build Coastguard Worker stl: "none", 1463*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 1464*333d2b36SAndroid Build Coastguard Worker } 1465*333d2b36SAndroid Build Coastguard Worker 1466*333d2b36SAndroid Build Coastguard Worker cc_library { 1467*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 1468*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1469*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1470*333d2b36SAndroid Build Coastguard Worker stl: "none", 1471*333d2b36SAndroid Build Coastguard Worker stubs: { 1472*333d2b36SAndroid Build Coastguard Worker versions: ["10", "20", "30"], 1473*333d2b36SAndroid Build Coastguard Worker }, 1474*333d2b36SAndroid Build Coastguard Worker } 1475*333d2b36SAndroid Build Coastguard Worker 1476*333d2b36SAndroid Build Coastguard Worker cc_library { 1477*333d2b36SAndroid Build Coastguard Worker name: "libbar", 1478*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1479*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1480*333d2b36SAndroid Build Coastguard Worker stl: "none", 1481*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 1482*333d2b36SAndroid Build Coastguard Worker } 1483*333d2b36SAndroid Build Coastguard Worker 1484*333d2b36SAndroid Build Coastguard Worker cc_library { 1485*333d2b36SAndroid Build Coastguard Worker name: "libstatic", 1486*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1487*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1488*333d2b36SAndroid Build Coastguard Worker stl: "none", 1489*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 1490*333d2b36SAndroid Build Coastguard Worker runtime_libs: ["libstatic_to_runtime"], 1491*333d2b36SAndroid Build Coastguard Worker } 1492*333d2b36SAndroid Build Coastguard Worker 1493*333d2b36SAndroid Build Coastguard Worker cc_library { 1494*333d2b36SAndroid Build Coastguard Worker name: "libshared", 1495*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1496*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1497*333d2b36SAndroid Build Coastguard Worker stl: "none", 1498*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 1499*333d2b36SAndroid Build Coastguard Worker runtime_libs: ["libshared_to_runtime"], 1500*333d2b36SAndroid Build Coastguard Worker } 1501*333d2b36SAndroid Build Coastguard Worker 1502*333d2b36SAndroid Build Coastguard Worker cc_library { 1503*333d2b36SAndroid Build Coastguard Worker name: "libstatic_to_runtime", 1504*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1505*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1506*333d2b36SAndroid Build Coastguard Worker stl: "none", 1507*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 1508*333d2b36SAndroid Build Coastguard Worker } 1509*333d2b36SAndroid Build Coastguard Worker 1510*333d2b36SAndroid Build Coastguard Worker cc_library { 1511*333d2b36SAndroid Build Coastguard Worker name: "libshared_to_runtime", 1512*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1513*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1514*333d2b36SAndroid Build Coastguard Worker stl: "none", 1515*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 1516*333d2b36SAndroid Build Coastguard Worker } 1517*333d2b36SAndroid Build Coastguard Worker `) 1518*333d2b36SAndroid Build Coastguard Worker 1519*333d2b36SAndroid Build Coastguard Worker apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule") 1520*333d2b36SAndroid Build Coastguard Worker copyCmds := apexRule.Args["copy_commands"] 1521*333d2b36SAndroid Build Coastguard Worker 1522*333d2b36SAndroid Build Coastguard Worker // Ensure that direct non-stubs dep is always included 1523*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/mylib.so") 1524*333d2b36SAndroid Build Coastguard Worker 1525*333d2b36SAndroid Build Coastguard Worker // Ensure that indirect stubs dep is not included 1526*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so") 1527*333d2b36SAndroid Build Coastguard Worker 1528*333d2b36SAndroid Build Coastguard Worker // Ensure that runtime_libs dep in included 1529*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/libbar.so") 1530*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/libshared.so") 1531*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so") 1532*333d2b36SAndroid Build Coastguard Worker 1533*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so") 1534*333d2b36SAndroid Build Coastguard Worker 1535*333d2b36SAndroid Build Coastguard Worker apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule") 1536*333d2b36SAndroid Build Coastguard Worker ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"])) 1537*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so") 1538*333d2b36SAndroid Build Coastguard Worker} 1539*333d2b36SAndroid Build Coastguard Worker 1540*333d2b36SAndroid Build Coastguard Workervar prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers( 1541*333d2b36SAndroid Build Coastguard Worker cc.PrepareForTestWithCcBuildComponents, 1542*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithApexBuildComponents, 1543*333d2b36SAndroid Build Coastguard Worker android.FixtureAddTextFile("bionic/apex/Android.bp", ` 1544*333d2b36SAndroid Build Coastguard Worker apex { 1545*333d2b36SAndroid Build Coastguard Worker name: "com.android.runtime", 1546*333d2b36SAndroid Build Coastguard Worker key: "com.android.runtime.key", 1547*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libc"], 1548*333d2b36SAndroid Build Coastguard Worker updatable: false, 1549*333d2b36SAndroid Build Coastguard Worker } 1550*333d2b36SAndroid Build Coastguard Worker 1551*333d2b36SAndroid Build Coastguard Worker apex_key { 1552*333d2b36SAndroid Build Coastguard Worker name: "com.android.runtime.key", 1553*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 1554*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 1555*333d2b36SAndroid Build Coastguard Worker } 1556*333d2b36SAndroid Build Coastguard Worker `), 1557*333d2b36SAndroid Build Coastguard Worker android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil), 1558*333d2b36SAndroid Build Coastguard Worker) 1559*333d2b36SAndroid Build Coastguard Worker 1560*333d2b36SAndroid Build Coastguard Workerfunc TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) { 1561*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1562*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, ` 1563*333d2b36SAndroid Build Coastguard Worker cc_library { 1564*333d2b36SAndroid Build Coastguard Worker name: "libc", 1565*333d2b36SAndroid Build Coastguard Worker no_libcrt: true, 1566*333d2b36SAndroid Build Coastguard Worker nocrt: true, 1567*333d2b36SAndroid Build Coastguard Worker no_crt_pad_segment: true, 1568*333d2b36SAndroid Build Coastguard Worker stl: "none", 1569*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1570*333d2b36SAndroid Build Coastguard Worker stubs: { versions: ["1"] }, 1571*333d2b36SAndroid Build Coastguard Worker apex_available: ["com.android.runtime"], 1572*333d2b36SAndroid Build Coastguard Worker 1573*333d2b36SAndroid Build Coastguard Worker sanitize: { 1574*333d2b36SAndroid Build Coastguard Worker hwaddress: true, 1575*333d2b36SAndroid Build Coastguard Worker } 1576*333d2b36SAndroid Build Coastguard Worker } 1577*333d2b36SAndroid Build Coastguard Worker 1578*333d2b36SAndroid Build Coastguard Worker cc_prebuilt_library_shared { 1579*333d2b36SAndroid Build Coastguard Worker name: "libclang_rt.hwasan", 1580*333d2b36SAndroid Build Coastguard Worker no_libcrt: true, 1581*333d2b36SAndroid Build Coastguard Worker nocrt: true, 1582*333d2b36SAndroid Build Coastguard Worker no_crt_pad_segment: true, 1583*333d2b36SAndroid Build Coastguard Worker stl: "none", 1584*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1585*333d2b36SAndroid Build Coastguard Worker srcs: [""], 1586*333d2b36SAndroid Build Coastguard Worker stubs: { versions: ["1"] }, 1587*333d2b36SAndroid Build Coastguard Worker stem: "libclang_rt.hwasan-aarch64-android", 1588*333d2b36SAndroid Build Coastguard Worker 1589*333d2b36SAndroid Build Coastguard Worker sanitize: { 1590*333d2b36SAndroid Build Coastguard Worker never: true, 1591*333d2b36SAndroid Build Coastguard Worker }, 1592*333d2b36SAndroid Build Coastguard Worker apex_available: [ 1593*333d2b36SAndroid Build Coastguard Worker "//apex_available:anyapex", 1594*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 1595*333d2b36SAndroid Build Coastguard Worker ], 1596*333d2b36SAndroid Build Coastguard Worker } `) 1597*333d2b36SAndroid Build Coastguard Worker ctx := result.TestContext 1598*333d2b36SAndroid Build Coastguard Worker 1599*333d2b36SAndroid Build Coastguard Worker ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{ 1600*333d2b36SAndroid Build Coastguard Worker "lib64/bionic/libc.so", 1601*333d2b36SAndroid Build Coastguard Worker "lib64/bionic/libclang_rt.hwasan-aarch64-android.so", 1602*333d2b36SAndroid Build Coastguard Worker }) 1603*333d2b36SAndroid Build Coastguard Worker 1604*333d2b36SAndroid Build Coastguard Worker hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared") 1605*333d2b36SAndroid Build Coastguard Worker 1606*333d2b36SAndroid Build Coastguard Worker installed := hwasan.Description("install libclang_rt.hwasan") 1607*333d2b36SAndroid Build Coastguard Worker ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so") 1608*333d2b36SAndroid Build Coastguard Worker 1609*333d2b36SAndroid Build Coastguard Worker symlink := hwasan.Description("install symlink libclang_rt.hwasan") 1610*333d2b36SAndroid Build Coastguard Worker ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so") 1611*333d2b36SAndroid Build Coastguard Worker ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so") 1612*333d2b36SAndroid Build Coastguard Worker} 1613*333d2b36SAndroid Build Coastguard Worker 1614*333d2b36SAndroid Build Coastguard Workerfunc TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) { 1615*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1616*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 1617*333d2b36SAndroid Build Coastguard Worker prepareForTestOfRuntimeApexWithHwasan, 1618*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 1619*333d2b36SAndroid Build Coastguard Worker variables.SanitizeDevice = []string{"hwaddress"} 1620*333d2b36SAndroid Build Coastguard Worker }), 1621*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 1622*333d2b36SAndroid Build Coastguard Worker cc_library { 1623*333d2b36SAndroid Build Coastguard Worker name: "libc", 1624*333d2b36SAndroid Build Coastguard Worker no_libcrt: true, 1625*333d2b36SAndroid Build Coastguard Worker nocrt: true, 1626*333d2b36SAndroid Build Coastguard Worker no_crt_pad_segment: true, 1627*333d2b36SAndroid Build Coastguard Worker stl: "none", 1628*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1629*333d2b36SAndroid Build Coastguard Worker stubs: { versions: ["1"] }, 1630*333d2b36SAndroid Build Coastguard Worker apex_available: ["com.android.runtime"], 1631*333d2b36SAndroid Build Coastguard Worker } 1632*333d2b36SAndroid Build Coastguard Worker 1633*333d2b36SAndroid Build Coastguard Worker cc_prebuilt_library_shared { 1634*333d2b36SAndroid Build Coastguard Worker name: "libclang_rt.hwasan", 1635*333d2b36SAndroid Build Coastguard Worker no_libcrt: true, 1636*333d2b36SAndroid Build Coastguard Worker nocrt: true, 1637*333d2b36SAndroid Build Coastguard Worker no_crt_pad_segment: true, 1638*333d2b36SAndroid Build Coastguard Worker stl: "none", 1639*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1640*333d2b36SAndroid Build Coastguard Worker srcs: [""], 1641*333d2b36SAndroid Build Coastguard Worker stubs: { versions: ["1"] }, 1642*333d2b36SAndroid Build Coastguard Worker stem: "libclang_rt.hwasan-aarch64-android", 1643*333d2b36SAndroid Build Coastguard Worker 1644*333d2b36SAndroid Build Coastguard Worker sanitize: { 1645*333d2b36SAndroid Build Coastguard Worker never: true, 1646*333d2b36SAndroid Build Coastguard Worker }, 1647*333d2b36SAndroid Build Coastguard Worker apex_available: [ 1648*333d2b36SAndroid Build Coastguard Worker "//apex_available:anyapex", 1649*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 1650*333d2b36SAndroid Build Coastguard Worker ], 1651*333d2b36SAndroid Build Coastguard Worker } 1652*333d2b36SAndroid Build Coastguard Worker `) 1653*333d2b36SAndroid Build Coastguard Worker ctx := result.TestContext 1654*333d2b36SAndroid Build Coastguard Worker 1655*333d2b36SAndroid Build Coastguard Worker ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{ 1656*333d2b36SAndroid Build Coastguard Worker "lib64/bionic/libc.so", 1657*333d2b36SAndroid Build Coastguard Worker "lib64/bionic/libclang_rt.hwasan-aarch64-android.so", 1658*333d2b36SAndroid Build Coastguard Worker }) 1659*333d2b36SAndroid Build Coastguard Worker 1660*333d2b36SAndroid Build Coastguard Worker hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared") 1661*333d2b36SAndroid Build Coastguard Worker 1662*333d2b36SAndroid Build Coastguard Worker installed := hwasan.Description("install libclang_rt.hwasan") 1663*333d2b36SAndroid Build Coastguard Worker ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so") 1664*333d2b36SAndroid Build Coastguard Worker 1665*333d2b36SAndroid Build Coastguard Worker symlink := hwasan.Description("install symlink libclang_rt.hwasan") 1666*333d2b36SAndroid Build Coastguard Worker ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so") 1667*333d2b36SAndroid Build Coastguard Worker ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so") 1668*333d2b36SAndroid Build Coastguard Worker} 1669*333d2b36SAndroid Build Coastguard Worker 1670*333d2b36SAndroid Build Coastguard Workerfunc TestApexDependsOnLLNDKTransitively(t *testing.T) { 1671*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1672*333d2b36SAndroid Build Coastguard Worker testcases := []struct { 1673*333d2b36SAndroid Build Coastguard Worker name string 1674*333d2b36SAndroid Build Coastguard Worker minSdkVersion string 1675*333d2b36SAndroid Build Coastguard Worker apexVariant string 1676*333d2b36SAndroid Build Coastguard Worker shouldLink string 1677*333d2b36SAndroid Build Coastguard Worker shouldNotLink []string 1678*333d2b36SAndroid Build Coastguard Worker }{ 1679*333d2b36SAndroid Build Coastguard Worker { 1680*333d2b36SAndroid Build Coastguard Worker name: "unspecified version links to the latest", 1681*333d2b36SAndroid Build Coastguard Worker minSdkVersion: "", 1682*333d2b36SAndroid Build Coastguard Worker apexVariant: "apex10000", 1683*333d2b36SAndroid Build Coastguard Worker shouldLink: "current", 1684*333d2b36SAndroid Build Coastguard Worker shouldNotLink: []string{"29", "30"}, 1685*333d2b36SAndroid Build Coastguard Worker }, 1686*333d2b36SAndroid Build Coastguard Worker { 1687*333d2b36SAndroid Build Coastguard Worker name: "always use the latest", 1688*333d2b36SAndroid Build Coastguard Worker minSdkVersion: "min_sdk_version: \"29\",", 1689*333d2b36SAndroid Build Coastguard Worker apexVariant: "apex29", 1690*333d2b36SAndroid Build Coastguard Worker shouldLink: "current", 1691*333d2b36SAndroid Build Coastguard Worker shouldNotLink: []string{"29", "30"}, 1692*333d2b36SAndroid Build Coastguard Worker }, 1693*333d2b36SAndroid Build Coastguard Worker } 1694*333d2b36SAndroid Build Coastguard Worker for _, tc := range testcases { 1695*333d2b36SAndroid Build Coastguard Worker t.Run(tc.name, func(t *testing.T) { 1696*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1697*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 1698*333d2b36SAndroid Build Coastguard Worker apex { 1699*333d2b36SAndroid Build Coastguard Worker name: "myapex", 1700*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 1701*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 1702*333d2b36SAndroid Build Coastguard Worker updatable: false, 1703*333d2b36SAndroid Build Coastguard Worker `+tc.minSdkVersion+` 1704*333d2b36SAndroid Build Coastguard Worker } 1705*333d2b36SAndroid Build Coastguard Worker 1706*333d2b36SAndroid Build Coastguard Worker apex_key { 1707*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 1708*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 1709*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 1710*333d2b36SAndroid Build Coastguard Worker } 1711*333d2b36SAndroid Build Coastguard Worker 1712*333d2b36SAndroid Build Coastguard Worker cc_library { 1713*333d2b36SAndroid Build Coastguard Worker name: "mylib", 1714*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1715*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 1716*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbar"], 1717*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1718*333d2b36SAndroid Build Coastguard Worker stl: "none", 1719*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 1720*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 1721*333d2b36SAndroid Build Coastguard Worker } 1722*333d2b36SAndroid Build Coastguard Worker 1723*333d2b36SAndroid Build Coastguard Worker cc_library { 1724*333d2b36SAndroid Build Coastguard Worker name: "libbar", 1725*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1726*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1727*333d2b36SAndroid Build Coastguard Worker stl: "none", 1728*333d2b36SAndroid Build Coastguard Worker stubs: { versions: ["29","30"] }, 1729*333d2b36SAndroid Build Coastguard Worker llndk: { 1730*333d2b36SAndroid Build Coastguard Worker symbol_file: "libbar.map.txt", 1731*333d2b36SAndroid Build Coastguard Worker } 1732*333d2b36SAndroid Build Coastguard Worker } 1733*333d2b36SAndroid Build Coastguard Worker `, 1734*333d2b36SAndroid Build Coastguard Worker withUnbundledBuild, 1735*333d2b36SAndroid Build Coastguard Worker ) 1736*333d2b36SAndroid Build Coastguard Worker 1737*333d2b36SAndroid Build Coastguard Worker // Ensure that LLNDK dep is not included 1738*333d2b36SAndroid Build Coastguard Worker ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{ 1739*333d2b36SAndroid Build Coastguard Worker "lib64/mylib.so", 1740*333d2b36SAndroid Build Coastguard Worker }) 1741*333d2b36SAndroid Build Coastguard Worker 1742*333d2b36SAndroid Build Coastguard Worker // Ensure that LLNDK dep is required 1743*333d2b36SAndroid Build Coastguard Worker apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule") 1744*333d2b36SAndroid Build Coastguard Worker ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"])) 1745*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so") 1746*333d2b36SAndroid Build Coastguard Worker 1747*333d2b36SAndroid Build Coastguard Worker mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"] 1748*333d2b36SAndroid Build Coastguard Worker ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so") 1749*333d2b36SAndroid Build Coastguard Worker for _, ver := range tc.shouldNotLink { 1750*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so") 1751*333d2b36SAndroid Build Coastguard Worker } 1752*333d2b36SAndroid Build Coastguard Worker 1753*333d2b36SAndroid Build Coastguard Worker mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"] 1754*333d2b36SAndroid Build Coastguard Worker ver := tc.shouldLink 1755*333d2b36SAndroid Build Coastguard Worker if tc.shouldLink == "current" { 1756*333d2b36SAndroid Build Coastguard Worker ver = strconv.Itoa(android.FutureApiLevelInt) 1757*333d2b36SAndroid Build Coastguard Worker } 1758*333d2b36SAndroid Build Coastguard Worker ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver) 1759*333d2b36SAndroid Build Coastguard Worker }) 1760*333d2b36SAndroid Build Coastguard Worker } 1761*333d2b36SAndroid Build Coastguard Worker} 1762*333d2b36SAndroid Build Coastguard Worker 1763*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithSystemLibsStubs(t *testing.T) { 1764*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1765*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 1766*333d2b36SAndroid Build Coastguard Worker apex { 1767*333d2b36SAndroid Build Coastguard Worker name: "myapex", 1768*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 1769*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"], 1770*333d2b36SAndroid Build Coastguard Worker updatable: false, 1771*333d2b36SAndroid Build Coastguard Worker } 1772*333d2b36SAndroid Build Coastguard Worker 1773*333d2b36SAndroid Build Coastguard Worker apex_key { 1774*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 1775*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 1776*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 1777*333d2b36SAndroid Build Coastguard Worker } 1778*333d2b36SAndroid Build Coastguard Worker 1779*333d2b36SAndroid Build Coastguard Worker cc_library { 1780*333d2b36SAndroid Build Coastguard Worker name: "mylib", 1781*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1782*333d2b36SAndroid Build Coastguard Worker system_shared_libs: ["libc"], 1783*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libdl#27", "libm#impl"], 1784*333d2b36SAndroid Build Coastguard Worker stl: "none", 1785*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 1786*333d2b36SAndroid Build Coastguard Worker } 1787*333d2b36SAndroid Build Coastguard Worker 1788*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 1789*333d2b36SAndroid Build Coastguard Worker name: "mylib_shared", 1790*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1791*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libdl#27"], 1792*333d2b36SAndroid Build Coastguard Worker stl: "none", 1793*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 1794*333d2b36SAndroid Build Coastguard Worker } 1795*333d2b36SAndroid Build Coastguard Worker 1796*333d2b36SAndroid Build Coastguard Worker cc_library { 1797*333d2b36SAndroid Build Coastguard Worker name: "libBootstrap", 1798*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 1799*333d2b36SAndroid Build Coastguard Worker stl: "none", 1800*333d2b36SAndroid Build Coastguard Worker bootstrap: true, 1801*333d2b36SAndroid Build Coastguard Worker } 1802*333d2b36SAndroid Build Coastguard Worker `) 1803*333d2b36SAndroid Build Coastguard Worker 1804*333d2b36SAndroid Build Coastguard Worker apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule") 1805*333d2b36SAndroid Build Coastguard Worker copyCmds := apexRule.Args["copy_commands"] 1806*333d2b36SAndroid Build Coastguard Worker 1807*333d2b36SAndroid Build Coastguard Worker // Ensure that mylib, libm, libdl are included. 1808*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/mylib.so") 1809*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so") 1810*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so") 1811*333d2b36SAndroid Build Coastguard Worker 1812*333d2b36SAndroid Build Coastguard Worker // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs) 1813*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so") 1814*333d2b36SAndroid Build Coastguard Worker 1815*333d2b36SAndroid Build Coastguard Worker mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"] 1816*333d2b36SAndroid Build Coastguard Worker mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"] 1817*333d2b36SAndroid Build Coastguard Worker mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"] 1818*333d2b36SAndroid Build Coastguard Worker 1819*333d2b36SAndroid Build Coastguard Worker // For dependency to libc 1820*333d2b36SAndroid Build Coastguard Worker // Ensure that mylib is linking with the latest version of stubs 1821*333d2b36SAndroid Build Coastguard Worker ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so") 1822*333d2b36SAndroid Build Coastguard Worker // ... and not linking to the non-stub (impl) variant 1823*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so") 1824*333d2b36SAndroid Build Coastguard Worker // ... Cflags from stub is correctly exported to mylib 1825*333d2b36SAndroid Build Coastguard Worker ensureContains(t, mylibCFlags, "__LIBC_API__=10000") 1826*333d2b36SAndroid Build Coastguard Worker ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000") 1827*333d2b36SAndroid Build Coastguard Worker 1828*333d2b36SAndroid Build Coastguard Worker // For dependency to libm 1829*333d2b36SAndroid Build Coastguard Worker // Ensure that mylib is linking with the non-stub (impl) variant 1830*333d2b36SAndroid Build Coastguard Worker ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so") 1831*333d2b36SAndroid Build Coastguard Worker // ... and not linking to the stub variant 1832*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so") 1833*333d2b36SAndroid Build Coastguard Worker // ... and is not compiling with the stub 1834*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, mylibCFlags, "__LIBM_API__=29") 1835*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29") 1836*333d2b36SAndroid Build Coastguard Worker 1837*333d2b36SAndroid Build Coastguard Worker // For dependency to libdl 1838*333d2b36SAndroid Build Coastguard Worker // Ensure that mylib is linking with the specified version of stubs 1839*333d2b36SAndroid Build Coastguard Worker ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so") 1840*333d2b36SAndroid Build Coastguard Worker // ... and not linking to the other versions of stubs 1841*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so") 1842*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so") 1843*333d2b36SAndroid Build Coastguard Worker // ... and not linking to the non-stub (impl) variant 1844*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so") 1845*333d2b36SAndroid Build Coastguard Worker // ... Cflags from stub is correctly exported to mylib 1846*333d2b36SAndroid Build Coastguard Worker ensureContains(t, mylibCFlags, "__LIBDL_API__=27") 1847*333d2b36SAndroid Build Coastguard Worker ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27") 1848*333d2b36SAndroid Build Coastguard Worker 1849*333d2b36SAndroid Build Coastguard Worker // Ensure that libBootstrap is depending on the platform variant of bionic libs 1850*333d2b36SAndroid Build Coastguard Worker libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"] 1851*333d2b36SAndroid Build Coastguard Worker ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so") 1852*333d2b36SAndroid Build Coastguard Worker ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so") 1853*333d2b36SAndroid Build Coastguard Worker ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so") 1854*333d2b36SAndroid Build Coastguard Worker} 1855*333d2b36SAndroid Build Coastguard Worker 1856*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) { 1857*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1858*333d2b36SAndroid Build Coastguard Worker // there are three links between liba --> libz. 1859*333d2b36SAndroid Build Coastguard Worker // 1) myapex -> libx -> liba -> libz : this should be #30 link 1860*333d2b36SAndroid Build Coastguard Worker // 2) otherapex -> liby -> liba -> libz : this should be #30 link 1861*333d2b36SAndroid Build Coastguard Worker // 3) (platform) -> liba -> libz : this should be non-stub link 1862*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 1863*333d2b36SAndroid Build Coastguard Worker apex { 1864*333d2b36SAndroid Build Coastguard Worker name: "myapex", 1865*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 1866*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libx"], 1867*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 1868*333d2b36SAndroid Build Coastguard Worker } 1869*333d2b36SAndroid Build Coastguard Worker 1870*333d2b36SAndroid Build Coastguard Worker apex { 1871*333d2b36SAndroid Build Coastguard Worker name: "otherapex", 1872*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 1873*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["liby"], 1874*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "30", 1875*333d2b36SAndroid Build Coastguard Worker } 1876*333d2b36SAndroid Build Coastguard Worker 1877*333d2b36SAndroid Build Coastguard Worker apex_key { 1878*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 1879*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 1880*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 1881*333d2b36SAndroid Build Coastguard Worker } 1882*333d2b36SAndroid Build Coastguard Worker 1883*333d2b36SAndroid Build Coastguard Worker cc_library { 1884*333d2b36SAndroid Build Coastguard Worker name: "libx", 1885*333d2b36SAndroid Build Coastguard Worker shared_libs: ["liba"], 1886*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1887*333d2b36SAndroid Build Coastguard Worker stl: "none", 1888*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 1889*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 1890*333d2b36SAndroid Build Coastguard Worker } 1891*333d2b36SAndroid Build Coastguard Worker 1892*333d2b36SAndroid Build Coastguard Worker cc_library { 1893*333d2b36SAndroid Build Coastguard Worker name: "liby", 1894*333d2b36SAndroid Build Coastguard Worker shared_libs: ["liba"], 1895*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1896*333d2b36SAndroid Build Coastguard Worker stl: "none", 1897*333d2b36SAndroid Build Coastguard Worker apex_available: [ "otherapex" ], 1898*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 1899*333d2b36SAndroid Build Coastguard Worker } 1900*333d2b36SAndroid Build Coastguard Worker 1901*333d2b36SAndroid Build Coastguard Worker cc_library { 1902*333d2b36SAndroid Build Coastguard Worker name: "liba", 1903*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libz"], 1904*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1905*333d2b36SAndroid Build Coastguard Worker stl: "none", 1906*333d2b36SAndroid Build Coastguard Worker apex_available: [ 1907*333d2b36SAndroid Build Coastguard Worker "//apex_available:anyapex", 1908*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 1909*333d2b36SAndroid Build Coastguard Worker ], 1910*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 1911*333d2b36SAndroid Build Coastguard Worker } 1912*333d2b36SAndroid Build Coastguard Worker 1913*333d2b36SAndroid Build Coastguard Worker cc_library { 1914*333d2b36SAndroid Build Coastguard Worker name: "libz", 1915*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1916*333d2b36SAndroid Build Coastguard Worker stl: "none", 1917*333d2b36SAndroid Build Coastguard Worker stubs: { 1918*333d2b36SAndroid Build Coastguard Worker versions: ["28", "30"], 1919*333d2b36SAndroid Build Coastguard Worker }, 1920*333d2b36SAndroid Build Coastguard Worker } 1921*333d2b36SAndroid Build Coastguard Worker `) 1922*333d2b36SAndroid Build Coastguard Worker 1923*333d2b36SAndroid Build Coastguard Worker expectLink := func(from, from_variant, to, to_variant string) { 1924*333d2b36SAndroid Build Coastguard Worker ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"] 1925*333d2b36SAndroid Build Coastguard Worker ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so") 1926*333d2b36SAndroid Build Coastguard Worker } 1927*333d2b36SAndroid Build Coastguard Worker expectNoLink := func(from, from_variant, to, to_variant string) { 1928*333d2b36SAndroid Build Coastguard Worker ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"] 1929*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so") 1930*333d2b36SAndroid Build Coastguard Worker } 1931*333d2b36SAndroid Build Coastguard Worker // platform liba is linked to non-stub version 1932*333d2b36SAndroid Build Coastguard Worker expectLink("liba", "shared", "libz", "shared") 1933*333d2b36SAndroid Build Coastguard Worker // liba in myapex is linked to current 1934*333d2b36SAndroid Build Coastguard Worker expectLink("liba", "shared_apex29", "libz", "shared_current") 1935*333d2b36SAndroid Build Coastguard Worker expectNoLink("liba", "shared_apex29", "libz", "shared_30") 1936*333d2b36SAndroid Build Coastguard Worker expectNoLink("liba", "shared_apex29", "libz", "shared_28") 1937*333d2b36SAndroid Build Coastguard Worker expectNoLink("liba", "shared_apex29", "libz", "shared") 1938*333d2b36SAndroid Build Coastguard Worker // liba in otherapex is linked to current 1939*333d2b36SAndroid Build Coastguard Worker expectLink("liba", "shared_apex30", "libz", "shared_current") 1940*333d2b36SAndroid Build Coastguard Worker expectNoLink("liba", "shared_apex30", "libz", "shared_30") 1941*333d2b36SAndroid Build Coastguard Worker expectNoLink("liba", "shared_apex30", "libz", "shared_28") 1942*333d2b36SAndroid Build Coastguard Worker expectNoLink("liba", "shared_apex30", "libz", "shared") 1943*333d2b36SAndroid Build Coastguard Worker} 1944*333d2b36SAndroid Build Coastguard Worker 1945*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) { 1946*333d2b36SAndroid Build Coastguard Worker t.Parallel() 1947*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 1948*333d2b36SAndroid Build Coastguard Worker apex { 1949*333d2b36SAndroid Build Coastguard Worker name: "myapex", 1950*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 1951*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libx"], 1952*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "R", 1953*333d2b36SAndroid Build Coastguard Worker } 1954*333d2b36SAndroid Build Coastguard Worker 1955*333d2b36SAndroid Build Coastguard Worker apex_key { 1956*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 1957*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 1958*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 1959*333d2b36SAndroid Build Coastguard Worker } 1960*333d2b36SAndroid Build Coastguard Worker 1961*333d2b36SAndroid Build Coastguard Worker cc_library { 1962*333d2b36SAndroid Build Coastguard Worker name: "libx", 1963*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libz"], 1964*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1965*333d2b36SAndroid Build Coastguard Worker stl: "none", 1966*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 1967*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "R", 1968*333d2b36SAndroid Build Coastguard Worker } 1969*333d2b36SAndroid Build Coastguard Worker 1970*333d2b36SAndroid Build Coastguard Worker cc_library { 1971*333d2b36SAndroid Build Coastguard Worker name: "libz", 1972*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 1973*333d2b36SAndroid Build Coastguard Worker stl: "none", 1974*333d2b36SAndroid Build Coastguard Worker stubs: { 1975*333d2b36SAndroid Build Coastguard Worker versions: ["29", "R"], 1976*333d2b36SAndroid Build Coastguard Worker }, 1977*333d2b36SAndroid Build Coastguard Worker } 1978*333d2b36SAndroid Build Coastguard Worker `, 1979*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 1980*333d2b36SAndroid Build Coastguard Worker variables.Platform_version_active_codenames = []string{"R"} 1981*333d2b36SAndroid Build Coastguard Worker }), 1982*333d2b36SAndroid Build Coastguard Worker ) 1983*333d2b36SAndroid Build Coastguard Worker 1984*333d2b36SAndroid Build Coastguard Worker expectLink := func(from, from_variant, to, to_variant string) { 1985*333d2b36SAndroid Build Coastguard Worker ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"] 1986*333d2b36SAndroid Build Coastguard Worker ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so") 1987*333d2b36SAndroid Build Coastguard Worker } 1988*333d2b36SAndroid Build Coastguard Worker expectNoLink := func(from, from_variant, to, to_variant string) { 1989*333d2b36SAndroid Build Coastguard Worker ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"] 1990*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so") 1991*333d2b36SAndroid Build Coastguard Worker } 1992*333d2b36SAndroid Build Coastguard Worker expectLink("libx", "shared_apex10000", "libz", "shared_current") 1993*333d2b36SAndroid Build Coastguard Worker expectNoLink("libx", "shared_apex10000", "libz", "shared_R") 1994*333d2b36SAndroid Build Coastguard Worker expectNoLink("libx", "shared_apex10000", "libz", "shared_29") 1995*333d2b36SAndroid Build Coastguard Worker expectNoLink("libx", "shared_apex10000", "libz", "shared") 1996*333d2b36SAndroid Build Coastguard Worker} 1997*333d2b36SAndroid Build Coastguard Worker 1998*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) { 1999*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2000*333d2b36SAndroid Build Coastguard Worker testApex(t, ` 2001*333d2b36SAndroid Build Coastguard Worker apex { 2002*333d2b36SAndroid Build Coastguard Worker name: "myapex", 2003*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2004*333d2b36SAndroid Build Coastguard Worker java_libs: ["libx"], 2005*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "S", 2006*333d2b36SAndroid Build Coastguard Worker } 2007*333d2b36SAndroid Build Coastguard Worker 2008*333d2b36SAndroid Build Coastguard Worker apex_key { 2009*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 2010*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 2011*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 2012*333d2b36SAndroid Build Coastguard Worker } 2013*333d2b36SAndroid Build Coastguard Worker 2014*333d2b36SAndroid Build Coastguard Worker java_library { 2015*333d2b36SAndroid Build Coastguard Worker name: "libx", 2016*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2017*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 2018*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2019*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "S", // should be okay 2020*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 2021*333d2b36SAndroid Build Coastguard Worker } 2022*333d2b36SAndroid Build Coastguard Worker `, 2023*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 2024*333d2b36SAndroid Build Coastguard Worker variables.Platform_version_active_codenames = []string{"S"} 2025*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_codename = proptools.StringPtr("S") 2026*333d2b36SAndroid Build Coastguard Worker }), 2027*333d2b36SAndroid Build Coastguard Worker ) 2028*333d2b36SAndroid Build Coastguard Worker} 2029*333d2b36SAndroid Build Coastguard Worker 2030*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) { 2031*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2032*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 2033*333d2b36SAndroid Build Coastguard Worker apex { 2034*333d2b36SAndroid Build Coastguard Worker name: "myapex", 2035*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2036*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libx"], 2037*333d2b36SAndroid Build Coastguard Worker updatable: false, 2038*333d2b36SAndroid Build Coastguard Worker } 2039*333d2b36SAndroid Build Coastguard Worker 2040*333d2b36SAndroid Build Coastguard Worker apex_key { 2041*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 2042*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 2043*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 2044*333d2b36SAndroid Build Coastguard Worker } 2045*333d2b36SAndroid Build Coastguard Worker 2046*333d2b36SAndroid Build Coastguard Worker cc_library { 2047*333d2b36SAndroid Build Coastguard Worker name: "libx", 2048*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libz"], 2049*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 2050*333d2b36SAndroid Build Coastguard Worker stl: "none", 2051*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 2052*333d2b36SAndroid Build Coastguard Worker } 2053*333d2b36SAndroid Build Coastguard Worker 2054*333d2b36SAndroid Build Coastguard Worker cc_library { 2055*333d2b36SAndroid Build Coastguard Worker name: "libz", 2056*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 2057*333d2b36SAndroid Build Coastguard Worker stl: "none", 2058*333d2b36SAndroid Build Coastguard Worker stubs: { 2059*333d2b36SAndroid Build Coastguard Worker versions: ["1", "2"], 2060*333d2b36SAndroid Build Coastguard Worker }, 2061*333d2b36SAndroid Build Coastguard Worker } 2062*333d2b36SAndroid Build Coastguard Worker `) 2063*333d2b36SAndroid Build Coastguard Worker 2064*333d2b36SAndroid Build Coastguard Worker expectLink := func(from, from_variant, to, to_variant string) { 2065*333d2b36SAndroid Build Coastguard Worker ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"] 2066*333d2b36SAndroid Build Coastguard Worker ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so") 2067*333d2b36SAndroid Build Coastguard Worker } 2068*333d2b36SAndroid Build Coastguard Worker expectNoLink := func(from, from_variant, to, to_variant string) { 2069*333d2b36SAndroid Build Coastguard Worker ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"] 2070*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so") 2071*333d2b36SAndroid Build Coastguard Worker } 2072*333d2b36SAndroid Build Coastguard Worker expectLink("libx", "shared_apex10000", "libz", "shared_current") 2073*333d2b36SAndroid Build Coastguard Worker expectNoLink("libx", "shared_apex10000", "libz", "shared_1") 2074*333d2b36SAndroid Build Coastguard Worker expectNoLink("libx", "shared_apex10000", "libz", "shared_2") 2075*333d2b36SAndroid Build Coastguard Worker expectNoLink("libx", "shared_apex10000", "libz", "shared") 2076*333d2b36SAndroid Build Coastguard Worker} 2077*333d2b36SAndroid Build Coastguard Worker 2078*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_InVendorApex(t *testing.T) { 2079*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2080*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 2081*333d2b36SAndroid Build Coastguard Worker apex { 2082*333d2b36SAndroid Build Coastguard Worker name: "myapex", 2083*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2084*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 2085*333d2b36SAndroid Build Coastguard Worker updatable: true, 2086*333d2b36SAndroid Build Coastguard Worker vendor: true, 2087*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2088*333d2b36SAndroid Build Coastguard Worker } 2089*333d2b36SAndroid Build Coastguard Worker 2090*333d2b36SAndroid Build Coastguard Worker apex_key { 2091*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 2092*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 2093*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 2094*333d2b36SAndroid Build Coastguard Worker } 2095*333d2b36SAndroid Build Coastguard Worker 2096*333d2b36SAndroid Build Coastguard Worker cc_library { 2097*333d2b36SAndroid Build Coastguard Worker name: "mylib", 2098*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 2099*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 2100*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2101*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbar"], 2102*333d2b36SAndroid Build Coastguard Worker } 2103*333d2b36SAndroid Build Coastguard Worker 2104*333d2b36SAndroid Build Coastguard Worker cc_library { 2105*333d2b36SAndroid Build Coastguard Worker name: "libbar", 2106*333d2b36SAndroid Build Coastguard Worker stubs: { versions: ["29", "30"] }, 2107*333d2b36SAndroid Build Coastguard Worker llndk: { symbol_file: "libbar.map.txt" }, 2108*333d2b36SAndroid Build Coastguard Worker } 2109*333d2b36SAndroid Build Coastguard Worker `) 2110*333d2b36SAndroid Build Coastguard Worker 2111*333d2b36SAndroid Build Coastguard Worker vendorVariant := "android_vendor_arm64_armv8-a" 2112*333d2b36SAndroid Build Coastguard Worker 2113*333d2b36SAndroid Build Coastguard Worker mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29") 2114*333d2b36SAndroid Build Coastguard Worker 2115*333d2b36SAndroid Build Coastguard Worker // Ensure that mylib links with "current" LLNDK 2116*333d2b36SAndroid Build Coastguard Worker libFlags := names(mylib.Rule("ld").Args["libFlags"]) 2117*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so") 2118*333d2b36SAndroid Build Coastguard Worker 2119*333d2b36SAndroid Build Coastguard Worker // Ensure that mylib is targeting 29 2120*333d2b36SAndroid Build Coastguard Worker ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o") 2121*333d2b36SAndroid Build Coastguard Worker ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29") 2122*333d2b36SAndroid Build Coastguard Worker 2123*333d2b36SAndroid Build Coastguard Worker // Ensure that the correct variant of crtbegin_so is used. 2124*333d2b36SAndroid Build Coastguard Worker crtBegin := mylib.Rule("ld").Args["crtBegin"] 2125*333d2b36SAndroid Build Coastguard Worker ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o") 2126*333d2b36SAndroid Build Coastguard Worker 2127*333d2b36SAndroid Build Coastguard Worker // Ensure that the crtbegin_so used by the APEX is targeting 29 2128*333d2b36SAndroid Build Coastguard Worker cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"] 2129*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29") 2130*333d2b36SAndroid Build Coastguard Worker} 2131*333d2b36SAndroid Build Coastguard Worker 2132*333d2b36SAndroid Build Coastguard Workerfunc TestTrackAllowedDeps(t *testing.T) { 2133*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2134*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 2135*333d2b36SAndroid Build Coastguard Worker apex { 2136*333d2b36SAndroid Build Coastguard Worker name: "myapex", 2137*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2138*333d2b36SAndroid Build Coastguard Worker updatable: true, 2139*333d2b36SAndroid Build Coastguard Worker native_shared_libs: [ 2140*333d2b36SAndroid Build Coastguard Worker "mylib", 2141*333d2b36SAndroid Build Coastguard Worker "yourlib", 2142*333d2b36SAndroid Build Coastguard Worker ], 2143*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2144*333d2b36SAndroid Build Coastguard Worker } 2145*333d2b36SAndroid Build Coastguard Worker 2146*333d2b36SAndroid Build Coastguard Worker apex { 2147*333d2b36SAndroid Build Coastguard Worker name: "myapex2", 2148*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2149*333d2b36SAndroid Build Coastguard Worker updatable: false, 2150*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["yourlib"], 2151*333d2b36SAndroid Build Coastguard Worker } 2152*333d2b36SAndroid Build Coastguard Worker 2153*333d2b36SAndroid Build Coastguard Worker apex_key { 2154*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 2155*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 2156*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 2157*333d2b36SAndroid Build Coastguard Worker } 2158*333d2b36SAndroid Build Coastguard Worker 2159*333d2b36SAndroid Build Coastguard Worker cc_library { 2160*333d2b36SAndroid Build Coastguard Worker name: "mylib", 2161*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 2162*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbar"], 2163*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2164*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 2165*333d2b36SAndroid Build Coastguard Worker } 2166*333d2b36SAndroid Build Coastguard Worker 2167*333d2b36SAndroid Build Coastguard Worker cc_library { 2168*333d2b36SAndroid Build Coastguard Worker name: "libbar", 2169*333d2b36SAndroid Build Coastguard Worker stubs: { versions: ["29", "30"] }, 2170*333d2b36SAndroid Build Coastguard Worker } 2171*333d2b36SAndroid Build Coastguard Worker 2172*333d2b36SAndroid Build Coastguard Worker cc_library { 2173*333d2b36SAndroid Build Coastguard Worker name: "yourlib", 2174*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 2175*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2176*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex", "myapex2", "//apex_available:platform"], 2177*333d2b36SAndroid Build Coastguard Worker } 2178*333d2b36SAndroid Build Coastguard Worker `, withFiles(android.MockFS{ 2179*333d2b36SAndroid Build Coastguard Worker "packages/modules/common/build/allowed_deps.txt": nil, 2180*333d2b36SAndroid Build Coastguard Worker })) 2181*333d2b36SAndroid Build Coastguard Worker 2182*333d2b36SAndroid Build Coastguard Worker depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton") 2183*333d2b36SAndroid Build Coastguard Worker inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings() 2184*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs, 2185*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt") 2186*333d2b36SAndroid Build Coastguard Worker android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs, 2187*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt") 2188*333d2b36SAndroid Build Coastguard Worker 2189*333d2b36SAndroid Build Coastguard Worker myapex := ctx.ModuleForTests("myapex", "android_common_myapex") 2190*333d2b36SAndroid Build Coastguard Worker flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx, 2191*333d2b36SAndroid Build Coastguard Worker myapex.Output("depsinfo/flatlist.txt")), "\n") 2192*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep", 2193*333d2b36SAndroid Build Coastguard Worker flatlist, "libbar(minSdkVersion:(no version)) (external)") 2194*333d2b36SAndroid Build Coastguard Worker android.AssertStringListDoesNotContain(t, "do not track if not available for platform", 2195*333d2b36SAndroid Build Coastguard Worker flatlist, "mylib:(minSdkVersion:29)") 2196*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "track platform-available lib", 2197*333d2b36SAndroid Build Coastguard Worker flatlist, "yourlib(minSdkVersion:29)") 2198*333d2b36SAndroid Build Coastguard Worker} 2199*333d2b36SAndroid Build Coastguard Worker 2200*333d2b36SAndroid Build Coastguard Workerfunc TestTrackCustomAllowedDepsInvalidDefaultTxt(t *testing.T) { 2201*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2202*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 2203*333d2b36SAndroid Build Coastguard Worker apex { 2204*333d2b36SAndroid Build Coastguard Worker name: "myapex", 2205*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2206*333d2b36SAndroid Build Coastguard Worker updatable: true, 2207*333d2b36SAndroid Build Coastguard Worker native_shared_libs: [ 2208*333d2b36SAndroid Build Coastguard Worker "mylib", 2209*333d2b36SAndroid Build Coastguard Worker "yourlib", 2210*333d2b36SAndroid Build Coastguard Worker ], 2211*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2212*333d2b36SAndroid Build Coastguard Worker } 2213*333d2b36SAndroid Build Coastguard Worker 2214*333d2b36SAndroid Build Coastguard Worker apex { 2215*333d2b36SAndroid Build Coastguard Worker name: "myapex2", 2216*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2217*333d2b36SAndroid Build Coastguard Worker updatable: false, 2218*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["yourlib"], 2219*333d2b36SAndroid Build Coastguard Worker } 2220*333d2b36SAndroid Build Coastguard Worker 2221*333d2b36SAndroid Build Coastguard Worker apex_key { 2222*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 2223*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 2224*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 2225*333d2b36SAndroid Build Coastguard Worker } 2226*333d2b36SAndroid Build Coastguard Worker 2227*333d2b36SAndroid Build Coastguard Worker cc_library { 2228*333d2b36SAndroid Build Coastguard Worker name: "mylib", 2229*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 2230*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbar"], 2231*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2232*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 2233*333d2b36SAndroid Build Coastguard Worker } 2234*333d2b36SAndroid Build Coastguard Worker 2235*333d2b36SAndroid Build Coastguard Worker cc_library { 2236*333d2b36SAndroid Build Coastguard Worker name: "libbar", 2237*333d2b36SAndroid Build Coastguard Worker stubs: { versions: ["29", "30"] }, 2238*333d2b36SAndroid Build Coastguard Worker } 2239*333d2b36SAndroid Build Coastguard Worker 2240*333d2b36SAndroid Build Coastguard Worker cc_library { 2241*333d2b36SAndroid Build Coastguard Worker name: "yourlib", 2242*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 2243*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2244*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex", "myapex2", "//apex_available:platform"], 2245*333d2b36SAndroid Build Coastguard Worker } 2246*333d2b36SAndroid Build Coastguard Worker `, withFiles(android.MockFS{ 2247*333d2b36SAndroid Build Coastguard Worker "packages/modules/common/build/custom_allowed_deps.txt": nil, 2248*333d2b36SAndroid Build Coastguard Worker }), 2249*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables( 2250*333d2b36SAndroid Build Coastguard Worker func(variables android.FixtureProductVariables) { 2251*333d2b36SAndroid Build Coastguard Worker variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt") 2252*333d2b36SAndroid Build Coastguard Worker }, 2253*333d2b36SAndroid Build Coastguard Worker )) 2254*333d2b36SAndroid Build Coastguard Worker 2255*333d2b36SAndroid Build Coastguard Worker depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton") 2256*333d2b36SAndroid Build Coastguard Worker inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings() 2257*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs, 2258*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt") 2259*333d2b36SAndroid Build Coastguard Worker android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs, 2260*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt") 2261*333d2b36SAndroid Build Coastguard Worker 2262*333d2b36SAndroid Build Coastguard Worker myapex := ctx.ModuleForTests("myapex", "android_common_myapex") 2263*333d2b36SAndroid Build Coastguard Worker flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx, 2264*333d2b36SAndroid Build Coastguard Worker myapex.Output("depsinfo/flatlist.txt")), "\n") 2265*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep", 2266*333d2b36SAndroid Build Coastguard Worker flatlist, "libbar(minSdkVersion:(no version)) (external)") 2267*333d2b36SAndroid Build Coastguard Worker android.AssertStringListDoesNotContain(t, "do not track if not available for platform", 2268*333d2b36SAndroid Build Coastguard Worker flatlist, "mylib:(minSdkVersion:29)") 2269*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "track platform-available lib", 2270*333d2b36SAndroid Build Coastguard Worker flatlist, "yourlib(minSdkVersion:29)") 2271*333d2b36SAndroid Build Coastguard Worker} 2272*333d2b36SAndroid Build Coastguard Worker 2273*333d2b36SAndroid Build Coastguard Workerfunc TestTrackCustomAllowedDepsWithDefaultTxt(t *testing.T) { 2274*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2275*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 2276*333d2b36SAndroid Build Coastguard Worker apex { 2277*333d2b36SAndroid Build Coastguard Worker name: "myapex", 2278*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2279*333d2b36SAndroid Build Coastguard Worker updatable: true, 2280*333d2b36SAndroid Build Coastguard Worker native_shared_libs: [ 2281*333d2b36SAndroid Build Coastguard Worker "mylib", 2282*333d2b36SAndroid Build Coastguard Worker "yourlib", 2283*333d2b36SAndroid Build Coastguard Worker ], 2284*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2285*333d2b36SAndroid Build Coastguard Worker } 2286*333d2b36SAndroid Build Coastguard Worker 2287*333d2b36SAndroid Build Coastguard Worker apex { 2288*333d2b36SAndroid Build Coastguard Worker name: "myapex2", 2289*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2290*333d2b36SAndroid Build Coastguard Worker updatable: false, 2291*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["yourlib"], 2292*333d2b36SAndroid Build Coastguard Worker } 2293*333d2b36SAndroid Build Coastguard Worker 2294*333d2b36SAndroid Build Coastguard Worker apex_key { 2295*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 2296*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 2297*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 2298*333d2b36SAndroid Build Coastguard Worker } 2299*333d2b36SAndroid Build Coastguard Worker 2300*333d2b36SAndroid Build Coastguard Worker cc_library { 2301*333d2b36SAndroid Build Coastguard Worker name: "mylib", 2302*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 2303*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbar"], 2304*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2305*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 2306*333d2b36SAndroid Build Coastguard Worker } 2307*333d2b36SAndroid Build Coastguard Worker 2308*333d2b36SAndroid Build Coastguard Worker cc_library { 2309*333d2b36SAndroid Build Coastguard Worker name: "libbar", 2310*333d2b36SAndroid Build Coastguard Worker stubs: { versions: ["29", "30"] }, 2311*333d2b36SAndroid Build Coastguard Worker } 2312*333d2b36SAndroid Build Coastguard Worker 2313*333d2b36SAndroid Build Coastguard Worker cc_library { 2314*333d2b36SAndroid Build Coastguard Worker name: "yourlib", 2315*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 2316*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2317*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex", "myapex2", "//apex_available:platform"], 2318*333d2b36SAndroid Build Coastguard Worker } 2319*333d2b36SAndroid Build Coastguard Worker `, withFiles(android.MockFS{ 2320*333d2b36SAndroid Build Coastguard Worker "packages/modules/common/build/custom_allowed_deps.txt": nil, 2321*333d2b36SAndroid Build Coastguard Worker "packages/modules/common/build/allowed_deps.txt": nil, 2322*333d2b36SAndroid Build Coastguard Worker }), 2323*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables( 2324*333d2b36SAndroid Build Coastguard Worker func(variables android.FixtureProductVariables) { 2325*333d2b36SAndroid Build Coastguard Worker variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt") 2326*333d2b36SAndroid Build Coastguard Worker }, 2327*333d2b36SAndroid Build Coastguard Worker )) 2328*333d2b36SAndroid Build Coastguard Worker 2329*333d2b36SAndroid Build Coastguard Worker depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton") 2330*333d2b36SAndroid Build Coastguard Worker inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings() 2331*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs, 2332*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt") 2333*333d2b36SAndroid Build Coastguard Worker android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs, 2334*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt") 2335*333d2b36SAndroid Build Coastguard Worker 2336*333d2b36SAndroid Build Coastguard Worker myapex := ctx.ModuleForTests("myapex", "android_common_myapex") 2337*333d2b36SAndroid Build Coastguard Worker flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx, 2338*333d2b36SAndroid Build Coastguard Worker myapex.Output("depsinfo/flatlist.txt")), "\n") 2339*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep", 2340*333d2b36SAndroid Build Coastguard Worker flatlist, "libbar(minSdkVersion:(no version)) (external)") 2341*333d2b36SAndroid Build Coastguard Worker android.AssertStringListDoesNotContain(t, "do not track if not available for platform", 2342*333d2b36SAndroid Build Coastguard Worker flatlist, "mylib:(minSdkVersion:29)") 2343*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "track platform-available lib", 2344*333d2b36SAndroid Build Coastguard Worker flatlist, "yourlib(minSdkVersion:29)") 2345*333d2b36SAndroid Build Coastguard Worker} 2346*333d2b36SAndroid Build Coastguard Worker 2347*333d2b36SAndroid Build Coastguard Workerfunc TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) { 2348*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2349*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 2350*333d2b36SAndroid Build Coastguard Worker apex { 2351*333d2b36SAndroid Build Coastguard Worker name: "myapex", 2352*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2353*333d2b36SAndroid Build Coastguard Worker updatable: true, 2354*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2355*333d2b36SAndroid Build Coastguard Worker } 2356*333d2b36SAndroid Build Coastguard Worker 2357*333d2b36SAndroid Build Coastguard Worker apex_key { 2358*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 2359*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 2360*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 2361*333d2b36SAndroid Build Coastguard Worker } 2362*333d2b36SAndroid Build Coastguard Worker `) 2363*333d2b36SAndroid Build Coastguard Worker depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton") 2364*333d2b36SAndroid Build Coastguard Worker if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output { 2365*333d2b36SAndroid Build Coastguard Worker t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist") 2366*333d2b36SAndroid Build Coastguard Worker } 2367*333d2b36SAndroid Build Coastguard Worker} 2368*333d2b36SAndroid Build Coastguard Worker 2369*333d2b36SAndroid Build Coastguard Workerfunc TestPlatformUsesLatestStubsFromApexes(t *testing.T) { 2370*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2371*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 2372*333d2b36SAndroid Build Coastguard Worker apex { 2373*333d2b36SAndroid Build Coastguard Worker name: "myapex", 2374*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2375*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libx"], 2376*333d2b36SAndroid Build Coastguard Worker updatable: false, 2377*333d2b36SAndroid Build Coastguard Worker } 2378*333d2b36SAndroid Build Coastguard Worker 2379*333d2b36SAndroid Build Coastguard Worker apex_key { 2380*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 2381*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 2382*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 2383*333d2b36SAndroid Build Coastguard Worker } 2384*333d2b36SAndroid Build Coastguard Worker 2385*333d2b36SAndroid Build Coastguard Worker cc_library { 2386*333d2b36SAndroid Build Coastguard Worker name: "libx", 2387*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 2388*333d2b36SAndroid Build Coastguard Worker stl: "none", 2389*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 2390*333d2b36SAndroid Build Coastguard Worker stubs: { 2391*333d2b36SAndroid Build Coastguard Worker versions: ["1", "2"], 2392*333d2b36SAndroid Build Coastguard Worker }, 2393*333d2b36SAndroid Build Coastguard Worker } 2394*333d2b36SAndroid Build Coastguard Worker 2395*333d2b36SAndroid Build Coastguard Worker cc_library { 2396*333d2b36SAndroid Build Coastguard Worker name: "libz", 2397*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libx"], 2398*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 2399*333d2b36SAndroid Build Coastguard Worker stl: "none", 2400*333d2b36SAndroid Build Coastguard Worker } 2401*333d2b36SAndroid Build Coastguard Worker `) 2402*333d2b36SAndroid Build Coastguard Worker 2403*333d2b36SAndroid Build Coastguard Worker expectLink := func(from, from_variant, to, to_variant string) { 2404*333d2b36SAndroid Build Coastguard Worker t.Helper() 2405*333d2b36SAndroid Build Coastguard Worker ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"] 2406*333d2b36SAndroid Build Coastguard Worker ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so") 2407*333d2b36SAndroid Build Coastguard Worker } 2408*333d2b36SAndroid Build Coastguard Worker expectNoLink := func(from, from_variant, to, to_variant string) { 2409*333d2b36SAndroid Build Coastguard Worker t.Helper() 2410*333d2b36SAndroid Build Coastguard Worker ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"] 2411*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so") 2412*333d2b36SAndroid Build Coastguard Worker } 2413*333d2b36SAndroid Build Coastguard Worker expectLink("libz", "shared", "libx", "shared_current") 2414*333d2b36SAndroid Build Coastguard Worker expectNoLink("libz", "shared", "libx", "shared_2") 2415*333d2b36SAndroid Build Coastguard Worker expectNoLink("libz", "shared", "libz", "shared_1") 2416*333d2b36SAndroid Build Coastguard Worker expectNoLink("libz", "shared", "libz", "shared") 2417*333d2b36SAndroid Build Coastguard Worker} 2418*333d2b36SAndroid Build Coastguard Worker 2419*333d2b36SAndroid Build Coastguard Workervar prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables( 2420*333d2b36SAndroid Build Coastguard Worker func(variables android.FixtureProductVariables) { 2421*333d2b36SAndroid Build Coastguard Worker variables.SanitizeDevice = []string{"hwaddress"} 2422*333d2b36SAndroid Build Coastguard Worker }, 2423*333d2b36SAndroid Build Coastguard Worker) 2424*333d2b36SAndroid Build Coastguard Worker 2425*333d2b36SAndroid Build Coastguard Workerfunc TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) { 2426*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2427*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 2428*333d2b36SAndroid Build Coastguard Worker apex { 2429*333d2b36SAndroid Build Coastguard Worker name: "myapex", 2430*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2431*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libx"], 2432*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2433*333d2b36SAndroid Build Coastguard Worker } 2434*333d2b36SAndroid Build Coastguard Worker 2435*333d2b36SAndroid Build Coastguard Worker apex_key { 2436*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 2437*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 2438*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 2439*333d2b36SAndroid Build Coastguard Worker } 2440*333d2b36SAndroid Build Coastguard Worker 2441*333d2b36SAndroid Build Coastguard Worker cc_library { 2442*333d2b36SAndroid Build Coastguard Worker name: "libx", 2443*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbar"], 2444*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 2445*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2446*333d2b36SAndroid Build Coastguard Worker } 2447*333d2b36SAndroid Build Coastguard Worker 2448*333d2b36SAndroid Build Coastguard Worker cc_library { 2449*333d2b36SAndroid Build Coastguard Worker name: "libbar", 2450*333d2b36SAndroid Build Coastguard Worker stubs: { 2451*333d2b36SAndroid Build Coastguard Worker versions: ["29", "30"], 2452*333d2b36SAndroid Build Coastguard Worker }, 2453*333d2b36SAndroid Build Coastguard Worker } 2454*333d2b36SAndroid Build Coastguard Worker `, 2455*333d2b36SAndroid Build Coastguard Worker prepareForTestWithSantitizeHwaddress, 2456*333d2b36SAndroid Build Coastguard Worker ) 2457*333d2b36SAndroid Build Coastguard Worker expectLink := func(from, from_variant, to, to_variant string) { 2458*333d2b36SAndroid Build Coastguard Worker ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld") 2459*333d2b36SAndroid Build Coastguard Worker libFlags := ld.Args["libFlags"] 2460*333d2b36SAndroid Build Coastguard Worker ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so") 2461*333d2b36SAndroid Build Coastguard Worker } 2462*333d2b36SAndroid Build Coastguard Worker expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current") 2463*333d2b36SAndroid Build Coastguard Worker} 2464*333d2b36SAndroid Build Coastguard Worker 2465*333d2b36SAndroid Build Coastguard Workerfunc TestQTargetApexUsesStaticUnwinder(t *testing.T) { 2466*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2467*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 2468*333d2b36SAndroid Build Coastguard Worker apex { 2469*333d2b36SAndroid Build Coastguard Worker name: "myapex", 2470*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2471*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libx"], 2472*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2473*333d2b36SAndroid Build Coastguard Worker } 2474*333d2b36SAndroid Build Coastguard Worker 2475*333d2b36SAndroid Build Coastguard Worker apex_key { 2476*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 2477*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 2478*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 2479*333d2b36SAndroid Build Coastguard Worker } 2480*333d2b36SAndroid Build Coastguard Worker 2481*333d2b36SAndroid Build Coastguard Worker cc_library { 2482*333d2b36SAndroid Build Coastguard Worker name: "libx", 2483*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 2484*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2485*333d2b36SAndroid Build Coastguard Worker } 2486*333d2b36SAndroid Build Coastguard Worker `) 2487*333d2b36SAndroid Build Coastguard Worker 2488*333d2b36SAndroid Build Coastguard Worker // ensure apex variant of c++ is linked with static unwinder 2489*333d2b36SAndroid Build Coastguard Worker cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module) 2490*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind") 2491*333d2b36SAndroid Build Coastguard Worker // note that platform variant is not. 2492*333d2b36SAndroid Build Coastguard Worker cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module) 2493*333d2b36SAndroid Build Coastguard Worker ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind") 2494*333d2b36SAndroid Build Coastguard Worker} 2495*333d2b36SAndroid Build Coastguard Worker 2496*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) { 2497*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2498*333d2b36SAndroid Build Coastguard Worker testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, ` 2499*333d2b36SAndroid Build Coastguard Worker apex { 2500*333d2b36SAndroid Build Coastguard Worker name: "myapex", 2501*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2502*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 2503*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2504*333d2b36SAndroid Build Coastguard Worker } 2505*333d2b36SAndroid Build Coastguard Worker 2506*333d2b36SAndroid Build Coastguard Worker apex_key { 2507*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 2508*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 2509*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 2510*333d2b36SAndroid Build Coastguard Worker } 2511*333d2b36SAndroid Build Coastguard Worker 2512*333d2b36SAndroid Build Coastguard Worker cc_library { 2513*333d2b36SAndroid Build Coastguard Worker name: "mylib", 2514*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 2515*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 2516*333d2b36SAndroid Build Coastguard Worker stl: "none", 2517*333d2b36SAndroid Build Coastguard Worker apex_available: [ 2518*333d2b36SAndroid Build Coastguard Worker "myapex", 2519*333d2b36SAndroid Build Coastguard Worker ], 2520*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "30", 2521*333d2b36SAndroid Build Coastguard Worker } 2522*333d2b36SAndroid Build Coastguard Worker `) 2523*333d2b36SAndroid Build Coastguard Worker 2524*333d2b36SAndroid Build Coastguard Worker testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, ` 2525*333d2b36SAndroid Build Coastguard Worker apex { 2526*333d2b36SAndroid Build Coastguard Worker name: "myapex", 2527*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2528*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo.ffi"], 2529*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2530*333d2b36SAndroid Build Coastguard Worker } 2531*333d2b36SAndroid Build Coastguard Worker 2532*333d2b36SAndroid Build Coastguard Worker apex_key { 2533*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 2534*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 2535*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 2536*333d2b36SAndroid Build Coastguard Worker } 2537*333d2b36SAndroid Build Coastguard Worker 2538*333d2b36SAndroid Build Coastguard Worker rust_ffi_shared { 2539*333d2b36SAndroid Build Coastguard Worker name: "libfoo.ffi", 2540*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 2541*333d2b36SAndroid Build Coastguard Worker crate_name: "foo", 2542*333d2b36SAndroid Build Coastguard Worker apex_available: [ 2543*333d2b36SAndroid Build Coastguard Worker "myapex", 2544*333d2b36SAndroid Build Coastguard Worker ], 2545*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "30", 2546*333d2b36SAndroid Build Coastguard Worker } 2547*333d2b36SAndroid Build Coastguard Worker `) 2548*333d2b36SAndroid Build Coastguard Worker 2549*333d2b36SAndroid Build Coastguard Worker testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, ` 2550*333d2b36SAndroid Build Coastguard Worker apex { 2551*333d2b36SAndroid Build Coastguard Worker name: "myapex", 2552*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2553*333d2b36SAndroid Build Coastguard Worker java_libs: ["libfoo"], 2554*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2555*333d2b36SAndroid Build Coastguard Worker } 2556*333d2b36SAndroid Build Coastguard Worker 2557*333d2b36SAndroid Build Coastguard Worker apex_key { 2558*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 2559*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 2560*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 2561*333d2b36SAndroid Build Coastguard Worker } 2562*333d2b36SAndroid Build Coastguard Worker 2563*333d2b36SAndroid Build Coastguard Worker java_import { 2564*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 2565*333d2b36SAndroid Build Coastguard Worker jars: ["libfoo.jar"], 2566*333d2b36SAndroid Build Coastguard Worker apex_available: [ 2567*333d2b36SAndroid Build Coastguard Worker "myapex", 2568*333d2b36SAndroid Build Coastguard Worker ], 2569*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "30", 2570*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 2571*333d2b36SAndroid Build Coastguard Worker } 2572*333d2b36SAndroid Build Coastguard Worker `) 2573*333d2b36SAndroid Build Coastguard Worker 2574*333d2b36SAndroid Build Coastguard Worker // Skip check for modules compiling against core API surface 2575*333d2b36SAndroid Build Coastguard Worker testApex(t, ` 2576*333d2b36SAndroid Build Coastguard Worker apex { 2577*333d2b36SAndroid Build Coastguard Worker name: "myapex", 2578*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2579*333d2b36SAndroid Build Coastguard Worker java_libs: ["libfoo"], 2580*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2581*333d2b36SAndroid Build Coastguard Worker } 2582*333d2b36SAndroid Build Coastguard Worker 2583*333d2b36SAndroid Build Coastguard Worker apex_key { 2584*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 2585*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 2586*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 2587*333d2b36SAndroid Build Coastguard Worker } 2588*333d2b36SAndroid Build Coastguard Worker 2589*333d2b36SAndroid Build Coastguard Worker java_library { 2590*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 2591*333d2b36SAndroid Build Coastguard Worker srcs: ["Foo.java"], 2592*333d2b36SAndroid Build Coastguard Worker apex_available: [ 2593*333d2b36SAndroid Build Coastguard Worker "myapex", 2594*333d2b36SAndroid Build Coastguard Worker ], 2595*333d2b36SAndroid Build Coastguard Worker // Compile against core API surface 2596*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_current", 2597*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "30", 2598*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 2599*333d2b36SAndroid Build Coastguard Worker } 2600*333d2b36SAndroid Build Coastguard Worker `) 2601*333d2b36SAndroid Build Coastguard Worker 2602*333d2b36SAndroid Build Coastguard Worker} 2603*333d2b36SAndroid Build Coastguard Worker 2604*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_Okay(t *testing.T) { 2605*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2606*333d2b36SAndroid Build Coastguard Worker testApex(t, ` 2607*333d2b36SAndroid Build Coastguard Worker apex { 2608*333d2b36SAndroid Build Coastguard Worker name: "myapex", 2609*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2610*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 2611*333d2b36SAndroid Build Coastguard Worker java_libs: ["libbar"], 2612*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2613*333d2b36SAndroid Build Coastguard Worker } 2614*333d2b36SAndroid Build Coastguard Worker 2615*333d2b36SAndroid Build Coastguard Worker apex_key { 2616*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 2617*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 2618*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 2619*333d2b36SAndroid Build Coastguard Worker } 2620*333d2b36SAndroid Build Coastguard Worker 2621*333d2b36SAndroid Build Coastguard Worker cc_library { 2622*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 2623*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 2624*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libfoo_dep"], 2625*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 2626*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2627*333d2b36SAndroid Build Coastguard Worker } 2628*333d2b36SAndroid Build Coastguard Worker 2629*333d2b36SAndroid Build Coastguard Worker cc_library { 2630*333d2b36SAndroid Build Coastguard Worker name: "libfoo_dep", 2631*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 2632*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 2633*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2634*333d2b36SAndroid Build Coastguard Worker } 2635*333d2b36SAndroid Build Coastguard Worker 2636*333d2b36SAndroid Build Coastguard Worker java_library { 2637*333d2b36SAndroid Build Coastguard Worker name: "libbar", 2638*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2639*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2640*333d2b36SAndroid Build Coastguard Worker static_libs: [ 2641*333d2b36SAndroid Build Coastguard Worker "libbar_dep", 2642*333d2b36SAndroid Build Coastguard Worker "libbar_import_dep", 2643*333d2b36SAndroid Build Coastguard Worker ], 2644*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 2645*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2646*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 2647*333d2b36SAndroid Build Coastguard Worker } 2648*333d2b36SAndroid Build Coastguard Worker 2649*333d2b36SAndroid Build Coastguard Worker java_library { 2650*333d2b36SAndroid Build Coastguard Worker name: "libbar_dep", 2651*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2652*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2653*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 2654*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2655*333d2b36SAndroid Build Coastguard Worker } 2656*333d2b36SAndroid Build Coastguard Worker 2657*333d2b36SAndroid Build Coastguard Worker java_import { 2658*333d2b36SAndroid Build Coastguard Worker name: "libbar_import_dep", 2659*333d2b36SAndroid Build Coastguard Worker jars: ["libbar.jar"], 2660*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 2661*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2662*333d2b36SAndroid Build Coastguard Worker } 2663*333d2b36SAndroid Build Coastguard Worker `) 2664*333d2b36SAndroid Build Coastguard Worker} 2665*333d2b36SAndroid Build Coastguard Worker 2666*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_MinApiForArch(t *testing.T) { 2667*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2668*333d2b36SAndroid Build Coastguard Worker // Tests that an apex dependency with min_sdk_version higher than the 2669*333d2b36SAndroid Build Coastguard Worker // min_sdk_version of the apex is allowed as long as the dependency's 2670*333d2b36SAndroid Build Coastguard Worker // min_sdk_version is less than or equal to the api level that the 2671*333d2b36SAndroid Build Coastguard Worker // architecture was introduced in. In this case, arm64 didn't exist 2672*333d2b36SAndroid Build Coastguard Worker // until api level 21, so the arm64 code will never need to run on 2673*333d2b36SAndroid Build Coastguard Worker // an api level 20 device, even if other architectures of the apex 2674*333d2b36SAndroid Build Coastguard Worker // will. 2675*333d2b36SAndroid Build Coastguard Worker testApex(t, ` 2676*333d2b36SAndroid Build Coastguard Worker apex { 2677*333d2b36SAndroid Build Coastguard Worker name: "myapex", 2678*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2679*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 2680*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "20", 2681*333d2b36SAndroid Build Coastguard Worker } 2682*333d2b36SAndroid Build Coastguard Worker 2683*333d2b36SAndroid Build Coastguard Worker apex_key { 2684*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 2685*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 2686*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 2687*333d2b36SAndroid Build Coastguard Worker } 2688*333d2b36SAndroid Build Coastguard Worker 2689*333d2b36SAndroid Build Coastguard Worker cc_library { 2690*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 2691*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 2692*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 2693*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "21", 2694*333d2b36SAndroid Build Coastguard Worker stl: "none", 2695*333d2b36SAndroid Build Coastguard Worker } 2696*333d2b36SAndroid Build Coastguard Worker `) 2697*333d2b36SAndroid Build Coastguard Worker} 2698*333d2b36SAndroid Build Coastguard Worker 2699*333d2b36SAndroid Build Coastguard Workerfunc TestJavaStableSdkVersion(t *testing.T) { 2700*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2701*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 2702*333d2b36SAndroid Build Coastguard Worker name string 2703*333d2b36SAndroid Build Coastguard Worker expectedError string 2704*333d2b36SAndroid Build Coastguard Worker bp string 2705*333d2b36SAndroid Build Coastguard Worker preparer android.FixturePreparer 2706*333d2b36SAndroid Build Coastguard Worker }{ 2707*333d2b36SAndroid Build Coastguard Worker { 2708*333d2b36SAndroid Build Coastguard Worker name: "Non-updatable apex with non-stable dep", 2709*333d2b36SAndroid Build Coastguard Worker bp: ` 2710*333d2b36SAndroid Build Coastguard Worker apex { 2711*333d2b36SAndroid Build Coastguard Worker name: "myapex", 2712*333d2b36SAndroid Build Coastguard Worker java_libs: ["myjar"], 2713*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2714*333d2b36SAndroid Build Coastguard Worker updatable: false, 2715*333d2b36SAndroid Build Coastguard Worker } 2716*333d2b36SAndroid Build Coastguard Worker apex_key { 2717*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 2718*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 2719*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 2720*333d2b36SAndroid Build Coastguard Worker } 2721*333d2b36SAndroid Build Coastguard Worker java_library { 2722*333d2b36SAndroid Build Coastguard Worker name: "myjar", 2723*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 2724*333d2b36SAndroid Build Coastguard Worker sdk_version: "test_current", 2725*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 2726*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 2727*333d2b36SAndroid Build Coastguard Worker } 2728*333d2b36SAndroid Build Coastguard Worker `, 2729*333d2b36SAndroid Build Coastguard Worker }, 2730*333d2b36SAndroid Build Coastguard Worker { 2731*333d2b36SAndroid Build Coastguard Worker name: "Updatable apex with stable dep", 2732*333d2b36SAndroid Build Coastguard Worker bp: ` 2733*333d2b36SAndroid Build Coastguard Worker apex { 2734*333d2b36SAndroid Build Coastguard Worker name: "myapex", 2735*333d2b36SAndroid Build Coastguard Worker java_libs: ["myjar"], 2736*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2737*333d2b36SAndroid Build Coastguard Worker updatable: true, 2738*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2739*333d2b36SAndroid Build Coastguard Worker } 2740*333d2b36SAndroid Build Coastguard Worker apex_key { 2741*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 2742*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 2743*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 2744*333d2b36SAndroid Build Coastguard Worker } 2745*333d2b36SAndroid Build Coastguard Worker java_library { 2746*333d2b36SAndroid Build Coastguard Worker name: "myjar", 2747*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 2748*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2749*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 2750*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2751*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 2752*333d2b36SAndroid Build Coastguard Worker } 2753*333d2b36SAndroid Build Coastguard Worker `, 2754*333d2b36SAndroid Build Coastguard Worker }, 2755*333d2b36SAndroid Build Coastguard Worker { 2756*333d2b36SAndroid Build Coastguard Worker name: "Updatable apex with non-stable dep", 2757*333d2b36SAndroid Build Coastguard Worker expectedError: "cannot depend on \"myjar\"", 2758*333d2b36SAndroid Build Coastguard Worker bp: ` 2759*333d2b36SAndroid Build Coastguard Worker apex { 2760*333d2b36SAndroid Build Coastguard Worker name: "myapex", 2761*333d2b36SAndroid Build Coastguard Worker java_libs: ["myjar"], 2762*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2763*333d2b36SAndroid Build Coastguard Worker updatable: true, 2764*333d2b36SAndroid Build Coastguard Worker } 2765*333d2b36SAndroid Build Coastguard Worker apex_key { 2766*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 2767*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 2768*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 2769*333d2b36SAndroid Build Coastguard Worker } 2770*333d2b36SAndroid Build Coastguard Worker java_library { 2771*333d2b36SAndroid Build Coastguard Worker name: "myjar", 2772*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 2773*333d2b36SAndroid Build Coastguard Worker sdk_version: "test_current", 2774*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 2775*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 2776*333d2b36SAndroid Build Coastguard Worker } 2777*333d2b36SAndroid Build Coastguard Worker `, 2778*333d2b36SAndroid Build Coastguard Worker }, 2779*333d2b36SAndroid Build Coastguard Worker { 2780*333d2b36SAndroid Build Coastguard Worker name: "Updatable apex with non-stable legacy core platform dep", 2781*333d2b36SAndroid Build Coastguard Worker expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`, 2782*333d2b36SAndroid Build Coastguard Worker bp: ` 2783*333d2b36SAndroid Build Coastguard Worker apex { 2784*333d2b36SAndroid Build Coastguard Worker name: "myapex", 2785*333d2b36SAndroid Build Coastguard Worker java_libs: ["myjar-uses-legacy"], 2786*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2787*333d2b36SAndroid Build Coastguard Worker updatable: true, 2788*333d2b36SAndroid Build Coastguard Worker } 2789*333d2b36SAndroid Build Coastguard Worker apex_key { 2790*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 2791*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 2792*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 2793*333d2b36SAndroid Build Coastguard Worker } 2794*333d2b36SAndroid Build Coastguard Worker java_library { 2795*333d2b36SAndroid Build Coastguard Worker name: "myjar-uses-legacy", 2796*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 2797*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_platform", 2798*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 2799*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 2800*333d2b36SAndroid Build Coastguard Worker } 2801*333d2b36SAndroid Build Coastguard Worker `, 2802*333d2b36SAndroid Build Coastguard Worker preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"), 2803*333d2b36SAndroid Build Coastguard Worker }, 2804*333d2b36SAndroid Build Coastguard Worker { 2805*333d2b36SAndroid Build Coastguard Worker name: "Updatable apex with non-stable transitive dep", 2806*333d2b36SAndroid Build Coastguard Worker // This is not actually detecting that the transitive dependency is unstable, rather it is 2807*333d2b36SAndroid Build Coastguard Worker // detecting that the transitive dependency is building against a wider API surface than the 2808*333d2b36SAndroid Build Coastguard Worker // module that depends on it is using. 2809*333d2b36SAndroid Build Coastguard Worker expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.", 2810*333d2b36SAndroid Build Coastguard Worker bp: ` 2811*333d2b36SAndroid Build Coastguard Worker apex { 2812*333d2b36SAndroid Build Coastguard Worker name: "myapex", 2813*333d2b36SAndroid Build Coastguard Worker java_libs: ["myjar"], 2814*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2815*333d2b36SAndroid Build Coastguard Worker updatable: true, 2816*333d2b36SAndroid Build Coastguard Worker } 2817*333d2b36SAndroid Build Coastguard Worker apex_key { 2818*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 2819*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 2820*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 2821*333d2b36SAndroid Build Coastguard Worker } 2822*333d2b36SAndroid Build Coastguard Worker java_library { 2823*333d2b36SAndroid Build Coastguard Worker name: "myjar", 2824*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 2825*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2826*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 2827*333d2b36SAndroid Build Coastguard Worker static_libs: ["transitive-jar"], 2828*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 2829*333d2b36SAndroid Build Coastguard Worker } 2830*333d2b36SAndroid Build Coastguard Worker java_library { 2831*333d2b36SAndroid Build Coastguard Worker name: "transitive-jar", 2832*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 2833*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_platform", 2834*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 2835*333d2b36SAndroid Build Coastguard Worker } 2836*333d2b36SAndroid Build Coastguard Worker `, 2837*333d2b36SAndroid Build Coastguard Worker }, 2838*333d2b36SAndroid Build Coastguard Worker } 2839*333d2b36SAndroid Build Coastguard Worker 2840*333d2b36SAndroid Build Coastguard Worker for _, test := range testCases { 2841*333d2b36SAndroid Build Coastguard Worker if test.name != "Updatable apex with non-stable legacy core platform dep" { 2842*333d2b36SAndroid Build Coastguard Worker continue 2843*333d2b36SAndroid Build Coastguard Worker } 2844*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 2845*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2846*333d2b36SAndroid Build Coastguard Worker errorHandler := android.FixtureExpectsNoErrors 2847*333d2b36SAndroid Build Coastguard Worker if test.expectedError != "" { 2848*333d2b36SAndroid Build Coastguard Worker errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError) 2849*333d2b36SAndroid Build Coastguard Worker } 2850*333d2b36SAndroid Build Coastguard Worker android.GroupFixturePreparers( 2851*333d2b36SAndroid Build Coastguard Worker java.PrepareForTestWithJavaDefaultModules, 2852*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithApexBuildComponents, 2853*333d2b36SAndroid Build Coastguard Worker prepareForTestWithMyapex, 2854*333d2b36SAndroid Build Coastguard Worker android.OptionalFixturePreparer(test.preparer), 2855*333d2b36SAndroid Build Coastguard Worker ). 2856*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(errorHandler). 2857*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, test.bp) 2858*333d2b36SAndroid Build Coastguard Worker }) 2859*333d2b36SAndroid Build Coastguard Worker } 2860*333d2b36SAndroid Build Coastguard Worker} 2861*333d2b36SAndroid Build Coastguard Worker 2862*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) { 2863*333d2b36SAndroid Build Coastguard Worker testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, ` 2864*333d2b36SAndroid Build Coastguard Worker apex { 2865*333d2b36SAndroid Build Coastguard Worker name: "myapex", 2866*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2867*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 2868*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2869*333d2b36SAndroid Build Coastguard Worker } 2870*333d2b36SAndroid Build Coastguard Worker 2871*333d2b36SAndroid Build Coastguard Worker apex_key { 2872*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 2873*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 2874*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 2875*333d2b36SAndroid Build Coastguard Worker } 2876*333d2b36SAndroid Build Coastguard Worker 2877*333d2b36SAndroid Build Coastguard Worker cc_library { 2878*333d2b36SAndroid Build Coastguard Worker name: "mylib", 2879*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 2880*333d2b36SAndroid Build Coastguard Worker shared_libs: ["mylib2"], 2881*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 2882*333d2b36SAndroid Build Coastguard Worker stl: "none", 2883*333d2b36SAndroid Build Coastguard Worker apex_available: [ 2884*333d2b36SAndroid Build Coastguard Worker "myapex", 2885*333d2b36SAndroid Build Coastguard Worker ], 2886*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2887*333d2b36SAndroid Build Coastguard Worker } 2888*333d2b36SAndroid Build Coastguard Worker 2889*333d2b36SAndroid Build Coastguard Worker // indirect part of the apex 2890*333d2b36SAndroid Build Coastguard Worker cc_library { 2891*333d2b36SAndroid Build Coastguard Worker name: "mylib2", 2892*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 2893*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 2894*333d2b36SAndroid Build Coastguard Worker stl: "none", 2895*333d2b36SAndroid Build Coastguard Worker apex_available: [ 2896*333d2b36SAndroid Build Coastguard Worker "myapex", 2897*333d2b36SAndroid Build Coastguard Worker ], 2898*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "30", 2899*333d2b36SAndroid Build Coastguard Worker } 2900*333d2b36SAndroid Build Coastguard Worker `) 2901*333d2b36SAndroid Build Coastguard Worker} 2902*333d2b36SAndroid Build Coastguard Worker 2903*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) { 2904*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2905*333d2b36SAndroid Build Coastguard Worker testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, ` 2906*333d2b36SAndroid Build Coastguard Worker apex { 2907*333d2b36SAndroid Build Coastguard Worker name: "myapex", 2908*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2909*333d2b36SAndroid Build Coastguard Worker apps: ["AppFoo"], 2910*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2911*333d2b36SAndroid Build Coastguard Worker updatable: false, 2912*333d2b36SAndroid Build Coastguard Worker } 2913*333d2b36SAndroid Build Coastguard Worker 2914*333d2b36SAndroid Build Coastguard Worker apex_key { 2915*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 2916*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 2917*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 2918*333d2b36SAndroid Build Coastguard Worker } 2919*333d2b36SAndroid Build Coastguard Worker 2920*333d2b36SAndroid Build Coastguard Worker android_app { 2921*333d2b36SAndroid Build Coastguard Worker name: "AppFoo", 2922*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 2923*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2924*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2925*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 2926*333d2b36SAndroid Build Coastguard Worker stl: "none", 2927*333d2b36SAndroid Build Coastguard Worker static_libs: ["bar"], 2928*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 2929*333d2b36SAndroid Build Coastguard Worker } 2930*333d2b36SAndroid Build Coastguard Worker 2931*333d2b36SAndroid Build Coastguard Worker java_library { 2932*333d2b36SAndroid Build Coastguard Worker name: "bar", 2933*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 2934*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2935*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 2936*333d2b36SAndroid Build Coastguard Worker } 2937*333d2b36SAndroid Build Coastguard Worker `) 2938*333d2b36SAndroid Build Coastguard Worker} 2939*333d2b36SAndroid Build Coastguard Worker 2940*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) { 2941*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2942*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 2943*333d2b36SAndroid Build Coastguard Worker apex { 2944*333d2b36SAndroid Build Coastguard Worker name: "myapex", 2945*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2946*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 2947*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2948*333d2b36SAndroid Build Coastguard Worker } 2949*333d2b36SAndroid Build Coastguard Worker 2950*333d2b36SAndroid Build Coastguard Worker apex_key { 2951*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 2952*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 2953*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 2954*333d2b36SAndroid Build Coastguard Worker } 2955*333d2b36SAndroid Build Coastguard Worker 2956*333d2b36SAndroid Build Coastguard Worker // mylib will link to mylib2#current 2957*333d2b36SAndroid Build Coastguard Worker cc_library { 2958*333d2b36SAndroid Build Coastguard Worker name: "mylib", 2959*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 2960*333d2b36SAndroid Build Coastguard Worker shared_libs: ["mylib2"], 2961*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 2962*333d2b36SAndroid Build Coastguard Worker stl: "none", 2963*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex", "otherapex"], 2964*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 2965*333d2b36SAndroid Build Coastguard Worker } 2966*333d2b36SAndroid Build Coastguard Worker 2967*333d2b36SAndroid Build Coastguard Worker cc_library { 2968*333d2b36SAndroid Build Coastguard Worker name: "mylib2", 2969*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 2970*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 2971*333d2b36SAndroid Build Coastguard Worker stl: "none", 2972*333d2b36SAndroid Build Coastguard Worker apex_available: ["otherapex"], 2973*333d2b36SAndroid Build Coastguard Worker stubs: { versions: ["29", "30"] }, 2974*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "30", 2975*333d2b36SAndroid Build Coastguard Worker } 2976*333d2b36SAndroid Build Coastguard Worker 2977*333d2b36SAndroid Build Coastguard Worker apex { 2978*333d2b36SAndroid Build Coastguard Worker name: "otherapex", 2979*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 2980*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib", "mylib2"], 2981*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "30", 2982*333d2b36SAndroid Build Coastguard Worker } 2983*333d2b36SAndroid Build Coastguard Worker `) 2984*333d2b36SAndroid Build Coastguard Worker expectLink := func(from, from_variant, to, to_variant string) { 2985*333d2b36SAndroid Build Coastguard Worker ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld") 2986*333d2b36SAndroid Build Coastguard Worker libFlags := ld.Args["libFlags"] 2987*333d2b36SAndroid Build Coastguard Worker ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so") 2988*333d2b36SAndroid Build Coastguard Worker } 2989*333d2b36SAndroid Build Coastguard Worker expectLink("mylib", "shared_apex29", "mylib2", "shared_current") 2990*333d2b36SAndroid Build Coastguard Worker expectLink("mylib", "shared_apex30", "mylib2", "shared_current") 2991*333d2b36SAndroid Build Coastguard Worker} 2992*333d2b36SAndroid Build Coastguard Worker 2993*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) { 2994*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2995*333d2b36SAndroid Build Coastguard Worker withSAsActiveCodeNames := android.FixtureModifyProductVariables( 2996*333d2b36SAndroid Build Coastguard Worker func(variables android.FixtureProductVariables) { 2997*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_codename = proptools.StringPtr("S") 2998*333d2b36SAndroid Build Coastguard Worker variables.Platform_version_active_codenames = []string{"S"} 2999*333d2b36SAndroid Build Coastguard Worker }, 3000*333d2b36SAndroid Build Coastguard Worker ) 3001*333d2b36SAndroid Build Coastguard Worker testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, ` 3002*333d2b36SAndroid Build Coastguard Worker apex { 3003*333d2b36SAndroid Build Coastguard Worker name: "myapex", 3004*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 3005*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 3006*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "S", 3007*333d2b36SAndroid Build Coastguard Worker } 3008*333d2b36SAndroid Build Coastguard Worker apex_key { 3009*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 3010*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 3011*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 3012*333d2b36SAndroid Build Coastguard Worker } 3013*333d2b36SAndroid Build Coastguard Worker cc_library { 3014*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 3015*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbar"], 3016*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 3017*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 3018*333d2b36SAndroid Build Coastguard Worker } 3019*333d2b36SAndroid Build Coastguard Worker cc_library { 3020*333d2b36SAndroid Build Coastguard Worker name: "libbar", 3021*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 3022*333d2b36SAndroid Build Coastguard Worker } 3023*333d2b36SAndroid Build Coastguard Worker `, withSAsActiveCodeNames) 3024*333d2b36SAndroid Build Coastguard Worker} 3025*333d2b36SAndroid Build Coastguard Worker 3026*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) { 3027*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3028*333d2b36SAndroid Build Coastguard Worker withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 3029*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_codename = proptools.StringPtr("S") 3030*333d2b36SAndroid Build Coastguard Worker variables.Platform_version_active_codenames = []string{"S", "T"} 3031*333d2b36SAndroid Build Coastguard Worker }) 3032*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 3033*333d2b36SAndroid Build Coastguard Worker apex { 3034*333d2b36SAndroid Build Coastguard Worker name: "myapex", 3035*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 3036*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 3037*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "S", 3038*333d2b36SAndroid Build Coastguard Worker } 3039*333d2b36SAndroid Build Coastguard Worker apex_key { 3040*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 3041*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 3042*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 3043*333d2b36SAndroid Build Coastguard Worker } 3044*333d2b36SAndroid Build Coastguard Worker cc_library { 3045*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 3046*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbar"], 3047*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 3048*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "S", 3049*333d2b36SAndroid Build Coastguard Worker } 3050*333d2b36SAndroid Build Coastguard Worker cc_library { 3051*333d2b36SAndroid Build Coastguard Worker name: "libbar", 3052*333d2b36SAndroid Build Coastguard Worker stubs: { 3053*333d2b36SAndroid Build Coastguard Worker symbol_file: "libbar.map.txt", 3054*333d2b36SAndroid Build Coastguard Worker versions: ["30", "S", "T"], 3055*333d2b36SAndroid Build Coastguard Worker }, 3056*333d2b36SAndroid Build Coastguard Worker } 3057*333d2b36SAndroid Build Coastguard Worker `, withSAsActiveCodeNames) 3058*333d2b36SAndroid Build Coastguard Worker 3059*333d2b36SAndroid Build Coastguard Worker // ensure libfoo is linked with current version of libbar stub 3060*333d2b36SAndroid Build Coastguard Worker libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000") 3061*333d2b36SAndroid Build Coastguard Worker libFlags := libfoo.Rule("ld").Args["libFlags"] 3062*333d2b36SAndroid Build Coastguard Worker ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so") 3063*333d2b36SAndroid Build Coastguard Worker} 3064*333d2b36SAndroid Build Coastguard Worker 3065*333d2b36SAndroid Build Coastguard Workerfunc TestFilesInSubDir(t *testing.T) { 3066*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3067*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 3068*333d2b36SAndroid Build Coastguard Worker apex { 3069*333d2b36SAndroid Build Coastguard Worker name: "myapex", 3070*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 3071*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 3072*333d2b36SAndroid Build Coastguard Worker binaries: ["mybin", "mybin.rust"], 3073*333d2b36SAndroid Build Coastguard Worker prebuilts: ["myetc"], 3074*333d2b36SAndroid Build Coastguard Worker compile_multilib: "both", 3075*333d2b36SAndroid Build Coastguard Worker updatable: false, 3076*333d2b36SAndroid Build Coastguard Worker } 3077*333d2b36SAndroid Build Coastguard Worker 3078*333d2b36SAndroid Build Coastguard Worker apex_key { 3079*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 3080*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 3081*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 3082*333d2b36SAndroid Build Coastguard Worker } 3083*333d2b36SAndroid Build Coastguard Worker 3084*333d2b36SAndroid Build Coastguard Worker prebuilt_etc { 3085*333d2b36SAndroid Build Coastguard Worker name: "myetc", 3086*333d2b36SAndroid Build Coastguard Worker src: "myprebuilt", 3087*333d2b36SAndroid Build Coastguard Worker sub_dir: "foo/bar", 3088*333d2b36SAndroid Build Coastguard Worker } 3089*333d2b36SAndroid Build Coastguard Worker 3090*333d2b36SAndroid Build Coastguard Worker cc_library { 3091*333d2b36SAndroid Build Coastguard Worker name: "mylib", 3092*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 3093*333d2b36SAndroid Build Coastguard Worker relative_install_path: "foo/bar", 3094*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 3095*333d2b36SAndroid Build Coastguard Worker stl: "none", 3096*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 3097*333d2b36SAndroid Build Coastguard Worker } 3098*333d2b36SAndroid Build Coastguard Worker 3099*333d2b36SAndroid Build Coastguard Worker cc_binary { 3100*333d2b36SAndroid Build Coastguard Worker name: "mybin", 3101*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 3102*333d2b36SAndroid Build Coastguard Worker relative_install_path: "foo/bar", 3103*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 3104*333d2b36SAndroid Build Coastguard Worker stl: "none", 3105*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 3106*333d2b36SAndroid Build Coastguard Worker } 3107*333d2b36SAndroid Build Coastguard Worker 3108*333d2b36SAndroid Build Coastguard Worker rust_binary { 3109*333d2b36SAndroid Build Coastguard Worker name: "mybin.rust", 3110*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 3111*333d2b36SAndroid Build Coastguard Worker relative_install_path: "rust_subdir", 3112*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 3113*333d2b36SAndroid Build Coastguard Worker } 3114*333d2b36SAndroid Build Coastguard Worker `) 3115*333d2b36SAndroid Build Coastguard Worker 3116*333d2b36SAndroid Build Coastguard Worker generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig") 3117*333d2b36SAndroid Build Coastguard Worker cmd := generateFsRule.RuleParams.Command 3118*333d2b36SAndroid Build Coastguard Worker 3119*333d2b36SAndroid Build Coastguard Worker // Ensure that the subdirectories are all listed 3120*333d2b36SAndroid Build Coastguard Worker ensureContains(t, cmd, "/etc ") 3121*333d2b36SAndroid Build Coastguard Worker ensureContains(t, cmd, "/etc/foo ") 3122*333d2b36SAndroid Build Coastguard Worker ensureContains(t, cmd, "/etc/foo/bar ") 3123*333d2b36SAndroid Build Coastguard Worker ensureContains(t, cmd, "/lib64 ") 3124*333d2b36SAndroid Build Coastguard Worker ensureContains(t, cmd, "/lib64/foo ") 3125*333d2b36SAndroid Build Coastguard Worker ensureContains(t, cmd, "/lib64/foo/bar ") 3126*333d2b36SAndroid Build Coastguard Worker ensureContains(t, cmd, "/lib ") 3127*333d2b36SAndroid Build Coastguard Worker ensureContains(t, cmd, "/lib/foo ") 3128*333d2b36SAndroid Build Coastguard Worker ensureContains(t, cmd, "/lib/foo/bar ") 3129*333d2b36SAndroid Build Coastguard Worker ensureContains(t, cmd, "/bin ") 3130*333d2b36SAndroid Build Coastguard Worker ensureContains(t, cmd, "/bin/foo ") 3131*333d2b36SAndroid Build Coastguard Worker ensureContains(t, cmd, "/bin/foo/bar ") 3132*333d2b36SAndroid Build Coastguard Worker ensureContains(t, cmd, "/bin/rust_subdir ") 3133*333d2b36SAndroid Build Coastguard Worker} 3134*333d2b36SAndroid Build Coastguard Worker 3135*333d2b36SAndroid Build Coastguard Workerfunc TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) { 3136*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3137*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 3138*333d2b36SAndroid Build Coastguard Worker apex { 3139*333d2b36SAndroid Build Coastguard Worker name: "myapex", 3140*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 3141*333d2b36SAndroid Build Coastguard Worker multilib: { 3142*333d2b36SAndroid Build Coastguard Worker both: { 3143*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 3144*333d2b36SAndroid Build Coastguard Worker binaries: ["mybin"], 3145*333d2b36SAndroid Build Coastguard Worker }, 3146*333d2b36SAndroid Build Coastguard Worker }, 3147*333d2b36SAndroid Build Coastguard Worker compile_multilib: "both", 3148*333d2b36SAndroid Build Coastguard Worker native_bridge_supported: true, 3149*333d2b36SAndroid Build Coastguard Worker updatable: false, 3150*333d2b36SAndroid Build Coastguard Worker } 3151*333d2b36SAndroid Build Coastguard Worker 3152*333d2b36SAndroid Build Coastguard Worker apex_key { 3153*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 3154*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 3155*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 3156*333d2b36SAndroid Build Coastguard Worker } 3157*333d2b36SAndroid Build Coastguard Worker 3158*333d2b36SAndroid Build Coastguard Worker cc_library { 3159*333d2b36SAndroid Build Coastguard Worker name: "mylib", 3160*333d2b36SAndroid Build Coastguard Worker relative_install_path: "foo/bar", 3161*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 3162*333d2b36SAndroid Build Coastguard Worker stl: "none", 3163*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 3164*333d2b36SAndroid Build Coastguard Worker native_bridge_supported: true, 3165*333d2b36SAndroid Build Coastguard Worker } 3166*333d2b36SAndroid Build Coastguard Worker 3167*333d2b36SAndroid Build Coastguard Worker cc_binary { 3168*333d2b36SAndroid Build Coastguard Worker name: "mybin", 3169*333d2b36SAndroid Build Coastguard Worker relative_install_path: "foo/bar", 3170*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 3171*333d2b36SAndroid Build Coastguard Worker stl: "none", 3172*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 3173*333d2b36SAndroid Build Coastguard Worker native_bridge_supported: true, 3174*333d2b36SAndroid Build Coastguard Worker compile_multilib: "both", // default is "first" for binary 3175*333d2b36SAndroid Build Coastguard Worker multilib: { 3176*333d2b36SAndroid Build Coastguard Worker lib64: { 3177*333d2b36SAndroid Build Coastguard Worker suffix: "64", 3178*333d2b36SAndroid Build Coastguard Worker }, 3179*333d2b36SAndroid Build Coastguard Worker }, 3180*333d2b36SAndroid Build Coastguard Worker } 3181*333d2b36SAndroid Build Coastguard Worker `, android.PrepareForNativeBridgeEnabled) 3182*333d2b36SAndroid Build Coastguard Worker ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{ 3183*333d2b36SAndroid Build Coastguard Worker "bin/foo/bar/mybin", 3184*333d2b36SAndroid Build Coastguard Worker "bin/foo/bar/mybin64", 3185*333d2b36SAndroid Build Coastguard Worker "bin/arm/foo/bar/mybin", 3186*333d2b36SAndroid Build Coastguard Worker "bin/arm64/foo/bar/mybin64", 3187*333d2b36SAndroid Build Coastguard Worker "lib/foo/bar/mylib.so", 3188*333d2b36SAndroid Build Coastguard Worker "lib/arm/foo/bar/mylib.so", 3189*333d2b36SAndroid Build Coastguard Worker "lib64/foo/bar/mylib.so", 3190*333d2b36SAndroid Build Coastguard Worker "lib64/arm64/foo/bar/mylib.so", 3191*333d2b36SAndroid Build Coastguard Worker }) 3192*333d2b36SAndroid Build Coastguard Worker} 3193*333d2b36SAndroid Build Coastguard Worker 3194*333d2b36SAndroid Build Coastguard Workerfunc TestVendorApex(t *testing.T) { 3195*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3196*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 3197*333d2b36SAndroid Build Coastguard Worker prepareForApexTest, 3198*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyConfig(android.SetKatiEnabledForTests), 3199*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 3200*333d2b36SAndroid Build Coastguard Worker apex { 3201*333d2b36SAndroid Build Coastguard Worker name: "myapex", 3202*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 3203*333d2b36SAndroid Build Coastguard Worker binaries: ["mybin"], 3204*333d2b36SAndroid Build Coastguard Worker vendor: true, 3205*333d2b36SAndroid Build Coastguard Worker updatable: false, 3206*333d2b36SAndroid Build Coastguard Worker } 3207*333d2b36SAndroid Build Coastguard Worker apex_key { 3208*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 3209*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 3210*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 3211*333d2b36SAndroid Build Coastguard Worker } 3212*333d2b36SAndroid Build Coastguard Worker cc_binary { 3213*333d2b36SAndroid Build Coastguard Worker name: "mybin", 3214*333d2b36SAndroid Build Coastguard Worker vendor: true, 3215*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libfoo"], 3216*333d2b36SAndroid Build Coastguard Worker } 3217*333d2b36SAndroid Build Coastguard Worker cc_library { 3218*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 3219*333d2b36SAndroid Build Coastguard Worker proprietary: true, 3220*333d2b36SAndroid Build Coastguard Worker } 3221*333d2b36SAndroid Build Coastguard Worker `) 3222*333d2b36SAndroid Build Coastguard Worker 3223*333d2b36SAndroid Build Coastguard Worker ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{ 3224*333d2b36SAndroid Build Coastguard Worker "bin/mybin", 3225*333d2b36SAndroid Build Coastguard Worker "lib64/libfoo.so", 3226*333d2b36SAndroid Build Coastguard Worker // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX 3227*333d2b36SAndroid Build Coastguard Worker "lib64/libc++.so", 3228*333d2b36SAndroid Build Coastguard Worker }) 3229*333d2b36SAndroid Build Coastguard Worker 3230*333d2b36SAndroid Build Coastguard Worker apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) 3231*333d2b36SAndroid Build Coastguard Worker data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle) 3232*333d2b36SAndroid Build Coastguard Worker name := apexBundle.BaseModuleName() 3233*333d2b36SAndroid Build Coastguard Worker prefix := "TARGET_" 3234*333d2b36SAndroid Build Coastguard Worker var builder strings.Builder 3235*333d2b36SAndroid Build Coastguard Worker data.Custom(&builder, name, prefix, "", data) 3236*333d2b36SAndroid Build Coastguard Worker androidMk := android.StringRelativeToTop(result.Config, builder.String()) 3237*333d2b36SAndroid Build Coastguard Worker installPath := "out/target/product/test_device/vendor/apex" 3238*333d2b36SAndroid Build Coastguard Worker ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath) 3239*333d2b36SAndroid Build Coastguard Worker 3240*333d2b36SAndroid Build Coastguard Worker apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule") 3241*333d2b36SAndroid Build Coastguard Worker requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"]) 3242*333d2b36SAndroid Build Coastguard Worker ensureListNotContains(t, requireNativeLibs, ":vndk") 3243*333d2b36SAndroid Build Coastguard Worker} 3244*333d2b36SAndroid Build Coastguard Worker 3245*333d2b36SAndroid Build Coastguard Workerfunc TestProductVariant(t *testing.T) { 3246*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3247*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 3248*333d2b36SAndroid Build Coastguard Worker apex { 3249*333d2b36SAndroid Build Coastguard Worker name: "myapex", 3250*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 3251*333d2b36SAndroid Build Coastguard Worker updatable: false, 3252*333d2b36SAndroid Build Coastguard Worker product_specific: true, 3253*333d2b36SAndroid Build Coastguard Worker binaries: ["foo"], 3254*333d2b36SAndroid Build Coastguard Worker } 3255*333d2b36SAndroid Build Coastguard Worker 3256*333d2b36SAndroid Build Coastguard Worker apex_key { 3257*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 3258*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 3259*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 3260*333d2b36SAndroid Build Coastguard Worker } 3261*333d2b36SAndroid Build Coastguard Worker 3262*333d2b36SAndroid Build Coastguard Worker cc_binary { 3263*333d2b36SAndroid Build Coastguard Worker name: "foo", 3264*333d2b36SAndroid Build Coastguard Worker product_available: true, 3265*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 3266*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.cpp"], 3267*333d2b36SAndroid Build Coastguard Worker } 3268*333d2b36SAndroid Build Coastguard Worker `) 3269*333d2b36SAndroid Build Coastguard Worker 3270*333d2b36SAndroid Build Coastguard Worker cflags := strings.Fields( 3271*333d2b36SAndroid Build Coastguard Worker ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"]) 3272*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, cflags, "-D__ANDROID_VNDK__") 3273*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, cflags, "-D__ANDROID_APEX__") 3274*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__") 3275*333d2b36SAndroid Build Coastguard Worker ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__") 3276*333d2b36SAndroid Build Coastguard Worker} 3277*333d2b36SAndroid Build Coastguard Worker 3278*333d2b36SAndroid Build Coastguard Workerfunc TestApex_withPrebuiltFirmware(t *testing.T) { 3279*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3280*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 3281*333d2b36SAndroid Build Coastguard Worker name string 3282*333d2b36SAndroid Build Coastguard Worker additionalProp string 3283*333d2b36SAndroid Build Coastguard Worker }{ 3284*333d2b36SAndroid Build Coastguard Worker {"system apex with prebuilt_firmware", ""}, 3285*333d2b36SAndroid Build Coastguard Worker {"vendor apex with prebuilt_firmware", "vendor: true,"}, 3286*333d2b36SAndroid Build Coastguard Worker } 3287*333d2b36SAndroid Build Coastguard Worker for _, tc := range testCases { 3288*333d2b36SAndroid Build Coastguard Worker t.Run(tc.name, func(t *testing.T) { 3289*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3290*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 3291*333d2b36SAndroid Build Coastguard Worker apex { 3292*333d2b36SAndroid Build Coastguard Worker name: "myapex", 3293*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 3294*333d2b36SAndroid Build Coastguard Worker prebuilts: ["myfirmware"], 3295*333d2b36SAndroid Build Coastguard Worker updatable: false, 3296*333d2b36SAndroid Build Coastguard Worker `+tc.additionalProp+` 3297*333d2b36SAndroid Build Coastguard Worker } 3298*333d2b36SAndroid Build Coastguard Worker apex_key { 3299*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 3300*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 3301*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 3302*333d2b36SAndroid Build Coastguard Worker } 3303*333d2b36SAndroid Build Coastguard Worker prebuilt_firmware { 3304*333d2b36SAndroid Build Coastguard Worker name: "myfirmware", 3305*333d2b36SAndroid Build Coastguard Worker src: "myfirmware.bin", 3306*333d2b36SAndroid Build Coastguard Worker filename_from_src: true, 3307*333d2b36SAndroid Build Coastguard Worker `+tc.additionalProp+` 3308*333d2b36SAndroid Build Coastguard Worker } 3309*333d2b36SAndroid Build Coastguard Worker `) 3310*333d2b36SAndroid Build Coastguard Worker ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{ 3311*333d2b36SAndroid Build Coastguard Worker "etc/firmware/myfirmware.bin", 3312*333d2b36SAndroid Build Coastguard Worker }) 3313*333d2b36SAndroid Build Coastguard Worker }) 3314*333d2b36SAndroid Build Coastguard Worker } 3315*333d2b36SAndroid Build Coastguard Worker} 3316*333d2b36SAndroid Build Coastguard Worker 3317*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidMk_VendorApexRequired(t *testing.T) { 3318*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3319*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 3320*333d2b36SAndroid Build Coastguard Worker apex { 3321*333d2b36SAndroid Build Coastguard Worker name: "myapex", 3322*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 3323*333d2b36SAndroid Build Coastguard Worker vendor: true, 3324*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 3325*333d2b36SAndroid Build Coastguard Worker updatable: false, 3326*333d2b36SAndroid Build Coastguard Worker } 3327*333d2b36SAndroid Build Coastguard Worker 3328*333d2b36SAndroid Build Coastguard Worker apex_key { 3329*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 3330*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 3331*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 3332*333d2b36SAndroid Build Coastguard Worker } 3333*333d2b36SAndroid Build Coastguard Worker 3334*333d2b36SAndroid Build Coastguard Worker cc_library { 3335*333d2b36SAndroid Build Coastguard Worker name: "mylib", 3336*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 3337*333d2b36SAndroid Build Coastguard Worker } 3338*333d2b36SAndroid Build Coastguard Worker `) 3339*333d2b36SAndroid Build Coastguard Worker 3340*333d2b36SAndroid Build Coastguard Worker apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) 3341*333d2b36SAndroid Build Coastguard Worker data := android.AndroidMkDataForTest(t, ctx, apexBundle) 3342*333d2b36SAndroid Build Coastguard Worker name := apexBundle.BaseModuleName() 3343*333d2b36SAndroid Build Coastguard Worker prefix := "TARGET_" 3344*333d2b36SAndroid Build Coastguard Worker var builder strings.Builder 3345*333d2b36SAndroid Build Coastguard Worker data.Custom(&builder, name, prefix, "", data) 3346*333d2b36SAndroid Build Coastguard Worker androidMk := builder.String() 3347*333d2b36SAndroid Build Coastguard Worker ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 libc.vendor libm.vendor libdl.vendor\n") 3348*333d2b36SAndroid Build Coastguard Worker} 3349*333d2b36SAndroid Build Coastguard Worker 3350*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidMkWritesCommonProperties(t *testing.T) { 3351*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 3352*333d2b36SAndroid Build Coastguard Worker apex { 3353*333d2b36SAndroid Build Coastguard Worker name: "myapex", 3354*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 3355*333d2b36SAndroid Build Coastguard Worker vintf_fragments: ["fragment.xml"], 3356*333d2b36SAndroid Build Coastguard Worker init_rc: ["init.rc"], 3357*333d2b36SAndroid Build Coastguard Worker updatable: false, 3358*333d2b36SAndroid Build Coastguard Worker } 3359*333d2b36SAndroid Build Coastguard Worker apex_key { 3360*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 3361*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 3362*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 3363*333d2b36SAndroid Build Coastguard Worker } 3364*333d2b36SAndroid Build Coastguard Worker cc_binary { 3365*333d2b36SAndroid Build Coastguard Worker name: "mybin", 3366*333d2b36SAndroid Build Coastguard Worker } 3367*333d2b36SAndroid Build Coastguard Worker `) 3368*333d2b36SAndroid Build Coastguard Worker 3369*333d2b36SAndroid Build Coastguard Worker apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) 3370*333d2b36SAndroid Build Coastguard Worker data := android.AndroidMkDataForTest(t, ctx, apexBundle) 3371*333d2b36SAndroid Build Coastguard Worker name := apexBundle.BaseModuleName() 3372*333d2b36SAndroid Build Coastguard Worker prefix := "TARGET_" 3373*333d2b36SAndroid Build Coastguard Worker var builder strings.Builder 3374*333d2b36SAndroid Build Coastguard Worker data.Custom(&builder, name, prefix, "", data) 3375*333d2b36SAndroid Build Coastguard Worker androidMk := builder.String() 3376*333d2b36SAndroid Build Coastguard Worker ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n") 3377*333d2b36SAndroid Build Coastguard Worker ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n") 3378*333d2b36SAndroid Build Coastguard Worker} 3379*333d2b36SAndroid Build Coastguard Worker 3380*333d2b36SAndroid Build Coastguard Workerfunc TestStaticLinking(t *testing.T) { 3381*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3382*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 3383*333d2b36SAndroid Build Coastguard Worker apex { 3384*333d2b36SAndroid Build Coastguard Worker name: "myapex", 3385*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 3386*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 3387*333d2b36SAndroid Build Coastguard Worker updatable: false, 3388*333d2b36SAndroid Build Coastguard Worker } 3389*333d2b36SAndroid Build Coastguard Worker 3390*333d2b36SAndroid Build Coastguard Worker apex_key { 3391*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 3392*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 3393*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 3394*333d2b36SAndroid Build Coastguard Worker } 3395*333d2b36SAndroid Build Coastguard Worker 3396*333d2b36SAndroid Build Coastguard Worker cc_library { 3397*333d2b36SAndroid Build Coastguard Worker name: "mylib", 3398*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 3399*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 3400*333d2b36SAndroid Build Coastguard Worker stl: "none", 3401*333d2b36SAndroid Build Coastguard Worker stubs: { 3402*333d2b36SAndroid Build Coastguard Worker versions: ["1", "2", "3"], 3403*333d2b36SAndroid Build Coastguard Worker }, 3404*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 3405*333d2b36SAndroid Build Coastguard Worker } 3406*333d2b36SAndroid Build Coastguard Worker 3407*333d2b36SAndroid Build Coastguard Worker cc_binary { 3408*333d2b36SAndroid Build Coastguard Worker name: "not_in_apex", 3409*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 3410*333d2b36SAndroid Build Coastguard Worker static_libs: ["mylib"], 3411*333d2b36SAndroid Build Coastguard Worker static_executable: true, 3412*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 3413*333d2b36SAndroid Build Coastguard Worker stl: "none", 3414*333d2b36SAndroid Build Coastguard Worker } 3415*333d2b36SAndroid Build Coastguard Worker `) 3416*333d2b36SAndroid Build Coastguard Worker 3417*333d2b36SAndroid Build Coastguard Worker ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"] 3418*333d2b36SAndroid Build Coastguard Worker 3419*333d2b36SAndroid Build Coastguard Worker // Ensure that not_in_apex is linking with the static variant of mylib 3420*333d2b36SAndroid Build Coastguard Worker ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a") 3421*333d2b36SAndroid Build Coastguard Worker} 3422*333d2b36SAndroid Build Coastguard Worker 3423*333d2b36SAndroid Build Coastguard Workerfunc TestKeys(t *testing.T) { 3424*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3425*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 3426*333d2b36SAndroid Build Coastguard Worker apex { 3427*333d2b36SAndroid Build Coastguard Worker name: "myapex_keytest", 3428*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 3429*333d2b36SAndroid Build Coastguard Worker certificate: ":myapex.certificate", 3430*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 3431*333d2b36SAndroid Build Coastguard Worker file_contexts: ":myapex-file_contexts", 3432*333d2b36SAndroid Build Coastguard Worker updatable: false, 3433*333d2b36SAndroid Build Coastguard Worker } 3434*333d2b36SAndroid Build Coastguard Worker 3435*333d2b36SAndroid Build Coastguard Worker cc_library { 3436*333d2b36SAndroid Build Coastguard Worker name: "mylib", 3437*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 3438*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 3439*333d2b36SAndroid Build Coastguard Worker stl: "none", 3440*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex_keytest" ], 3441*333d2b36SAndroid Build Coastguard Worker } 3442*333d2b36SAndroid Build Coastguard Worker 3443*333d2b36SAndroid Build Coastguard Worker apex_key { 3444*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 3445*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 3446*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 3447*333d2b36SAndroid Build Coastguard Worker } 3448*333d2b36SAndroid Build Coastguard Worker 3449*333d2b36SAndroid Build Coastguard Worker android_app_certificate { 3450*333d2b36SAndroid Build Coastguard Worker name: "myapex.certificate", 3451*333d2b36SAndroid Build Coastguard Worker certificate: "testkey", 3452*333d2b36SAndroid Build Coastguard Worker } 3453*333d2b36SAndroid Build Coastguard Worker 3454*333d2b36SAndroid Build Coastguard Worker android_app_certificate { 3455*333d2b36SAndroid Build Coastguard Worker name: "myapex.certificate.override", 3456*333d2b36SAndroid Build Coastguard Worker certificate: "testkey.override", 3457*333d2b36SAndroid Build Coastguard Worker } 3458*333d2b36SAndroid Build Coastguard Worker 3459*333d2b36SAndroid Build Coastguard Worker `) 3460*333d2b36SAndroid Build Coastguard Worker 3461*333d2b36SAndroid Build Coastguard Worker // check the APEX keys 3462*333d2b36SAndroid Build Coastguard Worker keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey) 3463*333d2b36SAndroid Build Coastguard Worker 3464*333d2b36SAndroid Build Coastguard Worker if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" { 3465*333d2b36SAndroid Build Coastguard Worker t.Errorf("public key %q is not %q", keys.publicKeyFile.String(), 3466*333d2b36SAndroid Build Coastguard Worker "vendor/foo/devkeys/testkey.avbpubkey") 3467*333d2b36SAndroid Build Coastguard Worker } 3468*333d2b36SAndroid Build Coastguard Worker if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" { 3469*333d2b36SAndroid Build Coastguard Worker t.Errorf("private key %q is not %q", keys.privateKeyFile.String(), 3470*333d2b36SAndroid Build Coastguard Worker "vendor/foo/devkeys/testkey.pem") 3471*333d2b36SAndroid Build Coastguard Worker } 3472*333d2b36SAndroid Build Coastguard Worker 3473*333d2b36SAndroid Build Coastguard Worker // check the APK certs. It should be overridden to myapex.certificate.override 3474*333d2b36SAndroid Build Coastguard Worker certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"] 3475*333d2b36SAndroid Build Coastguard Worker if certs != "testkey.override.x509.pem testkey.override.pk8" { 3476*333d2b36SAndroid Build Coastguard Worker t.Errorf("cert and private key %q are not %q", certs, 3477*333d2b36SAndroid Build Coastguard Worker "testkey.override.509.pem testkey.override.pk8") 3478*333d2b36SAndroid Build Coastguard Worker } 3479*333d2b36SAndroid Build Coastguard Worker} 3480*333d2b36SAndroid Build Coastguard Worker 3481*333d2b36SAndroid Build Coastguard Workerfunc TestCertificate(t *testing.T) { 3482*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3483*333d2b36SAndroid Build Coastguard Worker t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) { 3484*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3485*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 3486*333d2b36SAndroid Build Coastguard Worker apex { 3487*333d2b36SAndroid Build Coastguard Worker name: "myapex", 3488*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 3489*333d2b36SAndroid Build Coastguard Worker updatable: false, 3490*333d2b36SAndroid Build Coastguard Worker } 3491*333d2b36SAndroid Build Coastguard Worker apex_key { 3492*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 3493*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 3494*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 3495*333d2b36SAndroid Build Coastguard Worker }`) 3496*333d2b36SAndroid Build Coastguard Worker rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk") 3497*333d2b36SAndroid Build Coastguard Worker expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8" 3498*333d2b36SAndroid Build Coastguard Worker if actual := rule.Args["certificates"]; actual != expected { 3499*333d2b36SAndroid Build Coastguard Worker t.Errorf("certificates should be %q, not %q", expected, actual) 3500*333d2b36SAndroid Build Coastguard Worker } 3501*333d2b36SAndroid Build Coastguard Worker }) 3502*333d2b36SAndroid Build Coastguard Worker t.Run("override when unspecified", func(t *testing.T) { 3503*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3504*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 3505*333d2b36SAndroid Build Coastguard Worker apex { 3506*333d2b36SAndroid Build Coastguard Worker name: "myapex_keytest", 3507*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 3508*333d2b36SAndroid Build Coastguard Worker file_contexts: ":myapex-file_contexts", 3509*333d2b36SAndroid Build Coastguard Worker updatable: false, 3510*333d2b36SAndroid Build Coastguard Worker } 3511*333d2b36SAndroid Build Coastguard Worker apex_key { 3512*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 3513*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 3514*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 3515*333d2b36SAndroid Build Coastguard Worker } 3516*333d2b36SAndroid Build Coastguard Worker android_app_certificate { 3517*333d2b36SAndroid Build Coastguard Worker name: "myapex.certificate.override", 3518*333d2b36SAndroid Build Coastguard Worker certificate: "testkey.override", 3519*333d2b36SAndroid Build Coastguard Worker }`) 3520*333d2b36SAndroid Build Coastguard Worker rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk") 3521*333d2b36SAndroid Build Coastguard Worker expected := "testkey.override.x509.pem testkey.override.pk8" 3522*333d2b36SAndroid Build Coastguard Worker if actual := rule.Args["certificates"]; actual != expected { 3523*333d2b36SAndroid Build Coastguard Worker t.Errorf("certificates should be %q, not %q", expected, actual) 3524*333d2b36SAndroid Build Coastguard Worker } 3525*333d2b36SAndroid Build Coastguard Worker }) 3526*333d2b36SAndroid Build Coastguard Worker t.Run("if specified as :module, it respects the prop", func(t *testing.T) { 3527*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3528*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 3529*333d2b36SAndroid Build Coastguard Worker apex { 3530*333d2b36SAndroid Build Coastguard Worker name: "myapex", 3531*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 3532*333d2b36SAndroid Build Coastguard Worker certificate: ":myapex.certificate", 3533*333d2b36SAndroid Build Coastguard Worker updatable: false, 3534*333d2b36SAndroid Build Coastguard Worker } 3535*333d2b36SAndroid Build Coastguard Worker apex_key { 3536*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 3537*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 3538*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 3539*333d2b36SAndroid Build Coastguard Worker } 3540*333d2b36SAndroid Build Coastguard Worker android_app_certificate { 3541*333d2b36SAndroid Build Coastguard Worker name: "myapex.certificate", 3542*333d2b36SAndroid Build Coastguard Worker certificate: "testkey", 3543*333d2b36SAndroid Build Coastguard Worker }`) 3544*333d2b36SAndroid Build Coastguard Worker rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk") 3545*333d2b36SAndroid Build Coastguard Worker expected := "testkey.x509.pem testkey.pk8" 3546*333d2b36SAndroid Build Coastguard Worker if actual := rule.Args["certificates"]; actual != expected { 3547*333d2b36SAndroid Build Coastguard Worker t.Errorf("certificates should be %q, not %q", expected, actual) 3548*333d2b36SAndroid Build Coastguard Worker } 3549*333d2b36SAndroid Build Coastguard Worker }) 3550*333d2b36SAndroid Build Coastguard Worker t.Run("override when specifiec as <:module>", func(t *testing.T) { 3551*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3552*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 3553*333d2b36SAndroid Build Coastguard Worker apex { 3554*333d2b36SAndroid Build Coastguard Worker name: "myapex_keytest", 3555*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 3556*333d2b36SAndroid Build Coastguard Worker file_contexts: ":myapex-file_contexts", 3557*333d2b36SAndroid Build Coastguard Worker certificate: ":myapex.certificate", 3558*333d2b36SAndroid Build Coastguard Worker updatable: false, 3559*333d2b36SAndroid Build Coastguard Worker } 3560*333d2b36SAndroid Build Coastguard Worker apex_key { 3561*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 3562*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 3563*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 3564*333d2b36SAndroid Build Coastguard Worker } 3565*333d2b36SAndroid Build Coastguard Worker android_app_certificate { 3566*333d2b36SAndroid Build Coastguard Worker name: "myapex.certificate.override", 3567*333d2b36SAndroid Build Coastguard Worker certificate: "testkey.override", 3568*333d2b36SAndroid Build Coastguard Worker }`) 3569*333d2b36SAndroid Build Coastguard Worker rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk") 3570*333d2b36SAndroid Build Coastguard Worker expected := "testkey.override.x509.pem testkey.override.pk8" 3571*333d2b36SAndroid Build Coastguard Worker if actual := rule.Args["certificates"]; actual != expected { 3572*333d2b36SAndroid Build Coastguard Worker t.Errorf("certificates should be %q, not %q", expected, actual) 3573*333d2b36SAndroid Build Coastguard Worker } 3574*333d2b36SAndroid Build Coastguard Worker }) 3575*333d2b36SAndroid Build Coastguard Worker t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) { 3576*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3577*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 3578*333d2b36SAndroid Build Coastguard Worker apex { 3579*333d2b36SAndroid Build Coastguard Worker name: "myapex", 3580*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 3581*333d2b36SAndroid Build Coastguard Worker certificate: "testkey", 3582*333d2b36SAndroid Build Coastguard Worker updatable: false, 3583*333d2b36SAndroid Build Coastguard Worker } 3584*333d2b36SAndroid Build Coastguard Worker apex_key { 3585*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 3586*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 3587*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 3588*333d2b36SAndroid Build Coastguard Worker }`) 3589*333d2b36SAndroid Build Coastguard Worker rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk") 3590*333d2b36SAndroid Build Coastguard Worker expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8" 3591*333d2b36SAndroid Build Coastguard Worker if actual := rule.Args["certificates"]; actual != expected { 3592*333d2b36SAndroid Build Coastguard Worker t.Errorf("certificates should be %q, not %q", expected, actual) 3593*333d2b36SAndroid Build Coastguard Worker } 3594*333d2b36SAndroid Build Coastguard Worker }) 3595*333d2b36SAndroid Build Coastguard Worker t.Run("override when specified as <name>", func(t *testing.T) { 3596*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3597*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 3598*333d2b36SAndroid Build Coastguard Worker apex { 3599*333d2b36SAndroid Build Coastguard Worker name: "myapex_keytest", 3600*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 3601*333d2b36SAndroid Build Coastguard Worker file_contexts: ":myapex-file_contexts", 3602*333d2b36SAndroid Build Coastguard Worker certificate: "testkey", 3603*333d2b36SAndroid Build Coastguard Worker updatable: false, 3604*333d2b36SAndroid Build Coastguard Worker } 3605*333d2b36SAndroid Build Coastguard Worker apex_key { 3606*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 3607*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 3608*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 3609*333d2b36SAndroid Build Coastguard Worker } 3610*333d2b36SAndroid Build Coastguard Worker android_app_certificate { 3611*333d2b36SAndroid Build Coastguard Worker name: "myapex.certificate.override", 3612*333d2b36SAndroid Build Coastguard Worker certificate: "testkey.override", 3613*333d2b36SAndroid Build Coastguard Worker }`) 3614*333d2b36SAndroid Build Coastguard Worker rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk") 3615*333d2b36SAndroid Build Coastguard Worker expected := "testkey.override.x509.pem testkey.override.pk8" 3616*333d2b36SAndroid Build Coastguard Worker if actual := rule.Args["certificates"]; actual != expected { 3617*333d2b36SAndroid Build Coastguard Worker t.Errorf("certificates should be %q, not %q", expected, actual) 3618*333d2b36SAndroid Build Coastguard Worker } 3619*333d2b36SAndroid Build Coastguard Worker }) 3620*333d2b36SAndroid Build Coastguard Worker} 3621*333d2b36SAndroid Build Coastguard Worker 3622*333d2b36SAndroid Build Coastguard Workerfunc TestMacro(t *testing.T) { 3623*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3624*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 3625*333d2b36SAndroid Build Coastguard Worker apex { 3626*333d2b36SAndroid Build Coastguard Worker name: "myapex", 3627*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 3628*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib", "mylib2"], 3629*333d2b36SAndroid Build Coastguard Worker updatable: false, 3630*333d2b36SAndroid Build Coastguard Worker } 3631*333d2b36SAndroid Build Coastguard Worker 3632*333d2b36SAndroid Build Coastguard Worker apex { 3633*333d2b36SAndroid Build Coastguard Worker name: "otherapex", 3634*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 3635*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib", "mylib2"], 3636*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 3637*333d2b36SAndroid Build Coastguard Worker } 3638*333d2b36SAndroid Build Coastguard Worker 3639*333d2b36SAndroid Build Coastguard Worker apex_key { 3640*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 3641*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 3642*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 3643*333d2b36SAndroid Build Coastguard Worker } 3644*333d2b36SAndroid Build Coastguard Worker 3645*333d2b36SAndroid Build Coastguard Worker cc_library { 3646*333d2b36SAndroid Build Coastguard Worker name: "mylib", 3647*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 3648*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 3649*333d2b36SAndroid Build Coastguard Worker stl: "none", 3650*333d2b36SAndroid Build Coastguard Worker apex_available: [ 3651*333d2b36SAndroid Build Coastguard Worker "myapex", 3652*333d2b36SAndroid Build Coastguard Worker "otherapex", 3653*333d2b36SAndroid Build Coastguard Worker ], 3654*333d2b36SAndroid Build Coastguard Worker recovery_available: true, 3655*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 3656*333d2b36SAndroid Build Coastguard Worker } 3657*333d2b36SAndroid Build Coastguard Worker cc_library { 3658*333d2b36SAndroid Build Coastguard Worker name: "mylib2", 3659*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 3660*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 3661*333d2b36SAndroid Build Coastguard Worker stl: "none", 3662*333d2b36SAndroid Build Coastguard Worker apex_available: [ 3663*333d2b36SAndroid Build Coastguard Worker "myapex", 3664*333d2b36SAndroid Build Coastguard Worker "otherapex", 3665*333d2b36SAndroid Build Coastguard Worker ], 3666*333d2b36SAndroid Build Coastguard Worker static_libs: ["mylib3"], 3667*333d2b36SAndroid Build Coastguard Worker recovery_available: true, 3668*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 3669*333d2b36SAndroid Build Coastguard Worker } 3670*333d2b36SAndroid Build Coastguard Worker cc_library { 3671*333d2b36SAndroid Build Coastguard Worker name: "mylib3", 3672*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 3673*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 3674*333d2b36SAndroid Build Coastguard Worker stl: "none", 3675*333d2b36SAndroid Build Coastguard Worker apex_available: [ 3676*333d2b36SAndroid Build Coastguard Worker "myapex", 3677*333d2b36SAndroid Build Coastguard Worker "otherapex", 3678*333d2b36SAndroid Build Coastguard Worker ], 3679*333d2b36SAndroid Build Coastguard Worker recovery_available: true, 3680*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 3681*333d2b36SAndroid Build Coastguard Worker } 3682*333d2b36SAndroid Build Coastguard Worker `) 3683*333d2b36SAndroid Build Coastguard Worker 3684*333d2b36SAndroid Build Coastguard Worker // non-APEX variant does not have __ANDROID_APEX__ defined 3685*333d2b36SAndroid Build Coastguard Worker mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"] 3686*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__") 3687*333d2b36SAndroid Build Coastguard Worker 3688*333d2b36SAndroid Build Coastguard Worker // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined 3689*333d2b36SAndroid Build Coastguard Worker mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"] 3690*333d2b36SAndroid Build Coastguard Worker ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__") 3691*333d2b36SAndroid Build Coastguard Worker 3692*333d2b36SAndroid Build Coastguard Worker // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined 3693*333d2b36SAndroid Build Coastguard Worker mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"] 3694*333d2b36SAndroid Build Coastguard Worker ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__") 3695*333d2b36SAndroid Build Coastguard Worker 3696*333d2b36SAndroid Build Coastguard Worker // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and 3697*333d2b36SAndroid Build Coastguard Worker // each variant defines additional macros to distinguish which apex variant it is built for 3698*333d2b36SAndroid Build Coastguard Worker 3699*333d2b36SAndroid Build Coastguard Worker // non-APEX variant does not have __ANDROID_APEX__ defined 3700*333d2b36SAndroid Build Coastguard Worker mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"] 3701*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__") 3702*333d2b36SAndroid Build Coastguard Worker 3703*333d2b36SAndroid Build Coastguard Worker // recovery variant does not set __ANDROID_APEX__ 3704*333d2b36SAndroid Build Coastguard Worker mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"] 3705*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__") 3706*333d2b36SAndroid Build Coastguard Worker 3707*333d2b36SAndroid Build Coastguard Worker // non-APEX variant does not have __ANDROID_APEX__ defined 3708*333d2b36SAndroid Build Coastguard Worker mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"] 3709*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__") 3710*333d2b36SAndroid Build Coastguard Worker 3711*333d2b36SAndroid Build Coastguard Worker // recovery variant does not set __ANDROID_APEX__ 3712*333d2b36SAndroid Build Coastguard Worker mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"] 3713*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__") 3714*333d2b36SAndroid Build Coastguard Worker} 3715*333d2b36SAndroid Build Coastguard Worker 3716*333d2b36SAndroid Build Coastguard Workerfunc TestHeaderLibsDependency(t *testing.T) { 3717*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3718*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 3719*333d2b36SAndroid Build Coastguard Worker apex { 3720*333d2b36SAndroid Build Coastguard Worker name: "myapex", 3721*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 3722*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 3723*333d2b36SAndroid Build Coastguard Worker updatable: false, 3724*333d2b36SAndroid Build Coastguard Worker } 3725*333d2b36SAndroid Build Coastguard Worker 3726*333d2b36SAndroid Build Coastguard Worker apex_key { 3727*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 3728*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 3729*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 3730*333d2b36SAndroid Build Coastguard Worker } 3731*333d2b36SAndroid Build Coastguard Worker 3732*333d2b36SAndroid Build Coastguard Worker cc_library_headers { 3733*333d2b36SAndroid Build Coastguard Worker name: "mylib_headers", 3734*333d2b36SAndroid Build Coastguard Worker export_include_dirs: ["my_include"], 3735*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 3736*333d2b36SAndroid Build Coastguard Worker stl: "none", 3737*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 3738*333d2b36SAndroid Build Coastguard Worker } 3739*333d2b36SAndroid Build Coastguard Worker 3740*333d2b36SAndroid Build Coastguard Worker cc_library { 3741*333d2b36SAndroid Build Coastguard Worker name: "mylib", 3742*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 3743*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 3744*333d2b36SAndroid Build Coastguard Worker stl: "none", 3745*333d2b36SAndroid Build Coastguard Worker header_libs: ["mylib_headers"], 3746*333d2b36SAndroid Build Coastguard Worker export_header_lib_headers: ["mylib_headers"], 3747*333d2b36SAndroid Build Coastguard Worker stubs: { 3748*333d2b36SAndroid Build Coastguard Worker versions: ["1", "2", "3"], 3749*333d2b36SAndroid Build Coastguard Worker }, 3750*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 3751*333d2b36SAndroid Build Coastguard Worker } 3752*333d2b36SAndroid Build Coastguard Worker 3753*333d2b36SAndroid Build Coastguard Worker cc_library { 3754*333d2b36SAndroid Build Coastguard Worker name: "otherlib", 3755*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 3756*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 3757*333d2b36SAndroid Build Coastguard Worker stl: "none", 3758*333d2b36SAndroid Build Coastguard Worker shared_libs: ["mylib"], 3759*333d2b36SAndroid Build Coastguard Worker } 3760*333d2b36SAndroid Build Coastguard Worker `) 3761*333d2b36SAndroid Build Coastguard Worker 3762*333d2b36SAndroid Build Coastguard Worker cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"] 3763*333d2b36SAndroid Build Coastguard Worker 3764*333d2b36SAndroid Build Coastguard Worker // Ensure that the include path of the header lib is exported to 'otherlib' 3765*333d2b36SAndroid Build Coastguard Worker ensureContains(t, cFlags, "-Imy_include") 3766*333d2b36SAndroid Build Coastguard Worker} 3767*333d2b36SAndroid Build Coastguard Worker 3768*333d2b36SAndroid Build Coastguard Workertype fileInApex struct { 3769*333d2b36SAndroid Build Coastguard Worker path string // path in apex 3770*333d2b36SAndroid Build Coastguard Worker src string // src path 3771*333d2b36SAndroid Build Coastguard Worker isLink bool 3772*333d2b36SAndroid Build Coastguard Worker} 3773*333d2b36SAndroid Build Coastguard Worker 3774*333d2b36SAndroid Build Coastguard Workerfunc (f fileInApex) String() string { 3775*333d2b36SAndroid Build Coastguard Worker return f.src + ":" + f.path 3776*333d2b36SAndroid Build Coastguard Worker} 3777*333d2b36SAndroid Build Coastguard Worker 3778*333d2b36SAndroid Build Coastguard Workerfunc (f fileInApex) match(expectation string) bool { 3779*333d2b36SAndroid Build Coastguard Worker parts := strings.Split(expectation, ":") 3780*333d2b36SAndroid Build Coastguard Worker if len(parts) == 1 { 3781*333d2b36SAndroid Build Coastguard Worker match, _ := path.Match(parts[0], f.path) 3782*333d2b36SAndroid Build Coastguard Worker return match 3783*333d2b36SAndroid Build Coastguard Worker } 3784*333d2b36SAndroid Build Coastguard Worker if len(parts) == 2 { 3785*333d2b36SAndroid Build Coastguard Worker matchSrc, _ := path.Match(parts[0], f.src) 3786*333d2b36SAndroid Build Coastguard Worker matchDst, _ := path.Match(parts[1], f.path) 3787*333d2b36SAndroid Build Coastguard Worker return matchSrc && matchDst 3788*333d2b36SAndroid Build Coastguard Worker } 3789*333d2b36SAndroid Build Coastguard Worker panic("invalid expected file specification: " + expectation) 3790*333d2b36SAndroid Build Coastguard Worker} 3791*333d2b36SAndroid Build Coastguard Worker 3792*333d2b36SAndroid Build Coastguard Workerfunc getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex { 3793*333d2b36SAndroid Build Coastguard Worker t.Helper() 3794*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests(moduleName, variant) 3795*333d2b36SAndroid Build Coastguard Worker apexRule := module.MaybeRule("apexRule") 3796*333d2b36SAndroid Build Coastguard Worker apexDir := "/image.apex/" 3797*333d2b36SAndroid Build Coastguard Worker copyCmds := apexRule.Args["copy_commands"] 3798*333d2b36SAndroid Build Coastguard Worker var ret []fileInApex 3799*333d2b36SAndroid Build Coastguard Worker for _, cmd := range strings.Split(copyCmds, "&&") { 3800*333d2b36SAndroid Build Coastguard Worker cmd = strings.TrimSpace(cmd) 3801*333d2b36SAndroid Build Coastguard Worker if cmd == "" { 3802*333d2b36SAndroid Build Coastguard Worker continue 3803*333d2b36SAndroid Build Coastguard Worker } 3804*333d2b36SAndroid Build Coastguard Worker terms := strings.Split(cmd, " ") 3805*333d2b36SAndroid Build Coastguard Worker var dst, src string 3806*333d2b36SAndroid Build Coastguard Worker var isLink bool 3807*333d2b36SAndroid Build Coastguard Worker switch terms[0] { 3808*333d2b36SAndroid Build Coastguard Worker case "mkdir": 3809*333d2b36SAndroid Build Coastguard Worker case "cp": 3810*333d2b36SAndroid Build Coastguard Worker if len(terms) != 3 && len(terms) != 4 { 3811*333d2b36SAndroid Build Coastguard Worker t.Fatal("copyCmds contains invalid cp command", cmd) 3812*333d2b36SAndroid Build Coastguard Worker } 3813*333d2b36SAndroid Build Coastguard Worker dst = terms[len(terms)-1] 3814*333d2b36SAndroid Build Coastguard Worker src = terms[len(terms)-2] 3815*333d2b36SAndroid Build Coastguard Worker isLink = false 3816*333d2b36SAndroid Build Coastguard Worker case "ln": 3817*333d2b36SAndroid Build Coastguard Worker if len(terms) != 3 && len(terms) != 4 { 3818*333d2b36SAndroid Build Coastguard Worker // ln LINK TARGET or ln -s LINK TARGET 3819*333d2b36SAndroid Build Coastguard Worker t.Fatal("copyCmds contains invalid ln command", cmd) 3820*333d2b36SAndroid Build Coastguard Worker } 3821*333d2b36SAndroid Build Coastguard Worker dst = terms[len(terms)-1] 3822*333d2b36SAndroid Build Coastguard Worker src = terms[len(terms)-2] 3823*333d2b36SAndroid Build Coastguard Worker isLink = true 3824*333d2b36SAndroid Build Coastguard Worker default: 3825*333d2b36SAndroid Build Coastguard Worker t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd) 3826*333d2b36SAndroid Build Coastguard Worker } 3827*333d2b36SAndroid Build Coastguard Worker if dst != "" { 3828*333d2b36SAndroid Build Coastguard Worker index := strings.Index(dst, apexDir) 3829*333d2b36SAndroid Build Coastguard Worker if index == -1 { 3830*333d2b36SAndroid Build Coastguard Worker t.Fatal("copyCmds should copy a file to "+apexDir, cmd) 3831*333d2b36SAndroid Build Coastguard Worker } 3832*333d2b36SAndroid Build Coastguard Worker dstFile := dst[index+len(apexDir):] 3833*333d2b36SAndroid Build Coastguard Worker ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink}) 3834*333d2b36SAndroid Build Coastguard Worker } 3835*333d2b36SAndroid Build Coastguard Worker } 3836*333d2b36SAndroid Build Coastguard Worker return ret 3837*333d2b36SAndroid Build Coastguard Worker} 3838*333d2b36SAndroid Build Coastguard Worker 3839*333d2b36SAndroid Build Coastguard Workerfunc assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) { 3840*333d2b36SAndroid Build Coastguard Worker t.Helper() 3841*333d2b36SAndroid Build Coastguard Worker var failed bool 3842*333d2b36SAndroid Build Coastguard Worker var surplus []string 3843*333d2b36SAndroid Build Coastguard Worker filesMatched := make(map[string]bool) 3844*333d2b36SAndroid Build Coastguard Worker for _, file := range actualFiles { 3845*333d2b36SAndroid Build Coastguard Worker matchFound := false 3846*333d2b36SAndroid Build Coastguard Worker for _, expected := range expectedFiles { 3847*333d2b36SAndroid Build Coastguard Worker if file.match(expected) { 3848*333d2b36SAndroid Build Coastguard Worker matchFound = true 3849*333d2b36SAndroid Build Coastguard Worker filesMatched[expected] = true 3850*333d2b36SAndroid Build Coastguard Worker break 3851*333d2b36SAndroid Build Coastguard Worker } 3852*333d2b36SAndroid Build Coastguard Worker } 3853*333d2b36SAndroid Build Coastguard Worker if !matchFound { 3854*333d2b36SAndroid Build Coastguard Worker surplus = append(surplus, file.String()) 3855*333d2b36SAndroid Build Coastguard Worker } 3856*333d2b36SAndroid Build Coastguard Worker } 3857*333d2b36SAndroid Build Coastguard Worker 3858*333d2b36SAndroid Build Coastguard Worker if len(surplus) > 0 { 3859*333d2b36SAndroid Build Coastguard Worker sort.Strings(surplus) 3860*333d2b36SAndroid Build Coastguard Worker t.Log("surplus files", surplus) 3861*333d2b36SAndroid Build Coastguard Worker failed = true 3862*333d2b36SAndroid Build Coastguard Worker } 3863*333d2b36SAndroid Build Coastguard Worker 3864*333d2b36SAndroid Build Coastguard Worker if len(expectedFiles) > len(filesMatched) { 3865*333d2b36SAndroid Build Coastguard Worker var missing []string 3866*333d2b36SAndroid Build Coastguard Worker for _, expected := range expectedFiles { 3867*333d2b36SAndroid Build Coastguard Worker if !filesMatched[expected] { 3868*333d2b36SAndroid Build Coastguard Worker missing = append(missing, expected) 3869*333d2b36SAndroid Build Coastguard Worker } 3870*333d2b36SAndroid Build Coastguard Worker } 3871*333d2b36SAndroid Build Coastguard Worker sort.Strings(missing) 3872*333d2b36SAndroid Build Coastguard Worker t.Log("missing files", missing) 3873*333d2b36SAndroid Build Coastguard Worker failed = true 3874*333d2b36SAndroid Build Coastguard Worker } 3875*333d2b36SAndroid Build Coastguard Worker if failed { 3876*333d2b36SAndroid Build Coastguard Worker t.Fail() 3877*333d2b36SAndroid Build Coastguard Worker } 3878*333d2b36SAndroid Build Coastguard Worker} 3879*333d2b36SAndroid Build Coastguard Worker 3880*333d2b36SAndroid Build Coastguard Workerfunc ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) { 3881*333d2b36SAndroid Build Coastguard Worker assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant)) 3882*333d2b36SAndroid Build Coastguard Worker} 3883*333d2b36SAndroid Build Coastguard Worker 3884*333d2b36SAndroid Build Coastguard Workerfunc ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) { 3885*333d2b36SAndroid Build Coastguard Worker deapexer := ctx.ModuleForTests(moduleName, variant).Description("deapex") 3886*333d2b36SAndroid Build Coastguard Worker outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1) 3887*333d2b36SAndroid Build Coastguard Worker if deapexer.Output != nil { 3888*333d2b36SAndroid Build Coastguard Worker outputs = append(outputs, deapexer.Output.String()) 3889*333d2b36SAndroid Build Coastguard Worker } 3890*333d2b36SAndroid Build Coastguard Worker for _, output := range deapexer.ImplicitOutputs { 3891*333d2b36SAndroid Build Coastguard Worker outputs = append(outputs, output.String()) 3892*333d2b36SAndroid Build Coastguard Worker } 3893*333d2b36SAndroid Build Coastguard Worker actualFiles := make([]fileInApex, 0, len(outputs)) 3894*333d2b36SAndroid Build Coastguard Worker for _, output := range outputs { 3895*333d2b36SAndroid Build Coastguard Worker dir := "/deapexer/" 3896*333d2b36SAndroid Build Coastguard Worker pos := strings.LastIndex(output, dir) 3897*333d2b36SAndroid Build Coastguard Worker if pos == -1 { 3898*333d2b36SAndroid Build Coastguard Worker t.Fatal("Unknown deapexer output ", output) 3899*333d2b36SAndroid Build Coastguard Worker } 3900*333d2b36SAndroid Build Coastguard Worker path := output[pos+len(dir):] 3901*333d2b36SAndroid Build Coastguard Worker actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false}) 3902*333d2b36SAndroid Build Coastguard Worker } 3903*333d2b36SAndroid Build Coastguard Worker assertFileListEquals(t, files, actualFiles) 3904*333d2b36SAndroid Build Coastguard Worker} 3905*333d2b36SAndroid Build Coastguard Worker 3906*333d2b36SAndroid Build Coastguard Workerfunc vndkLibrariesTxtFiles(vers ...string) (result string) { 3907*333d2b36SAndroid Build Coastguard Worker for _, v := range vers { 3908*333d2b36SAndroid Build Coastguard Worker for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} { 3909*333d2b36SAndroid Build Coastguard Worker result += ` 3910*333d2b36SAndroid Build Coastguard Worker prebuilt_etc { 3911*333d2b36SAndroid Build Coastguard Worker name: "` + txt + `.libraries.` + v + `.txt", 3912*333d2b36SAndroid Build Coastguard Worker src: "dummy.txt", 3913*333d2b36SAndroid Build Coastguard Worker } 3914*333d2b36SAndroid Build Coastguard Worker ` 3915*333d2b36SAndroid Build Coastguard Worker } 3916*333d2b36SAndroid Build Coastguard Worker } 3917*333d2b36SAndroid Build Coastguard Worker return 3918*333d2b36SAndroid Build Coastguard Worker} 3919*333d2b36SAndroid Build Coastguard Worker 3920*333d2b36SAndroid Build Coastguard Workerfunc TestVndkApexVersion(t *testing.T) { 3921*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3922*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 3923*333d2b36SAndroid Build Coastguard Worker apex_vndk { 3924*333d2b36SAndroid Build Coastguard Worker name: "com.android.vndk.v27", 3925*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 3926*333d2b36SAndroid Build Coastguard Worker file_contexts: ":myapex-file_contexts", 3927*333d2b36SAndroid Build Coastguard Worker vndk_version: "27", 3928*333d2b36SAndroid Build Coastguard Worker updatable: false, 3929*333d2b36SAndroid Build Coastguard Worker } 3930*333d2b36SAndroid Build Coastguard Worker 3931*333d2b36SAndroid Build Coastguard Worker apex_key { 3932*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 3933*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 3934*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 3935*333d2b36SAndroid Build Coastguard Worker } 3936*333d2b36SAndroid Build Coastguard Worker 3937*333d2b36SAndroid Build Coastguard Worker vndk_prebuilt_shared { 3938*333d2b36SAndroid Build Coastguard Worker name: "libvndk27", 3939*333d2b36SAndroid Build Coastguard Worker version: "27", 3940*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 3941*333d2b36SAndroid Build Coastguard Worker product_available: true, 3942*333d2b36SAndroid Build Coastguard Worker vndk: { 3943*333d2b36SAndroid Build Coastguard Worker enabled: true, 3944*333d2b36SAndroid Build Coastguard Worker }, 3945*333d2b36SAndroid Build Coastguard Worker target_arch: "arm64", 3946*333d2b36SAndroid Build Coastguard Worker arch: { 3947*333d2b36SAndroid Build Coastguard Worker arm: { 3948*333d2b36SAndroid Build Coastguard Worker srcs: ["libvndk27_arm.so"], 3949*333d2b36SAndroid Build Coastguard Worker }, 3950*333d2b36SAndroid Build Coastguard Worker arm64: { 3951*333d2b36SAndroid Build Coastguard Worker srcs: ["libvndk27_arm64.so"], 3952*333d2b36SAndroid Build Coastguard Worker }, 3953*333d2b36SAndroid Build Coastguard Worker }, 3954*333d2b36SAndroid Build Coastguard Worker apex_available: [ "com.android.vndk.v27" ], 3955*333d2b36SAndroid Build Coastguard Worker } 3956*333d2b36SAndroid Build Coastguard Worker 3957*333d2b36SAndroid Build Coastguard Worker vndk_prebuilt_shared { 3958*333d2b36SAndroid Build Coastguard Worker name: "libvndk27", 3959*333d2b36SAndroid Build Coastguard Worker version: "27", 3960*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 3961*333d2b36SAndroid Build Coastguard Worker product_available: true, 3962*333d2b36SAndroid Build Coastguard Worker vndk: { 3963*333d2b36SAndroid Build Coastguard Worker enabled: true, 3964*333d2b36SAndroid Build Coastguard Worker }, 3965*333d2b36SAndroid Build Coastguard Worker target_arch: "x86_64", 3966*333d2b36SAndroid Build Coastguard Worker arch: { 3967*333d2b36SAndroid Build Coastguard Worker x86: { 3968*333d2b36SAndroid Build Coastguard Worker srcs: ["libvndk27_x86.so"], 3969*333d2b36SAndroid Build Coastguard Worker }, 3970*333d2b36SAndroid Build Coastguard Worker x86_64: { 3971*333d2b36SAndroid Build Coastguard Worker srcs: ["libvndk27_x86_64.so"], 3972*333d2b36SAndroid Build Coastguard Worker }, 3973*333d2b36SAndroid Build Coastguard Worker }, 3974*333d2b36SAndroid Build Coastguard Worker } 3975*333d2b36SAndroid Build Coastguard Worker `+vndkLibrariesTxtFiles("27"), 3976*333d2b36SAndroid Build Coastguard Worker withFiles(map[string][]byte{ 3977*333d2b36SAndroid Build Coastguard Worker "libvndk27_arm.so": nil, 3978*333d2b36SAndroid Build Coastguard Worker "libvndk27_arm64.so": nil, 3979*333d2b36SAndroid Build Coastguard Worker "libvndk27_x86.so": nil, 3980*333d2b36SAndroid Build Coastguard Worker "libvndk27_x86_64.so": nil, 3981*333d2b36SAndroid Build Coastguard Worker })) 3982*333d2b36SAndroid Build Coastguard Worker 3983*333d2b36SAndroid Build Coastguard Worker ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{ 3984*333d2b36SAndroid Build Coastguard Worker "lib/libvndk27_arm.so", 3985*333d2b36SAndroid Build Coastguard Worker "lib64/libvndk27_arm64.so", 3986*333d2b36SAndroid Build Coastguard Worker "etc/*", 3987*333d2b36SAndroid Build Coastguard Worker }) 3988*333d2b36SAndroid Build Coastguard Worker} 3989*333d2b36SAndroid Build Coastguard Worker 3990*333d2b36SAndroid Build Coastguard Workerfunc TestVndkApexNameRule(t *testing.T) { 3991*333d2b36SAndroid Build Coastguard Worker t.Parallel() 3992*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 3993*333d2b36SAndroid Build Coastguard Worker apex_vndk { 3994*333d2b36SAndroid Build Coastguard Worker name: "com.android.vndk.v29", 3995*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 3996*333d2b36SAndroid Build Coastguard Worker file_contexts: ":myapex-file_contexts", 3997*333d2b36SAndroid Build Coastguard Worker vndk_version: "29", 3998*333d2b36SAndroid Build Coastguard Worker updatable: false, 3999*333d2b36SAndroid Build Coastguard Worker } 4000*333d2b36SAndroid Build Coastguard Worker apex_vndk { 4001*333d2b36SAndroid Build Coastguard Worker name: "com.android.vndk.v28", 4002*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 4003*333d2b36SAndroid Build Coastguard Worker file_contexts: ":myapex-file_contexts", 4004*333d2b36SAndroid Build Coastguard Worker vndk_version: "28", 4005*333d2b36SAndroid Build Coastguard Worker updatable: false, 4006*333d2b36SAndroid Build Coastguard Worker } 4007*333d2b36SAndroid Build Coastguard Worker apex_key { 4008*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 4009*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 4010*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 4011*333d2b36SAndroid Build Coastguard Worker }`+vndkLibrariesTxtFiles("28", "29")) 4012*333d2b36SAndroid Build Coastguard Worker 4013*333d2b36SAndroid Build Coastguard Worker assertApexName := func(expected, moduleName string) { 4014*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests(moduleName, "android_common") 4015*333d2b36SAndroid Build Coastguard Worker apexManifestRule := module.Rule("apexManifestRule") 4016*333d2b36SAndroid Build Coastguard Worker ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected) 4017*333d2b36SAndroid Build Coastguard Worker } 4018*333d2b36SAndroid Build Coastguard Worker 4019*333d2b36SAndroid Build Coastguard Worker assertApexName("com.android.vndk.v29", "com.android.vndk.v29") 4020*333d2b36SAndroid Build Coastguard Worker assertApexName("com.android.vndk.v28", "com.android.vndk.v28") 4021*333d2b36SAndroid Build Coastguard Worker} 4022*333d2b36SAndroid Build Coastguard Worker 4023*333d2b36SAndroid Build Coastguard Workerfunc TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) { 4024*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4025*333d2b36SAndroid Build Coastguard Worker testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, ` 4026*333d2b36SAndroid Build Coastguard Worker apex_vndk { 4027*333d2b36SAndroid Build Coastguard Worker name: "com.android.vndk.v30", 4028*333d2b36SAndroid Build Coastguard Worker key: "com.android.vndk.v30.key", 4029*333d2b36SAndroid Build Coastguard Worker file_contexts: ":myapex-file_contexts", 4030*333d2b36SAndroid Build Coastguard Worker native_bridge_supported: true, 4031*333d2b36SAndroid Build Coastguard Worker } 4032*333d2b36SAndroid Build Coastguard Worker 4033*333d2b36SAndroid Build Coastguard Worker apex_key { 4034*333d2b36SAndroid Build Coastguard Worker name: "com.android.vndk.v30.key", 4035*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 4036*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 4037*333d2b36SAndroid Build Coastguard Worker } 4038*333d2b36SAndroid Build Coastguard Worker 4039*333d2b36SAndroid Build Coastguard Worker vndk_prebuilt_shared { 4040*333d2b36SAndroid Build Coastguard Worker name: "libvndk", 4041*333d2b36SAndroid Build Coastguard Worker version: "30", 4042*333d2b36SAndroid Build Coastguard Worker target_arch: "arm", 4043*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 4044*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 4045*333d2b36SAndroid Build Coastguard Worker product_available: true, 4046*333d2b36SAndroid Build Coastguard Worker native_bridge_supported: true, 4047*333d2b36SAndroid Build Coastguard Worker vndk: { 4048*333d2b36SAndroid Build Coastguard Worker enabled: true, 4049*333d2b36SAndroid Build Coastguard Worker }, 4050*333d2b36SAndroid Build Coastguard Worker } 4051*333d2b36SAndroid Build Coastguard Worker `) 4052*333d2b36SAndroid Build Coastguard Worker} 4053*333d2b36SAndroid Build Coastguard Worker 4054*333d2b36SAndroid Build Coastguard Workerfunc TestVndkApexWithBinder32(t *testing.T) { 4055*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4056*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 4057*333d2b36SAndroid Build Coastguard Worker apex_vndk { 4058*333d2b36SAndroid Build Coastguard Worker name: "com.android.vndk.v27", 4059*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 4060*333d2b36SAndroid Build Coastguard Worker file_contexts: ":myapex-file_contexts", 4061*333d2b36SAndroid Build Coastguard Worker vndk_version: "27", 4062*333d2b36SAndroid Build Coastguard Worker updatable: false, 4063*333d2b36SAndroid Build Coastguard Worker } 4064*333d2b36SAndroid Build Coastguard Worker 4065*333d2b36SAndroid Build Coastguard Worker apex_key { 4066*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 4067*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 4068*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 4069*333d2b36SAndroid Build Coastguard Worker } 4070*333d2b36SAndroid Build Coastguard Worker 4071*333d2b36SAndroid Build Coastguard Worker vndk_prebuilt_shared { 4072*333d2b36SAndroid Build Coastguard Worker name: "libvndk27", 4073*333d2b36SAndroid Build Coastguard Worker version: "27", 4074*333d2b36SAndroid Build Coastguard Worker target_arch: "arm", 4075*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 4076*333d2b36SAndroid Build Coastguard Worker product_available: true, 4077*333d2b36SAndroid Build Coastguard Worker vndk: { 4078*333d2b36SAndroid Build Coastguard Worker enabled: true, 4079*333d2b36SAndroid Build Coastguard Worker }, 4080*333d2b36SAndroid Build Coastguard Worker arch: { 4081*333d2b36SAndroid Build Coastguard Worker arm: { 4082*333d2b36SAndroid Build Coastguard Worker srcs: ["libvndk27.so"], 4083*333d2b36SAndroid Build Coastguard Worker } 4084*333d2b36SAndroid Build Coastguard Worker }, 4085*333d2b36SAndroid Build Coastguard Worker } 4086*333d2b36SAndroid Build Coastguard Worker 4087*333d2b36SAndroid Build Coastguard Worker vndk_prebuilt_shared { 4088*333d2b36SAndroid Build Coastguard Worker name: "libvndk27", 4089*333d2b36SAndroid Build Coastguard Worker version: "27", 4090*333d2b36SAndroid Build Coastguard Worker target_arch: "arm", 4091*333d2b36SAndroid Build Coastguard Worker binder32bit: true, 4092*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 4093*333d2b36SAndroid Build Coastguard Worker product_available: true, 4094*333d2b36SAndroid Build Coastguard Worker vndk: { 4095*333d2b36SAndroid Build Coastguard Worker enabled: true, 4096*333d2b36SAndroid Build Coastguard Worker }, 4097*333d2b36SAndroid Build Coastguard Worker arch: { 4098*333d2b36SAndroid Build Coastguard Worker arm: { 4099*333d2b36SAndroid Build Coastguard Worker srcs: ["libvndk27binder32.so"], 4100*333d2b36SAndroid Build Coastguard Worker } 4101*333d2b36SAndroid Build Coastguard Worker }, 4102*333d2b36SAndroid Build Coastguard Worker apex_available: [ "com.android.vndk.v27" ], 4103*333d2b36SAndroid Build Coastguard Worker } 4104*333d2b36SAndroid Build Coastguard Worker `+vndkLibrariesTxtFiles("27"), 4105*333d2b36SAndroid Build Coastguard Worker withFiles(map[string][]byte{ 4106*333d2b36SAndroid Build Coastguard Worker "libvndk27.so": nil, 4107*333d2b36SAndroid Build Coastguard Worker "libvndk27binder32.so": nil, 4108*333d2b36SAndroid Build Coastguard Worker }), 4109*333d2b36SAndroid Build Coastguard Worker withBinder32bit, 4110*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyConfig(func(config android.Config) { 4111*333d2b36SAndroid Build Coastguard Worker target := android.Target{ 4112*333d2b36SAndroid Build Coastguard Worker Os: android.Android, 4113*333d2b36SAndroid Build Coastguard Worker Arch: android.Arch{ 4114*333d2b36SAndroid Build Coastguard Worker ArchType: android.Arm, 4115*333d2b36SAndroid Build Coastguard Worker ArchVariant: "armv7-a-neon", 4116*333d2b36SAndroid Build Coastguard Worker Abi: []string{"armeabi-v7a"}, 4117*333d2b36SAndroid Build Coastguard Worker }, 4118*333d2b36SAndroid Build Coastguard Worker NativeBridge: android.NativeBridgeDisabled, 4119*333d2b36SAndroid Build Coastguard Worker NativeBridgeHostArchName: "", 4120*333d2b36SAndroid Build Coastguard Worker NativeBridgeRelativePath: "", 4121*333d2b36SAndroid Build Coastguard Worker } 4122*333d2b36SAndroid Build Coastguard Worker config.Targets[android.Android] = []android.Target{target} 4123*333d2b36SAndroid Build Coastguard Worker config.AndroidFirstDeviceTarget = target 4124*333d2b36SAndroid Build Coastguard Worker }), 4125*333d2b36SAndroid Build Coastguard Worker ) 4126*333d2b36SAndroid Build Coastguard Worker 4127*333d2b36SAndroid Build Coastguard Worker ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{ 4128*333d2b36SAndroid Build Coastguard Worker "lib/libvndk27binder32.so", 4129*333d2b36SAndroid Build Coastguard Worker "etc/*", 4130*333d2b36SAndroid Build Coastguard Worker }) 4131*333d2b36SAndroid Build Coastguard Worker} 4132*333d2b36SAndroid Build Coastguard Worker 4133*333d2b36SAndroid Build Coastguard Workerfunc TestDependenciesInApexManifest(t *testing.T) { 4134*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4135*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 4136*333d2b36SAndroid Build Coastguard Worker apex { 4137*333d2b36SAndroid Build Coastguard Worker name: "myapex_nodep", 4138*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 4139*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["lib_nodep"], 4140*333d2b36SAndroid Build Coastguard Worker compile_multilib: "both", 4141*333d2b36SAndroid Build Coastguard Worker file_contexts: ":myapex-file_contexts", 4142*333d2b36SAndroid Build Coastguard Worker updatable: false, 4143*333d2b36SAndroid Build Coastguard Worker } 4144*333d2b36SAndroid Build Coastguard Worker 4145*333d2b36SAndroid Build Coastguard Worker apex { 4146*333d2b36SAndroid Build Coastguard Worker name: "myapex_dep", 4147*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 4148*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["lib_dep"], 4149*333d2b36SAndroid Build Coastguard Worker compile_multilib: "both", 4150*333d2b36SAndroid Build Coastguard Worker file_contexts: ":myapex-file_contexts", 4151*333d2b36SAndroid Build Coastguard Worker updatable: false, 4152*333d2b36SAndroid Build Coastguard Worker } 4153*333d2b36SAndroid Build Coastguard Worker 4154*333d2b36SAndroid Build Coastguard Worker apex { 4155*333d2b36SAndroid Build Coastguard Worker name: "myapex_provider", 4156*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 4157*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 4158*333d2b36SAndroid Build Coastguard Worker compile_multilib: "both", 4159*333d2b36SAndroid Build Coastguard Worker file_contexts: ":myapex-file_contexts", 4160*333d2b36SAndroid Build Coastguard Worker updatable: false, 4161*333d2b36SAndroid Build Coastguard Worker } 4162*333d2b36SAndroid Build Coastguard Worker 4163*333d2b36SAndroid Build Coastguard Worker apex { 4164*333d2b36SAndroid Build Coastguard Worker name: "myapex_selfcontained", 4165*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 4166*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["lib_dep_on_bar", "libbar"], 4167*333d2b36SAndroid Build Coastguard Worker compile_multilib: "both", 4168*333d2b36SAndroid Build Coastguard Worker file_contexts: ":myapex-file_contexts", 4169*333d2b36SAndroid Build Coastguard Worker updatable: false, 4170*333d2b36SAndroid Build Coastguard Worker } 4171*333d2b36SAndroid Build Coastguard Worker 4172*333d2b36SAndroid Build Coastguard Worker apex_key { 4173*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 4174*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 4175*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 4176*333d2b36SAndroid Build Coastguard Worker } 4177*333d2b36SAndroid Build Coastguard Worker 4178*333d2b36SAndroid Build Coastguard Worker cc_library { 4179*333d2b36SAndroid Build Coastguard Worker name: "lib_nodep", 4180*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 4181*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 4182*333d2b36SAndroid Build Coastguard Worker stl: "none", 4183*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex_nodep" ], 4184*333d2b36SAndroid Build Coastguard Worker } 4185*333d2b36SAndroid Build Coastguard Worker 4186*333d2b36SAndroid Build Coastguard Worker cc_library { 4187*333d2b36SAndroid Build Coastguard Worker name: "lib_dep", 4188*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 4189*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libfoo"], 4190*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 4191*333d2b36SAndroid Build Coastguard Worker stl: "none", 4192*333d2b36SAndroid Build Coastguard Worker apex_available: [ 4193*333d2b36SAndroid Build Coastguard Worker "myapex_dep", 4194*333d2b36SAndroid Build Coastguard Worker "myapex_provider", 4195*333d2b36SAndroid Build Coastguard Worker "myapex_selfcontained", 4196*333d2b36SAndroid Build Coastguard Worker ], 4197*333d2b36SAndroid Build Coastguard Worker } 4198*333d2b36SAndroid Build Coastguard Worker 4199*333d2b36SAndroid Build Coastguard Worker cc_library { 4200*333d2b36SAndroid Build Coastguard Worker name: "lib_dep_on_bar", 4201*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 4202*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbar"], 4203*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 4204*333d2b36SAndroid Build Coastguard Worker stl: "none", 4205*333d2b36SAndroid Build Coastguard Worker apex_available: [ 4206*333d2b36SAndroid Build Coastguard Worker "myapex_selfcontained", 4207*333d2b36SAndroid Build Coastguard Worker ], 4208*333d2b36SAndroid Build Coastguard Worker } 4209*333d2b36SAndroid Build Coastguard Worker 4210*333d2b36SAndroid Build Coastguard Worker 4211*333d2b36SAndroid Build Coastguard Worker cc_library { 4212*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 4213*333d2b36SAndroid Build Coastguard Worker srcs: ["mytest.cpp"], 4214*333d2b36SAndroid Build Coastguard Worker stubs: { 4215*333d2b36SAndroid Build Coastguard Worker versions: ["1"], 4216*333d2b36SAndroid Build Coastguard Worker }, 4217*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 4218*333d2b36SAndroid Build Coastguard Worker stl: "none", 4219*333d2b36SAndroid Build Coastguard Worker apex_available: [ 4220*333d2b36SAndroid Build Coastguard Worker "myapex_provider", 4221*333d2b36SAndroid Build Coastguard Worker ], 4222*333d2b36SAndroid Build Coastguard Worker } 4223*333d2b36SAndroid Build Coastguard Worker 4224*333d2b36SAndroid Build Coastguard Worker cc_library { 4225*333d2b36SAndroid Build Coastguard Worker name: "libbar", 4226*333d2b36SAndroid Build Coastguard Worker srcs: ["mytest.cpp"], 4227*333d2b36SAndroid Build Coastguard Worker stubs: { 4228*333d2b36SAndroid Build Coastguard Worker versions: ["1"], 4229*333d2b36SAndroid Build Coastguard Worker }, 4230*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 4231*333d2b36SAndroid Build Coastguard Worker stl: "none", 4232*333d2b36SAndroid Build Coastguard Worker apex_available: [ 4233*333d2b36SAndroid Build Coastguard Worker "myapex_selfcontained", 4234*333d2b36SAndroid Build Coastguard Worker ], 4235*333d2b36SAndroid Build Coastguard Worker } 4236*333d2b36SAndroid Build Coastguard Worker 4237*333d2b36SAndroid Build Coastguard Worker `) 4238*333d2b36SAndroid Build Coastguard Worker 4239*333d2b36SAndroid Build Coastguard Worker var apexManifestRule android.TestingBuildParams 4240*333d2b36SAndroid Build Coastguard Worker var provideNativeLibs, requireNativeLibs []string 4241*333d2b36SAndroid Build Coastguard Worker 4242*333d2b36SAndroid Build Coastguard Worker apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule") 4243*333d2b36SAndroid Build Coastguard Worker provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"]) 4244*333d2b36SAndroid Build Coastguard Worker requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"]) 4245*333d2b36SAndroid Build Coastguard Worker ensureListEmpty(t, provideNativeLibs) 4246*333d2b36SAndroid Build Coastguard Worker ensureListEmpty(t, requireNativeLibs) 4247*333d2b36SAndroid Build Coastguard Worker 4248*333d2b36SAndroid Build Coastguard Worker apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule") 4249*333d2b36SAndroid Build Coastguard Worker provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"]) 4250*333d2b36SAndroid Build Coastguard Worker requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"]) 4251*333d2b36SAndroid Build Coastguard Worker ensureListEmpty(t, provideNativeLibs) 4252*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, requireNativeLibs, "libfoo.so") 4253*333d2b36SAndroid Build Coastguard Worker 4254*333d2b36SAndroid Build Coastguard Worker apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule") 4255*333d2b36SAndroid Build Coastguard Worker provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"]) 4256*333d2b36SAndroid Build Coastguard Worker requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"]) 4257*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, provideNativeLibs, "libfoo.so") 4258*333d2b36SAndroid Build Coastguard Worker ensureListEmpty(t, requireNativeLibs) 4259*333d2b36SAndroid Build Coastguard Worker 4260*333d2b36SAndroid Build Coastguard Worker apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule") 4261*333d2b36SAndroid Build Coastguard Worker provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"]) 4262*333d2b36SAndroid Build Coastguard Worker requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"]) 4263*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, provideNativeLibs, "libbar.so") 4264*333d2b36SAndroid Build Coastguard Worker ensureListEmpty(t, requireNativeLibs) 4265*333d2b36SAndroid Build Coastguard Worker} 4266*333d2b36SAndroid Build Coastguard Worker 4267*333d2b36SAndroid Build Coastguard Workerfunc TestOverrideApexManifestDefaultVersion(t *testing.T) { 4268*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4269*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 4270*333d2b36SAndroid Build Coastguard Worker apex { 4271*333d2b36SAndroid Build Coastguard Worker name: "myapex", 4272*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 4273*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 4274*333d2b36SAndroid Build Coastguard Worker updatable: false, 4275*333d2b36SAndroid Build Coastguard Worker } 4276*333d2b36SAndroid Build Coastguard Worker 4277*333d2b36SAndroid Build Coastguard Worker apex_key { 4278*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 4279*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 4280*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 4281*333d2b36SAndroid Build Coastguard Worker } 4282*333d2b36SAndroid Build Coastguard Worker 4283*333d2b36SAndroid Build Coastguard Worker cc_library { 4284*333d2b36SAndroid Build Coastguard Worker name: "mylib", 4285*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 4286*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 4287*333d2b36SAndroid Build Coastguard Worker stl: "none", 4288*333d2b36SAndroid Build Coastguard Worker apex_available: [ 4289*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 4290*333d2b36SAndroid Build Coastguard Worker "myapex", 4291*333d2b36SAndroid Build Coastguard Worker ], 4292*333d2b36SAndroid Build Coastguard Worker } 4293*333d2b36SAndroid Build Coastguard Worker `, android.FixtureMergeEnv(map[string]string{ 4294*333d2b36SAndroid Build Coastguard Worker "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234", 4295*333d2b36SAndroid Build Coastguard Worker })) 4296*333d2b36SAndroid Build Coastguard Worker 4297*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests("myapex", "android_common_myapex") 4298*333d2b36SAndroid Build Coastguard Worker apexManifestRule := module.Rule("apexManifestRule") 4299*333d2b36SAndroid Build Coastguard Worker ensureContains(t, apexManifestRule.Args["default_version"], "1234") 4300*333d2b36SAndroid Build Coastguard Worker} 4301*333d2b36SAndroid Build Coastguard Worker 4302*333d2b36SAndroid Build Coastguard Workerfunc TestCompileMultilibProp(t *testing.T) { 4303*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4304*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 4305*333d2b36SAndroid Build Coastguard Worker compileMultiLibProp string 4306*333d2b36SAndroid Build Coastguard Worker containedLibs []string 4307*333d2b36SAndroid Build Coastguard Worker notContainedLibs []string 4308*333d2b36SAndroid Build Coastguard Worker }{ 4309*333d2b36SAndroid Build Coastguard Worker { 4310*333d2b36SAndroid Build Coastguard Worker containedLibs: []string{ 4311*333d2b36SAndroid Build Coastguard Worker "image.apex/lib64/mylib.so", 4312*333d2b36SAndroid Build Coastguard Worker "image.apex/lib/mylib.so", 4313*333d2b36SAndroid Build Coastguard Worker }, 4314*333d2b36SAndroid Build Coastguard Worker compileMultiLibProp: `compile_multilib: "both",`, 4315*333d2b36SAndroid Build Coastguard Worker }, 4316*333d2b36SAndroid Build Coastguard Worker { 4317*333d2b36SAndroid Build Coastguard Worker containedLibs: []string{"image.apex/lib64/mylib.so"}, 4318*333d2b36SAndroid Build Coastguard Worker notContainedLibs: []string{"image.apex/lib/mylib.so"}, 4319*333d2b36SAndroid Build Coastguard Worker compileMultiLibProp: `compile_multilib: "first",`, 4320*333d2b36SAndroid Build Coastguard Worker }, 4321*333d2b36SAndroid Build Coastguard Worker { 4322*333d2b36SAndroid Build Coastguard Worker containedLibs: []string{"image.apex/lib64/mylib.so"}, 4323*333d2b36SAndroid Build Coastguard Worker notContainedLibs: []string{"image.apex/lib/mylib.so"}, 4324*333d2b36SAndroid Build Coastguard Worker // compile_multilib, when unset, should result to the same output as when compile_multilib is "first" 4325*333d2b36SAndroid Build Coastguard Worker }, 4326*333d2b36SAndroid Build Coastguard Worker { 4327*333d2b36SAndroid Build Coastguard Worker containedLibs: []string{"image.apex/lib64/mylib.so"}, 4328*333d2b36SAndroid Build Coastguard Worker notContainedLibs: []string{"image.apex/lib/mylib.so"}, 4329*333d2b36SAndroid Build Coastguard Worker compileMultiLibProp: `compile_multilib: "64",`, 4330*333d2b36SAndroid Build Coastguard Worker }, 4331*333d2b36SAndroid Build Coastguard Worker { 4332*333d2b36SAndroid Build Coastguard Worker containedLibs: []string{"image.apex/lib/mylib.so"}, 4333*333d2b36SAndroid Build Coastguard Worker notContainedLibs: []string{"image.apex/lib64/mylib.so"}, 4334*333d2b36SAndroid Build Coastguard Worker compileMultiLibProp: `compile_multilib: "32",`, 4335*333d2b36SAndroid Build Coastguard Worker }, 4336*333d2b36SAndroid Build Coastguard Worker } 4337*333d2b36SAndroid Build Coastguard Worker for _, testCase := range testCases { 4338*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, fmt.Sprintf(` 4339*333d2b36SAndroid Build Coastguard Worker apex { 4340*333d2b36SAndroid Build Coastguard Worker name: "myapex", 4341*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 4342*333d2b36SAndroid Build Coastguard Worker %s 4343*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 4344*333d2b36SAndroid Build Coastguard Worker updatable: false, 4345*333d2b36SAndroid Build Coastguard Worker } 4346*333d2b36SAndroid Build Coastguard Worker apex_key { 4347*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 4348*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 4349*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 4350*333d2b36SAndroid Build Coastguard Worker } 4351*333d2b36SAndroid Build Coastguard Worker cc_library { 4352*333d2b36SAndroid Build Coastguard Worker name: "mylib", 4353*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 4354*333d2b36SAndroid Build Coastguard Worker apex_available: [ 4355*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 4356*333d2b36SAndroid Build Coastguard Worker "myapex", 4357*333d2b36SAndroid Build Coastguard Worker ], 4358*333d2b36SAndroid Build Coastguard Worker } 4359*333d2b36SAndroid Build Coastguard Worker `, testCase.compileMultiLibProp), 4360*333d2b36SAndroid Build Coastguard Worker ) 4361*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests("myapex", "android_common_myapex") 4362*333d2b36SAndroid Build Coastguard Worker apexRule := module.Rule("apexRule") 4363*333d2b36SAndroid Build Coastguard Worker copyCmds := apexRule.Args["copy_commands"] 4364*333d2b36SAndroid Build Coastguard Worker for _, containedLib := range testCase.containedLibs { 4365*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, containedLib) 4366*333d2b36SAndroid Build Coastguard Worker } 4367*333d2b36SAndroid Build Coastguard Worker for _, notContainedLib := range testCase.notContainedLibs { 4368*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, copyCmds, notContainedLib) 4369*333d2b36SAndroid Build Coastguard Worker } 4370*333d2b36SAndroid Build Coastguard Worker } 4371*333d2b36SAndroid Build Coastguard Worker} 4372*333d2b36SAndroid Build Coastguard Worker 4373*333d2b36SAndroid Build Coastguard Workerfunc TestNonTestApex(t *testing.T) { 4374*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4375*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 4376*333d2b36SAndroid Build Coastguard Worker apex { 4377*333d2b36SAndroid Build Coastguard Worker name: "myapex", 4378*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 4379*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib_common"], 4380*333d2b36SAndroid Build Coastguard Worker updatable: false, 4381*333d2b36SAndroid Build Coastguard Worker } 4382*333d2b36SAndroid Build Coastguard Worker 4383*333d2b36SAndroid Build Coastguard Worker apex_key { 4384*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 4385*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 4386*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 4387*333d2b36SAndroid Build Coastguard Worker } 4388*333d2b36SAndroid Build Coastguard Worker 4389*333d2b36SAndroid Build Coastguard Worker cc_library { 4390*333d2b36SAndroid Build Coastguard Worker name: "mylib_common", 4391*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 4392*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 4393*333d2b36SAndroid Build Coastguard Worker stl: "none", 4394*333d2b36SAndroid Build Coastguard Worker apex_available: [ 4395*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 4396*333d2b36SAndroid Build Coastguard Worker "myapex", 4397*333d2b36SAndroid Build Coastguard Worker ], 4398*333d2b36SAndroid Build Coastguard Worker } 4399*333d2b36SAndroid Build Coastguard Worker `) 4400*333d2b36SAndroid Build Coastguard Worker 4401*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests("myapex", "android_common_myapex") 4402*333d2b36SAndroid Build Coastguard Worker apexRule := module.Rule("apexRule") 4403*333d2b36SAndroid Build Coastguard Worker copyCmds := apexRule.Args["copy_commands"] 4404*333d2b36SAndroid Build Coastguard Worker 4405*333d2b36SAndroid Build Coastguard Worker if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex { 4406*333d2b36SAndroid Build Coastguard Worker t.Log("Apex was a test apex!") 4407*333d2b36SAndroid Build Coastguard Worker t.Fail() 4408*333d2b36SAndroid Build Coastguard Worker } 4409*333d2b36SAndroid Build Coastguard Worker // Ensure that main rule creates an output 4410*333d2b36SAndroid Build Coastguard Worker ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned") 4411*333d2b36SAndroid Build Coastguard Worker 4412*333d2b36SAndroid Build Coastguard Worker // Ensure that apex variant is created for the direct dep 4413*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000") 4414*333d2b36SAndroid Build Coastguard Worker 4415*333d2b36SAndroid Build Coastguard Worker // Ensure that both direct and indirect deps are copied into apex 4416*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so") 4417*333d2b36SAndroid Build Coastguard Worker 4418*333d2b36SAndroid Build Coastguard Worker // Ensure that the platform variant ends with _shared 4419*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared") 4420*333d2b36SAndroid Build Coastguard Worker 4421*333d2b36SAndroid Build Coastguard Worker if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() { 4422*333d2b36SAndroid Build Coastguard Worker t.Log("Found mylib_common not in any apex!") 4423*333d2b36SAndroid Build Coastguard Worker t.Fail() 4424*333d2b36SAndroid Build Coastguard Worker } 4425*333d2b36SAndroid Build Coastguard Worker} 4426*333d2b36SAndroid Build Coastguard Worker 4427*333d2b36SAndroid Build Coastguard Workerfunc TestTestApex(t *testing.T) { 4428*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4429*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 4430*333d2b36SAndroid Build Coastguard Worker apex_test { 4431*333d2b36SAndroid Build Coastguard Worker name: "myapex", 4432*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 4433*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib_common_test"], 4434*333d2b36SAndroid Build Coastguard Worker updatable: false, 4435*333d2b36SAndroid Build Coastguard Worker } 4436*333d2b36SAndroid Build Coastguard Worker 4437*333d2b36SAndroid Build Coastguard Worker apex_key { 4438*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 4439*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 4440*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 4441*333d2b36SAndroid Build Coastguard Worker } 4442*333d2b36SAndroid Build Coastguard Worker 4443*333d2b36SAndroid Build Coastguard Worker cc_library { 4444*333d2b36SAndroid Build Coastguard Worker name: "mylib_common_test", 4445*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 4446*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 4447*333d2b36SAndroid Build Coastguard Worker stl: "none", 4448*333d2b36SAndroid Build Coastguard Worker // TODO: remove //apex_available:platform 4449*333d2b36SAndroid Build Coastguard Worker apex_available: [ 4450*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 4451*333d2b36SAndroid Build Coastguard Worker "myapex", 4452*333d2b36SAndroid Build Coastguard Worker ], 4453*333d2b36SAndroid Build Coastguard Worker } 4454*333d2b36SAndroid Build Coastguard Worker `) 4455*333d2b36SAndroid Build Coastguard Worker 4456*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests("myapex", "android_common_myapex") 4457*333d2b36SAndroid Build Coastguard Worker apexRule := module.Rule("apexRule") 4458*333d2b36SAndroid Build Coastguard Worker copyCmds := apexRule.Args["copy_commands"] 4459*333d2b36SAndroid Build Coastguard Worker 4460*333d2b36SAndroid Build Coastguard Worker if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex { 4461*333d2b36SAndroid Build Coastguard Worker t.Log("Apex was not a test apex!") 4462*333d2b36SAndroid Build Coastguard Worker t.Fail() 4463*333d2b36SAndroid Build Coastguard Worker } 4464*333d2b36SAndroid Build Coastguard Worker // Ensure that main rule creates an output 4465*333d2b36SAndroid Build Coastguard Worker ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned") 4466*333d2b36SAndroid Build Coastguard Worker 4467*333d2b36SAndroid Build Coastguard Worker // Ensure that apex variant is created for the direct dep 4468*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000") 4469*333d2b36SAndroid Build Coastguard Worker 4470*333d2b36SAndroid Build Coastguard Worker // Ensure that both direct and indirect deps are copied into apex 4471*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so") 4472*333d2b36SAndroid Build Coastguard Worker 4473*333d2b36SAndroid Build Coastguard Worker // Ensure that the platform variant ends with _shared 4474*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared") 4475*333d2b36SAndroid Build Coastguard Worker} 4476*333d2b36SAndroid Build Coastguard Worker 4477*333d2b36SAndroid Build Coastguard Workerfunc TestLibzVendorIsntStable(t *testing.T) { 4478*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4479*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 4480*333d2b36SAndroid Build Coastguard Worker apex { 4481*333d2b36SAndroid Build Coastguard Worker name: "myapex", 4482*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 4483*333d2b36SAndroid Build Coastguard Worker updatable: false, 4484*333d2b36SAndroid Build Coastguard Worker binaries: ["mybin"], 4485*333d2b36SAndroid Build Coastguard Worker } 4486*333d2b36SAndroid Build Coastguard Worker apex { 4487*333d2b36SAndroid Build Coastguard Worker name: "myvendorapex", 4488*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 4489*333d2b36SAndroid Build Coastguard Worker file_contexts: "myvendorapex_file_contexts", 4490*333d2b36SAndroid Build Coastguard Worker vendor: true, 4491*333d2b36SAndroid Build Coastguard Worker updatable: false, 4492*333d2b36SAndroid Build Coastguard Worker binaries: ["mybin"], 4493*333d2b36SAndroid Build Coastguard Worker } 4494*333d2b36SAndroid Build Coastguard Worker apex_key { 4495*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 4496*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 4497*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 4498*333d2b36SAndroid Build Coastguard Worker } 4499*333d2b36SAndroid Build Coastguard Worker cc_binary { 4500*333d2b36SAndroid Build Coastguard Worker name: "mybin", 4501*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 4502*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 4503*333d2b36SAndroid Build Coastguard Worker stl: "none", 4504*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libz"], 4505*333d2b36SAndroid Build Coastguard Worker apex_available: ["//apex_available:anyapex"], 4506*333d2b36SAndroid Build Coastguard Worker } 4507*333d2b36SAndroid Build Coastguard Worker cc_library { 4508*333d2b36SAndroid Build Coastguard Worker name: "libz", 4509*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 4510*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 4511*333d2b36SAndroid Build Coastguard Worker stl: "none", 4512*333d2b36SAndroid Build Coastguard Worker stubs: { 4513*333d2b36SAndroid Build Coastguard Worker versions: ["28", "30"], 4514*333d2b36SAndroid Build Coastguard Worker }, 4515*333d2b36SAndroid Build Coastguard Worker target: { 4516*333d2b36SAndroid Build Coastguard Worker vendor: { 4517*333d2b36SAndroid Build Coastguard Worker no_stubs: true, 4518*333d2b36SAndroid Build Coastguard Worker }, 4519*333d2b36SAndroid Build Coastguard Worker }, 4520*333d2b36SAndroid Build Coastguard Worker } 4521*333d2b36SAndroid Build Coastguard Worker `, withFiles(map[string][]byte{ 4522*333d2b36SAndroid Build Coastguard Worker "myvendorapex_file_contexts": nil, 4523*333d2b36SAndroid Build Coastguard Worker })) 4524*333d2b36SAndroid Build Coastguard Worker 4525*333d2b36SAndroid Build Coastguard Worker // libz provides stubs for core variant. 4526*333d2b36SAndroid Build Coastguard Worker { 4527*333d2b36SAndroid Build Coastguard Worker ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{ 4528*333d2b36SAndroid Build Coastguard Worker "bin/mybin", 4529*333d2b36SAndroid Build Coastguard Worker }) 4530*333d2b36SAndroid Build Coastguard Worker apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule") 4531*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so") 4532*333d2b36SAndroid Build Coastguard Worker } 4533*333d2b36SAndroid Build Coastguard Worker // libz doesn't provide stubs for vendor variant. 4534*333d2b36SAndroid Build Coastguard Worker { 4535*333d2b36SAndroid Build Coastguard Worker ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{ 4536*333d2b36SAndroid Build Coastguard Worker "bin/mybin", 4537*333d2b36SAndroid Build Coastguard Worker "lib64/libz.so", 4538*333d2b36SAndroid Build Coastguard Worker }) 4539*333d2b36SAndroid Build Coastguard Worker apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule") 4540*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "") 4541*333d2b36SAndroid Build Coastguard Worker } 4542*333d2b36SAndroid Build Coastguard Worker} 4543*333d2b36SAndroid Build Coastguard Worker 4544*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithTarget(t *testing.T) { 4545*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4546*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 4547*333d2b36SAndroid Build Coastguard Worker apex { 4548*333d2b36SAndroid Build Coastguard Worker name: "myapex", 4549*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 4550*333d2b36SAndroid Build Coastguard Worker updatable: false, 4551*333d2b36SAndroid Build Coastguard Worker multilib: { 4552*333d2b36SAndroid Build Coastguard Worker first: { 4553*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib_common"], 4554*333d2b36SAndroid Build Coastguard Worker } 4555*333d2b36SAndroid Build Coastguard Worker }, 4556*333d2b36SAndroid Build Coastguard Worker target: { 4557*333d2b36SAndroid Build Coastguard Worker android: { 4558*333d2b36SAndroid Build Coastguard Worker multilib: { 4559*333d2b36SAndroid Build Coastguard Worker first: { 4560*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 4561*333d2b36SAndroid Build Coastguard Worker } 4562*333d2b36SAndroid Build Coastguard Worker } 4563*333d2b36SAndroid Build Coastguard Worker }, 4564*333d2b36SAndroid Build Coastguard Worker host: { 4565*333d2b36SAndroid Build Coastguard Worker multilib: { 4566*333d2b36SAndroid Build Coastguard Worker first: { 4567*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib2"], 4568*333d2b36SAndroid Build Coastguard Worker } 4569*333d2b36SAndroid Build Coastguard Worker } 4570*333d2b36SAndroid Build Coastguard Worker } 4571*333d2b36SAndroid Build Coastguard Worker } 4572*333d2b36SAndroid Build Coastguard Worker } 4573*333d2b36SAndroid Build Coastguard Worker 4574*333d2b36SAndroid Build Coastguard Worker apex_key { 4575*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 4576*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 4577*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 4578*333d2b36SAndroid Build Coastguard Worker } 4579*333d2b36SAndroid Build Coastguard Worker 4580*333d2b36SAndroid Build Coastguard Worker cc_library { 4581*333d2b36SAndroid Build Coastguard Worker name: "mylib", 4582*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 4583*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 4584*333d2b36SAndroid Build Coastguard Worker stl: "none", 4585*333d2b36SAndroid Build Coastguard Worker // TODO: remove //apex_available:platform 4586*333d2b36SAndroid Build Coastguard Worker apex_available: [ 4587*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 4588*333d2b36SAndroid Build Coastguard Worker "myapex", 4589*333d2b36SAndroid Build Coastguard Worker ], 4590*333d2b36SAndroid Build Coastguard Worker } 4591*333d2b36SAndroid Build Coastguard Worker 4592*333d2b36SAndroid Build Coastguard Worker cc_library { 4593*333d2b36SAndroid Build Coastguard Worker name: "mylib_common", 4594*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 4595*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 4596*333d2b36SAndroid Build Coastguard Worker stl: "none", 4597*333d2b36SAndroid Build Coastguard Worker compile_multilib: "first", 4598*333d2b36SAndroid Build Coastguard Worker // TODO: remove //apex_available:platform 4599*333d2b36SAndroid Build Coastguard Worker apex_available: [ 4600*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 4601*333d2b36SAndroid Build Coastguard Worker "myapex", 4602*333d2b36SAndroid Build Coastguard Worker ], 4603*333d2b36SAndroid Build Coastguard Worker } 4604*333d2b36SAndroid Build Coastguard Worker 4605*333d2b36SAndroid Build Coastguard Worker cc_library { 4606*333d2b36SAndroid Build Coastguard Worker name: "mylib2", 4607*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 4608*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 4609*333d2b36SAndroid Build Coastguard Worker stl: "none", 4610*333d2b36SAndroid Build Coastguard Worker compile_multilib: "first", 4611*333d2b36SAndroid Build Coastguard Worker } 4612*333d2b36SAndroid Build Coastguard Worker `) 4613*333d2b36SAndroid Build Coastguard Worker 4614*333d2b36SAndroid Build Coastguard Worker apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule") 4615*333d2b36SAndroid Build Coastguard Worker copyCmds := apexRule.Args["copy_commands"] 4616*333d2b36SAndroid Build Coastguard Worker 4617*333d2b36SAndroid Build Coastguard Worker // Ensure that main rule creates an output 4618*333d2b36SAndroid Build Coastguard Worker ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned") 4619*333d2b36SAndroid Build Coastguard Worker 4620*333d2b36SAndroid Build Coastguard Worker // Ensure that apex variant is created for the direct dep 4621*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000") 4622*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000") 4623*333d2b36SAndroid Build Coastguard Worker ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000") 4624*333d2b36SAndroid Build Coastguard Worker 4625*333d2b36SAndroid Build Coastguard Worker // Ensure that both direct and indirect deps are copied into apex 4626*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/mylib.so") 4627*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so") 4628*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so") 4629*333d2b36SAndroid Build Coastguard Worker 4630*333d2b36SAndroid Build Coastguard Worker // Ensure that the platform variant ends with _shared 4631*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared") 4632*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared") 4633*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared") 4634*333d2b36SAndroid Build Coastguard Worker} 4635*333d2b36SAndroid Build Coastguard Worker 4636*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithArch(t *testing.T) { 4637*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4638*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 4639*333d2b36SAndroid Build Coastguard Worker apex { 4640*333d2b36SAndroid Build Coastguard Worker name: "myapex", 4641*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 4642*333d2b36SAndroid Build Coastguard Worker updatable: false, 4643*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib.generic"], 4644*333d2b36SAndroid Build Coastguard Worker arch: { 4645*333d2b36SAndroid Build Coastguard Worker arm64: { 4646*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib.arm64"], 4647*333d2b36SAndroid Build Coastguard Worker exclude_native_shared_libs: ["mylib.generic"], 4648*333d2b36SAndroid Build Coastguard Worker }, 4649*333d2b36SAndroid Build Coastguard Worker x86_64: { 4650*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib.x64"], 4651*333d2b36SAndroid Build Coastguard Worker exclude_native_shared_libs: ["mylib.generic"], 4652*333d2b36SAndroid Build Coastguard Worker }, 4653*333d2b36SAndroid Build Coastguard Worker } 4654*333d2b36SAndroid Build Coastguard Worker } 4655*333d2b36SAndroid Build Coastguard Worker 4656*333d2b36SAndroid Build Coastguard Worker apex_key { 4657*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 4658*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 4659*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 4660*333d2b36SAndroid Build Coastguard Worker } 4661*333d2b36SAndroid Build Coastguard Worker 4662*333d2b36SAndroid Build Coastguard Worker cc_library { 4663*333d2b36SAndroid Build Coastguard Worker name: "mylib.generic", 4664*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 4665*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 4666*333d2b36SAndroid Build Coastguard Worker stl: "none", 4667*333d2b36SAndroid Build Coastguard Worker // TODO: remove //apex_available:platform 4668*333d2b36SAndroid Build Coastguard Worker apex_available: [ 4669*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 4670*333d2b36SAndroid Build Coastguard Worker "myapex", 4671*333d2b36SAndroid Build Coastguard Worker ], 4672*333d2b36SAndroid Build Coastguard Worker } 4673*333d2b36SAndroid Build Coastguard Worker 4674*333d2b36SAndroid Build Coastguard Worker cc_library { 4675*333d2b36SAndroid Build Coastguard Worker name: "mylib.arm64", 4676*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 4677*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 4678*333d2b36SAndroid Build Coastguard Worker stl: "none", 4679*333d2b36SAndroid Build Coastguard Worker // TODO: remove //apex_available:platform 4680*333d2b36SAndroid Build Coastguard Worker apex_available: [ 4681*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 4682*333d2b36SAndroid Build Coastguard Worker "myapex", 4683*333d2b36SAndroid Build Coastguard Worker ], 4684*333d2b36SAndroid Build Coastguard Worker } 4685*333d2b36SAndroid Build Coastguard Worker 4686*333d2b36SAndroid Build Coastguard Worker cc_library { 4687*333d2b36SAndroid Build Coastguard Worker name: "mylib.x64", 4688*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 4689*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 4690*333d2b36SAndroid Build Coastguard Worker stl: "none", 4691*333d2b36SAndroid Build Coastguard Worker // TODO: remove //apex_available:platform 4692*333d2b36SAndroid Build Coastguard Worker apex_available: [ 4693*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 4694*333d2b36SAndroid Build Coastguard Worker "myapex", 4695*333d2b36SAndroid Build Coastguard Worker ], 4696*333d2b36SAndroid Build Coastguard Worker } 4697*333d2b36SAndroid Build Coastguard Worker `) 4698*333d2b36SAndroid Build Coastguard Worker 4699*333d2b36SAndroid Build Coastguard Worker apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule") 4700*333d2b36SAndroid Build Coastguard Worker copyCmds := apexRule.Args["copy_commands"] 4701*333d2b36SAndroid Build Coastguard Worker 4702*333d2b36SAndroid Build Coastguard Worker // Ensure that apex variant is created for the direct dep 4703*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000") 4704*333d2b36SAndroid Build Coastguard Worker ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000") 4705*333d2b36SAndroid Build Coastguard Worker ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000") 4706*333d2b36SAndroid Build Coastguard Worker 4707*333d2b36SAndroid Build Coastguard Worker // Ensure that both direct and indirect deps are copied into apex 4708*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so") 4709*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so") 4710*333d2b36SAndroid Build Coastguard Worker} 4711*333d2b36SAndroid Build Coastguard Worker 4712*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithShBinary(t *testing.T) { 4713*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4714*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 4715*333d2b36SAndroid Build Coastguard Worker apex { 4716*333d2b36SAndroid Build Coastguard Worker name: "myapex", 4717*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 4718*333d2b36SAndroid Build Coastguard Worker sh_binaries: ["myscript"], 4719*333d2b36SAndroid Build Coastguard Worker updatable: false, 4720*333d2b36SAndroid Build Coastguard Worker compile_multilib: "both", 4721*333d2b36SAndroid Build Coastguard Worker } 4722*333d2b36SAndroid Build Coastguard Worker 4723*333d2b36SAndroid Build Coastguard Worker apex_key { 4724*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 4725*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 4726*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 4727*333d2b36SAndroid Build Coastguard Worker } 4728*333d2b36SAndroid Build Coastguard Worker 4729*333d2b36SAndroid Build Coastguard Worker sh_binary { 4730*333d2b36SAndroid Build Coastguard Worker name: "myscript", 4731*333d2b36SAndroid Build Coastguard Worker src: "mylib.cpp", 4732*333d2b36SAndroid Build Coastguard Worker filename: "myscript.sh", 4733*333d2b36SAndroid Build Coastguard Worker sub_dir: "script", 4734*333d2b36SAndroid Build Coastguard Worker } 4735*333d2b36SAndroid Build Coastguard Worker `) 4736*333d2b36SAndroid Build Coastguard Worker 4737*333d2b36SAndroid Build Coastguard Worker apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule") 4738*333d2b36SAndroid Build Coastguard Worker copyCmds := apexRule.Args["copy_commands"] 4739*333d2b36SAndroid Build Coastguard Worker 4740*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh") 4741*333d2b36SAndroid Build Coastguard Worker} 4742*333d2b36SAndroid Build Coastguard Worker 4743*333d2b36SAndroid Build Coastguard Workerfunc TestApexInVariousPartition(t *testing.T) { 4744*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4745*333d2b36SAndroid Build Coastguard Worker testcases := []struct { 4746*333d2b36SAndroid Build Coastguard Worker propName, partition string 4747*333d2b36SAndroid Build Coastguard Worker }{ 4748*333d2b36SAndroid Build Coastguard Worker {"", "system"}, 4749*333d2b36SAndroid Build Coastguard Worker {"product_specific: true", "product"}, 4750*333d2b36SAndroid Build Coastguard Worker {"soc_specific: true", "vendor"}, 4751*333d2b36SAndroid Build Coastguard Worker {"proprietary: true", "vendor"}, 4752*333d2b36SAndroid Build Coastguard Worker {"vendor: true", "vendor"}, 4753*333d2b36SAndroid Build Coastguard Worker {"system_ext_specific: true", "system_ext"}, 4754*333d2b36SAndroid Build Coastguard Worker } 4755*333d2b36SAndroid Build Coastguard Worker for _, tc := range testcases { 4756*333d2b36SAndroid Build Coastguard Worker t.Run(tc.propName+":"+tc.partition, func(t *testing.T) { 4757*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4758*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 4759*333d2b36SAndroid Build Coastguard Worker apex { 4760*333d2b36SAndroid Build Coastguard Worker name: "myapex", 4761*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 4762*333d2b36SAndroid Build Coastguard Worker updatable: false, 4763*333d2b36SAndroid Build Coastguard Worker `+tc.propName+` 4764*333d2b36SAndroid Build Coastguard Worker } 4765*333d2b36SAndroid Build Coastguard Worker 4766*333d2b36SAndroid Build Coastguard Worker apex_key { 4767*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 4768*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 4769*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 4770*333d2b36SAndroid Build Coastguard Worker } 4771*333d2b36SAndroid Build Coastguard Worker `) 4772*333d2b36SAndroid Build Coastguard Worker 4773*333d2b36SAndroid Build Coastguard Worker apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) 4774*333d2b36SAndroid Build Coastguard Worker expected := "out/soong/target/product/test_device/" + tc.partition + "/apex" 4775*333d2b36SAndroid Build Coastguard Worker actual := apex.installDir.RelativeToTop().String() 4776*333d2b36SAndroid Build Coastguard Worker if actual != expected { 4777*333d2b36SAndroid Build Coastguard Worker t.Errorf("wrong install path. expected %q. actual %q", expected, actual) 4778*333d2b36SAndroid Build Coastguard Worker } 4779*333d2b36SAndroid Build Coastguard Worker }) 4780*333d2b36SAndroid Build Coastguard Worker } 4781*333d2b36SAndroid Build Coastguard Worker} 4782*333d2b36SAndroid Build Coastguard Worker 4783*333d2b36SAndroid Build Coastguard Workerfunc TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) { 4784*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4785*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 4786*333d2b36SAndroid Build Coastguard Worker apex { 4787*333d2b36SAndroid Build Coastguard Worker name: "myapex", 4788*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 4789*333d2b36SAndroid Build Coastguard Worker updatable: false, 4790*333d2b36SAndroid Build Coastguard Worker } 4791*333d2b36SAndroid Build Coastguard Worker 4792*333d2b36SAndroid Build Coastguard Worker apex_key { 4793*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 4794*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 4795*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 4796*333d2b36SAndroid Build Coastguard Worker } 4797*333d2b36SAndroid Build Coastguard Worker `) 4798*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests("myapex", "android_common_myapex") 4799*333d2b36SAndroid Build Coastguard Worker rule := module.Output("file_contexts") 4800*333d2b36SAndroid Build Coastguard Worker ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts") 4801*333d2b36SAndroid Build Coastguard Worker} 4802*333d2b36SAndroid Build Coastguard Worker 4803*333d2b36SAndroid Build Coastguard Workerfunc TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) { 4804*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4805*333d2b36SAndroid Build Coastguard Worker testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, ` 4806*333d2b36SAndroid Build Coastguard Worker apex { 4807*333d2b36SAndroid Build Coastguard Worker name: "myapex", 4808*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 4809*333d2b36SAndroid Build Coastguard Worker file_contexts: "my_own_file_contexts", 4810*333d2b36SAndroid Build Coastguard Worker updatable: false, 4811*333d2b36SAndroid Build Coastguard Worker } 4812*333d2b36SAndroid Build Coastguard Worker 4813*333d2b36SAndroid Build Coastguard Worker apex_key { 4814*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 4815*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 4816*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 4817*333d2b36SAndroid Build Coastguard Worker } 4818*333d2b36SAndroid Build Coastguard Worker `, withFiles(map[string][]byte{ 4819*333d2b36SAndroid Build Coastguard Worker "my_own_file_contexts": nil, 4820*333d2b36SAndroid Build Coastguard Worker })) 4821*333d2b36SAndroid Build Coastguard Worker} 4822*333d2b36SAndroid Build Coastguard Worker 4823*333d2b36SAndroid Build Coastguard Workerfunc TestFileContexts_ProductSpecificApexes(t *testing.T) { 4824*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4825*333d2b36SAndroid Build Coastguard Worker testApexError(t, `"myapex" .*: file_contexts: cannot find`, ` 4826*333d2b36SAndroid Build Coastguard Worker apex { 4827*333d2b36SAndroid Build Coastguard Worker name: "myapex", 4828*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 4829*333d2b36SAndroid Build Coastguard Worker product_specific: true, 4830*333d2b36SAndroid Build Coastguard Worker file_contexts: "product_specific_file_contexts", 4831*333d2b36SAndroid Build Coastguard Worker updatable: false, 4832*333d2b36SAndroid Build Coastguard Worker } 4833*333d2b36SAndroid Build Coastguard Worker 4834*333d2b36SAndroid Build Coastguard Worker apex_key { 4835*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 4836*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 4837*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 4838*333d2b36SAndroid Build Coastguard Worker } 4839*333d2b36SAndroid Build Coastguard Worker `) 4840*333d2b36SAndroid Build Coastguard Worker 4841*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 4842*333d2b36SAndroid Build Coastguard Worker apex { 4843*333d2b36SAndroid Build Coastguard Worker name: "myapex", 4844*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 4845*333d2b36SAndroid Build Coastguard Worker product_specific: true, 4846*333d2b36SAndroid Build Coastguard Worker file_contexts: "product_specific_file_contexts", 4847*333d2b36SAndroid Build Coastguard Worker updatable: false, 4848*333d2b36SAndroid Build Coastguard Worker } 4849*333d2b36SAndroid Build Coastguard Worker 4850*333d2b36SAndroid Build Coastguard Worker apex_key { 4851*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 4852*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 4853*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 4854*333d2b36SAndroid Build Coastguard Worker } 4855*333d2b36SAndroid Build Coastguard Worker `, withFiles(map[string][]byte{ 4856*333d2b36SAndroid Build Coastguard Worker "product_specific_file_contexts": nil, 4857*333d2b36SAndroid Build Coastguard Worker })) 4858*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests("myapex", "android_common_myapex") 4859*333d2b36SAndroid Build Coastguard Worker rule := module.Output("file_contexts") 4860*333d2b36SAndroid Build Coastguard Worker ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts") 4861*333d2b36SAndroid Build Coastguard Worker} 4862*333d2b36SAndroid Build Coastguard Worker 4863*333d2b36SAndroid Build Coastguard Workerfunc TestFileContexts_SetViaFileGroup(t *testing.T) { 4864*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4865*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 4866*333d2b36SAndroid Build Coastguard Worker apex { 4867*333d2b36SAndroid Build Coastguard Worker name: "myapex", 4868*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 4869*333d2b36SAndroid Build Coastguard Worker product_specific: true, 4870*333d2b36SAndroid Build Coastguard Worker file_contexts: ":my-file-contexts", 4871*333d2b36SAndroid Build Coastguard Worker updatable: false, 4872*333d2b36SAndroid Build Coastguard Worker } 4873*333d2b36SAndroid Build Coastguard Worker 4874*333d2b36SAndroid Build Coastguard Worker apex_key { 4875*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 4876*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 4877*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 4878*333d2b36SAndroid Build Coastguard Worker } 4879*333d2b36SAndroid Build Coastguard Worker 4880*333d2b36SAndroid Build Coastguard Worker filegroup { 4881*333d2b36SAndroid Build Coastguard Worker name: "my-file-contexts", 4882*333d2b36SAndroid Build Coastguard Worker srcs: ["product_specific_file_contexts"], 4883*333d2b36SAndroid Build Coastguard Worker } 4884*333d2b36SAndroid Build Coastguard Worker `, withFiles(map[string][]byte{ 4885*333d2b36SAndroid Build Coastguard Worker "product_specific_file_contexts": nil, 4886*333d2b36SAndroid Build Coastguard Worker })) 4887*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests("myapex", "android_common_myapex") 4888*333d2b36SAndroid Build Coastguard Worker rule := module.Output("file_contexts") 4889*333d2b36SAndroid Build Coastguard Worker ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts") 4890*333d2b36SAndroid Build Coastguard Worker} 4891*333d2b36SAndroid Build Coastguard Worker 4892*333d2b36SAndroid Build Coastguard Workerfunc TestApexKeyFromOtherModule(t *testing.T) { 4893*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4894*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 4895*333d2b36SAndroid Build Coastguard Worker apex_key { 4896*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 4897*333d2b36SAndroid Build Coastguard Worker public_key: ":my.avbpubkey", 4898*333d2b36SAndroid Build Coastguard Worker private_key: ":my.pem", 4899*333d2b36SAndroid Build Coastguard Worker product_specific: true, 4900*333d2b36SAndroid Build Coastguard Worker } 4901*333d2b36SAndroid Build Coastguard Worker 4902*333d2b36SAndroid Build Coastguard Worker filegroup { 4903*333d2b36SAndroid Build Coastguard Worker name: "my.avbpubkey", 4904*333d2b36SAndroid Build Coastguard Worker srcs: ["testkey2.avbpubkey"], 4905*333d2b36SAndroid Build Coastguard Worker } 4906*333d2b36SAndroid Build Coastguard Worker 4907*333d2b36SAndroid Build Coastguard Worker filegroup { 4908*333d2b36SAndroid Build Coastguard Worker name: "my.pem", 4909*333d2b36SAndroid Build Coastguard Worker srcs: ["testkey2.pem"], 4910*333d2b36SAndroid Build Coastguard Worker } 4911*333d2b36SAndroid Build Coastguard Worker `) 4912*333d2b36SAndroid Build Coastguard Worker 4913*333d2b36SAndroid Build Coastguard Worker apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey) 4914*333d2b36SAndroid Build Coastguard Worker expected_pubkey := "testkey2.avbpubkey" 4915*333d2b36SAndroid Build Coastguard Worker actual_pubkey := apex_key.publicKeyFile.String() 4916*333d2b36SAndroid Build Coastguard Worker if actual_pubkey != expected_pubkey { 4917*333d2b36SAndroid Build Coastguard Worker t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey) 4918*333d2b36SAndroid Build Coastguard Worker } 4919*333d2b36SAndroid Build Coastguard Worker expected_privkey := "testkey2.pem" 4920*333d2b36SAndroid Build Coastguard Worker actual_privkey := apex_key.privateKeyFile.String() 4921*333d2b36SAndroid Build Coastguard Worker if actual_privkey != expected_privkey { 4922*333d2b36SAndroid Build Coastguard Worker t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey) 4923*333d2b36SAndroid Build Coastguard Worker } 4924*333d2b36SAndroid Build Coastguard Worker} 4925*333d2b36SAndroid Build Coastguard Worker 4926*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuilt(t *testing.T) { 4927*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4928*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 4929*333d2b36SAndroid Build Coastguard Worker prebuilt_apex { 4930*333d2b36SAndroid Build Coastguard Worker name: "myapex", 4931*333d2b36SAndroid Build Coastguard Worker arch: { 4932*333d2b36SAndroid Build Coastguard Worker arm64: { 4933*333d2b36SAndroid Build Coastguard Worker src: "myapex-arm64.apex", 4934*333d2b36SAndroid Build Coastguard Worker }, 4935*333d2b36SAndroid Build Coastguard Worker arm: { 4936*333d2b36SAndroid Build Coastguard Worker src: "myapex-arm.apex", 4937*333d2b36SAndroid Build Coastguard Worker }, 4938*333d2b36SAndroid Build Coastguard Worker }, 4939*333d2b36SAndroid Build Coastguard Worker } 4940*333d2b36SAndroid Build Coastguard Worker `) 4941*333d2b36SAndroid Build Coastguard Worker 4942*333d2b36SAndroid Build Coastguard Worker testingModule := ctx.ModuleForTests("myapex", "android_common_myapex") 4943*333d2b36SAndroid Build Coastguard Worker prebuilt := testingModule.Module().(*Prebuilt) 4944*333d2b36SAndroid Build Coastguard Worker 4945*333d2b36SAndroid Build Coastguard Worker expectedInput := "myapex-arm64.apex" 4946*333d2b36SAndroid Build Coastguard Worker if prebuilt.inputApex.String() != expectedInput { 4947*333d2b36SAndroid Build Coastguard Worker t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String()) 4948*333d2b36SAndroid Build Coastguard Worker } 4949*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "Invalid provenance metadata file", 4950*333d2b36SAndroid Build Coastguard Worker prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto") 4951*333d2b36SAndroid Build Coastguard Worker rule := testingModule.Rule("genProvenanceMetaData") 4952*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String()) 4953*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String()) 4954*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"]) 4955*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"]) 4956*333d2b36SAndroid Build Coastguard Worker 4957*333d2b36SAndroid Build Coastguard Worker entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0] 4958*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0]) 4959*333d2b36SAndroid Build Coastguard Worker} 4960*333d2b36SAndroid Build Coastguard Worker 4961*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltMissingSrc(t *testing.T) { 4962*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4963*333d2b36SAndroid Build Coastguard Worker testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, ` 4964*333d2b36SAndroid Build Coastguard Worker prebuilt_apex { 4965*333d2b36SAndroid Build Coastguard Worker name: "myapex", 4966*333d2b36SAndroid Build Coastguard Worker } 4967*333d2b36SAndroid Build Coastguard Worker `) 4968*333d2b36SAndroid Build Coastguard Worker} 4969*333d2b36SAndroid Build Coastguard Worker 4970*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltFilenameOverride(t *testing.T) { 4971*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4972*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 4973*333d2b36SAndroid Build Coastguard Worker prebuilt_apex { 4974*333d2b36SAndroid Build Coastguard Worker name: "myapex", 4975*333d2b36SAndroid Build Coastguard Worker src: "myapex-arm.apex", 4976*333d2b36SAndroid Build Coastguard Worker filename: "notmyapex.apex", 4977*333d2b36SAndroid Build Coastguard Worker } 4978*333d2b36SAndroid Build Coastguard Worker `) 4979*333d2b36SAndroid Build Coastguard Worker 4980*333d2b36SAndroid Build Coastguard Worker testingModule := ctx.ModuleForTests("myapex", "android_common_myapex") 4981*333d2b36SAndroid Build Coastguard Worker p := testingModule.Module().(*Prebuilt) 4982*333d2b36SAndroid Build Coastguard Worker 4983*333d2b36SAndroid Build Coastguard Worker expected := "notmyapex.apex" 4984*333d2b36SAndroid Build Coastguard Worker if p.installFilename != expected { 4985*333d2b36SAndroid Build Coastguard Worker t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename) 4986*333d2b36SAndroid Build Coastguard Worker } 4987*333d2b36SAndroid Build Coastguard Worker rule := testingModule.Rule("genProvenanceMetaData") 4988*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String()) 4989*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String()) 4990*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"]) 4991*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"]) 4992*333d2b36SAndroid Build Coastguard Worker} 4993*333d2b36SAndroid Build Coastguard Worker 4994*333d2b36SAndroid Build Coastguard Workerfunc TestApexSetFilenameOverride(t *testing.T) { 4995*333d2b36SAndroid Build Coastguard Worker t.Parallel() 4996*333d2b36SAndroid Build Coastguard Worker testApex(t, ` 4997*333d2b36SAndroid Build Coastguard Worker apex_set { 4998*333d2b36SAndroid Build Coastguard Worker name: "com.company.android.myapex", 4999*333d2b36SAndroid Build Coastguard Worker apex_name: "com.android.myapex", 5000*333d2b36SAndroid Build Coastguard Worker set: "company-myapex.apks", 5001*333d2b36SAndroid Build Coastguard Worker filename: "com.company.android.myapex.apex" 5002*333d2b36SAndroid Build Coastguard Worker } 5003*333d2b36SAndroid Build Coastguard Worker `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex") 5004*333d2b36SAndroid Build Coastguard Worker 5005*333d2b36SAndroid Build Coastguard Worker testApex(t, ` 5006*333d2b36SAndroid Build Coastguard Worker apex_set { 5007*333d2b36SAndroid Build Coastguard Worker name: "com.company.android.myapex", 5008*333d2b36SAndroid Build Coastguard Worker apex_name: "com.android.myapex", 5009*333d2b36SAndroid Build Coastguard Worker set: "company-myapex.apks", 5010*333d2b36SAndroid Build Coastguard Worker filename: "com.company.android.myapex.capex" 5011*333d2b36SAndroid Build Coastguard Worker } 5012*333d2b36SAndroid Build Coastguard Worker `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex") 5013*333d2b36SAndroid Build Coastguard Worker 5014*333d2b36SAndroid Build Coastguard Worker testApexError(t, `filename should end in .apex or .capex for apex_set`, ` 5015*333d2b36SAndroid Build Coastguard Worker apex_set { 5016*333d2b36SAndroid Build Coastguard Worker name: "com.company.android.myapex", 5017*333d2b36SAndroid Build Coastguard Worker apex_name: "com.android.myapex", 5018*333d2b36SAndroid Build Coastguard Worker set: "company-myapex.apks", 5019*333d2b36SAndroid Build Coastguard Worker filename: "some-random-suffix" 5020*333d2b36SAndroid Build Coastguard Worker } 5021*333d2b36SAndroid Build Coastguard Worker `) 5022*333d2b36SAndroid Build Coastguard Worker} 5023*333d2b36SAndroid Build Coastguard Worker 5024*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltOverrides(t *testing.T) { 5025*333d2b36SAndroid Build Coastguard Worker t.Parallel() 5026*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 5027*333d2b36SAndroid Build Coastguard Worker prebuilt_apex { 5028*333d2b36SAndroid Build Coastguard Worker name: "myapex.prebuilt", 5029*333d2b36SAndroid Build Coastguard Worker src: "myapex-arm.apex", 5030*333d2b36SAndroid Build Coastguard Worker overrides: [ 5031*333d2b36SAndroid Build Coastguard Worker "myapex", 5032*333d2b36SAndroid Build Coastguard Worker ], 5033*333d2b36SAndroid Build Coastguard Worker } 5034*333d2b36SAndroid Build Coastguard Worker `) 5035*333d2b36SAndroid Build Coastguard Worker 5036*333d2b36SAndroid Build Coastguard Worker testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt") 5037*333d2b36SAndroid Build Coastguard Worker p := testingModule.Module().(*Prebuilt) 5038*333d2b36SAndroid Build Coastguard Worker 5039*333d2b36SAndroid Build Coastguard Worker expected := []string{"myapex"} 5040*333d2b36SAndroid Build Coastguard Worker actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"] 5041*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(actual, expected) { 5042*333d2b36SAndroid Build Coastguard Worker t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected) 5043*333d2b36SAndroid Build Coastguard Worker } 5044*333d2b36SAndroid Build Coastguard Worker rule := testingModule.Rule("genProvenanceMetaData") 5045*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String()) 5046*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String()) 5047*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"]) 5048*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"]) 5049*333d2b36SAndroid Build Coastguard Worker} 5050*333d2b36SAndroid Build Coastguard Worker 5051*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltApexName(t *testing.T) { 5052*333d2b36SAndroid Build Coastguard Worker t.Parallel() 5053*333d2b36SAndroid Build Coastguard Worker testApex(t, ` 5054*333d2b36SAndroid Build Coastguard Worker prebuilt_apex { 5055*333d2b36SAndroid Build Coastguard Worker name: "com.company.android.myapex", 5056*333d2b36SAndroid Build Coastguard Worker apex_name: "com.android.myapex", 5057*333d2b36SAndroid Build Coastguard Worker src: "company-myapex-arm.apex", 5058*333d2b36SAndroid Build Coastguard Worker } 5059*333d2b36SAndroid Build Coastguard Worker `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex") 5060*333d2b36SAndroid Build Coastguard Worker 5061*333d2b36SAndroid Build Coastguard Worker testApex(t, ` 5062*333d2b36SAndroid Build Coastguard Worker apex_set { 5063*333d2b36SAndroid Build Coastguard Worker name: "com.company.android.myapex", 5064*333d2b36SAndroid Build Coastguard Worker apex_name: "com.android.myapex", 5065*333d2b36SAndroid Build Coastguard Worker set: "company-myapex.apks", 5066*333d2b36SAndroid Build Coastguard Worker } 5067*333d2b36SAndroid Build Coastguard Worker `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex") 5068*333d2b36SAndroid Build Coastguard Worker} 5069*333d2b36SAndroid Build Coastguard Worker 5070*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) { 5071*333d2b36SAndroid Build Coastguard Worker t.Parallel() 5072*333d2b36SAndroid Build Coastguard Worker _ = android.GroupFixturePreparers( 5073*333d2b36SAndroid Build Coastguard Worker java.PrepareForTestWithJavaDefaultModules, 5074*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithApexBuildComponents, 5075*333d2b36SAndroid Build Coastguard Worker android.FixtureWithRootAndroidBp(` 5076*333d2b36SAndroid Build Coastguard Worker platform_bootclasspath { 5077*333d2b36SAndroid Build Coastguard Worker name: "platform-bootclasspath", 5078*333d2b36SAndroid Build Coastguard Worker fragments: [ 5079*333d2b36SAndroid Build Coastguard Worker { 5080*333d2b36SAndroid Build Coastguard Worker apex: "com.android.art", 5081*333d2b36SAndroid Build Coastguard Worker module: "art-bootclasspath-fragment", 5082*333d2b36SAndroid Build Coastguard Worker }, 5083*333d2b36SAndroid Build Coastguard Worker ], 5084*333d2b36SAndroid Build Coastguard Worker } 5085*333d2b36SAndroid Build Coastguard Worker 5086*333d2b36SAndroid Build Coastguard Worker prebuilt_apex { 5087*333d2b36SAndroid Build Coastguard Worker name: "com.company.android.art", 5088*333d2b36SAndroid Build Coastguard Worker apex_name: "com.android.art", 5089*333d2b36SAndroid Build Coastguard Worker src: "com.company.android.art-arm.apex", 5090*333d2b36SAndroid Build Coastguard Worker exported_bootclasspath_fragments: ["art-bootclasspath-fragment"], 5091*333d2b36SAndroid Build Coastguard Worker } 5092*333d2b36SAndroid Build Coastguard Worker 5093*333d2b36SAndroid Build Coastguard Worker prebuilt_bootclasspath_fragment { 5094*333d2b36SAndroid Build Coastguard Worker name: "art-bootclasspath-fragment", 5095*333d2b36SAndroid Build Coastguard Worker image_name: "art", 5096*333d2b36SAndroid Build Coastguard Worker contents: ["core-oj"], 5097*333d2b36SAndroid Build Coastguard Worker hidden_api: { 5098*333d2b36SAndroid Build Coastguard Worker annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv", 5099*333d2b36SAndroid Build Coastguard Worker metadata: "my-bootclasspath-fragment/metadata.csv", 5100*333d2b36SAndroid Build Coastguard Worker index: "my-bootclasspath-fragment/index.csv", 5101*333d2b36SAndroid Build Coastguard Worker stub_flags: "my-bootclasspath-fragment/stub-flags.csv", 5102*333d2b36SAndroid Build Coastguard Worker all_flags: "my-bootclasspath-fragment/all-flags.csv", 5103*333d2b36SAndroid Build Coastguard Worker }, 5104*333d2b36SAndroid Build Coastguard Worker } 5105*333d2b36SAndroid Build Coastguard Worker 5106*333d2b36SAndroid Build Coastguard Worker java_import { 5107*333d2b36SAndroid Build Coastguard Worker name: "core-oj", 5108*333d2b36SAndroid Build Coastguard Worker jars: ["prebuilt.jar"], 5109*333d2b36SAndroid Build Coastguard Worker } 5110*333d2b36SAndroid Build Coastguard Worker `), 5111*333d2b36SAndroid Build Coastguard Worker ).RunTest(t) 5112*333d2b36SAndroid Build Coastguard Worker} 5113*333d2b36SAndroid Build Coastguard Worker 5114*333d2b36SAndroid Build Coastguard Worker// A minimal context object for use with DexJarBuildPath 5115*333d2b36SAndroid Build Coastguard Workertype moduleErrorfTestCtx struct { 5116*333d2b36SAndroid Build Coastguard Worker} 5117*333d2b36SAndroid Build Coastguard Worker 5118*333d2b36SAndroid Build Coastguard Workerfunc (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) { 5119*333d2b36SAndroid Build Coastguard Worker} 5120*333d2b36SAndroid Build Coastguard Worker 5121*333d2b36SAndroid Build Coastguard Workerfunc TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) { 5122*333d2b36SAndroid Build Coastguard Worker t.Parallel() 5123*333d2b36SAndroid Build Coastguard Worker preparer := android.GroupFixturePreparers( 5124*333d2b36SAndroid Build Coastguard Worker java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"), 5125*333d2b36SAndroid Build Coastguard Worker // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding 5126*333d2b36SAndroid Build Coastguard Worker // is disabled. 5127*333d2b36SAndroid Build Coastguard Worker android.FixtureAddTextFile("frameworks/base/Android.bp", ""), 5128*333d2b36SAndroid Build Coastguard Worker 5129*333d2b36SAndroid Build Coastguard Worker // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi 5130*333d2b36SAndroid Build Coastguard Worker // file creation. 5131*333d2b36SAndroid Build Coastguard Worker java.FixtureConfigureBootJars("platform:foo"), 5132*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyMockFS(func(fs android.MockFS) { 5133*333d2b36SAndroid Build Coastguard Worker fs["platform/Android.bp"] = []byte(` 5134*333d2b36SAndroid Build Coastguard Worker java_library { 5135*333d2b36SAndroid Build Coastguard Worker name: "foo", 5136*333d2b36SAndroid Build Coastguard Worker srcs: ["Test.java"], 5137*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 5138*333d2b36SAndroid Build Coastguard Worker } 5139*333d2b36SAndroid Build Coastguard Worker `) 5140*333d2b36SAndroid Build Coastguard Worker fs["platform/Test.java"] = nil 5141*333d2b36SAndroid Build Coastguard Worker }), 5142*333d2b36SAndroid Build Coastguard Worker ) 5143*333d2b36SAndroid Build Coastguard Worker 5144*333d2b36SAndroid Build Coastguard Worker checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) { 5145*333d2b36SAndroid Build Coastguard Worker t.Helper() 5146*333d2b36SAndroid Build Coastguard Worker platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common") 5147*333d2b36SAndroid Build Coastguard Worker var rule android.TestingBuildParams 5148*333d2b36SAndroid Build Coastguard Worker 5149*333d2b36SAndroid Build Coastguard Worker rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv") 5150*333d2b36SAndroid Build Coastguard Worker java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule) 5151*333d2b36SAndroid Build Coastguard Worker } 5152*333d2b36SAndroid Build Coastguard Worker 5153*333d2b36SAndroid Build Coastguard Worker checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) { 5154*333d2b36SAndroid Build Coastguard Worker t.Helper() 5155*333d2b36SAndroid Build Coastguard Worker platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common") 5156*333d2b36SAndroid Build Coastguard Worker var rule android.TestingBuildParams 5157*333d2b36SAndroid Build Coastguard Worker 5158*333d2b36SAndroid Build Coastguard Worker rule = platformBootclasspath.Output("hiddenapi-index.csv") 5159*333d2b36SAndroid Build Coastguard Worker java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule) 5160*333d2b36SAndroid Build Coastguard Worker } 5161*333d2b36SAndroid Build Coastguard Worker 5162*333d2b36SAndroid Build Coastguard Worker fragment := java.ApexVariantReference{ 5163*333d2b36SAndroid Build Coastguard Worker Apex: proptools.StringPtr("myapex"), 5164*333d2b36SAndroid Build Coastguard Worker Module: proptools.StringPtr("my-bootclasspath-fragment"), 5165*333d2b36SAndroid Build Coastguard Worker } 5166*333d2b36SAndroid Build Coastguard Worker 5167*333d2b36SAndroid Build Coastguard Worker t.Run("prebuilt only", func(t *testing.T) { 5168*333d2b36SAndroid Build Coastguard Worker t.Parallel() 5169*333d2b36SAndroid Build Coastguard Worker bp := ` 5170*333d2b36SAndroid Build Coastguard Worker prebuilt_apex { 5171*333d2b36SAndroid Build Coastguard Worker name: "myapex", 5172*333d2b36SAndroid Build Coastguard Worker arch: { 5173*333d2b36SAndroid Build Coastguard Worker arm64: { 5174*333d2b36SAndroid Build Coastguard Worker src: "myapex-arm64.apex", 5175*333d2b36SAndroid Build Coastguard Worker }, 5176*333d2b36SAndroid Build Coastguard Worker arm: { 5177*333d2b36SAndroid Build Coastguard Worker src: "myapex-arm.apex", 5178*333d2b36SAndroid Build Coastguard Worker }, 5179*333d2b36SAndroid Build Coastguard Worker }, 5180*333d2b36SAndroid Build Coastguard Worker exported_bootclasspath_fragments: ["my-bootclasspath-fragment"], 5181*333d2b36SAndroid Build Coastguard Worker } 5182*333d2b36SAndroid Build Coastguard Worker 5183*333d2b36SAndroid Build Coastguard Worker prebuilt_bootclasspath_fragment { 5184*333d2b36SAndroid Build Coastguard Worker name: "my-bootclasspath-fragment", 5185*333d2b36SAndroid Build Coastguard Worker contents: ["libfoo", "libbar"], 5186*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5187*333d2b36SAndroid Build Coastguard Worker hidden_api: { 5188*333d2b36SAndroid Build Coastguard Worker annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv", 5189*333d2b36SAndroid Build Coastguard Worker metadata: "my-bootclasspath-fragment/metadata.csv", 5190*333d2b36SAndroid Build Coastguard Worker index: "my-bootclasspath-fragment/index.csv", 5191*333d2b36SAndroid Build Coastguard Worker signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv", 5192*333d2b36SAndroid Build Coastguard Worker filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv", 5193*333d2b36SAndroid Build Coastguard Worker filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv", 5194*333d2b36SAndroid Build Coastguard Worker }, 5195*333d2b36SAndroid Build Coastguard Worker } 5196*333d2b36SAndroid Build Coastguard Worker 5197*333d2b36SAndroid Build Coastguard Worker java_sdk_library_import { 5198*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 5199*333d2b36SAndroid Build Coastguard Worker public: { 5200*333d2b36SAndroid Build Coastguard Worker jars: ["libfoo.jar"], 5201*333d2b36SAndroid Build Coastguard Worker }, 5202*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5203*333d2b36SAndroid Build Coastguard Worker shared_library: false, 5204*333d2b36SAndroid Build Coastguard Worker permitted_packages: ["foo"], 5205*333d2b36SAndroid Build Coastguard Worker } 5206*333d2b36SAndroid Build Coastguard Worker 5207*333d2b36SAndroid Build Coastguard Worker java_sdk_library_import { 5208*333d2b36SAndroid Build Coastguard Worker name: "libbar", 5209*333d2b36SAndroid Build Coastguard Worker public: { 5210*333d2b36SAndroid Build Coastguard Worker jars: ["libbar.jar"], 5211*333d2b36SAndroid Build Coastguard Worker }, 5212*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5213*333d2b36SAndroid Build Coastguard Worker shared_library: false, 5214*333d2b36SAndroid Build Coastguard Worker permitted_packages: ["bar"], 5215*333d2b36SAndroid Build Coastguard Worker } 5216*333d2b36SAndroid Build Coastguard Worker ` 5217*333d2b36SAndroid Build Coastguard Worker 5218*333d2b36SAndroid Build Coastguard Worker ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment) 5219*333d2b36SAndroid Build Coastguard Worker 5220*333d2b36SAndroid Build Coastguard Worker // Verify the correct module jars contribute to the hiddenapi index file. 5221*333d2b36SAndroid Build Coastguard Worker checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`) 5222*333d2b36SAndroid Build Coastguard Worker checkHiddenAPIIndexFromFlagsInputs(t, ctx, ` 5223*333d2b36SAndroid Build Coastguard Worker my-bootclasspath-fragment/index.csv 5224*333d2b36SAndroid Build Coastguard Worker out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv 5225*333d2b36SAndroid Build Coastguard Worker out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv 5226*333d2b36SAndroid Build Coastguard Worker `) 5227*333d2b36SAndroid Build Coastguard Worker }) 5228*333d2b36SAndroid Build Coastguard Worker 5229*333d2b36SAndroid Build Coastguard Worker t.Run("apex_set only", func(t *testing.T) { 5230*333d2b36SAndroid Build Coastguard Worker t.Parallel() 5231*333d2b36SAndroid Build Coastguard Worker bp := ` 5232*333d2b36SAndroid Build Coastguard Worker apex_set { 5233*333d2b36SAndroid Build Coastguard Worker name: "myapex", 5234*333d2b36SAndroid Build Coastguard Worker set: "myapex.apks", 5235*333d2b36SAndroid Build Coastguard Worker exported_bootclasspath_fragments: ["my-bootclasspath-fragment"], 5236*333d2b36SAndroid Build Coastguard Worker exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"], 5237*333d2b36SAndroid Build Coastguard Worker } 5238*333d2b36SAndroid Build Coastguard Worker 5239*333d2b36SAndroid Build Coastguard Worker prebuilt_bootclasspath_fragment { 5240*333d2b36SAndroid Build Coastguard Worker name: "my-bootclasspath-fragment", 5241*333d2b36SAndroid Build Coastguard Worker contents: ["libfoo", "libbar"], 5242*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5243*333d2b36SAndroid Build Coastguard Worker hidden_api: { 5244*333d2b36SAndroid Build Coastguard Worker annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv", 5245*333d2b36SAndroid Build Coastguard Worker metadata: "my-bootclasspath-fragment/metadata.csv", 5246*333d2b36SAndroid Build Coastguard Worker index: "my-bootclasspath-fragment/index.csv", 5247*333d2b36SAndroid Build Coastguard Worker signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv", 5248*333d2b36SAndroid Build Coastguard Worker filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv", 5249*333d2b36SAndroid Build Coastguard Worker filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv", 5250*333d2b36SAndroid Build Coastguard Worker }, 5251*333d2b36SAndroid Build Coastguard Worker } 5252*333d2b36SAndroid Build Coastguard Worker 5253*333d2b36SAndroid Build Coastguard Worker prebuilt_systemserverclasspath_fragment { 5254*333d2b36SAndroid Build Coastguard Worker name: "my-systemserverclasspath-fragment", 5255*333d2b36SAndroid Build Coastguard Worker contents: ["libbaz"], 5256*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5257*333d2b36SAndroid Build Coastguard Worker } 5258*333d2b36SAndroid Build Coastguard Worker 5259*333d2b36SAndroid Build Coastguard Worker java_sdk_library_import { 5260*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 5261*333d2b36SAndroid Build Coastguard Worker public: { 5262*333d2b36SAndroid Build Coastguard Worker jars: ["libfoo.jar"], 5263*333d2b36SAndroid Build Coastguard Worker }, 5264*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5265*333d2b36SAndroid Build Coastguard Worker shared_library: false, 5266*333d2b36SAndroid Build Coastguard Worker permitted_packages: ["libfoo"], 5267*333d2b36SAndroid Build Coastguard Worker } 5268*333d2b36SAndroid Build Coastguard Worker 5269*333d2b36SAndroid Build Coastguard Worker 5270*333d2b36SAndroid Build Coastguard Worker java_sdk_library_import { 5271*333d2b36SAndroid Build Coastguard Worker name: "libbar", 5272*333d2b36SAndroid Build Coastguard Worker public: { 5273*333d2b36SAndroid Build Coastguard Worker jars: ["libbar.jar"], 5274*333d2b36SAndroid Build Coastguard Worker }, 5275*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5276*333d2b36SAndroid Build Coastguard Worker shared_library: false, 5277*333d2b36SAndroid Build Coastguard Worker permitted_packages: ["bar"], 5278*333d2b36SAndroid Build Coastguard Worker } 5279*333d2b36SAndroid Build Coastguard Worker 5280*333d2b36SAndroid Build Coastguard Worker java_sdk_library_import { 5281*333d2b36SAndroid Build Coastguard Worker name: "libbaz", 5282*333d2b36SAndroid Build Coastguard Worker public: { 5283*333d2b36SAndroid Build Coastguard Worker jars: ["libbaz.jar"], 5284*333d2b36SAndroid Build Coastguard Worker }, 5285*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5286*333d2b36SAndroid Build Coastguard Worker shared_library: false, 5287*333d2b36SAndroid Build Coastguard Worker permitted_packages: ["baz"], 5288*333d2b36SAndroid Build Coastguard Worker } 5289*333d2b36SAndroid Build Coastguard Worker ` 5290*333d2b36SAndroid Build Coastguard Worker 5291*333d2b36SAndroid Build Coastguard Worker ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment) 5292*333d2b36SAndroid Build Coastguard Worker 5293*333d2b36SAndroid Build Coastguard Worker // Verify the correct module jars contribute to the hiddenapi index file. 5294*333d2b36SAndroid Build Coastguard Worker checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`) 5295*333d2b36SAndroid Build Coastguard Worker checkHiddenAPIIndexFromFlagsInputs(t, ctx, ` 5296*333d2b36SAndroid Build Coastguard Worker my-bootclasspath-fragment/index.csv 5297*333d2b36SAndroid Build Coastguard Worker out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv 5298*333d2b36SAndroid Build Coastguard Worker out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv 5299*333d2b36SAndroid Build Coastguard Worker `) 5300*333d2b36SAndroid Build Coastguard Worker 5301*333d2b36SAndroid Build Coastguard Worker myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module() 5302*333d2b36SAndroid Build Coastguard Worker 5303*333d2b36SAndroid Build Coastguard Worker overrideNames := []string{ 5304*333d2b36SAndroid Build Coastguard Worker "", 5305*333d2b36SAndroid Build Coastguard Worker "myjavalib.myapex", 5306*333d2b36SAndroid Build Coastguard Worker "libfoo.myapex", 5307*333d2b36SAndroid Build Coastguard Worker "libbar.myapex", 5308*333d2b36SAndroid Build Coastguard Worker "libbaz.myapex", 5309*333d2b36SAndroid Build Coastguard Worker } 5310*333d2b36SAndroid Build Coastguard Worker mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex) 5311*333d2b36SAndroid Build Coastguard Worker for i, e := range mkEntries { 5312*333d2b36SAndroid Build Coastguard Worker g := e.OverrideName 5313*333d2b36SAndroid Build Coastguard Worker if w := overrideNames[i]; w != g { 5314*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected override name %q, got %q", w, g) 5315*333d2b36SAndroid Build Coastguard Worker } 5316*333d2b36SAndroid Build Coastguard Worker } 5317*333d2b36SAndroid Build Coastguard Worker 5318*333d2b36SAndroid Build Coastguard Worker }) 5319*333d2b36SAndroid Build Coastguard Worker 5320*333d2b36SAndroid Build Coastguard Worker t.Run("prebuilt with source library preferred", func(t *testing.T) { 5321*333d2b36SAndroid Build Coastguard Worker t.Parallel() 5322*333d2b36SAndroid Build Coastguard Worker bp := ` 5323*333d2b36SAndroid Build Coastguard Worker prebuilt_apex { 5324*333d2b36SAndroid Build Coastguard Worker name: "myapex", 5325*333d2b36SAndroid Build Coastguard Worker arch: { 5326*333d2b36SAndroid Build Coastguard Worker arm64: { 5327*333d2b36SAndroid Build Coastguard Worker src: "myapex-arm64.apex", 5328*333d2b36SAndroid Build Coastguard Worker }, 5329*333d2b36SAndroid Build Coastguard Worker arm: { 5330*333d2b36SAndroid Build Coastguard Worker src: "myapex-arm.apex", 5331*333d2b36SAndroid Build Coastguard Worker }, 5332*333d2b36SAndroid Build Coastguard Worker }, 5333*333d2b36SAndroid Build Coastguard Worker exported_bootclasspath_fragments: ["my-bootclasspath-fragment"], 5334*333d2b36SAndroid Build Coastguard Worker } 5335*333d2b36SAndroid Build Coastguard Worker 5336*333d2b36SAndroid Build Coastguard Worker prebuilt_bootclasspath_fragment { 5337*333d2b36SAndroid Build Coastguard Worker name: "my-bootclasspath-fragment", 5338*333d2b36SAndroid Build Coastguard Worker contents: ["libfoo", "libbar"], 5339*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5340*333d2b36SAndroid Build Coastguard Worker hidden_api: { 5341*333d2b36SAndroid Build Coastguard Worker annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv", 5342*333d2b36SAndroid Build Coastguard Worker metadata: "my-bootclasspath-fragment/metadata.csv", 5343*333d2b36SAndroid Build Coastguard Worker index: "my-bootclasspath-fragment/index.csv", 5344*333d2b36SAndroid Build Coastguard Worker stub_flags: "my-bootclasspath-fragment/stub-flags.csv", 5345*333d2b36SAndroid Build Coastguard Worker all_flags: "my-bootclasspath-fragment/all-flags.csv", 5346*333d2b36SAndroid Build Coastguard Worker }, 5347*333d2b36SAndroid Build Coastguard Worker } 5348*333d2b36SAndroid Build Coastguard Worker 5349*333d2b36SAndroid Build Coastguard Worker java_import { 5350*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 5351*333d2b36SAndroid Build Coastguard Worker jars: ["libfoo.jar"], 5352*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5353*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_current", 5354*333d2b36SAndroid Build Coastguard Worker } 5355*333d2b36SAndroid Build Coastguard Worker 5356*333d2b36SAndroid Build Coastguard Worker java_library { 5357*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 5358*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 5359*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5360*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_current", 5361*333d2b36SAndroid Build Coastguard Worker } 5362*333d2b36SAndroid Build Coastguard Worker 5363*333d2b36SAndroid Build Coastguard Worker java_sdk_library_import { 5364*333d2b36SAndroid Build Coastguard Worker name: "libbar", 5365*333d2b36SAndroid Build Coastguard Worker public: { 5366*333d2b36SAndroid Build Coastguard Worker jars: ["libbar.jar"], 5367*333d2b36SAndroid Build Coastguard Worker }, 5368*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5369*333d2b36SAndroid Build Coastguard Worker shared_library: false, 5370*333d2b36SAndroid Build Coastguard Worker } 5371*333d2b36SAndroid Build Coastguard Worker 5372*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 5373*333d2b36SAndroid Build Coastguard Worker name: "libbar", 5374*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 5375*333d2b36SAndroid Build Coastguard Worker unsafe_ignore_missing_latest_api: true, 5376*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5377*333d2b36SAndroid Build Coastguard Worker } 5378*333d2b36SAndroid Build Coastguard Worker ` 5379*333d2b36SAndroid Build Coastguard Worker 5380*333d2b36SAndroid Build Coastguard Worker // In this test the source (java_library) libfoo is active since the 5381*333d2b36SAndroid Build Coastguard Worker // prebuilt (java_import) defaults to prefer:false. However the 5382*333d2b36SAndroid Build Coastguard Worker // prebuilt_apex module always depends on the prebuilt, and so it doesn't 5383*333d2b36SAndroid Build Coastguard Worker // find the dex boot jar in it. We either need to disable the source libfoo 5384*333d2b36SAndroid Build Coastguard Worker // or make the prebuilt libfoo preferred. 5385*333d2b36SAndroid Build Coastguard Worker testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment) 5386*333d2b36SAndroid Build Coastguard Worker // dexbootjar check is skipped if AllowMissingDependencies is true 5387*333d2b36SAndroid Build Coastguard Worker preparerAllowMissingDeps := android.GroupFixturePreparers( 5388*333d2b36SAndroid Build Coastguard Worker preparer, 5389*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithAllowMissingDependencies, 5390*333d2b36SAndroid Build Coastguard Worker ) 5391*333d2b36SAndroid Build Coastguard Worker testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment) 5392*333d2b36SAndroid Build Coastguard Worker }) 5393*333d2b36SAndroid Build Coastguard Worker 5394*333d2b36SAndroid Build Coastguard Worker t.Run("prebuilt library preferred with source", func(t *testing.T) { 5395*333d2b36SAndroid Build Coastguard Worker t.Parallel() 5396*333d2b36SAndroid Build Coastguard Worker bp := ` 5397*333d2b36SAndroid Build Coastguard Worker apex { 5398*333d2b36SAndroid Build Coastguard Worker name: "myapex", 5399*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 5400*333d2b36SAndroid Build Coastguard Worker updatable: false, 5401*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragments: ["my-bootclasspath-fragment"], 5402*333d2b36SAndroid Build Coastguard Worker } 5403*333d2b36SAndroid Build Coastguard Worker 5404*333d2b36SAndroid Build Coastguard Worker apex_key { 5405*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 5406*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 5407*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 5408*333d2b36SAndroid Build Coastguard Worker } 5409*333d2b36SAndroid Build Coastguard Worker 5410*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragment { 5411*333d2b36SAndroid Build Coastguard Worker name: "my-bootclasspath-fragment", 5412*333d2b36SAndroid Build Coastguard Worker contents: ["libfoo", "libbar"], 5413*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5414*333d2b36SAndroid Build Coastguard Worker hidden_api: { 5415*333d2b36SAndroid Build Coastguard Worker split_packages: ["*"], 5416*333d2b36SAndroid Build Coastguard Worker }, 5417*333d2b36SAndroid Build Coastguard Worker } 5418*333d2b36SAndroid Build Coastguard Worker 5419*333d2b36SAndroid Build Coastguard Worker prebuilt_apex { 5420*333d2b36SAndroid Build Coastguard Worker name: "myapex", 5421*333d2b36SAndroid Build Coastguard Worker arch: { 5422*333d2b36SAndroid Build Coastguard Worker arm64: { 5423*333d2b36SAndroid Build Coastguard Worker src: "myapex-arm64.apex", 5424*333d2b36SAndroid Build Coastguard Worker }, 5425*333d2b36SAndroid Build Coastguard Worker arm: { 5426*333d2b36SAndroid Build Coastguard Worker src: "myapex-arm.apex", 5427*333d2b36SAndroid Build Coastguard Worker }, 5428*333d2b36SAndroid Build Coastguard Worker }, 5429*333d2b36SAndroid Build Coastguard Worker exported_bootclasspath_fragments: ["my-bootclasspath-fragment"], 5430*333d2b36SAndroid Build Coastguard Worker } 5431*333d2b36SAndroid Build Coastguard Worker 5432*333d2b36SAndroid Build Coastguard Worker prebuilt_bootclasspath_fragment { 5433*333d2b36SAndroid Build Coastguard Worker name: "my-bootclasspath-fragment", 5434*333d2b36SAndroid Build Coastguard Worker prefer: true, 5435*333d2b36SAndroid Build Coastguard Worker contents: ["libfoo", "libbar"], 5436*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5437*333d2b36SAndroid Build Coastguard Worker hidden_api: { 5438*333d2b36SAndroid Build Coastguard Worker annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv", 5439*333d2b36SAndroid Build Coastguard Worker metadata: "my-bootclasspath-fragment/metadata.csv", 5440*333d2b36SAndroid Build Coastguard Worker index: "my-bootclasspath-fragment/index.csv", 5441*333d2b36SAndroid Build Coastguard Worker signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv", 5442*333d2b36SAndroid Build Coastguard Worker filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv", 5443*333d2b36SAndroid Build Coastguard Worker filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv", 5444*333d2b36SAndroid Build Coastguard Worker }, 5445*333d2b36SAndroid Build Coastguard Worker } 5446*333d2b36SAndroid Build Coastguard Worker 5447*333d2b36SAndroid Build Coastguard Worker java_sdk_library_import { 5448*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 5449*333d2b36SAndroid Build Coastguard Worker prefer: true, 5450*333d2b36SAndroid Build Coastguard Worker public: { 5451*333d2b36SAndroid Build Coastguard Worker jars: ["libfoo.jar"], 5452*333d2b36SAndroid Build Coastguard Worker }, 5453*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5454*333d2b36SAndroid Build Coastguard Worker shared_library: false, 5455*333d2b36SAndroid Build Coastguard Worker permitted_packages: ["libfoo"], 5456*333d2b36SAndroid Build Coastguard Worker } 5457*333d2b36SAndroid Build Coastguard Worker 5458*333d2b36SAndroid Build Coastguard Worker java_library { 5459*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 5460*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 5461*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5462*333d2b36SAndroid Build Coastguard Worker installable: true, 5463*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_current", 5464*333d2b36SAndroid Build Coastguard Worker } 5465*333d2b36SAndroid Build Coastguard Worker 5466*333d2b36SAndroid Build Coastguard Worker java_sdk_library_import { 5467*333d2b36SAndroid Build Coastguard Worker name: "libbar", 5468*333d2b36SAndroid Build Coastguard Worker prefer: true, 5469*333d2b36SAndroid Build Coastguard Worker public: { 5470*333d2b36SAndroid Build Coastguard Worker jars: ["libbar.jar"], 5471*333d2b36SAndroid Build Coastguard Worker }, 5472*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5473*333d2b36SAndroid Build Coastguard Worker shared_library: false, 5474*333d2b36SAndroid Build Coastguard Worker permitted_packages: ["bar"], 5475*333d2b36SAndroid Build Coastguard Worker } 5476*333d2b36SAndroid Build Coastguard Worker 5477*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 5478*333d2b36SAndroid Build Coastguard Worker name: "libbar", 5479*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 5480*333d2b36SAndroid Build Coastguard Worker unsafe_ignore_missing_latest_api: true, 5481*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5482*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 5483*333d2b36SAndroid Build Coastguard Worker } 5484*333d2b36SAndroid Build Coastguard Worker ` 5485*333d2b36SAndroid Build Coastguard Worker 5486*333d2b36SAndroid Build Coastguard Worker ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment) 5487*333d2b36SAndroid Build Coastguard Worker 5488*333d2b36SAndroid Build Coastguard Worker // Verify the correct module jars contribute to the hiddenapi index file. 5489*333d2b36SAndroid Build Coastguard Worker checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`) 5490*333d2b36SAndroid Build Coastguard Worker checkHiddenAPIIndexFromFlagsInputs(t, ctx, ` 5491*333d2b36SAndroid Build Coastguard Worker my-bootclasspath-fragment/index.csv 5492*333d2b36SAndroid Build Coastguard Worker out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv 5493*333d2b36SAndroid Build Coastguard Worker out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv 5494*333d2b36SAndroid Build Coastguard Worker `) 5495*333d2b36SAndroid Build Coastguard Worker }) 5496*333d2b36SAndroid Build Coastguard Worker 5497*333d2b36SAndroid Build Coastguard Worker t.Run("prebuilt with source apex preferred", func(t *testing.T) { 5498*333d2b36SAndroid Build Coastguard Worker t.Parallel() 5499*333d2b36SAndroid Build Coastguard Worker bp := ` 5500*333d2b36SAndroid Build Coastguard Worker apex { 5501*333d2b36SAndroid Build Coastguard Worker name: "myapex", 5502*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 5503*333d2b36SAndroid Build Coastguard Worker updatable: false, 5504*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragments: ["my-bootclasspath-fragment"], 5505*333d2b36SAndroid Build Coastguard Worker } 5506*333d2b36SAndroid Build Coastguard Worker 5507*333d2b36SAndroid Build Coastguard Worker apex_key { 5508*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 5509*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 5510*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 5511*333d2b36SAndroid Build Coastguard Worker } 5512*333d2b36SAndroid Build Coastguard Worker 5513*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragment { 5514*333d2b36SAndroid Build Coastguard Worker name: "my-bootclasspath-fragment", 5515*333d2b36SAndroid Build Coastguard Worker contents: ["libfoo", "libbar"], 5516*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5517*333d2b36SAndroid Build Coastguard Worker hidden_api: { 5518*333d2b36SAndroid Build Coastguard Worker split_packages: ["*"], 5519*333d2b36SAndroid Build Coastguard Worker }, 5520*333d2b36SAndroid Build Coastguard Worker } 5521*333d2b36SAndroid Build Coastguard Worker 5522*333d2b36SAndroid Build Coastguard Worker prebuilt_apex { 5523*333d2b36SAndroid Build Coastguard Worker name: "myapex", 5524*333d2b36SAndroid Build Coastguard Worker arch: { 5525*333d2b36SAndroid Build Coastguard Worker arm64: { 5526*333d2b36SAndroid Build Coastguard Worker src: "myapex-arm64.apex", 5527*333d2b36SAndroid Build Coastguard Worker }, 5528*333d2b36SAndroid Build Coastguard Worker arm: { 5529*333d2b36SAndroid Build Coastguard Worker src: "myapex-arm.apex", 5530*333d2b36SAndroid Build Coastguard Worker }, 5531*333d2b36SAndroid Build Coastguard Worker }, 5532*333d2b36SAndroid Build Coastguard Worker exported_bootclasspath_fragments: ["my-bootclasspath-fragment"], 5533*333d2b36SAndroid Build Coastguard Worker } 5534*333d2b36SAndroid Build Coastguard Worker 5535*333d2b36SAndroid Build Coastguard Worker prebuilt_bootclasspath_fragment { 5536*333d2b36SAndroid Build Coastguard Worker name: "my-bootclasspath-fragment", 5537*333d2b36SAndroid Build Coastguard Worker contents: ["libfoo", "libbar"], 5538*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5539*333d2b36SAndroid Build Coastguard Worker hidden_api: { 5540*333d2b36SAndroid Build Coastguard Worker annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv", 5541*333d2b36SAndroid Build Coastguard Worker metadata: "my-bootclasspath-fragment/metadata.csv", 5542*333d2b36SAndroid Build Coastguard Worker index: "my-bootclasspath-fragment/index.csv", 5543*333d2b36SAndroid Build Coastguard Worker signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv", 5544*333d2b36SAndroid Build Coastguard Worker filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv", 5545*333d2b36SAndroid Build Coastguard Worker filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv", 5546*333d2b36SAndroid Build Coastguard Worker }, 5547*333d2b36SAndroid Build Coastguard Worker } 5548*333d2b36SAndroid Build Coastguard Worker 5549*333d2b36SAndroid Build Coastguard Worker java_import { 5550*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 5551*333d2b36SAndroid Build Coastguard Worker jars: ["libfoo.jar"], 5552*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5553*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_current", 5554*333d2b36SAndroid Build Coastguard Worker } 5555*333d2b36SAndroid Build Coastguard Worker 5556*333d2b36SAndroid Build Coastguard Worker java_library { 5557*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 5558*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 5559*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5560*333d2b36SAndroid Build Coastguard Worker permitted_packages: ["foo"], 5561*333d2b36SAndroid Build Coastguard Worker installable: true, 5562*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_current", 5563*333d2b36SAndroid Build Coastguard Worker } 5564*333d2b36SAndroid Build Coastguard Worker 5565*333d2b36SAndroid Build Coastguard Worker java_sdk_library_import { 5566*333d2b36SAndroid Build Coastguard Worker name: "libbar", 5567*333d2b36SAndroid Build Coastguard Worker public: { 5568*333d2b36SAndroid Build Coastguard Worker jars: ["libbar.jar"], 5569*333d2b36SAndroid Build Coastguard Worker }, 5570*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5571*333d2b36SAndroid Build Coastguard Worker shared_library: false, 5572*333d2b36SAndroid Build Coastguard Worker } 5573*333d2b36SAndroid Build Coastguard Worker 5574*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 5575*333d2b36SAndroid Build Coastguard Worker name: "libbar", 5576*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 5577*333d2b36SAndroid Build Coastguard Worker unsafe_ignore_missing_latest_api: true, 5578*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5579*333d2b36SAndroid Build Coastguard Worker permitted_packages: ["bar"], 5580*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 5581*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_current", 5582*333d2b36SAndroid Build Coastguard Worker } 5583*333d2b36SAndroid Build Coastguard Worker ` 5584*333d2b36SAndroid Build Coastguard Worker 5585*333d2b36SAndroid Build Coastguard Worker ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment) 5586*333d2b36SAndroid Build Coastguard Worker 5587*333d2b36SAndroid Build Coastguard Worker // Verify the correct module jars contribute to the hiddenapi index file. 5588*333d2b36SAndroid Build Coastguard Worker checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`) 5589*333d2b36SAndroid Build Coastguard Worker checkHiddenAPIIndexFromFlagsInputs(t, ctx, ` 5590*333d2b36SAndroid Build Coastguard Worker out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv 5591*333d2b36SAndroid Build Coastguard Worker out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv 5592*333d2b36SAndroid Build Coastguard Worker out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv 5593*333d2b36SAndroid Build Coastguard Worker `) 5594*333d2b36SAndroid Build Coastguard Worker }) 5595*333d2b36SAndroid Build Coastguard Worker 5596*333d2b36SAndroid Build Coastguard Worker t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) { 5597*333d2b36SAndroid Build Coastguard Worker t.Parallel() 5598*333d2b36SAndroid Build Coastguard Worker bp := ` 5599*333d2b36SAndroid Build Coastguard Worker apex { 5600*333d2b36SAndroid Build Coastguard Worker name: "myapex", 5601*333d2b36SAndroid Build Coastguard Worker enabled: false, 5602*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 5603*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragments: ["my-bootclasspath-fragment"], 5604*333d2b36SAndroid Build Coastguard Worker } 5605*333d2b36SAndroid Build Coastguard Worker 5606*333d2b36SAndroid Build Coastguard Worker apex_key { 5607*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 5608*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 5609*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 5610*333d2b36SAndroid Build Coastguard Worker } 5611*333d2b36SAndroid Build Coastguard Worker 5612*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragment { 5613*333d2b36SAndroid Build Coastguard Worker name: "my-bootclasspath-fragment", 5614*333d2b36SAndroid Build Coastguard Worker enabled: false, 5615*333d2b36SAndroid Build Coastguard Worker contents: ["libfoo", "libbar"], 5616*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5617*333d2b36SAndroid Build Coastguard Worker hidden_api: { 5618*333d2b36SAndroid Build Coastguard Worker split_packages: ["*"], 5619*333d2b36SAndroid Build Coastguard Worker }, 5620*333d2b36SAndroid Build Coastguard Worker } 5621*333d2b36SAndroid Build Coastguard Worker 5622*333d2b36SAndroid Build Coastguard Worker prebuilt_apex { 5623*333d2b36SAndroid Build Coastguard Worker name: "myapex", 5624*333d2b36SAndroid Build Coastguard Worker arch: { 5625*333d2b36SAndroid Build Coastguard Worker arm64: { 5626*333d2b36SAndroid Build Coastguard Worker src: "myapex-arm64.apex", 5627*333d2b36SAndroid Build Coastguard Worker }, 5628*333d2b36SAndroid Build Coastguard Worker arm: { 5629*333d2b36SAndroid Build Coastguard Worker src: "myapex-arm.apex", 5630*333d2b36SAndroid Build Coastguard Worker }, 5631*333d2b36SAndroid Build Coastguard Worker }, 5632*333d2b36SAndroid Build Coastguard Worker exported_bootclasspath_fragments: ["my-bootclasspath-fragment"], 5633*333d2b36SAndroid Build Coastguard Worker } 5634*333d2b36SAndroid Build Coastguard Worker 5635*333d2b36SAndroid Build Coastguard Worker prebuilt_bootclasspath_fragment { 5636*333d2b36SAndroid Build Coastguard Worker name: "my-bootclasspath-fragment", 5637*333d2b36SAndroid Build Coastguard Worker contents: ["libfoo", "libbar"], 5638*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5639*333d2b36SAndroid Build Coastguard Worker hidden_api: { 5640*333d2b36SAndroid Build Coastguard Worker annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv", 5641*333d2b36SAndroid Build Coastguard Worker metadata: "my-bootclasspath-fragment/metadata.csv", 5642*333d2b36SAndroid Build Coastguard Worker index: "my-bootclasspath-fragment/index.csv", 5643*333d2b36SAndroid Build Coastguard Worker signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv", 5644*333d2b36SAndroid Build Coastguard Worker filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv", 5645*333d2b36SAndroid Build Coastguard Worker filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv", 5646*333d2b36SAndroid Build Coastguard Worker }, 5647*333d2b36SAndroid Build Coastguard Worker } 5648*333d2b36SAndroid Build Coastguard Worker 5649*333d2b36SAndroid Build Coastguard Worker java_import { 5650*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 5651*333d2b36SAndroid Build Coastguard Worker jars: ["libfoo.jar"], 5652*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5653*333d2b36SAndroid Build Coastguard Worker permitted_packages: ["foo"], 5654*333d2b36SAndroid Build Coastguard Worker } 5655*333d2b36SAndroid Build Coastguard Worker 5656*333d2b36SAndroid Build Coastguard Worker java_library { 5657*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 5658*333d2b36SAndroid Build Coastguard Worker enabled: false, 5659*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 5660*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5661*333d2b36SAndroid Build Coastguard Worker installable: true, 5662*333d2b36SAndroid Build Coastguard Worker } 5663*333d2b36SAndroid Build Coastguard Worker 5664*333d2b36SAndroid Build Coastguard Worker java_sdk_library_import { 5665*333d2b36SAndroid Build Coastguard Worker name: "libbar", 5666*333d2b36SAndroid Build Coastguard Worker public: { 5667*333d2b36SAndroid Build Coastguard Worker jars: ["libbar.jar"], 5668*333d2b36SAndroid Build Coastguard Worker }, 5669*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5670*333d2b36SAndroid Build Coastguard Worker shared_library: false, 5671*333d2b36SAndroid Build Coastguard Worker permitted_packages: ["bar"], 5672*333d2b36SAndroid Build Coastguard Worker prefer: true, 5673*333d2b36SAndroid Build Coastguard Worker } 5674*333d2b36SAndroid Build Coastguard Worker 5675*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 5676*333d2b36SAndroid Build Coastguard Worker name: "libbar", 5677*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 5678*333d2b36SAndroid Build Coastguard Worker unsafe_ignore_missing_latest_api: true, 5679*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5680*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 5681*333d2b36SAndroid Build Coastguard Worker } 5682*333d2b36SAndroid Build Coastguard Worker ` 5683*333d2b36SAndroid Build Coastguard Worker // This test disables libbar, which causes the ComponentDepsMutator to add 5684*333d2b36SAndroid Build Coastguard Worker // deps on libbar.stubs and other sub-modules that don't exist. We can 5685*333d2b36SAndroid Build Coastguard Worker // enable AllowMissingDependencies to work around that, but enabling that 5686*333d2b36SAndroid Build Coastguard Worker // causes extra checks for missing source files to dex_bootjars, so add those 5687*333d2b36SAndroid Build Coastguard Worker // to the mock fs as well. 5688*333d2b36SAndroid Build Coastguard Worker preparer2 := android.GroupFixturePreparers( 5689*333d2b36SAndroid Build Coastguard Worker preparer, 5690*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithAllowMissingDependencies, 5691*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs(map[string][]byte{ 5692*333d2b36SAndroid Build Coastguard Worker "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil, 5693*333d2b36SAndroid Build Coastguard Worker "frameworks/base/boot/boot-profile.txt": nil, 5694*333d2b36SAndroid Build Coastguard Worker }), 5695*333d2b36SAndroid Build Coastguard Worker ) 5696*333d2b36SAndroid Build Coastguard Worker 5697*333d2b36SAndroid Build Coastguard Worker ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment) 5698*333d2b36SAndroid Build Coastguard Worker 5699*333d2b36SAndroid Build Coastguard Worker // Verify the correct module jars contribute to the hiddenapi index file. 5700*333d2b36SAndroid Build Coastguard Worker checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`) 5701*333d2b36SAndroid Build Coastguard Worker checkHiddenAPIIndexFromFlagsInputs(t, ctx, ` 5702*333d2b36SAndroid Build Coastguard Worker my-bootclasspath-fragment/index.csv 5703*333d2b36SAndroid Build Coastguard Worker out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv 5704*333d2b36SAndroid Build Coastguard Worker out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv 5705*333d2b36SAndroid Build Coastguard Worker `) 5706*333d2b36SAndroid Build Coastguard Worker }) 5707*333d2b36SAndroid Build Coastguard Worker 5708*333d2b36SAndroid Build Coastguard Worker t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) { 5709*333d2b36SAndroid Build Coastguard Worker t.Parallel() 5710*333d2b36SAndroid Build Coastguard Worker bp := ` 5711*333d2b36SAndroid Build Coastguard Worker // Source 5712*333d2b36SAndroid Build Coastguard Worker apex { 5713*333d2b36SAndroid Build Coastguard Worker name: "myapex", 5714*333d2b36SAndroid Build Coastguard Worker enabled: false, 5715*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 5716*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragments: ["my-bootclasspath-fragment"], 5717*333d2b36SAndroid Build Coastguard Worker } 5718*333d2b36SAndroid Build Coastguard Worker 5719*333d2b36SAndroid Build Coastguard Worker apex_key { 5720*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 5721*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 5722*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 5723*333d2b36SAndroid Build Coastguard Worker } 5724*333d2b36SAndroid Build Coastguard Worker 5725*333d2b36SAndroid Build Coastguard Worker // Prebuilt 5726*333d2b36SAndroid Build Coastguard Worker prebuilt_apex { 5727*333d2b36SAndroid Build Coastguard Worker name: "myapex.v1", 5728*333d2b36SAndroid Build Coastguard Worker source_apex_name: "myapex", 5729*333d2b36SAndroid Build Coastguard Worker arch: { 5730*333d2b36SAndroid Build Coastguard Worker arm64: { 5731*333d2b36SAndroid Build Coastguard Worker src: "myapex-arm64.apex", 5732*333d2b36SAndroid Build Coastguard Worker }, 5733*333d2b36SAndroid Build Coastguard Worker arm: { 5734*333d2b36SAndroid Build Coastguard Worker src: "myapex-arm.apex", 5735*333d2b36SAndroid Build Coastguard Worker }, 5736*333d2b36SAndroid Build Coastguard Worker }, 5737*333d2b36SAndroid Build Coastguard Worker exported_bootclasspath_fragments: ["my-bootclasspath-fragment"], 5738*333d2b36SAndroid Build Coastguard Worker prefer: true, 5739*333d2b36SAndroid Build Coastguard Worker } 5740*333d2b36SAndroid Build Coastguard Worker prebuilt_apex { 5741*333d2b36SAndroid Build Coastguard Worker name: "myapex.v2", 5742*333d2b36SAndroid Build Coastguard Worker source_apex_name: "myapex", 5743*333d2b36SAndroid Build Coastguard Worker arch: { 5744*333d2b36SAndroid Build Coastguard Worker arm64: { 5745*333d2b36SAndroid Build Coastguard Worker src: "myapex-arm64.apex", 5746*333d2b36SAndroid Build Coastguard Worker }, 5747*333d2b36SAndroid Build Coastguard Worker arm: { 5748*333d2b36SAndroid Build Coastguard Worker src: "myapex-arm.apex", 5749*333d2b36SAndroid Build Coastguard Worker }, 5750*333d2b36SAndroid Build Coastguard Worker }, 5751*333d2b36SAndroid Build Coastguard Worker exported_bootclasspath_fragments: ["my-bootclasspath-fragment"], 5752*333d2b36SAndroid Build Coastguard Worker prefer: true, 5753*333d2b36SAndroid Build Coastguard Worker } 5754*333d2b36SAndroid Build Coastguard Worker 5755*333d2b36SAndroid Build Coastguard Worker prebuilt_bootclasspath_fragment { 5756*333d2b36SAndroid Build Coastguard Worker name: "my-bootclasspath-fragment", 5757*333d2b36SAndroid Build Coastguard Worker contents: ["libfoo", "libbar"], 5758*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5759*333d2b36SAndroid Build Coastguard Worker hidden_api: { 5760*333d2b36SAndroid Build Coastguard Worker annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv", 5761*333d2b36SAndroid Build Coastguard Worker metadata: "my-bootclasspath-fragment/metadata.csv", 5762*333d2b36SAndroid Build Coastguard Worker index: "my-bootclasspath-fragment/index.csv", 5763*333d2b36SAndroid Build Coastguard Worker stub_flags: "my-bootclasspath-fragment/stub-flags.csv", 5764*333d2b36SAndroid Build Coastguard Worker all_flags: "my-bootclasspath-fragment/all-flags.csv", 5765*333d2b36SAndroid Build Coastguard Worker }, 5766*333d2b36SAndroid Build Coastguard Worker prefer: true, 5767*333d2b36SAndroid Build Coastguard Worker } 5768*333d2b36SAndroid Build Coastguard Worker 5769*333d2b36SAndroid Build Coastguard Worker java_import { 5770*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 5771*333d2b36SAndroid Build Coastguard Worker jars: ["libfoo.jar"], 5772*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5773*333d2b36SAndroid Build Coastguard Worker prefer: true, 5774*333d2b36SAndroid Build Coastguard Worker } 5775*333d2b36SAndroid Build Coastguard Worker java_import { 5776*333d2b36SAndroid Build Coastguard Worker name: "libbar", 5777*333d2b36SAndroid Build Coastguard Worker jars: ["libbar.jar"], 5778*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5779*333d2b36SAndroid Build Coastguard Worker prefer: true, 5780*333d2b36SAndroid Build Coastguard Worker } 5781*333d2b36SAndroid Build Coastguard Worker ` 5782*333d2b36SAndroid Build Coastguard Worker 5783*333d2b36SAndroid Build Coastguard Worker testDexpreoptWithApexes(t, bp, "Multiple prebuilt modules prebuilt_myapex.v1 and prebuilt_myapex.v2 have been marked as preferred for this source module", preparer, fragment) 5784*333d2b36SAndroid Build Coastguard Worker }) 5785*333d2b36SAndroid Build Coastguard Worker 5786*333d2b36SAndroid Build Coastguard Worker} 5787*333d2b36SAndroid Build Coastguard Worker 5788*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithTests(t *testing.T) { 5789*333d2b36SAndroid Build Coastguard Worker t.Parallel() 5790*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 5791*333d2b36SAndroid Build Coastguard Worker apex_test { 5792*333d2b36SAndroid Build Coastguard Worker name: "myapex", 5793*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 5794*333d2b36SAndroid Build Coastguard Worker updatable: false, 5795*333d2b36SAndroid Build Coastguard Worker tests: [ 5796*333d2b36SAndroid Build Coastguard Worker "mytest", 5797*333d2b36SAndroid Build Coastguard Worker ], 5798*333d2b36SAndroid Build Coastguard Worker } 5799*333d2b36SAndroid Build Coastguard Worker 5800*333d2b36SAndroid Build Coastguard Worker apex_key { 5801*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 5802*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 5803*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 5804*333d2b36SAndroid Build Coastguard Worker } 5805*333d2b36SAndroid Build Coastguard Worker 5806*333d2b36SAndroid Build Coastguard Worker filegroup { 5807*333d2b36SAndroid Build Coastguard Worker name: "fg", 5808*333d2b36SAndroid Build Coastguard Worker srcs: [ 5809*333d2b36SAndroid Build Coastguard Worker "baz", 5810*333d2b36SAndroid Build Coastguard Worker "bar/baz" 5811*333d2b36SAndroid Build Coastguard Worker ], 5812*333d2b36SAndroid Build Coastguard Worker } 5813*333d2b36SAndroid Build Coastguard Worker 5814*333d2b36SAndroid Build Coastguard Worker cc_test { 5815*333d2b36SAndroid Build Coastguard Worker name: "mytest", 5816*333d2b36SAndroid Build Coastguard Worker gtest: false, 5817*333d2b36SAndroid Build Coastguard Worker srcs: ["mytest.cpp"], 5818*333d2b36SAndroid Build Coastguard Worker relative_install_path: "test", 5819*333d2b36SAndroid Build Coastguard Worker shared_libs: ["mylib"], 5820*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 5821*333d2b36SAndroid Build Coastguard Worker static_executable: true, 5822*333d2b36SAndroid Build Coastguard Worker stl: "none", 5823*333d2b36SAndroid Build Coastguard Worker data: [":fg"], 5824*333d2b36SAndroid Build Coastguard Worker } 5825*333d2b36SAndroid Build Coastguard Worker 5826*333d2b36SAndroid Build Coastguard Worker cc_library { 5827*333d2b36SAndroid Build Coastguard Worker name: "mylib", 5828*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 5829*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 5830*333d2b36SAndroid Build Coastguard Worker stl: "none", 5831*333d2b36SAndroid Build Coastguard Worker } 5832*333d2b36SAndroid Build Coastguard Worker 5833*333d2b36SAndroid Build Coastguard Worker filegroup { 5834*333d2b36SAndroid Build Coastguard Worker name: "fg2", 5835*333d2b36SAndroid Build Coastguard Worker srcs: [ 5836*333d2b36SAndroid Build Coastguard Worker "testdata/baz" 5837*333d2b36SAndroid Build Coastguard Worker ], 5838*333d2b36SAndroid Build Coastguard Worker } 5839*333d2b36SAndroid Build Coastguard Worker `) 5840*333d2b36SAndroid Build Coastguard Worker 5841*333d2b36SAndroid Build Coastguard Worker apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule") 5842*333d2b36SAndroid Build Coastguard Worker copyCmds := apexRule.Args["copy_commands"] 5843*333d2b36SAndroid Build Coastguard Worker 5844*333d2b36SAndroid Build Coastguard Worker // Ensure that test dep (and their transitive dependencies) are copied into apex. 5845*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/bin/test/mytest") 5846*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/mylib.so") 5847*333d2b36SAndroid Build Coastguard Worker 5848*333d2b36SAndroid Build Coastguard Worker //Ensure that test data are copied into apex. 5849*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/bin/test/baz") 5850*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz") 5851*333d2b36SAndroid Build Coastguard Worker 5852*333d2b36SAndroid Build Coastguard Worker // Ensure the module is correctly translated. 5853*333d2b36SAndroid Build Coastguard Worker bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) 5854*333d2b36SAndroid Build Coastguard Worker data := android.AndroidMkDataForTest(t, ctx, bundle) 5855*333d2b36SAndroid Build Coastguard Worker name := bundle.BaseModuleName() 5856*333d2b36SAndroid Build Coastguard Worker prefix := "TARGET_" 5857*333d2b36SAndroid Build Coastguard Worker var builder strings.Builder 5858*333d2b36SAndroid Build Coastguard Worker data.Custom(&builder, name, prefix, "", data) 5859*333d2b36SAndroid Build Coastguard Worker androidMk := builder.String() 5860*333d2b36SAndroid Build Coastguard Worker ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n") 5861*333d2b36SAndroid Build Coastguard Worker ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n") 5862*333d2b36SAndroid Build Coastguard Worker} 5863*333d2b36SAndroid Build Coastguard Worker 5864*333d2b36SAndroid Build Coastguard Workerfunc TestErrorsIfDepsAreNotEnabled(t *testing.T) { 5865*333d2b36SAndroid Build Coastguard Worker t.Parallel() 5866*333d2b36SAndroid Build Coastguard Worker testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, ` 5867*333d2b36SAndroid Build Coastguard Worker apex { 5868*333d2b36SAndroid Build Coastguard Worker name: "myapex", 5869*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 5870*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 5871*333d2b36SAndroid Build Coastguard Worker } 5872*333d2b36SAndroid Build Coastguard Worker 5873*333d2b36SAndroid Build Coastguard Worker apex_key { 5874*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 5875*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 5876*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 5877*333d2b36SAndroid Build Coastguard Worker } 5878*333d2b36SAndroid Build Coastguard Worker 5879*333d2b36SAndroid Build Coastguard Worker cc_library { 5880*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 5881*333d2b36SAndroid Build Coastguard Worker stl: "none", 5882*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 5883*333d2b36SAndroid Build Coastguard Worker enabled: false, 5884*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5885*333d2b36SAndroid Build Coastguard Worker } 5886*333d2b36SAndroid Build Coastguard Worker `) 5887*333d2b36SAndroid Build Coastguard Worker testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, ` 5888*333d2b36SAndroid Build Coastguard Worker apex { 5889*333d2b36SAndroid Build Coastguard Worker name: "myapex", 5890*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 5891*333d2b36SAndroid Build Coastguard Worker java_libs: ["myjar"], 5892*333d2b36SAndroid Build Coastguard Worker } 5893*333d2b36SAndroid Build Coastguard Worker 5894*333d2b36SAndroid Build Coastguard Worker apex_key { 5895*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 5896*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 5897*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 5898*333d2b36SAndroid Build Coastguard Worker } 5899*333d2b36SAndroid Build Coastguard Worker 5900*333d2b36SAndroid Build Coastguard Worker java_library { 5901*333d2b36SAndroid Build Coastguard Worker name: "myjar", 5902*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 5903*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 5904*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 5905*333d2b36SAndroid Build Coastguard Worker enabled: false, 5906*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5907*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 5908*333d2b36SAndroid Build Coastguard Worker } 5909*333d2b36SAndroid Build Coastguard Worker `) 5910*333d2b36SAndroid Build Coastguard Worker} 5911*333d2b36SAndroid Build Coastguard Worker 5912*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithJavaImport(t *testing.T) { 5913*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 5914*333d2b36SAndroid Build Coastguard Worker apex { 5915*333d2b36SAndroid Build Coastguard Worker name: "myapex", 5916*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 5917*333d2b36SAndroid Build Coastguard Worker java_libs: ["myjavaimport"], 5918*333d2b36SAndroid Build Coastguard Worker updatable: false, 5919*333d2b36SAndroid Build Coastguard Worker } 5920*333d2b36SAndroid Build Coastguard Worker 5921*333d2b36SAndroid Build Coastguard Worker apex_key { 5922*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 5923*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 5924*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 5925*333d2b36SAndroid Build Coastguard Worker } 5926*333d2b36SAndroid Build Coastguard Worker 5927*333d2b36SAndroid Build Coastguard Worker java_import { 5928*333d2b36SAndroid Build Coastguard Worker name: "myjavaimport", 5929*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 5930*333d2b36SAndroid Build Coastguard Worker jars: ["my.jar"], 5931*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 5932*333d2b36SAndroid Build Coastguard Worker } 5933*333d2b36SAndroid Build Coastguard Worker `) 5934*333d2b36SAndroid Build Coastguard Worker 5935*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests("myapex", "android_common_myapex") 5936*333d2b36SAndroid Build Coastguard Worker apexRule := module.Rule("apexRule") 5937*333d2b36SAndroid Build Coastguard Worker copyCmds := apexRule.Args["copy_commands"] 5938*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar") 5939*333d2b36SAndroid Build Coastguard Worker} 5940*333d2b36SAndroid Build Coastguard Worker 5941*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithApps(t *testing.T) { 5942*333d2b36SAndroid Build Coastguard Worker t.Parallel() 5943*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 5944*333d2b36SAndroid Build Coastguard Worker apex { 5945*333d2b36SAndroid Build Coastguard Worker name: "myapex", 5946*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 5947*333d2b36SAndroid Build Coastguard Worker apps: [ 5948*333d2b36SAndroid Build Coastguard Worker "AppFoo", 5949*333d2b36SAndroid Build Coastguard Worker "AppFooPriv", 5950*333d2b36SAndroid Build Coastguard Worker ], 5951*333d2b36SAndroid Build Coastguard Worker updatable: false, 5952*333d2b36SAndroid Build Coastguard Worker } 5953*333d2b36SAndroid Build Coastguard Worker 5954*333d2b36SAndroid Build Coastguard Worker apex_key { 5955*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 5956*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 5957*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 5958*333d2b36SAndroid Build Coastguard Worker } 5959*333d2b36SAndroid Build Coastguard Worker 5960*333d2b36SAndroid Build Coastguard Worker android_app { 5961*333d2b36SAndroid Build Coastguard Worker name: "AppFoo", 5962*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 5963*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 5964*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 5965*333d2b36SAndroid Build Coastguard Worker use_embedded_native_libs: true, 5966*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 5967*333d2b36SAndroid Build Coastguard Worker stl: "none", 5968*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 5969*333d2b36SAndroid Build Coastguard Worker } 5970*333d2b36SAndroid Build Coastguard Worker 5971*333d2b36SAndroid Build Coastguard Worker android_app { 5972*333d2b36SAndroid Build Coastguard Worker name: "AppFooPriv", 5973*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 5974*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 5975*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 5976*333d2b36SAndroid Build Coastguard Worker privileged: true, 5977*333d2b36SAndroid Build Coastguard Worker privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml", 5978*333d2b36SAndroid Build Coastguard Worker stl: "none", 5979*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 5980*333d2b36SAndroid Build Coastguard Worker } 5981*333d2b36SAndroid Build Coastguard Worker 5982*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 5983*333d2b36SAndroid Build Coastguard Worker name: "libjni", 5984*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 5985*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libfoo"], 5986*333d2b36SAndroid Build Coastguard Worker stl: "none", 5987*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 5988*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 5989*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 5990*333d2b36SAndroid Build Coastguard Worker } 5991*333d2b36SAndroid Build Coastguard Worker 5992*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 5993*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 5994*333d2b36SAndroid Build Coastguard Worker stl: "none", 5995*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 5996*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 5997*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 5998*333d2b36SAndroid Build Coastguard Worker } 5999*333d2b36SAndroid Build Coastguard Worker `) 6000*333d2b36SAndroid Build Coastguard Worker 6001*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests("myapex", "android_common_myapex") 6002*333d2b36SAndroid Build Coastguard Worker apexRule := module.Rule("apexRule") 6003*333d2b36SAndroid Build Coastguard Worker copyCmds := apexRule.Args["copy_commands"] 6004*333d2b36SAndroid Build Coastguard Worker 6005*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk") 6006*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk") 6007*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml") 6008*333d2b36SAndroid Build Coastguard Worker 6009*333d2b36SAndroid Build Coastguard Worker appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs") 6010*333d2b36SAndroid Build Coastguard Worker // JNI libraries are uncompressed 6011*333d2b36SAndroid Build Coastguard Worker if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") { 6012*333d2b36SAndroid Build Coastguard Worker t.Errorf("jni libs are not uncompressed for AppFoo") 6013*333d2b36SAndroid Build Coastguard Worker } 6014*333d2b36SAndroid Build Coastguard Worker // JNI libraries including transitive deps are 6015*333d2b36SAndroid Build Coastguard Worker for _, jni := range []string{"libjni", "libfoo"} { 6016*333d2b36SAndroid Build Coastguard Worker jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop() 6017*333d2b36SAndroid Build Coastguard Worker // ... embedded inside APK (jnilibs.zip) 6018*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String()) 6019*333d2b36SAndroid Build Coastguard Worker // ... and not directly inside the APEX 6020*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so") 6021*333d2b36SAndroid Build Coastguard Worker } 6022*333d2b36SAndroid Build Coastguard Worker 6023*333d2b36SAndroid Build Coastguard Worker apexBundle := module.Module().(*apexBundle) 6024*333d2b36SAndroid Build Coastguard Worker data := android.AndroidMkDataForTest(t, ctx, apexBundle) 6025*333d2b36SAndroid Build Coastguard Worker var builder strings.Builder 6026*333d2b36SAndroid Build Coastguard Worker data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data) 6027*333d2b36SAndroid Build Coastguard Worker androidMk := builder.String() 6028*333d2b36SAndroid Build Coastguard Worker ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex") 6029*333d2b36SAndroid Build Coastguard Worker ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex") 6030*333d2b36SAndroid Build Coastguard Worker ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk") 6031*333d2b36SAndroid Build Coastguard Worker ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk") 6032*333d2b36SAndroid Build Coastguard Worker ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk") 6033*333d2b36SAndroid Build Coastguard Worker ensureContains(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := privapp_allowlist_com.android.AppFooPriv.xml:$(PRODUCT_OUT)/apex/myapex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml") 6034*333d2b36SAndroid Build Coastguard Worker} 6035*333d2b36SAndroid Build Coastguard Worker 6036*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithAppImportBuildId(t *testing.T) { 6037*333d2b36SAndroid Build Coastguard Worker t.Parallel() 6038*333d2b36SAndroid Build Coastguard Worker invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"} 6039*333d2b36SAndroid Build Coastguard Worker for _, id := range invalidBuildIds { 6040*333d2b36SAndroid Build Coastguard Worker message := fmt.Sprintf("Unable to use build id %s as filename suffix", id) 6041*333d2b36SAndroid Build Coastguard Worker fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 6042*333d2b36SAndroid Build Coastguard Worker variables.BuildId = proptools.StringPtr(id) 6043*333d2b36SAndroid Build Coastguard Worker }) 6044*333d2b36SAndroid Build Coastguard Worker testApexError(t, message, `apex { 6045*333d2b36SAndroid Build Coastguard Worker name: "myapex", 6046*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6047*333d2b36SAndroid Build Coastguard Worker apps: ["AppFooPrebuilt"], 6048*333d2b36SAndroid Build Coastguard Worker updatable: false, 6049*333d2b36SAndroid Build Coastguard Worker } 6050*333d2b36SAndroid Build Coastguard Worker 6051*333d2b36SAndroid Build Coastguard Worker apex_key { 6052*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 6053*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6054*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6055*333d2b36SAndroid Build Coastguard Worker } 6056*333d2b36SAndroid Build Coastguard Worker 6057*333d2b36SAndroid Build Coastguard Worker android_app_import { 6058*333d2b36SAndroid Build Coastguard Worker name: "AppFooPrebuilt", 6059*333d2b36SAndroid Build Coastguard Worker apk: "PrebuiltAppFoo.apk", 6060*333d2b36SAndroid Build Coastguard Worker presigned: true, 6061*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 6062*333d2b36SAndroid Build Coastguard Worker } 6063*333d2b36SAndroid Build Coastguard Worker `, fixture) 6064*333d2b36SAndroid Build Coastguard Worker } 6065*333d2b36SAndroid Build Coastguard Worker} 6066*333d2b36SAndroid Build Coastguard Worker 6067*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithAppImports(t *testing.T) { 6068*333d2b36SAndroid Build Coastguard Worker t.Parallel() 6069*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 6070*333d2b36SAndroid Build Coastguard Worker apex { 6071*333d2b36SAndroid Build Coastguard Worker name: "myapex", 6072*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6073*333d2b36SAndroid Build Coastguard Worker apps: [ 6074*333d2b36SAndroid Build Coastguard Worker "AppFooPrebuilt", 6075*333d2b36SAndroid Build Coastguard Worker "AppFooPrivPrebuilt", 6076*333d2b36SAndroid Build Coastguard Worker ], 6077*333d2b36SAndroid Build Coastguard Worker updatable: false, 6078*333d2b36SAndroid Build Coastguard Worker } 6079*333d2b36SAndroid Build Coastguard Worker 6080*333d2b36SAndroid Build Coastguard Worker apex_key { 6081*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 6082*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6083*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6084*333d2b36SAndroid Build Coastguard Worker } 6085*333d2b36SAndroid Build Coastguard Worker 6086*333d2b36SAndroid Build Coastguard Worker android_app_import { 6087*333d2b36SAndroid Build Coastguard Worker name: "AppFooPrebuilt", 6088*333d2b36SAndroid Build Coastguard Worker apk: "PrebuiltAppFoo.apk", 6089*333d2b36SAndroid Build Coastguard Worker presigned: true, 6090*333d2b36SAndroid Build Coastguard Worker dex_preopt: { 6091*333d2b36SAndroid Build Coastguard Worker enabled: false, 6092*333d2b36SAndroid Build Coastguard Worker }, 6093*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 6094*333d2b36SAndroid Build Coastguard Worker } 6095*333d2b36SAndroid Build Coastguard Worker 6096*333d2b36SAndroid Build Coastguard Worker android_app_import { 6097*333d2b36SAndroid Build Coastguard Worker name: "AppFooPrivPrebuilt", 6098*333d2b36SAndroid Build Coastguard Worker apk: "PrebuiltAppFooPriv.apk", 6099*333d2b36SAndroid Build Coastguard Worker privileged: true, 6100*333d2b36SAndroid Build Coastguard Worker presigned: true, 6101*333d2b36SAndroid Build Coastguard Worker dex_preopt: { 6102*333d2b36SAndroid Build Coastguard Worker enabled: false, 6103*333d2b36SAndroid Build Coastguard Worker }, 6104*333d2b36SAndroid Build Coastguard Worker filename: "AwesomePrebuiltAppFooPriv.apk", 6105*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 6106*333d2b36SAndroid Build Coastguard Worker } 6107*333d2b36SAndroid Build Coastguard Worker `) 6108*333d2b36SAndroid Build Coastguard Worker 6109*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests("myapex", "android_common_myapex") 6110*333d2b36SAndroid Build Coastguard Worker apexRule := module.Rule("apexRule") 6111*333d2b36SAndroid Build Coastguard Worker copyCmds := apexRule.Args["copy_commands"] 6112*333d2b36SAndroid Build Coastguard Worker 6113*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk") 6114*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk") 6115*333d2b36SAndroid Build Coastguard Worker} 6116*333d2b36SAndroid Build Coastguard Worker 6117*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithAppImportsPrefer(t *testing.T) { 6118*333d2b36SAndroid Build Coastguard Worker t.Parallel() 6119*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 6120*333d2b36SAndroid Build Coastguard Worker apex { 6121*333d2b36SAndroid Build Coastguard Worker name: "myapex", 6122*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6123*333d2b36SAndroid Build Coastguard Worker apps: [ 6124*333d2b36SAndroid Build Coastguard Worker "AppFoo", 6125*333d2b36SAndroid Build Coastguard Worker ], 6126*333d2b36SAndroid Build Coastguard Worker updatable: false, 6127*333d2b36SAndroid Build Coastguard Worker } 6128*333d2b36SAndroid Build Coastguard Worker 6129*333d2b36SAndroid Build Coastguard Worker apex_key { 6130*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 6131*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6132*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6133*333d2b36SAndroid Build Coastguard Worker } 6134*333d2b36SAndroid Build Coastguard Worker 6135*333d2b36SAndroid Build Coastguard Worker android_app { 6136*333d2b36SAndroid Build Coastguard Worker name: "AppFoo", 6137*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 6138*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 6139*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 6140*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 6141*333d2b36SAndroid Build Coastguard Worker } 6142*333d2b36SAndroid Build Coastguard Worker 6143*333d2b36SAndroid Build Coastguard Worker android_app_import { 6144*333d2b36SAndroid Build Coastguard Worker name: "AppFoo", 6145*333d2b36SAndroid Build Coastguard Worker apk: "AppFooPrebuilt.apk", 6146*333d2b36SAndroid Build Coastguard Worker filename: "AppFooPrebuilt.apk", 6147*333d2b36SAndroid Build Coastguard Worker presigned: true, 6148*333d2b36SAndroid Build Coastguard Worker prefer: true, 6149*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 6150*333d2b36SAndroid Build Coastguard Worker } 6151*333d2b36SAndroid Build Coastguard Worker `, withFiles(map[string][]byte{ 6152*333d2b36SAndroid Build Coastguard Worker "AppFooPrebuilt.apk": nil, 6153*333d2b36SAndroid Build Coastguard Worker })) 6154*333d2b36SAndroid Build Coastguard Worker 6155*333d2b36SAndroid Build Coastguard Worker ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{ 6156*333d2b36SAndroid Build Coastguard Worker "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk", 6157*333d2b36SAndroid Build Coastguard Worker }) 6158*333d2b36SAndroid Build Coastguard Worker} 6159*333d2b36SAndroid Build Coastguard Worker 6160*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithTestHelperApp(t *testing.T) { 6161*333d2b36SAndroid Build Coastguard Worker t.Parallel() 6162*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 6163*333d2b36SAndroid Build Coastguard Worker apex { 6164*333d2b36SAndroid Build Coastguard Worker name: "myapex", 6165*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6166*333d2b36SAndroid Build Coastguard Worker apps: [ 6167*333d2b36SAndroid Build Coastguard Worker "TesterHelpAppFoo", 6168*333d2b36SAndroid Build Coastguard Worker ], 6169*333d2b36SAndroid Build Coastguard Worker updatable: false, 6170*333d2b36SAndroid Build Coastguard Worker } 6171*333d2b36SAndroid Build Coastguard Worker 6172*333d2b36SAndroid Build Coastguard Worker apex_key { 6173*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 6174*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6175*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6176*333d2b36SAndroid Build Coastguard Worker } 6177*333d2b36SAndroid Build Coastguard Worker 6178*333d2b36SAndroid Build Coastguard Worker android_test_helper_app { 6179*333d2b36SAndroid Build Coastguard Worker name: "TesterHelpAppFoo", 6180*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 6181*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 6182*333d2b36SAndroid Build Coastguard Worker sdk_version: "test_current", 6183*333d2b36SAndroid Build Coastguard Worker } 6184*333d2b36SAndroid Build Coastguard Worker 6185*333d2b36SAndroid Build Coastguard Worker `) 6186*333d2b36SAndroid Build Coastguard Worker 6187*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests("myapex", "android_common_myapex") 6188*333d2b36SAndroid Build Coastguard Worker apexRule := module.Rule("apexRule") 6189*333d2b36SAndroid Build Coastguard Worker copyCmds := apexRule.Args["copy_commands"] 6190*333d2b36SAndroid Build Coastguard Worker 6191*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk") 6192*333d2b36SAndroid Build Coastguard Worker} 6193*333d2b36SAndroid Build Coastguard Worker 6194*333d2b36SAndroid Build Coastguard Workerfunc TestApexPropertiesShouldBeDefaultable(t *testing.T) { 6195*333d2b36SAndroid Build Coastguard Worker t.Parallel() 6196*333d2b36SAndroid Build Coastguard Worker // libfoo's apex_available comes from cc_defaults 6197*333d2b36SAndroid Build Coastguard Worker testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, ` 6198*333d2b36SAndroid Build Coastguard Worker apex { 6199*333d2b36SAndroid Build Coastguard Worker name: "myapex", 6200*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6201*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 6202*333d2b36SAndroid Build Coastguard Worker updatable: false, 6203*333d2b36SAndroid Build Coastguard Worker } 6204*333d2b36SAndroid Build Coastguard Worker 6205*333d2b36SAndroid Build Coastguard Worker apex_key { 6206*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 6207*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6208*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6209*333d2b36SAndroid Build Coastguard Worker } 6210*333d2b36SAndroid Build Coastguard Worker 6211*333d2b36SAndroid Build Coastguard Worker apex { 6212*333d2b36SAndroid Build Coastguard Worker name: "otherapex", 6213*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6214*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 6215*333d2b36SAndroid Build Coastguard Worker updatable: false, 6216*333d2b36SAndroid Build Coastguard Worker } 6217*333d2b36SAndroid Build Coastguard Worker 6218*333d2b36SAndroid Build Coastguard Worker cc_defaults { 6219*333d2b36SAndroid Build Coastguard Worker name: "libfoo-defaults", 6220*333d2b36SAndroid Build Coastguard Worker apex_available: ["otherapex"], 6221*333d2b36SAndroid Build Coastguard Worker } 6222*333d2b36SAndroid Build Coastguard Worker 6223*333d2b36SAndroid Build Coastguard Worker cc_library { 6224*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 6225*333d2b36SAndroid Build Coastguard Worker defaults: ["libfoo-defaults"], 6226*333d2b36SAndroid Build Coastguard Worker stl: "none", 6227*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6228*333d2b36SAndroid Build Coastguard Worker }`) 6229*333d2b36SAndroid Build Coastguard Worker} 6230*333d2b36SAndroid Build Coastguard Worker 6231*333d2b36SAndroid Build Coastguard Workerfunc TestApexAvailable_DirectDep(t *testing.T) { 6232*333d2b36SAndroid Build Coastguard Worker t.Parallel() 6233*333d2b36SAndroid Build Coastguard Worker // libfoo is not available to myapex, but only to otherapex 6234*333d2b36SAndroid Build Coastguard Worker testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", ` 6235*333d2b36SAndroid Build Coastguard Worker apex { 6236*333d2b36SAndroid Build Coastguard Worker name: "myapex", 6237*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6238*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 6239*333d2b36SAndroid Build Coastguard Worker updatable: false, 6240*333d2b36SAndroid Build Coastguard Worker } 6241*333d2b36SAndroid Build Coastguard Worker 6242*333d2b36SAndroid Build Coastguard Worker apex_key { 6243*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 6244*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6245*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6246*333d2b36SAndroid Build Coastguard Worker } 6247*333d2b36SAndroid Build Coastguard Worker 6248*333d2b36SAndroid Build Coastguard Worker apex { 6249*333d2b36SAndroid Build Coastguard Worker name: "otherapex", 6250*333d2b36SAndroid Build Coastguard Worker key: "otherapex.key", 6251*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 6252*333d2b36SAndroid Build Coastguard Worker updatable: false, 6253*333d2b36SAndroid Build Coastguard Worker } 6254*333d2b36SAndroid Build Coastguard Worker 6255*333d2b36SAndroid Build Coastguard Worker apex_key { 6256*333d2b36SAndroid Build Coastguard Worker name: "otherapex.key", 6257*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6258*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6259*333d2b36SAndroid Build Coastguard Worker } 6260*333d2b36SAndroid Build Coastguard Worker 6261*333d2b36SAndroid Build Coastguard Worker cc_library { 6262*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 6263*333d2b36SAndroid Build Coastguard Worker stl: "none", 6264*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6265*333d2b36SAndroid Build Coastguard Worker apex_available: ["otherapex"], 6266*333d2b36SAndroid Build Coastguard Worker }`) 6267*333d2b36SAndroid Build Coastguard Worker 6268*333d2b36SAndroid Build Coastguard Worker // 'apex_available' check is bypassed for /product apex with a specific prefix. 6269*333d2b36SAndroid Build Coastguard Worker // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes. 6270*333d2b36SAndroid Build Coastguard Worker testApex(t, ` 6271*333d2b36SAndroid Build Coastguard Worker apex { 6272*333d2b36SAndroid Build Coastguard Worker name: "com.sdv.myapex", 6273*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6274*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 6275*333d2b36SAndroid Build Coastguard Worker updatable: false, 6276*333d2b36SAndroid Build Coastguard Worker product_specific: true, 6277*333d2b36SAndroid Build Coastguard Worker } 6278*333d2b36SAndroid Build Coastguard Worker 6279*333d2b36SAndroid Build Coastguard Worker apex_key { 6280*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 6281*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6282*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6283*333d2b36SAndroid Build Coastguard Worker } 6284*333d2b36SAndroid Build Coastguard Worker 6285*333d2b36SAndroid Build Coastguard Worker apex { 6286*333d2b36SAndroid Build Coastguard Worker name: "com.any.otherapex", 6287*333d2b36SAndroid Build Coastguard Worker key: "otherapex.key", 6288*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 6289*333d2b36SAndroid Build Coastguard Worker updatable: false, 6290*333d2b36SAndroid Build Coastguard Worker } 6291*333d2b36SAndroid Build Coastguard Worker 6292*333d2b36SAndroid Build Coastguard Worker apex_key { 6293*333d2b36SAndroid Build Coastguard Worker name: "otherapex.key", 6294*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6295*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6296*333d2b36SAndroid Build Coastguard Worker } 6297*333d2b36SAndroid Build Coastguard Worker 6298*333d2b36SAndroid Build Coastguard Worker cc_library { 6299*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 6300*333d2b36SAndroid Build Coastguard Worker stl: "none", 6301*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6302*333d2b36SAndroid Build Coastguard Worker apex_available: ["com.any.otherapex"], 6303*333d2b36SAndroid Build Coastguard Worker product_specific: true, 6304*333d2b36SAndroid Build Coastguard Worker }`, 6305*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs(android.MockFS{ 6306*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil, 6307*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/com.any.otherapex-file_contexts": nil, 6308*333d2b36SAndroid Build Coastguard Worker })) 6309*333d2b36SAndroid Build Coastguard Worker 6310*333d2b36SAndroid Build Coastguard Worker // 'apex_available' check is not bypassed for non-product apex with a specific prefix. 6311*333d2b36SAndroid Build Coastguard Worker testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", ` 6312*333d2b36SAndroid Build Coastguard Worker apex { 6313*333d2b36SAndroid Build Coastguard Worker name: "com.sdv.myapex", 6314*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6315*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 6316*333d2b36SAndroid Build Coastguard Worker updatable: false, 6317*333d2b36SAndroid Build Coastguard Worker } 6318*333d2b36SAndroid Build Coastguard Worker 6319*333d2b36SAndroid Build Coastguard Worker apex_key { 6320*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 6321*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6322*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6323*333d2b36SAndroid Build Coastguard Worker } 6324*333d2b36SAndroid Build Coastguard Worker 6325*333d2b36SAndroid Build Coastguard Worker apex { 6326*333d2b36SAndroid Build Coastguard Worker name: "com.any.otherapex", 6327*333d2b36SAndroid Build Coastguard Worker key: "otherapex.key", 6328*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 6329*333d2b36SAndroid Build Coastguard Worker updatable: false, 6330*333d2b36SAndroid Build Coastguard Worker } 6331*333d2b36SAndroid Build Coastguard Worker 6332*333d2b36SAndroid Build Coastguard Worker apex_key { 6333*333d2b36SAndroid Build Coastguard Worker name: "otherapex.key", 6334*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6335*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6336*333d2b36SAndroid Build Coastguard Worker } 6337*333d2b36SAndroid Build Coastguard Worker 6338*333d2b36SAndroid Build Coastguard Worker cc_library { 6339*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 6340*333d2b36SAndroid Build Coastguard Worker stl: "none", 6341*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6342*333d2b36SAndroid Build Coastguard Worker apex_available: ["com.any.otherapex"], 6343*333d2b36SAndroid Build Coastguard Worker }`, 6344*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs(android.MockFS{ 6345*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil, 6346*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/com.any.otherapex-file_contexts": nil, 6347*333d2b36SAndroid Build Coastguard Worker })) 6348*333d2b36SAndroid Build Coastguard Worker} 6349*333d2b36SAndroid Build Coastguard Worker 6350*333d2b36SAndroid Build Coastguard Workerfunc TestApexAvailable_IndirectDep(t *testing.T) { 6351*333d2b36SAndroid Build Coastguard Worker t.Parallel() 6352*333d2b36SAndroid Build Coastguard Worker // libbbaz is an indirect dep 6353*333d2b36SAndroid Build Coastguard Worker testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path: 6354*333d2b36SAndroid Build Coastguard Worker.*via tag apex\.dependencyTag\{"sharedLib"\} 6355*333d2b36SAndroid Build Coastguard Worker.*-> libfoo.*link:shared.* 6356*333d2b36SAndroid Build Coastguard Worker.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.* 6357*333d2b36SAndroid Build Coastguard Worker.*-> libbar.*link:shared.* 6358*333d2b36SAndroid Build Coastguard Worker.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.* 6359*333d2b36SAndroid Build Coastguard Worker.*-> libbaz.*link:shared.*`, ` 6360*333d2b36SAndroid Build Coastguard Worker apex { 6361*333d2b36SAndroid Build Coastguard Worker name: "myapex", 6362*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6363*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 6364*333d2b36SAndroid Build Coastguard Worker updatable: false, 6365*333d2b36SAndroid Build Coastguard Worker } 6366*333d2b36SAndroid Build Coastguard Worker 6367*333d2b36SAndroid Build Coastguard Worker apex_key { 6368*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 6369*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6370*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6371*333d2b36SAndroid Build Coastguard Worker } 6372*333d2b36SAndroid Build Coastguard Worker 6373*333d2b36SAndroid Build Coastguard Worker cc_library { 6374*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 6375*333d2b36SAndroid Build Coastguard Worker stl: "none", 6376*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbar"], 6377*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6378*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 6379*333d2b36SAndroid Build Coastguard Worker } 6380*333d2b36SAndroid Build Coastguard Worker 6381*333d2b36SAndroid Build Coastguard Worker cc_library { 6382*333d2b36SAndroid Build Coastguard Worker name: "libbar", 6383*333d2b36SAndroid Build Coastguard Worker stl: "none", 6384*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbaz"], 6385*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6386*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 6387*333d2b36SAndroid Build Coastguard Worker } 6388*333d2b36SAndroid Build Coastguard Worker 6389*333d2b36SAndroid Build Coastguard Worker cc_library { 6390*333d2b36SAndroid Build Coastguard Worker name: "libbaz", 6391*333d2b36SAndroid Build Coastguard Worker stl: "none", 6392*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6393*333d2b36SAndroid Build Coastguard Worker }`) 6394*333d2b36SAndroid Build Coastguard Worker 6395*333d2b36SAndroid Build Coastguard Worker // 'apex_available' check is bypassed for /product apex with a specific prefix. 6396*333d2b36SAndroid Build Coastguard Worker // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes. 6397*333d2b36SAndroid Build Coastguard Worker testApex(t, ` 6398*333d2b36SAndroid Build Coastguard Worker apex { 6399*333d2b36SAndroid Build Coastguard Worker name: "com.sdv.myapex", 6400*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6401*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 6402*333d2b36SAndroid Build Coastguard Worker updatable: false, 6403*333d2b36SAndroid Build Coastguard Worker product_specific: true, 6404*333d2b36SAndroid Build Coastguard Worker } 6405*333d2b36SAndroid Build Coastguard Worker 6406*333d2b36SAndroid Build Coastguard Worker apex_key { 6407*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 6408*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6409*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6410*333d2b36SAndroid Build Coastguard Worker } 6411*333d2b36SAndroid Build Coastguard Worker 6412*333d2b36SAndroid Build Coastguard Worker cc_library { 6413*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 6414*333d2b36SAndroid Build Coastguard Worker stl: "none", 6415*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbar"], 6416*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6417*333d2b36SAndroid Build Coastguard Worker apex_available: ["com.sdv.myapex"], 6418*333d2b36SAndroid Build Coastguard Worker product_specific: true, 6419*333d2b36SAndroid Build Coastguard Worker } 6420*333d2b36SAndroid Build Coastguard Worker 6421*333d2b36SAndroid Build Coastguard Worker cc_library { 6422*333d2b36SAndroid Build Coastguard Worker name: "libbar", 6423*333d2b36SAndroid Build Coastguard Worker stl: "none", 6424*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbaz"], 6425*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6426*333d2b36SAndroid Build Coastguard Worker apex_available: ["com.sdv.myapex"], 6427*333d2b36SAndroid Build Coastguard Worker product_specific: true, 6428*333d2b36SAndroid Build Coastguard Worker } 6429*333d2b36SAndroid Build Coastguard Worker 6430*333d2b36SAndroid Build Coastguard Worker cc_library { 6431*333d2b36SAndroid Build Coastguard Worker name: "libbaz", 6432*333d2b36SAndroid Build Coastguard Worker stl: "none", 6433*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6434*333d2b36SAndroid Build Coastguard Worker product_specific: true, 6435*333d2b36SAndroid Build Coastguard Worker }`, 6436*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs(android.MockFS{ 6437*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil, 6438*333d2b36SAndroid Build Coastguard Worker })) 6439*333d2b36SAndroid Build Coastguard Worker 6440*333d2b36SAndroid Build Coastguard Worker // 'apex_available' check is not bypassed for non-product apex with a specific prefix. 6441*333d2b36SAndroid Build Coastguard Worker testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, ` 6442*333d2b36SAndroid Build Coastguard Worker apex { 6443*333d2b36SAndroid Build Coastguard Worker name: "com.sdv.myapex", 6444*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6445*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 6446*333d2b36SAndroid Build Coastguard Worker updatable: false, 6447*333d2b36SAndroid Build Coastguard Worker } 6448*333d2b36SAndroid Build Coastguard Worker 6449*333d2b36SAndroid Build Coastguard Worker apex_key { 6450*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 6451*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6452*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6453*333d2b36SAndroid Build Coastguard Worker } 6454*333d2b36SAndroid Build Coastguard Worker 6455*333d2b36SAndroid Build Coastguard Worker cc_library { 6456*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 6457*333d2b36SAndroid Build Coastguard Worker stl: "none", 6458*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbar"], 6459*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6460*333d2b36SAndroid Build Coastguard Worker apex_available: ["com.sdv.myapex"], 6461*333d2b36SAndroid Build Coastguard Worker } 6462*333d2b36SAndroid Build Coastguard Worker 6463*333d2b36SAndroid Build Coastguard Worker cc_library { 6464*333d2b36SAndroid Build Coastguard Worker name: "libbar", 6465*333d2b36SAndroid Build Coastguard Worker stl: "none", 6466*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbaz"], 6467*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6468*333d2b36SAndroid Build Coastguard Worker apex_available: ["com.sdv.myapex"], 6469*333d2b36SAndroid Build Coastguard Worker } 6470*333d2b36SAndroid Build Coastguard Worker 6471*333d2b36SAndroid Build Coastguard Worker cc_library { 6472*333d2b36SAndroid Build Coastguard Worker name: "libbaz", 6473*333d2b36SAndroid Build Coastguard Worker stl: "none", 6474*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6475*333d2b36SAndroid Build Coastguard Worker }`, 6476*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs(android.MockFS{ 6477*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil, 6478*333d2b36SAndroid Build Coastguard Worker })) 6479*333d2b36SAndroid Build Coastguard Worker} 6480*333d2b36SAndroid Build Coastguard Worker 6481*333d2b36SAndroid Build Coastguard Workerfunc TestApexAvailable_IndirectStaticDep(t *testing.T) { 6482*333d2b36SAndroid Build Coastguard Worker t.Parallel() 6483*333d2b36SAndroid Build Coastguard Worker testApex(t, ` 6484*333d2b36SAndroid Build Coastguard Worker apex { 6485*333d2b36SAndroid Build Coastguard Worker name: "myapex", 6486*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6487*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 6488*333d2b36SAndroid Build Coastguard Worker updatable: false, 6489*333d2b36SAndroid Build Coastguard Worker } 6490*333d2b36SAndroid Build Coastguard Worker 6491*333d2b36SAndroid Build Coastguard Worker apex_key { 6492*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 6493*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6494*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6495*333d2b36SAndroid Build Coastguard Worker } 6496*333d2b36SAndroid Build Coastguard Worker 6497*333d2b36SAndroid Build Coastguard Worker cc_library { 6498*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 6499*333d2b36SAndroid Build Coastguard Worker stl: "none", 6500*333d2b36SAndroid Build Coastguard Worker static_libs: ["libbar"], 6501*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6502*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 6503*333d2b36SAndroid Build Coastguard Worker } 6504*333d2b36SAndroid Build Coastguard Worker 6505*333d2b36SAndroid Build Coastguard Worker cc_library { 6506*333d2b36SAndroid Build Coastguard Worker name: "libbar", 6507*333d2b36SAndroid Build Coastguard Worker stl: "none", 6508*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbaz"], 6509*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6510*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 6511*333d2b36SAndroid Build Coastguard Worker } 6512*333d2b36SAndroid Build Coastguard Worker 6513*333d2b36SAndroid Build Coastguard Worker cc_library { 6514*333d2b36SAndroid Build Coastguard Worker name: "libbaz", 6515*333d2b36SAndroid Build Coastguard Worker stl: "none", 6516*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6517*333d2b36SAndroid Build Coastguard Worker }`) 6518*333d2b36SAndroid Build Coastguard Worker 6519*333d2b36SAndroid Build Coastguard Worker testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, ` 6520*333d2b36SAndroid Build Coastguard Worker apex { 6521*333d2b36SAndroid Build Coastguard Worker name: "myapex", 6522*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6523*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 6524*333d2b36SAndroid Build Coastguard Worker updatable: false, 6525*333d2b36SAndroid Build Coastguard Worker } 6526*333d2b36SAndroid Build Coastguard Worker 6527*333d2b36SAndroid Build Coastguard Worker apex_key { 6528*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 6529*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6530*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6531*333d2b36SAndroid Build Coastguard Worker } 6532*333d2b36SAndroid Build Coastguard Worker 6533*333d2b36SAndroid Build Coastguard Worker cc_library { 6534*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 6535*333d2b36SAndroid Build Coastguard Worker stl: "none", 6536*333d2b36SAndroid Build Coastguard Worker static_libs: ["libbar"], 6537*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6538*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 6539*333d2b36SAndroid Build Coastguard Worker } 6540*333d2b36SAndroid Build Coastguard Worker 6541*333d2b36SAndroid Build Coastguard Worker cc_library { 6542*333d2b36SAndroid Build Coastguard Worker name: "libbar", 6543*333d2b36SAndroid Build Coastguard Worker stl: "none", 6544*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6545*333d2b36SAndroid Build Coastguard Worker }`) 6546*333d2b36SAndroid Build Coastguard Worker} 6547*333d2b36SAndroid Build Coastguard Worker 6548*333d2b36SAndroid Build Coastguard Workerfunc TestApexAvailable_InvalidApexName(t *testing.T) { 6549*333d2b36SAndroid Build Coastguard Worker t.Parallel() 6550*333d2b36SAndroid Build Coastguard Worker testApexError(t, "\"otherapex\" is not a valid module name", ` 6551*333d2b36SAndroid Build Coastguard Worker apex { 6552*333d2b36SAndroid Build Coastguard Worker name: "myapex", 6553*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6554*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 6555*333d2b36SAndroid Build Coastguard Worker updatable: false, 6556*333d2b36SAndroid Build Coastguard Worker } 6557*333d2b36SAndroid Build Coastguard Worker 6558*333d2b36SAndroid Build Coastguard Worker apex_key { 6559*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 6560*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6561*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6562*333d2b36SAndroid Build Coastguard Worker } 6563*333d2b36SAndroid Build Coastguard Worker 6564*333d2b36SAndroid Build Coastguard Worker cc_library { 6565*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 6566*333d2b36SAndroid Build Coastguard Worker stl: "none", 6567*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6568*333d2b36SAndroid Build Coastguard Worker apex_available: ["otherapex"], 6569*333d2b36SAndroid Build Coastguard Worker }`) 6570*333d2b36SAndroid Build Coastguard Worker 6571*333d2b36SAndroid Build Coastguard Worker testApex(t, ` 6572*333d2b36SAndroid Build Coastguard Worker apex { 6573*333d2b36SAndroid Build Coastguard Worker name: "myapex", 6574*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6575*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo", "libbar"], 6576*333d2b36SAndroid Build Coastguard Worker updatable: false, 6577*333d2b36SAndroid Build Coastguard Worker } 6578*333d2b36SAndroid Build Coastguard Worker 6579*333d2b36SAndroid Build Coastguard Worker apex_key { 6580*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 6581*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6582*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6583*333d2b36SAndroid Build Coastguard Worker } 6584*333d2b36SAndroid Build Coastguard Worker 6585*333d2b36SAndroid Build Coastguard Worker cc_library { 6586*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 6587*333d2b36SAndroid Build Coastguard Worker stl: "none", 6588*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6589*333d2b36SAndroid Build Coastguard Worker runtime_libs: ["libbaz"], 6590*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 6591*333d2b36SAndroid Build Coastguard Worker } 6592*333d2b36SAndroid Build Coastguard Worker 6593*333d2b36SAndroid Build Coastguard Worker cc_library { 6594*333d2b36SAndroid Build Coastguard Worker name: "libbar", 6595*333d2b36SAndroid Build Coastguard Worker stl: "none", 6596*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6597*333d2b36SAndroid Build Coastguard Worker apex_available: ["//apex_available:anyapex"], 6598*333d2b36SAndroid Build Coastguard Worker } 6599*333d2b36SAndroid Build Coastguard Worker 6600*333d2b36SAndroid Build Coastguard Worker cc_library { 6601*333d2b36SAndroid Build Coastguard Worker name: "libbaz", 6602*333d2b36SAndroid Build Coastguard Worker stl: "none", 6603*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6604*333d2b36SAndroid Build Coastguard Worker stubs: { 6605*333d2b36SAndroid Build Coastguard Worker versions: ["10", "20", "30"], 6606*333d2b36SAndroid Build Coastguard Worker }, 6607*333d2b36SAndroid Build Coastguard Worker }`) 6608*333d2b36SAndroid Build Coastguard Worker} 6609*333d2b36SAndroid Build Coastguard Worker 6610*333d2b36SAndroid Build Coastguard Workerfunc TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) { 6611*333d2b36SAndroid Build Coastguard Worker t.Parallel() 6612*333d2b36SAndroid Build Coastguard Worker t.Run("negative variant_version produces error", func(t *testing.T) { 6613*333d2b36SAndroid Build Coastguard Worker t.Parallel() 6614*333d2b36SAndroid Build Coastguard Worker testApexError(t, "expected an integer between 0-9; got -1", ` 6615*333d2b36SAndroid Build Coastguard Worker apex { 6616*333d2b36SAndroid Build Coastguard Worker name: "myapex", 6617*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6618*333d2b36SAndroid Build Coastguard Worker apex_available_name: "com.android.foo", 6619*333d2b36SAndroid Build Coastguard Worker variant_version: "-1", 6620*333d2b36SAndroid Build Coastguard Worker updatable: false, 6621*333d2b36SAndroid Build Coastguard Worker } 6622*333d2b36SAndroid Build Coastguard Worker apex_key { 6623*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 6624*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6625*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6626*333d2b36SAndroid Build Coastguard Worker } 6627*333d2b36SAndroid Build Coastguard Worker `) 6628*333d2b36SAndroid Build Coastguard Worker }) 6629*333d2b36SAndroid Build Coastguard Worker 6630*333d2b36SAndroid Build Coastguard Worker t.Run("variant_version greater than 9 produces error", func(t *testing.T) { 6631*333d2b36SAndroid Build Coastguard Worker t.Parallel() 6632*333d2b36SAndroid Build Coastguard Worker testApexError(t, "expected an integer between 0-9; got 10", ` 6633*333d2b36SAndroid Build Coastguard Worker apex { 6634*333d2b36SAndroid Build Coastguard Worker name: "myapex", 6635*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6636*333d2b36SAndroid Build Coastguard Worker apex_available_name: "com.android.foo", 6637*333d2b36SAndroid Build Coastguard Worker variant_version: "10", 6638*333d2b36SAndroid Build Coastguard Worker updatable: false, 6639*333d2b36SAndroid Build Coastguard Worker } 6640*333d2b36SAndroid Build Coastguard Worker apex_key { 6641*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 6642*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6643*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6644*333d2b36SAndroid Build Coastguard Worker } 6645*333d2b36SAndroid Build Coastguard Worker `) 6646*333d2b36SAndroid Build Coastguard Worker }) 6647*333d2b36SAndroid Build Coastguard Worker} 6648*333d2b36SAndroid Build Coastguard Worker 6649*333d2b36SAndroid Build Coastguard Workerfunc TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) { 6650*333d2b36SAndroid Build Coastguard Worker t.Parallel() 6651*333d2b36SAndroid Build Coastguard Worker context := android.GroupFixturePreparers( 6652*333d2b36SAndroid Build Coastguard Worker android.PrepareForIntegrationTestWithAndroid, 6653*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithApexBuildComponents, 6654*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs(android.MockFS{ 6655*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/foo-file_contexts": nil, 6656*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/bar-file_contexts": nil, 6657*333d2b36SAndroid Build Coastguard Worker }), 6658*333d2b36SAndroid Build Coastguard Worker ) 6659*333d2b36SAndroid Build Coastguard Worker result := context.RunTestWithBp(t, ` 6660*333d2b36SAndroid Build Coastguard Worker apex { 6661*333d2b36SAndroid Build Coastguard Worker name: "foo", 6662*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6663*333d2b36SAndroid Build Coastguard Worker apex_available_name: "com.android.foo", 6664*333d2b36SAndroid Build Coastguard Worker variant_version: "0", 6665*333d2b36SAndroid Build Coastguard Worker updatable: false, 6666*333d2b36SAndroid Build Coastguard Worker } 6667*333d2b36SAndroid Build Coastguard Worker apex { 6668*333d2b36SAndroid Build Coastguard Worker name: "bar", 6669*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6670*333d2b36SAndroid Build Coastguard Worker apex_available_name: "com.android.foo", 6671*333d2b36SAndroid Build Coastguard Worker variant_version: "3", 6672*333d2b36SAndroid Build Coastguard Worker updatable: false, 6673*333d2b36SAndroid Build Coastguard Worker } 6674*333d2b36SAndroid Build Coastguard Worker apex_key { 6675*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 6676*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6677*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6678*333d2b36SAndroid Build Coastguard Worker } 6679*333d2b36SAndroid Build Coastguard Worker override_apex { 6680*333d2b36SAndroid Build Coastguard Worker name: "myoverrideapex", 6681*333d2b36SAndroid Build Coastguard Worker base: "bar", 6682*333d2b36SAndroid Build Coastguard Worker } 6683*333d2b36SAndroid Build Coastguard Worker `) 6684*333d2b36SAndroid Build Coastguard Worker 6685*333d2b36SAndroid Build Coastguard Worker fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule") 6686*333d2b36SAndroid Build Coastguard Worker fooExpectedDefaultVersion := testDefaultUpdatableModuleVersion 6687*333d2b36SAndroid Build Coastguard Worker fooActualDefaultVersion := fooManifestRule.Args["default_version"] 6688*333d2b36SAndroid Build Coastguard Worker if fooActualDefaultVersion != fooExpectedDefaultVersion { 6689*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion) 6690*333d2b36SAndroid Build Coastguard Worker } 6691*333d2b36SAndroid Build Coastguard Worker 6692*333d2b36SAndroid Build Coastguard Worker barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule") 6693*333d2b36SAndroid Build Coastguard Worker defaultVersionInt, _ := strconv.Atoi(testDefaultUpdatableModuleVersion) 6694*333d2b36SAndroid Build Coastguard Worker barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3) 6695*333d2b36SAndroid Build Coastguard Worker barActualDefaultVersion := barManifestRule.Args["default_version"] 6696*333d2b36SAndroid Build Coastguard Worker if barActualDefaultVersion != barExpectedDefaultVersion { 6697*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion) 6698*333d2b36SAndroid Build Coastguard Worker } 6699*333d2b36SAndroid Build Coastguard Worker 6700*333d2b36SAndroid Build Coastguard Worker overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule") 6701*333d2b36SAndroid Build Coastguard Worker overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"] 6702*333d2b36SAndroid Build Coastguard Worker if overrideBarActualDefaultVersion != barExpectedDefaultVersion { 6703*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion) 6704*333d2b36SAndroid Build Coastguard Worker } 6705*333d2b36SAndroid Build Coastguard Worker} 6706*333d2b36SAndroid Build Coastguard Worker 6707*333d2b36SAndroid Build Coastguard Workerfunc TestApexAvailable_ApexAvailableName(t *testing.T) { 6708*333d2b36SAndroid Build Coastguard Worker t.Parallel() 6709*333d2b36SAndroid Build Coastguard Worker t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) { 6710*333d2b36SAndroid Build Coastguard Worker t.Parallel() 6711*333d2b36SAndroid Build Coastguard Worker testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", ` 6712*333d2b36SAndroid Build Coastguard Worker apex { 6713*333d2b36SAndroid Build Coastguard Worker name: "myapex_sminus", 6714*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6715*333d2b36SAndroid Build Coastguard Worker apps: ["AppFoo"], 6716*333d2b36SAndroid Build Coastguard Worker apex_available_name: "myapex", 6717*333d2b36SAndroid Build Coastguard Worker updatable: false, 6718*333d2b36SAndroid Build Coastguard Worker } 6719*333d2b36SAndroid Build Coastguard Worker apex { 6720*333d2b36SAndroid Build Coastguard Worker name: "myapex", 6721*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6722*333d2b36SAndroid Build Coastguard Worker apps: ["AppFoo"], 6723*333d2b36SAndroid Build Coastguard Worker updatable: false, 6724*333d2b36SAndroid Build Coastguard Worker } 6725*333d2b36SAndroid Build Coastguard Worker apex_key { 6726*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 6727*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6728*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6729*333d2b36SAndroid Build Coastguard Worker } 6730*333d2b36SAndroid Build Coastguard Worker android_app { 6731*333d2b36SAndroid Build Coastguard Worker name: "AppFoo", 6732*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 6733*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 6734*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 6735*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex_sminus" ], 6736*333d2b36SAndroid Build Coastguard Worker }`, 6737*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs(android.MockFS{ 6738*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/myapex_sminus-file_contexts": nil, 6739*333d2b36SAndroid Build Coastguard Worker }), 6740*333d2b36SAndroid Build Coastguard Worker ) 6741*333d2b36SAndroid Build Coastguard Worker }) 6742*333d2b36SAndroid Build Coastguard Worker 6743*333d2b36SAndroid Build Coastguard Worker t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) { 6744*333d2b36SAndroid Build Coastguard Worker t.Parallel() 6745*333d2b36SAndroid Build Coastguard Worker testApex(t, ` 6746*333d2b36SAndroid Build Coastguard Worker apex { 6747*333d2b36SAndroid Build Coastguard Worker name: "myapex_sminus", 6748*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6749*333d2b36SAndroid Build Coastguard Worker apps: ["AppFoo"], 6750*333d2b36SAndroid Build Coastguard Worker apex_available_name: "myapex", 6751*333d2b36SAndroid Build Coastguard Worker updatable: false, 6752*333d2b36SAndroid Build Coastguard Worker } 6753*333d2b36SAndroid Build Coastguard Worker apex { 6754*333d2b36SAndroid Build Coastguard Worker name: "myapex", 6755*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6756*333d2b36SAndroid Build Coastguard Worker apps: ["AppFoo"], 6757*333d2b36SAndroid Build Coastguard Worker updatable: false, 6758*333d2b36SAndroid Build Coastguard Worker } 6759*333d2b36SAndroid Build Coastguard Worker apex_key { 6760*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 6761*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6762*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6763*333d2b36SAndroid Build Coastguard Worker } 6764*333d2b36SAndroid Build Coastguard Worker android_app { 6765*333d2b36SAndroid Build Coastguard Worker name: "AppFoo", 6766*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 6767*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 6768*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 6769*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 6770*333d2b36SAndroid Build Coastguard Worker }`, 6771*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs(android.MockFS{ 6772*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/myapex_sminus-file_contexts": nil, 6773*333d2b36SAndroid Build Coastguard Worker }), 6774*333d2b36SAndroid Build Coastguard Worker ) 6775*333d2b36SAndroid Build Coastguard Worker }) 6776*333d2b36SAndroid Build Coastguard Worker 6777*333d2b36SAndroid Build Coastguard Worker t.Run("override_apexes work with apex_available_name", func(t *testing.T) { 6778*333d2b36SAndroid Build Coastguard Worker t.Parallel() 6779*333d2b36SAndroid Build Coastguard Worker testApex(t, ` 6780*333d2b36SAndroid Build Coastguard Worker override_apex { 6781*333d2b36SAndroid Build Coastguard Worker name: "myoverrideapex_sminus", 6782*333d2b36SAndroid Build Coastguard Worker base: "myapex_sminus", 6783*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6784*333d2b36SAndroid Build Coastguard Worker apps: ["AppFooOverride"], 6785*333d2b36SAndroid Build Coastguard Worker } 6786*333d2b36SAndroid Build Coastguard Worker override_apex { 6787*333d2b36SAndroid Build Coastguard Worker name: "myoverrideapex", 6788*333d2b36SAndroid Build Coastguard Worker base: "myapex", 6789*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6790*333d2b36SAndroid Build Coastguard Worker apps: ["AppFooOverride"], 6791*333d2b36SAndroid Build Coastguard Worker } 6792*333d2b36SAndroid Build Coastguard Worker apex { 6793*333d2b36SAndroid Build Coastguard Worker name: "myapex_sminus", 6794*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6795*333d2b36SAndroid Build Coastguard Worker apps: ["AppFoo"], 6796*333d2b36SAndroid Build Coastguard Worker apex_available_name: "myapex", 6797*333d2b36SAndroid Build Coastguard Worker updatable: false, 6798*333d2b36SAndroid Build Coastguard Worker } 6799*333d2b36SAndroid Build Coastguard Worker apex { 6800*333d2b36SAndroid Build Coastguard Worker name: "myapex", 6801*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6802*333d2b36SAndroid Build Coastguard Worker apps: ["AppFoo"], 6803*333d2b36SAndroid Build Coastguard Worker updatable: false, 6804*333d2b36SAndroid Build Coastguard Worker } 6805*333d2b36SAndroid Build Coastguard Worker apex_key { 6806*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 6807*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6808*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6809*333d2b36SAndroid Build Coastguard Worker } 6810*333d2b36SAndroid Build Coastguard Worker android_app { 6811*333d2b36SAndroid Build Coastguard Worker name: "AppFooOverride", 6812*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 6813*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 6814*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 6815*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 6816*333d2b36SAndroid Build Coastguard Worker } 6817*333d2b36SAndroid Build Coastguard Worker android_app { 6818*333d2b36SAndroid Build Coastguard Worker name: "AppFoo", 6819*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 6820*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 6821*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 6822*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 6823*333d2b36SAndroid Build Coastguard Worker }`, 6824*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs(android.MockFS{ 6825*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/myapex_sminus-file_contexts": nil, 6826*333d2b36SAndroid Build Coastguard Worker }), 6827*333d2b36SAndroid Build Coastguard Worker ) 6828*333d2b36SAndroid Build Coastguard Worker }) 6829*333d2b36SAndroid Build Coastguard Worker} 6830*333d2b36SAndroid Build Coastguard Worker 6831*333d2b36SAndroid Build Coastguard Workerfunc TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) { 6832*333d2b36SAndroid Build Coastguard Worker t.Parallel() 6833*333d2b36SAndroid Build Coastguard Worker context := android.GroupFixturePreparers( 6834*333d2b36SAndroid Build Coastguard Worker android.PrepareForIntegrationTestWithAndroid, 6835*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithApexBuildComponents, 6836*333d2b36SAndroid Build Coastguard Worker java.PrepareForTestWithDexpreopt, 6837*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs(android.MockFS{ 6838*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/myapex-file_contexts": nil, 6839*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/myapex_sminus-file_contexts": nil, 6840*333d2b36SAndroid Build Coastguard Worker }), 6841*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 6842*333d2b36SAndroid Build Coastguard Worker variables.BuildId = proptools.StringPtr("buildid") 6843*333d2b36SAndroid Build Coastguard Worker }), 6844*333d2b36SAndroid Build Coastguard Worker ) 6845*333d2b36SAndroid Build Coastguard Worker context.RunTestWithBp(t, ` 6846*333d2b36SAndroid Build Coastguard Worker override_apex { 6847*333d2b36SAndroid Build Coastguard Worker name: "myoverrideapex_sminus", 6848*333d2b36SAndroid Build Coastguard Worker base: "myapex_sminus", 6849*333d2b36SAndroid Build Coastguard Worker } 6850*333d2b36SAndroid Build Coastguard Worker override_apex { 6851*333d2b36SAndroid Build Coastguard Worker name: "myoverrideapex", 6852*333d2b36SAndroid Build Coastguard Worker base: "myapex", 6853*333d2b36SAndroid Build Coastguard Worker } 6854*333d2b36SAndroid Build Coastguard Worker apex { 6855*333d2b36SAndroid Build Coastguard Worker name: "myapex", 6856*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6857*333d2b36SAndroid Build Coastguard Worker apps: ["AppFoo"], 6858*333d2b36SAndroid Build Coastguard Worker updatable: false, 6859*333d2b36SAndroid Build Coastguard Worker } 6860*333d2b36SAndroid Build Coastguard Worker apex { 6861*333d2b36SAndroid Build Coastguard Worker name: "myapex_sminus", 6862*333d2b36SAndroid Build Coastguard Worker apex_available_name: "myapex", 6863*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6864*333d2b36SAndroid Build Coastguard Worker apps: ["AppFoo_sminus"], 6865*333d2b36SAndroid Build Coastguard Worker updatable: false, 6866*333d2b36SAndroid Build Coastguard Worker } 6867*333d2b36SAndroid Build Coastguard Worker apex_key { 6868*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 6869*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6870*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6871*333d2b36SAndroid Build Coastguard Worker } 6872*333d2b36SAndroid Build Coastguard Worker android_app { 6873*333d2b36SAndroid Build Coastguard Worker name: "AppFoo", 6874*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 6875*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 6876*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 6877*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 6878*333d2b36SAndroid Build Coastguard Worker } 6879*333d2b36SAndroid Build Coastguard Worker android_app { 6880*333d2b36SAndroid Build Coastguard Worker name: "AppFoo_sminus", 6881*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 6882*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 6883*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 6884*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 6885*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 6886*333d2b36SAndroid Build Coastguard Worker }`) 6887*333d2b36SAndroid Build Coastguard Worker} 6888*333d2b36SAndroid Build Coastguard Worker 6889*333d2b36SAndroid Build Coastguard Workerfunc TestApexAvailable_CheckForPlatform(t *testing.T) { 6890*333d2b36SAndroid Build Coastguard Worker t.Parallel() 6891*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 6892*333d2b36SAndroid Build Coastguard Worker apex { 6893*333d2b36SAndroid Build Coastguard Worker name: "myapex", 6894*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6895*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libbar", "libbaz"], 6896*333d2b36SAndroid Build Coastguard Worker updatable: false, 6897*333d2b36SAndroid Build Coastguard Worker } 6898*333d2b36SAndroid Build Coastguard Worker 6899*333d2b36SAndroid Build Coastguard Worker apex_key { 6900*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 6901*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6902*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6903*333d2b36SAndroid Build Coastguard Worker } 6904*333d2b36SAndroid Build Coastguard Worker 6905*333d2b36SAndroid Build Coastguard Worker cc_library { 6906*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 6907*333d2b36SAndroid Build Coastguard Worker stl: "none", 6908*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6909*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbar"], 6910*333d2b36SAndroid Build Coastguard Worker apex_available: ["//apex_available:platform"], 6911*333d2b36SAndroid Build Coastguard Worker } 6912*333d2b36SAndroid Build Coastguard Worker 6913*333d2b36SAndroid Build Coastguard Worker cc_library { 6914*333d2b36SAndroid Build Coastguard Worker name: "libfoo2", 6915*333d2b36SAndroid Build Coastguard Worker stl: "none", 6916*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6917*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbaz"], 6918*333d2b36SAndroid Build Coastguard Worker apex_available: ["//apex_available:platform"], 6919*333d2b36SAndroid Build Coastguard Worker } 6920*333d2b36SAndroid Build Coastguard Worker 6921*333d2b36SAndroid Build Coastguard Worker cc_library { 6922*333d2b36SAndroid Build Coastguard Worker name: "libbar", 6923*333d2b36SAndroid Build Coastguard Worker stl: "none", 6924*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6925*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 6926*333d2b36SAndroid Build Coastguard Worker } 6927*333d2b36SAndroid Build Coastguard Worker 6928*333d2b36SAndroid Build Coastguard Worker cc_library { 6929*333d2b36SAndroid Build Coastguard Worker name: "libbaz", 6930*333d2b36SAndroid Build Coastguard Worker stl: "none", 6931*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6932*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 6933*333d2b36SAndroid Build Coastguard Worker stubs: { 6934*333d2b36SAndroid Build Coastguard Worker versions: ["1"], 6935*333d2b36SAndroid Build Coastguard Worker }, 6936*333d2b36SAndroid Build Coastguard Worker }`) 6937*333d2b36SAndroid Build Coastguard Worker 6938*333d2b36SAndroid Build Coastguard Worker // libfoo shouldn't be available to platform even though it has "//apex_available:platform", 6939*333d2b36SAndroid Build Coastguard Worker // because it depends on libbar which isn't available to platform 6940*333d2b36SAndroid Build Coastguard Worker libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module) 6941*333d2b36SAndroid Build Coastguard Worker if libfoo.NotAvailableForPlatform() != true { 6942*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q shouldn't be available to platform", libfoo.String()) 6943*333d2b36SAndroid Build Coastguard Worker } 6944*333d2b36SAndroid Build Coastguard Worker 6945*333d2b36SAndroid Build Coastguard Worker // libfoo2 however can be available to platform because it depends on libbaz which provides 6946*333d2b36SAndroid Build Coastguard Worker // stubs 6947*333d2b36SAndroid Build Coastguard Worker libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module) 6948*333d2b36SAndroid Build Coastguard Worker if libfoo2.NotAvailableForPlatform() == true { 6949*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q should be available to platform", libfoo2.String()) 6950*333d2b36SAndroid Build Coastguard Worker } 6951*333d2b36SAndroid Build Coastguard Worker} 6952*333d2b36SAndroid Build Coastguard Worker 6953*333d2b36SAndroid Build Coastguard Workerfunc TestApexAvailable_CreatedForApex(t *testing.T) { 6954*333d2b36SAndroid Build Coastguard Worker t.Parallel() 6955*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 6956*333d2b36SAndroid Build Coastguard Worker apex { 6957*333d2b36SAndroid Build Coastguard Worker name: "myapex", 6958*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 6959*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 6960*333d2b36SAndroid Build Coastguard Worker updatable: false, 6961*333d2b36SAndroid Build Coastguard Worker } 6962*333d2b36SAndroid Build Coastguard Worker 6963*333d2b36SAndroid Build Coastguard Worker apex_key { 6964*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 6965*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 6966*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 6967*333d2b36SAndroid Build Coastguard Worker } 6968*333d2b36SAndroid Build Coastguard Worker 6969*333d2b36SAndroid Build Coastguard Worker cc_library { 6970*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 6971*333d2b36SAndroid Build Coastguard Worker stl: "none", 6972*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 6973*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 6974*333d2b36SAndroid Build Coastguard Worker static: { 6975*333d2b36SAndroid Build Coastguard Worker apex_available: ["//apex_available:platform"], 6976*333d2b36SAndroid Build Coastguard Worker }, 6977*333d2b36SAndroid Build Coastguard Worker }`) 6978*333d2b36SAndroid Build Coastguard Worker 6979*333d2b36SAndroid Build Coastguard Worker libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module) 6980*333d2b36SAndroid Build Coastguard Worker if libfooShared.NotAvailableForPlatform() != true { 6981*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q shouldn't be available to platform", libfooShared.String()) 6982*333d2b36SAndroid Build Coastguard Worker } 6983*333d2b36SAndroid Build Coastguard Worker libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module) 6984*333d2b36SAndroid Build Coastguard Worker if libfooStatic.NotAvailableForPlatform() != false { 6985*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q should be available to platform", libfooStatic.String()) 6986*333d2b36SAndroid Build Coastguard Worker } 6987*333d2b36SAndroid Build Coastguard Worker} 6988*333d2b36SAndroid Build Coastguard Worker 6989*333d2b36SAndroid Build Coastguard Workerfunc TestApexAvailable_PrefixMatch(t *testing.T) { 6990*333d2b36SAndroid Build Coastguard Worker t.Parallel() 6991*333d2b36SAndroid Build Coastguard Worker 6992*333d2b36SAndroid Build Coastguard Worker for _, tc := range []struct { 6993*333d2b36SAndroid Build Coastguard Worker name string 6994*333d2b36SAndroid Build Coastguard Worker apexAvailable string 6995*333d2b36SAndroid Build Coastguard Worker expectedError string 6996*333d2b36SAndroid Build Coastguard Worker }{ 6997*333d2b36SAndroid Build Coastguard Worker { 6998*333d2b36SAndroid Build Coastguard Worker name: "prefix matches correctly", 6999*333d2b36SAndroid Build Coastguard Worker apexAvailable: "com.foo.*", 7000*333d2b36SAndroid Build Coastguard Worker }, 7001*333d2b36SAndroid Build Coastguard Worker { 7002*333d2b36SAndroid Build Coastguard Worker name: "prefix doesn't match", 7003*333d2b36SAndroid Build Coastguard Worker apexAvailable: "com.bar.*", 7004*333d2b36SAndroid Build Coastguard Worker expectedError: `Consider .* "com.foo\.\*"`, 7005*333d2b36SAndroid Build Coastguard Worker }, 7006*333d2b36SAndroid Build Coastguard Worker { 7007*333d2b36SAndroid Build Coastguard Worker name: "short prefix", 7008*333d2b36SAndroid Build Coastguard Worker apexAvailable: "com.*", 7009*333d2b36SAndroid Build Coastguard Worker expectedError: "requires two or more components", 7010*333d2b36SAndroid Build Coastguard Worker }, 7011*333d2b36SAndroid Build Coastguard Worker { 7012*333d2b36SAndroid Build Coastguard Worker name: "wildcard not in the end", 7013*333d2b36SAndroid Build Coastguard Worker apexAvailable: "com.*.foo", 7014*333d2b36SAndroid Build Coastguard Worker expectedError: "should end with .*", 7015*333d2b36SAndroid Build Coastguard Worker }, 7016*333d2b36SAndroid Build Coastguard Worker { 7017*333d2b36SAndroid Build Coastguard Worker name: "wildcard in the middle", 7018*333d2b36SAndroid Build Coastguard Worker apexAvailable: "com.foo*.*", 7019*333d2b36SAndroid Build Coastguard Worker expectedError: "not allowed in the middle", 7020*333d2b36SAndroid Build Coastguard Worker }, 7021*333d2b36SAndroid Build Coastguard Worker { 7022*333d2b36SAndroid Build Coastguard Worker name: "hint with prefix pattern", 7023*333d2b36SAndroid Build Coastguard Worker apexAvailable: "//apex_available:platform", 7024*333d2b36SAndroid Build Coastguard Worker expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"", 7025*333d2b36SAndroid Build Coastguard Worker }, 7026*333d2b36SAndroid Build Coastguard Worker } { 7027*333d2b36SAndroid Build Coastguard Worker t.Run(tc.name, func(t *testing.T) { 7028*333d2b36SAndroid Build Coastguard Worker t.Parallel() 7029*333d2b36SAndroid Build Coastguard Worker errorHandler := android.FixtureExpectsNoErrors 7030*333d2b36SAndroid Build Coastguard Worker if tc.expectedError != "" { 7031*333d2b36SAndroid Build Coastguard Worker errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError) 7032*333d2b36SAndroid Build Coastguard Worker } 7033*333d2b36SAndroid Build Coastguard Worker context := android.GroupFixturePreparers( 7034*333d2b36SAndroid Build Coastguard Worker prepareForApexTest, 7035*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs(android.MockFS{ 7036*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/com.foo.bar-file_contexts": nil, 7037*333d2b36SAndroid Build Coastguard Worker }), 7038*333d2b36SAndroid Build Coastguard Worker ).ExtendWithErrorHandler(errorHandler) 7039*333d2b36SAndroid Build Coastguard Worker 7040*333d2b36SAndroid Build Coastguard Worker context.RunTestWithBp(t, ` 7041*333d2b36SAndroid Build Coastguard Worker apex { 7042*333d2b36SAndroid Build Coastguard Worker name: "com.foo.bar", 7043*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 7044*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 7045*333d2b36SAndroid Build Coastguard Worker updatable: false, 7046*333d2b36SAndroid Build Coastguard Worker } 7047*333d2b36SAndroid Build Coastguard Worker 7048*333d2b36SAndroid Build Coastguard Worker apex_key { 7049*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 7050*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 7051*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 7052*333d2b36SAndroid Build Coastguard Worker } 7053*333d2b36SAndroid Build Coastguard Worker 7054*333d2b36SAndroid Build Coastguard Worker cc_library { 7055*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 7056*333d2b36SAndroid Build Coastguard Worker stl: "none", 7057*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 7058*333d2b36SAndroid Build Coastguard Worker apex_available: ["`+tc.apexAvailable+`"], 7059*333d2b36SAndroid Build Coastguard Worker }`) 7060*333d2b36SAndroid Build Coastguard Worker }) 7061*333d2b36SAndroid Build Coastguard Worker } 7062*333d2b36SAndroid Build Coastguard Worker testApexError(t, `Consider adding "com.foo" to`, ` 7063*333d2b36SAndroid Build Coastguard Worker apex { 7064*333d2b36SAndroid Build Coastguard Worker name: "com.foo", // too short for a partner apex 7065*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 7066*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 7067*333d2b36SAndroid Build Coastguard Worker updatable: false, 7068*333d2b36SAndroid Build Coastguard Worker } 7069*333d2b36SAndroid Build Coastguard Worker 7070*333d2b36SAndroid Build Coastguard Worker apex_key { 7071*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 7072*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 7073*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 7074*333d2b36SAndroid Build Coastguard Worker } 7075*333d2b36SAndroid Build Coastguard Worker 7076*333d2b36SAndroid Build Coastguard Worker cc_library { 7077*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 7078*333d2b36SAndroid Build Coastguard Worker stl: "none", 7079*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 7080*333d2b36SAndroid Build Coastguard Worker } 7081*333d2b36SAndroid Build Coastguard Worker `) 7082*333d2b36SAndroid Build Coastguard Worker} 7083*333d2b36SAndroid Build Coastguard Worker 7084*333d2b36SAndroid Build Coastguard Workerfunc TestApexValidation_TestApexCanSkipInitRcCheck(t *testing.T) { 7085*333d2b36SAndroid Build Coastguard Worker t.Parallel() 7086*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 7087*333d2b36SAndroid Build Coastguard Worker apex_test { 7088*333d2b36SAndroid Build Coastguard Worker name: "myapex", 7089*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 7090*333d2b36SAndroid Build Coastguard Worker skip_validations: { 7091*333d2b36SAndroid Build Coastguard Worker host_apex_verifier: true, 7092*333d2b36SAndroid Build Coastguard Worker }, 7093*333d2b36SAndroid Build Coastguard Worker updatable: false, 7094*333d2b36SAndroid Build Coastguard Worker } 7095*333d2b36SAndroid Build Coastguard Worker apex_key { 7096*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 7097*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 7098*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 7099*333d2b36SAndroid Build Coastguard Worker } 7100*333d2b36SAndroid Build Coastguard Worker `) 7101*333d2b36SAndroid Build Coastguard Worker 7102*333d2b36SAndroid Build Coastguard Worker validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings() 7103*333d2b36SAndroid Build Coastguard Worker if android.SuffixInList(validations, "host_apex_verifier.timestamp") { 7104*333d2b36SAndroid Build Coastguard Worker t.Error("should not run host_apex_verifier") 7105*333d2b36SAndroid Build Coastguard Worker } 7106*333d2b36SAndroid Build Coastguard Worker} 7107*333d2b36SAndroid Build Coastguard Worker 7108*333d2b36SAndroid Build Coastguard Workerfunc TestApexValidation_TestApexCheckInitRc(t *testing.T) { 7109*333d2b36SAndroid Build Coastguard Worker t.Parallel() 7110*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 7111*333d2b36SAndroid Build Coastguard Worker apex_test { 7112*333d2b36SAndroid Build Coastguard Worker name: "myapex", 7113*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 7114*333d2b36SAndroid Build Coastguard Worker updatable: false, 7115*333d2b36SAndroid Build Coastguard Worker } 7116*333d2b36SAndroid Build Coastguard Worker apex_key { 7117*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 7118*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 7119*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 7120*333d2b36SAndroid Build Coastguard Worker } 7121*333d2b36SAndroid Build Coastguard Worker `) 7122*333d2b36SAndroid Build Coastguard Worker 7123*333d2b36SAndroid Build Coastguard Worker validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings() 7124*333d2b36SAndroid Build Coastguard Worker if !android.SuffixInList(validations, "host_apex_verifier.timestamp") { 7125*333d2b36SAndroid Build Coastguard Worker t.Error("should run host_apex_verifier") 7126*333d2b36SAndroid Build Coastguard Worker } 7127*333d2b36SAndroid Build Coastguard Worker} 7128*333d2b36SAndroid Build Coastguard Worker 7129*333d2b36SAndroid Build Coastguard Workerfunc TestOverrideApex(t *testing.T) { 7130*333d2b36SAndroid Build Coastguard Worker t.Parallel() 7131*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 7132*333d2b36SAndroid Build Coastguard Worker apex { 7133*333d2b36SAndroid Build Coastguard Worker name: "myapex", 7134*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 7135*333d2b36SAndroid Build Coastguard Worker apps: ["app"], 7136*333d2b36SAndroid Build Coastguard Worker bpfs: ["bpf"], 7137*333d2b36SAndroid Build Coastguard Worker prebuilts: ["myetc"], 7138*333d2b36SAndroid Build Coastguard Worker overrides: ["oldapex"], 7139*333d2b36SAndroid Build Coastguard Worker updatable: false, 7140*333d2b36SAndroid Build Coastguard Worker } 7141*333d2b36SAndroid Build Coastguard Worker 7142*333d2b36SAndroid Build Coastguard Worker override_apex { 7143*333d2b36SAndroid Build Coastguard Worker name: "override_myapex", 7144*333d2b36SAndroid Build Coastguard Worker base: "myapex", 7145*333d2b36SAndroid Build Coastguard Worker apps: ["override_app"], 7146*333d2b36SAndroid Build Coastguard Worker bpfs: ["overrideBpf"], 7147*333d2b36SAndroid Build Coastguard Worker prebuilts: ["override_myetc"], 7148*333d2b36SAndroid Build Coastguard Worker overrides: ["unknownapex"], 7149*333d2b36SAndroid Build Coastguard Worker compile_multilib: "first", 7150*333d2b36SAndroid Build Coastguard Worker multilib: { 7151*333d2b36SAndroid Build Coastguard Worker lib32: { 7152*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib32"], 7153*333d2b36SAndroid Build Coastguard Worker }, 7154*333d2b36SAndroid Build Coastguard Worker lib64: { 7155*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib64"], 7156*333d2b36SAndroid Build Coastguard Worker }, 7157*333d2b36SAndroid Build Coastguard Worker }, 7158*333d2b36SAndroid Build Coastguard Worker logging_parent: "com.foo.bar", 7159*333d2b36SAndroid Build Coastguard Worker package_name: "test.overridden.package", 7160*333d2b36SAndroid Build Coastguard Worker key: "mynewapex.key", 7161*333d2b36SAndroid Build Coastguard Worker certificate: ":myapex.certificate", 7162*333d2b36SAndroid Build Coastguard Worker } 7163*333d2b36SAndroid Build Coastguard Worker 7164*333d2b36SAndroid Build Coastguard Worker apex_key { 7165*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 7166*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 7167*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 7168*333d2b36SAndroid Build Coastguard Worker } 7169*333d2b36SAndroid Build Coastguard Worker 7170*333d2b36SAndroid Build Coastguard Worker apex_key { 7171*333d2b36SAndroid Build Coastguard Worker name: "mynewapex.key", 7172*333d2b36SAndroid Build Coastguard Worker public_key: "testkey2.avbpubkey", 7173*333d2b36SAndroid Build Coastguard Worker private_key: "testkey2.pem", 7174*333d2b36SAndroid Build Coastguard Worker } 7175*333d2b36SAndroid Build Coastguard Worker 7176*333d2b36SAndroid Build Coastguard Worker android_app_certificate { 7177*333d2b36SAndroid Build Coastguard Worker name: "myapex.certificate", 7178*333d2b36SAndroid Build Coastguard Worker certificate: "testkey", 7179*333d2b36SAndroid Build Coastguard Worker } 7180*333d2b36SAndroid Build Coastguard Worker 7181*333d2b36SAndroid Build Coastguard Worker android_app { 7182*333d2b36SAndroid Build Coastguard Worker name: "app", 7183*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 7184*333d2b36SAndroid Build Coastguard Worker package_name: "foo", 7185*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 7186*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 7187*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 7188*333d2b36SAndroid Build Coastguard Worker } 7189*333d2b36SAndroid Build Coastguard Worker 7190*333d2b36SAndroid Build Coastguard Worker override_android_app { 7191*333d2b36SAndroid Build Coastguard Worker name: "override_app", 7192*333d2b36SAndroid Build Coastguard Worker base: "app", 7193*333d2b36SAndroid Build Coastguard Worker package_name: "bar", 7194*333d2b36SAndroid Build Coastguard Worker } 7195*333d2b36SAndroid Build Coastguard Worker 7196*333d2b36SAndroid Build Coastguard Worker bpf { 7197*333d2b36SAndroid Build Coastguard Worker name: "bpf", 7198*333d2b36SAndroid Build Coastguard Worker srcs: ["bpf.c"], 7199*333d2b36SAndroid Build Coastguard Worker } 7200*333d2b36SAndroid Build Coastguard Worker 7201*333d2b36SAndroid Build Coastguard Worker bpf { 7202*333d2b36SAndroid Build Coastguard Worker name: "overrideBpf", 7203*333d2b36SAndroid Build Coastguard Worker srcs: ["overrideBpf.c"], 7204*333d2b36SAndroid Build Coastguard Worker } 7205*333d2b36SAndroid Build Coastguard Worker 7206*333d2b36SAndroid Build Coastguard Worker prebuilt_etc { 7207*333d2b36SAndroid Build Coastguard Worker name: "myetc", 7208*333d2b36SAndroid Build Coastguard Worker src: "myprebuilt", 7209*333d2b36SAndroid Build Coastguard Worker } 7210*333d2b36SAndroid Build Coastguard Worker 7211*333d2b36SAndroid Build Coastguard Worker prebuilt_etc { 7212*333d2b36SAndroid Build Coastguard Worker name: "override_myetc", 7213*333d2b36SAndroid Build Coastguard Worker src: "override_myprebuilt", 7214*333d2b36SAndroid Build Coastguard Worker } 7215*333d2b36SAndroid Build Coastguard Worker 7216*333d2b36SAndroid Build Coastguard Worker cc_library { 7217*333d2b36SAndroid Build Coastguard Worker name: "mylib32", 7218*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 7219*333d2b36SAndroid Build Coastguard Worker } 7220*333d2b36SAndroid Build Coastguard Worker 7221*333d2b36SAndroid Build Coastguard Worker cc_library { 7222*333d2b36SAndroid Build Coastguard Worker name: "mylib64", 7223*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 7224*333d2b36SAndroid Build Coastguard Worker } 7225*333d2b36SAndroid Build Coastguard Worker `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"})) 7226*333d2b36SAndroid Build Coastguard Worker 7227*333d2b36SAndroid Build Coastguard Worker originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule) 7228*333d2b36SAndroid Build Coastguard Worker overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule) 7229*333d2b36SAndroid Build Coastguard Worker if originalVariant.GetOverriddenBy() != "" { 7230*333d2b36SAndroid Build Coastguard Worker t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy()) 7231*333d2b36SAndroid Build Coastguard Worker } 7232*333d2b36SAndroid Build Coastguard Worker if overriddenVariant.GetOverriddenBy() != "override_myapex" { 7233*333d2b36SAndroid Build Coastguard Worker t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy()) 7234*333d2b36SAndroid Build Coastguard Worker } 7235*333d2b36SAndroid Build Coastguard Worker 7236*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex") 7237*333d2b36SAndroid Build Coastguard Worker apexRule := module.Rule("apexRule") 7238*333d2b36SAndroid Build Coastguard Worker copyCmds := apexRule.Args["copy_commands"] 7239*333d2b36SAndroid Build Coastguard Worker 7240*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk") 7241*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk") 7242*333d2b36SAndroid Build Coastguard Worker 7243*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o") 7244*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o") 7245*333d2b36SAndroid Build Coastguard Worker 7246*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, copyCmds, "image.apex/etc/myetc") 7247*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/etc/override_myetc") 7248*333d2b36SAndroid Build Coastguard Worker 7249*333d2b36SAndroid Build Coastguard Worker apexBundle := module.Module().(*apexBundle) 7250*333d2b36SAndroid Build Coastguard Worker name := apexBundle.Name() 7251*333d2b36SAndroid Build Coastguard Worker if name != "override_myapex" { 7252*333d2b36SAndroid Build Coastguard Worker t.Errorf("name should be \"override_myapex\", but was %q", name) 7253*333d2b36SAndroid Build Coastguard Worker } 7254*333d2b36SAndroid Build Coastguard Worker 7255*333d2b36SAndroid Build Coastguard Worker if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" { 7256*333d2b36SAndroid Build Coastguard Worker t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent) 7257*333d2b36SAndroid Build Coastguard Worker } 7258*333d2b36SAndroid Build Coastguard Worker 7259*333d2b36SAndroid Build Coastguard Worker optFlags := apexRule.Args["opt_flags"] 7260*333d2b36SAndroid Build Coastguard Worker ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package") 7261*333d2b36SAndroid Build Coastguard Worker ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey") 7262*333d2b36SAndroid Build Coastguard Worker 7263*333d2b36SAndroid Build Coastguard Worker signApkRule := module.Rule("signapk") 7264*333d2b36SAndroid Build Coastguard Worker ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8") 7265*333d2b36SAndroid Build Coastguard Worker 7266*333d2b36SAndroid Build Coastguard Worker data := android.AndroidMkDataForTest(t, ctx, apexBundle) 7267*333d2b36SAndroid Build Coastguard Worker var builder strings.Builder 7268*333d2b36SAndroid Build Coastguard Worker data.Custom(&builder, name, "TARGET_", "", data) 7269*333d2b36SAndroid Build Coastguard Worker androidMk := builder.String() 7270*333d2b36SAndroid Build Coastguard Worker ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex") 7271*333d2b36SAndroid Build Coastguard Worker ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex") 7272*333d2b36SAndroid Build Coastguard Worker ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex") 7273*333d2b36SAndroid Build Coastguard Worker ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex") 7274*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex") 7275*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex") 7276*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex") 7277*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex") 7278*333d2b36SAndroid Build Coastguard Worker} 7279*333d2b36SAndroid Build Coastguard Worker 7280*333d2b36SAndroid Build Coastguard Workerfunc TestMinSdkVersionOverride(t *testing.T) { 7281*333d2b36SAndroid Build Coastguard Worker t.Parallel() 7282*333d2b36SAndroid Build Coastguard Worker // Override from 29 to 31 7283*333d2b36SAndroid Build Coastguard Worker minSdkOverride31 := "31" 7284*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 7285*333d2b36SAndroid Build Coastguard Worker apex { 7286*333d2b36SAndroid Build Coastguard Worker name: "myapex", 7287*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 7288*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 7289*333d2b36SAndroid Build Coastguard Worker updatable: true, 7290*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29" 7291*333d2b36SAndroid Build Coastguard Worker } 7292*333d2b36SAndroid Build Coastguard Worker 7293*333d2b36SAndroid Build Coastguard Worker override_apex { 7294*333d2b36SAndroid Build Coastguard Worker name: "override_myapex", 7295*333d2b36SAndroid Build Coastguard Worker base: "myapex", 7296*333d2b36SAndroid Build Coastguard Worker logging_parent: "com.foo.bar", 7297*333d2b36SAndroid Build Coastguard Worker package_name: "test.overridden.package" 7298*333d2b36SAndroid Build Coastguard Worker } 7299*333d2b36SAndroid Build Coastguard Worker 7300*333d2b36SAndroid Build Coastguard Worker apex_key { 7301*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 7302*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 7303*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 7304*333d2b36SAndroid Build Coastguard Worker } 7305*333d2b36SAndroid Build Coastguard Worker 7306*333d2b36SAndroid Build Coastguard Worker cc_library { 7307*333d2b36SAndroid Build Coastguard Worker name: "mylib", 7308*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 7309*333d2b36SAndroid Build Coastguard Worker runtime_libs: ["libbar"], 7310*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 7311*333d2b36SAndroid Build Coastguard Worker stl: "none", 7312*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 7313*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "apex_inherit" 7314*333d2b36SAndroid Build Coastguard Worker } 7315*333d2b36SAndroid Build Coastguard Worker 7316*333d2b36SAndroid Build Coastguard Worker cc_library { 7317*333d2b36SAndroid Build Coastguard Worker name: "libbar", 7318*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 7319*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 7320*333d2b36SAndroid Build Coastguard Worker stl: "none", 7321*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 7322*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "apex_inherit" 7323*333d2b36SAndroid Build Coastguard Worker } 7324*333d2b36SAndroid Build Coastguard Worker 7325*333d2b36SAndroid Build Coastguard Worker `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31)) 7326*333d2b36SAndroid Build Coastguard Worker 7327*333d2b36SAndroid Build Coastguard Worker apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule") 7328*333d2b36SAndroid Build Coastguard Worker copyCmds := apexRule.Args["copy_commands"] 7329*333d2b36SAndroid Build Coastguard Worker 7330*333d2b36SAndroid Build Coastguard Worker // Ensure that direct non-stubs dep is always included 7331*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/mylib.so") 7332*333d2b36SAndroid Build Coastguard Worker 7333*333d2b36SAndroid Build Coastguard Worker // Ensure that runtime_libs dep in included 7334*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/libbar.so") 7335*333d2b36SAndroid Build Coastguard Worker 7336*333d2b36SAndroid Build Coastguard Worker // Ensure libraries target overridden min_sdk_version value 7337*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31") 7338*333d2b36SAndroid Build Coastguard Worker} 7339*333d2b36SAndroid Build Coastguard Worker 7340*333d2b36SAndroid Build Coastguard Workerfunc TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) { 7341*333d2b36SAndroid Build Coastguard Worker t.Parallel() 7342*333d2b36SAndroid Build Coastguard Worker // Attempt to override from 31 to 29, should be a NOOP 7343*333d2b36SAndroid Build Coastguard Worker minSdkOverride29 := "29" 7344*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 7345*333d2b36SAndroid Build Coastguard Worker apex { 7346*333d2b36SAndroid Build Coastguard Worker name: "myapex", 7347*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 7348*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 7349*333d2b36SAndroid Build Coastguard Worker updatable: true, 7350*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "31" 7351*333d2b36SAndroid Build Coastguard Worker } 7352*333d2b36SAndroid Build Coastguard Worker 7353*333d2b36SAndroid Build Coastguard Worker override_apex { 7354*333d2b36SAndroid Build Coastguard Worker name: "override_myapex", 7355*333d2b36SAndroid Build Coastguard Worker base: "myapex", 7356*333d2b36SAndroid Build Coastguard Worker logging_parent: "com.foo.bar", 7357*333d2b36SAndroid Build Coastguard Worker package_name: "test.overridden.package" 7358*333d2b36SAndroid Build Coastguard Worker } 7359*333d2b36SAndroid Build Coastguard Worker 7360*333d2b36SAndroid Build Coastguard Worker apex_key { 7361*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 7362*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 7363*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 7364*333d2b36SAndroid Build Coastguard Worker } 7365*333d2b36SAndroid Build Coastguard Worker 7366*333d2b36SAndroid Build Coastguard Worker cc_library { 7367*333d2b36SAndroid Build Coastguard Worker name: "mylib", 7368*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 7369*333d2b36SAndroid Build Coastguard Worker runtime_libs: ["libbar"], 7370*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 7371*333d2b36SAndroid Build Coastguard Worker stl: "none", 7372*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 7373*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "apex_inherit" 7374*333d2b36SAndroid Build Coastguard Worker } 7375*333d2b36SAndroid Build Coastguard Worker 7376*333d2b36SAndroid Build Coastguard Worker cc_library { 7377*333d2b36SAndroid Build Coastguard Worker name: "libbar", 7378*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 7379*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 7380*333d2b36SAndroid Build Coastguard Worker stl: "none", 7381*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 7382*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "apex_inherit" 7383*333d2b36SAndroid Build Coastguard Worker } 7384*333d2b36SAndroid Build Coastguard Worker 7385*333d2b36SAndroid Build Coastguard Worker `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29)) 7386*333d2b36SAndroid Build Coastguard Worker 7387*333d2b36SAndroid Build Coastguard Worker apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule") 7388*333d2b36SAndroid Build Coastguard Worker copyCmds := apexRule.Args["copy_commands"] 7389*333d2b36SAndroid Build Coastguard Worker 7390*333d2b36SAndroid Build Coastguard Worker // Ensure that direct non-stubs dep is always included 7391*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/mylib.so") 7392*333d2b36SAndroid Build Coastguard Worker 7393*333d2b36SAndroid Build Coastguard Worker // Ensure that runtime_libs dep in included 7394*333d2b36SAndroid Build Coastguard Worker ensureContains(t, copyCmds, "image.apex/lib64/libbar.so") 7395*333d2b36SAndroid Build Coastguard Worker 7396*333d2b36SAndroid Build Coastguard Worker // Ensure libraries target the original min_sdk_version value rather than the overridden 7397*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31") 7398*333d2b36SAndroid Build Coastguard Worker} 7399*333d2b36SAndroid Build Coastguard Worker 7400*333d2b36SAndroid Build Coastguard Workerfunc TestLegacyAndroid10Support(t *testing.T) { 7401*333d2b36SAndroid Build Coastguard Worker t.Parallel() 7402*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 7403*333d2b36SAndroid Build Coastguard Worker apex { 7404*333d2b36SAndroid Build Coastguard Worker name: "myapex", 7405*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 7406*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 7407*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 7408*333d2b36SAndroid Build Coastguard Worker } 7409*333d2b36SAndroid Build Coastguard Worker 7410*333d2b36SAndroid Build Coastguard Worker apex_key { 7411*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 7412*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 7413*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 7414*333d2b36SAndroid Build Coastguard Worker } 7415*333d2b36SAndroid Build Coastguard Worker 7416*333d2b36SAndroid Build Coastguard Worker cc_library { 7417*333d2b36SAndroid Build Coastguard Worker name: "mylib", 7418*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 7419*333d2b36SAndroid Build Coastguard Worker stl: "libc++", 7420*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 7421*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 7422*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 7423*333d2b36SAndroid Build Coastguard Worker } 7424*333d2b36SAndroid Build Coastguard Worker `, withUnbundledBuild) 7425*333d2b36SAndroid Build Coastguard Worker 7426*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests("myapex", "android_common_myapex") 7427*333d2b36SAndroid Build Coastguard Worker args := module.Rule("apexRule").Args 7428*333d2b36SAndroid Build Coastguard Worker ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String()) 7429*333d2b36SAndroid Build Coastguard Worker 7430*333d2b36SAndroid Build Coastguard Worker // The copies of the libraries in the apex should have one more dependency than 7431*333d2b36SAndroid Build Coastguard Worker // the ones outside the apex, namely the unwinder. Ideally we should check 7432*333d2b36SAndroid Build Coastguard Worker // the dependency names directly here but for some reason the names are blank in 7433*333d2b36SAndroid Build Coastguard Worker // this test. 7434*333d2b36SAndroid Build Coastguard Worker for _, lib := range []string{"libc++", "mylib"} { 7435*333d2b36SAndroid Build Coastguard Worker apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits 7436*333d2b36SAndroid Build Coastguard Worker nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits 7437*333d2b36SAndroid Build Coastguard Worker if len(apexImplicits) != len(nonApexImplicits)+1 { 7438*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q missing unwinder dep", lib) 7439*333d2b36SAndroid Build Coastguard Worker } 7440*333d2b36SAndroid Build Coastguard Worker } 7441*333d2b36SAndroid Build Coastguard Worker} 7442*333d2b36SAndroid Build Coastguard Worker 7443*333d2b36SAndroid Build Coastguard Workervar filesForSdkLibrary = android.MockFS{ 7444*333d2b36SAndroid Build Coastguard Worker "api/current.txt": nil, 7445*333d2b36SAndroid Build Coastguard Worker "api/removed.txt": nil, 7446*333d2b36SAndroid Build Coastguard Worker "api/system-current.txt": nil, 7447*333d2b36SAndroid Build Coastguard Worker "api/system-removed.txt": nil, 7448*333d2b36SAndroid Build Coastguard Worker "api/test-current.txt": nil, 7449*333d2b36SAndroid Build Coastguard Worker "api/test-removed.txt": nil, 7450*333d2b36SAndroid Build Coastguard Worker 7451*333d2b36SAndroid Build Coastguard Worker "100/public/api/foo.txt": nil, 7452*333d2b36SAndroid Build Coastguard Worker "100/public/api/foo-removed.txt": nil, 7453*333d2b36SAndroid Build Coastguard Worker "100/system/api/foo.txt": nil, 7454*333d2b36SAndroid Build Coastguard Worker "100/system/api/foo-removed.txt": nil, 7455*333d2b36SAndroid Build Coastguard Worker 7456*333d2b36SAndroid Build Coastguard Worker // For java_sdk_library_import 7457*333d2b36SAndroid Build Coastguard Worker "a.jar": nil, 7458*333d2b36SAndroid Build Coastguard Worker} 7459*333d2b36SAndroid Build Coastguard Worker 7460*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSDKLibrary(t *testing.T) { 7461*333d2b36SAndroid Build Coastguard Worker t.Parallel() 7462*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 7463*333d2b36SAndroid Build Coastguard Worker apex { 7464*333d2b36SAndroid Build Coastguard Worker name: "myapex", 7465*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 7466*333d2b36SAndroid Build Coastguard Worker java_libs: ["foo"], 7467*333d2b36SAndroid Build Coastguard Worker updatable: false, 7468*333d2b36SAndroid Build Coastguard Worker } 7469*333d2b36SAndroid Build Coastguard Worker 7470*333d2b36SAndroid Build Coastguard Worker apex_key { 7471*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 7472*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 7473*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 7474*333d2b36SAndroid Build Coastguard Worker } 7475*333d2b36SAndroid Build Coastguard Worker 7476*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 7477*333d2b36SAndroid Build Coastguard Worker name: "foo", 7478*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 7479*333d2b36SAndroid Build Coastguard Worker api_packages: ["foo"], 7480*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 7481*333d2b36SAndroid Build Coastguard Worker } 7482*333d2b36SAndroid Build Coastguard Worker 7483*333d2b36SAndroid Build Coastguard Worker prebuilt_apis { 7484*333d2b36SAndroid Build Coastguard Worker name: "sdk", 7485*333d2b36SAndroid Build Coastguard Worker api_dirs: ["100"], 7486*333d2b36SAndroid Build Coastguard Worker } 7487*333d2b36SAndroid Build Coastguard Worker `, withFiles(filesForSdkLibrary)) 7488*333d2b36SAndroid Build Coastguard Worker 7489*333d2b36SAndroid Build Coastguard Worker // java_sdk_library installs both impl jar and permission XML 7490*333d2b36SAndroid Build Coastguard Worker ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{ 7491*333d2b36SAndroid Build Coastguard Worker "javalib/foo.jar", 7492*333d2b36SAndroid Build Coastguard Worker "etc/permissions/foo.xml", 7493*333d2b36SAndroid Build Coastguard Worker }) 7494*333d2b36SAndroid Build Coastguard Worker // Permission XML should point to the activated path of impl jar of java_sdk_library 7495*333d2b36SAndroid Build Coastguard Worker sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml") 7496*333d2b36SAndroid Build Coastguard Worker contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary) 7497*333d2b36SAndroid Build Coastguard Worker ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"") 7498*333d2b36SAndroid Build Coastguard Worker} 7499*333d2b36SAndroid Build Coastguard Worker 7500*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSDKLibraryOverrideApexes(t *testing.T) { 7501*333d2b36SAndroid Build Coastguard Worker t.Parallel() 7502*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 7503*333d2b36SAndroid Build Coastguard Worker override_apex { 7504*333d2b36SAndroid Build Coastguard Worker name: "mycompanyapex", 7505*333d2b36SAndroid Build Coastguard Worker base: "myapex", 7506*333d2b36SAndroid Build Coastguard Worker } 7507*333d2b36SAndroid Build Coastguard Worker apex { 7508*333d2b36SAndroid Build Coastguard Worker name: "myapex", 7509*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 7510*333d2b36SAndroid Build Coastguard Worker java_libs: ["foo"], 7511*333d2b36SAndroid Build Coastguard Worker updatable: false, 7512*333d2b36SAndroid Build Coastguard Worker } 7513*333d2b36SAndroid Build Coastguard Worker 7514*333d2b36SAndroid Build Coastguard Worker apex_key { 7515*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 7516*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 7517*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 7518*333d2b36SAndroid Build Coastguard Worker } 7519*333d2b36SAndroid Build Coastguard Worker 7520*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 7521*333d2b36SAndroid Build Coastguard Worker name: "foo", 7522*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 7523*333d2b36SAndroid Build Coastguard Worker api_packages: ["foo"], 7524*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 7525*333d2b36SAndroid Build Coastguard Worker } 7526*333d2b36SAndroid Build Coastguard Worker 7527*333d2b36SAndroid Build Coastguard Worker prebuilt_apis { 7528*333d2b36SAndroid Build Coastguard Worker name: "sdk", 7529*333d2b36SAndroid Build Coastguard Worker api_dirs: ["100"], 7530*333d2b36SAndroid Build Coastguard Worker } 7531*333d2b36SAndroid Build Coastguard Worker `, withFiles(filesForSdkLibrary)) 7532*333d2b36SAndroid Build Coastguard Worker 7533*333d2b36SAndroid Build Coastguard Worker // Permission XML should point to the activated path of impl jar of java_sdk_library. 7534*333d2b36SAndroid Build Coastguard Worker // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant 7535*333d2b36SAndroid Build Coastguard Worker // (com.android.foo), the filepath should not contain override apex name. 7536*333d2b36SAndroid Build Coastguard Worker sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml") 7537*333d2b36SAndroid Build Coastguard Worker contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary) 7538*333d2b36SAndroid Build Coastguard Worker ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"") 7539*333d2b36SAndroid Build Coastguard Worker} 7540*333d2b36SAndroid Build Coastguard Worker 7541*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSDKLibrary_WithinApex(t *testing.T) { 7542*333d2b36SAndroid Build Coastguard Worker t.Parallel() 7543*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 7544*333d2b36SAndroid Build Coastguard Worker apex { 7545*333d2b36SAndroid Build Coastguard Worker name: "myapex", 7546*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 7547*333d2b36SAndroid Build Coastguard Worker java_libs: ["foo", "bar"], 7548*333d2b36SAndroid Build Coastguard Worker updatable: false, 7549*333d2b36SAndroid Build Coastguard Worker } 7550*333d2b36SAndroid Build Coastguard Worker 7551*333d2b36SAndroid Build Coastguard Worker apex_key { 7552*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 7553*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 7554*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 7555*333d2b36SAndroid Build Coastguard Worker } 7556*333d2b36SAndroid Build Coastguard Worker 7557*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 7558*333d2b36SAndroid Build Coastguard Worker name: "foo", 7559*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 7560*333d2b36SAndroid Build Coastguard Worker api_packages: ["foo"], 7561*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 7562*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 7563*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 7564*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 7565*333d2b36SAndroid Build Coastguard Worker } 7566*333d2b36SAndroid Build Coastguard Worker 7567*333d2b36SAndroid Build Coastguard Worker java_library { 7568*333d2b36SAndroid Build Coastguard Worker name: "bar", 7569*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 7570*333d2b36SAndroid Build Coastguard Worker libs: ["foo.impl"], 7571*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 7572*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 7573*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 7574*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 7575*333d2b36SAndroid Build Coastguard Worker } 7576*333d2b36SAndroid Build Coastguard Worker 7577*333d2b36SAndroid Build Coastguard Worker prebuilt_apis { 7578*333d2b36SAndroid Build Coastguard Worker name: "sdk", 7579*333d2b36SAndroid Build Coastguard Worker api_dirs: ["100"], 7580*333d2b36SAndroid Build Coastguard Worker } 7581*333d2b36SAndroid Build Coastguard Worker `, withFiles(filesForSdkLibrary)) 7582*333d2b36SAndroid Build Coastguard Worker 7583*333d2b36SAndroid Build Coastguard Worker // java_sdk_library installs both impl jar and permission XML 7584*333d2b36SAndroid Build Coastguard Worker ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{ 7585*333d2b36SAndroid Build Coastguard Worker "javalib/bar.jar", 7586*333d2b36SAndroid Build Coastguard Worker "javalib/foo.jar", 7587*333d2b36SAndroid Build Coastguard Worker "etc/permissions/foo.xml", 7588*333d2b36SAndroid Build Coastguard Worker }) 7589*333d2b36SAndroid Build Coastguard Worker 7590*333d2b36SAndroid Build Coastguard Worker // The bar library should depend on the implementation jar. 7591*333d2b36SAndroid Build Coastguard Worker barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac") 7592*333d2b36SAndroid Build Coastguard Worker if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) { 7593*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected %q, found %#q", expected, actual) 7594*333d2b36SAndroid Build Coastguard Worker } 7595*333d2b36SAndroid Build Coastguard Worker} 7596*333d2b36SAndroid Build Coastguard Worker 7597*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSDKLibrary_CrossBoundary(t *testing.T) { 7598*333d2b36SAndroid Build Coastguard Worker t.Parallel() 7599*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 7600*333d2b36SAndroid Build Coastguard Worker apex { 7601*333d2b36SAndroid Build Coastguard Worker name: "myapex", 7602*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 7603*333d2b36SAndroid Build Coastguard Worker java_libs: ["foo"], 7604*333d2b36SAndroid Build Coastguard Worker updatable: false, 7605*333d2b36SAndroid Build Coastguard Worker } 7606*333d2b36SAndroid Build Coastguard Worker 7607*333d2b36SAndroid Build Coastguard Worker apex_key { 7608*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 7609*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 7610*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 7611*333d2b36SAndroid Build Coastguard Worker } 7612*333d2b36SAndroid Build Coastguard Worker 7613*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 7614*333d2b36SAndroid Build Coastguard Worker name: "foo", 7615*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 7616*333d2b36SAndroid Build Coastguard Worker api_packages: ["foo"], 7617*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 7618*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 7619*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 7620*333d2b36SAndroid Build Coastguard Worker } 7621*333d2b36SAndroid Build Coastguard Worker 7622*333d2b36SAndroid Build Coastguard Worker java_library { 7623*333d2b36SAndroid Build Coastguard Worker name: "bar", 7624*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 7625*333d2b36SAndroid Build Coastguard Worker libs: ["foo.stubs"], 7626*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 7627*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 7628*333d2b36SAndroid Build Coastguard Worker } 7629*333d2b36SAndroid Build Coastguard Worker 7630*333d2b36SAndroid Build Coastguard Worker prebuilt_apis { 7631*333d2b36SAndroid Build Coastguard Worker name: "sdk", 7632*333d2b36SAndroid Build Coastguard Worker api_dirs: ["100"], 7633*333d2b36SAndroid Build Coastguard Worker } 7634*333d2b36SAndroid Build Coastguard Worker `, withFiles(filesForSdkLibrary)) 7635*333d2b36SAndroid Build Coastguard Worker 7636*333d2b36SAndroid Build Coastguard Worker // java_sdk_library installs both impl jar and permission XML 7637*333d2b36SAndroid Build Coastguard Worker ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{ 7638*333d2b36SAndroid Build Coastguard Worker "javalib/foo.jar", 7639*333d2b36SAndroid Build Coastguard Worker "etc/permissions/foo.xml", 7640*333d2b36SAndroid Build Coastguard Worker }) 7641*333d2b36SAndroid Build Coastguard Worker 7642*333d2b36SAndroid Build Coastguard Worker // The bar library should depend on the stubs jar. 7643*333d2b36SAndroid Build Coastguard Worker barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac") 7644*333d2b36SAndroid Build Coastguard Worker if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) { 7645*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected %q, found %#q", expected, actual) 7646*333d2b36SAndroid Build Coastguard Worker } 7647*333d2b36SAndroid Build Coastguard Worker} 7648*333d2b36SAndroid Build Coastguard Worker 7649*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSDKLibrary_ImportPreferred(t *testing.T) { 7650*333d2b36SAndroid Build Coastguard Worker t.Parallel() 7651*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 7652*333d2b36SAndroid Build Coastguard Worker prebuilt_apis { 7653*333d2b36SAndroid Build Coastguard Worker name: "sdk", 7654*333d2b36SAndroid Build Coastguard Worker api_dirs: ["100"], 7655*333d2b36SAndroid Build Coastguard Worker }`, 7656*333d2b36SAndroid Build Coastguard Worker withFiles(map[string][]byte{ 7657*333d2b36SAndroid Build Coastguard Worker "apex/a.java": nil, 7658*333d2b36SAndroid Build Coastguard Worker "apex/apex_manifest.json": nil, 7659*333d2b36SAndroid Build Coastguard Worker "apex/Android.bp": []byte(` 7660*333d2b36SAndroid Build Coastguard Worker package { 7661*333d2b36SAndroid Build Coastguard Worker default_visibility: ["//visibility:private"], 7662*333d2b36SAndroid Build Coastguard Worker } 7663*333d2b36SAndroid Build Coastguard Worker 7664*333d2b36SAndroid Build Coastguard Worker apex { 7665*333d2b36SAndroid Build Coastguard Worker name: "myapex", 7666*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 7667*333d2b36SAndroid Build Coastguard Worker java_libs: ["foo", "bar"], 7668*333d2b36SAndroid Build Coastguard Worker updatable: false, 7669*333d2b36SAndroid Build Coastguard Worker } 7670*333d2b36SAndroid Build Coastguard Worker 7671*333d2b36SAndroid Build Coastguard Worker apex_key { 7672*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 7673*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 7674*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 7675*333d2b36SAndroid Build Coastguard Worker } 7676*333d2b36SAndroid Build Coastguard Worker 7677*333d2b36SAndroid Build Coastguard Worker java_library { 7678*333d2b36SAndroid Build Coastguard Worker name: "bar", 7679*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 7680*333d2b36SAndroid Build Coastguard Worker libs: ["foo.impl"], 7681*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 7682*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 7683*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 7684*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 7685*333d2b36SAndroid Build Coastguard Worker } 7686*333d2b36SAndroid Build Coastguard Worker`), 7687*333d2b36SAndroid Build Coastguard Worker "source/a.java": nil, 7688*333d2b36SAndroid Build Coastguard Worker "source/api/current.txt": nil, 7689*333d2b36SAndroid Build Coastguard Worker "source/api/removed.txt": nil, 7690*333d2b36SAndroid Build Coastguard Worker "source/Android.bp": []byte(` 7691*333d2b36SAndroid Build Coastguard Worker package { 7692*333d2b36SAndroid Build Coastguard Worker default_visibility: ["//visibility:private"], 7693*333d2b36SAndroid Build Coastguard Worker } 7694*333d2b36SAndroid Build Coastguard Worker 7695*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 7696*333d2b36SAndroid Build Coastguard Worker name: "foo", 7697*333d2b36SAndroid Build Coastguard Worker visibility: ["//apex"], 7698*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 7699*333d2b36SAndroid Build Coastguard Worker api_packages: ["foo"], 7700*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 7701*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 7702*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 7703*333d2b36SAndroid Build Coastguard Worker public: { 7704*333d2b36SAndroid Build Coastguard Worker enabled: true, 7705*333d2b36SAndroid Build Coastguard Worker }, 7706*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 7707*333d2b36SAndroid Build Coastguard Worker } 7708*333d2b36SAndroid Build Coastguard Worker`), 7709*333d2b36SAndroid Build Coastguard Worker "prebuilt/a.jar": nil, 7710*333d2b36SAndroid Build Coastguard Worker "prebuilt/Android.bp": []byte(` 7711*333d2b36SAndroid Build Coastguard Worker package { 7712*333d2b36SAndroid Build Coastguard Worker default_visibility: ["//visibility:private"], 7713*333d2b36SAndroid Build Coastguard Worker } 7714*333d2b36SAndroid Build Coastguard Worker 7715*333d2b36SAndroid Build Coastguard Worker java_sdk_library_import { 7716*333d2b36SAndroid Build Coastguard Worker name: "foo", 7717*333d2b36SAndroid Build Coastguard Worker visibility: ["//apex", "//source"], 7718*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 7719*333d2b36SAndroid Build Coastguard Worker prefer: true, 7720*333d2b36SAndroid Build Coastguard Worker public: { 7721*333d2b36SAndroid Build Coastguard Worker jars: ["a.jar"], 7722*333d2b36SAndroid Build Coastguard Worker }, 7723*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 7724*333d2b36SAndroid Build Coastguard Worker } 7725*333d2b36SAndroid Build Coastguard Worker`), 7726*333d2b36SAndroid Build Coastguard Worker }), withFiles(filesForSdkLibrary), 7727*333d2b36SAndroid Build Coastguard Worker ) 7728*333d2b36SAndroid Build Coastguard Worker 7729*333d2b36SAndroid Build Coastguard Worker // java_sdk_library installs both impl jar and permission XML 7730*333d2b36SAndroid Build Coastguard Worker ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{ 7731*333d2b36SAndroid Build Coastguard Worker "javalib/bar.jar", 7732*333d2b36SAndroid Build Coastguard Worker "javalib/foo.jar", 7733*333d2b36SAndroid Build Coastguard Worker "etc/permissions/foo.xml", 7734*333d2b36SAndroid Build Coastguard Worker }) 7735*333d2b36SAndroid Build Coastguard Worker 7736*333d2b36SAndroid Build Coastguard Worker // The bar library should depend on the implementation jar. 7737*333d2b36SAndroid Build Coastguard Worker barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac") 7738*333d2b36SAndroid Build Coastguard Worker if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) { 7739*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected %q, found %#q", expected, actual) 7740*333d2b36SAndroid Build Coastguard Worker } 7741*333d2b36SAndroid Build Coastguard Worker} 7742*333d2b36SAndroid Build Coastguard Worker 7743*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSDKLibrary_ImportOnly(t *testing.T) { 7744*333d2b36SAndroid Build Coastguard Worker t.Parallel() 7745*333d2b36SAndroid Build Coastguard Worker testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, ` 7746*333d2b36SAndroid Build Coastguard Worker apex { 7747*333d2b36SAndroid Build Coastguard Worker name: "myapex", 7748*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 7749*333d2b36SAndroid Build Coastguard Worker java_libs: ["foo"], 7750*333d2b36SAndroid Build Coastguard Worker updatable: false, 7751*333d2b36SAndroid Build Coastguard Worker } 7752*333d2b36SAndroid Build Coastguard Worker 7753*333d2b36SAndroid Build Coastguard Worker apex_key { 7754*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 7755*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 7756*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 7757*333d2b36SAndroid Build Coastguard Worker } 7758*333d2b36SAndroid Build Coastguard Worker 7759*333d2b36SAndroid Build Coastguard Worker java_sdk_library_import { 7760*333d2b36SAndroid Build Coastguard Worker name: "foo", 7761*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 7762*333d2b36SAndroid Build Coastguard Worker prefer: true, 7763*333d2b36SAndroid Build Coastguard Worker public: { 7764*333d2b36SAndroid Build Coastguard Worker jars: ["a.jar"], 7765*333d2b36SAndroid Build Coastguard Worker }, 7766*333d2b36SAndroid Build Coastguard Worker } 7767*333d2b36SAndroid Build Coastguard Worker 7768*333d2b36SAndroid Build Coastguard Worker `, withFiles(filesForSdkLibrary)) 7769*333d2b36SAndroid Build Coastguard Worker} 7770*333d2b36SAndroid Build Coastguard Worker 7771*333d2b36SAndroid Build Coastguard Workerfunc TestCompatConfig(t *testing.T) { 7772*333d2b36SAndroid Build Coastguard Worker t.Parallel() 7773*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 7774*333d2b36SAndroid Build Coastguard Worker prepareForApexTest, 7775*333d2b36SAndroid Build Coastguard Worker java.PrepareForTestWithPlatformCompatConfig, 7776*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 7777*333d2b36SAndroid Build Coastguard Worker apex { 7778*333d2b36SAndroid Build Coastguard Worker name: "myapex", 7779*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 7780*333d2b36SAndroid Build Coastguard Worker compat_configs: ["myjar-platform-compat-config"], 7781*333d2b36SAndroid Build Coastguard Worker java_libs: ["myjar"], 7782*333d2b36SAndroid Build Coastguard Worker updatable: false, 7783*333d2b36SAndroid Build Coastguard Worker } 7784*333d2b36SAndroid Build Coastguard Worker 7785*333d2b36SAndroid Build Coastguard Worker apex_key { 7786*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 7787*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 7788*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 7789*333d2b36SAndroid Build Coastguard Worker } 7790*333d2b36SAndroid Build Coastguard Worker 7791*333d2b36SAndroid Build Coastguard Worker platform_compat_config { 7792*333d2b36SAndroid Build Coastguard Worker name: "myjar-platform-compat-config", 7793*333d2b36SAndroid Build Coastguard Worker src: ":myjar", 7794*333d2b36SAndroid Build Coastguard Worker } 7795*333d2b36SAndroid Build Coastguard Worker 7796*333d2b36SAndroid Build Coastguard Worker java_library { 7797*333d2b36SAndroid Build Coastguard Worker name: "myjar", 7798*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 7799*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 7800*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 7801*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 7802*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 7803*333d2b36SAndroid Build Coastguard Worker } 7804*333d2b36SAndroid Build Coastguard Worker 7805*333d2b36SAndroid Build Coastguard Worker // Make sure that a preferred prebuilt does not affect the apex contents. 7806*333d2b36SAndroid Build Coastguard Worker prebuilt_platform_compat_config { 7807*333d2b36SAndroid Build Coastguard Worker name: "myjar-platform-compat-config", 7808*333d2b36SAndroid Build Coastguard Worker metadata: "compat-config/metadata.xml", 7809*333d2b36SAndroid Build Coastguard Worker prefer: true, 7810*333d2b36SAndroid Build Coastguard Worker } 7811*333d2b36SAndroid Build Coastguard Worker `) 7812*333d2b36SAndroid Build Coastguard Worker ctx := result.TestContext 7813*333d2b36SAndroid Build Coastguard Worker ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{ 7814*333d2b36SAndroid Build Coastguard Worker "etc/compatconfig/myjar-platform-compat-config.xml", 7815*333d2b36SAndroid Build Coastguard Worker "javalib/myjar.jar", 7816*333d2b36SAndroid Build Coastguard Worker }) 7817*333d2b36SAndroid Build Coastguard Worker} 7818*333d2b36SAndroid Build Coastguard Worker 7819*333d2b36SAndroid Build Coastguard Workerfunc TestNoDupeApexFiles(t *testing.T) { 7820*333d2b36SAndroid Build Coastguard Worker t.Parallel() 7821*333d2b36SAndroid Build Coastguard Worker android.GroupFixturePreparers( 7822*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithAndroidBuildComponents, 7823*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithApexBuildComponents, 7824*333d2b36SAndroid Build Coastguard Worker prepareForTestWithMyapex, 7825*333d2b36SAndroid Build Coastguard Worker prebuilt_etc.PrepareForTestWithPrebuiltEtc, 7826*333d2b36SAndroid Build Coastguard Worker ). 7827*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")). 7828*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, ` 7829*333d2b36SAndroid Build Coastguard Worker apex { 7830*333d2b36SAndroid Build Coastguard Worker name: "myapex", 7831*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 7832*333d2b36SAndroid Build Coastguard Worker prebuilts: ["foo", "bar"], 7833*333d2b36SAndroid Build Coastguard Worker updatable: false, 7834*333d2b36SAndroid Build Coastguard Worker } 7835*333d2b36SAndroid Build Coastguard Worker 7836*333d2b36SAndroid Build Coastguard Worker apex_key { 7837*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 7838*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 7839*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 7840*333d2b36SAndroid Build Coastguard Worker } 7841*333d2b36SAndroid Build Coastguard Worker 7842*333d2b36SAndroid Build Coastguard Worker prebuilt_etc { 7843*333d2b36SAndroid Build Coastguard Worker name: "foo", 7844*333d2b36SAndroid Build Coastguard Worker src: "myprebuilt", 7845*333d2b36SAndroid Build Coastguard Worker filename_from_src: true, 7846*333d2b36SAndroid Build Coastguard Worker } 7847*333d2b36SAndroid Build Coastguard Worker 7848*333d2b36SAndroid Build Coastguard Worker prebuilt_etc { 7849*333d2b36SAndroid Build Coastguard Worker name: "bar", 7850*333d2b36SAndroid Build Coastguard Worker src: "myprebuilt", 7851*333d2b36SAndroid Build Coastguard Worker filename_from_src: true, 7852*333d2b36SAndroid Build Coastguard Worker } 7853*333d2b36SAndroid Build Coastguard Worker `) 7854*333d2b36SAndroid Build Coastguard Worker} 7855*333d2b36SAndroid Build Coastguard Worker 7856*333d2b36SAndroid Build Coastguard Workerfunc TestApexUnwantedTransitiveDeps(t *testing.T) { 7857*333d2b36SAndroid Build Coastguard Worker t.Parallel() 7858*333d2b36SAndroid Build Coastguard Worker bp := ` 7859*333d2b36SAndroid Build Coastguard Worker apex { 7860*333d2b36SAndroid Build Coastguard Worker name: "myapex", 7861*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 7862*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 7863*333d2b36SAndroid Build Coastguard Worker updatable: false, 7864*333d2b36SAndroid Build Coastguard Worker unwanted_transitive_deps: ["libbar"], 7865*333d2b36SAndroid Build Coastguard Worker } 7866*333d2b36SAndroid Build Coastguard Worker 7867*333d2b36SAndroid Build Coastguard Worker apex_key { 7868*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 7869*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 7870*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 7871*333d2b36SAndroid Build Coastguard Worker } 7872*333d2b36SAndroid Build Coastguard Worker 7873*333d2b36SAndroid Build Coastguard Worker cc_library { 7874*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 7875*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.cpp"], 7876*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libbar"], 7877*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 7878*333d2b36SAndroid Build Coastguard Worker } 7879*333d2b36SAndroid Build Coastguard Worker 7880*333d2b36SAndroid Build Coastguard Worker cc_library { 7881*333d2b36SAndroid Build Coastguard Worker name: "libbar", 7882*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.cpp"], 7883*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 7884*333d2b36SAndroid Build Coastguard Worker }` 7885*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, bp) 7886*333d2b36SAndroid Build Coastguard Worker ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{ 7887*333d2b36SAndroid Build Coastguard Worker "*/libc++.so", 7888*333d2b36SAndroid Build Coastguard Worker "*/libfoo.so", 7889*333d2b36SAndroid Build Coastguard Worker // not libbar.so 7890*333d2b36SAndroid Build Coastguard Worker }) 7891*333d2b36SAndroid Build Coastguard Worker} 7892*333d2b36SAndroid Build Coastguard Worker 7893*333d2b36SAndroid Build Coastguard Workerfunc TestRejectNonInstallableJavaLibrary(t *testing.T) { 7894*333d2b36SAndroid Build Coastguard Worker t.Parallel() 7895*333d2b36SAndroid Build Coastguard Worker testApexError(t, `"myjar" is not configured to be compiled into dex`, ` 7896*333d2b36SAndroid Build Coastguard Worker apex { 7897*333d2b36SAndroid Build Coastguard Worker name: "myapex", 7898*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 7899*333d2b36SAndroid Build Coastguard Worker java_libs: ["myjar"], 7900*333d2b36SAndroid Build Coastguard Worker updatable: false, 7901*333d2b36SAndroid Build Coastguard Worker } 7902*333d2b36SAndroid Build Coastguard Worker 7903*333d2b36SAndroid Build Coastguard Worker apex_key { 7904*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 7905*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 7906*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 7907*333d2b36SAndroid Build Coastguard Worker } 7908*333d2b36SAndroid Build Coastguard Worker 7909*333d2b36SAndroid Build Coastguard Worker java_library { 7910*333d2b36SAndroid Build Coastguard Worker name: "myjar", 7911*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 7912*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 7913*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 7914*333d2b36SAndroid Build Coastguard Worker compile_dex: false, 7915*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 7916*333d2b36SAndroid Build Coastguard Worker } 7917*333d2b36SAndroid Build Coastguard Worker `) 7918*333d2b36SAndroid Build Coastguard Worker} 7919*333d2b36SAndroid Build Coastguard Worker 7920*333d2b36SAndroid Build Coastguard Workerfunc TestSymlinksFromApexToSystem(t *testing.T) { 7921*333d2b36SAndroid Build Coastguard Worker t.Parallel() 7922*333d2b36SAndroid Build Coastguard Worker bp := ` 7923*333d2b36SAndroid Build Coastguard Worker apex { 7924*333d2b36SAndroid Build Coastguard Worker name: "myapex", 7925*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 7926*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 7927*333d2b36SAndroid Build Coastguard Worker java_libs: ["myjar"], 7928*333d2b36SAndroid Build Coastguard Worker updatable: false, 7929*333d2b36SAndroid Build Coastguard Worker } 7930*333d2b36SAndroid Build Coastguard Worker 7931*333d2b36SAndroid Build Coastguard Worker apex { 7932*333d2b36SAndroid Build Coastguard Worker name: "myapex.updatable", 7933*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 7934*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 7935*333d2b36SAndroid Build Coastguard Worker java_libs: ["myjar"], 7936*333d2b36SAndroid Build Coastguard Worker updatable: true, 7937*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "33", 7938*333d2b36SAndroid Build Coastguard Worker } 7939*333d2b36SAndroid Build Coastguard Worker 7940*333d2b36SAndroid Build Coastguard Worker apex_key { 7941*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 7942*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 7943*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 7944*333d2b36SAndroid Build Coastguard Worker } 7945*333d2b36SAndroid Build Coastguard Worker 7946*333d2b36SAndroid Build Coastguard Worker cc_library { 7947*333d2b36SAndroid Build Coastguard Worker name: "mylib", 7948*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 7949*333d2b36SAndroid Build Coastguard Worker shared_libs: [ 7950*333d2b36SAndroid Build Coastguard Worker "myotherlib", 7951*333d2b36SAndroid Build Coastguard Worker "myotherlib_ext", 7952*333d2b36SAndroid Build Coastguard Worker ], 7953*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 7954*333d2b36SAndroid Build Coastguard Worker stl: "none", 7955*333d2b36SAndroid Build Coastguard Worker apex_available: [ 7956*333d2b36SAndroid Build Coastguard Worker "myapex", 7957*333d2b36SAndroid Build Coastguard Worker "myapex.updatable", 7958*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 7959*333d2b36SAndroid Build Coastguard Worker ], 7960*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "33", 7961*333d2b36SAndroid Build Coastguard Worker } 7962*333d2b36SAndroid Build Coastguard Worker 7963*333d2b36SAndroid Build Coastguard Worker cc_library { 7964*333d2b36SAndroid Build Coastguard Worker name: "myotherlib", 7965*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 7966*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 7967*333d2b36SAndroid Build Coastguard Worker stl: "none", 7968*333d2b36SAndroid Build Coastguard Worker apex_available: [ 7969*333d2b36SAndroid Build Coastguard Worker "myapex", 7970*333d2b36SAndroid Build Coastguard Worker "myapex.updatable", 7971*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 7972*333d2b36SAndroid Build Coastguard Worker ], 7973*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "33", 7974*333d2b36SAndroid Build Coastguard Worker } 7975*333d2b36SAndroid Build Coastguard Worker 7976*333d2b36SAndroid Build Coastguard Worker cc_library { 7977*333d2b36SAndroid Build Coastguard Worker name: "myotherlib_ext", 7978*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 7979*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 7980*333d2b36SAndroid Build Coastguard Worker system_ext_specific: true, 7981*333d2b36SAndroid Build Coastguard Worker stl: "none", 7982*333d2b36SAndroid Build Coastguard Worker apex_available: [ 7983*333d2b36SAndroid Build Coastguard Worker "myapex", 7984*333d2b36SAndroid Build Coastguard Worker "myapex.updatable", 7985*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 7986*333d2b36SAndroid Build Coastguard Worker ], 7987*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "33", 7988*333d2b36SAndroid Build Coastguard Worker } 7989*333d2b36SAndroid Build Coastguard Worker 7990*333d2b36SAndroid Build Coastguard Worker java_library { 7991*333d2b36SAndroid Build Coastguard Worker name: "myjar", 7992*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 7993*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 7994*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 7995*333d2b36SAndroid Build Coastguard Worker static_libs: ["myotherjar"], 7996*333d2b36SAndroid Build Coastguard Worker apex_available: [ 7997*333d2b36SAndroid Build Coastguard Worker "myapex", 7998*333d2b36SAndroid Build Coastguard Worker "myapex.updatable", 7999*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 8000*333d2b36SAndroid Build Coastguard Worker ], 8001*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "33", 8002*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 8003*333d2b36SAndroid Build Coastguard Worker } 8004*333d2b36SAndroid Build Coastguard Worker 8005*333d2b36SAndroid Build Coastguard Worker java_library { 8006*333d2b36SAndroid Build Coastguard Worker name: "myotherjar", 8007*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 8008*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 8009*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 8010*333d2b36SAndroid Build Coastguard Worker apex_available: [ 8011*333d2b36SAndroid Build Coastguard Worker "myapex", 8012*333d2b36SAndroid Build Coastguard Worker "myapex.updatable", 8013*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 8014*333d2b36SAndroid Build Coastguard Worker ], 8015*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "33", 8016*333d2b36SAndroid Build Coastguard Worker } 8017*333d2b36SAndroid Build Coastguard Worker ` 8018*333d2b36SAndroid Build Coastguard Worker 8019*333d2b36SAndroid Build Coastguard Worker ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) { 8020*333d2b36SAndroid Build Coastguard Worker for _, f := range files { 8021*333d2b36SAndroid Build Coastguard Worker if f.path == file { 8022*333d2b36SAndroid Build Coastguard Worker if f.isLink { 8023*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q is not a real file", file) 8024*333d2b36SAndroid Build Coastguard Worker } 8025*333d2b36SAndroid Build Coastguard Worker return 8026*333d2b36SAndroid Build Coastguard Worker } 8027*333d2b36SAndroid Build Coastguard Worker } 8028*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q is not found", file) 8029*333d2b36SAndroid Build Coastguard Worker } 8030*333d2b36SAndroid Build Coastguard Worker 8031*333d2b36SAndroid Build Coastguard Worker ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) { 8032*333d2b36SAndroid Build Coastguard Worker for _, f := range files { 8033*333d2b36SAndroid Build Coastguard Worker if f.path == file { 8034*333d2b36SAndroid Build Coastguard Worker if !f.isLink { 8035*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q is not a symlink", file) 8036*333d2b36SAndroid Build Coastguard Worker } 8037*333d2b36SAndroid Build Coastguard Worker if f.src != target { 8038*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected symlink target to be %q, got %q", target, f.src) 8039*333d2b36SAndroid Build Coastguard Worker } 8040*333d2b36SAndroid Build Coastguard Worker return 8041*333d2b36SAndroid Build Coastguard Worker } 8042*333d2b36SAndroid Build Coastguard Worker } 8043*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q is not found", file) 8044*333d2b36SAndroid Build Coastguard Worker } 8045*333d2b36SAndroid Build Coastguard Worker 8046*333d2b36SAndroid Build Coastguard Worker // For unbundled build, symlink shouldn't exist regardless of whether an APEX 8047*333d2b36SAndroid Build Coastguard Worker // is updatable or not 8048*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, bp, withUnbundledBuild) 8049*333d2b36SAndroid Build Coastguard Worker files := getFiles(t, ctx, "myapex", "android_common_myapex") 8050*333d2b36SAndroid Build Coastguard Worker ensureRealfileExists(t, files, "javalib/myjar.jar") 8051*333d2b36SAndroid Build Coastguard Worker ensureRealfileExists(t, files, "lib64/mylib.so") 8052*333d2b36SAndroid Build Coastguard Worker ensureRealfileExists(t, files, "lib64/myotherlib.so") 8053*333d2b36SAndroid Build Coastguard Worker ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") 8054*333d2b36SAndroid Build Coastguard Worker 8055*333d2b36SAndroid Build Coastguard Worker files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable") 8056*333d2b36SAndroid Build Coastguard Worker ensureRealfileExists(t, files, "javalib/myjar.jar") 8057*333d2b36SAndroid Build Coastguard Worker ensureRealfileExists(t, files, "lib64/mylib.so") 8058*333d2b36SAndroid Build Coastguard Worker ensureRealfileExists(t, files, "lib64/myotherlib.so") 8059*333d2b36SAndroid Build Coastguard Worker ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") 8060*333d2b36SAndroid Build Coastguard Worker 8061*333d2b36SAndroid Build Coastguard Worker // For bundled build, symlink to the system for the non-updatable APEXes only 8062*333d2b36SAndroid Build Coastguard Worker ctx = testApex(t, bp) 8063*333d2b36SAndroid Build Coastguard Worker files = getFiles(t, ctx, "myapex", "android_common_myapex") 8064*333d2b36SAndroid Build Coastguard Worker ensureRealfileExists(t, files, "javalib/myjar.jar") 8065*333d2b36SAndroid Build Coastguard Worker ensureRealfileExists(t, files, "lib64/mylib.so") 8066*333d2b36SAndroid Build Coastguard Worker ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink 8067*333d2b36SAndroid Build Coastguard Worker ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink 8068*333d2b36SAndroid Build Coastguard Worker 8069*333d2b36SAndroid Build Coastguard Worker files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable") 8070*333d2b36SAndroid Build Coastguard Worker ensureRealfileExists(t, files, "javalib/myjar.jar") 8071*333d2b36SAndroid Build Coastguard Worker ensureRealfileExists(t, files, "lib64/mylib.so") 8072*333d2b36SAndroid Build Coastguard Worker ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file 8073*333d2b36SAndroid Build Coastguard Worker ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file 8074*333d2b36SAndroid Build Coastguard Worker} 8075*333d2b36SAndroid Build Coastguard Worker 8076*333d2b36SAndroid Build Coastguard Workerfunc TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) { 8077*333d2b36SAndroid Build Coastguard Worker t.Parallel() 8078*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 8079*333d2b36SAndroid Build Coastguard Worker apex { 8080*333d2b36SAndroid Build Coastguard Worker name: "myapex", 8081*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 8082*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 8083*333d2b36SAndroid Build Coastguard Worker updatable: false, 8084*333d2b36SAndroid Build Coastguard Worker } 8085*333d2b36SAndroid Build Coastguard Worker 8086*333d2b36SAndroid Build Coastguard Worker apex_key { 8087*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 8088*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 8089*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 8090*333d2b36SAndroid Build Coastguard Worker } 8091*333d2b36SAndroid Build Coastguard Worker 8092*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 8093*333d2b36SAndroid Build Coastguard Worker name: "mylib", 8094*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 8095*333d2b36SAndroid Build Coastguard Worker shared_libs: ["myotherlib"], 8096*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 8097*333d2b36SAndroid Build Coastguard Worker stl: "none", 8098*333d2b36SAndroid Build Coastguard Worker apex_available: [ 8099*333d2b36SAndroid Build Coastguard Worker "myapex", 8100*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 8101*333d2b36SAndroid Build Coastguard Worker ], 8102*333d2b36SAndroid Build Coastguard Worker } 8103*333d2b36SAndroid Build Coastguard Worker 8104*333d2b36SAndroid Build Coastguard Worker cc_prebuilt_library_shared { 8105*333d2b36SAndroid Build Coastguard Worker name: "myotherlib", 8106*333d2b36SAndroid Build Coastguard Worker srcs: ["prebuilt.so"], 8107*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 8108*333d2b36SAndroid Build Coastguard Worker stl: "none", 8109*333d2b36SAndroid Build Coastguard Worker apex_available: [ 8110*333d2b36SAndroid Build Coastguard Worker "myapex", 8111*333d2b36SAndroid Build Coastguard Worker "//apex_available:platform", 8112*333d2b36SAndroid Build Coastguard Worker ], 8113*333d2b36SAndroid Build Coastguard Worker } 8114*333d2b36SAndroid Build Coastguard Worker `) 8115*333d2b36SAndroid Build Coastguard Worker 8116*333d2b36SAndroid Build Coastguard Worker apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) 8117*333d2b36SAndroid Build Coastguard Worker data := android.AndroidMkDataForTest(t, ctx, apexBundle) 8118*333d2b36SAndroid Build Coastguard Worker var builder strings.Builder 8119*333d2b36SAndroid Build Coastguard Worker data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data) 8120*333d2b36SAndroid Build Coastguard Worker androidMk := builder.String() 8121*333d2b36SAndroid Build Coastguard Worker // `myotherlib` is added to `myapex` as symlink 8122*333d2b36SAndroid Build Coastguard Worker ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n") 8123*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n") 8124*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n") 8125*333d2b36SAndroid Build Coastguard Worker // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib` 8126*333d2b36SAndroid Build Coastguard Worker ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n") 8127*333d2b36SAndroid Build Coastguard Worker} 8128*333d2b36SAndroid Build Coastguard Worker 8129*333d2b36SAndroid Build Coastguard Workerfunc TestApexWithJniLibs(t *testing.T) { 8130*333d2b36SAndroid Build Coastguard Worker t.Parallel() 8131*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 8132*333d2b36SAndroid Build Coastguard Worker apex { 8133*333d2b36SAndroid Build Coastguard Worker name: "myapex", 8134*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 8135*333d2b36SAndroid Build Coastguard Worker binaries: ["mybin"], 8136*333d2b36SAndroid Build Coastguard Worker jni_libs: ["mylib", "mylib3", "libfoo.rust"], 8137*333d2b36SAndroid Build Coastguard Worker updatable: false, 8138*333d2b36SAndroid Build Coastguard Worker } 8139*333d2b36SAndroid Build Coastguard Worker 8140*333d2b36SAndroid Build Coastguard Worker apex_key { 8141*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 8142*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 8143*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 8144*333d2b36SAndroid Build Coastguard Worker } 8145*333d2b36SAndroid Build Coastguard Worker 8146*333d2b36SAndroid Build Coastguard Worker cc_library { 8147*333d2b36SAndroid Build Coastguard Worker name: "mylib", 8148*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 8149*333d2b36SAndroid Build Coastguard Worker shared_libs: ["mylib2"], 8150*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 8151*333d2b36SAndroid Build Coastguard Worker stl: "none", 8152*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 8153*333d2b36SAndroid Build Coastguard Worker } 8154*333d2b36SAndroid Build Coastguard Worker 8155*333d2b36SAndroid Build Coastguard Worker cc_library { 8156*333d2b36SAndroid Build Coastguard Worker name: "mylib2", 8157*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 8158*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 8159*333d2b36SAndroid Build Coastguard Worker stl: "none", 8160*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 8161*333d2b36SAndroid Build Coastguard Worker } 8162*333d2b36SAndroid Build Coastguard Worker 8163*333d2b36SAndroid Build Coastguard Worker // Used as both a JNI library and a regular shared library. 8164*333d2b36SAndroid Build Coastguard Worker cc_library { 8165*333d2b36SAndroid Build Coastguard Worker name: "mylib3", 8166*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 8167*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 8168*333d2b36SAndroid Build Coastguard Worker stl: "none", 8169*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 8170*333d2b36SAndroid Build Coastguard Worker } 8171*333d2b36SAndroid Build Coastguard Worker 8172*333d2b36SAndroid Build Coastguard Worker cc_binary { 8173*333d2b36SAndroid Build Coastguard Worker name: "mybin", 8174*333d2b36SAndroid Build Coastguard Worker srcs: ["mybin.cpp"], 8175*333d2b36SAndroid Build Coastguard Worker shared_libs: ["mylib3"], 8176*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 8177*333d2b36SAndroid Build Coastguard Worker stl: "none", 8178*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 8179*333d2b36SAndroid Build Coastguard Worker } 8180*333d2b36SAndroid Build Coastguard Worker 8181*333d2b36SAndroid Build Coastguard Worker rust_ffi_shared { 8182*333d2b36SAndroid Build Coastguard Worker name: "libfoo.rust", 8183*333d2b36SAndroid Build Coastguard Worker crate_name: "foo", 8184*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 8185*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libfoo.shared_from_rust"], 8186*333d2b36SAndroid Build Coastguard Worker prefer_rlib: true, 8187*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 8188*333d2b36SAndroid Build Coastguard Worker } 8189*333d2b36SAndroid Build Coastguard Worker 8190*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 8191*333d2b36SAndroid Build Coastguard Worker name: "libfoo.shared_from_rust", 8192*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 8193*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 8194*333d2b36SAndroid Build Coastguard Worker stl: "none", 8195*333d2b36SAndroid Build Coastguard Worker stubs: { 8196*333d2b36SAndroid Build Coastguard Worker versions: ["10", "11", "12"], 8197*333d2b36SAndroid Build Coastguard Worker }, 8198*333d2b36SAndroid Build Coastguard Worker } 8199*333d2b36SAndroid Build Coastguard Worker 8200*333d2b36SAndroid Build Coastguard Worker `) 8201*333d2b36SAndroid Build Coastguard Worker 8202*333d2b36SAndroid Build Coastguard Worker rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule") 8203*333d2b36SAndroid Build Coastguard Worker // Notice mylib2.so (transitive dep) is not added as a jni_lib 8204*333d2b36SAndroid Build Coastguard Worker ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so") 8205*333d2b36SAndroid Build Coastguard Worker ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{ 8206*333d2b36SAndroid Build Coastguard Worker "bin/mybin", 8207*333d2b36SAndroid Build Coastguard Worker "lib64/mylib.so", 8208*333d2b36SAndroid Build Coastguard Worker "lib64/mylib2.so", 8209*333d2b36SAndroid Build Coastguard Worker "lib64/mylib3.so", 8210*333d2b36SAndroid Build Coastguard Worker "lib64/libfoo.rust.so", 8211*333d2b36SAndroid Build Coastguard Worker "lib64/libc++.so", // auto-added to libfoo.rust by Soong 8212*333d2b36SAndroid Build Coastguard Worker "lib64/liblog.so", // auto-added to libfoo.rust by Soong 8213*333d2b36SAndroid Build Coastguard Worker }) 8214*333d2b36SAndroid Build Coastguard Worker 8215*333d2b36SAndroid Build Coastguard Worker // b/220397949 8216*333d2b36SAndroid Build Coastguard Worker ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so") 8217*333d2b36SAndroid Build Coastguard Worker} 8218*333d2b36SAndroid Build Coastguard Worker 8219*333d2b36SAndroid Build Coastguard Workerfunc TestApexMutatorsDontRunIfDisabled(t *testing.T) { 8220*333d2b36SAndroid Build Coastguard Worker t.Parallel() 8221*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 8222*333d2b36SAndroid Build Coastguard Worker apex { 8223*333d2b36SAndroid Build Coastguard Worker name: "myapex", 8224*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 8225*333d2b36SAndroid Build Coastguard Worker updatable: false, 8226*333d2b36SAndroid Build Coastguard Worker } 8227*333d2b36SAndroid Build Coastguard Worker apex_key { 8228*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 8229*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 8230*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 8231*333d2b36SAndroid Build Coastguard Worker } 8232*333d2b36SAndroid Build Coastguard Worker `, 8233*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyConfig(func(config android.Config) { 8234*333d2b36SAndroid Build Coastguard Worker delete(config.Targets, android.Android) 8235*333d2b36SAndroid Build Coastguard Worker config.AndroidCommonTarget = android.Target{} 8236*333d2b36SAndroid Build Coastguard Worker }), 8237*333d2b36SAndroid Build Coastguard Worker ) 8238*333d2b36SAndroid Build Coastguard Worker 8239*333d2b36SAndroid Build Coastguard Worker if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) { 8240*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected variants: %v, but got: %v", expected, got) 8241*333d2b36SAndroid Build Coastguard Worker } 8242*333d2b36SAndroid Build Coastguard Worker} 8243*333d2b36SAndroid Build Coastguard Worker 8244*333d2b36SAndroid Build Coastguard Workerfunc TestAppBundle(t *testing.T) { 8245*333d2b36SAndroid Build Coastguard Worker t.Parallel() 8246*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 8247*333d2b36SAndroid Build Coastguard Worker apex { 8248*333d2b36SAndroid Build Coastguard Worker name: "myapex", 8249*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 8250*333d2b36SAndroid Build Coastguard Worker apps: ["AppFoo"], 8251*333d2b36SAndroid Build Coastguard Worker updatable: false, 8252*333d2b36SAndroid Build Coastguard Worker } 8253*333d2b36SAndroid Build Coastguard Worker 8254*333d2b36SAndroid Build Coastguard Worker apex_key { 8255*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 8256*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 8257*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 8258*333d2b36SAndroid Build Coastguard Worker } 8259*333d2b36SAndroid Build Coastguard Worker 8260*333d2b36SAndroid Build Coastguard Worker android_app { 8261*333d2b36SAndroid Build Coastguard Worker name: "AppFoo", 8262*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 8263*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 8264*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 8265*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 8266*333d2b36SAndroid Build Coastguard Worker } 8267*333d2b36SAndroid Build Coastguard Worker `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"})) 8268*333d2b36SAndroid Build Coastguard Worker 8269*333d2b36SAndroid Build Coastguard Worker bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json") 8270*333d2b36SAndroid Build Coastguard Worker content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule) 8271*333d2b36SAndroid Build Coastguard Worker 8272*333d2b36SAndroid Build Coastguard Worker ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`) 8273*333d2b36SAndroid Build Coastguard Worker ensureContains(t, content, `"apex_config":{"apex_embedded_apk_config":[{"package_name":"com.android.foo","path":"app/AppFoo@TEST.BUILD_ID/AppFoo.apk"}]}`) 8274*333d2b36SAndroid Build Coastguard Worker} 8275*333d2b36SAndroid Build Coastguard Worker 8276*333d2b36SAndroid Build Coastguard Workerfunc TestAppSetBundle(t *testing.T) { 8277*333d2b36SAndroid Build Coastguard Worker t.Parallel() 8278*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 8279*333d2b36SAndroid Build Coastguard Worker apex { 8280*333d2b36SAndroid Build Coastguard Worker name: "myapex", 8281*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 8282*333d2b36SAndroid Build Coastguard Worker apps: ["AppSet"], 8283*333d2b36SAndroid Build Coastguard Worker updatable: false, 8284*333d2b36SAndroid Build Coastguard Worker } 8285*333d2b36SAndroid Build Coastguard Worker 8286*333d2b36SAndroid Build Coastguard Worker apex_key { 8287*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 8288*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 8289*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 8290*333d2b36SAndroid Build Coastguard Worker } 8291*333d2b36SAndroid Build Coastguard Worker 8292*333d2b36SAndroid Build Coastguard Worker android_app_set { 8293*333d2b36SAndroid Build Coastguard Worker name: "AppSet", 8294*333d2b36SAndroid Build Coastguard Worker set: "AppSet.apks", 8295*333d2b36SAndroid Build Coastguard Worker }`) 8296*333d2b36SAndroid Build Coastguard Worker mod := ctx.ModuleForTests("myapex", "android_common_myapex") 8297*333d2b36SAndroid Build Coastguard Worker bundleConfigRule := mod.Output("bundle_config.json") 8298*333d2b36SAndroid Build Coastguard Worker content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule) 8299*333d2b36SAndroid Build Coastguard Worker ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`) 8300*333d2b36SAndroid Build Coastguard Worker s := mod.Rule("apexRule").Args["copy_commands"] 8301*333d2b36SAndroid Build Coastguard Worker copyCmds := regexp.MustCompile(" *&& *").Split(s, -1) 8302*333d2b36SAndroid Build Coastguard Worker if len(copyCmds) != 4 { 8303*333d2b36SAndroid Build Coastguard Worker t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s) 8304*333d2b36SAndroid Build Coastguard Worker } 8305*333d2b36SAndroid Build Coastguard Worker ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$") 8306*333d2b36SAndroid Build Coastguard Worker ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$") 8307*333d2b36SAndroid Build Coastguard Worker ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$") 8308*333d2b36SAndroid Build Coastguard Worker ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$") 8309*333d2b36SAndroid Build Coastguard Worker 8310*333d2b36SAndroid Build Coastguard Worker // Ensure that canned_fs_config has an entry for the app set zip file 8311*333d2b36SAndroid Build Coastguard Worker generateFsRule := mod.Rule("generateFsConfig") 8312*333d2b36SAndroid Build Coastguard Worker cmd := generateFsRule.RuleParams.Command 8313*333d2b36SAndroid Build Coastguard Worker ensureContains(t, cmd, "AppSet.zip") 8314*333d2b36SAndroid Build Coastguard Worker} 8315*333d2b36SAndroid Build Coastguard Worker 8316*333d2b36SAndroid Build Coastguard Workerfunc TestAppSetBundlePrebuilt(t *testing.T) { 8317*333d2b36SAndroid Build Coastguard Worker bp := ` 8318*333d2b36SAndroid Build Coastguard Worker apex_set { 8319*333d2b36SAndroid Build Coastguard Worker name: "myapex", 8320*333d2b36SAndroid Build Coastguard Worker filename: "foo_v2.apex", 8321*333d2b36SAndroid Build Coastguard Worker sanitized: { 8322*333d2b36SAndroid Build Coastguard Worker none: { set: "myapex.apks", }, 8323*333d2b36SAndroid Build Coastguard Worker hwaddress: { set: "myapex.hwasan.apks", }, 8324*333d2b36SAndroid Build Coastguard Worker }, 8325*333d2b36SAndroid Build Coastguard Worker } 8326*333d2b36SAndroid Build Coastguard Worker ` 8327*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress) 8328*333d2b36SAndroid Build Coastguard Worker 8329*333d2b36SAndroid Build Coastguard Worker // Check that the extractor produces the correct output file from the correct input file. 8330*333d2b36SAndroid Build Coastguard Worker extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks" 8331*333d2b36SAndroid Build Coastguard Worker 8332*333d2b36SAndroid Build Coastguard Worker m := ctx.ModuleForTests("myapex", "android_common_myapex") 8333*333d2b36SAndroid Build Coastguard Worker extractedApex := m.Output(extractorOutput) 8334*333d2b36SAndroid Build Coastguard Worker 8335*333d2b36SAndroid Build Coastguard Worker android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings()) 8336*333d2b36SAndroid Build Coastguard Worker 8337*333d2b36SAndroid Build Coastguard Worker // Ditto for the apex. 8338*333d2b36SAndroid Build Coastguard Worker m = ctx.ModuleForTests("myapex", "android_common_myapex") 8339*333d2b36SAndroid Build Coastguard Worker copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex") 8340*333d2b36SAndroid Build Coastguard Worker 8341*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String()) 8342*333d2b36SAndroid Build Coastguard Worker} 8343*333d2b36SAndroid Build Coastguard Worker 8344*333d2b36SAndroid Build Coastguard Workerfunc TestApexSetApksModuleAssignment(t *testing.T) { 8345*333d2b36SAndroid Build Coastguard Worker t.Parallel() 8346*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 8347*333d2b36SAndroid Build Coastguard Worker apex_set { 8348*333d2b36SAndroid Build Coastguard Worker name: "myapex", 8349*333d2b36SAndroid Build Coastguard Worker set: ":myapex_apks_file", 8350*333d2b36SAndroid Build Coastguard Worker } 8351*333d2b36SAndroid Build Coastguard Worker 8352*333d2b36SAndroid Build Coastguard Worker filegroup { 8353*333d2b36SAndroid Build Coastguard Worker name: "myapex_apks_file", 8354*333d2b36SAndroid Build Coastguard Worker srcs: ["myapex.apks"], 8355*333d2b36SAndroid Build Coastguard Worker } 8356*333d2b36SAndroid Build Coastguard Worker `) 8357*333d2b36SAndroid Build Coastguard Worker 8358*333d2b36SAndroid Build Coastguard Worker m := ctx.ModuleForTests("myapex", "android_common_myapex") 8359*333d2b36SAndroid Build Coastguard Worker 8360*333d2b36SAndroid Build Coastguard Worker // Check that the extractor produces the correct apks file from the input module 8361*333d2b36SAndroid Build Coastguard Worker extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks" 8362*333d2b36SAndroid Build Coastguard Worker extractedApex := m.Output(extractorOutput) 8363*333d2b36SAndroid Build Coastguard Worker 8364*333d2b36SAndroid Build Coastguard Worker android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings()) 8365*333d2b36SAndroid Build Coastguard Worker} 8366*333d2b36SAndroid Build Coastguard Worker 8367*333d2b36SAndroid Build Coastguard Workerfunc testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext { 8368*333d2b36SAndroid Build Coastguard Worker t.Helper() 8369*333d2b36SAndroid Build Coastguard Worker 8370*333d2b36SAndroid Build Coastguard Worker fs := android.MockFS{ 8371*333d2b36SAndroid Build Coastguard Worker "a.java": nil, 8372*333d2b36SAndroid Build Coastguard Worker "a.jar": nil, 8373*333d2b36SAndroid Build Coastguard Worker "apex_manifest.json": nil, 8374*333d2b36SAndroid Build Coastguard Worker "AndroidManifest.xml": nil, 8375*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/myapex-file_contexts": nil, 8376*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/some-updatable-apex-file_contexts": nil, 8377*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil, 8378*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/com.android.art.debug-file_contexts": nil, 8379*333d2b36SAndroid Build Coastguard Worker "framework/aidl/a.aidl": nil, 8380*333d2b36SAndroid Build Coastguard Worker } 8381*333d2b36SAndroid Build Coastguard Worker 8382*333d2b36SAndroid Build Coastguard Worker errorHandler := android.FixtureExpectsNoErrors 8383*333d2b36SAndroid Build Coastguard Worker if errmsg != "" { 8384*333d2b36SAndroid Build Coastguard Worker errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg) 8385*333d2b36SAndroid Build Coastguard Worker } 8386*333d2b36SAndroid Build Coastguard Worker 8387*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 8388*333d2b36SAndroid Build Coastguard Worker cc.PrepareForTestWithCcDefaultModules, 8389*333d2b36SAndroid Build Coastguard Worker java.PrepareForTestWithHiddenApiBuildComponents, 8390*333d2b36SAndroid Build Coastguard Worker java.PrepareForTestWithDexpreopt, 8391*333d2b36SAndroid Build Coastguard Worker java.PrepareForTestWithJavaSdkLibraryFiles, 8392*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithApexBuildComponents, 8393*333d2b36SAndroid Build Coastguard Worker preparer, 8394*333d2b36SAndroid Build Coastguard Worker fs.AddToFixture(), 8395*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyMockFS(func(fs android.MockFS) { 8396*333d2b36SAndroid Build Coastguard Worker if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok { 8397*333d2b36SAndroid Build Coastguard Worker insert := "" 8398*333d2b36SAndroid Build Coastguard Worker for _, fragment := range fragments { 8399*333d2b36SAndroid Build Coastguard Worker insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module) 8400*333d2b36SAndroid Build Coastguard Worker } 8401*333d2b36SAndroid Build Coastguard Worker fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(` 8402*333d2b36SAndroid Build Coastguard Worker platform_bootclasspath { 8403*333d2b36SAndroid Build Coastguard Worker name: "platform-bootclasspath", 8404*333d2b36SAndroid Build Coastguard Worker fragments: [ 8405*333d2b36SAndroid Build Coastguard Worker {apex: "com.android.art", module: "art-bootclasspath-fragment"}, 8406*333d2b36SAndroid Build Coastguard Worker %s 8407*333d2b36SAndroid Build Coastguard Worker ], 8408*333d2b36SAndroid Build Coastguard Worker } 8409*333d2b36SAndroid Build Coastguard Worker `, insert)) 8410*333d2b36SAndroid Build Coastguard Worker } 8411*333d2b36SAndroid Build Coastguard Worker }), 8412*333d2b36SAndroid Build Coastguard Worker // Dexpreopt for boot jars requires the ART boot image profile. 8413*333d2b36SAndroid Build Coastguard Worker java.PrepareApexBootJarModule("com.android.art", "core-oj"), 8414*333d2b36SAndroid Build Coastguard Worker dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"), 8415*333d2b36SAndroid Build Coastguard Worker dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"), 8416*333d2b36SAndroid Build Coastguard Worker ). 8417*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(errorHandler). 8418*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, bp) 8419*333d2b36SAndroid Build Coastguard Worker 8420*333d2b36SAndroid Build Coastguard Worker return result.TestContext 8421*333d2b36SAndroid Build Coastguard Worker} 8422*333d2b36SAndroid Build Coastguard Worker 8423*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatable_should_set_min_sdk_version(t *testing.T) { 8424*333d2b36SAndroid Build Coastguard Worker t.Parallel() 8425*333d2b36SAndroid Build Coastguard Worker testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, ` 8426*333d2b36SAndroid Build Coastguard Worker apex { 8427*333d2b36SAndroid Build Coastguard Worker name: "myapex", 8428*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 8429*333d2b36SAndroid Build Coastguard Worker updatable: true, 8430*333d2b36SAndroid Build Coastguard Worker } 8431*333d2b36SAndroid Build Coastguard Worker 8432*333d2b36SAndroid Build Coastguard Worker apex_key { 8433*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 8434*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 8435*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 8436*333d2b36SAndroid Build Coastguard Worker } 8437*333d2b36SAndroid Build Coastguard Worker `) 8438*333d2b36SAndroid Build Coastguard Worker} 8439*333d2b36SAndroid Build Coastguard Worker 8440*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) { 8441*333d2b36SAndroid Build Coastguard Worker t.Parallel() 8442*333d2b36SAndroid Build Coastguard Worker testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, ` 8443*333d2b36SAndroid Build Coastguard Worker apex { 8444*333d2b36SAndroid Build Coastguard Worker name: "myapex", 8445*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 8446*333d2b36SAndroid Build Coastguard Worker } 8447*333d2b36SAndroid Build Coastguard Worker 8448*333d2b36SAndroid Build Coastguard Worker apex_key { 8449*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 8450*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 8451*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 8452*333d2b36SAndroid Build Coastguard Worker } 8453*333d2b36SAndroid Build Coastguard Worker `) 8454*333d2b36SAndroid Build Coastguard Worker} 8455*333d2b36SAndroid Build Coastguard Worker 8456*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) { 8457*333d2b36SAndroid Build Coastguard Worker t.Parallel() 8458*333d2b36SAndroid Build Coastguard Worker testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, ` 8459*333d2b36SAndroid Build Coastguard Worker apex { 8460*333d2b36SAndroid Build Coastguard Worker name: "myapex", 8461*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 8462*333d2b36SAndroid Build Coastguard Worker systemserverclasspath_fragments: [ 8463*333d2b36SAndroid Build Coastguard Worker "mysystemserverclasspathfragment", 8464*333d2b36SAndroid Build Coastguard Worker ], 8465*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 8466*333d2b36SAndroid Build Coastguard Worker updatable: true, 8467*333d2b36SAndroid Build Coastguard Worker } 8468*333d2b36SAndroid Build Coastguard Worker 8469*333d2b36SAndroid Build Coastguard Worker apex_key { 8470*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 8471*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 8472*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 8473*333d2b36SAndroid Build Coastguard Worker } 8474*333d2b36SAndroid Build Coastguard Worker 8475*333d2b36SAndroid Build Coastguard Worker java_library { 8476*333d2b36SAndroid Build Coastguard Worker name: "foo", 8477*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 8478*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 8479*333d2b36SAndroid Build Coastguard Worker installable: true, 8480*333d2b36SAndroid Build Coastguard Worker apex_available: [ 8481*333d2b36SAndroid Build Coastguard Worker "myapex", 8482*333d2b36SAndroid Build Coastguard Worker ], 8483*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 8484*333d2b36SAndroid Build Coastguard Worker } 8485*333d2b36SAndroid Build Coastguard Worker 8486*333d2b36SAndroid Build Coastguard Worker systemserverclasspath_fragment { 8487*333d2b36SAndroid Build Coastguard Worker name: "mysystemserverclasspathfragment", 8488*333d2b36SAndroid Build Coastguard Worker generate_classpaths_proto: false, 8489*333d2b36SAndroid Build Coastguard Worker contents: [ 8490*333d2b36SAndroid Build Coastguard Worker "foo", 8491*333d2b36SAndroid Build Coastguard Worker ], 8492*333d2b36SAndroid Build Coastguard Worker apex_available: [ 8493*333d2b36SAndroid Build Coastguard Worker "myapex", 8494*333d2b36SAndroid Build Coastguard Worker ], 8495*333d2b36SAndroid Build Coastguard Worker } 8496*333d2b36SAndroid Build Coastguard Worker `, 8497*333d2b36SAndroid Build Coastguard Worker dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"), 8498*333d2b36SAndroid Build Coastguard Worker ) 8499*333d2b36SAndroid Build Coastguard Worker} 8500*333d2b36SAndroid Build Coastguard Worker 8501*333d2b36SAndroid Build Coastguard Workerfunc TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) { 8502*333d2b36SAndroid Build Coastguard Worker t.Parallel() 8503*333d2b36SAndroid Build Coastguard Worker preparer := java.FixtureConfigureApexBootJars("myapex:libfoo") 8504*333d2b36SAndroid Build Coastguard Worker t.Run("prebuilt no source", func(t *testing.T) { 8505*333d2b36SAndroid Build Coastguard Worker t.Parallel() 8506*333d2b36SAndroid Build Coastguard Worker fragment := java.ApexVariantReference{ 8507*333d2b36SAndroid Build Coastguard Worker Apex: proptools.StringPtr("myapex"), 8508*333d2b36SAndroid Build Coastguard Worker Module: proptools.StringPtr("my-bootclasspath-fragment"), 8509*333d2b36SAndroid Build Coastguard Worker } 8510*333d2b36SAndroid Build Coastguard Worker 8511*333d2b36SAndroid Build Coastguard Worker testDexpreoptWithApexes(t, ` 8512*333d2b36SAndroid Build Coastguard Worker prebuilt_apex { 8513*333d2b36SAndroid Build Coastguard Worker name: "myapex" , 8514*333d2b36SAndroid Build Coastguard Worker arch: { 8515*333d2b36SAndroid Build Coastguard Worker arm64: { 8516*333d2b36SAndroid Build Coastguard Worker src: "myapex-arm64.apex", 8517*333d2b36SAndroid Build Coastguard Worker }, 8518*333d2b36SAndroid Build Coastguard Worker arm: { 8519*333d2b36SAndroid Build Coastguard Worker src: "myapex-arm.apex", 8520*333d2b36SAndroid Build Coastguard Worker }, 8521*333d2b36SAndroid Build Coastguard Worker }, 8522*333d2b36SAndroid Build Coastguard Worker exported_bootclasspath_fragments: ["my-bootclasspath-fragment"], 8523*333d2b36SAndroid Build Coastguard Worker } 8524*333d2b36SAndroid Build Coastguard Worker 8525*333d2b36SAndroid Build Coastguard Worker prebuilt_bootclasspath_fragment { 8526*333d2b36SAndroid Build Coastguard Worker name: "my-bootclasspath-fragment", 8527*333d2b36SAndroid Build Coastguard Worker contents: ["libfoo"], 8528*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 8529*333d2b36SAndroid Build Coastguard Worker hidden_api: { 8530*333d2b36SAndroid Build Coastguard Worker annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv", 8531*333d2b36SAndroid Build Coastguard Worker metadata: "my-bootclasspath-fragment/metadata.csv", 8532*333d2b36SAndroid Build Coastguard Worker index: "my-bootclasspath-fragment/index.csv", 8533*333d2b36SAndroid Build Coastguard Worker signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv", 8534*333d2b36SAndroid Build Coastguard Worker filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv", 8535*333d2b36SAndroid Build Coastguard Worker filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv", 8536*333d2b36SAndroid Build Coastguard Worker }, 8537*333d2b36SAndroid Build Coastguard Worker } 8538*333d2b36SAndroid Build Coastguard Worker 8539*333d2b36SAndroid Build Coastguard Worker java_sdk_library_import { 8540*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 8541*333d2b36SAndroid Build Coastguard Worker prefer: true, 8542*333d2b36SAndroid Build Coastguard Worker public: { 8543*333d2b36SAndroid Build Coastguard Worker jars: ["libfoo.jar"], 8544*333d2b36SAndroid Build Coastguard Worker }, 8545*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 8546*333d2b36SAndroid Build Coastguard Worker shared_library: false, 8547*333d2b36SAndroid Build Coastguard Worker permitted_packages: ["libfoo"], 8548*333d2b36SAndroid Build Coastguard Worker } 8549*333d2b36SAndroid Build Coastguard Worker `, "", preparer, fragment) 8550*333d2b36SAndroid Build Coastguard Worker }) 8551*333d2b36SAndroid Build Coastguard Worker} 8552*333d2b36SAndroid Build Coastguard Worker 8553*333d2b36SAndroid Build Coastguard Workerfunc testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) { 8554*333d2b36SAndroid Build Coastguard Worker t.Helper() 8555*333d2b36SAndroid Build Coastguard Worker bp += ` 8556*333d2b36SAndroid Build Coastguard Worker apex_key { 8557*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 8558*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 8559*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 8560*333d2b36SAndroid Build Coastguard Worker }` 8561*333d2b36SAndroid Build Coastguard Worker fs := android.MockFS{ 8562*333d2b36SAndroid Build Coastguard Worker "lib1/src/A.java": nil, 8563*333d2b36SAndroid Build Coastguard Worker "lib2/src/B.java": nil, 8564*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/myapex-file_contexts": nil, 8565*333d2b36SAndroid Build Coastguard Worker } 8566*333d2b36SAndroid Build Coastguard Worker 8567*333d2b36SAndroid Build Coastguard Worker errorHandler := android.FixtureExpectsNoErrors 8568*333d2b36SAndroid Build Coastguard Worker if errmsg != "" { 8569*333d2b36SAndroid Build Coastguard Worker errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg) 8570*333d2b36SAndroid Build Coastguard Worker } 8571*333d2b36SAndroid Build Coastguard Worker 8572*333d2b36SAndroid Build Coastguard Worker android.GroupFixturePreparers( 8573*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithAndroidBuildComponents, 8574*333d2b36SAndroid Build Coastguard Worker java.PrepareForTestWithJavaBuildComponents, 8575*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithApexBuildComponents, 8576*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithNeverallowRules(rules), 8577*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 8578*333d2b36SAndroid Build Coastguard Worker apexBootJars := make([]string, 0, len(bootJars)) 8579*333d2b36SAndroid Build Coastguard Worker for _, apexBootJar := range bootJars { 8580*333d2b36SAndroid Build Coastguard Worker apexBootJars = append(apexBootJars, "myapex:"+apexBootJar) 8581*333d2b36SAndroid Build Coastguard Worker } 8582*333d2b36SAndroid Build Coastguard Worker variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars) 8583*333d2b36SAndroid Build Coastguard Worker }), 8584*333d2b36SAndroid Build Coastguard Worker fs.AddToFixture(), 8585*333d2b36SAndroid Build Coastguard Worker ). 8586*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(errorHandler). 8587*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, bp) 8588*333d2b36SAndroid Build Coastguard Worker} 8589*333d2b36SAndroid Build Coastguard Worker 8590*333d2b36SAndroid Build Coastguard Workerfunc TestApexPermittedPackagesRules(t *testing.T) { 8591*333d2b36SAndroid Build Coastguard Worker t.Parallel() 8592*333d2b36SAndroid Build Coastguard Worker testcases := []struct { 8593*333d2b36SAndroid Build Coastguard Worker name string 8594*333d2b36SAndroid Build Coastguard Worker expectedError string 8595*333d2b36SAndroid Build Coastguard Worker bp string 8596*333d2b36SAndroid Build Coastguard Worker bootJars []string 8597*333d2b36SAndroid Build Coastguard Worker bcpPermittedPackages map[string][]string 8598*333d2b36SAndroid Build Coastguard Worker }{ 8599*333d2b36SAndroid Build Coastguard Worker 8600*333d2b36SAndroid Build Coastguard Worker { 8601*333d2b36SAndroid Build Coastguard Worker name: "Non-Bootclasspath apex jar not satisfying allowed module packages.", 8602*333d2b36SAndroid Build Coastguard Worker expectedError: "", 8603*333d2b36SAndroid Build Coastguard Worker bp: ` 8604*333d2b36SAndroid Build Coastguard Worker java_library { 8605*333d2b36SAndroid Build Coastguard Worker name: "bcp_lib1", 8606*333d2b36SAndroid Build Coastguard Worker srcs: ["lib1/src/*.java"], 8607*333d2b36SAndroid Build Coastguard Worker permitted_packages: ["foo.bar"], 8608*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 8609*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 8610*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 8611*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 8612*333d2b36SAndroid Build Coastguard Worker } 8613*333d2b36SAndroid Build Coastguard Worker java_library { 8614*333d2b36SAndroid Build Coastguard Worker name: "nonbcp_lib2", 8615*333d2b36SAndroid Build Coastguard Worker srcs: ["lib2/src/*.java"], 8616*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 8617*333d2b36SAndroid Build Coastguard Worker permitted_packages: ["a.b"], 8618*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 8619*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 8620*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 8621*333d2b36SAndroid Build Coastguard Worker } 8622*333d2b36SAndroid Build Coastguard Worker apex { 8623*333d2b36SAndroid Build Coastguard Worker name: "myapex", 8624*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 8625*333d2b36SAndroid Build Coastguard Worker java_libs: ["bcp_lib1", "nonbcp_lib2"], 8626*333d2b36SAndroid Build Coastguard Worker updatable: false, 8627*333d2b36SAndroid Build Coastguard Worker }`, 8628*333d2b36SAndroid Build Coastguard Worker bootJars: []string{"bcp_lib1"}, 8629*333d2b36SAndroid Build Coastguard Worker bcpPermittedPackages: map[string][]string{ 8630*333d2b36SAndroid Build Coastguard Worker "bcp_lib1": []string{ 8631*333d2b36SAndroid Build Coastguard Worker "foo.bar", 8632*333d2b36SAndroid Build Coastguard Worker }, 8633*333d2b36SAndroid Build Coastguard Worker }, 8634*333d2b36SAndroid Build Coastguard Worker }, 8635*333d2b36SAndroid Build Coastguard Worker { 8636*333d2b36SAndroid Build Coastguard Worker name: "Bootclasspath apex jar not satisfying allowed module packages.", 8637*333d2b36SAndroid Build Coastguard Worker expectedError: `(?s)module "bcp_lib2" .* which is restricted because bcp_lib2 bootjar may only use these package prefixes: foo.bar. Please consider the following alternatives:\n 1. If the offending code is from a statically linked library, consider removing that dependency and using an alternative already in the bootclasspath, or perhaps a shared library. 2. Move the offending code into an allowed package.\n 3. Jarjar the offending code. Please be mindful of the potential system health implications of bundling that code, particularly if the offending jar is part of the bootclasspath.`, 8638*333d2b36SAndroid Build Coastguard Worker bp: ` 8639*333d2b36SAndroid Build Coastguard Worker java_library { 8640*333d2b36SAndroid Build Coastguard Worker name: "bcp_lib1", 8641*333d2b36SAndroid Build Coastguard Worker srcs: ["lib1/src/*.java"], 8642*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 8643*333d2b36SAndroid Build Coastguard Worker permitted_packages: ["foo.bar"], 8644*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 8645*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 8646*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 8647*333d2b36SAndroid Build Coastguard Worker } 8648*333d2b36SAndroid Build Coastguard Worker java_library { 8649*333d2b36SAndroid Build Coastguard Worker name: "bcp_lib2", 8650*333d2b36SAndroid Build Coastguard Worker srcs: ["lib2/src/*.java"], 8651*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 8652*333d2b36SAndroid Build Coastguard Worker permitted_packages: ["foo.bar", "bar.baz"], 8653*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 8654*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 8655*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 8656*333d2b36SAndroid Build Coastguard Worker } 8657*333d2b36SAndroid Build Coastguard Worker apex { 8658*333d2b36SAndroid Build Coastguard Worker name: "myapex", 8659*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 8660*333d2b36SAndroid Build Coastguard Worker java_libs: ["bcp_lib1", "bcp_lib2"], 8661*333d2b36SAndroid Build Coastguard Worker updatable: false, 8662*333d2b36SAndroid Build Coastguard Worker } 8663*333d2b36SAndroid Build Coastguard Worker `, 8664*333d2b36SAndroid Build Coastguard Worker bootJars: []string{"bcp_lib1", "bcp_lib2"}, 8665*333d2b36SAndroid Build Coastguard Worker bcpPermittedPackages: map[string][]string{ 8666*333d2b36SAndroid Build Coastguard Worker "bcp_lib1": []string{ 8667*333d2b36SAndroid Build Coastguard Worker "foo.bar", 8668*333d2b36SAndroid Build Coastguard Worker }, 8669*333d2b36SAndroid Build Coastguard Worker "bcp_lib2": []string{ 8670*333d2b36SAndroid Build Coastguard Worker "foo.bar", 8671*333d2b36SAndroid Build Coastguard Worker }, 8672*333d2b36SAndroid Build Coastguard Worker }, 8673*333d2b36SAndroid Build Coastguard Worker }, 8674*333d2b36SAndroid Build Coastguard Worker { 8675*333d2b36SAndroid Build Coastguard Worker name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.", 8676*333d2b36SAndroid Build Coastguard Worker expectedError: "", 8677*333d2b36SAndroid Build Coastguard Worker bp: ` 8678*333d2b36SAndroid Build Coastguard Worker java_library { 8679*333d2b36SAndroid Build Coastguard Worker name: "bcp_lib_restricted", 8680*333d2b36SAndroid Build Coastguard Worker srcs: ["lib1/src/*.java"], 8681*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 8682*333d2b36SAndroid Build Coastguard Worker permitted_packages: ["foo.bar"], 8683*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 8684*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 8685*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 8686*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 8687*333d2b36SAndroid Build Coastguard Worker } 8688*333d2b36SAndroid Build Coastguard Worker java_library { 8689*333d2b36SAndroid Build Coastguard Worker name: "bcp_lib_unrestricted", 8690*333d2b36SAndroid Build Coastguard Worker srcs: ["lib2/src/*.java"], 8691*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 8692*333d2b36SAndroid Build Coastguard Worker permitted_packages: ["foo.bar", "bar.baz"], 8693*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 8694*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 8695*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 8696*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 8697*333d2b36SAndroid Build Coastguard Worker } 8698*333d2b36SAndroid Build Coastguard Worker apex { 8699*333d2b36SAndroid Build Coastguard Worker name: "myapex", 8700*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 8701*333d2b36SAndroid Build Coastguard Worker java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"], 8702*333d2b36SAndroid Build Coastguard Worker updatable: true, 8703*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 8704*333d2b36SAndroid Build Coastguard Worker } 8705*333d2b36SAndroid Build Coastguard Worker `, 8706*333d2b36SAndroid Build Coastguard Worker bootJars: []string{"bcp_lib1", "bcp_lib2"}, 8707*333d2b36SAndroid Build Coastguard Worker bcpPermittedPackages: map[string][]string{ 8708*333d2b36SAndroid Build Coastguard Worker "bcp_lib1_non_updateable": []string{ 8709*333d2b36SAndroid Build Coastguard Worker "foo.bar", 8710*333d2b36SAndroid Build Coastguard Worker }, 8711*333d2b36SAndroid Build Coastguard Worker // bcp_lib2_updateable has no entry here since updateable bcp can contain new packages - tracking via an allowlist is not necessary 8712*333d2b36SAndroid Build Coastguard Worker }, 8713*333d2b36SAndroid Build Coastguard Worker }, 8714*333d2b36SAndroid Build Coastguard Worker } 8715*333d2b36SAndroid Build Coastguard Worker for _, tc := range testcases { 8716*333d2b36SAndroid Build Coastguard Worker t.Run(tc.name, func(t *testing.T) { 8717*333d2b36SAndroid Build Coastguard Worker t.Parallel() 8718*333d2b36SAndroid Build Coastguard Worker rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages) 8719*333d2b36SAndroid Build Coastguard Worker testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules) 8720*333d2b36SAndroid Build Coastguard Worker }) 8721*333d2b36SAndroid Build Coastguard Worker } 8722*333d2b36SAndroid Build Coastguard Worker} 8723*333d2b36SAndroid Build Coastguard Worker 8724*333d2b36SAndroid Build Coastguard Worker// TODO(jungjw): Move this to proptools 8725*333d2b36SAndroid Build Coastguard Workerfunc intPtr(i int) *int { 8726*333d2b36SAndroid Build Coastguard Worker return &i 8727*333d2b36SAndroid Build Coastguard Worker} 8728*333d2b36SAndroid Build Coastguard Worker 8729*333d2b36SAndroid Build Coastguard Workerfunc TestApexSet(t *testing.T) { 8730*333d2b36SAndroid Build Coastguard Worker t.Parallel() 8731*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 8732*333d2b36SAndroid Build Coastguard Worker apex_set { 8733*333d2b36SAndroid Build Coastguard Worker name: "myapex", 8734*333d2b36SAndroid Build Coastguard Worker set: "myapex.apks", 8735*333d2b36SAndroid Build Coastguard Worker filename: "foo_v2.apex", 8736*333d2b36SAndroid Build Coastguard Worker overrides: ["foo"], 8737*333d2b36SAndroid Build Coastguard Worker } 8738*333d2b36SAndroid Build Coastguard Worker `, 8739*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 8740*333d2b36SAndroid Build Coastguard Worker variables.Platform_sdk_version = intPtr(30) 8741*333d2b36SAndroid Build Coastguard Worker }), 8742*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyConfig(func(config android.Config) { 8743*333d2b36SAndroid Build Coastguard Worker config.Targets[android.Android] = []android.Target{ 8744*333d2b36SAndroid Build Coastguard Worker {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}}, 8745*333d2b36SAndroid Build Coastguard Worker {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}}, 8746*333d2b36SAndroid Build Coastguard Worker } 8747*333d2b36SAndroid Build Coastguard Worker }), 8748*333d2b36SAndroid Build Coastguard Worker ) 8749*333d2b36SAndroid Build Coastguard Worker 8750*333d2b36SAndroid Build Coastguard Worker m := ctx.ModuleForTests("myapex", "android_common_myapex") 8751*333d2b36SAndroid Build Coastguard Worker 8752*333d2b36SAndroid Build Coastguard Worker // Check extract_apks tool parameters. 8753*333d2b36SAndroid Build Coastguard Worker extractedApex := m.Output("extracted/myapex.apks") 8754*333d2b36SAndroid Build Coastguard Worker actual := extractedApex.Args["abis"] 8755*333d2b36SAndroid Build Coastguard Worker expected := "ARMEABI_V7A,ARM64_V8A" 8756*333d2b36SAndroid Build Coastguard Worker if actual != expected { 8757*333d2b36SAndroid Build Coastguard Worker t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual) 8758*333d2b36SAndroid Build Coastguard Worker } 8759*333d2b36SAndroid Build Coastguard Worker actual = extractedApex.Args["sdk-version"] 8760*333d2b36SAndroid Build Coastguard Worker expected = "30" 8761*333d2b36SAndroid Build Coastguard Worker if actual != expected { 8762*333d2b36SAndroid Build Coastguard Worker t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual) 8763*333d2b36SAndroid Build Coastguard Worker } 8764*333d2b36SAndroid Build Coastguard Worker 8765*333d2b36SAndroid Build Coastguard Worker m = ctx.ModuleForTests("myapex", "android_common_myapex") 8766*333d2b36SAndroid Build Coastguard Worker a := m.Module().(*ApexSet) 8767*333d2b36SAndroid Build Coastguard Worker expectedOverrides := []string{"foo"} 8768*333d2b36SAndroid Build Coastguard Worker actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"] 8769*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(actualOverrides, expectedOverrides) { 8770*333d2b36SAndroid Build Coastguard Worker t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides) 8771*333d2b36SAndroid Build Coastguard Worker } 8772*333d2b36SAndroid Build Coastguard Worker} 8773*333d2b36SAndroid Build Coastguard Worker 8774*333d2b36SAndroid Build Coastguard Workerfunc TestApexSet_NativeBridge(t *testing.T) { 8775*333d2b36SAndroid Build Coastguard Worker t.Parallel() 8776*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 8777*333d2b36SAndroid Build Coastguard Worker apex_set { 8778*333d2b36SAndroid Build Coastguard Worker name: "myapex", 8779*333d2b36SAndroid Build Coastguard Worker set: "myapex.apks", 8780*333d2b36SAndroid Build Coastguard Worker filename: "foo_v2.apex", 8781*333d2b36SAndroid Build Coastguard Worker overrides: ["foo"], 8782*333d2b36SAndroid Build Coastguard Worker } 8783*333d2b36SAndroid Build Coastguard Worker `, 8784*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyConfig(func(config android.Config) { 8785*333d2b36SAndroid Build Coastguard Worker config.Targets[android.Android] = []android.Target{ 8786*333d2b36SAndroid Build Coastguard Worker {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}}, 8787*333d2b36SAndroid Build Coastguard Worker {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled}, 8788*333d2b36SAndroid Build Coastguard Worker } 8789*333d2b36SAndroid Build Coastguard Worker }), 8790*333d2b36SAndroid Build Coastguard Worker ) 8791*333d2b36SAndroid Build Coastguard Worker 8792*333d2b36SAndroid Build Coastguard Worker m := ctx.ModuleForTests("myapex", "android_common_myapex") 8793*333d2b36SAndroid Build Coastguard Worker 8794*333d2b36SAndroid Build Coastguard Worker // Check extract_apks tool parameters. No native bridge arch expected 8795*333d2b36SAndroid Build Coastguard Worker extractedApex := m.Output("extracted/myapex.apks") 8796*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"]) 8797*333d2b36SAndroid Build Coastguard Worker} 8798*333d2b36SAndroid Build Coastguard Worker 8799*333d2b36SAndroid Build Coastguard Workerfunc TestNoStaticLinkingToStubsLib(t *testing.T) { 8800*333d2b36SAndroid Build Coastguard Worker t.Parallel() 8801*333d2b36SAndroid Build Coastguard Worker testApexError(t, `.*required by "mylib" is a native library providing stub.*`, ` 8802*333d2b36SAndroid Build Coastguard Worker apex { 8803*333d2b36SAndroid Build Coastguard Worker name: "myapex", 8804*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 8805*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 8806*333d2b36SAndroid Build Coastguard Worker updatable: false, 8807*333d2b36SAndroid Build Coastguard Worker } 8808*333d2b36SAndroid Build Coastguard Worker 8809*333d2b36SAndroid Build Coastguard Worker apex_key { 8810*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 8811*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 8812*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 8813*333d2b36SAndroid Build Coastguard Worker } 8814*333d2b36SAndroid Build Coastguard Worker 8815*333d2b36SAndroid Build Coastguard Worker cc_library { 8816*333d2b36SAndroid Build Coastguard Worker name: "mylib", 8817*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 8818*333d2b36SAndroid Build Coastguard Worker static_libs: ["otherlib"], 8819*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 8820*333d2b36SAndroid Build Coastguard Worker stl: "none", 8821*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 8822*333d2b36SAndroid Build Coastguard Worker } 8823*333d2b36SAndroid Build Coastguard Worker 8824*333d2b36SAndroid Build Coastguard Worker cc_library { 8825*333d2b36SAndroid Build Coastguard Worker name: "otherlib", 8826*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 8827*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 8828*333d2b36SAndroid Build Coastguard Worker stl: "none", 8829*333d2b36SAndroid Build Coastguard Worker stubs: { 8830*333d2b36SAndroid Build Coastguard Worker versions: ["1", "2", "3"], 8831*333d2b36SAndroid Build Coastguard Worker }, 8832*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 8833*333d2b36SAndroid Build Coastguard Worker } 8834*333d2b36SAndroid Build Coastguard Worker `) 8835*333d2b36SAndroid Build Coastguard Worker} 8836*333d2b36SAndroid Build Coastguard Worker 8837*333d2b36SAndroid Build Coastguard Workerfunc TestApexKeysTxt(t *testing.T) { 8838*333d2b36SAndroid Build Coastguard Worker t.Parallel() 8839*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 8840*333d2b36SAndroid Build Coastguard Worker apex { 8841*333d2b36SAndroid Build Coastguard Worker name: "myapex", 8842*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 8843*333d2b36SAndroid Build Coastguard Worker updatable: false, 8844*333d2b36SAndroid Build Coastguard Worker custom_sign_tool: "sign_myapex", 8845*333d2b36SAndroid Build Coastguard Worker } 8846*333d2b36SAndroid Build Coastguard Worker 8847*333d2b36SAndroid Build Coastguard Worker apex_key { 8848*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 8849*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 8850*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 8851*333d2b36SAndroid Build Coastguard Worker } 8852*333d2b36SAndroid Build Coastguard Worker `) 8853*333d2b36SAndroid Build Coastguard Worker 8854*333d2b36SAndroid Build Coastguard Worker myapex := ctx.ModuleForTests("myapex", "android_common_myapex") 8855*333d2b36SAndroid Build Coastguard Worker content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt")) 8856*333d2b36SAndroid Build Coastguard Worker ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system" sign_tool="sign_myapex"`) 8857*333d2b36SAndroid Build Coastguard Worker} 8858*333d2b36SAndroid Build Coastguard Worker 8859*333d2b36SAndroid Build Coastguard Workerfunc TestApexKeysTxtOverrides(t *testing.T) { 8860*333d2b36SAndroid Build Coastguard Worker t.Parallel() 8861*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 8862*333d2b36SAndroid Build Coastguard Worker apex { 8863*333d2b36SAndroid Build Coastguard Worker name: "myapex", 8864*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 8865*333d2b36SAndroid Build Coastguard Worker updatable: false, 8866*333d2b36SAndroid Build Coastguard Worker custom_sign_tool: "sign_myapex", 8867*333d2b36SAndroid Build Coastguard Worker } 8868*333d2b36SAndroid Build Coastguard Worker 8869*333d2b36SAndroid Build Coastguard Worker apex_key { 8870*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 8871*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 8872*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 8873*333d2b36SAndroid Build Coastguard Worker } 8874*333d2b36SAndroid Build Coastguard Worker 8875*333d2b36SAndroid Build Coastguard Worker prebuilt_apex { 8876*333d2b36SAndroid Build Coastguard Worker name: "myapex", 8877*333d2b36SAndroid Build Coastguard Worker prefer: true, 8878*333d2b36SAndroid Build Coastguard Worker arch: { 8879*333d2b36SAndroid Build Coastguard Worker arm64: { 8880*333d2b36SAndroid Build Coastguard Worker src: "myapex-arm64.apex", 8881*333d2b36SAndroid Build Coastguard Worker }, 8882*333d2b36SAndroid Build Coastguard Worker arm: { 8883*333d2b36SAndroid Build Coastguard Worker src: "myapex-arm.apex", 8884*333d2b36SAndroid Build Coastguard Worker }, 8885*333d2b36SAndroid Build Coastguard Worker }, 8886*333d2b36SAndroid Build Coastguard Worker } 8887*333d2b36SAndroid Build Coastguard Worker 8888*333d2b36SAndroid Build Coastguard Worker apex_set { 8889*333d2b36SAndroid Build Coastguard Worker name: "myapex_set", 8890*333d2b36SAndroid Build Coastguard Worker set: "myapex.apks", 8891*333d2b36SAndroid Build Coastguard Worker filename: "myapex_set.apex", 8892*333d2b36SAndroid Build Coastguard Worker overrides: ["myapex"], 8893*333d2b36SAndroid Build Coastguard Worker } 8894*333d2b36SAndroid Build Coastguard Worker `) 8895*333d2b36SAndroid Build Coastguard Worker 8896*333d2b36SAndroid Build Coastguard Worker content := android.ContentFromFileRuleForTests(t, ctx, 8897*333d2b36SAndroid Build Coastguard Worker ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt")) 8898*333d2b36SAndroid Build Coastguard Worker ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system" sign_tool="sign_myapex"`) 8899*333d2b36SAndroid Build Coastguard Worker content = android.ContentFromFileRuleForTests(t, ctx, 8900*333d2b36SAndroid Build Coastguard Worker ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt")) 8901*333d2b36SAndroid Build Coastguard Worker ensureContains(t, content, `name="myapex_set.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`) 8902*333d2b36SAndroid Build Coastguard Worker} 8903*333d2b36SAndroid Build Coastguard Worker 8904*333d2b36SAndroid Build Coastguard Workerfunc TestAllowedFiles(t *testing.T) { 8905*333d2b36SAndroid Build Coastguard Worker t.Parallel() 8906*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 8907*333d2b36SAndroid Build Coastguard Worker apex { 8908*333d2b36SAndroid Build Coastguard Worker name: "myapex", 8909*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 8910*333d2b36SAndroid Build Coastguard Worker apps: ["app"], 8911*333d2b36SAndroid Build Coastguard Worker allowed_files: "allowed.txt", 8912*333d2b36SAndroid Build Coastguard Worker updatable: false, 8913*333d2b36SAndroid Build Coastguard Worker } 8914*333d2b36SAndroid Build Coastguard Worker 8915*333d2b36SAndroid Build Coastguard Worker apex_key { 8916*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 8917*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 8918*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 8919*333d2b36SAndroid Build Coastguard Worker } 8920*333d2b36SAndroid Build Coastguard Worker 8921*333d2b36SAndroid Build Coastguard Worker android_app { 8922*333d2b36SAndroid Build Coastguard Worker name: "app", 8923*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 8924*333d2b36SAndroid Build Coastguard Worker package_name: "foo", 8925*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 8926*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 8927*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 8928*333d2b36SAndroid Build Coastguard Worker } 8929*333d2b36SAndroid Build Coastguard Worker `, withFiles(map[string][]byte{ 8930*333d2b36SAndroid Build Coastguard Worker "sub/Android.bp": []byte(` 8931*333d2b36SAndroid Build Coastguard Worker override_apex { 8932*333d2b36SAndroid Build Coastguard Worker name: "override_myapex", 8933*333d2b36SAndroid Build Coastguard Worker base: "myapex", 8934*333d2b36SAndroid Build Coastguard Worker apps: ["override_app"], 8935*333d2b36SAndroid Build Coastguard Worker allowed_files: ":allowed", 8936*333d2b36SAndroid Build Coastguard Worker } 8937*333d2b36SAndroid Build Coastguard Worker // Overridable "path" property should be referenced indirectly 8938*333d2b36SAndroid Build Coastguard Worker filegroup { 8939*333d2b36SAndroid Build Coastguard Worker name: "allowed", 8940*333d2b36SAndroid Build Coastguard Worker srcs: ["allowed.txt"], 8941*333d2b36SAndroid Build Coastguard Worker } 8942*333d2b36SAndroid Build Coastguard Worker override_android_app { 8943*333d2b36SAndroid Build Coastguard Worker name: "override_app", 8944*333d2b36SAndroid Build Coastguard Worker base: "app", 8945*333d2b36SAndroid Build Coastguard Worker package_name: "bar", 8946*333d2b36SAndroid Build Coastguard Worker } 8947*333d2b36SAndroid Build Coastguard Worker `), 8948*333d2b36SAndroid Build Coastguard Worker })) 8949*333d2b36SAndroid Build Coastguard Worker 8950*333d2b36SAndroid Build Coastguard Worker rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule") 8951*333d2b36SAndroid Build Coastguard Worker if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual { 8952*333d2b36SAndroid Build Coastguard Worker t.Errorf("allowed_files_file: expected %q but got %q", expected, actual) 8953*333d2b36SAndroid Build Coastguard Worker } 8954*333d2b36SAndroid Build Coastguard Worker 8955*333d2b36SAndroid Build Coastguard Worker rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule") 8956*333d2b36SAndroid Build Coastguard Worker if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual { 8957*333d2b36SAndroid Build Coastguard Worker t.Errorf("allowed_files_file: expected %q but got %q", expected, actual) 8958*333d2b36SAndroid Build Coastguard Worker } 8959*333d2b36SAndroid Build Coastguard Worker} 8960*333d2b36SAndroid Build Coastguard Worker 8961*333d2b36SAndroid Build Coastguard Workerfunc TestNonPreferredPrebuiltDependency(t *testing.T) { 8962*333d2b36SAndroid Build Coastguard Worker t.Parallel() 8963*333d2b36SAndroid Build Coastguard Worker testApex(t, ` 8964*333d2b36SAndroid Build Coastguard Worker apex { 8965*333d2b36SAndroid Build Coastguard Worker name: "myapex", 8966*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 8967*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 8968*333d2b36SAndroid Build Coastguard Worker updatable: false, 8969*333d2b36SAndroid Build Coastguard Worker } 8970*333d2b36SAndroid Build Coastguard Worker 8971*333d2b36SAndroid Build Coastguard Worker apex_key { 8972*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 8973*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 8974*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 8975*333d2b36SAndroid Build Coastguard Worker } 8976*333d2b36SAndroid Build Coastguard Worker 8977*333d2b36SAndroid Build Coastguard Worker cc_library { 8978*333d2b36SAndroid Build Coastguard Worker name: "mylib", 8979*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 8980*333d2b36SAndroid Build Coastguard Worker stubs: { 8981*333d2b36SAndroid Build Coastguard Worker versions: ["current"], 8982*333d2b36SAndroid Build Coastguard Worker }, 8983*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 8984*333d2b36SAndroid Build Coastguard Worker } 8985*333d2b36SAndroid Build Coastguard Worker 8986*333d2b36SAndroid Build Coastguard Worker cc_prebuilt_library_shared { 8987*333d2b36SAndroid Build Coastguard Worker name: "mylib", 8988*333d2b36SAndroid Build Coastguard Worker prefer: false, 8989*333d2b36SAndroid Build Coastguard Worker srcs: ["prebuilt.so"], 8990*333d2b36SAndroid Build Coastguard Worker stubs: { 8991*333d2b36SAndroid Build Coastguard Worker versions: ["current"], 8992*333d2b36SAndroid Build Coastguard Worker }, 8993*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 8994*333d2b36SAndroid Build Coastguard Worker } 8995*333d2b36SAndroid Build Coastguard Worker `) 8996*333d2b36SAndroid Build Coastguard Worker} 8997*333d2b36SAndroid Build Coastguard Worker 8998*333d2b36SAndroid Build Coastguard Workerfunc TestCompressedApex(t *testing.T) { 8999*333d2b36SAndroid Build Coastguard Worker t.Parallel() 9000*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 9001*333d2b36SAndroid Build Coastguard Worker apex { 9002*333d2b36SAndroid Build Coastguard Worker name: "myapex", 9003*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 9004*333d2b36SAndroid Build Coastguard Worker compressible: true, 9005*333d2b36SAndroid Build Coastguard Worker updatable: false, 9006*333d2b36SAndroid Build Coastguard Worker } 9007*333d2b36SAndroid Build Coastguard Worker apex_key { 9008*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 9009*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 9010*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 9011*333d2b36SAndroid Build Coastguard Worker } 9012*333d2b36SAndroid Build Coastguard Worker `, 9013*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 9014*333d2b36SAndroid Build Coastguard Worker variables.CompressedApex = proptools.BoolPtr(true) 9015*333d2b36SAndroid Build Coastguard Worker }), 9016*333d2b36SAndroid Build Coastguard Worker ) 9017*333d2b36SAndroid Build Coastguard Worker 9018*333d2b36SAndroid Build Coastguard Worker compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule") 9019*333d2b36SAndroid Build Coastguard Worker ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned") 9020*333d2b36SAndroid Build Coastguard Worker 9021*333d2b36SAndroid Build Coastguard Worker signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex") 9022*333d2b36SAndroid Build Coastguard Worker ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String()) 9023*333d2b36SAndroid Build Coastguard Worker 9024*333d2b36SAndroid Build Coastguard Worker // Make sure output of bundle is .capex 9025*333d2b36SAndroid Build Coastguard Worker ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) 9026*333d2b36SAndroid Build Coastguard Worker ensureContains(t, ab.outputFile.String(), "myapex.capex") 9027*333d2b36SAndroid Build Coastguard Worker 9028*333d2b36SAndroid Build Coastguard Worker // Verify android.mk rules 9029*333d2b36SAndroid Build Coastguard Worker data := android.AndroidMkDataForTest(t, ctx, ab) 9030*333d2b36SAndroid Build Coastguard Worker var builder strings.Builder 9031*333d2b36SAndroid Build Coastguard Worker data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data) 9032*333d2b36SAndroid Build Coastguard Worker androidMk := builder.String() 9033*333d2b36SAndroid Build Coastguard Worker ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n") 9034*333d2b36SAndroid Build Coastguard Worker} 9035*333d2b36SAndroid Build Coastguard Worker 9036*333d2b36SAndroid Build Coastguard Workerfunc TestCompressedApexIsDisabledWhenUsingErofs(t *testing.T) { 9037*333d2b36SAndroid Build Coastguard Worker t.Parallel() 9038*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 9039*333d2b36SAndroid Build Coastguard Worker apex { 9040*333d2b36SAndroid Build Coastguard Worker name: "myapex", 9041*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 9042*333d2b36SAndroid Build Coastguard Worker compressible: true, 9043*333d2b36SAndroid Build Coastguard Worker updatable: false, 9044*333d2b36SAndroid Build Coastguard Worker payload_fs_type: "erofs", 9045*333d2b36SAndroid Build Coastguard Worker } 9046*333d2b36SAndroid Build Coastguard Worker apex_key { 9047*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 9048*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 9049*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 9050*333d2b36SAndroid Build Coastguard Worker } 9051*333d2b36SAndroid Build Coastguard Worker `, 9052*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 9053*333d2b36SAndroid Build Coastguard Worker variables.CompressedApex = proptools.BoolPtr(true) 9054*333d2b36SAndroid Build Coastguard Worker }), 9055*333d2b36SAndroid Build Coastguard Worker ) 9056*333d2b36SAndroid Build Coastguard Worker 9057*333d2b36SAndroid Build Coastguard Worker compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").MaybeRule("compressRule") 9058*333d2b36SAndroid Build Coastguard Worker if compressRule.Rule != nil { 9059*333d2b36SAndroid Build Coastguard Worker t.Error("erofs apex should not be compressed") 9060*333d2b36SAndroid Build Coastguard Worker } 9061*333d2b36SAndroid Build Coastguard Worker} 9062*333d2b36SAndroid Build Coastguard Worker 9063*333d2b36SAndroid Build Coastguard Workerfunc TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) { 9064*333d2b36SAndroid Build Coastguard Worker t.Parallel() 9065*333d2b36SAndroid Build Coastguard Worker for _, compressionEnabled := range []bool{true, false} { 9066*333d2b36SAndroid Build Coastguard Worker t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) { 9067*333d2b36SAndroid Build Coastguard Worker t.Parallel() 9068*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 9069*333d2b36SAndroid Build Coastguard Worker apex_set { 9070*333d2b36SAndroid Build Coastguard Worker name: "com.company.android.myapex", 9071*333d2b36SAndroid Build Coastguard Worker apex_name: "com.android.myapex", 9072*333d2b36SAndroid Build Coastguard Worker set: "company-myapex.apks", 9073*333d2b36SAndroid Build Coastguard Worker } 9074*333d2b36SAndroid Build Coastguard Worker `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 9075*333d2b36SAndroid Build Coastguard Worker variables.CompressedApex = proptools.BoolPtr(compressionEnabled) 9076*333d2b36SAndroid Build Coastguard Worker }), 9077*333d2b36SAndroid Build Coastguard Worker ) 9078*333d2b36SAndroid Build Coastguard Worker 9079*333d2b36SAndroid Build Coastguard Worker build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex") 9080*333d2b36SAndroid Build Coastguard Worker if compressionEnabled { 9081*333d2b36SAndroid Build Coastguard Worker ensureEquals(t, build.Rule.String(), "android/soong/android.Cp") 9082*333d2b36SAndroid Build Coastguard Worker } else { 9083*333d2b36SAndroid Build Coastguard Worker ensureEquals(t, build.Rule.String(), "android/apex.decompressApex") 9084*333d2b36SAndroid Build Coastguard Worker } 9085*333d2b36SAndroid Build Coastguard Worker }) 9086*333d2b36SAndroid Build Coastguard Worker } 9087*333d2b36SAndroid Build Coastguard Worker} 9088*333d2b36SAndroid Build Coastguard Worker 9089*333d2b36SAndroid Build Coastguard Workerfunc TestPreferredPrebuiltSharedLibDep(t *testing.T) { 9090*333d2b36SAndroid Build Coastguard Worker t.Parallel() 9091*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 9092*333d2b36SAndroid Build Coastguard Worker apex { 9093*333d2b36SAndroid Build Coastguard Worker name: "myapex", 9094*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 9095*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 9096*333d2b36SAndroid Build Coastguard Worker updatable: false, 9097*333d2b36SAndroid Build Coastguard Worker } 9098*333d2b36SAndroid Build Coastguard Worker 9099*333d2b36SAndroid Build Coastguard Worker apex_key { 9100*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 9101*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 9102*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 9103*333d2b36SAndroid Build Coastguard Worker } 9104*333d2b36SAndroid Build Coastguard Worker 9105*333d2b36SAndroid Build Coastguard Worker cc_library { 9106*333d2b36SAndroid Build Coastguard Worker name: "mylib", 9107*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 9108*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 9109*333d2b36SAndroid Build Coastguard Worker shared_libs: ["otherlib"], 9110*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 9111*333d2b36SAndroid Build Coastguard Worker } 9112*333d2b36SAndroid Build Coastguard Worker 9113*333d2b36SAndroid Build Coastguard Worker cc_library { 9114*333d2b36SAndroid Build Coastguard Worker name: "otherlib", 9115*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 9116*333d2b36SAndroid Build Coastguard Worker stubs: { 9117*333d2b36SAndroid Build Coastguard Worker versions: ["current"], 9118*333d2b36SAndroid Build Coastguard Worker }, 9119*333d2b36SAndroid Build Coastguard Worker } 9120*333d2b36SAndroid Build Coastguard Worker 9121*333d2b36SAndroid Build Coastguard Worker cc_prebuilt_library_shared { 9122*333d2b36SAndroid Build Coastguard Worker name: "otherlib", 9123*333d2b36SAndroid Build Coastguard Worker prefer: true, 9124*333d2b36SAndroid Build Coastguard Worker srcs: ["prebuilt.so"], 9125*333d2b36SAndroid Build Coastguard Worker stubs: { 9126*333d2b36SAndroid Build Coastguard Worker versions: ["current"], 9127*333d2b36SAndroid Build Coastguard Worker }, 9128*333d2b36SAndroid Build Coastguard Worker } 9129*333d2b36SAndroid Build Coastguard Worker `) 9130*333d2b36SAndroid Build Coastguard Worker 9131*333d2b36SAndroid Build Coastguard Worker ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) 9132*333d2b36SAndroid Build Coastguard Worker data := android.AndroidMkDataForTest(t, ctx, ab) 9133*333d2b36SAndroid Build Coastguard Worker var builder strings.Builder 9134*333d2b36SAndroid Build Coastguard Worker data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data) 9135*333d2b36SAndroid Build Coastguard Worker androidMk := builder.String() 9136*333d2b36SAndroid Build Coastguard Worker 9137*333d2b36SAndroid Build Coastguard Worker // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't 9138*333d2b36SAndroid Build Coastguard Worker // a thing there. 9139*333d2b36SAndroid Build Coastguard Worker ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n") 9140*333d2b36SAndroid Build Coastguard Worker} 9141*333d2b36SAndroid Build Coastguard Worker 9142*333d2b36SAndroid Build Coastguard Workerfunc TestExcludeDependency(t *testing.T) { 9143*333d2b36SAndroid Build Coastguard Worker t.Parallel() 9144*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 9145*333d2b36SAndroid Build Coastguard Worker apex { 9146*333d2b36SAndroid Build Coastguard Worker name: "myapex", 9147*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 9148*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 9149*333d2b36SAndroid Build Coastguard Worker updatable: false, 9150*333d2b36SAndroid Build Coastguard Worker } 9151*333d2b36SAndroid Build Coastguard Worker 9152*333d2b36SAndroid Build Coastguard Worker apex_key { 9153*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 9154*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 9155*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 9156*333d2b36SAndroid Build Coastguard Worker } 9157*333d2b36SAndroid Build Coastguard Worker 9158*333d2b36SAndroid Build Coastguard Worker cc_library { 9159*333d2b36SAndroid Build Coastguard Worker name: "mylib", 9160*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 9161*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 9162*333d2b36SAndroid Build Coastguard Worker stl: "none", 9163*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 9164*333d2b36SAndroid Build Coastguard Worker shared_libs: ["mylib2"], 9165*333d2b36SAndroid Build Coastguard Worker target: { 9166*333d2b36SAndroid Build Coastguard Worker apex: { 9167*333d2b36SAndroid Build Coastguard Worker exclude_shared_libs: ["mylib2"], 9168*333d2b36SAndroid Build Coastguard Worker }, 9169*333d2b36SAndroid Build Coastguard Worker }, 9170*333d2b36SAndroid Build Coastguard Worker } 9171*333d2b36SAndroid Build Coastguard Worker 9172*333d2b36SAndroid Build Coastguard Worker cc_library { 9173*333d2b36SAndroid Build Coastguard Worker name: "mylib2", 9174*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 9175*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 9176*333d2b36SAndroid Build Coastguard Worker stl: "none", 9177*333d2b36SAndroid Build Coastguard Worker } 9178*333d2b36SAndroid Build Coastguard Worker `) 9179*333d2b36SAndroid Build Coastguard Worker 9180*333d2b36SAndroid Build Coastguard Worker // Check if mylib is linked to mylib2 for the non-apex target 9181*333d2b36SAndroid Build Coastguard Worker ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"] 9182*333d2b36SAndroid Build Coastguard Worker ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so") 9183*333d2b36SAndroid Build Coastguard Worker 9184*333d2b36SAndroid Build Coastguard Worker // Make sure that the link doesn't occur for the apex target 9185*333d2b36SAndroid Build Coastguard Worker ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"] 9186*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so") 9187*333d2b36SAndroid Build Coastguard Worker 9188*333d2b36SAndroid Build Coastguard Worker // It shouldn't appear in the copy cmd as well. 9189*333d2b36SAndroid Build Coastguard Worker copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"] 9190*333d2b36SAndroid Build Coastguard Worker ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so") 9191*333d2b36SAndroid Build Coastguard Worker} 9192*333d2b36SAndroid Build Coastguard Worker 9193*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltStubLibDep(t *testing.T) { 9194*333d2b36SAndroid Build Coastguard Worker t.Parallel() 9195*333d2b36SAndroid Build Coastguard Worker bpBase := ` 9196*333d2b36SAndroid Build Coastguard Worker apex { 9197*333d2b36SAndroid Build Coastguard Worker name: "myapex", 9198*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 9199*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 9200*333d2b36SAndroid Build Coastguard Worker updatable: false, 9201*333d2b36SAndroid Build Coastguard Worker } 9202*333d2b36SAndroid Build Coastguard Worker apex_key { 9203*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 9204*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 9205*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 9206*333d2b36SAndroid Build Coastguard Worker } 9207*333d2b36SAndroid Build Coastguard Worker cc_library { 9208*333d2b36SAndroid Build Coastguard Worker name: "mylib", 9209*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 9210*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 9211*333d2b36SAndroid Build Coastguard Worker shared_libs: ["stublib"], 9212*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 9213*333d2b36SAndroid Build Coastguard Worker } 9214*333d2b36SAndroid Build Coastguard Worker apex { 9215*333d2b36SAndroid Build Coastguard Worker name: "otherapex", 9216*333d2b36SAndroid Build Coastguard Worker enabled: %s, 9217*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 9218*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["stublib"], 9219*333d2b36SAndroid Build Coastguard Worker updatable: false, 9220*333d2b36SAndroid Build Coastguard Worker } 9221*333d2b36SAndroid Build Coastguard Worker ` 9222*333d2b36SAndroid Build Coastguard Worker 9223*333d2b36SAndroid Build Coastguard Worker stublibSourceBp := ` 9224*333d2b36SAndroid Build Coastguard Worker cc_library { 9225*333d2b36SAndroid Build Coastguard Worker name: "stublib", 9226*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 9227*333d2b36SAndroid Build Coastguard Worker apex_available: ["otherapex"], 9228*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 9229*333d2b36SAndroid Build Coastguard Worker stl: "none", 9230*333d2b36SAndroid Build Coastguard Worker stubs: { 9231*333d2b36SAndroid Build Coastguard Worker versions: ["1"], 9232*333d2b36SAndroid Build Coastguard Worker }, 9233*333d2b36SAndroid Build Coastguard Worker } 9234*333d2b36SAndroid Build Coastguard Worker ` 9235*333d2b36SAndroid Build Coastguard Worker 9236*333d2b36SAndroid Build Coastguard Worker stublibPrebuiltBp := ` 9237*333d2b36SAndroid Build Coastguard Worker cc_prebuilt_library_shared { 9238*333d2b36SAndroid Build Coastguard Worker name: "stublib", 9239*333d2b36SAndroid Build Coastguard Worker srcs: ["prebuilt.so"], 9240*333d2b36SAndroid Build Coastguard Worker apex_available: ["otherapex"], 9241*333d2b36SAndroid Build Coastguard Worker stubs: { 9242*333d2b36SAndroid Build Coastguard Worker versions: ["1"], 9243*333d2b36SAndroid Build Coastguard Worker }, 9244*333d2b36SAndroid Build Coastguard Worker %s 9245*333d2b36SAndroid Build Coastguard Worker } 9246*333d2b36SAndroid Build Coastguard Worker ` 9247*333d2b36SAndroid Build Coastguard Worker 9248*333d2b36SAndroid Build Coastguard Worker tests := []struct { 9249*333d2b36SAndroid Build Coastguard Worker name string 9250*333d2b36SAndroid Build Coastguard Worker stublibBp string 9251*333d2b36SAndroid Build Coastguard Worker usePrebuilt bool 9252*333d2b36SAndroid Build Coastguard Worker modNames []string // Modules to collect AndroidMkEntries for 9253*333d2b36SAndroid Build Coastguard Worker otherApexEnabled []string 9254*333d2b36SAndroid Build Coastguard Worker }{ 9255*333d2b36SAndroid Build Coastguard Worker { 9256*333d2b36SAndroid Build Coastguard Worker name: "only_source", 9257*333d2b36SAndroid Build Coastguard Worker stublibBp: stublibSourceBp, 9258*333d2b36SAndroid Build Coastguard Worker usePrebuilt: false, 9259*333d2b36SAndroid Build Coastguard Worker modNames: []string{"stublib"}, 9260*333d2b36SAndroid Build Coastguard Worker otherApexEnabled: []string{"true", "false"}, 9261*333d2b36SAndroid Build Coastguard Worker }, 9262*333d2b36SAndroid Build Coastguard Worker { 9263*333d2b36SAndroid Build Coastguard Worker name: "source_preferred", 9264*333d2b36SAndroid Build Coastguard Worker stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""), 9265*333d2b36SAndroid Build Coastguard Worker usePrebuilt: false, 9266*333d2b36SAndroid Build Coastguard Worker modNames: []string{"stublib", "prebuilt_stublib"}, 9267*333d2b36SAndroid Build Coastguard Worker otherApexEnabled: []string{"true", "false"}, 9268*333d2b36SAndroid Build Coastguard Worker }, 9269*333d2b36SAndroid Build Coastguard Worker { 9270*333d2b36SAndroid Build Coastguard Worker name: "prebuilt_preferred", 9271*333d2b36SAndroid Build Coastguard Worker stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"), 9272*333d2b36SAndroid Build Coastguard Worker usePrebuilt: true, 9273*333d2b36SAndroid Build Coastguard Worker modNames: []string{"stublib", "prebuilt_stublib"}, 9274*333d2b36SAndroid Build Coastguard Worker otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt. 9275*333d2b36SAndroid Build Coastguard Worker }, 9276*333d2b36SAndroid Build Coastguard Worker { 9277*333d2b36SAndroid Build Coastguard Worker name: "only_prebuilt", 9278*333d2b36SAndroid Build Coastguard Worker stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""), 9279*333d2b36SAndroid Build Coastguard Worker usePrebuilt: true, 9280*333d2b36SAndroid Build Coastguard Worker modNames: []string{"stublib"}, 9281*333d2b36SAndroid Build Coastguard Worker otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt. 9282*333d2b36SAndroid Build Coastguard Worker }, 9283*333d2b36SAndroid Build Coastguard Worker } 9284*333d2b36SAndroid Build Coastguard Worker 9285*333d2b36SAndroid Build Coastguard Worker for _, test := range tests { 9286*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 9287*333d2b36SAndroid Build Coastguard Worker t.Parallel() 9288*333d2b36SAndroid Build Coastguard Worker for _, otherApexEnabled := range test.otherApexEnabled { 9289*333d2b36SAndroid Build Coastguard Worker t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) { 9290*333d2b36SAndroid Build Coastguard Worker t.Parallel() 9291*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp) 9292*333d2b36SAndroid Build Coastguard Worker 9293*333d2b36SAndroid Build Coastguard Worker type modAndMkEntries struct { 9294*333d2b36SAndroid Build Coastguard Worker mod *cc.Module 9295*333d2b36SAndroid Build Coastguard Worker mkEntries android.AndroidMkInfo 9296*333d2b36SAndroid Build Coastguard Worker } 9297*333d2b36SAndroid Build Coastguard Worker entries := []*modAndMkEntries{} 9298*333d2b36SAndroid Build Coastguard Worker 9299*333d2b36SAndroid Build Coastguard Worker // Gather shared lib modules that are installable 9300*333d2b36SAndroid Build Coastguard Worker for _, modName := range test.modNames { 9301*333d2b36SAndroid Build Coastguard Worker for _, variant := range ctx.ModuleVariantsForTests(modName) { 9302*333d2b36SAndroid Build Coastguard Worker if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") { 9303*333d2b36SAndroid Build Coastguard Worker continue 9304*333d2b36SAndroid Build Coastguard Worker } 9305*333d2b36SAndroid Build Coastguard Worker mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module) 9306*333d2b36SAndroid Build Coastguard Worker if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() { 9307*333d2b36SAndroid Build Coastguard Worker continue 9308*333d2b36SAndroid Build Coastguard Worker } 9309*333d2b36SAndroid Build Coastguard Worker info := android.AndroidMkInfoForTest(t, ctx, mod) 9310*333d2b36SAndroid Build Coastguard Worker ents := []android.AndroidMkInfo{info.PrimaryInfo} 9311*333d2b36SAndroid Build Coastguard Worker ents = append(ents, info.ExtraInfo...) 9312*333d2b36SAndroid Build Coastguard Worker for _, ent := range ents { 9313*333d2b36SAndroid Build Coastguard Worker if ent.Disabled { 9314*333d2b36SAndroid Build Coastguard Worker continue 9315*333d2b36SAndroid Build Coastguard Worker } 9316*333d2b36SAndroid Build Coastguard Worker entries = append(entries, &modAndMkEntries{ 9317*333d2b36SAndroid Build Coastguard Worker mod: mod, 9318*333d2b36SAndroid Build Coastguard Worker mkEntries: ent, 9319*333d2b36SAndroid Build Coastguard Worker }) 9320*333d2b36SAndroid Build Coastguard Worker } 9321*333d2b36SAndroid Build Coastguard Worker } 9322*333d2b36SAndroid Build Coastguard Worker } 9323*333d2b36SAndroid Build Coastguard Worker 9324*333d2b36SAndroid Build Coastguard Worker var entry *modAndMkEntries = nil 9325*333d2b36SAndroid Build Coastguard Worker for _, ent := range entries { 9326*333d2b36SAndroid Build Coastguard Worker if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" { 9327*333d2b36SAndroid Build Coastguard Worker if entry != nil { 9328*333d2b36SAndroid Build Coastguard Worker t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod) 9329*333d2b36SAndroid Build Coastguard Worker } else { 9330*333d2b36SAndroid Build Coastguard Worker entry = ent 9331*333d2b36SAndroid Build Coastguard Worker } 9332*333d2b36SAndroid Build Coastguard Worker } 9333*333d2b36SAndroid Build Coastguard Worker } 9334*333d2b36SAndroid Build Coastguard Worker 9335*333d2b36SAndroid Build Coastguard Worker if entry == nil { 9336*333d2b36SAndroid Build Coastguard Worker t.Errorf("AndroidMk entry for \"stublib\" missing") 9337*333d2b36SAndroid Build Coastguard Worker } else { 9338*333d2b36SAndroid Build Coastguard Worker isPrebuilt := entry.mod.Prebuilt() != nil 9339*333d2b36SAndroid Build Coastguard Worker if isPrebuilt != test.usePrebuilt { 9340*333d2b36SAndroid Build Coastguard Worker t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt) 9341*333d2b36SAndroid Build Coastguard Worker } 9342*333d2b36SAndroid Build Coastguard Worker if !entry.mod.IsStubs() { 9343*333d2b36SAndroid Build Coastguard Worker t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod) 9344*333d2b36SAndroid Build Coastguard Worker } 9345*333d2b36SAndroid Build Coastguard Worker if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil { 9346*333d2b36SAndroid Build Coastguard Worker t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries) 9347*333d2b36SAndroid Build Coastguard Worker } 9348*333d2b36SAndroid Build Coastguard Worker cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"] 9349*333d2b36SAndroid Build Coastguard Worker expected := "-D__STUBLIB_API__=10000" 9350*333d2b36SAndroid Build Coastguard Worker if !android.InList(expected, cflags) { 9351*333d2b36SAndroid Build Coastguard Worker t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags) 9352*333d2b36SAndroid Build Coastguard Worker } 9353*333d2b36SAndroid Build Coastguard Worker } 9354*333d2b36SAndroid Build Coastguard Worker }) 9355*333d2b36SAndroid Build Coastguard Worker } 9356*333d2b36SAndroid Build Coastguard Worker }) 9357*333d2b36SAndroid Build Coastguard Worker } 9358*333d2b36SAndroid Build Coastguard Worker} 9359*333d2b36SAndroid Build Coastguard Worker 9360*333d2b36SAndroid Build Coastguard Workerfunc TestApexJavaCoverage(t *testing.T) { 9361*333d2b36SAndroid Build Coastguard Worker t.Parallel() 9362*333d2b36SAndroid Build Coastguard Worker bp := ` 9363*333d2b36SAndroid Build Coastguard Worker apex { 9364*333d2b36SAndroid Build Coastguard Worker name: "myapex", 9365*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 9366*333d2b36SAndroid Build Coastguard Worker java_libs: ["mylib"], 9367*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragments: ["mybootclasspathfragment"], 9368*333d2b36SAndroid Build Coastguard Worker systemserverclasspath_fragments: ["mysystemserverclasspathfragment"], 9369*333d2b36SAndroid Build Coastguard Worker updatable: false, 9370*333d2b36SAndroid Build Coastguard Worker } 9371*333d2b36SAndroid Build Coastguard Worker 9372*333d2b36SAndroid Build Coastguard Worker apex_key { 9373*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 9374*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 9375*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 9376*333d2b36SAndroid Build Coastguard Worker } 9377*333d2b36SAndroid Build Coastguard Worker 9378*333d2b36SAndroid Build Coastguard Worker java_library { 9379*333d2b36SAndroid Build Coastguard Worker name: "mylib", 9380*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.java"], 9381*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 9382*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 9383*333d2b36SAndroid Build Coastguard Worker } 9384*333d2b36SAndroid Build Coastguard Worker 9385*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragment { 9386*333d2b36SAndroid Build Coastguard Worker name: "mybootclasspathfragment", 9387*333d2b36SAndroid Build Coastguard Worker contents: ["mybootclasspathlib"], 9388*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 9389*333d2b36SAndroid Build Coastguard Worker hidden_api: { 9390*333d2b36SAndroid Build Coastguard Worker split_packages: ["*"], 9391*333d2b36SAndroid Build Coastguard Worker }, 9392*333d2b36SAndroid Build Coastguard Worker } 9393*333d2b36SAndroid Build Coastguard Worker 9394*333d2b36SAndroid Build Coastguard Worker java_library { 9395*333d2b36SAndroid Build Coastguard Worker name: "mybootclasspathlib", 9396*333d2b36SAndroid Build Coastguard Worker srcs: ["mybootclasspathlib.java"], 9397*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 9398*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 9399*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 9400*333d2b36SAndroid Build Coastguard Worker } 9401*333d2b36SAndroid Build Coastguard Worker 9402*333d2b36SAndroid Build Coastguard Worker systemserverclasspath_fragment { 9403*333d2b36SAndroid Build Coastguard Worker name: "mysystemserverclasspathfragment", 9404*333d2b36SAndroid Build Coastguard Worker contents: ["mysystemserverclasspathlib"], 9405*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 9406*333d2b36SAndroid Build Coastguard Worker } 9407*333d2b36SAndroid Build Coastguard Worker 9408*333d2b36SAndroid Build Coastguard Worker java_library { 9409*333d2b36SAndroid Build Coastguard Worker name: "mysystemserverclasspathlib", 9410*333d2b36SAndroid Build Coastguard Worker srcs: ["mysystemserverclasspathlib.java"], 9411*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 9412*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 9413*333d2b36SAndroid Build Coastguard Worker } 9414*333d2b36SAndroid Build Coastguard Worker ` 9415*333d2b36SAndroid Build Coastguard Worker 9416*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 9417*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithApexBuildComponents, 9418*333d2b36SAndroid Build Coastguard Worker prepareForTestWithMyapex, 9419*333d2b36SAndroid Build Coastguard Worker java.PrepareForTestWithJavaDefaultModules, 9420*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithAndroidBuildComponents, 9421*333d2b36SAndroid Build Coastguard Worker android.FixtureWithRootAndroidBp(bp), 9422*333d2b36SAndroid Build Coastguard Worker dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"), 9423*333d2b36SAndroid Build Coastguard Worker dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"), 9424*333d2b36SAndroid Build Coastguard Worker java.PrepareForTestWithJacocoInstrumentation, 9425*333d2b36SAndroid Build Coastguard Worker ).RunTest(t) 9426*333d2b36SAndroid Build Coastguard Worker 9427*333d2b36SAndroid Build Coastguard Worker // Make sure jacoco ran on both mylib and mybootclasspathlib 9428*333d2b36SAndroid Build Coastguard Worker if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil { 9429*333d2b36SAndroid Build Coastguard Worker t.Errorf("Failed to find jacoco rule for mylib") 9430*333d2b36SAndroid Build Coastguard Worker } 9431*333d2b36SAndroid Build Coastguard Worker if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil { 9432*333d2b36SAndroid Build Coastguard Worker t.Errorf("Failed to find jacoco rule for mybootclasspathlib") 9433*333d2b36SAndroid Build Coastguard Worker } 9434*333d2b36SAndroid Build Coastguard Worker if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil { 9435*333d2b36SAndroid Build Coastguard Worker t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib") 9436*333d2b36SAndroid Build Coastguard Worker } 9437*333d2b36SAndroid Build Coastguard Worker} 9438*333d2b36SAndroid Build Coastguard Worker 9439*333d2b36SAndroid Build Coastguard Workerfunc TestProhibitStaticExecutable(t *testing.T) { 9440*333d2b36SAndroid Build Coastguard Worker t.Parallel() 9441*333d2b36SAndroid Build Coastguard Worker testApexError(t, `executable mybin is static`, ` 9442*333d2b36SAndroid Build Coastguard Worker apex { 9443*333d2b36SAndroid Build Coastguard Worker name: "myapex", 9444*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 9445*333d2b36SAndroid Build Coastguard Worker binaries: ["mybin"], 9446*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 9447*333d2b36SAndroid Build Coastguard Worker } 9448*333d2b36SAndroid Build Coastguard Worker 9449*333d2b36SAndroid Build Coastguard Worker apex_key { 9450*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 9451*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 9452*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 9453*333d2b36SAndroid Build Coastguard Worker } 9454*333d2b36SAndroid Build Coastguard Worker 9455*333d2b36SAndroid Build Coastguard Worker cc_binary { 9456*333d2b36SAndroid Build Coastguard Worker name: "mybin", 9457*333d2b36SAndroid Build Coastguard Worker srcs: ["mylib.cpp"], 9458*333d2b36SAndroid Build Coastguard Worker relative_install_path: "foo/bar", 9459*333d2b36SAndroid Build Coastguard Worker static_executable: true, 9460*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 9461*333d2b36SAndroid Build Coastguard Worker stl: "none", 9462*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 9463*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 9464*333d2b36SAndroid Build Coastguard Worker } 9465*333d2b36SAndroid Build Coastguard Worker `) 9466*333d2b36SAndroid Build Coastguard Worker 9467*333d2b36SAndroid Build Coastguard Worker testApexError(t, `executable mybin.rust is static`, ` 9468*333d2b36SAndroid Build Coastguard Worker apex { 9469*333d2b36SAndroid Build Coastguard Worker name: "myapex", 9470*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 9471*333d2b36SAndroid Build Coastguard Worker binaries: ["mybin.rust"], 9472*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 9473*333d2b36SAndroid Build Coastguard Worker } 9474*333d2b36SAndroid Build Coastguard Worker 9475*333d2b36SAndroid Build Coastguard Worker apex_key { 9476*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 9477*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 9478*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 9479*333d2b36SAndroid Build Coastguard Worker } 9480*333d2b36SAndroid Build Coastguard Worker 9481*333d2b36SAndroid Build Coastguard Worker rust_binary { 9482*333d2b36SAndroid Build Coastguard Worker name: "mybin.rust", 9483*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 9484*333d2b36SAndroid Build Coastguard Worker static_executable: true, 9485*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 9486*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 9487*333d2b36SAndroid Build Coastguard Worker } 9488*333d2b36SAndroid Build Coastguard Worker `) 9489*333d2b36SAndroid Build Coastguard Worker} 9490*333d2b36SAndroid Build Coastguard Worker 9491*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) { 9492*333d2b36SAndroid Build Coastguard Worker t.Parallel() 9493*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 9494*333d2b36SAndroid Build Coastguard Worker apex { 9495*333d2b36SAndroid Build Coastguard Worker name: "myapex", 9496*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 9497*333d2b36SAndroid Build Coastguard Worker updatable: false, 9498*333d2b36SAndroid Build Coastguard Worker java_libs: ["foo"], 9499*333d2b36SAndroid Build Coastguard Worker } 9500*333d2b36SAndroid Build Coastguard Worker 9501*333d2b36SAndroid Build Coastguard Worker apex_key { 9502*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 9503*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 9504*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 9505*333d2b36SAndroid Build Coastguard Worker } 9506*333d2b36SAndroid Build Coastguard Worker 9507*333d2b36SAndroid Build Coastguard Worker java_library { 9508*333d2b36SAndroid Build Coastguard Worker name: "foo", 9509*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 9510*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 9511*333d2b36SAndroid Build Coastguard Worker installable: true, 9512*333d2b36SAndroid Build Coastguard Worker } 9513*333d2b36SAndroid Build Coastguard Worker `, 9514*333d2b36SAndroid Build Coastguard Worker dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"), 9515*333d2b36SAndroid Build Coastguard Worker ) 9516*333d2b36SAndroid Build Coastguard Worker 9517*333d2b36SAndroid Build Coastguard Worker apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) 9518*333d2b36SAndroid Build Coastguard Worker data := android.AndroidMkDataForTest(t, ctx, apexBundle) 9519*333d2b36SAndroid Build Coastguard Worker var builder strings.Builder 9520*333d2b36SAndroid Build Coastguard Worker data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data) 9521*333d2b36SAndroid Build Coastguard Worker androidMk := builder.String() 9522*333d2b36SAndroid Build Coastguard Worker ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex foo-dexpreopt-arm64-apex@myapex@[email protected]@classes.odex foo-dexpreopt-arm64-apex@myapex@[email protected]@classes.vdex\n") 9523*333d2b36SAndroid Build Coastguard Worker} 9524*333d2b36SAndroid Build Coastguard Worker 9525*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidMk_RequiredModules(t *testing.T) { 9526*333d2b36SAndroid Build Coastguard Worker t.Parallel() 9527*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 9528*333d2b36SAndroid Build Coastguard Worker apex { 9529*333d2b36SAndroid Build Coastguard Worker name: "myapex", 9530*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 9531*333d2b36SAndroid Build Coastguard Worker updatable: false, 9532*333d2b36SAndroid Build Coastguard Worker java_libs: ["foo"], 9533*333d2b36SAndroid Build Coastguard Worker required: ["otherapex"], 9534*333d2b36SAndroid Build Coastguard Worker } 9535*333d2b36SAndroid Build Coastguard Worker 9536*333d2b36SAndroid Build Coastguard Worker apex { 9537*333d2b36SAndroid Build Coastguard Worker name: "otherapex", 9538*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 9539*333d2b36SAndroid Build Coastguard Worker updatable: false, 9540*333d2b36SAndroid Build Coastguard Worker java_libs: ["foo"], 9541*333d2b36SAndroid Build Coastguard Worker } 9542*333d2b36SAndroid Build Coastguard Worker 9543*333d2b36SAndroid Build Coastguard Worker apex_key { 9544*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 9545*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 9546*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 9547*333d2b36SAndroid Build Coastguard Worker } 9548*333d2b36SAndroid Build Coastguard Worker 9549*333d2b36SAndroid Build Coastguard Worker java_library { 9550*333d2b36SAndroid Build Coastguard Worker name: "foo", 9551*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 9552*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex", "otherapex"], 9553*333d2b36SAndroid Build Coastguard Worker installable: true, 9554*333d2b36SAndroid Build Coastguard Worker } 9555*333d2b36SAndroid Build Coastguard Worker `) 9556*333d2b36SAndroid Build Coastguard Worker 9557*333d2b36SAndroid Build Coastguard Worker apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) 9558*333d2b36SAndroid Build Coastguard Worker data := android.AndroidMkDataForTest(t, ctx, apexBundle) 9559*333d2b36SAndroid Build Coastguard Worker var builder strings.Builder 9560*333d2b36SAndroid Build Coastguard Worker data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data) 9561*333d2b36SAndroid Build Coastguard Worker androidMk := builder.String() 9562*333d2b36SAndroid Build Coastguard Worker ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex") 9563*333d2b36SAndroid Build Coastguard Worker} 9564*333d2b36SAndroid Build Coastguard Worker 9565*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidMk_RequiredDeps(t *testing.T) { 9566*333d2b36SAndroid Build Coastguard Worker t.Parallel() 9567*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 9568*333d2b36SAndroid Build Coastguard Worker apex { 9569*333d2b36SAndroid Build Coastguard Worker name: "myapex", 9570*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 9571*333d2b36SAndroid Build Coastguard Worker updatable: false, 9572*333d2b36SAndroid Build Coastguard Worker } 9573*333d2b36SAndroid Build Coastguard Worker 9574*333d2b36SAndroid Build Coastguard Worker apex_key { 9575*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 9576*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 9577*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 9578*333d2b36SAndroid Build Coastguard Worker } 9579*333d2b36SAndroid Build Coastguard Worker `) 9580*333d2b36SAndroid Build Coastguard Worker 9581*333d2b36SAndroid Build Coastguard Worker bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) 9582*333d2b36SAndroid Build Coastguard Worker bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo") 9583*333d2b36SAndroid Build Coastguard Worker data := android.AndroidMkDataForTest(t, ctx, bundle) 9584*333d2b36SAndroid Build Coastguard Worker var builder strings.Builder 9585*333d2b36SAndroid Build Coastguard Worker data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data) 9586*333d2b36SAndroid Build Coastguard Worker androidMk := builder.String() 9587*333d2b36SAndroid Build Coastguard Worker ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n") 9588*333d2b36SAndroid Build Coastguard Worker} 9589*333d2b36SAndroid Build Coastguard Worker 9590*333d2b36SAndroid Build Coastguard Workerfunc TestApexOutputFileProducer(t *testing.T) { 9591*333d2b36SAndroid Build Coastguard Worker t.Parallel() 9592*333d2b36SAndroid Build Coastguard Worker for _, tc := range []struct { 9593*333d2b36SAndroid Build Coastguard Worker name string 9594*333d2b36SAndroid Build Coastguard Worker ref string 9595*333d2b36SAndroid Build Coastguard Worker expected_data []string 9596*333d2b36SAndroid Build Coastguard Worker }{ 9597*333d2b36SAndroid Build Coastguard Worker { 9598*333d2b36SAndroid Build Coastguard Worker name: "test_using_output", 9599*333d2b36SAndroid Build Coastguard Worker ref: ":myapex", 9600*333d2b36SAndroid Build Coastguard Worker expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"}, 9601*333d2b36SAndroid Build Coastguard Worker }, 9602*333d2b36SAndroid Build Coastguard Worker { 9603*333d2b36SAndroid Build Coastguard Worker name: "test_using_apex", 9604*333d2b36SAndroid Build Coastguard Worker ref: ":myapex{.apex}", 9605*333d2b36SAndroid Build Coastguard Worker expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"}, 9606*333d2b36SAndroid Build Coastguard Worker }, 9607*333d2b36SAndroid Build Coastguard Worker } { 9608*333d2b36SAndroid Build Coastguard Worker t.Run(tc.name, func(t *testing.T) { 9609*333d2b36SAndroid Build Coastguard Worker t.Parallel() 9610*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 9611*333d2b36SAndroid Build Coastguard Worker apex { 9612*333d2b36SAndroid Build Coastguard Worker name: "myapex", 9613*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 9614*333d2b36SAndroid Build Coastguard Worker compressible: true, 9615*333d2b36SAndroid Build Coastguard Worker updatable: false, 9616*333d2b36SAndroid Build Coastguard Worker } 9617*333d2b36SAndroid Build Coastguard Worker 9618*333d2b36SAndroid Build Coastguard Worker apex_key { 9619*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 9620*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 9621*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 9622*333d2b36SAndroid Build Coastguard Worker } 9623*333d2b36SAndroid Build Coastguard Worker 9624*333d2b36SAndroid Build Coastguard Worker java_test { 9625*333d2b36SAndroid Build Coastguard Worker name: "`+tc.name+`", 9626*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 9627*333d2b36SAndroid Build Coastguard Worker data: ["`+tc.ref+`"], 9628*333d2b36SAndroid Build Coastguard Worker } 9629*333d2b36SAndroid Build Coastguard Worker `, 9630*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 9631*333d2b36SAndroid Build Coastguard Worker variables.CompressedApex = proptools.BoolPtr(true) 9632*333d2b36SAndroid Build Coastguard Worker })) 9633*333d2b36SAndroid Build Coastguard Worker javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test) 9634*333d2b36SAndroid Build Coastguard Worker data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"] 9635*333d2b36SAndroid Build Coastguard Worker android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data) 9636*333d2b36SAndroid Build Coastguard Worker }) 9637*333d2b36SAndroid Build Coastguard Worker } 9638*333d2b36SAndroid Build Coastguard Worker} 9639*333d2b36SAndroid Build Coastguard Worker 9640*333d2b36SAndroid Build Coastguard Workerfunc TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) { 9641*333d2b36SAndroid Build Coastguard Worker t.Parallel() 9642*333d2b36SAndroid Build Coastguard Worker preparer := android.GroupFixturePreparers( 9643*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithApexBuildComponents, 9644*333d2b36SAndroid Build Coastguard Worker prepareForTestWithMyapex, 9645*333d2b36SAndroid Build Coastguard Worker java.PrepareForTestWithJavaSdkLibraryFiles, 9646*333d2b36SAndroid Build Coastguard Worker java.PrepareForTestWithJavaDefaultModules, 9647*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithAndroidBuildComponents, 9648*333d2b36SAndroid Build Coastguard Worker dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"), 9649*333d2b36SAndroid Build Coastguard Worker dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"), 9650*333d2b36SAndroid Build Coastguard Worker ) 9651*333d2b36SAndroid Build Coastguard Worker 9652*333d2b36SAndroid Build Coastguard Worker // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex 9653*333d2b36SAndroid Build Coastguard Worker t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) { 9654*333d2b36SAndroid Build Coastguard Worker t.Parallel() 9655*333d2b36SAndroid Build Coastguard Worker preparer.RunTestWithBp(t, ` 9656*333d2b36SAndroid Build Coastguard Worker apex { 9657*333d2b36SAndroid Build Coastguard Worker name: "myapex", 9658*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 9659*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragments: ["mybootclasspathfragment"], 9660*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "30", 9661*333d2b36SAndroid Build Coastguard Worker updatable: false, 9662*333d2b36SAndroid Build Coastguard Worker } 9663*333d2b36SAndroid Build Coastguard Worker 9664*333d2b36SAndroid Build Coastguard Worker apex_key { 9665*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 9666*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 9667*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 9668*333d2b36SAndroid Build Coastguard Worker } 9669*333d2b36SAndroid Build Coastguard Worker 9670*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragment { 9671*333d2b36SAndroid Build Coastguard Worker name: "mybootclasspathfragment", 9672*333d2b36SAndroid Build Coastguard Worker contents: ["mybootclasspathlib"], 9673*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 9674*333d2b36SAndroid Build Coastguard Worker hidden_api: { 9675*333d2b36SAndroid Build Coastguard Worker split_packages: ["*"], 9676*333d2b36SAndroid Build Coastguard Worker }, 9677*333d2b36SAndroid Build Coastguard Worker } 9678*333d2b36SAndroid Build Coastguard Worker 9679*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 9680*333d2b36SAndroid Build Coastguard Worker name: "mybootclasspathlib", 9681*333d2b36SAndroid Build Coastguard Worker srcs: ["mybootclasspathlib.java"], 9682*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 9683*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 9684*333d2b36SAndroid Build Coastguard Worker unsafe_ignore_missing_latest_api: true, 9685*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "31", 9686*333d2b36SAndroid Build Coastguard Worker static_libs: ["util"], 9687*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_current", 9688*333d2b36SAndroid Build Coastguard Worker } 9689*333d2b36SAndroid Build Coastguard Worker 9690*333d2b36SAndroid Build Coastguard Worker java_library { 9691*333d2b36SAndroid Build Coastguard Worker name: "util", 9692*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 9693*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 9694*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "31", 9695*333d2b36SAndroid Build Coastguard Worker static_libs: ["another_util"], 9696*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_current", 9697*333d2b36SAndroid Build Coastguard Worker } 9698*333d2b36SAndroid Build Coastguard Worker 9699*333d2b36SAndroid Build Coastguard Worker java_library { 9700*333d2b36SAndroid Build Coastguard Worker name: "another_util", 9701*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 9702*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "31", 9703*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 9704*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_current", 9705*333d2b36SAndroid Build Coastguard Worker } 9706*333d2b36SAndroid Build Coastguard Worker `) 9707*333d2b36SAndroid Build Coastguard Worker }) 9708*333d2b36SAndroid Build Coastguard Worker 9709*333d2b36SAndroid Build Coastguard Worker // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex 9710*333d2b36SAndroid Build Coastguard Worker t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) { 9711*333d2b36SAndroid Build Coastguard Worker t.Parallel() 9712*333d2b36SAndroid Build Coastguard Worker preparer.RunTestWithBp(t, ` 9713*333d2b36SAndroid Build Coastguard Worker apex { 9714*333d2b36SAndroid Build Coastguard Worker name: "myapex", 9715*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 9716*333d2b36SAndroid Build Coastguard Worker systemserverclasspath_fragments: ["mysystemserverclasspathfragment"], 9717*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "30", 9718*333d2b36SAndroid Build Coastguard Worker updatable: false, 9719*333d2b36SAndroid Build Coastguard Worker } 9720*333d2b36SAndroid Build Coastguard Worker 9721*333d2b36SAndroid Build Coastguard Worker apex_key { 9722*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 9723*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 9724*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 9725*333d2b36SAndroid Build Coastguard Worker } 9726*333d2b36SAndroid Build Coastguard Worker 9727*333d2b36SAndroid Build Coastguard Worker systemserverclasspath_fragment { 9728*333d2b36SAndroid Build Coastguard Worker name: "mysystemserverclasspathfragment", 9729*333d2b36SAndroid Build Coastguard Worker contents: ["mysystemserverclasspathlib"], 9730*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 9731*333d2b36SAndroid Build Coastguard Worker } 9732*333d2b36SAndroid Build Coastguard Worker 9733*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 9734*333d2b36SAndroid Build Coastguard Worker name: "mysystemserverclasspathlib", 9735*333d2b36SAndroid Build Coastguard Worker srcs: ["mysystemserverclasspathlib.java"], 9736*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 9737*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 9738*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "32", 9739*333d2b36SAndroid Build Coastguard Worker unsafe_ignore_missing_latest_api: true, 9740*333d2b36SAndroid Build Coastguard Worker static_libs: ["util"], 9741*333d2b36SAndroid Build Coastguard Worker } 9742*333d2b36SAndroid Build Coastguard Worker 9743*333d2b36SAndroid Build Coastguard Worker java_library { 9744*333d2b36SAndroid Build Coastguard Worker name: "util", 9745*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 9746*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 9747*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "31", 9748*333d2b36SAndroid Build Coastguard Worker static_libs: ["another_util"], 9749*333d2b36SAndroid Build Coastguard Worker } 9750*333d2b36SAndroid Build Coastguard Worker 9751*333d2b36SAndroid Build Coastguard Worker java_library { 9752*333d2b36SAndroid Build Coastguard Worker name: "another_util", 9753*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 9754*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "31", 9755*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 9756*333d2b36SAndroid Build Coastguard Worker } 9757*333d2b36SAndroid Build Coastguard Worker `) 9758*333d2b36SAndroid Build Coastguard Worker }) 9759*333d2b36SAndroid Build Coastguard Worker 9760*333d2b36SAndroid Build Coastguard Worker t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) { 9761*333d2b36SAndroid Build Coastguard Worker t.Parallel() 9762*333d2b36SAndroid Build Coastguard Worker preparer. 9763*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, ` 9764*333d2b36SAndroid Build Coastguard Worker apex { 9765*333d2b36SAndroid Build Coastguard Worker name: "myapex", 9766*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 9767*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragments: ["mybootclasspathfragment"], 9768*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "30", 9769*333d2b36SAndroid Build Coastguard Worker updatable: false, 9770*333d2b36SAndroid Build Coastguard Worker } 9771*333d2b36SAndroid Build Coastguard Worker 9772*333d2b36SAndroid Build Coastguard Worker apex_key { 9773*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 9774*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 9775*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 9776*333d2b36SAndroid Build Coastguard Worker } 9777*333d2b36SAndroid Build Coastguard Worker 9778*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragment { 9779*333d2b36SAndroid Build Coastguard Worker name: "mybootclasspathfragment", 9780*333d2b36SAndroid Build Coastguard Worker contents: ["mybootclasspathlib"], 9781*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 9782*333d2b36SAndroid Build Coastguard Worker hidden_api: { 9783*333d2b36SAndroid Build Coastguard Worker split_packages: ["*"], 9784*333d2b36SAndroid Build Coastguard Worker }, 9785*333d2b36SAndroid Build Coastguard Worker } 9786*333d2b36SAndroid Build Coastguard Worker 9787*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 9788*333d2b36SAndroid Build Coastguard Worker name: "mybootclasspathlib", 9789*333d2b36SAndroid Build Coastguard Worker srcs: ["mybootclasspathlib.java"], 9790*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 9791*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 9792*333d2b36SAndroid Build Coastguard Worker unsafe_ignore_missing_latest_api: true, 9793*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 9794*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "30", 9795*333d2b36SAndroid Build Coastguard Worker } 9796*333d2b36SAndroid Build Coastguard Worker `) 9797*333d2b36SAndroid Build Coastguard Worker }) 9798*333d2b36SAndroid Build Coastguard Worker 9799*333d2b36SAndroid Build Coastguard Worker t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) { 9800*333d2b36SAndroid Build Coastguard Worker t.Parallel() 9801*333d2b36SAndroid Build Coastguard Worker preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)). 9802*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, ` 9803*333d2b36SAndroid Build Coastguard Worker apex { 9804*333d2b36SAndroid Build Coastguard Worker name: "myapex", 9805*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 9806*333d2b36SAndroid Build Coastguard Worker systemserverclasspath_fragments: ["mysystemserverclasspathfragment"], 9807*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "30", 9808*333d2b36SAndroid Build Coastguard Worker updatable: false, 9809*333d2b36SAndroid Build Coastguard Worker } 9810*333d2b36SAndroid Build Coastguard Worker 9811*333d2b36SAndroid Build Coastguard Worker apex_key { 9812*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 9813*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 9814*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 9815*333d2b36SAndroid Build Coastguard Worker } 9816*333d2b36SAndroid Build Coastguard Worker 9817*333d2b36SAndroid Build Coastguard Worker systemserverclasspath_fragment { 9818*333d2b36SAndroid Build Coastguard Worker name: "mysystemserverclasspathfragment", 9819*333d2b36SAndroid Build Coastguard Worker contents: ["mysystemserverclasspathlib"], 9820*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 9821*333d2b36SAndroid Build Coastguard Worker } 9822*333d2b36SAndroid Build Coastguard Worker 9823*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 9824*333d2b36SAndroid Build Coastguard Worker name: "mysystemserverclasspathlib", 9825*333d2b36SAndroid Build Coastguard Worker srcs: ["mysystemserverclasspathlib.java"], 9826*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 9827*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 9828*333d2b36SAndroid Build Coastguard Worker unsafe_ignore_missing_latest_api: true, 9829*333d2b36SAndroid Build Coastguard Worker } 9830*333d2b36SAndroid Build Coastguard Worker `) 9831*333d2b36SAndroid Build Coastguard Worker }) 9832*333d2b36SAndroid Build Coastguard Worker} 9833*333d2b36SAndroid Build Coastguard Worker 9834*333d2b36SAndroid Build Coastguard Worker// Verifies that the APEX depends on all the Make modules in the list. 9835*333d2b36SAndroid Build Coastguard Workerfunc ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) { 9836*333d2b36SAndroid Build Coastguard Worker a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle) 9837*333d2b36SAndroid Build Coastguard Worker for _, dep := range deps { 9838*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "", a.makeModulesToInstall, dep) 9839*333d2b36SAndroid Build Coastguard Worker } 9840*333d2b36SAndroid Build Coastguard Worker} 9841*333d2b36SAndroid Build Coastguard Worker 9842*333d2b36SAndroid Build Coastguard Worker// Verifies that the APEX does not depend on any of the Make modules in the list. 9843*333d2b36SAndroid Build Coastguard Workerfunc ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) { 9844*333d2b36SAndroid Build Coastguard Worker a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle) 9845*333d2b36SAndroid Build Coastguard Worker for _, dep := range deps { 9846*333d2b36SAndroid Build Coastguard Worker android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep) 9847*333d2b36SAndroid Build Coastguard Worker } 9848*333d2b36SAndroid Build Coastguard Worker} 9849*333d2b36SAndroid Build Coastguard Worker 9850*333d2b36SAndroid Build Coastguard Workerfunc TestApexStrictUpdtabilityLint(t *testing.T) { 9851*333d2b36SAndroid Build Coastguard Worker t.Parallel() 9852*333d2b36SAndroid Build Coastguard Worker bpTemplate := ` 9853*333d2b36SAndroid Build Coastguard Worker apex { 9854*333d2b36SAndroid Build Coastguard Worker name: "myapex", 9855*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 9856*333d2b36SAndroid Build Coastguard Worker java_libs: ["myjavalib"], 9857*333d2b36SAndroid Build Coastguard Worker updatable: %v, 9858*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 9859*333d2b36SAndroid Build Coastguard Worker } 9860*333d2b36SAndroid Build Coastguard Worker apex_key { 9861*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 9862*333d2b36SAndroid Build Coastguard Worker } 9863*333d2b36SAndroid Build Coastguard Worker java_library { 9864*333d2b36SAndroid Build Coastguard Worker name: "myjavalib", 9865*333d2b36SAndroid Build Coastguard Worker srcs: ["MyClass.java"], 9866*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 9867*333d2b36SAndroid Build Coastguard Worker lint: { 9868*333d2b36SAndroid Build Coastguard Worker strict_updatability_linting: %v, 9869*333d2b36SAndroid Build Coastguard Worker %s 9870*333d2b36SAndroid Build Coastguard Worker }, 9871*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 9872*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 9873*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 9874*333d2b36SAndroid Build Coastguard Worker } 9875*333d2b36SAndroid Build Coastguard Worker ` 9876*333d2b36SAndroid Build Coastguard Worker fs := android.MockFS{ 9877*333d2b36SAndroid Build Coastguard Worker "lint-baseline.xml": nil, 9878*333d2b36SAndroid Build Coastguard Worker } 9879*333d2b36SAndroid Build Coastguard Worker 9880*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 9881*333d2b36SAndroid Build Coastguard Worker testCaseName string 9882*333d2b36SAndroid Build Coastguard Worker apexUpdatable bool 9883*333d2b36SAndroid Build Coastguard Worker javaStrictUpdtabilityLint bool 9884*333d2b36SAndroid Build Coastguard Worker lintFileExists bool 9885*333d2b36SAndroid Build Coastguard Worker disallowedFlagExpectedOnApex bool 9886*333d2b36SAndroid Build Coastguard Worker disallowedFlagExpectedOnJavalib bool 9887*333d2b36SAndroid Build Coastguard Worker }{ 9888*333d2b36SAndroid Build Coastguard Worker { 9889*333d2b36SAndroid Build Coastguard Worker testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd", 9890*333d2b36SAndroid Build Coastguard Worker apexUpdatable: true, 9891*333d2b36SAndroid Build Coastguard Worker javaStrictUpdtabilityLint: true, 9892*333d2b36SAndroid Build Coastguard Worker lintFileExists: false, 9893*333d2b36SAndroid Build Coastguard Worker disallowedFlagExpectedOnApex: false, 9894*333d2b36SAndroid Build Coastguard Worker disallowedFlagExpectedOnJavalib: false, 9895*333d2b36SAndroid Build Coastguard Worker }, 9896*333d2b36SAndroid Build Coastguard Worker { 9897*333d2b36SAndroid Build Coastguard Worker testCaseName: "non-updatable apex respects strict_updatability of javalib", 9898*333d2b36SAndroid Build Coastguard Worker apexUpdatable: false, 9899*333d2b36SAndroid Build Coastguard Worker javaStrictUpdtabilityLint: false, 9900*333d2b36SAndroid Build Coastguard Worker lintFileExists: true, 9901*333d2b36SAndroid Build Coastguard Worker disallowedFlagExpectedOnApex: false, 9902*333d2b36SAndroid Build Coastguard Worker disallowedFlagExpectedOnJavalib: false, 9903*333d2b36SAndroid Build Coastguard Worker }, 9904*333d2b36SAndroid Build Coastguard Worker { 9905*333d2b36SAndroid Build Coastguard Worker testCaseName: "non-updatable apex respects strict updatability of javalib", 9906*333d2b36SAndroid Build Coastguard Worker apexUpdatable: false, 9907*333d2b36SAndroid Build Coastguard Worker javaStrictUpdtabilityLint: true, 9908*333d2b36SAndroid Build Coastguard Worker lintFileExists: true, 9909*333d2b36SAndroid Build Coastguard Worker disallowedFlagExpectedOnApex: false, 9910*333d2b36SAndroid Build Coastguard Worker disallowedFlagExpectedOnJavalib: true, 9911*333d2b36SAndroid Build Coastguard Worker }, 9912*333d2b36SAndroid Build Coastguard Worker { 9913*333d2b36SAndroid Build Coastguard Worker testCaseName: "updatable apex checks strict updatability of javalib", 9914*333d2b36SAndroid Build Coastguard Worker apexUpdatable: true, 9915*333d2b36SAndroid Build Coastguard Worker javaStrictUpdtabilityLint: false, 9916*333d2b36SAndroid Build Coastguard Worker lintFileExists: true, 9917*333d2b36SAndroid Build Coastguard Worker disallowedFlagExpectedOnApex: true, 9918*333d2b36SAndroid Build Coastguard Worker disallowedFlagExpectedOnJavalib: false, 9919*333d2b36SAndroid Build Coastguard Worker }, 9920*333d2b36SAndroid Build Coastguard Worker } 9921*333d2b36SAndroid Build Coastguard Worker 9922*333d2b36SAndroid Build Coastguard Worker for _, testCase := range testCases { 9923*333d2b36SAndroid Build Coastguard Worker t.Run(testCase.testCaseName, func(t *testing.T) { 9924*333d2b36SAndroid Build Coastguard Worker t.Parallel() 9925*333d2b36SAndroid Build Coastguard Worker fixtures := []android.FixturePreparer{} 9926*333d2b36SAndroid Build Coastguard Worker baselineProperty := "" 9927*333d2b36SAndroid Build Coastguard Worker if testCase.lintFileExists { 9928*333d2b36SAndroid Build Coastguard Worker fixtures = append(fixtures, fs.AddToFixture()) 9929*333d2b36SAndroid Build Coastguard Worker baselineProperty = "baseline_filename: \"lint-baseline.xml\"" 9930*333d2b36SAndroid Build Coastguard Worker } 9931*333d2b36SAndroid Build Coastguard Worker bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty) 9932*333d2b36SAndroid Build Coastguard Worker 9933*333d2b36SAndroid Build Coastguard Worker result := testApex(t, bp, fixtures...) 9934*333d2b36SAndroid Build Coastguard Worker 9935*333d2b36SAndroid Build Coastguard Worker checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) { 9936*333d2b36SAndroid Build Coastguard Worker if expectStrictUpdatability { 9937*333d2b36SAndroid Build Coastguard Worker if m.Rule == nil { 9938*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected strict updatability check rule on %s", name) 9939*333d2b36SAndroid Build Coastguard Worker } else { 9940*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name), 9941*333d2b36SAndroid Build Coastguard Worker m.RuleParams.Command, "--disallowed_issues NewApi") 9942*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name), 9943*333d2b36SAndroid Build Coastguard Worker m.Inputs.Strings(), "lint-baseline.xml") 9944*333d2b36SAndroid Build Coastguard Worker } 9945*333d2b36SAndroid Build Coastguard Worker } else { 9946*333d2b36SAndroid Build Coastguard Worker if m.Rule != nil { 9947*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected no strict updatability check rule on %s", name) 9948*333d2b36SAndroid Build Coastguard Worker } 9949*333d2b36SAndroid Build Coastguard Worker } 9950*333d2b36SAndroid Build Coastguard Worker } 9951*333d2b36SAndroid Build Coastguard Worker 9952*333d2b36SAndroid Build Coastguard Worker myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29") 9953*333d2b36SAndroid Build Coastguard Worker apex := result.ModuleForTests("myapex", "android_common_myapex") 9954*333d2b36SAndroid Build Coastguard Worker apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp") 9955*333d2b36SAndroid Build Coastguard Worker javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp") 9956*333d2b36SAndroid Build Coastguard Worker 9957*333d2b36SAndroid Build Coastguard Worker checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex) 9958*333d2b36SAndroid Build Coastguard Worker checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib) 9959*333d2b36SAndroid Build Coastguard Worker }) 9960*333d2b36SAndroid Build Coastguard Worker } 9961*333d2b36SAndroid Build Coastguard Worker} 9962*333d2b36SAndroid Build Coastguard Worker 9963*333d2b36SAndroid Build Coastguard Worker// checks transtive deps of an apex coming from bootclasspath_fragment 9964*333d2b36SAndroid Build Coastguard Workerfunc TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) { 9965*333d2b36SAndroid Build Coastguard Worker t.Parallel() 9966*333d2b36SAndroid Build Coastguard Worker bp := ` 9967*333d2b36SAndroid Build Coastguard Worker apex { 9968*333d2b36SAndroid Build Coastguard Worker name: "myapex", 9969*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 9970*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragments: ["mybootclasspathfragment"], 9971*333d2b36SAndroid Build Coastguard Worker updatable: true, 9972*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 9973*333d2b36SAndroid Build Coastguard Worker } 9974*333d2b36SAndroid Build Coastguard Worker apex_key { 9975*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 9976*333d2b36SAndroid Build Coastguard Worker } 9977*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragment { 9978*333d2b36SAndroid Build Coastguard Worker name: "mybootclasspathfragment", 9979*333d2b36SAndroid Build Coastguard Worker contents: ["myjavalib"], 9980*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 9981*333d2b36SAndroid Build Coastguard Worker hidden_api: { 9982*333d2b36SAndroid Build Coastguard Worker split_packages: ["*"], 9983*333d2b36SAndroid Build Coastguard Worker }, 9984*333d2b36SAndroid Build Coastguard Worker } 9985*333d2b36SAndroid Build Coastguard Worker java_library { 9986*333d2b36SAndroid Build Coastguard Worker name: "myjavalib", 9987*333d2b36SAndroid Build Coastguard Worker srcs: ["MyClass.java"], 9988*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 9989*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 9990*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 9991*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 9992*333d2b36SAndroid Build Coastguard Worker lint: { 9993*333d2b36SAndroid Build Coastguard Worker baseline_filename: "lint-baseline.xml", 9994*333d2b36SAndroid Build Coastguard Worker } 9995*333d2b36SAndroid Build Coastguard Worker } 9996*333d2b36SAndroid Build Coastguard Worker ` 9997*333d2b36SAndroid Build Coastguard Worker fs := android.MockFS{ 9998*333d2b36SAndroid Build Coastguard Worker "lint-baseline.xml": nil, 9999*333d2b36SAndroid Build Coastguard Worker } 10000*333d2b36SAndroid Build Coastguard Worker 10001*333d2b36SAndroid Build Coastguard Worker result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture()) 10002*333d2b36SAndroid Build Coastguard Worker apex := result.ModuleForTests("myapex", "android_common_myapex") 10003*333d2b36SAndroid Build Coastguard Worker apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp") 10004*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "strict updatability check rule for myapex", 10005*333d2b36SAndroid Build Coastguard Worker apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi") 10006*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "strict updatability check baselines for myapex", 10007*333d2b36SAndroid Build Coastguard Worker apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml") 10008*333d2b36SAndroid Build Coastguard Worker} 10009*333d2b36SAndroid Build Coastguard Worker 10010*333d2b36SAndroid Build Coastguard Workerfunc TestApexLintBcpFragmentSdkLibDeps(t *testing.T) { 10011*333d2b36SAndroid Build Coastguard Worker t.Parallel() 10012*333d2b36SAndroid Build Coastguard Worker bp := ` 10013*333d2b36SAndroid Build Coastguard Worker apex { 10014*333d2b36SAndroid Build Coastguard Worker name: "myapex", 10015*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 10016*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragments: ["mybootclasspathfragment"], 10017*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 10018*333d2b36SAndroid Build Coastguard Worker java_libs: [ 10019*333d2b36SAndroid Build Coastguard Worker "jacocoagent", 10020*333d2b36SAndroid Build Coastguard Worker ], 10021*333d2b36SAndroid Build Coastguard Worker } 10022*333d2b36SAndroid Build Coastguard Worker apex_key { 10023*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 10024*333d2b36SAndroid Build Coastguard Worker } 10025*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragment { 10026*333d2b36SAndroid Build Coastguard Worker name: "mybootclasspathfragment", 10027*333d2b36SAndroid Build Coastguard Worker contents: ["foo"], 10028*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 10029*333d2b36SAndroid Build Coastguard Worker hidden_api: { 10030*333d2b36SAndroid Build Coastguard Worker split_packages: ["*"], 10031*333d2b36SAndroid Build Coastguard Worker }, 10032*333d2b36SAndroid Build Coastguard Worker } 10033*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 10034*333d2b36SAndroid Build Coastguard Worker name: "foo", 10035*333d2b36SAndroid Build Coastguard Worker srcs: ["MyClass.java"], 10036*333d2b36SAndroid Build Coastguard Worker apex_available: [ "myapex" ], 10037*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 10038*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 10039*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 10040*333d2b36SAndroid Build Coastguard Worker } 10041*333d2b36SAndroid Build Coastguard Worker ` 10042*333d2b36SAndroid Build Coastguard Worker fs := android.MockFS{ 10043*333d2b36SAndroid Build Coastguard Worker "lint-baseline.xml": nil, 10044*333d2b36SAndroid Build Coastguard Worker } 10045*333d2b36SAndroid Build Coastguard Worker 10046*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 10047*333d2b36SAndroid Build Coastguard Worker prepareForApexTest, 10048*333d2b36SAndroid Build Coastguard Worker java.PrepareForTestWithJavaSdkLibraryFiles, 10049*333d2b36SAndroid Build Coastguard Worker java.PrepareForTestWithJacocoInstrumentation, 10050*333d2b36SAndroid Build Coastguard Worker java.FixtureWithLastReleaseApis("foo"), 10051*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs(fs), 10052*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 10053*333d2b36SAndroid Build Coastguard Worker 10054*333d2b36SAndroid Build Coastguard Worker myapex := result.ModuleForTests("myapex", "android_common_myapex") 10055*333d2b36SAndroid Build Coastguard Worker lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ") 10056*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, 10057*333d2b36SAndroid Build Coastguard Worker "myapex lint report expected to contain that of the sdk library impl lib as an input", 10058*333d2b36SAndroid Build Coastguard Worker lintReportInputs, "foo.impl") 10059*333d2b36SAndroid Build Coastguard Worker} 10060*333d2b36SAndroid Build Coastguard Worker 10061*333d2b36SAndroid Build Coastguard Worker// updatable apexes should propagate updatable=true to its apps 10062*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatableApexEnforcesAppUpdatability(t *testing.T) { 10063*333d2b36SAndroid Build Coastguard Worker t.Parallel() 10064*333d2b36SAndroid Build Coastguard Worker bp := ` 10065*333d2b36SAndroid Build Coastguard Worker apex { 10066*333d2b36SAndroid Build Coastguard Worker name: "myapex", 10067*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 10068*333d2b36SAndroid Build Coastguard Worker updatable: true, 10069*333d2b36SAndroid Build Coastguard Worker apps: [ 10070*333d2b36SAndroid Build Coastguard Worker "myapp", 10071*333d2b36SAndroid Build Coastguard Worker ], 10072*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "30", 10073*333d2b36SAndroid Build Coastguard Worker } 10074*333d2b36SAndroid Build Coastguard Worker apex_key { 10075*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 10076*333d2b36SAndroid Build Coastguard Worker } 10077*333d2b36SAndroid Build Coastguard Worker android_app { 10078*333d2b36SAndroid Build Coastguard Worker name: "myapp", 10079*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10080*333d2b36SAndroid Build Coastguard Worker "myapex", 10081*333d2b36SAndroid Build Coastguard Worker ], 10082*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 10083*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "30", 10084*333d2b36SAndroid Build Coastguard Worker } 10085*333d2b36SAndroid Build Coastguard Worker ` 10086*333d2b36SAndroid Build Coastguard Worker _ = android.GroupFixturePreparers( 10087*333d2b36SAndroid Build Coastguard Worker prepareForApexTest, 10088*333d2b36SAndroid Build Coastguard Worker ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")). 10089*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, bp) 10090*333d2b36SAndroid Build Coastguard Worker} 10091*333d2b36SAndroid Build Coastguard Worker 10092*333d2b36SAndroid Build Coastguard Workerfunc TestCannedFsConfig(t *testing.T) { 10093*333d2b36SAndroid Build Coastguard Worker t.Parallel() 10094*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 10095*333d2b36SAndroid Build Coastguard Worker apex { 10096*333d2b36SAndroid Build Coastguard Worker name: "myapex", 10097*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 10098*333d2b36SAndroid Build Coastguard Worker updatable: false, 10099*333d2b36SAndroid Build Coastguard Worker } 10100*333d2b36SAndroid Build Coastguard Worker 10101*333d2b36SAndroid Build Coastguard Worker apex_key { 10102*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 10103*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 10104*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 10105*333d2b36SAndroid Build Coastguard Worker }`) 10106*333d2b36SAndroid Build Coastguard Worker mod := ctx.ModuleForTests("myapex", "android_common_myapex") 10107*333d2b36SAndroid Build Coastguard Worker generateFsRule := mod.Rule("generateFsConfig") 10108*333d2b36SAndroid Build Coastguard Worker cmd := generateFsRule.RuleParams.Command 10109*333d2b36SAndroid Build Coastguard Worker 10110*333d2b36SAndroid Build Coastguard Worker ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`) 10111*333d2b36SAndroid Build Coastguard Worker} 10112*333d2b36SAndroid Build Coastguard Worker 10113*333d2b36SAndroid Build Coastguard Workerfunc TestCannedFsConfig_HasCustomConfig(t *testing.T) { 10114*333d2b36SAndroid Build Coastguard Worker t.Parallel() 10115*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 10116*333d2b36SAndroid Build Coastguard Worker apex { 10117*333d2b36SAndroid Build Coastguard Worker name: "myapex", 10118*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 10119*333d2b36SAndroid Build Coastguard Worker canned_fs_config: "my_config", 10120*333d2b36SAndroid Build Coastguard Worker updatable: false, 10121*333d2b36SAndroid Build Coastguard Worker } 10122*333d2b36SAndroid Build Coastguard Worker 10123*333d2b36SAndroid Build Coastguard Worker apex_key { 10124*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 10125*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 10126*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 10127*333d2b36SAndroid Build Coastguard Worker }`) 10128*333d2b36SAndroid Build Coastguard Worker mod := ctx.ModuleForTests("myapex", "android_common_myapex") 10129*333d2b36SAndroid Build Coastguard Worker generateFsRule := mod.Rule("generateFsConfig") 10130*333d2b36SAndroid Build Coastguard Worker cmd := generateFsRule.RuleParams.Command 10131*333d2b36SAndroid Build Coastguard Worker 10132*333d2b36SAndroid Build Coastguard Worker // Ensure that canned_fs_config has "cat my_config" at the end 10133*333d2b36SAndroid Build Coastguard Worker ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`) 10134*333d2b36SAndroid Build Coastguard Worker} 10135*333d2b36SAndroid Build Coastguard Worker 10136*333d2b36SAndroid Build Coastguard Workerfunc TestStubLibrariesMultipleApexViolation(t *testing.T) { 10137*333d2b36SAndroid Build Coastguard Worker t.Parallel() 10138*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 10139*333d2b36SAndroid Build Coastguard Worker desc string 10140*333d2b36SAndroid Build Coastguard Worker hasStubs bool 10141*333d2b36SAndroid Build Coastguard Worker apexAvailable string 10142*333d2b36SAndroid Build Coastguard Worker expectedError string 10143*333d2b36SAndroid Build Coastguard Worker }{ 10144*333d2b36SAndroid Build Coastguard Worker { 10145*333d2b36SAndroid Build Coastguard Worker desc: "non-stub library can have multiple apex_available", 10146*333d2b36SAndroid Build Coastguard Worker hasStubs: false, 10147*333d2b36SAndroid Build Coastguard Worker apexAvailable: `["myapex", "otherapex"]`, 10148*333d2b36SAndroid Build Coastguard Worker }, 10149*333d2b36SAndroid Build Coastguard Worker { 10150*333d2b36SAndroid Build Coastguard Worker desc: "stub library should not be available to anyapex", 10151*333d2b36SAndroid Build Coastguard Worker hasStubs: true, 10152*333d2b36SAndroid Build Coastguard Worker apexAvailable: `["//apex_available:anyapex"]`, 10153*333d2b36SAndroid Build Coastguard Worker expectedError: "Stub libraries should have a single apex_available.*anyapex", 10154*333d2b36SAndroid Build Coastguard Worker }, 10155*333d2b36SAndroid Build Coastguard Worker { 10156*333d2b36SAndroid Build Coastguard Worker desc: "stub library should not be available to multiple apexes", 10157*333d2b36SAndroid Build Coastguard Worker hasStubs: true, 10158*333d2b36SAndroid Build Coastguard Worker apexAvailable: `["myapex", "otherapex"]`, 10159*333d2b36SAndroid Build Coastguard Worker expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex", 10160*333d2b36SAndroid Build Coastguard Worker }, 10161*333d2b36SAndroid Build Coastguard Worker { 10162*333d2b36SAndroid Build Coastguard Worker desc: "stub library can be available to a core apex and a test apex", 10163*333d2b36SAndroid Build Coastguard Worker hasStubs: true, 10164*333d2b36SAndroid Build Coastguard Worker apexAvailable: `["myapex", "test_myapex"]`, 10165*333d2b36SAndroid Build Coastguard Worker }, 10166*333d2b36SAndroid Build Coastguard Worker } 10167*333d2b36SAndroid Build Coastguard Worker bpTemplate := ` 10168*333d2b36SAndroid Build Coastguard Worker cc_library { 10169*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 10170*333d2b36SAndroid Build Coastguard Worker %v 10171*333d2b36SAndroid Build Coastguard Worker apex_available: %v, 10172*333d2b36SAndroid Build Coastguard Worker } 10173*333d2b36SAndroid Build Coastguard Worker apex { 10174*333d2b36SAndroid Build Coastguard Worker name: "myapex", 10175*333d2b36SAndroid Build Coastguard Worker key: "apex.key", 10176*333d2b36SAndroid Build Coastguard Worker updatable: false, 10177*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 10178*333d2b36SAndroid Build Coastguard Worker } 10179*333d2b36SAndroid Build Coastguard Worker apex { 10180*333d2b36SAndroid Build Coastguard Worker name: "otherapex", 10181*333d2b36SAndroid Build Coastguard Worker key: "apex.key", 10182*333d2b36SAndroid Build Coastguard Worker updatable: false, 10183*333d2b36SAndroid Build Coastguard Worker } 10184*333d2b36SAndroid Build Coastguard Worker apex_test { 10185*333d2b36SAndroid Build Coastguard Worker name: "test_myapex", 10186*333d2b36SAndroid Build Coastguard Worker key: "apex.key", 10187*333d2b36SAndroid Build Coastguard Worker updatable: false, 10188*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 10189*333d2b36SAndroid Build Coastguard Worker } 10190*333d2b36SAndroid Build Coastguard Worker apex_key { 10191*333d2b36SAndroid Build Coastguard Worker name: "apex.key", 10192*333d2b36SAndroid Build Coastguard Worker } 10193*333d2b36SAndroid Build Coastguard Worker ` 10194*333d2b36SAndroid Build Coastguard Worker for _, tc := range testCases { 10195*333d2b36SAndroid Build Coastguard Worker stubs := "" 10196*333d2b36SAndroid Build Coastguard Worker if tc.hasStubs { 10197*333d2b36SAndroid Build Coastguard Worker stubs = `stubs: {symbol_file: "libfoo.map.txt"},` 10198*333d2b36SAndroid Build Coastguard Worker } 10199*333d2b36SAndroid Build Coastguard Worker bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable) 10200*333d2b36SAndroid Build Coastguard Worker mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) { 10201*333d2b36SAndroid Build Coastguard Worker fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil 10202*333d2b36SAndroid Build Coastguard Worker }) 10203*333d2b36SAndroid Build Coastguard Worker if tc.expectedError == "" { 10204*333d2b36SAndroid Build Coastguard Worker testApex(t, bp, mockFsFixturePreparer) 10205*333d2b36SAndroid Build Coastguard Worker } else { 10206*333d2b36SAndroid Build Coastguard Worker testApexError(t, tc.expectedError, bp, mockFsFixturePreparer) 10207*333d2b36SAndroid Build Coastguard Worker } 10208*333d2b36SAndroid Build Coastguard Worker } 10209*333d2b36SAndroid Build Coastguard Worker} 10210*333d2b36SAndroid Build Coastguard Worker 10211*333d2b36SAndroid Build Coastguard Workerfunc TestFileSystemShouldSkipApexLibraries(t *testing.T) { 10212*333d2b36SAndroid Build Coastguard Worker t.Parallel() 10213*333d2b36SAndroid Build Coastguard Worker context := android.GroupFixturePreparers( 10214*333d2b36SAndroid Build Coastguard Worker android.PrepareForIntegrationTestWithAndroid, 10215*333d2b36SAndroid Build Coastguard Worker cc.PrepareForIntegrationTestWithCc, 10216*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithApexBuildComponents, 10217*333d2b36SAndroid Build Coastguard Worker prepareForTestWithMyapex, 10218*333d2b36SAndroid Build Coastguard Worker filesystem.PrepareForTestWithFilesystemBuildComponents, 10219*333d2b36SAndroid Build Coastguard Worker ) 10220*333d2b36SAndroid Build Coastguard Worker result := context.RunTestWithBp(t, ` 10221*333d2b36SAndroid Build Coastguard Worker android_system_image { 10222*333d2b36SAndroid Build Coastguard Worker name: "myfilesystem", 10223*333d2b36SAndroid Build Coastguard Worker deps: [ 10224*333d2b36SAndroid Build Coastguard Worker "libfoo", 10225*333d2b36SAndroid Build Coastguard Worker ], 10226*333d2b36SAndroid Build Coastguard Worker linker_config: { 10227*333d2b36SAndroid Build Coastguard Worker gen_linker_config: true, 10228*333d2b36SAndroid Build Coastguard Worker linker_config_srcs: ["linker.config.json"], 10229*333d2b36SAndroid Build Coastguard Worker }, 10230*333d2b36SAndroid Build Coastguard Worker } 10231*333d2b36SAndroid Build Coastguard Worker 10232*333d2b36SAndroid Build Coastguard Worker cc_library { 10233*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 10234*333d2b36SAndroid Build Coastguard Worker shared_libs: [ 10235*333d2b36SAndroid Build Coastguard Worker "libbar", 10236*333d2b36SAndroid Build Coastguard Worker ], 10237*333d2b36SAndroid Build Coastguard Worker stl: "none", 10238*333d2b36SAndroid Build Coastguard Worker } 10239*333d2b36SAndroid Build Coastguard Worker 10240*333d2b36SAndroid Build Coastguard Worker cc_library { 10241*333d2b36SAndroid Build Coastguard Worker name: "libbar", 10242*333d2b36SAndroid Build Coastguard Worker stl: "none", 10243*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 10244*333d2b36SAndroid Build Coastguard Worker } 10245*333d2b36SAndroid Build Coastguard Worker 10246*333d2b36SAndroid Build Coastguard Worker apex { 10247*333d2b36SAndroid Build Coastguard Worker name: "myapex", 10248*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libbar"], 10249*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 10250*333d2b36SAndroid Build Coastguard Worker updatable: false, 10251*333d2b36SAndroid Build Coastguard Worker } 10252*333d2b36SAndroid Build Coastguard Worker 10253*333d2b36SAndroid Build Coastguard Worker apex_key { 10254*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 10255*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 10256*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 10257*333d2b36SAndroid Build Coastguard Worker } 10258*333d2b36SAndroid Build Coastguard Worker `) 10259*333d2b36SAndroid Build Coastguard Worker 10260*333d2b36SAndroid Build Coastguard Worker inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits 10261*333d2b36SAndroid Build Coastguard Worker android.AssertStringListDoesNotContain(t, "filesystem should not have libbar", 10262*333d2b36SAndroid Build Coastguard Worker inputs.Strings(), 10263*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so") 10264*333d2b36SAndroid Build Coastguard Worker} 10265*333d2b36SAndroid Build Coastguard Worker 10266*333d2b36SAndroid Build Coastguard Workervar apex_default_bp = ` 10267*333d2b36SAndroid Build Coastguard Worker apex_key { 10268*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 10269*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 10270*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 10271*333d2b36SAndroid Build Coastguard Worker } 10272*333d2b36SAndroid Build Coastguard Worker 10273*333d2b36SAndroid Build Coastguard Worker filegroup { 10274*333d2b36SAndroid Build Coastguard Worker name: "myapex.manifest", 10275*333d2b36SAndroid Build Coastguard Worker srcs: ["apex_manifest.json"], 10276*333d2b36SAndroid Build Coastguard Worker } 10277*333d2b36SAndroid Build Coastguard Worker 10278*333d2b36SAndroid Build Coastguard Worker filegroup { 10279*333d2b36SAndroid Build Coastguard Worker name: "myapex.androidmanifest", 10280*333d2b36SAndroid Build Coastguard Worker srcs: ["AndroidManifest.xml"], 10281*333d2b36SAndroid Build Coastguard Worker } 10282*333d2b36SAndroid Build Coastguard Worker` 10283*333d2b36SAndroid Build Coastguard Worker 10284*333d2b36SAndroid Build Coastguard Workerfunc TestAconfigFilesJavaDeps(t *testing.T) { 10285*333d2b36SAndroid Build Coastguard Worker t.Parallel() 10286*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, apex_default_bp+` 10287*333d2b36SAndroid Build Coastguard Worker apex { 10288*333d2b36SAndroid Build Coastguard Worker name: "myapex", 10289*333d2b36SAndroid Build Coastguard Worker manifest: ":myapex.manifest", 10290*333d2b36SAndroid Build Coastguard Worker androidManifest: ":myapex.androidmanifest", 10291*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 10292*333d2b36SAndroid Build Coastguard Worker java_libs: [ 10293*333d2b36SAndroid Build Coastguard Worker "my_java_library_foo", 10294*333d2b36SAndroid Build Coastguard Worker "my_java_library_bar", 10295*333d2b36SAndroid Build Coastguard Worker ], 10296*333d2b36SAndroid Build Coastguard Worker updatable: false, 10297*333d2b36SAndroid Build Coastguard Worker } 10298*333d2b36SAndroid Build Coastguard Worker 10299*333d2b36SAndroid Build Coastguard Worker java_library { 10300*333d2b36SAndroid Build Coastguard Worker name: "my_java_library_foo", 10301*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 10302*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 10303*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 10304*333d2b36SAndroid Build Coastguard Worker static_libs: ["my_java_aconfig_library_foo"], 10305*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10306*333d2b36SAndroid Build Coastguard Worker "myapex", 10307*333d2b36SAndroid Build Coastguard Worker ], 10308*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 10309*333d2b36SAndroid Build Coastguard Worker } 10310*333d2b36SAndroid Build Coastguard Worker 10311*333d2b36SAndroid Build Coastguard Worker java_library { 10312*333d2b36SAndroid Build Coastguard Worker name: "my_java_library_bar", 10313*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 10314*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 10315*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 10316*333d2b36SAndroid Build Coastguard Worker static_libs: ["my_java_aconfig_library_bar"], 10317*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10318*333d2b36SAndroid Build Coastguard Worker "myapex", 10319*333d2b36SAndroid Build Coastguard Worker ], 10320*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 10321*333d2b36SAndroid Build Coastguard Worker } 10322*333d2b36SAndroid Build Coastguard Worker 10323*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 10324*333d2b36SAndroid Build Coastguard Worker name: "my_aconfig_declarations_foo", 10325*333d2b36SAndroid Build Coastguard Worker package: "com.example.package", 10326*333d2b36SAndroid Build Coastguard Worker container: "myapex", 10327*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.aconfig"], 10328*333d2b36SAndroid Build Coastguard Worker } 10329*333d2b36SAndroid Build Coastguard Worker 10330*333d2b36SAndroid Build Coastguard Worker java_aconfig_library { 10331*333d2b36SAndroid Build Coastguard Worker name: "my_java_aconfig_library_foo", 10332*333d2b36SAndroid Build Coastguard Worker aconfig_declarations: "my_aconfig_declarations_foo", 10333*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10334*333d2b36SAndroid Build Coastguard Worker "myapex", 10335*333d2b36SAndroid Build Coastguard Worker ], 10336*333d2b36SAndroid Build Coastguard Worker } 10337*333d2b36SAndroid Build Coastguard Worker 10338*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 10339*333d2b36SAndroid Build Coastguard Worker name: "my_aconfig_declarations_bar", 10340*333d2b36SAndroid Build Coastguard Worker package: "com.example.package", 10341*333d2b36SAndroid Build Coastguard Worker container: "myapex", 10342*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.aconfig"], 10343*333d2b36SAndroid Build Coastguard Worker } 10344*333d2b36SAndroid Build Coastguard Worker 10345*333d2b36SAndroid Build Coastguard Worker java_aconfig_library { 10346*333d2b36SAndroid Build Coastguard Worker name: "my_java_aconfig_library_bar", 10347*333d2b36SAndroid Build Coastguard Worker aconfig_declarations: "my_aconfig_declarations_bar", 10348*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10349*333d2b36SAndroid Build Coastguard Worker "myapex", 10350*333d2b36SAndroid Build Coastguard Worker ], 10351*333d2b36SAndroid Build Coastguard Worker } 10352*333d2b36SAndroid Build Coastguard Worker `) 10353*333d2b36SAndroid Build Coastguard Worker 10354*333d2b36SAndroid Build Coastguard Worker mod := ctx.ModuleForTests("myapex", "android_common_myapex") 10355*333d2b36SAndroid Build Coastguard Worker s := mod.Rule("apexRule").Args["copy_commands"] 10356*333d2b36SAndroid Build Coastguard Worker copyCmds := regexp.MustCompile(" *&& *").Split(s, -1) 10357*333d2b36SAndroid Build Coastguard Worker if len(copyCmds) != 14 { 10358*333d2b36SAndroid Build Coastguard Worker t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s) 10359*333d2b36SAndroid Build Coastguard Worker } 10360*333d2b36SAndroid Build Coastguard Worker 10361*333d2b36SAndroid Build Coastguard Worker ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb") 10362*333d2b36SAndroid Build Coastguard Worker ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map") 10363*333d2b36SAndroid Build Coastguard Worker ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map") 10364*333d2b36SAndroid Build Coastguard Worker ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val") 10365*333d2b36SAndroid Build Coastguard Worker ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info") 10366*333d2b36SAndroid Build Coastguard Worker 10367*333d2b36SAndroid Build Coastguard Worker inputs := []string{ 10368*333d2b36SAndroid Build Coastguard Worker "my_aconfig_declarations_foo/intermediate.pb", 10369*333d2b36SAndroid Build Coastguard Worker "my_aconfig_declarations_bar/intermediate.pb", 10370*333d2b36SAndroid Build Coastguard Worker } 10371*333d2b36SAndroid Build Coastguard Worker VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "") 10372*333d2b36SAndroid Build Coastguard Worker VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map") 10373*333d2b36SAndroid Build Coastguard Worker VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map") 10374*333d2b36SAndroid Build Coastguard Worker VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val") 10375*333d2b36SAndroid Build Coastguard Worker VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info") 10376*333d2b36SAndroid Build Coastguard Worker} 10377*333d2b36SAndroid Build Coastguard Worker 10378*333d2b36SAndroid Build Coastguard Workerfunc TestAconfigFilesJavaAndCcDeps(t *testing.T) { 10379*333d2b36SAndroid Build Coastguard Worker t.Parallel() 10380*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, apex_default_bp+` 10381*333d2b36SAndroid Build Coastguard Worker apex { 10382*333d2b36SAndroid Build Coastguard Worker name: "myapex", 10383*333d2b36SAndroid Build Coastguard Worker manifest: ":myapex.manifest", 10384*333d2b36SAndroid Build Coastguard Worker androidManifest: ":myapex.androidmanifest", 10385*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 10386*333d2b36SAndroid Build Coastguard Worker java_libs: [ 10387*333d2b36SAndroid Build Coastguard Worker "my_java_library_foo", 10388*333d2b36SAndroid Build Coastguard Worker ], 10389*333d2b36SAndroid Build Coastguard Worker native_shared_libs: [ 10390*333d2b36SAndroid Build Coastguard Worker "my_cc_library_bar", 10391*333d2b36SAndroid Build Coastguard Worker ], 10392*333d2b36SAndroid Build Coastguard Worker binaries: [ 10393*333d2b36SAndroid Build Coastguard Worker "my_cc_binary_baz", 10394*333d2b36SAndroid Build Coastguard Worker ], 10395*333d2b36SAndroid Build Coastguard Worker updatable: false, 10396*333d2b36SAndroid Build Coastguard Worker } 10397*333d2b36SAndroid Build Coastguard Worker 10398*333d2b36SAndroid Build Coastguard Worker java_library { 10399*333d2b36SAndroid Build Coastguard Worker name: "my_java_library_foo", 10400*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 10401*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 10402*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 10403*333d2b36SAndroid Build Coastguard Worker static_libs: ["my_java_aconfig_library_foo"], 10404*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10405*333d2b36SAndroid Build Coastguard Worker "myapex", 10406*333d2b36SAndroid Build Coastguard Worker ], 10407*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 10408*333d2b36SAndroid Build Coastguard Worker } 10409*333d2b36SAndroid Build Coastguard Worker 10410*333d2b36SAndroid Build Coastguard Worker cc_library { 10411*333d2b36SAndroid Build Coastguard Worker name: "my_cc_library_bar", 10412*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.cc"], 10413*333d2b36SAndroid Build Coastguard Worker static_libs: [ 10414*333d2b36SAndroid Build Coastguard Worker "my_cc_aconfig_library_bar", 10415*333d2b36SAndroid Build Coastguard Worker "my_cc_aconfig_library_baz", 10416*333d2b36SAndroid Build Coastguard Worker ], 10417*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10418*333d2b36SAndroid Build Coastguard Worker "myapex", 10419*333d2b36SAndroid Build Coastguard Worker ], 10420*333d2b36SAndroid Build Coastguard Worker } 10421*333d2b36SAndroid Build Coastguard Worker 10422*333d2b36SAndroid Build Coastguard Worker cc_binary { 10423*333d2b36SAndroid Build Coastguard Worker name: "my_cc_binary_baz", 10424*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.cc"], 10425*333d2b36SAndroid Build Coastguard Worker static_libs: ["my_cc_aconfig_library_baz"], 10426*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10427*333d2b36SAndroid Build Coastguard Worker "myapex", 10428*333d2b36SAndroid Build Coastguard Worker ], 10429*333d2b36SAndroid Build Coastguard Worker } 10430*333d2b36SAndroid Build Coastguard Worker 10431*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 10432*333d2b36SAndroid Build Coastguard Worker name: "my_aconfig_declarations_foo", 10433*333d2b36SAndroid Build Coastguard Worker package: "com.example.package", 10434*333d2b36SAndroid Build Coastguard Worker container: "myapex", 10435*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.aconfig"], 10436*333d2b36SAndroid Build Coastguard Worker } 10437*333d2b36SAndroid Build Coastguard Worker 10438*333d2b36SAndroid Build Coastguard Worker java_aconfig_library { 10439*333d2b36SAndroid Build Coastguard Worker name: "my_java_aconfig_library_foo", 10440*333d2b36SAndroid Build Coastguard Worker aconfig_declarations: "my_aconfig_declarations_foo", 10441*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10442*333d2b36SAndroid Build Coastguard Worker "myapex", 10443*333d2b36SAndroid Build Coastguard Worker ], 10444*333d2b36SAndroid Build Coastguard Worker } 10445*333d2b36SAndroid Build Coastguard Worker 10446*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 10447*333d2b36SAndroid Build Coastguard Worker name: "my_aconfig_declarations_bar", 10448*333d2b36SAndroid Build Coastguard Worker package: "com.example.package", 10449*333d2b36SAndroid Build Coastguard Worker container: "myapex", 10450*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.aconfig"], 10451*333d2b36SAndroid Build Coastguard Worker } 10452*333d2b36SAndroid Build Coastguard Worker 10453*333d2b36SAndroid Build Coastguard Worker cc_aconfig_library { 10454*333d2b36SAndroid Build Coastguard Worker name: "my_cc_aconfig_library_bar", 10455*333d2b36SAndroid Build Coastguard Worker aconfig_declarations: "my_aconfig_declarations_bar", 10456*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10457*333d2b36SAndroid Build Coastguard Worker "myapex", 10458*333d2b36SAndroid Build Coastguard Worker ], 10459*333d2b36SAndroid Build Coastguard Worker } 10460*333d2b36SAndroid Build Coastguard Worker 10461*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 10462*333d2b36SAndroid Build Coastguard Worker name: "my_aconfig_declarations_baz", 10463*333d2b36SAndroid Build Coastguard Worker package: "com.example.package", 10464*333d2b36SAndroid Build Coastguard Worker container: "myapex", 10465*333d2b36SAndroid Build Coastguard Worker srcs: ["baz.aconfig"], 10466*333d2b36SAndroid Build Coastguard Worker } 10467*333d2b36SAndroid Build Coastguard Worker 10468*333d2b36SAndroid Build Coastguard Worker cc_aconfig_library { 10469*333d2b36SAndroid Build Coastguard Worker name: "my_cc_aconfig_library_baz", 10470*333d2b36SAndroid Build Coastguard Worker aconfig_declarations: "my_aconfig_declarations_baz", 10471*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10472*333d2b36SAndroid Build Coastguard Worker "myapex", 10473*333d2b36SAndroid Build Coastguard Worker ], 10474*333d2b36SAndroid Build Coastguard Worker } 10475*333d2b36SAndroid Build Coastguard Worker 10476*333d2b36SAndroid Build Coastguard Worker cc_library { 10477*333d2b36SAndroid Build Coastguard Worker name: "server_configurable_flags", 10478*333d2b36SAndroid Build Coastguard Worker srcs: ["server_configurable_flags.cc"], 10479*333d2b36SAndroid Build Coastguard Worker } 10480*333d2b36SAndroid Build Coastguard Worker cc_library { 10481*333d2b36SAndroid Build Coastguard Worker name: "libbase", 10482*333d2b36SAndroid Build Coastguard Worker srcs: ["libbase.cc"], 10483*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10484*333d2b36SAndroid Build Coastguard Worker "myapex", 10485*333d2b36SAndroid Build Coastguard Worker ], 10486*333d2b36SAndroid Build Coastguard Worker } 10487*333d2b36SAndroid Build Coastguard Worker cc_library { 10488*333d2b36SAndroid Build Coastguard Worker name: "libaconfig_storage_read_api_cc", 10489*333d2b36SAndroid Build Coastguard Worker srcs: ["libaconfig_storage_read_api_cc.cc"], 10490*333d2b36SAndroid Build Coastguard Worker } 10491*333d2b36SAndroid Build Coastguard Worker `) 10492*333d2b36SAndroid Build Coastguard Worker 10493*333d2b36SAndroid Build Coastguard Worker mod := ctx.ModuleForTests("myapex", "android_common_myapex") 10494*333d2b36SAndroid Build Coastguard Worker s := mod.Rule("apexRule").Args["copy_commands"] 10495*333d2b36SAndroid Build Coastguard Worker copyCmds := regexp.MustCompile(" *&& *").Split(s, -1) 10496*333d2b36SAndroid Build Coastguard Worker if len(copyCmds) != 18 { 10497*333d2b36SAndroid Build Coastguard Worker t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s) 10498*333d2b36SAndroid Build Coastguard Worker } 10499*333d2b36SAndroid Build Coastguard Worker 10500*333d2b36SAndroid Build Coastguard Worker ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb") 10501*333d2b36SAndroid Build Coastguard Worker ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map") 10502*333d2b36SAndroid Build Coastguard Worker ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map") 10503*333d2b36SAndroid Build Coastguard Worker ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val") 10504*333d2b36SAndroid Build Coastguard Worker ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info") 10505*333d2b36SAndroid Build Coastguard Worker 10506*333d2b36SAndroid Build Coastguard Worker inputs := []string{ 10507*333d2b36SAndroid Build Coastguard Worker "my_aconfig_declarations_foo/intermediate.pb", 10508*333d2b36SAndroid Build Coastguard Worker "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb", 10509*333d2b36SAndroid Build Coastguard Worker "my_aconfig_declarations_baz/intermediate.pb", 10510*333d2b36SAndroid Build Coastguard Worker } 10511*333d2b36SAndroid Build Coastguard Worker VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "") 10512*333d2b36SAndroid Build Coastguard Worker VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map") 10513*333d2b36SAndroid Build Coastguard Worker VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map") 10514*333d2b36SAndroid Build Coastguard Worker VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val") 10515*333d2b36SAndroid Build Coastguard Worker VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info") 10516*333d2b36SAndroid Build Coastguard Worker} 10517*333d2b36SAndroid Build Coastguard Worker 10518*333d2b36SAndroid Build Coastguard Workerfunc TestAconfigFilesRustDeps(t *testing.T) { 10519*333d2b36SAndroid Build Coastguard Worker t.Parallel() 10520*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, apex_default_bp+` 10521*333d2b36SAndroid Build Coastguard Worker apex { 10522*333d2b36SAndroid Build Coastguard Worker name: "myapex", 10523*333d2b36SAndroid Build Coastguard Worker manifest: ":myapex.manifest", 10524*333d2b36SAndroid Build Coastguard Worker androidManifest: ":myapex.androidmanifest", 10525*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 10526*333d2b36SAndroid Build Coastguard Worker native_shared_libs: [ 10527*333d2b36SAndroid Build Coastguard Worker "libmy_rust_library", 10528*333d2b36SAndroid Build Coastguard Worker ], 10529*333d2b36SAndroid Build Coastguard Worker binaries: [ 10530*333d2b36SAndroid Build Coastguard Worker "my_rust_binary", 10531*333d2b36SAndroid Build Coastguard Worker ], 10532*333d2b36SAndroid Build Coastguard Worker rust_dyn_libs: [ 10533*333d2b36SAndroid Build Coastguard Worker "libmy_rust_dylib", 10534*333d2b36SAndroid Build Coastguard Worker ], 10535*333d2b36SAndroid Build Coastguard Worker updatable: false, 10536*333d2b36SAndroid Build Coastguard Worker } 10537*333d2b36SAndroid Build Coastguard Worker 10538*333d2b36SAndroid Build Coastguard Worker rust_library { 10539*333d2b36SAndroid Build Coastguard Worker name: "libflags_rust", // test mock 10540*333d2b36SAndroid Build Coastguard Worker crate_name: "flags_rust", 10541*333d2b36SAndroid Build Coastguard Worker srcs: ["lib.rs"], 10542*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10543*333d2b36SAndroid Build Coastguard Worker "myapex", 10544*333d2b36SAndroid Build Coastguard Worker ], 10545*333d2b36SAndroid Build Coastguard Worker } 10546*333d2b36SAndroid Build Coastguard Worker 10547*333d2b36SAndroid Build Coastguard Worker rust_library { 10548*333d2b36SAndroid Build Coastguard Worker name: "liblazy_static", // test mock 10549*333d2b36SAndroid Build Coastguard Worker crate_name: "lazy_static", 10550*333d2b36SAndroid Build Coastguard Worker srcs: ["src/lib.rs"], 10551*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10552*333d2b36SAndroid Build Coastguard Worker "myapex", 10553*333d2b36SAndroid Build Coastguard Worker ], 10554*333d2b36SAndroid Build Coastguard Worker } 10555*333d2b36SAndroid Build Coastguard Worker 10556*333d2b36SAndroid Build Coastguard Worker rust_library { 10557*333d2b36SAndroid Build Coastguard Worker name: "libaconfig_storage_read_api", // test mock 10558*333d2b36SAndroid Build Coastguard Worker crate_name: "aconfig_storage_read_api", 10559*333d2b36SAndroid Build Coastguard Worker srcs: ["src/lib.rs"], 10560*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10561*333d2b36SAndroid Build Coastguard Worker "myapex", 10562*333d2b36SAndroid Build Coastguard Worker ], 10563*333d2b36SAndroid Build Coastguard Worker } 10564*333d2b36SAndroid Build Coastguard Worker 10565*333d2b36SAndroid Build Coastguard Worker rust_library { 10566*333d2b36SAndroid Build Coastguard Worker name: "liblogger", // test mock 10567*333d2b36SAndroid Build Coastguard Worker crate_name: "logger", 10568*333d2b36SAndroid Build Coastguard Worker srcs: ["src/lib.rs"], 10569*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10570*333d2b36SAndroid Build Coastguard Worker "myapex", 10571*333d2b36SAndroid Build Coastguard Worker ], 10572*333d2b36SAndroid Build Coastguard Worker } 10573*333d2b36SAndroid Build Coastguard Worker 10574*333d2b36SAndroid Build Coastguard Worker rust_library { 10575*333d2b36SAndroid Build Coastguard Worker name: "liblog_rust", // test mock 10576*333d2b36SAndroid Build Coastguard Worker crate_name: "log_rust", 10577*333d2b36SAndroid Build Coastguard Worker srcs: ["src/lib.rs"], 10578*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10579*333d2b36SAndroid Build Coastguard Worker "myapex", 10580*333d2b36SAndroid Build Coastguard Worker ], 10581*333d2b36SAndroid Build Coastguard Worker } 10582*333d2b36SAndroid Build Coastguard Worker 10583*333d2b36SAndroid Build Coastguard Worker rust_ffi_shared { 10584*333d2b36SAndroid Build Coastguard Worker name: "libmy_rust_library", 10585*333d2b36SAndroid Build Coastguard Worker srcs: ["src/lib.rs"], 10586*333d2b36SAndroid Build Coastguard Worker rustlibs: ["libmy_rust_aconfig_library_foo"], 10587*333d2b36SAndroid Build Coastguard Worker crate_name: "my_rust_library", 10588*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10589*333d2b36SAndroid Build Coastguard Worker "myapex", 10590*333d2b36SAndroid Build Coastguard Worker ], 10591*333d2b36SAndroid Build Coastguard Worker } 10592*333d2b36SAndroid Build Coastguard Worker 10593*333d2b36SAndroid Build Coastguard Worker rust_library_dylib { 10594*333d2b36SAndroid Build Coastguard Worker name: "libmy_rust_dylib", 10595*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.rs"], 10596*333d2b36SAndroid Build Coastguard Worker rustlibs: ["libmy_rust_aconfig_library_bar"], 10597*333d2b36SAndroid Build Coastguard Worker crate_name: "my_rust_dylib", 10598*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10599*333d2b36SAndroid Build Coastguard Worker "myapex", 10600*333d2b36SAndroid Build Coastguard Worker ], 10601*333d2b36SAndroid Build Coastguard Worker } 10602*333d2b36SAndroid Build Coastguard Worker 10603*333d2b36SAndroid Build Coastguard Worker rust_binary { 10604*333d2b36SAndroid Build Coastguard Worker name: "my_rust_binary", 10605*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.rs"], 10606*333d2b36SAndroid Build Coastguard Worker rustlibs: [ 10607*333d2b36SAndroid Build Coastguard Worker "libmy_rust_aconfig_library_baz", 10608*333d2b36SAndroid Build Coastguard Worker "libmy_rust_dylib", 10609*333d2b36SAndroid Build Coastguard Worker ], 10610*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10611*333d2b36SAndroid Build Coastguard Worker "myapex", 10612*333d2b36SAndroid Build Coastguard Worker ], 10613*333d2b36SAndroid Build Coastguard Worker } 10614*333d2b36SAndroid Build Coastguard Worker 10615*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 10616*333d2b36SAndroid Build Coastguard Worker name: "my_aconfig_declarations_foo", 10617*333d2b36SAndroid Build Coastguard Worker package: "com.example.package", 10618*333d2b36SAndroid Build Coastguard Worker container: "myapex", 10619*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.aconfig"], 10620*333d2b36SAndroid Build Coastguard Worker } 10621*333d2b36SAndroid Build Coastguard Worker 10622*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 10623*333d2b36SAndroid Build Coastguard Worker name: "my_aconfig_declarations_bar", 10624*333d2b36SAndroid Build Coastguard Worker package: "com.example.package", 10625*333d2b36SAndroid Build Coastguard Worker container: "myapex", 10626*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.aconfig"], 10627*333d2b36SAndroid Build Coastguard Worker } 10628*333d2b36SAndroid Build Coastguard Worker 10629*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 10630*333d2b36SAndroid Build Coastguard Worker name: "my_aconfig_declarations_baz", 10631*333d2b36SAndroid Build Coastguard Worker package: "com.example.package", 10632*333d2b36SAndroid Build Coastguard Worker container: "myapex", 10633*333d2b36SAndroid Build Coastguard Worker srcs: ["baz.aconfig"], 10634*333d2b36SAndroid Build Coastguard Worker } 10635*333d2b36SAndroid Build Coastguard Worker 10636*333d2b36SAndroid Build Coastguard Worker rust_aconfig_library { 10637*333d2b36SAndroid Build Coastguard Worker name: "libmy_rust_aconfig_library_foo", 10638*333d2b36SAndroid Build Coastguard Worker aconfig_declarations: "my_aconfig_declarations_foo", 10639*333d2b36SAndroid Build Coastguard Worker crate_name: "my_rust_aconfig_library_foo", 10640*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10641*333d2b36SAndroid Build Coastguard Worker "myapex", 10642*333d2b36SAndroid Build Coastguard Worker ], 10643*333d2b36SAndroid Build Coastguard Worker } 10644*333d2b36SAndroid Build Coastguard Worker 10645*333d2b36SAndroid Build Coastguard Worker rust_aconfig_library { 10646*333d2b36SAndroid Build Coastguard Worker name: "libmy_rust_aconfig_library_bar", 10647*333d2b36SAndroid Build Coastguard Worker aconfig_declarations: "my_aconfig_declarations_bar", 10648*333d2b36SAndroid Build Coastguard Worker crate_name: "my_rust_aconfig_library_bar", 10649*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10650*333d2b36SAndroid Build Coastguard Worker "myapex", 10651*333d2b36SAndroid Build Coastguard Worker ], 10652*333d2b36SAndroid Build Coastguard Worker } 10653*333d2b36SAndroid Build Coastguard Worker 10654*333d2b36SAndroid Build Coastguard Worker rust_aconfig_library { 10655*333d2b36SAndroid Build Coastguard Worker name: "libmy_rust_aconfig_library_baz", 10656*333d2b36SAndroid Build Coastguard Worker aconfig_declarations: "my_aconfig_declarations_baz", 10657*333d2b36SAndroid Build Coastguard Worker crate_name: "my_rust_aconfig_library_baz", 10658*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10659*333d2b36SAndroid Build Coastguard Worker "myapex", 10660*333d2b36SAndroid Build Coastguard Worker ], 10661*333d2b36SAndroid Build Coastguard Worker } 10662*333d2b36SAndroid Build Coastguard Worker `) 10663*333d2b36SAndroid Build Coastguard Worker 10664*333d2b36SAndroid Build Coastguard Worker mod := ctx.ModuleForTests("myapex", "android_common_myapex") 10665*333d2b36SAndroid Build Coastguard Worker s := mod.Rule("apexRule").Args["copy_commands"] 10666*333d2b36SAndroid Build Coastguard Worker copyCmds := regexp.MustCompile(" *&& *").Split(s, -1) 10667*333d2b36SAndroid Build Coastguard Worker if len(copyCmds) != 38 { 10668*333d2b36SAndroid Build Coastguard Worker t.Fatalf("Expected 38 commands, got %d in:\n%s", len(copyCmds), s) 10669*333d2b36SAndroid Build Coastguard Worker } 10670*333d2b36SAndroid Build Coastguard Worker 10671*333d2b36SAndroid Build Coastguard Worker ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb") 10672*333d2b36SAndroid Build Coastguard Worker ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map") 10673*333d2b36SAndroid Build Coastguard Worker ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map") 10674*333d2b36SAndroid Build Coastguard Worker ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val") 10675*333d2b36SAndroid Build Coastguard Worker ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info") 10676*333d2b36SAndroid Build Coastguard Worker 10677*333d2b36SAndroid Build Coastguard Worker inputs := []string{ 10678*333d2b36SAndroid Build Coastguard Worker "my_aconfig_declarations_foo/intermediate.pb", 10679*333d2b36SAndroid Build Coastguard Worker "my_aconfig_declarations_bar/intermediate.pb", 10680*333d2b36SAndroid Build Coastguard Worker "my_aconfig_declarations_baz/intermediate.pb", 10681*333d2b36SAndroid Build Coastguard Worker "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb", 10682*333d2b36SAndroid Build Coastguard Worker } 10683*333d2b36SAndroid Build Coastguard Worker VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "") 10684*333d2b36SAndroid Build Coastguard Worker VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map") 10685*333d2b36SAndroid Build Coastguard Worker VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map") 10686*333d2b36SAndroid Build Coastguard Worker VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val") 10687*333d2b36SAndroid Build Coastguard Worker VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info") 10688*333d2b36SAndroid Build Coastguard Worker} 10689*333d2b36SAndroid Build Coastguard Worker 10690*333d2b36SAndroid Build Coastguard Workerfunc VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) { 10691*333d2b36SAndroid Build Coastguard Worker aconfigRule := mod.Description(desc) 10692*333d2b36SAndroid Build Coastguard Worker s := " " + aconfigRule.Args["cache_files"] 10693*333d2b36SAndroid Build Coastguard Worker aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:] 10694*333d2b36SAndroid Build Coastguard Worker if len(aconfigArgs) != len(inputs) { 10695*333d2b36SAndroid Build Coastguard Worker t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s) 10696*333d2b36SAndroid Build Coastguard Worker } 10697*333d2b36SAndroid Build Coastguard Worker 10698*333d2b36SAndroid Build Coastguard Worker ensureEquals(t, container, aconfigRule.Args["container"]) 10699*333d2b36SAndroid Build Coastguard Worker ensureEquals(t, file_type, aconfigRule.Args["file_type"]) 10700*333d2b36SAndroid Build Coastguard Worker 10701*333d2b36SAndroid Build Coastguard Worker buildParams := aconfigRule.BuildParams 10702*333d2b36SAndroid Build Coastguard Worker for _, input := range inputs { 10703*333d2b36SAndroid Build Coastguard Worker android.EnsureListContainsSuffix(t, aconfigArgs, input) 10704*333d2b36SAndroid Build Coastguard Worker android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input) 10705*333d2b36SAndroid Build Coastguard Worker } 10706*333d2b36SAndroid Build Coastguard Worker 10707*333d2b36SAndroid Build Coastguard Worker ensureContains(t, buildParams.Output.String(), output) 10708*333d2b36SAndroid Build Coastguard Worker} 10709*333d2b36SAndroid Build Coastguard Worker 10710*333d2b36SAndroid Build Coastguard Workerfunc TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) { 10711*333d2b36SAndroid Build Coastguard Worker t.Parallel() 10712*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, apex_default_bp+` 10713*333d2b36SAndroid Build Coastguard Worker apex { 10714*333d2b36SAndroid Build Coastguard Worker name: "myapex", 10715*333d2b36SAndroid Build Coastguard Worker manifest: ":myapex.manifest", 10716*333d2b36SAndroid Build Coastguard Worker androidManifest: ":myapex.androidmanifest", 10717*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 10718*333d2b36SAndroid Build Coastguard Worker java_libs: [ 10719*333d2b36SAndroid Build Coastguard Worker "my_java_library_foo", 10720*333d2b36SAndroid Build Coastguard Worker "other_java_library_bar", 10721*333d2b36SAndroid Build Coastguard Worker ], 10722*333d2b36SAndroid Build Coastguard Worker updatable: false, 10723*333d2b36SAndroid Build Coastguard Worker } 10724*333d2b36SAndroid Build Coastguard Worker 10725*333d2b36SAndroid Build Coastguard Worker java_library { 10726*333d2b36SAndroid Build Coastguard Worker name: "my_java_library_foo", 10727*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 10728*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 10729*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 10730*333d2b36SAndroid Build Coastguard Worker static_libs: ["my_java_aconfig_library_foo"], 10731*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10732*333d2b36SAndroid Build Coastguard Worker "myapex", 10733*333d2b36SAndroid Build Coastguard Worker ], 10734*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 10735*333d2b36SAndroid Build Coastguard Worker } 10736*333d2b36SAndroid Build Coastguard Worker 10737*333d2b36SAndroid Build Coastguard Worker java_library { 10738*333d2b36SAndroid Build Coastguard Worker name: "other_java_library_bar", 10739*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 10740*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 10741*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 10742*333d2b36SAndroid Build Coastguard Worker static_libs: ["other_java_aconfig_library_bar"], 10743*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10744*333d2b36SAndroid Build Coastguard Worker "myapex", 10745*333d2b36SAndroid Build Coastguard Worker ], 10746*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 10747*333d2b36SAndroid Build Coastguard Worker } 10748*333d2b36SAndroid Build Coastguard Worker 10749*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 10750*333d2b36SAndroid Build Coastguard Worker name: "my_aconfig_declarations_foo", 10751*333d2b36SAndroid Build Coastguard Worker package: "com.example.package", 10752*333d2b36SAndroid Build Coastguard Worker container: "myapex", 10753*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.aconfig"], 10754*333d2b36SAndroid Build Coastguard Worker } 10755*333d2b36SAndroid Build Coastguard Worker 10756*333d2b36SAndroid Build Coastguard Worker java_aconfig_library { 10757*333d2b36SAndroid Build Coastguard Worker name: "my_java_aconfig_library_foo", 10758*333d2b36SAndroid Build Coastguard Worker aconfig_declarations: "my_aconfig_declarations_foo", 10759*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10760*333d2b36SAndroid Build Coastguard Worker "myapex", 10761*333d2b36SAndroid Build Coastguard Worker ], 10762*333d2b36SAndroid Build Coastguard Worker } 10763*333d2b36SAndroid Build Coastguard Worker 10764*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 10765*333d2b36SAndroid Build Coastguard Worker name: "other_aconfig_declarations_bar", 10766*333d2b36SAndroid Build Coastguard Worker package: "com.example.package", 10767*333d2b36SAndroid Build Coastguard Worker container: "otherapex", 10768*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.aconfig"], 10769*333d2b36SAndroid Build Coastguard Worker } 10770*333d2b36SAndroid Build Coastguard Worker 10771*333d2b36SAndroid Build Coastguard Worker java_aconfig_library { 10772*333d2b36SAndroid Build Coastguard Worker name: "other_java_aconfig_library_bar", 10773*333d2b36SAndroid Build Coastguard Worker aconfig_declarations: "other_aconfig_declarations_bar", 10774*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10775*333d2b36SAndroid Build Coastguard Worker "myapex", 10776*333d2b36SAndroid Build Coastguard Worker ], 10777*333d2b36SAndroid Build Coastguard Worker } 10778*333d2b36SAndroid Build Coastguard Worker `) 10779*333d2b36SAndroid Build Coastguard Worker 10780*333d2b36SAndroid Build Coastguard Worker mod := ctx.ModuleForTests("myapex", "android_common_myapex") 10781*333d2b36SAndroid Build Coastguard Worker combineAconfigRule := mod.Rule("All_aconfig_declarations_dump") 10782*333d2b36SAndroid Build Coastguard Worker s := " " + combineAconfigRule.Args["cache_files"] 10783*333d2b36SAndroid Build Coastguard Worker aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:] 10784*333d2b36SAndroid Build Coastguard Worker if len(aconfigArgs) != 1 { 10785*333d2b36SAndroid Build Coastguard Worker t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s) 10786*333d2b36SAndroid Build Coastguard Worker } 10787*333d2b36SAndroid Build Coastguard Worker android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb") 10788*333d2b36SAndroid Build Coastguard Worker 10789*333d2b36SAndroid Build Coastguard Worker buildParams := combineAconfigRule.BuildParams 10790*333d2b36SAndroid Build Coastguard Worker if len(buildParams.Inputs) != 1 { 10791*333d2b36SAndroid Build Coastguard Worker t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs)) 10792*333d2b36SAndroid Build Coastguard Worker } 10793*333d2b36SAndroid Build Coastguard Worker android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb") 10794*333d2b36SAndroid Build Coastguard Worker ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb") 10795*333d2b36SAndroid Build Coastguard Worker} 10796*333d2b36SAndroid Build Coastguard Worker 10797*333d2b36SAndroid Build Coastguard Workerfunc TestAconfigFilesRemoveDuplicates(t *testing.T) { 10798*333d2b36SAndroid Build Coastguard Worker t.Parallel() 10799*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, apex_default_bp+` 10800*333d2b36SAndroid Build Coastguard Worker apex { 10801*333d2b36SAndroid Build Coastguard Worker name: "myapex", 10802*333d2b36SAndroid Build Coastguard Worker manifest: ":myapex.manifest", 10803*333d2b36SAndroid Build Coastguard Worker androidManifest: ":myapex.androidmanifest", 10804*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 10805*333d2b36SAndroid Build Coastguard Worker java_libs: [ 10806*333d2b36SAndroid Build Coastguard Worker "my_java_library_foo", 10807*333d2b36SAndroid Build Coastguard Worker "my_java_library_bar", 10808*333d2b36SAndroid Build Coastguard Worker ], 10809*333d2b36SAndroid Build Coastguard Worker updatable: false, 10810*333d2b36SAndroid Build Coastguard Worker } 10811*333d2b36SAndroid Build Coastguard Worker 10812*333d2b36SAndroid Build Coastguard Worker java_library { 10813*333d2b36SAndroid Build Coastguard Worker name: "my_java_library_foo", 10814*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 10815*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 10816*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 10817*333d2b36SAndroid Build Coastguard Worker static_libs: ["my_java_aconfig_library_foo"], 10818*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10819*333d2b36SAndroid Build Coastguard Worker "myapex", 10820*333d2b36SAndroid Build Coastguard Worker ], 10821*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 10822*333d2b36SAndroid Build Coastguard Worker } 10823*333d2b36SAndroid Build Coastguard Worker 10824*333d2b36SAndroid Build Coastguard Worker java_library { 10825*333d2b36SAndroid Build Coastguard Worker name: "my_java_library_bar", 10826*333d2b36SAndroid Build Coastguard Worker srcs: ["foo/bar/MyClass.java"], 10827*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 10828*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 10829*333d2b36SAndroid Build Coastguard Worker static_libs: ["my_java_aconfig_library_bar"], 10830*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10831*333d2b36SAndroid Build Coastguard Worker "myapex", 10832*333d2b36SAndroid Build Coastguard Worker ], 10833*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 10834*333d2b36SAndroid Build Coastguard Worker } 10835*333d2b36SAndroid Build Coastguard Worker 10836*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 10837*333d2b36SAndroid Build Coastguard Worker name: "my_aconfig_declarations_foo", 10838*333d2b36SAndroid Build Coastguard Worker package: "com.example.package", 10839*333d2b36SAndroid Build Coastguard Worker container: "myapex", 10840*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.aconfig"], 10841*333d2b36SAndroid Build Coastguard Worker } 10842*333d2b36SAndroid Build Coastguard Worker 10843*333d2b36SAndroid Build Coastguard Worker java_aconfig_library { 10844*333d2b36SAndroid Build Coastguard Worker name: "my_java_aconfig_library_foo", 10845*333d2b36SAndroid Build Coastguard Worker aconfig_declarations: "my_aconfig_declarations_foo", 10846*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10847*333d2b36SAndroid Build Coastguard Worker "myapex", 10848*333d2b36SAndroid Build Coastguard Worker ], 10849*333d2b36SAndroid Build Coastguard Worker } 10850*333d2b36SAndroid Build Coastguard Worker 10851*333d2b36SAndroid Build Coastguard Worker java_aconfig_library { 10852*333d2b36SAndroid Build Coastguard Worker name: "my_java_aconfig_library_bar", 10853*333d2b36SAndroid Build Coastguard Worker aconfig_declarations: "my_aconfig_declarations_foo", 10854*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10855*333d2b36SAndroid Build Coastguard Worker "myapex", 10856*333d2b36SAndroid Build Coastguard Worker ], 10857*333d2b36SAndroid Build Coastguard Worker } 10858*333d2b36SAndroid Build Coastguard Worker `) 10859*333d2b36SAndroid Build Coastguard Worker 10860*333d2b36SAndroid Build Coastguard Worker mod := ctx.ModuleForTests("myapex", "android_common_myapex") 10861*333d2b36SAndroid Build Coastguard Worker combineAconfigRule := mod.Rule("All_aconfig_declarations_dump") 10862*333d2b36SAndroid Build Coastguard Worker s := " " + combineAconfigRule.Args["cache_files"] 10863*333d2b36SAndroid Build Coastguard Worker aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:] 10864*333d2b36SAndroid Build Coastguard Worker if len(aconfigArgs) != 1 { 10865*333d2b36SAndroid Build Coastguard Worker t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s) 10866*333d2b36SAndroid Build Coastguard Worker } 10867*333d2b36SAndroid Build Coastguard Worker android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb") 10868*333d2b36SAndroid Build Coastguard Worker 10869*333d2b36SAndroid Build Coastguard Worker buildParams := combineAconfigRule.BuildParams 10870*333d2b36SAndroid Build Coastguard Worker if len(buildParams.Inputs) != 1 { 10871*333d2b36SAndroid Build Coastguard Worker t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs)) 10872*333d2b36SAndroid Build Coastguard Worker } 10873*333d2b36SAndroid Build Coastguard Worker android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb") 10874*333d2b36SAndroid Build Coastguard Worker ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb") 10875*333d2b36SAndroid Build Coastguard Worker} 10876*333d2b36SAndroid Build Coastguard Worker 10877*333d2b36SAndroid Build Coastguard Worker// Test that the boot jars come from the _selected_ apex prebuilt 10878*333d2b36SAndroid Build Coastguard Worker// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config 10879*333d2b36SAndroid Build Coastguard Workerfunc TestBootDexJarsMultipleApexPrebuilts(t *testing.T) { 10880*333d2b36SAndroid Build Coastguard Worker t.Parallel() 10881*333d2b36SAndroid Build Coastguard Worker checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) { 10882*333d2b36SAndroid Build Coastguard Worker t.Helper() 10883*333d2b36SAndroid Build Coastguard Worker s := ctx.ModuleForTests("dex_bootjars", "android_common") 10884*333d2b36SAndroid Build Coastguard Worker foundLibfooJar := false 10885*333d2b36SAndroid Build Coastguard Worker base := stem + ".jar" 10886*333d2b36SAndroid Build Coastguard Worker for _, output := range s.AllOutputs() { 10887*333d2b36SAndroid Build Coastguard Worker if filepath.Base(output) == base { 10888*333d2b36SAndroid Build Coastguard Worker foundLibfooJar = true 10889*333d2b36SAndroid Build Coastguard Worker buildRule := s.Output(output) 10890*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String()) 10891*333d2b36SAndroid Build Coastguard Worker } 10892*333d2b36SAndroid Build Coastguard Worker } 10893*333d2b36SAndroid Build Coastguard Worker if !foundLibfooJar { 10894*333d2b36SAndroid Build Coastguard Worker t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs())) 10895*333d2b36SAndroid Build Coastguard Worker } 10896*333d2b36SAndroid Build Coastguard Worker } 10897*333d2b36SAndroid Build Coastguard Worker 10898*333d2b36SAndroid Build Coastguard Worker // Check that the boot jars of the selected apex are run through boot_jars_package_check 10899*333d2b36SAndroid Build Coastguard Worker // This validates that the jars on the bootclasspath do not contain packages outside an allowlist 10900*333d2b36SAndroid Build Coastguard Worker checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) { 10901*333d2b36SAndroid Build Coastguard Worker platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common") 10902*333d2b36SAndroid Build Coastguard Worker bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check") 10903*333d2b36SAndroid Build Coastguard Worker android.AssertStringMatches(t, "Could not find the correct boot dex jar in package check rule", bootJarsCheckRule.RuleParams.Command, "build/soong/scripts/check_boot_jars/package_allowed_list.txt.*"+expectedBootJar) 10904*333d2b36SAndroid Build Coastguard Worker } 10905*333d2b36SAndroid Build Coastguard Worker 10906*333d2b36SAndroid Build Coastguard Worker // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex 10907*333d2b36SAndroid Build Coastguard Worker checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) { 10908*333d2b36SAndroid Build Coastguard Worker monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command 10909*333d2b36SAndroid Build Coastguard Worker android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar) 10910*333d2b36SAndroid Build Coastguard Worker } 10911*333d2b36SAndroid Build Coastguard Worker 10912*333d2b36SAndroid Build Coastguard Worker bp := ` 10913*333d2b36SAndroid Build Coastguard Worker // Source APEX. 10914*333d2b36SAndroid Build Coastguard Worker 10915*333d2b36SAndroid Build Coastguard Worker java_library { 10916*333d2b36SAndroid Build Coastguard Worker name: "framework-foo", 10917*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 10918*333d2b36SAndroid Build Coastguard Worker installable: true, 10919*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10920*333d2b36SAndroid Build Coastguard Worker "com.android.foo", 10921*333d2b36SAndroid Build Coastguard Worker ], 10922*333d2b36SAndroid Build Coastguard Worker } 10923*333d2b36SAndroid Build Coastguard Worker 10924*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragment { 10925*333d2b36SAndroid Build Coastguard Worker name: "foo-bootclasspath-fragment", 10926*333d2b36SAndroid Build Coastguard Worker contents: ["framework-foo"], 10927*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10928*333d2b36SAndroid Build Coastguard Worker "com.android.foo", 10929*333d2b36SAndroid Build Coastguard Worker ], 10930*333d2b36SAndroid Build Coastguard Worker hidden_api: { 10931*333d2b36SAndroid Build Coastguard Worker split_packages: ["*"], 10932*333d2b36SAndroid Build Coastguard Worker }, 10933*333d2b36SAndroid Build Coastguard Worker } 10934*333d2b36SAndroid Build Coastguard Worker 10935*333d2b36SAndroid Build Coastguard Worker apex_key { 10936*333d2b36SAndroid Build Coastguard Worker name: "com.android.foo.key", 10937*333d2b36SAndroid Build Coastguard Worker public_key: "com.android.foo.avbpubkey", 10938*333d2b36SAndroid Build Coastguard Worker private_key: "com.android.foo.pem", 10939*333d2b36SAndroid Build Coastguard Worker } 10940*333d2b36SAndroid Build Coastguard Worker 10941*333d2b36SAndroid Build Coastguard Worker apex { 10942*333d2b36SAndroid Build Coastguard Worker name: "com.android.foo", 10943*333d2b36SAndroid Build Coastguard Worker key: "com.android.foo.key", 10944*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragments: ["foo-bootclasspath-fragment"], 10945*333d2b36SAndroid Build Coastguard Worker updatable: false, 10946*333d2b36SAndroid Build Coastguard Worker } 10947*333d2b36SAndroid Build Coastguard Worker 10948*333d2b36SAndroid Build Coastguard Worker // Prebuilt APEX. 10949*333d2b36SAndroid Build Coastguard Worker 10950*333d2b36SAndroid Build Coastguard Worker java_sdk_library_import { 10951*333d2b36SAndroid Build Coastguard Worker name: "framework-foo", 10952*333d2b36SAndroid Build Coastguard Worker public: { 10953*333d2b36SAndroid Build Coastguard Worker jars: ["foo.jar"], 10954*333d2b36SAndroid Build Coastguard Worker }, 10955*333d2b36SAndroid Build Coastguard Worker apex_available: ["com.android.foo"], 10956*333d2b36SAndroid Build Coastguard Worker shared_library: false, 10957*333d2b36SAndroid Build Coastguard Worker } 10958*333d2b36SAndroid Build Coastguard Worker 10959*333d2b36SAndroid Build Coastguard Worker prebuilt_bootclasspath_fragment { 10960*333d2b36SAndroid Build Coastguard Worker name: "foo-bootclasspath-fragment", 10961*333d2b36SAndroid Build Coastguard Worker contents: ["framework-foo"], 10962*333d2b36SAndroid Build Coastguard Worker hidden_api: { 10963*333d2b36SAndroid Build Coastguard Worker annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv", 10964*333d2b36SAndroid Build Coastguard Worker metadata: "my-bootclasspath-fragment/metadata.csv", 10965*333d2b36SAndroid Build Coastguard Worker index: "my-bootclasspath-fragment/index.csv", 10966*333d2b36SAndroid Build Coastguard Worker stub_flags: "my-bootclasspath-fragment/stub-flags.csv", 10967*333d2b36SAndroid Build Coastguard Worker all_flags: "my-bootclasspath-fragment/all-flags.csv", 10968*333d2b36SAndroid Build Coastguard Worker }, 10969*333d2b36SAndroid Build Coastguard Worker apex_available: [ 10970*333d2b36SAndroid Build Coastguard Worker "com.android.foo", 10971*333d2b36SAndroid Build Coastguard Worker ], 10972*333d2b36SAndroid Build Coastguard Worker } 10973*333d2b36SAndroid Build Coastguard Worker 10974*333d2b36SAndroid Build Coastguard Worker prebuilt_apex { 10975*333d2b36SAndroid Build Coastguard Worker name: "com.android.foo", 10976*333d2b36SAndroid Build Coastguard Worker apex_name: "com.android.foo", 10977*333d2b36SAndroid Build Coastguard Worker src: "com.android.foo-arm.apex", 10978*333d2b36SAndroid Build Coastguard Worker exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"], 10979*333d2b36SAndroid Build Coastguard Worker } 10980*333d2b36SAndroid Build Coastguard Worker 10981*333d2b36SAndroid Build Coastguard Worker // Another Prebuilt ART APEX 10982*333d2b36SAndroid Build Coastguard Worker prebuilt_apex { 10983*333d2b36SAndroid Build Coastguard Worker name: "com.android.foo.v2", 10984*333d2b36SAndroid Build Coastguard Worker apex_name: "com.android.foo", // Used to determine the API domain 10985*333d2b36SAndroid Build Coastguard Worker src: "com.android.foo-arm.apex", 10986*333d2b36SAndroid Build Coastguard Worker exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"], 10987*333d2b36SAndroid Build Coastguard Worker } 10988*333d2b36SAndroid Build Coastguard Worker 10989*333d2b36SAndroid Build Coastguard Worker // APEX contribution modules 10990*333d2b36SAndroid Build Coastguard Worker 10991*333d2b36SAndroid Build Coastguard Worker apex_contributions { 10992*333d2b36SAndroid Build Coastguard Worker name: "foo.source.contributions", 10993*333d2b36SAndroid Build Coastguard Worker api_domain: "com.android.foo", 10994*333d2b36SAndroid Build Coastguard Worker contents: ["com.android.foo"], 10995*333d2b36SAndroid Build Coastguard Worker } 10996*333d2b36SAndroid Build Coastguard Worker 10997*333d2b36SAndroid Build Coastguard Worker apex_contributions { 10998*333d2b36SAndroid Build Coastguard Worker name: "foo.prebuilt.contributions", 10999*333d2b36SAndroid Build Coastguard Worker api_domain: "com.android.foo", 11000*333d2b36SAndroid Build Coastguard Worker contents: ["prebuilt_com.android.foo"], 11001*333d2b36SAndroid Build Coastguard Worker } 11002*333d2b36SAndroid Build Coastguard Worker 11003*333d2b36SAndroid Build Coastguard Worker apex_contributions { 11004*333d2b36SAndroid Build Coastguard Worker name: "foo.prebuilt.v2.contributions", 11005*333d2b36SAndroid Build Coastguard Worker api_domain: "com.android.foo", 11006*333d2b36SAndroid Build Coastguard Worker contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator 11007*333d2b36SAndroid Build Coastguard Worker } 11008*333d2b36SAndroid Build Coastguard Worker ` 11009*333d2b36SAndroid Build Coastguard Worker 11010*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 11011*333d2b36SAndroid Build Coastguard Worker desc string 11012*333d2b36SAndroid Build Coastguard Worker selectedApexContributions string 11013*333d2b36SAndroid Build Coastguard Worker expectedBootJar string 11014*333d2b36SAndroid Build Coastguard Worker }{ 11015*333d2b36SAndroid Build Coastguard Worker { 11016*333d2b36SAndroid Build Coastguard Worker desc: "Source apex com.android.foo is selected, bootjar should come from source java library", 11017*333d2b36SAndroid Build Coastguard Worker selectedApexContributions: "foo.source.contributions", 11018*333d2b36SAndroid Build Coastguard Worker expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar", 11019*333d2b36SAndroid Build Coastguard Worker }, 11020*333d2b36SAndroid Build Coastguard Worker { 11021*333d2b36SAndroid Build Coastguard Worker desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt", 11022*333d2b36SAndroid Build Coastguard Worker selectedApexContributions: "foo.prebuilt.contributions", 11023*333d2b36SAndroid Build Coastguard Worker expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo/android_common_com.android.foo/deapexer/javalib/framework-foo.jar", 11024*333d2b36SAndroid Build Coastguard Worker }, 11025*333d2b36SAndroid Build Coastguard Worker { 11026*333d2b36SAndroid Build Coastguard Worker desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt", 11027*333d2b36SAndroid Build Coastguard Worker selectedApexContributions: "foo.prebuilt.v2.contributions", 11028*333d2b36SAndroid Build Coastguard Worker expectedBootJar: "out/soong/.intermediates/com.android.foo.v2/android_common_com.android.foo/deapexer/javalib/framework-foo.jar", 11029*333d2b36SAndroid Build Coastguard Worker }, 11030*333d2b36SAndroid Build Coastguard Worker } 11031*333d2b36SAndroid Build Coastguard Worker 11032*333d2b36SAndroid Build Coastguard Worker fragment := java.ApexVariantReference{ 11033*333d2b36SAndroid Build Coastguard Worker Apex: proptools.StringPtr("com.android.foo"), 11034*333d2b36SAndroid Build Coastguard Worker Module: proptools.StringPtr("foo-bootclasspath-fragment"), 11035*333d2b36SAndroid Build Coastguard Worker } 11036*333d2b36SAndroid Build Coastguard Worker 11037*333d2b36SAndroid Build Coastguard Worker for _, tc := range testCases { 11038*333d2b36SAndroid Build Coastguard Worker preparer := android.GroupFixturePreparers( 11039*333d2b36SAndroid Build Coastguard Worker java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"), 11040*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs(map[string][]byte{ 11041*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/com.android.foo-file_contexts": nil, 11042*333d2b36SAndroid Build Coastguard Worker }), 11043*333d2b36SAndroid Build Coastguard Worker // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi 11044*333d2b36SAndroid Build Coastguard Worker // file creation. 11045*333d2b36SAndroid Build Coastguard Worker java.FixtureConfigureBootJars("platform:foo"), 11046*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyMockFS(func(fs android.MockFS) { 11047*333d2b36SAndroid Build Coastguard Worker fs["platform/Android.bp"] = []byte(` 11048*333d2b36SAndroid Build Coastguard Worker java_library { 11049*333d2b36SAndroid Build Coastguard Worker name: "foo", 11050*333d2b36SAndroid Build Coastguard Worker srcs: ["Test.java"], 11051*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 11052*333d2b36SAndroid Build Coastguard Worker } 11053*333d2b36SAndroid Build Coastguard Worker `) 11054*333d2b36SAndroid Build Coastguard Worker fs["platform/Test.java"] = nil 11055*333d2b36SAndroid Build Coastguard Worker }), 11056*333d2b36SAndroid Build Coastguard Worker 11057*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions), 11058*333d2b36SAndroid Build Coastguard Worker ) 11059*333d2b36SAndroid Build Coastguard Worker ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment) 11060*333d2b36SAndroid Build Coastguard Worker checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar) 11061*333d2b36SAndroid Build Coastguard Worker checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar) 11062*333d2b36SAndroid Build Coastguard Worker checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar) 11063*333d2b36SAndroid Build Coastguard Worker } 11064*333d2b36SAndroid Build Coastguard Worker} 11065*333d2b36SAndroid Build Coastguard Worker 11066*333d2b36SAndroid Build Coastguard Worker// Test that product packaging installs the selected mainline module (either source or a specific prebuilt) 11067*333d2b36SAndroid Build Coastguard Worker// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config 11068*333d2b36SAndroid Build Coastguard Workerfunc TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) { 11069*333d2b36SAndroid Build Coastguard Worker t.Parallel() 11070*333d2b36SAndroid Build Coastguard Worker // for a mainline module family, check that only the flagged soong module is visible to make 11071*333d2b36SAndroid Build Coastguard Worker checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) { 11072*333d2b36SAndroid Build Coastguard Worker variation := func(moduleName string) string { 11073*333d2b36SAndroid Build Coastguard Worker ret := "android_common_com.android.foo" 11074*333d2b36SAndroid Build Coastguard Worker if moduleName == "com.google.android.foo" { 11075*333d2b36SAndroid Build Coastguard Worker ret = "android_common_com.google.android.foo_com.google.android.foo" 11076*333d2b36SAndroid Build Coastguard Worker } 11077*333d2b36SAndroid Build Coastguard Worker return ret 11078*333d2b36SAndroid Build Coastguard Worker } 11079*333d2b36SAndroid Build Coastguard Worker 11080*333d2b36SAndroid Build Coastguard Worker visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module() 11081*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake()) 11082*333d2b36SAndroid Build Coastguard Worker 11083*333d2b36SAndroid Build Coastguard Worker for _, hiddenModuleName := range hiddenModuleNames { 11084*333d2b36SAndroid Build Coastguard Worker hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module() 11085*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake()) 11086*333d2b36SAndroid Build Coastguard Worker 11087*333d2b36SAndroid Build Coastguard Worker } 11088*333d2b36SAndroid Build Coastguard Worker } 11089*333d2b36SAndroid Build Coastguard Worker 11090*333d2b36SAndroid Build Coastguard Worker bp := ` 11091*333d2b36SAndroid Build Coastguard Worker apex_key { 11092*333d2b36SAndroid Build Coastguard Worker name: "com.android.foo.key", 11093*333d2b36SAndroid Build Coastguard Worker public_key: "com.android.foo.avbpubkey", 11094*333d2b36SAndroid Build Coastguard Worker private_key: "com.android.foo.pem", 11095*333d2b36SAndroid Build Coastguard Worker } 11096*333d2b36SAndroid Build Coastguard Worker 11097*333d2b36SAndroid Build Coastguard Worker // AOSP source apex 11098*333d2b36SAndroid Build Coastguard Worker apex { 11099*333d2b36SAndroid Build Coastguard Worker name: "com.android.foo", 11100*333d2b36SAndroid Build Coastguard Worker key: "com.android.foo.key", 11101*333d2b36SAndroid Build Coastguard Worker updatable: false, 11102*333d2b36SAndroid Build Coastguard Worker } 11103*333d2b36SAndroid Build Coastguard Worker 11104*333d2b36SAndroid Build Coastguard Worker // Google source apex 11105*333d2b36SAndroid Build Coastguard Worker override_apex { 11106*333d2b36SAndroid Build Coastguard Worker name: "com.google.android.foo", 11107*333d2b36SAndroid Build Coastguard Worker base: "com.android.foo", 11108*333d2b36SAndroid Build Coastguard Worker key: "com.android.foo.key", 11109*333d2b36SAndroid Build Coastguard Worker } 11110*333d2b36SAndroid Build Coastguard Worker 11111*333d2b36SAndroid Build Coastguard Worker // Prebuilt Google APEX. 11112*333d2b36SAndroid Build Coastguard Worker 11113*333d2b36SAndroid Build Coastguard Worker prebuilt_apex { 11114*333d2b36SAndroid Build Coastguard Worker name: "com.google.android.foo", 11115*333d2b36SAndroid Build Coastguard Worker apex_name: "com.android.foo", 11116*333d2b36SAndroid Build Coastguard Worker src: "com.android.foo-arm.apex", 11117*333d2b36SAndroid Build Coastguard Worker prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present 11118*333d2b36SAndroid Build Coastguard Worker } 11119*333d2b36SAndroid Build Coastguard Worker 11120*333d2b36SAndroid Build Coastguard Worker // Another Prebuilt Google APEX 11121*333d2b36SAndroid Build Coastguard Worker prebuilt_apex { 11122*333d2b36SAndroid Build Coastguard Worker name: "com.google.android.foo.v2", 11123*333d2b36SAndroid Build Coastguard Worker apex_name: "com.android.foo", 11124*333d2b36SAndroid Build Coastguard Worker source_apex_name: "com.google.android.foo", 11125*333d2b36SAndroid Build Coastguard Worker src: "com.android.foo-arm.apex", 11126*333d2b36SAndroid Build Coastguard Worker prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present 11127*333d2b36SAndroid Build Coastguard Worker } 11128*333d2b36SAndroid Build Coastguard Worker 11129*333d2b36SAndroid Build Coastguard Worker // APEX contribution modules 11130*333d2b36SAndroid Build Coastguard Worker 11131*333d2b36SAndroid Build Coastguard Worker apex_contributions { 11132*333d2b36SAndroid Build Coastguard Worker name: "foo.source.contributions", 11133*333d2b36SAndroid Build Coastguard Worker api_domain: "com.android.foo", 11134*333d2b36SAndroid Build Coastguard Worker contents: ["com.google.android.foo"], 11135*333d2b36SAndroid Build Coastguard Worker } 11136*333d2b36SAndroid Build Coastguard Worker 11137*333d2b36SAndroid Build Coastguard Worker apex_contributions { 11138*333d2b36SAndroid Build Coastguard Worker name: "foo.prebuilt.contributions", 11139*333d2b36SAndroid Build Coastguard Worker api_domain: "com.android.foo", 11140*333d2b36SAndroid Build Coastguard Worker contents: ["prebuilt_com.google.android.foo"], 11141*333d2b36SAndroid Build Coastguard Worker } 11142*333d2b36SAndroid Build Coastguard Worker 11143*333d2b36SAndroid Build Coastguard Worker apex_contributions { 11144*333d2b36SAndroid Build Coastguard Worker name: "foo.prebuilt.v2.contributions", 11145*333d2b36SAndroid Build Coastguard Worker api_domain: "com.android.foo", 11146*333d2b36SAndroid Build Coastguard Worker contents: ["prebuilt_com.google.android.foo.v2"], 11147*333d2b36SAndroid Build Coastguard Worker } 11148*333d2b36SAndroid Build Coastguard Worker 11149*333d2b36SAndroid Build Coastguard Worker // This is an incompatible module because it selects multiple versions of the same mainline module 11150*333d2b36SAndroid Build Coastguard Worker apex_contributions { 11151*333d2b36SAndroid Build Coastguard Worker name: "foo.prebuilt.duplicate.contributions", 11152*333d2b36SAndroid Build Coastguard Worker api_domain: "com.android.foo", 11153*333d2b36SAndroid Build Coastguard Worker contents: [ 11154*333d2b36SAndroid Build Coastguard Worker "prebuilt_com.google.android.foo", 11155*333d2b36SAndroid Build Coastguard Worker "prebuilt_com.google.android.foo.v2", 11156*333d2b36SAndroid Build Coastguard Worker ], 11157*333d2b36SAndroid Build Coastguard Worker } 11158*333d2b36SAndroid Build Coastguard Worker ` 11159*333d2b36SAndroid Build Coastguard Worker 11160*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 11161*333d2b36SAndroid Build Coastguard Worker desc string 11162*333d2b36SAndroid Build Coastguard Worker selectedApexContributions string 11163*333d2b36SAndroid Build Coastguard Worker expectedVisibleModuleName string 11164*333d2b36SAndroid Build Coastguard Worker expectedHiddenModuleNames []string 11165*333d2b36SAndroid Build Coastguard Worker expectedError string 11166*333d2b36SAndroid Build Coastguard Worker }{ 11167*333d2b36SAndroid Build Coastguard Worker { 11168*333d2b36SAndroid Build Coastguard Worker desc: "Source apex is selected, prebuilts should be hidden from make", 11169*333d2b36SAndroid Build Coastguard Worker selectedApexContributions: "foo.source.contributions", 11170*333d2b36SAndroid Build Coastguard Worker expectedVisibleModuleName: "com.google.android.foo", 11171*333d2b36SAndroid Build Coastguard Worker expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"}, 11172*333d2b36SAndroid Build Coastguard Worker }, 11173*333d2b36SAndroid Build Coastguard Worker { 11174*333d2b36SAndroid Build Coastguard Worker desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make", 11175*333d2b36SAndroid Build Coastguard Worker selectedApexContributions: "foo.prebuilt.contributions", 11176*333d2b36SAndroid Build Coastguard Worker expectedVisibleModuleName: "prebuilt_com.google.android.foo", 11177*333d2b36SAndroid Build Coastguard Worker expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"}, 11178*333d2b36SAndroid Build Coastguard Worker }, 11179*333d2b36SAndroid Build Coastguard Worker { 11180*333d2b36SAndroid Build Coastguard Worker desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make", 11181*333d2b36SAndroid Build Coastguard Worker selectedApexContributions: "foo.prebuilt.v2.contributions", 11182*333d2b36SAndroid Build Coastguard Worker expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2", 11183*333d2b36SAndroid Build Coastguard Worker expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"}, 11184*333d2b36SAndroid Build Coastguard Worker }, 11185*333d2b36SAndroid Build Coastguard Worker { 11186*333d2b36SAndroid Build Coastguard Worker desc: "Multiple versions of a prebuilt apex is selected in the same release config", 11187*333d2b36SAndroid Build Coastguard Worker selectedApexContributions: "foo.prebuilt.duplicate.contributions", 11188*333d2b36SAndroid Build Coastguard Worker expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2", 11189*333d2b36SAndroid Build Coastguard Worker }, 11190*333d2b36SAndroid Build Coastguard Worker } 11191*333d2b36SAndroid Build Coastguard Worker 11192*333d2b36SAndroid Build Coastguard Worker for _, tc := range testCases { 11193*333d2b36SAndroid Build Coastguard Worker preparer := android.GroupFixturePreparers( 11194*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs(map[string][]byte{ 11195*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/com.android.foo-file_contexts": nil, 11196*333d2b36SAndroid Build Coastguard Worker }), 11197*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions), 11198*333d2b36SAndroid Build Coastguard Worker ) 11199*333d2b36SAndroid Build Coastguard Worker if tc.expectedError != "" { 11200*333d2b36SAndroid Build Coastguard Worker preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError)) 11201*333d2b36SAndroid Build Coastguard Worker testApex(t, bp, preparer) 11202*333d2b36SAndroid Build Coastguard Worker return 11203*333d2b36SAndroid Build Coastguard Worker } 11204*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, bp, preparer) 11205*333d2b36SAndroid Build Coastguard Worker 11206*333d2b36SAndroid Build Coastguard Worker // Check that 11207*333d2b36SAndroid Build Coastguard Worker // 1. The contents of the selected apex_contributions are visible to make 11208*333d2b36SAndroid Build Coastguard Worker // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make 11209*333d2b36SAndroid Build Coastguard Worker checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames) 11210*333d2b36SAndroid Build Coastguard Worker } 11211*333d2b36SAndroid Build Coastguard Worker} 11212*333d2b36SAndroid Build Coastguard Worker 11213*333d2b36SAndroid Build Coastguard Worker// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module 11214*333d2b36SAndroid Build Coastguard Workerfunc TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) { 11215*333d2b36SAndroid Build Coastguard Worker t.Parallel() 11216*333d2b36SAndroid Build Coastguard Worker // for a mainline module family, check that only the flagged soong module is visible to make 11217*333d2b36SAndroid Build Coastguard Worker checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) { 11218*333d2b36SAndroid Build Coastguard Worker variation := func(moduleName string) string { 11219*333d2b36SAndroid Build Coastguard Worker ret := "android_common_com.android.adservices" 11220*333d2b36SAndroid Build Coastguard Worker if moduleName == "com.google.android.foo" { 11221*333d2b36SAndroid Build Coastguard Worker ret = "android_common_com.google.android.foo_com.google.android.foo" 11222*333d2b36SAndroid Build Coastguard Worker } 11223*333d2b36SAndroid Build Coastguard Worker return ret 11224*333d2b36SAndroid Build Coastguard Worker } 11225*333d2b36SAndroid Build Coastguard Worker 11226*333d2b36SAndroid Build Coastguard Worker for _, visibleModuleName := range visibleModuleNames { 11227*333d2b36SAndroid Build Coastguard Worker visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module() 11228*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake()) 11229*333d2b36SAndroid Build Coastguard Worker } 11230*333d2b36SAndroid Build Coastguard Worker 11231*333d2b36SAndroid Build Coastguard Worker for _, hiddenModuleName := range hiddenModuleNames { 11232*333d2b36SAndroid Build Coastguard Worker hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module() 11233*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake()) 11234*333d2b36SAndroid Build Coastguard Worker 11235*333d2b36SAndroid Build Coastguard Worker } 11236*333d2b36SAndroid Build Coastguard Worker } 11237*333d2b36SAndroid Build Coastguard Worker 11238*333d2b36SAndroid Build Coastguard Worker bp := ` 11239*333d2b36SAndroid Build Coastguard Worker apex_key { 11240*333d2b36SAndroid Build Coastguard Worker name: "com.android.adservices.key", 11241*333d2b36SAndroid Build Coastguard Worker public_key: "com.android.adservices.avbpubkey", 11242*333d2b36SAndroid Build Coastguard Worker private_key: "com.android.adservices.pem", 11243*333d2b36SAndroid Build Coastguard Worker } 11244*333d2b36SAndroid Build Coastguard Worker 11245*333d2b36SAndroid Build Coastguard Worker // AOSP source apex 11246*333d2b36SAndroid Build Coastguard Worker apex { 11247*333d2b36SAndroid Build Coastguard Worker name: "com.android.adservices", 11248*333d2b36SAndroid Build Coastguard Worker key: "com.android.adservices.key", 11249*333d2b36SAndroid Build Coastguard Worker updatable: false, 11250*333d2b36SAndroid Build Coastguard Worker } 11251*333d2b36SAndroid Build Coastguard Worker 11252*333d2b36SAndroid Build Coastguard Worker // Prebuilt Google APEX. 11253*333d2b36SAndroid Build Coastguard Worker 11254*333d2b36SAndroid Build Coastguard Worker prebuilt_apex { 11255*333d2b36SAndroid Build Coastguard Worker name: "com.google.android.adservices", 11256*333d2b36SAndroid Build Coastguard Worker apex_name: "com.android.adservices", 11257*333d2b36SAndroid Build Coastguard Worker src: "com.android.foo-arm.apex", 11258*333d2b36SAndroid Build Coastguard Worker } 11259*333d2b36SAndroid Build Coastguard Worker 11260*333d2b36SAndroid Build Coastguard Worker // Another Prebuilt Google APEX 11261*333d2b36SAndroid Build Coastguard Worker prebuilt_apex { 11262*333d2b36SAndroid Build Coastguard Worker name: "com.google.android.adservices.v2", 11263*333d2b36SAndroid Build Coastguard Worker apex_name: "com.android.adservices", 11264*333d2b36SAndroid Build Coastguard Worker src: "com.android.foo-arm.apex", 11265*333d2b36SAndroid Build Coastguard Worker } 11266*333d2b36SAndroid Build Coastguard Worker 11267*333d2b36SAndroid Build Coastguard Worker // APEX contribution modules 11268*333d2b36SAndroid Build Coastguard Worker 11269*333d2b36SAndroid Build Coastguard Worker 11270*333d2b36SAndroid Build Coastguard Worker apex_contributions { 11271*333d2b36SAndroid Build Coastguard Worker name: "adservices.prebuilt.contributions", 11272*333d2b36SAndroid Build Coastguard Worker api_domain: "com.android.adservices", 11273*333d2b36SAndroid Build Coastguard Worker contents: ["prebuilt_com.google.android.adservices"], 11274*333d2b36SAndroid Build Coastguard Worker } 11275*333d2b36SAndroid Build Coastguard Worker 11276*333d2b36SAndroid Build Coastguard Worker apex_contributions { 11277*333d2b36SAndroid Build Coastguard Worker name: "adservices.prebuilt.v2.contributions", 11278*333d2b36SAndroid Build Coastguard Worker api_domain: "com.android.adservices", 11279*333d2b36SAndroid Build Coastguard Worker contents: ["prebuilt_com.google.android.adservices.v2"], 11280*333d2b36SAndroid Build Coastguard Worker } 11281*333d2b36SAndroid Build Coastguard Worker ` 11282*333d2b36SAndroid Build Coastguard Worker 11283*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 11284*333d2b36SAndroid Build Coastguard Worker desc string 11285*333d2b36SAndroid Build Coastguard Worker selectedApexContributions string 11286*333d2b36SAndroid Build Coastguard Worker expectedVisibleModuleNames []string 11287*333d2b36SAndroid Build Coastguard Worker expectedHiddenModuleNames []string 11288*333d2b36SAndroid Build Coastguard Worker }{ 11289*333d2b36SAndroid Build Coastguard Worker { 11290*333d2b36SAndroid Build Coastguard Worker desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden", 11291*333d2b36SAndroid Build Coastguard Worker selectedApexContributions: "", 11292*333d2b36SAndroid Build Coastguard Worker expectedVisibleModuleNames: []string{"com.android.adservices"}, 11293*333d2b36SAndroid Build Coastguard Worker expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"}, 11294*333d2b36SAndroid Build Coastguard Worker }, 11295*333d2b36SAndroid Build Coastguard Worker { 11296*333d2b36SAndroid Build Coastguard Worker desc: "Prebuilt apex prebuilt_com.android.foo is selected", 11297*333d2b36SAndroid Build Coastguard Worker selectedApexContributions: "adservices.prebuilt.contributions", 11298*333d2b36SAndroid Build Coastguard Worker expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"}, 11299*333d2b36SAndroid Build Coastguard Worker expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"}, 11300*333d2b36SAndroid Build Coastguard Worker }, 11301*333d2b36SAndroid Build Coastguard Worker { 11302*333d2b36SAndroid Build Coastguard Worker desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected", 11303*333d2b36SAndroid Build Coastguard Worker selectedApexContributions: "adservices.prebuilt.v2.contributions", 11304*333d2b36SAndroid Build Coastguard Worker expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"}, 11305*333d2b36SAndroid Build Coastguard Worker expectedHiddenModuleNames: []string{"com.google.android.adservices"}, 11306*333d2b36SAndroid Build Coastguard Worker }, 11307*333d2b36SAndroid Build Coastguard Worker } 11308*333d2b36SAndroid Build Coastguard Worker 11309*333d2b36SAndroid Build Coastguard Worker for _, tc := range testCases { 11310*333d2b36SAndroid Build Coastguard Worker preparer := android.GroupFixturePreparers( 11311*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs(map[string][]byte{ 11312*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/com.android.adservices-file_contexts": nil, 11313*333d2b36SAndroid Build Coastguard Worker }), 11314*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions), 11315*333d2b36SAndroid Build Coastguard Worker ) 11316*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, bp, preparer) 11317*333d2b36SAndroid Build Coastguard Worker 11318*333d2b36SAndroid Build Coastguard Worker checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames) 11319*333d2b36SAndroid Build Coastguard Worker } 11320*333d2b36SAndroid Build Coastguard Worker} 11321*333d2b36SAndroid Build Coastguard Worker 11322*333d2b36SAndroid Build Coastguard Workerfunc TestAconfifDeclarationsValidation(t *testing.T) { 11323*333d2b36SAndroid Build Coastguard Worker t.Parallel() 11324*333d2b36SAndroid Build Coastguard Worker aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) { 11325*333d2b36SAndroid Build Coastguard Worker for _, moduleName := range moduleNames { 11326*333d2b36SAndroid Build Coastguard Worker ret += fmt.Sprintf(` 11327*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 11328*333d2b36SAndroid Build Coastguard Worker name: "%[1]s", 11329*333d2b36SAndroid Build Coastguard Worker package: "com.example.package", 11330*333d2b36SAndroid Build Coastguard Worker container: "system", 11331*333d2b36SAndroid Build Coastguard Worker srcs: [ 11332*333d2b36SAndroid Build Coastguard Worker "%[1]s.aconfig", 11333*333d2b36SAndroid Build Coastguard Worker ], 11334*333d2b36SAndroid Build Coastguard Worker } 11335*333d2b36SAndroid Build Coastguard Worker java_aconfig_library { 11336*333d2b36SAndroid Build Coastguard Worker name: "%[1]s-lib", 11337*333d2b36SAndroid Build Coastguard Worker aconfig_declarations: "%[1]s", 11338*333d2b36SAndroid Build Coastguard Worker } 11339*333d2b36SAndroid Build Coastguard Worker `, moduleName) 11340*333d2b36SAndroid Build Coastguard Worker } 11341*333d2b36SAndroid Build Coastguard Worker return ret 11342*333d2b36SAndroid Build Coastguard Worker } 11343*333d2b36SAndroid Build Coastguard Worker 11344*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 11345*333d2b36SAndroid Build Coastguard Worker prepareForApexTest, 11346*333d2b36SAndroid Build Coastguard Worker java.PrepareForTestWithJavaSdkLibraryFiles, 11347*333d2b36SAndroid Build Coastguard Worker java.FixtureWithLastReleaseApis("foo"), 11348*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 11349*333d2b36SAndroid Build Coastguard Worker java_library { 11350*333d2b36SAndroid Build Coastguard Worker name: "baz-java-lib", 11351*333d2b36SAndroid Build Coastguard Worker static_libs: [ 11352*333d2b36SAndroid Build Coastguard Worker "baz-lib", 11353*333d2b36SAndroid Build Coastguard Worker ], 11354*333d2b36SAndroid Build Coastguard Worker } 11355*333d2b36SAndroid Build Coastguard Worker filegroup { 11356*333d2b36SAndroid Build Coastguard Worker name: "qux-filegroup", 11357*333d2b36SAndroid Build Coastguard Worker device_common_srcs: [ 11358*333d2b36SAndroid Build Coastguard Worker ":qux-lib{.generated_srcjars}", 11359*333d2b36SAndroid Build Coastguard Worker ], 11360*333d2b36SAndroid Build Coastguard Worker } 11361*333d2b36SAndroid Build Coastguard Worker filegroup { 11362*333d2b36SAndroid Build Coastguard Worker name: "qux-another-filegroup", 11363*333d2b36SAndroid Build Coastguard Worker srcs: [ 11364*333d2b36SAndroid Build Coastguard Worker ":qux-filegroup", 11365*333d2b36SAndroid Build Coastguard Worker ], 11366*333d2b36SAndroid Build Coastguard Worker } 11367*333d2b36SAndroid Build Coastguard Worker java_library { 11368*333d2b36SAndroid Build Coastguard Worker name: "quux-java-lib", 11369*333d2b36SAndroid Build Coastguard Worker srcs: [ 11370*333d2b36SAndroid Build Coastguard Worker "a.java", 11371*333d2b36SAndroid Build Coastguard Worker ], 11372*333d2b36SAndroid Build Coastguard Worker libs: [ 11373*333d2b36SAndroid Build Coastguard Worker "quux-lib", 11374*333d2b36SAndroid Build Coastguard Worker ], 11375*333d2b36SAndroid Build Coastguard Worker } 11376*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 11377*333d2b36SAndroid Build Coastguard Worker name: "foo", 11378*333d2b36SAndroid Build Coastguard Worker srcs: [ 11379*333d2b36SAndroid Build Coastguard Worker ":qux-another-filegroup", 11380*333d2b36SAndroid Build Coastguard Worker ], 11381*333d2b36SAndroid Build Coastguard Worker api_packages: ["foo"], 11382*333d2b36SAndroid Build Coastguard Worker system: { 11383*333d2b36SAndroid Build Coastguard Worker enabled: true, 11384*333d2b36SAndroid Build Coastguard Worker }, 11385*333d2b36SAndroid Build Coastguard Worker module_lib: { 11386*333d2b36SAndroid Build Coastguard Worker enabled: true, 11387*333d2b36SAndroid Build Coastguard Worker }, 11388*333d2b36SAndroid Build Coastguard Worker test: { 11389*333d2b36SAndroid Build Coastguard Worker enabled: true, 11390*333d2b36SAndroid Build Coastguard Worker }, 11391*333d2b36SAndroid Build Coastguard Worker static_libs: [ 11392*333d2b36SAndroid Build Coastguard Worker "bar-lib", 11393*333d2b36SAndroid Build Coastguard Worker ], 11394*333d2b36SAndroid Build Coastguard Worker libs: [ 11395*333d2b36SAndroid Build Coastguard Worker "baz-java-lib", 11396*333d2b36SAndroid Build Coastguard Worker "quux-java-lib", 11397*333d2b36SAndroid Build Coastguard Worker ], 11398*333d2b36SAndroid Build Coastguard Worker aconfig_declarations: [ 11399*333d2b36SAndroid Build Coastguard Worker "bar", 11400*333d2b36SAndroid Build Coastguard Worker ], 11401*333d2b36SAndroid Build Coastguard Worker } 11402*333d2b36SAndroid Build Coastguard Worker `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"})) 11403*333d2b36SAndroid Build Coastguard Worker 11404*333d2b36SAndroid Build Coastguard Worker m := result.ModuleForTests("foo.stubs.source", "android_common") 11405*333d2b36SAndroid Build Coastguard Worker outDir := "out/soong/.intermediates" 11406*333d2b36SAndroid Build Coastguard Worker 11407*333d2b36SAndroid Build Coastguard Worker // Arguments passed to aconfig to retrieve the state of the flags defined in the 11408*333d2b36SAndroid Build Coastguard Worker // textproto files 11409*333d2b36SAndroid Build Coastguard Worker aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"] 11410*333d2b36SAndroid Build Coastguard Worker 11411*333d2b36SAndroid Build Coastguard Worker // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the 11412*333d2b36SAndroid Build Coastguard Worker // cache file provided by the associated aconfig_declarations module "bar" should be passed 11413*333d2b36SAndroid Build Coastguard Worker // to aconfig. 11414*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+ 11415*333d2b36SAndroid Build Coastguard Worker "passed as an input", 11416*333d2b36SAndroid Build Coastguard Worker aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar")) 11417*333d2b36SAndroid Build Coastguard Worker 11418*333d2b36SAndroid Build Coastguard Worker // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed 11419*333d2b36SAndroid Build Coastguard Worker // to metalava as classpath. Thus the cache file provided by the associated 11420*333d2b36SAndroid Build Coastguard Worker // aconfig_declarations module "baz" should be passed to aconfig. 11421*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+ 11422*333d2b36SAndroid Build Coastguard Worker "java_aconfig_library passed as an input", 11423*333d2b36SAndroid Build Coastguard Worker aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz")) 11424*333d2b36SAndroid Build Coastguard Worker 11425*333d2b36SAndroid Build Coastguard Worker // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by 11426*333d2b36SAndroid Build Coastguard Worker // the associated aconfig_declarations module "qux" should be passed to aconfig. 11427*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+ 11428*333d2b36SAndroid Build Coastguard Worker "input", 11429*333d2b36SAndroid Build Coastguard Worker aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux")) 11430*333d2b36SAndroid Build Coastguard Worker 11431*333d2b36SAndroid Build Coastguard Worker // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not 11432*333d2b36SAndroid Build Coastguard Worker // statically depend on "quux-lib". Therefore, the cache file provided by the associated 11433*333d2b36SAndroid Build Coastguard Worker // aconfig_declarations module "quux" should not be passed to aconfig. 11434*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+ 11435*333d2b36SAndroid Build Coastguard Worker "depend on java_aconfig_library not passed as an input", 11436*333d2b36SAndroid Build Coastguard Worker aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux")) 11437*333d2b36SAndroid Build Coastguard Worker} 11438*333d2b36SAndroid Build Coastguard Worker 11439*333d2b36SAndroid Build Coastguard Workerfunc TestMultiplePrebuiltsWithSameBase(t *testing.T) { 11440*333d2b36SAndroid Build Coastguard Worker t.Parallel() 11441*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 11442*333d2b36SAndroid Build Coastguard Worker apex { 11443*333d2b36SAndroid Build Coastguard Worker name: "myapex", 11444*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 11445*333d2b36SAndroid Build Coastguard Worker prebuilts: ["myetc", "myetc2"], 11446*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 11447*333d2b36SAndroid Build Coastguard Worker } 11448*333d2b36SAndroid Build Coastguard Worker apex_key { 11449*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 11450*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 11451*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 11452*333d2b36SAndroid Build Coastguard Worker } 11453*333d2b36SAndroid Build Coastguard Worker 11454*333d2b36SAndroid Build Coastguard Worker prebuilt_etc { 11455*333d2b36SAndroid Build Coastguard Worker name: "myetc", 11456*333d2b36SAndroid Build Coastguard Worker src: "myprebuilt", 11457*333d2b36SAndroid Build Coastguard Worker filename: "myfilename", 11458*333d2b36SAndroid Build Coastguard Worker } 11459*333d2b36SAndroid Build Coastguard Worker prebuilt_etc { 11460*333d2b36SAndroid Build Coastguard Worker name: "myetc2", 11461*333d2b36SAndroid Build Coastguard Worker sub_dir: "mysubdir", 11462*333d2b36SAndroid Build Coastguard Worker src: "myprebuilt", 11463*333d2b36SAndroid Build Coastguard Worker filename: "myfilename", 11464*333d2b36SAndroid Build Coastguard Worker } 11465*333d2b36SAndroid Build Coastguard Worker `, withFiles(android.MockFS{ 11466*333d2b36SAndroid Build Coastguard Worker "packages/modules/common/build/allowed_deps.txt": nil, 11467*333d2b36SAndroid Build Coastguard Worker })) 11468*333d2b36SAndroid Build Coastguard Worker 11469*333d2b36SAndroid Build Coastguard Worker ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) 11470*333d2b36SAndroid Build Coastguard Worker data := android.AndroidMkDataForTest(t, ctx, ab) 11471*333d2b36SAndroid Build Coastguard Worker var builder strings.Builder 11472*333d2b36SAndroid Build Coastguard Worker data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data) 11473*333d2b36SAndroid Build Coastguard Worker androidMk := builder.String() 11474*333d2b36SAndroid Build Coastguard Worker 11475*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex") 11476*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex") 11477*333d2b36SAndroid Build Coastguard Worker} 11478*333d2b36SAndroid Build Coastguard Worker 11479*333d2b36SAndroid Build Coastguard Workerfunc TestApexMinSdkVersionOverride(t *testing.T) { 11480*333d2b36SAndroid Build Coastguard Worker t.Parallel() 11481*333d2b36SAndroid Build Coastguard Worker checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) { 11482*333d2b36SAndroid Build Coastguard Worker args := module.Rule("apexRule").Args 11483*333d2b36SAndroid Build Coastguard Worker optFlags := args["opt_flags"] 11484*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) { 11485*333d2b36SAndroid Build Coastguard Worker t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags) 11486*333d2b36SAndroid Build Coastguard Worker } 11487*333d2b36SAndroid Build Coastguard Worker } 11488*333d2b36SAndroid Build Coastguard Worker 11489*333d2b36SAndroid Build Coastguard Worker checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) { 11490*333d2b36SAndroid Build Coastguard Worker t.Helper() 11491*333d2b36SAndroid Build Coastguard Worker found := false 11492*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDeps(m, func(dep blueprint.Module) { 11493*333d2b36SAndroid Build Coastguard Worker if dep == wantDep { 11494*333d2b36SAndroid Build Coastguard Worker found = true 11495*333d2b36SAndroid Build Coastguard Worker } 11496*333d2b36SAndroid Build Coastguard Worker }) 11497*333d2b36SAndroid Build Coastguard Worker if !found { 11498*333d2b36SAndroid Build Coastguard Worker t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep) 11499*333d2b36SAndroid Build Coastguard Worker } 11500*333d2b36SAndroid Build Coastguard Worker } 11501*333d2b36SAndroid Build Coastguard Worker 11502*333d2b36SAndroid Build Coastguard Worker ctx := testApex(t, ` 11503*333d2b36SAndroid Build Coastguard Worker apex { 11504*333d2b36SAndroid Build Coastguard Worker name: "com.android.apex30", 11505*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "30", 11506*333d2b36SAndroid Build Coastguard Worker key: "apex30.key", 11507*333d2b36SAndroid Build Coastguard Worker java_libs: ["javalib"], 11508*333d2b36SAndroid Build Coastguard Worker } 11509*333d2b36SAndroid Build Coastguard Worker 11510*333d2b36SAndroid Build Coastguard Worker java_library { 11511*333d2b36SAndroid Build Coastguard Worker name: "javalib", 11512*333d2b36SAndroid Build Coastguard Worker srcs: ["A.java"], 11513*333d2b36SAndroid Build Coastguard Worker apex_available: ["com.android.apex30"], 11514*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "30", 11515*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 11516*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 11517*333d2b36SAndroid Build Coastguard Worker } 11518*333d2b36SAndroid Build Coastguard Worker 11519*333d2b36SAndroid Build Coastguard Worker override_apex { 11520*333d2b36SAndroid Build Coastguard Worker name: "com.mycompany.android.apex30", 11521*333d2b36SAndroid Build Coastguard Worker base: "com.android.apex30", 11522*333d2b36SAndroid Build Coastguard Worker } 11523*333d2b36SAndroid Build Coastguard Worker 11524*333d2b36SAndroid Build Coastguard Worker override_apex { 11525*333d2b36SAndroid Build Coastguard Worker name: "com.mycompany.android.apex31", 11526*333d2b36SAndroid Build Coastguard Worker base: "com.android.apex30", 11527*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "31", 11528*333d2b36SAndroid Build Coastguard Worker } 11529*333d2b36SAndroid Build Coastguard Worker 11530*333d2b36SAndroid Build Coastguard Worker apex_key { 11531*333d2b36SAndroid Build Coastguard Worker name: "apex30.key", 11532*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 11533*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 11534*333d2b36SAndroid Build Coastguard Worker } 11535*333d2b36SAndroid Build Coastguard Worker 11536*333d2b36SAndroid Build Coastguard Worker `, android.FixtureMergeMockFs(android.MockFS{ 11537*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/com.android.apex30-file_contexts": nil, 11538*333d2b36SAndroid Build Coastguard Worker }), 11539*333d2b36SAndroid Build Coastguard Worker ) 11540*333d2b36SAndroid Build Coastguard Worker 11541*333d2b36SAndroid Build Coastguard Worker baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30") 11542*333d2b36SAndroid Build Coastguard Worker checkMinSdkVersion(t, baseModule, "30") 11543*333d2b36SAndroid Build Coastguard Worker 11544*333d2b36SAndroid Build Coastguard Worker // Override module, but uses same min_sdk_version 11545*333d2b36SAndroid Build Coastguard Worker overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30") 11546*333d2b36SAndroid Build Coastguard Worker javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30") 11547*333d2b36SAndroid Build Coastguard Worker checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30") 11548*333d2b36SAndroid Build Coastguard Worker checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module()) 11549*333d2b36SAndroid Build Coastguard Worker 11550*333d2b36SAndroid Build Coastguard Worker // Override module, uses different min_sdk_version 11551*333d2b36SAndroid Build Coastguard Worker overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31") 11552*333d2b36SAndroid Build Coastguard Worker javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31") 11553*333d2b36SAndroid Build Coastguard Worker checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31") 11554*333d2b36SAndroid Build Coastguard Worker checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module()) 11555*333d2b36SAndroid Build Coastguard Worker} 11556*333d2b36SAndroid Build Coastguard Worker 11557*333d2b36SAndroid Build Coastguard Workerfunc TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) { 11558*333d2b36SAndroid Build Coastguard Worker t.Parallel() 11559*333d2b36SAndroid Build Coastguard Worker context := android.GroupFixturePreparers( 11560*333d2b36SAndroid Build Coastguard Worker android.PrepareForIntegrationTestWithAndroid, 11561*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithApexBuildComponents, 11562*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs(android.MockFS{ 11563*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/foo-file_contexts": nil, 11564*333d2b36SAndroid Build Coastguard Worker }), 11565*333d2b36SAndroid Build Coastguard Worker ) 11566*333d2b36SAndroid Build Coastguard Worker res := context.RunTestWithBp(t, ` 11567*333d2b36SAndroid Build Coastguard Worker apex { 11568*333d2b36SAndroid Build Coastguard Worker name: "foo", 11569*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 11570*333d2b36SAndroid Build Coastguard Worker apex_available_name: "com.android.foo", 11571*333d2b36SAndroid Build Coastguard Worker variant_version: "0", 11572*333d2b36SAndroid Build Coastguard Worker updatable: false, 11573*333d2b36SAndroid Build Coastguard Worker } 11574*333d2b36SAndroid Build Coastguard Worker apex_key { 11575*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 11576*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 11577*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 11578*333d2b36SAndroid Build Coastguard Worker } 11579*333d2b36SAndroid Build Coastguard Worker prebuilt_apex { 11580*333d2b36SAndroid Build Coastguard Worker name: "foo", 11581*333d2b36SAndroid Build Coastguard Worker src: "foo.apex", 11582*333d2b36SAndroid Build Coastguard Worker prefer: true, 11583*333d2b36SAndroid Build Coastguard Worker } 11584*333d2b36SAndroid Build Coastguard Worker override_apex { 11585*333d2b36SAndroid Build Coastguard Worker name: "myoverrideapex", 11586*333d2b36SAndroid Build Coastguard Worker base: "foo", 11587*333d2b36SAndroid Build Coastguard Worker } 11588*333d2b36SAndroid Build Coastguard Worker `) 11589*333d2b36SAndroid Build Coastguard Worker 11590*333d2b36SAndroid Build Coastguard Worker java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo") 11591*333d2b36SAndroid Build Coastguard Worker} 11592*333d2b36SAndroid Build Coastguard Worker 11593*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatableApexMinSdkVersionCurrent(t *testing.T) { 11594*333d2b36SAndroid Build Coastguard Worker t.Parallel() 11595*333d2b36SAndroid Build Coastguard Worker testApexError(t, `"myapex" .*: updatable: updatable APEXes should not set min_sdk_version to current. Please use a finalized API level or a recognized in-development codename`, ` 11596*333d2b36SAndroid Build Coastguard Worker apex { 11597*333d2b36SAndroid Build Coastguard Worker name: "myapex", 11598*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 11599*333d2b36SAndroid Build Coastguard Worker updatable: true, 11600*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "current", 11601*333d2b36SAndroid Build Coastguard Worker } 11602*333d2b36SAndroid Build Coastguard Worker 11603*333d2b36SAndroid Build Coastguard Worker apex_key { 11604*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 11605*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 11606*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 11607*333d2b36SAndroid Build Coastguard Worker } 11608*333d2b36SAndroid Build Coastguard Worker `) 11609*333d2b36SAndroid Build Coastguard Worker} 11610*333d2b36SAndroid Build Coastguard Worker 11611*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltStubNoinstall(t *testing.T) { 11612*333d2b36SAndroid Build Coastguard Worker t.Parallel() 11613*333d2b36SAndroid Build Coastguard Worker testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) { 11614*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 11615*333d2b36SAndroid Build Coastguard Worker prepareForApexTest, 11616*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithAndroidMk, 11617*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithMakevars, 11618*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs(fs), 11619*333d2b36SAndroid Build Coastguard Worker ).RunTest(t) 11620*333d2b36SAndroid Build Coastguard Worker 11621*333d2b36SAndroid Build Coastguard Worker ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld") 11622*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so") 11623*333d2b36SAndroid Build Coastguard Worker 11624*333d2b36SAndroid Build Coastguard Worker installRules := result.InstallMakeRulesForTesting(t) 11625*333d2b36SAndroid Build Coastguard Worker 11626*333d2b36SAndroid Build Coastguard Worker var installedlibRule *android.InstallMakeRule 11627*333d2b36SAndroid Build Coastguard Worker for i, rule := range installRules { 11628*333d2b36SAndroid Build Coastguard Worker if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" { 11629*333d2b36SAndroid Build Coastguard Worker if installedlibRule != nil { 11630*333d2b36SAndroid Build Coastguard Worker t.Errorf("Duplicate install rules for %s", rule.Target) 11631*333d2b36SAndroid Build Coastguard Worker } 11632*333d2b36SAndroid Build Coastguard Worker installedlibRule = &installRules[i] 11633*333d2b36SAndroid Build Coastguard Worker } 11634*333d2b36SAndroid Build Coastguard Worker } 11635*333d2b36SAndroid Build Coastguard Worker if installedlibRule == nil { 11636*333d2b36SAndroid Build Coastguard Worker t.Errorf("No install rule found for installedlib") 11637*333d2b36SAndroid Build Coastguard Worker return 11638*333d2b36SAndroid Build Coastguard Worker } 11639*333d2b36SAndroid Build Coastguard Worker 11640*333d2b36SAndroid Build Coastguard Worker if expectLibfooOnSystemLib { 11641*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, 11642*333d2b36SAndroid Build Coastguard Worker "installedlib doesn't have install dependency on libfoo impl", 11643*333d2b36SAndroid Build Coastguard Worker installedlibRule.OrderOnlyDeps, 11644*333d2b36SAndroid Build Coastguard Worker "out/target/product/test_device/system/lib/libfoo.so") 11645*333d2b36SAndroid Build Coastguard Worker } else { 11646*333d2b36SAndroid Build Coastguard Worker android.AssertStringListDoesNotContain(t, 11647*333d2b36SAndroid Build Coastguard Worker "installedlib has install dependency on libfoo stub", 11648*333d2b36SAndroid Build Coastguard Worker installedlibRule.Deps, 11649*333d2b36SAndroid Build Coastguard Worker "out/target/product/test_device/system/lib/libfoo.so") 11650*333d2b36SAndroid Build Coastguard Worker android.AssertStringListDoesNotContain(t, 11651*333d2b36SAndroid Build Coastguard Worker "installedlib has order-only install dependency on libfoo stub", 11652*333d2b36SAndroid Build Coastguard Worker installedlibRule.OrderOnlyDeps, 11653*333d2b36SAndroid Build Coastguard Worker "out/target/product/test_device/system/lib/libfoo.so") 11654*333d2b36SAndroid Build Coastguard Worker } 11655*333d2b36SAndroid Build Coastguard Worker } 11656*333d2b36SAndroid Build Coastguard Worker 11657*333d2b36SAndroid Build Coastguard Worker prebuiltLibfooBp := []byte(` 11658*333d2b36SAndroid Build Coastguard Worker cc_prebuilt_library { 11659*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 11660*333d2b36SAndroid Build Coastguard Worker prefer: true, 11661*333d2b36SAndroid Build Coastguard Worker srcs: ["libfoo.so"], 11662*333d2b36SAndroid Build Coastguard Worker stubs: { 11663*333d2b36SAndroid Build Coastguard Worker versions: ["1"], 11664*333d2b36SAndroid Build Coastguard Worker }, 11665*333d2b36SAndroid Build Coastguard Worker apex_available: ["apexfoo"], 11666*333d2b36SAndroid Build Coastguard Worker } 11667*333d2b36SAndroid Build Coastguard Worker `) 11668*333d2b36SAndroid Build Coastguard Worker 11669*333d2b36SAndroid Build Coastguard Worker apexfooBp := []byte(` 11670*333d2b36SAndroid Build Coastguard Worker apex { 11671*333d2b36SAndroid Build Coastguard Worker name: "apexfoo", 11672*333d2b36SAndroid Build Coastguard Worker key: "apexfoo.key", 11673*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 11674*333d2b36SAndroid Build Coastguard Worker updatable: false, 11675*333d2b36SAndroid Build Coastguard Worker compile_multilib: "both", 11676*333d2b36SAndroid Build Coastguard Worker } 11677*333d2b36SAndroid Build Coastguard Worker apex_key { 11678*333d2b36SAndroid Build Coastguard Worker name: "apexfoo.key", 11679*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 11680*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 11681*333d2b36SAndroid Build Coastguard Worker } 11682*333d2b36SAndroid Build Coastguard Worker `) 11683*333d2b36SAndroid Build Coastguard Worker 11684*333d2b36SAndroid Build Coastguard Worker installedlibBp := []byte(` 11685*333d2b36SAndroid Build Coastguard Worker cc_library { 11686*333d2b36SAndroid Build Coastguard Worker name: "installedlib", 11687*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libfoo"], 11688*333d2b36SAndroid Build Coastguard Worker } 11689*333d2b36SAndroid Build Coastguard Worker `) 11690*333d2b36SAndroid Build Coastguard Worker 11691*333d2b36SAndroid Build Coastguard Worker t.Run("prebuilt stub (without source): no install", func(t *testing.T) { 11692*333d2b36SAndroid Build Coastguard Worker t.Parallel() 11693*333d2b36SAndroid Build Coastguard Worker testFunc( 11694*333d2b36SAndroid Build Coastguard Worker t, 11695*333d2b36SAndroid Build Coastguard Worker /*expectLibfooOnSystemLib=*/ false, 11696*333d2b36SAndroid Build Coastguard Worker android.MockFS{ 11697*333d2b36SAndroid Build Coastguard Worker "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp, 11698*333d2b36SAndroid Build Coastguard Worker "apexfoo/Android.bp": apexfooBp, 11699*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/apexfoo-file_contexts": nil, 11700*333d2b36SAndroid Build Coastguard Worker "Android.bp": installedlibBp, 11701*333d2b36SAndroid Build Coastguard Worker }, 11702*333d2b36SAndroid Build Coastguard Worker ) 11703*333d2b36SAndroid Build Coastguard Worker }) 11704*333d2b36SAndroid Build Coastguard Worker 11705*333d2b36SAndroid Build Coastguard Worker disabledSourceLibfooBp := []byte(` 11706*333d2b36SAndroid Build Coastguard Worker cc_library { 11707*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 11708*333d2b36SAndroid Build Coastguard Worker enabled: false, 11709*333d2b36SAndroid Build Coastguard Worker stubs: { 11710*333d2b36SAndroid Build Coastguard Worker versions: ["1"], 11711*333d2b36SAndroid Build Coastguard Worker }, 11712*333d2b36SAndroid Build Coastguard Worker apex_available: ["apexfoo"], 11713*333d2b36SAndroid Build Coastguard Worker } 11714*333d2b36SAndroid Build Coastguard Worker `) 11715*333d2b36SAndroid Build Coastguard Worker 11716*333d2b36SAndroid Build Coastguard Worker t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) { 11717*333d2b36SAndroid Build Coastguard Worker t.Parallel() 11718*333d2b36SAndroid Build Coastguard Worker testFunc( 11719*333d2b36SAndroid Build Coastguard Worker t, 11720*333d2b36SAndroid Build Coastguard Worker /*expectLibfooOnSystemLib=*/ false, 11721*333d2b36SAndroid Build Coastguard Worker android.MockFS{ 11722*333d2b36SAndroid Build Coastguard Worker "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp, 11723*333d2b36SAndroid Build Coastguard Worker "impl/Android.bp": disabledSourceLibfooBp, 11724*333d2b36SAndroid Build Coastguard Worker "apexfoo/Android.bp": apexfooBp, 11725*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/apexfoo-file_contexts": nil, 11726*333d2b36SAndroid Build Coastguard Worker "Android.bp": installedlibBp, 11727*333d2b36SAndroid Build Coastguard Worker }, 11728*333d2b36SAndroid Build Coastguard Worker ) 11729*333d2b36SAndroid Build Coastguard Worker }) 11730*333d2b36SAndroid Build Coastguard Worker} 11731*333d2b36SAndroid Build Coastguard Worker 11732*333d2b36SAndroid Build Coastguard Workerfunc TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) { 11733*333d2b36SAndroid Build Coastguard Worker t.Parallel() 11734*333d2b36SAndroid Build Coastguard Worker // This test case tests that listing the impl lib instead of the top level java_sdk_library 11735*333d2b36SAndroid Build Coastguard Worker // in libs of android_app and java_library does not lead to class loader context device/host 11736*333d2b36SAndroid Build Coastguard Worker // path mismatch errors. 11737*333d2b36SAndroid Build Coastguard Worker android.GroupFixturePreparers( 11738*333d2b36SAndroid Build Coastguard Worker prepareForApexTest, 11739*333d2b36SAndroid Build Coastguard Worker android.PrepareForIntegrationTestWithAndroid, 11740*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithApexBuildComponents, 11741*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyEnv(func(env map[string]string) { 11742*333d2b36SAndroid Build Coastguard Worker env["DISABLE_CONTAINER_CHECK"] = "true" 11743*333d2b36SAndroid Build Coastguard Worker }), 11744*333d2b36SAndroid Build Coastguard Worker withFiles(filesForSdkLibrary), 11745*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs(android.MockFS{ 11746*333d2b36SAndroid Build Coastguard Worker "system/sepolicy/apex/com.android.foo30-file_contexts": nil, 11747*333d2b36SAndroid Build Coastguard Worker }), 11748*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 11749*333d2b36SAndroid Build Coastguard Worker apex { 11750*333d2b36SAndroid Build Coastguard Worker name: "com.android.foo30", 11751*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 11752*333d2b36SAndroid Build Coastguard Worker updatable: true, 11753*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragments: [ 11754*333d2b36SAndroid Build Coastguard Worker "foo-bootclasspath-fragment", 11755*333d2b36SAndroid Build Coastguard Worker ], 11756*333d2b36SAndroid Build Coastguard Worker java_libs: [ 11757*333d2b36SAndroid Build Coastguard Worker "bar", 11758*333d2b36SAndroid Build Coastguard Worker ], 11759*333d2b36SAndroid Build Coastguard Worker apps: [ 11760*333d2b36SAndroid Build Coastguard Worker "bar-app", 11761*333d2b36SAndroid Build Coastguard Worker ], 11762*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "30", 11763*333d2b36SAndroid Build Coastguard Worker } 11764*333d2b36SAndroid Build Coastguard Worker apex_key { 11765*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 11766*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 11767*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 11768*333d2b36SAndroid Build Coastguard Worker } 11769*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragment { 11770*333d2b36SAndroid Build Coastguard Worker name: "foo-bootclasspath-fragment", 11771*333d2b36SAndroid Build Coastguard Worker contents: [ 11772*333d2b36SAndroid Build Coastguard Worker "framework-foo", 11773*333d2b36SAndroid Build Coastguard Worker ], 11774*333d2b36SAndroid Build Coastguard Worker apex_available: [ 11775*333d2b36SAndroid Build Coastguard Worker "com.android.foo30", 11776*333d2b36SAndroid Build Coastguard Worker ], 11777*333d2b36SAndroid Build Coastguard Worker hidden_api: { 11778*333d2b36SAndroid Build Coastguard Worker split_packages: ["*"] 11779*333d2b36SAndroid Build Coastguard Worker }, 11780*333d2b36SAndroid Build Coastguard Worker } 11781*333d2b36SAndroid Build Coastguard Worker 11782*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 11783*333d2b36SAndroid Build Coastguard Worker name: "framework-foo", 11784*333d2b36SAndroid Build Coastguard Worker srcs: [ 11785*333d2b36SAndroid Build Coastguard Worker "A.java" 11786*333d2b36SAndroid Build Coastguard Worker ], 11787*333d2b36SAndroid Build Coastguard Worker unsafe_ignore_missing_latest_api: true, 11788*333d2b36SAndroid Build Coastguard Worker apex_available: [ 11789*333d2b36SAndroid Build Coastguard Worker "com.android.foo30", 11790*333d2b36SAndroid Build Coastguard Worker ], 11791*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 11792*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_current", 11793*333d2b36SAndroid Build Coastguard Worker shared_library: false, 11794*333d2b36SAndroid Build Coastguard Worker } 11795*333d2b36SAndroid Build Coastguard Worker 11796*333d2b36SAndroid Build Coastguard Worker java_library { 11797*333d2b36SAndroid Build Coastguard Worker name: "bar", 11798*333d2b36SAndroid Build Coastguard Worker srcs: [ 11799*333d2b36SAndroid Build Coastguard Worker "A.java" 11800*333d2b36SAndroid Build Coastguard Worker ], 11801*333d2b36SAndroid Build Coastguard Worker libs: [ 11802*333d2b36SAndroid Build Coastguard Worker "framework-foo.impl", 11803*333d2b36SAndroid Build Coastguard Worker ], 11804*333d2b36SAndroid Build Coastguard Worker apex_available: [ 11805*333d2b36SAndroid Build Coastguard Worker "com.android.foo30", 11806*333d2b36SAndroid Build Coastguard Worker ], 11807*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_current", 11808*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 11809*333d2b36SAndroid Build Coastguard Worker } 11810*333d2b36SAndroid Build Coastguard Worker 11811*333d2b36SAndroid Build Coastguard Worker java_library { 11812*333d2b36SAndroid Build Coastguard Worker name: "baz", 11813*333d2b36SAndroid Build Coastguard Worker srcs: [ 11814*333d2b36SAndroid Build Coastguard Worker "A.java" 11815*333d2b36SAndroid Build Coastguard Worker ], 11816*333d2b36SAndroid Build Coastguard Worker libs: [ 11817*333d2b36SAndroid Build Coastguard Worker "bar", 11818*333d2b36SAndroid Build Coastguard Worker ], 11819*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_current", 11820*333d2b36SAndroid Build Coastguard Worker } 11821*333d2b36SAndroid Build Coastguard Worker 11822*333d2b36SAndroid Build Coastguard Worker android_app { 11823*333d2b36SAndroid Build Coastguard Worker name: "bar-app", 11824*333d2b36SAndroid Build Coastguard Worker srcs: [ 11825*333d2b36SAndroid Build Coastguard Worker "A.java" 11826*333d2b36SAndroid Build Coastguard Worker ], 11827*333d2b36SAndroid Build Coastguard Worker libs: [ 11828*333d2b36SAndroid Build Coastguard Worker "baz", 11829*333d2b36SAndroid Build Coastguard Worker "framework-foo.impl", 11830*333d2b36SAndroid Build Coastguard Worker ], 11831*333d2b36SAndroid Build Coastguard Worker apex_available: [ 11832*333d2b36SAndroid Build Coastguard Worker "com.android.foo30", 11833*333d2b36SAndroid Build Coastguard Worker ], 11834*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_current", 11835*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "30", 11836*333d2b36SAndroid Build Coastguard Worker manifest: "AndroidManifest.xml", 11837*333d2b36SAndroid Build Coastguard Worker updatable: true, 11838*333d2b36SAndroid Build Coastguard Worker } 11839*333d2b36SAndroid Build Coastguard Worker `) 11840*333d2b36SAndroid Build Coastguard Worker} 11841*333d2b36SAndroid Build Coastguard Worker 11842*333d2b36SAndroid Build Coastguard Worker// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well. 11843*333d2b36SAndroid Build Coastguard Workerfunc TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) { 11844*333d2b36SAndroid Build Coastguard Worker t.Parallel() 11845*333d2b36SAndroid Build Coastguard Worker testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, ` 11846*333d2b36SAndroid Build Coastguard Worker apex { 11847*333d2b36SAndroid Build Coastguard Worker name: "myapex", 11848*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 11849*333d2b36SAndroid Build Coastguard Worker systemserverclasspath_fragments: [ 11850*333d2b36SAndroid Build Coastguard Worker "mysystemserverclasspathfragment", 11851*333d2b36SAndroid Build Coastguard Worker ], 11852*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 11853*333d2b36SAndroid Build Coastguard Worker updatable: true, 11854*333d2b36SAndroid Build Coastguard Worker system_ext_specific: true, 11855*333d2b36SAndroid Build Coastguard Worker } 11856*333d2b36SAndroid Build Coastguard Worker 11857*333d2b36SAndroid Build Coastguard Worker apex_key { 11858*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 11859*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 11860*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 11861*333d2b36SAndroid Build Coastguard Worker } 11862*333d2b36SAndroid Build Coastguard Worker 11863*333d2b36SAndroid Build Coastguard Worker java_library { 11864*333d2b36SAndroid Build Coastguard Worker name: "foo", 11865*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 11866*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "29", 11867*333d2b36SAndroid Build Coastguard Worker installable: true, 11868*333d2b36SAndroid Build Coastguard Worker apex_available: [ 11869*333d2b36SAndroid Build Coastguard Worker "myapex", 11870*333d2b36SAndroid Build Coastguard Worker ], 11871*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 11872*333d2b36SAndroid Build Coastguard Worker } 11873*333d2b36SAndroid Build Coastguard Worker 11874*333d2b36SAndroid Build Coastguard Worker systemserverclasspath_fragment { 11875*333d2b36SAndroid Build Coastguard Worker name: "mysystemserverclasspathfragment", 11876*333d2b36SAndroid Build Coastguard Worker contents: [ 11877*333d2b36SAndroid Build Coastguard Worker "foo", 11878*333d2b36SAndroid Build Coastguard Worker ], 11879*333d2b36SAndroid Build Coastguard Worker apex_available: [ 11880*333d2b36SAndroid Build Coastguard Worker "myapex", 11881*333d2b36SAndroid Build Coastguard Worker ], 11882*333d2b36SAndroid Build Coastguard Worker } 11883*333d2b36SAndroid Build Coastguard Worker `, 11884*333d2b36SAndroid Build Coastguard Worker dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"), 11885*333d2b36SAndroid Build Coastguard Worker ) 11886*333d2b36SAndroid Build Coastguard Worker} 11887*333d2b36SAndroid Build Coastguard Worker 11888*333d2b36SAndroid Build Coastguard Worker// partitions should not package the artifacts that are included inside the apex. 11889*333d2b36SAndroid Build Coastguard Workerfunc TestFilesystemWithApexDeps(t *testing.T) { 11890*333d2b36SAndroid Build Coastguard Worker t.Parallel() 11891*333d2b36SAndroid Build Coastguard Worker result := testApex(t, ` 11892*333d2b36SAndroid Build Coastguard Worker android_filesystem { 11893*333d2b36SAndroid Build Coastguard Worker name: "myfilesystem", 11894*333d2b36SAndroid Build Coastguard Worker deps: ["myapex"], 11895*333d2b36SAndroid Build Coastguard Worker } 11896*333d2b36SAndroid Build Coastguard Worker apex { 11897*333d2b36SAndroid Build Coastguard Worker name: "myapex", 11898*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 11899*333d2b36SAndroid Build Coastguard Worker binaries: ["binfoo"], 11900*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libfoo"], 11901*333d2b36SAndroid Build Coastguard Worker apps: ["appfoo"], 11902*333d2b36SAndroid Build Coastguard Worker updatable: false, 11903*333d2b36SAndroid Build Coastguard Worker } 11904*333d2b36SAndroid Build Coastguard Worker apex_key { 11905*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 11906*333d2b36SAndroid Build Coastguard Worker } 11907*333d2b36SAndroid Build Coastguard Worker cc_binary { 11908*333d2b36SAndroid Build Coastguard Worker name: "binfoo", 11909*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 11910*333d2b36SAndroid Build Coastguard Worker } 11911*333d2b36SAndroid Build Coastguard Worker cc_library { 11912*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 11913*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 11914*333d2b36SAndroid Build Coastguard Worker } 11915*333d2b36SAndroid Build Coastguard Worker android_app { 11916*333d2b36SAndroid Build Coastguard Worker name: "appfoo", 11917*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 11918*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 11919*333d2b36SAndroid Build Coastguard Worker } 11920*333d2b36SAndroid Build Coastguard Worker `, filesystem.PrepareForTestWithFilesystemBuildComponents) 11921*333d2b36SAndroid Build Coastguard Worker 11922*333d2b36SAndroid Build Coastguard Worker partition := result.ModuleForTests("myfilesystem", "android_common") 11923*333d2b36SAndroid Build Coastguard Worker fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList")) 11924*333d2b36SAndroid Build Coastguard Worker android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList) 11925*333d2b36SAndroid Build Coastguard Worker} 11926*333d2b36SAndroid Build Coastguard Worker 11927*333d2b36SAndroid Build Coastguard Workerfunc TestApexVerifyNativeImplementationLibs(t *testing.T) { 11928*333d2b36SAndroid Build Coastguard Worker t.Parallel() 11929*333d2b36SAndroid Build Coastguard Worker 11930*333d2b36SAndroid Build Coastguard Worker extractDepenencyPathFromErrors := func(errs []error) []string { 11931*333d2b36SAndroid Build Coastguard Worker i := slices.IndexFunc(errs, func(err error) bool { 11932*333d2b36SAndroid Build Coastguard Worker return strings.Contains(err.Error(), "dependency path:") 11933*333d2b36SAndroid Build Coastguard Worker }) 11934*333d2b36SAndroid Build Coastguard Worker if i < 0 { 11935*333d2b36SAndroid Build Coastguard Worker return nil 11936*333d2b36SAndroid Build Coastguard Worker } 11937*333d2b36SAndroid Build Coastguard Worker var dependencyPath []string 11938*333d2b36SAndroid Build Coastguard Worker for _, err := range errs[i+1:] { 11939*333d2b36SAndroid Build Coastguard Worker s := err.Error() 11940*333d2b36SAndroid Build Coastguard Worker lastSpace := strings.LastIndexByte(s, ' ') 11941*333d2b36SAndroid Build Coastguard Worker if lastSpace >= 0 { 11942*333d2b36SAndroid Build Coastguard Worker dependencyPath = append(dependencyPath, s[lastSpace+1:]) 11943*333d2b36SAndroid Build Coastguard Worker } 11944*333d2b36SAndroid Build Coastguard Worker } 11945*333d2b36SAndroid Build Coastguard Worker return dependencyPath 11946*333d2b36SAndroid Build Coastguard Worker } 11947*333d2b36SAndroid Build Coastguard Worker 11948*333d2b36SAndroid Build Coastguard Worker checkErrors := func(wantDependencyPath []string) func(t *testing.T, result *android.TestResult) { 11949*333d2b36SAndroid Build Coastguard Worker return func(t *testing.T, result *android.TestResult) { 11950*333d2b36SAndroid Build Coastguard Worker t.Helper() 11951*333d2b36SAndroid Build Coastguard Worker if len(result.Errs) == 0 { 11952*333d2b36SAndroid Build Coastguard Worker t.Fatalf("expected errors") 11953*333d2b36SAndroid Build Coastguard Worker } 11954*333d2b36SAndroid Build Coastguard Worker t.Log("found errors:") 11955*333d2b36SAndroid Build Coastguard Worker for _, err := range result.Errs { 11956*333d2b36SAndroid Build Coastguard Worker t.Log(err) 11957*333d2b36SAndroid Build Coastguard Worker } 11958*333d2b36SAndroid Build Coastguard Worker if g, w := result.Errs[0].Error(), "library in apex transitively linked against implementation library"; !strings.Contains(g, w) { 11959*333d2b36SAndroid Build Coastguard Worker t.Fatalf("expected error %q, got %q", w, g) 11960*333d2b36SAndroid Build Coastguard Worker } 11961*333d2b36SAndroid Build Coastguard Worker dependencyPath := extractDepenencyPathFromErrors(result.Errs) 11962*333d2b36SAndroid Build Coastguard Worker if g, w := dependencyPath, wantDependencyPath; !slices.Equal(g, w) { 11963*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected dependency path %q, got %q", w, g) 11964*333d2b36SAndroid Build Coastguard Worker } 11965*333d2b36SAndroid Build Coastguard Worker } 11966*333d2b36SAndroid Build Coastguard Worker } 11967*333d2b36SAndroid Build Coastguard Worker 11968*333d2b36SAndroid Build Coastguard Worker addToSharedLibs := func(module, lib string) func(bp *bpmodify.Blueprint) { 11969*333d2b36SAndroid Build Coastguard Worker return func(bp *bpmodify.Blueprint) { 11970*333d2b36SAndroid Build Coastguard Worker m := bp.ModulesByName(module) 11971*333d2b36SAndroid Build Coastguard Worker props, err := m.GetOrCreateProperty(bpmodify.List, "shared_libs") 11972*333d2b36SAndroid Build Coastguard Worker if err != nil { 11973*333d2b36SAndroid Build Coastguard Worker panic(err) 11974*333d2b36SAndroid Build Coastguard Worker } 11975*333d2b36SAndroid Build Coastguard Worker props.AddStringToList(lib) 11976*333d2b36SAndroid Build Coastguard Worker } 11977*333d2b36SAndroid Build Coastguard Worker } 11978*333d2b36SAndroid Build Coastguard Worker 11979*333d2b36SAndroid Build Coastguard Worker bpTemplate := ` 11980*333d2b36SAndroid Build Coastguard Worker apex { 11981*333d2b36SAndroid Build Coastguard Worker name: "myapex", 11982*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 11983*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["mylib"], 11984*333d2b36SAndroid Build Coastguard Worker rust_dyn_libs: ["libmyrust"], 11985*333d2b36SAndroid Build Coastguard Worker binaries: ["mybin", "myrustbin"], 11986*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 11987*333d2b36SAndroid Build Coastguard Worker apps: ["myapp"], 11988*333d2b36SAndroid Build Coastguard Worker updatable: false, 11989*333d2b36SAndroid Build Coastguard Worker } 11990*333d2b36SAndroid Build Coastguard Worker 11991*333d2b36SAndroid Build Coastguard Worker apex { 11992*333d2b36SAndroid Build Coastguard Worker name: "otherapex", 11993*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 11994*333d2b36SAndroid Build Coastguard Worker native_shared_libs: ["libotherapex"], 11995*333d2b36SAndroid Build Coastguard Worker updatable: false, 11996*333d2b36SAndroid Build Coastguard Worker } 11997*333d2b36SAndroid Build Coastguard Worker 11998*333d2b36SAndroid Build Coastguard Worker apex_key { 11999*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 12000*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 12001*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 12002*333d2b36SAndroid Build Coastguard Worker } 12003*333d2b36SAndroid Build Coastguard Worker 12004*333d2b36SAndroid Build Coastguard Worker cc_library { 12005*333d2b36SAndroid Build Coastguard Worker name: "mylib", 12006*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.cpp"], 12007*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 12008*333d2b36SAndroid Build Coastguard Worker } 12009*333d2b36SAndroid Build Coastguard Worker 12010*333d2b36SAndroid Build Coastguard Worker cc_binary { 12011*333d2b36SAndroid Build Coastguard Worker name: "mybin", 12012*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.cpp"], 12013*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 12014*333d2b36SAndroid Build Coastguard Worker } 12015*333d2b36SAndroid Build Coastguard Worker 12016*333d2b36SAndroid Build Coastguard Worker rust_library { 12017*333d2b36SAndroid Build Coastguard Worker name: "libmyrust", 12018*333d2b36SAndroid Build Coastguard Worker crate_name: "myrust", 12019*333d2b36SAndroid Build Coastguard Worker srcs: ["src/lib.rs"], 12020*333d2b36SAndroid Build Coastguard Worker rustlibs: ["libmyrust_transitive_dylib"], 12021*333d2b36SAndroid Build Coastguard Worker rlibs: ["libmyrust_transitive_rlib"], 12022*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 12023*333d2b36SAndroid Build Coastguard Worker } 12024*333d2b36SAndroid Build Coastguard Worker 12025*333d2b36SAndroid Build Coastguard Worker rust_library{ 12026*333d2b36SAndroid Build Coastguard Worker name: "libmyrust_transitive_dylib", 12027*333d2b36SAndroid Build Coastguard Worker crate_name: "myrust_transitive_dylib", 12028*333d2b36SAndroid Build Coastguard Worker srcs: ["src/lib.rs"], 12029*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 12030*333d2b36SAndroid Build Coastguard Worker } 12031*333d2b36SAndroid Build Coastguard Worker 12032*333d2b36SAndroid Build Coastguard Worker rust_library { 12033*333d2b36SAndroid Build Coastguard Worker name: "libmyrust_transitive_rlib", 12034*333d2b36SAndroid Build Coastguard Worker crate_name: "myrust_transitive_rlib", 12035*333d2b36SAndroid Build Coastguard Worker srcs: ["src/lib.rs"], 12036*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 12037*333d2b36SAndroid Build Coastguard Worker } 12038*333d2b36SAndroid Build Coastguard Worker 12039*333d2b36SAndroid Build Coastguard Worker rust_binary { 12040*333d2b36SAndroid Build Coastguard Worker name: "myrustbin", 12041*333d2b36SAndroid Build Coastguard Worker srcs: ["src/main.rs"], 12042*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 12043*333d2b36SAndroid Build Coastguard Worker } 12044*333d2b36SAndroid Build Coastguard Worker 12045*333d2b36SAndroid Build Coastguard Worker cc_library { 12046*333d2b36SAndroid Build Coastguard Worker name: "libbar", 12047*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 12048*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.cpp"], 12049*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 12050*333d2b36SAndroid Build Coastguard Worker stl: "none", 12051*333d2b36SAndroid Build Coastguard Worker } 12052*333d2b36SAndroid Build Coastguard Worker 12053*333d2b36SAndroid Build Coastguard Worker android_app { 12054*333d2b36SAndroid Build Coastguard Worker name: "myapp", 12055*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libembeddedjni"], 12056*333d2b36SAndroid Build Coastguard Worker use_embedded_native_libs: true, 12057*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 12058*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 12059*333d2b36SAndroid Build Coastguard Worker } 12060*333d2b36SAndroid Build Coastguard Worker 12061*333d2b36SAndroid Build Coastguard Worker cc_library { 12062*333d2b36SAndroid Build Coastguard Worker name: "libembeddedjni", 12063*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 12064*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.cpp"], 12065*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 12066*333d2b36SAndroid Build Coastguard Worker stl: "none", 12067*333d2b36SAndroid Build Coastguard Worker } 12068*333d2b36SAndroid Build Coastguard Worker 12069*333d2b36SAndroid Build Coastguard Worker cc_library { 12070*333d2b36SAndroid Build Coastguard Worker name: "libjni", 12071*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 12072*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.cpp"], 12073*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 12074*333d2b36SAndroid Build Coastguard Worker stl: "none", 12075*333d2b36SAndroid Build Coastguard Worker } 12076*333d2b36SAndroid Build Coastguard Worker 12077*333d2b36SAndroid Build Coastguard Worker cc_library { 12078*333d2b36SAndroid Build Coastguard Worker name: "libotherapex", 12079*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 12080*333d2b36SAndroid Build Coastguard Worker srcs: ["otherapex.cpp"], 12081*333d2b36SAndroid Build Coastguard Worker apex_available: ["otherapex"], 12082*333d2b36SAndroid Build Coastguard Worker stubs: { 12083*333d2b36SAndroid Build Coastguard Worker symbol_file: "libotherapex.map.txt", 12084*333d2b36SAndroid Build Coastguard Worker versions: ["1", "2", "3"], 12085*333d2b36SAndroid Build Coastguard Worker }, 12086*333d2b36SAndroid Build Coastguard Worker stl: "none", 12087*333d2b36SAndroid Build Coastguard Worker } 12088*333d2b36SAndroid Build Coastguard Worker 12089*333d2b36SAndroid Build Coastguard Worker cc_library { 12090*333d2b36SAndroid Build Coastguard Worker name: "libplatform", 12091*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 12092*333d2b36SAndroid Build Coastguard Worker srcs: ["libplatform.cpp"], 12093*333d2b36SAndroid Build Coastguard Worker stubs: { 12094*333d2b36SAndroid Build Coastguard Worker symbol_file: "libplatform.map.txt", 12095*333d2b36SAndroid Build Coastguard Worker versions: ["1", "2", "3"], 12096*333d2b36SAndroid Build Coastguard Worker }, 12097*333d2b36SAndroid Build Coastguard Worker stl: "none", 12098*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 12099*333d2b36SAndroid Build Coastguard Worker } 12100*333d2b36SAndroid Build Coastguard Worker ` 12101*333d2b36SAndroid Build Coastguard Worker 12102*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 12103*333d2b36SAndroid Build Coastguard Worker name string 12104*333d2b36SAndroid Build Coastguard Worker bpModifier func(bp *bpmodify.Blueprint) 12105*333d2b36SAndroid Build Coastguard Worker dependencyPath []string 12106*333d2b36SAndroid Build Coastguard Worker }{ 12107*333d2b36SAndroid Build Coastguard Worker { 12108*333d2b36SAndroid Build Coastguard Worker name: "library dependency in other apex", 12109*333d2b36SAndroid Build Coastguard Worker bpModifier: addToSharedLibs("mylib", "libotherapex#impl"), 12110*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "mylib", "libotherapex"}, 12111*333d2b36SAndroid Build Coastguard Worker }, 12112*333d2b36SAndroid Build Coastguard Worker { 12113*333d2b36SAndroid Build Coastguard Worker name: "transitive library dependency in other apex", 12114*333d2b36SAndroid Build Coastguard Worker bpModifier: func(bp *bpmodify.Blueprint) { 12115*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("mylib", "libbar")(bp) 12116*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("libbar", "libotherapex#impl")(bp) 12117*333d2b36SAndroid Build Coastguard Worker }, 12118*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "mylib", "libbar", "libotherapex"}, 12119*333d2b36SAndroid Build Coastguard Worker }, 12120*333d2b36SAndroid Build Coastguard Worker { 12121*333d2b36SAndroid Build Coastguard Worker name: "library dependency in platform", 12122*333d2b36SAndroid Build Coastguard Worker bpModifier: addToSharedLibs("mylib", "libplatform#impl"), 12123*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "mylib", "libplatform"}, 12124*333d2b36SAndroid Build Coastguard Worker }, 12125*333d2b36SAndroid Build Coastguard Worker { 12126*333d2b36SAndroid Build Coastguard Worker name: "jni library dependency in other apex", 12127*333d2b36SAndroid Build Coastguard Worker bpModifier: addToSharedLibs("libjni", "libotherapex#impl"), 12128*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "libjni", "libotherapex"}, 12129*333d2b36SAndroid Build Coastguard Worker }, 12130*333d2b36SAndroid Build Coastguard Worker { 12131*333d2b36SAndroid Build Coastguard Worker name: "transitive jni library dependency in other apex", 12132*333d2b36SAndroid Build Coastguard Worker bpModifier: func(bp *bpmodify.Blueprint) { 12133*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("libjni", "libbar")(bp) 12134*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("libbar", "libotherapex#impl")(bp) 12135*333d2b36SAndroid Build Coastguard Worker }, 12136*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "libjni", "libbar", "libotherapex"}, 12137*333d2b36SAndroid Build Coastguard Worker }, 12138*333d2b36SAndroid Build Coastguard Worker { 12139*333d2b36SAndroid Build Coastguard Worker name: "jni library dependency in platform", 12140*333d2b36SAndroid Build Coastguard Worker bpModifier: addToSharedLibs("libjni", "libplatform#impl"), 12141*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "libjni", "libplatform"}, 12142*333d2b36SAndroid Build Coastguard Worker }, 12143*333d2b36SAndroid Build Coastguard Worker { 12144*333d2b36SAndroid Build Coastguard Worker name: "transitive jni library dependency in platform", 12145*333d2b36SAndroid Build Coastguard Worker bpModifier: func(bp *bpmodify.Blueprint) { 12146*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("libjni", "libbar")(bp) 12147*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("libbar", "libplatform#impl")(bp) 12148*333d2b36SAndroid Build Coastguard Worker }, 12149*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "libjni", "libbar", "libplatform"}, 12150*333d2b36SAndroid Build Coastguard Worker }, 12151*333d2b36SAndroid Build Coastguard Worker { 12152*333d2b36SAndroid Build Coastguard Worker name: "app jni library dependency in other apex", 12153*333d2b36SAndroid Build Coastguard Worker bpModifier: addToSharedLibs("libembeddedjni", "libotherapex#impl"), 12154*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"}, 12155*333d2b36SAndroid Build Coastguard Worker }, 12156*333d2b36SAndroid Build Coastguard Worker { 12157*333d2b36SAndroid Build Coastguard Worker name: "transitive app jni library dependency in other apex", 12158*333d2b36SAndroid Build Coastguard Worker bpModifier: func(bp *bpmodify.Blueprint) { 12159*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("libembeddedjni", "libbar")(bp) 12160*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("libbar", "libotherapex#impl")(bp) 12161*333d2b36SAndroid Build Coastguard Worker }, 12162*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"}, 12163*333d2b36SAndroid Build Coastguard Worker }, 12164*333d2b36SAndroid Build Coastguard Worker { 12165*333d2b36SAndroid Build Coastguard Worker name: "app jni library dependency in platform", 12166*333d2b36SAndroid Build Coastguard Worker bpModifier: addToSharedLibs("libembeddedjni", "libplatform#impl"), 12167*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"}, 12168*333d2b36SAndroid Build Coastguard Worker }, 12169*333d2b36SAndroid Build Coastguard Worker { 12170*333d2b36SAndroid Build Coastguard Worker name: "transitive app jni library dependency in platform", 12171*333d2b36SAndroid Build Coastguard Worker bpModifier: func(bp *bpmodify.Blueprint) { 12172*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("libembeddedjni", "libbar")(bp) 12173*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("libbar", "libplatform#impl")(bp) 12174*333d2b36SAndroid Build Coastguard Worker }, 12175*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"}, 12176*333d2b36SAndroid Build Coastguard Worker }, 12177*333d2b36SAndroid Build Coastguard Worker { 12178*333d2b36SAndroid Build Coastguard Worker name: "binary dependency in other apex", 12179*333d2b36SAndroid Build Coastguard Worker bpModifier: addToSharedLibs("mybin", "libotherapex#impl"), 12180*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "mybin", "libotherapex"}, 12181*333d2b36SAndroid Build Coastguard Worker }, 12182*333d2b36SAndroid Build Coastguard Worker { 12183*333d2b36SAndroid Build Coastguard Worker name: "transitive binary dependency in other apex", 12184*333d2b36SAndroid Build Coastguard Worker bpModifier: func(bp *bpmodify.Blueprint) { 12185*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("mybin", "libbar")(bp) 12186*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("libbar", "libotherapex#impl")(bp) 12187*333d2b36SAndroid Build Coastguard Worker }, 12188*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "mybin", "libbar", "libotherapex"}, 12189*333d2b36SAndroid Build Coastguard Worker }, 12190*333d2b36SAndroid Build Coastguard Worker { 12191*333d2b36SAndroid Build Coastguard Worker name: "binary dependency in platform", 12192*333d2b36SAndroid Build Coastguard Worker bpModifier: addToSharedLibs("mybin", "libplatform#impl"), 12193*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "mybin", "libplatform"}, 12194*333d2b36SAndroid Build Coastguard Worker }, 12195*333d2b36SAndroid Build Coastguard Worker { 12196*333d2b36SAndroid Build Coastguard Worker name: "transitive binary dependency in platform", 12197*333d2b36SAndroid Build Coastguard Worker bpModifier: func(bp *bpmodify.Blueprint) { 12198*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("mybin", "libbar")(bp) 12199*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("libbar", "libplatform#impl")(bp) 12200*333d2b36SAndroid Build Coastguard Worker }, 12201*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "mybin", "libbar", "libplatform"}, 12202*333d2b36SAndroid Build Coastguard Worker }, 12203*333d2b36SAndroid Build Coastguard Worker 12204*333d2b36SAndroid Build Coastguard Worker { 12205*333d2b36SAndroid Build Coastguard Worker name: "rust library dependency in other apex", 12206*333d2b36SAndroid Build Coastguard Worker bpModifier: addToSharedLibs("libmyrust", "libotherapex#impl"), 12207*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "libmyrust", "libotherapex"}, 12208*333d2b36SAndroid Build Coastguard Worker }, 12209*333d2b36SAndroid Build Coastguard Worker { 12210*333d2b36SAndroid Build Coastguard Worker name: "transitive rust library dependency in other apex", 12211*333d2b36SAndroid Build Coastguard Worker bpModifier: func(bp *bpmodify.Blueprint) { 12212*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("libmyrust", "libbar")(bp) 12213*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("libbar", "libotherapex#impl")(bp) 12214*333d2b36SAndroid Build Coastguard Worker }, 12215*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "libmyrust", "libbar", "libotherapex"}, 12216*333d2b36SAndroid Build Coastguard Worker }, 12217*333d2b36SAndroid Build Coastguard Worker { 12218*333d2b36SAndroid Build Coastguard Worker name: "rust library dependency in platform", 12219*333d2b36SAndroid Build Coastguard Worker bpModifier: addToSharedLibs("libmyrust", "libplatform#impl"), 12220*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "libmyrust", "libplatform"}, 12221*333d2b36SAndroid Build Coastguard Worker }, 12222*333d2b36SAndroid Build Coastguard Worker { 12223*333d2b36SAndroid Build Coastguard Worker name: "transitive rust library dependency in platform", 12224*333d2b36SAndroid Build Coastguard Worker bpModifier: func(bp *bpmodify.Blueprint) { 12225*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("libmyrust", "libbar")(bp) 12226*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("libbar", "libplatform#impl")(bp) 12227*333d2b36SAndroid Build Coastguard Worker }, 12228*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "libmyrust", "libbar", "libplatform"}, 12229*333d2b36SAndroid Build Coastguard Worker }, 12230*333d2b36SAndroid Build Coastguard Worker { 12231*333d2b36SAndroid Build Coastguard Worker name: "transitive rust library dylib dependency in other apex", 12232*333d2b36SAndroid Build Coastguard Worker bpModifier: func(bp *bpmodify.Blueprint) { 12233*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("libmyrust_transitive_dylib", "libotherapex#impl")(bp) 12234*333d2b36SAndroid Build Coastguard Worker }, 12235*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libotherapex"}, 12236*333d2b36SAndroid Build Coastguard Worker }, 12237*333d2b36SAndroid Build Coastguard Worker { 12238*333d2b36SAndroid Build Coastguard Worker name: "transitive rust library dylib dependency in platform", 12239*333d2b36SAndroid Build Coastguard Worker bpModifier: func(bp *bpmodify.Blueprint) { 12240*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("libmyrust_transitive_dylib", "libplatform#impl")(bp) 12241*333d2b36SAndroid Build Coastguard Worker }, 12242*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libplatform"}, 12243*333d2b36SAndroid Build Coastguard Worker }, 12244*333d2b36SAndroid Build Coastguard Worker { 12245*333d2b36SAndroid Build Coastguard Worker name: "transitive rust library rlib dependency in other apex", 12246*333d2b36SAndroid Build Coastguard Worker bpModifier: func(bp *bpmodify.Blueprint) { 12247*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("libmyrust_transitive_rlib", "libotherapex#impl")(bp) 12248*333d2b36SAndroid Build Coastguard Worker }, 12249*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libotherapex"}, 12250*333d2b36SAndroid Build Coastguard Worker }, 12251*333d2b36SAndroid Build Coastguard Worker { 12252*333d2b36SAndroid Build Coastguard Worker name: "transitive rust library rlib dependency in platform", 12253*333d2b36SAndroid Build Coastguard Worker bpModifier: func(bp *bpmodify.Blueprint) { 12254*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("libmyrust_transitive_rlib", "libplatform#impl")(bp) 12255*333d2b36SAndroid Build Coastguard Worker }, 12256*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libplatform"}, 12257*333d2b36SAndroid Build Coastguard Worker }, 12258*333d2b36SAndroid Build Coastguard Worker { 12259*333d2b36SAndroid Build Coastguard Worker name: "rust binary dependency in other apex", 12260*333d2b36SAndroid Build Coastguard Worker bpModifier: addToSharedLibs("myrustbin", "libotherapex#impl"), 12261*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "myrustbin", "libotherapex"}, 12262*333d2b36SAndroid Build Coastguard Worker }, 12263*333d2b36SAndroid Build Coastguard Worker { 12264*333d2b36SAndroid Build Coastguard Worker name: "transitive rust binary dependency in other apex", 12265*333d2b36SAndroid Build Coastguard Worker bpModifier: func(bp *bpmodify.Blueprint) { 12266*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("myrustbin", "libbar")(bp) 12267*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("libbar", "libotherapex#impl")(bp) 12268*333d2b36SAndroid Build Coastguard Worker }, 12269*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "myrustbin", "libbar", "libotherapex"}, 12270*333d2b36SAndroid Build Coastguard Worker }, 12271*333d2b36SAndroid Build Coastguard Worker { 12272*333d2b36SAndroid Build Coastguard Worker name: "rust binary dependency in platform", 12273*333d2b36SAndroid Build Coastguard Worker bpModifier: addToSharedLibs("myrustbin", "libplatform#impl"), 12274*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "myrustbin", "libplatform"}, 12275*333d2b36SAndroid Build Coastguard Worker }, 12276*333d2b36SAndroid Build Coastguard Worker { 12277*333d2b36SAndroid Build Coastguard Worker name: "transitive rust binary dependency in platform", 12278*333d2b36SAndroid Build Coastguard Worker bpModifier: func(bp *bpmodify.Blueprint) { 12279*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("myrustbin", "libbar")(bp) 12280*333d2b36SAndroid Build Coastguard Worker addToSharedLibs("libbar", "libplatform#impl")(bp) 12281*333d2b36SAndroid Build Coastguard Worker }, 12282*333d2b36SAndroid Build Coastguard Worker dependencyPath: []string{"myapex", "myrustbin", "libbar", "libplatform"}, 12283*333d2b36SAndroid Build Coastguard Worker }, 12284*333d2b36SAndroid Build Coastguard Worker } 12285*333d2b36SAndroid Build Coastguard Worker 12286*333d2b36SAndroid Build Coastguard Worker for _, testCase := range testCases { 12287*333d2b36SAndroid Build Coastguard Worker t.Run(testCase.name, func(t *testing.T) { 12288*333d2b36SAndroid Build Coastguard Worker t.Parallel() 12289*333d2b36SAndroid Build Coastguard Worker bp, err := bpmodify.NewBlueprint("", []byte(bpTemplate)) 12290*333d2b36SAndroid Build Coastguard Worker if err != nil { 12291*333d2b36SAndroid Build Coastguard Worker t.Fatal(err) 12292*333d2b36SAndroid Build Coastguard Worker } 12293*333d2b36SAndroid Build Coastguard Worker if testCase.bpModifier != nil { 12294*333d2b36SAndroid Build Coastguard Worker func() { 12295*333d2b36SAndroid Build Coastguard Worker defer func() { 12296*333d2b36SAndroid Build Coastguard Worker if r := recover(); r != nil { 12297*333d2b36SAndroid Build Coastguard Worker t.Fatalf("panic in bpModifier: %v", r) 12298*333d2b36SAndroid Build Coastguard Worker } 12299*333d2b36SAndroid Build Coastguard Worker }() 12300*333d2b36SAndroid Build Coastguard Worker testCase.bpModifier(bp) 12301*333d2b36SAndroid Build Coastguard Worker }() 12302*333d2b36SAndroid Build Coastguard Worker } 12303*333d2b36SAndroid Build Coastguard Worker android.GroupFixturePreparers( 12304*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithAndroidBuildComponents, 12305*333d2b36SAndroid Build Coastguard Worker cc.PrepareForTestWithCcBuildComponents, 12306*333d2b36SAndroid Build Coastguard Worker java.PrepareForTestWithDexpreopt, 12307*333d2b36SAndroid Build Coastguard Worker rust.PrepareForTestWithRustDefaultModules, 12308*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithApexBuildComponents, 12309*333d2b36SAndroid Build Coastguard Worker prepareForTestWithMyapex, 12310*333d2b36SAndroid Build Coastguard Worker prepareForTestWithOtherapex, 12311*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 12312*333d2b36SAndroid Build Coastguard Worker variables.BuildId = proptools.StringPtr("TEST.BUILD_ID") 12313*333d2b36SAndroid Build Coastguard Worker }), 12314*333d2b36SAndroid Build Coastguard Worker ).ExtendWithErrorHandler(android.FixtureCustomErrorHandler(checkErrors(testCase.dependencyPath))). 12315*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, bp.String()) 12316*333d2b36SAndroid Build Coastguard Worker }) 12317*333d2b36SAndroid Build Coastguard Worker } 12318*333d2b36SAndroid Build Coastguard Worker} 12319