1*333d2b36SAndroid Build Coastguard Worker// Copyright 2017 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage java 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "fmt" 19*333d2b36SAndroid Build Coastguard Worker "os" 20*333d2b36SAndroid Build Coastguard Worker "path/filepath" 21*333d2b36SAndroid Build Coastguard Worker "reflect" 22*333d2b36SAndroid Build Coastguard Worker "runtime" 23*333d2b36SAndroid Build Coastguard Worker "slices" 24*333d2b36SAndroid Build Coastguard Worker "strconv" 25*333d2b36SAndroid Build Coastguard Worker "strings" 26*333d2b36SAndroid Build Coastguard Worker "testing" 27*333d2b36SAndroid Build Coastguard Worker 28*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 29*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 30*333d2b36SAndroid Build Coastguard Worker 31*333d2b36SAndroid Build Coastguard Worker "android/soong/aconfig" 32*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 33*333d2b36SAndroid Build Coastguard Worker "android/soong/cc" 34*333d2b36SAndroid Build Coastguard Worker "android/soong/dexpreopt" 35*333d2b36SAndroid Build Coastguard Worker "android/soong/genrule" 36*333d2b36SAndroid Build Coastguard Worker) 37*333d2b36SAndroid Build Coastguard Worker 38*333d2b36SAndroid Build Coastguard Worker// Legacy preparer used for running tests within the java package. 39*333d2b36SAndroid Build Coastguard Worker// 40*333d2b36SAndroid Build Coastguard Worker// This includes everything that was needed to run any test in the java package prior to the 41*333d2b36SAndroid Build Coastguard Worker// introduction of the test fixtures. Tests that are being converted to use fixtures directly 42*333d2b36SAndroid Build Coastguard Worker// rather than through the testJava...() methods should avoid using this and instead use the 43*333d2b36SAndroid Build Coastguard Worker// various preparers directly, using android.GroupFixturePreparers(...) to group them when 44*333d2b36SAndroid Build Coastguard Worker// necessary. 45*333d2b36SAndroid Build Coastguard Worker// 46*333d2b36SAndroid Build Coastguard Worker// deprecated 47*333d2b36SAndroid Build Coastguard Workervar prepareForJavaTest = android.GroupFixturePreparers( 48*333d2b36SAndroid Build Coastguard Worker genrule.PrepareForTestWithGenRuleBuildComponents, 49*333d2b36SAndroid Build Coastguard Worker // Get the CC build components but not default modules. 50*333d2b36SAndroid Build Coastguard Worker cc.PrepareForTestWithCcBuildComponents, 51*333d2b36SAndroid Build Coastguard Worker // Include all the default java modules. 52*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithDexpreopt, 53*333d2b36SAndroid Build Coastguard Worker // Include aconfig modules. 54*333d2b36SAndroid Build Coastguard Worker aconfig.PrepareForTestWithAconfigBuildComponents, 55*333d2b36SAndroid Build Coastguard Worker) 56*333d2b36SAndroid Build Coastguard Worker 57*333d2b36SAndroid Build Coastguard Workerfunc TestMain(m *testing.M) { 58*333d2b36SAndroid Build Coastguard Worker os.Exit(m.Run()) 59*333d2b36SAndroid Build Coastguard Worker} 60*333d2b36SAndroid Build Coastguard Worker 61*333d2b36SAndroid Build Coastguard Worker// testJavaError is a legacy way of running tests of java modules that expect errors. 62*333d2b36SAndroid Build Coastguard Worker// 63*333d2b36SAndroid Build Coastguard Worker// See testJava for an explanation as to how to stop using this deprecated method. 64*333d2b36SAndroid Build Coastguard Worker// 65*333d2b36SAndroid Build Coastguard Worker// deprecated 66*333d2b36SAndroid Build Coastguard Workerfunc testJavaError(t *testing.T, pattern string, bp string) (*android.TestContext, android.Config) { 67*333d2b36SAndroid Build Coastguard Worker t.Helper() 68*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 69*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, dexpreopt.PrepareForTestByEnablingDexpreopt). 70*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)). 71*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, bp) 72*333d2b36SAndroid Build Coastguard Worker return result.TestContext, result.Config 73*333d2b36SAndroid Build Coastguard Worker} 74*333d2b36SAndroid Build Coastguard Worker 75*333d2b36SAndroid Build Coastguard Worker// testJavaWithFS runs tests using the prepareForJavaTest 76*333d2b36SAndroid Build Coastguard Worker// 77*333d2b36SAndroid Build Coastguard Worker// See testJava for an explanation as to how to stop using this deprecated method. 78*333d2b36SAndroid Build Coastguard Worker// 79*333d2b36SAndroid Build Coastguard Worker// deprecated 80*333d2b36SAndroid Build Coastguard Workerfunc testJavaWithFS(t *testing.T, bp string, fs android.MockFS) (*android.TestContext, android.Config) { 81*333d2b36SAndroid Build Coastguard Worker t.Helper() 82*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 83*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, fs.AddToFixture()).RunTestWithBp(t, bp) 84*333d2b36SAndroid Build Coastguard Worker return result.TestContext, result.Config 85*333d2b36SAndroid Build Coastguard Worker} 86*333d2b36SAndroid Build Coastguard Worker 87*333d2b36SAndroid Build Coastguard Worker// testJava runs tests using the prepareForJavaTest 88*333d2b36SAndroid Build Coastguard Worker// 89*333d2b36SAndroid Build Coastguard Worker// Do not add any new usages of this, instead use the prepareForJavaTest directly as it makes it 90*333d2b36SAndroid Build Coastguard Worker// much easier to customize the test behavior. 91*333d2b36SAndroid Build Coastguard Worker// 92*333d2b36SAndroid Build Coastguard Worker// If it is necessary to customize the behavior of an existing test that uses this then please first 93*333d2b36SAndroid Build Coastguard Worker// convert the test to using prepareForJavaTest first and then in a following change add the 94*333d2b36SAndroid Build Coastguard Worker// appropriate fixture preparers. Keeping the conversion change separate makes it easy to verify 95*333d2b36SAndroid Build Coastguard Worker// that it did not change the test behavior unexpectedly. 96*333d2b36SAndroid Build Coastguard Worker// 97*333d2b36SAndroid Build Coastguard Worker// deprecated 98*333d2b36SAndroid Build Coastguard Workerfunc testJava(t *testing.T, bp string) (*android.TestContext, android.Config) { 99*333d2b36SAndroid Build Coastguard Worker t.Helper() 100*333d2b36SAndroid Build Coastguard Worker result := prepareForJavaTest.RunTestWithBp(t, bp) 101*333d2b36SAndroid Build Coastguard Worker return result.TestContext, result.Config 102*333d2b36SAndroid Build Coastguard Worker} 103*333d2b36SAndroid Build Coastguard Worker 104*333d2b36SAndroid Build Coastguard Worker// defaultModuleToPath constructs a path to the turbine generate jar for a default test module that 105*333d2b36SAndroid Build Coastguard Worker// is defined in PrepareForIntegrationTestWithJava 106*333d2b36SAndroid Build Coastguard Workerfunc defaultModuleToPath(name string) string { 107*333d2b36SAndroid Build Coastguard Worker switch { 108*333d2b36SAndroid Build Coastguard Worker case name == `""`: 109*333d2b36SAndroid Build Coastguard Worker return name 110*333d2b36SAndroid Build Coastguard Worker case strings.HasSuffix(name, ".jar"): 111*333d2b36SAndroid Build Coastguard Worker return name 112*333d2b36SAndroid Build Coastguard Worker default: 113*333d2b36SAndroid Build Coastguard Worker return filepath.Join("out", "soong", ".intermediates", defaultJavaDir, name, "android_common", "turbine-combined", name+".jar") 114*333d2b36SAndroid Build Coastguard Worker } 115*333d2b36SAndroid Build Coastguard Worker} 116*333d2b36SAndroid Build Coastguard Worker 117*333d2b36SAndroid Build Coastguard Worker// Test that the PrepareForTestWithJavaDefaultModules provides all the files that it uses by 118*333d2b36SAndroid Build Coastguard Worker// running it in a fixture that requires all source files to exist. 119*333d2b36SAndroid Build Coastguard Workerfunc TestPrepareForTestWithJavaDefaultModules(t *testing.T) { 120*333d2b36SAndroid Build Coastguard Worker android.GroupFixturePreparers( 121*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 122*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestDisallowNonExistentPaths, 123*333d2b36SAndroid Build Coastguard Worker ).RunTest(t) 124*333d2b36SAndroid Build Coastguard Worker} 125*333d2b36SAndroid Build Coastguard Worker 126*333d2b36SAndroid Build Coastguard Workerfunc TestJavaLinkType(t *testing.T) { 127*333d2b36SAndroid Build Coastguard Worker testJava(t, ` 128*333d2b36SAndroid Build Coastguard Worker java_library { 129*333d2b36SAndroid Build Coastguard Worker name: "foo", 130*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 131*333d2b36SAndroid Build Coastguard Worker libs: ["bar"], 132*333d2b36SAndroid Build Coastguard Worker static_libs: ["baz"], 133*333d2b36SAndroid Build Coastguard Worker } 134*333d2b36SAndroid Build Coastguard Worker 135*333d2b36SAndroid Build Coastguard Worker java_library { 136*333d2b36SAndroid Build Coastguard Worker name: "bar", 137*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 138*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 139*333d2b36SAndroid Build Coastguard Worker } 140*333d2b36SAndroid Build Coastguard Worker 141*333d2b36SAndroid Build Coastguard Worker java_library { 142*333d2b36SAndroid Build Coastguard Worker name: "baz", 143*333d2b36SAndroid Build Coastguard Worker sdk_version: "system_current", 144*333d2b36SAndroid Build Coastguard Worker srcs: ["c.java"], 145*333d2b36SAndroid Build Coastguard Worker } 146*333d2b36SAndroid Build Coastguard Worker `) 147*333d2b36SAndroid Build Coastguard Worker 148*333d2b36SAndroid Build Coastguard Worker testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", ` 149*333d2b36SAndroid Build Coastguard Worker java_library { 150*333d2b36SAndroid Build Coastguard Worker name: "foo", 151*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 152*333d2b36SAndroid Build Coastguard Worker libs: ["bar"], 153*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 154*333d2b36SAndroid Build Coastguard Worker static_libs: ["baz"], 155*333d2b36SAndroid Build Coastguard Worker } 156*333d2b36SAndroid Build Coastguard Worker 157*333d2b36SAndroid Build Coastguard Worker java_library { 158*333d2b36SAndroid Build Coastguard Worker name: "bar", 159*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 160*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 161*333d2b36SAndroid Build Coastguard Worker } 162*333d2b36SAndroid Build Coastguard Worker 163*333d2b36SAndroid Build Coastguard Worker java_library { 164*333d2b36SAndroid Build Coastguard Worker name: "baz", 165*333d2b36SAndroid Build Coastguard Worker sdk_version: "system_current", 166*333d2b36SAndroid Build Coastguard Worker srcs: ["c.java"], 167*333d2b36SAndroid Build Coastguard Worker } 168*333d2b36SAndroid Build Coastguard Worker `) 169*333d2b36SAndroid Build Coastguard Worker 170*333d2b36SAndroid Build Coastguard Worker testJava(t, ` 171*333d2b36SAndroid Build Coastguard Worker java_library { 172*333d2b36SAndroid Build Coastguard Worker name: "foo", 173*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 174*333d2b36SAndroid Build Coastguard Worker libs: ["bar"], 175*333d2b36SAndroid Build Coastguard Worker sdk_version: "system_current", 176*333d2b36SAndroid Build Coastguard Worker static_libs: ["baz"], 177*333d2b36SAndroid Build Coastguard Worker } 178*333d2b36SAndroid Build Coastguard Worker 179*333d2b36SAndroid Build Coastguard Worker java_library { 180*333d2b36SAndroid Build Coastguard Worker name: "bar", 181*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 182*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 183*333d2b36SAndroid Build Coastguard Worker } 184*333d2b36SAndroid Build Coastguard Worker 185*333d2b36SAndroid Build Coastguard Worker java_library { 186*333d2b36SAndroid Build Coastguard Worker name: "baz", 187*333d2b36SAndroid Build Coastguard Worker sdk_version: "system_current", 188*333d2b36SAndroid Build Coastguard Worker srcs: ["c.java"], 189*333d2b36SAndroid Build Coastguard Worker } 190*333d2b36SAndroid Build Coastguard Worker `) 191*333d2b36SAndroid Build Coastguard Worker 192*333d2b36SAndroid Build Coastguard Worker testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", ` 193*333d2b36SAndroid Build Coastguard Worker java_library { 194*333d2b36SAndroid Build Coastguard Worker name: "foo", 195*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 196*333d2b36SAndroid Build Coastguard Worker libs: ["bar"], 197*333d2b36SAndroid Build Coastguard Worker sdk_version: "system_current", 198*333d2b36SAndroid Build Coastguard Worker static_libs: ["baz"], 199*333d2b36SAndroid Build Coastguard Worker } 200*333d2b36SAndroid Build Coastguard Worker 201*333d2b36SAndroid Build Coastguard Worker java_library { 202*333d2b36SAndroid Build Coastguard Worker name: "bar", 203*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 204*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 205*333d2b36SAndroid Build Coastguard Worker } 206*333d2b36SAndroid Build Coastguard Worker 207*333d2b36SAndroid Build Coastguard Worker java_library { 208*333d2b36SAndroid Build Coastguard Worker name: "baz", 209*333d2b36SAndroid Build Coastguard Worker srcs: ["c.java"], 210*333d2b36SAndroid Build Coastguard Worker } 211*333d2b36SAndroid Build Coastguard Worker `) 212*333d2b36SAndroid Build Coastguard Worker} 213*333d2b36SAndroid Build Coastguard Worker 214*333d2b36SAndroid Build Coastguard Workerfunc TestSimple(t *testing.T) { 215*333d2b36SAndroid Build Coastguard Worker bp := ` 216*333d2b36SAndroid Build Coastguard Worker java_library { 217*333d2b36SAndroid Build Coastguard Worker name: "foo", 218*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 219*333d2b36SAndroid Build Coastguard Worker libs: ["bar"], 220*333d2b36SAndroid Build Coastguard Worker static_libs: ["baz"], 221*333d2b36SAndroid Build Coastguard Worker } 222*333d2b36SAndroid Build Coastguard Worker 223*333d2b36SAndroid Build Coastguard Worker java_library { 224*333d2b36SAndroid Build Coastguard Worker name: "bar", 225*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 226*333d2b36SAndroid Build Coastguard Worker static_libs: ["quz"], 227*333d2b36SAndroid Build Coastguard Worker } 228*333d2b36SAndroid Build Coastguard Worker 229*333d2b36SAndroid Build Coastguard Worker java_library { 230*333d2b36SAndroid Build Coastguard Worker name: "baz", 231*333d2b36SAndroid Build Coastguard Worker srcs: ["c.java"], 232*333d2b36SAndroid Build Coastguard Worker static_libs: ["quz"], 233*333d2b36SAndroid Build Coastguard Worker } 234*333d2b36SAndroid Build Coastguard Worker 235*333d2b36SAndroid Build Coastguard Worker java_library { 236*333d2b36SAndroid Build Coastguard Worker name: "quz", 237*333d2b36SAndroid Build Coastguard Worker srcs: ["d.java"], 238*333d2b36SAndroid Build Coastguard Worker }` 239*333d2b36SAndroid Build Coastguard Worker 240*333d2b36SAndroid Build Coastguard Worker frameworkTurbineCombinedJars := []string{ 241*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/ext/android_common/turbine-combined/ext.jar", 242*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/framework/android_common/turbine-combined/framework.jar", 243*333d2b36SAndroid Build Coastguard Worker } 244*333d2b36SAndroid Build Coastguard Worker 245*333d2b36SAndroid Build Coastguard Worker frameworkTurbineJars := []string{ 246*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/ext/android_common/turbine/ext.jar", 247*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/default/java/framework/android_common/turbine/framework.jar", 248*333d2b36SAndroid Build Coastguard Worker } 249*333d2b36SAndroid Build Coastguard Worker 250*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 251*333d2b36SAndroid Build Coastguard Worker name string 252*333d2b36SAndroid Build Coastguard Worker 253*333d2b36SAndroid Build Coastguard Worker preparer android.FixturePreparer 254*333d2b36SAndroid Build Coastguard Worker 255*333d2b36SAndroid Build Coastguard Worker fooJavacInputs []string 256*333d2b36SAndroid Build Coastguard Worker fooJavacClasspath []string 257*333d2b36SAndroid Build Coastguard Worker fooCombinedInputs []string 258*333d2b36SAndroid Build Coastguard Worker fooHeaderCombinedInputs []string 259*333d2b36SAndroid Build Coastguard Worker 260*333d2b36SAndroid Build Coastguard Worker barJavacInputs []string 261*333d2b36SAndroid Build Coastguard Worker barJavacClasspath []string 262*333d2b36SAndroid Build Coastguard Worker barCombinedInputs []string 263*333d2b36SAndroid Build Coastguard Worker barHeaderCombinedInputs []string 264*333d2b36SAndroid Build Coastguard Worker }{ 265*333d2b36SAndroid Build Coastguard Worker { 266*333d2b36SAndroid Build Coastguard Worker name: "normal", 267*333d2b36SAndroid Build Coastguard Worker preparer: android.NullFixturePreparer, 268*333d2b36SAndroid Build Coastguard Worker fooJavacInputs: []string{"a.java"}, 269*333d2b36SAndroid Build Coastguard Worker fooJavacClasspath: slices.Concat( 270*333d2b36SAndroid Build Coastguard Worker frameworkTurbineCombinedJars, 271*333d2b36SAndroid Build Coastguard Worker []string{ 272*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/bar/android_common/turbine-combined/bar.jar", 273*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/baz/android_common/turbine-combined/baz.jar", 274*333d2b36SAndroid Build Coastguard Worker }, 275*333d2b36SAndroid Build Coastguard Worker ), 276*333d2b36SAndroid Build Coastguard Worker fooCombinedInputs: []string{ 277*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/foo/android_common/javac/foo.jar", 278*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/baz/android_common/combined/baz.jar", 279*333d2b36SAndroid Build Coastguard Worker }, 280*333d2b36SAndroid Build Coastguard Worker 281*333d2b36SAndroid Build Coastguard Worker fooHeaderCombinedInputs: []string{ 282*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/foo/android_common/turbine/foo.jar", 283*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/baz/android_common/turbine-combined/baz.jar", 284*333d2b36SAndroid Build Coastguard Worker }, 285*333d2b36SAndroid Build Coastguard Worker 286*333d2b36SAndroid Build Coastguard Worker barJavacInputs: []string{"b.java"}, 287*333d2b36SAndroid Build Coastguard Worker barJavacClasspath: slices.Concat( 288*333d2b36SAndroid Build Coastguard Worker frameworkTurbineCombinedJars, 289*333d2b36SAndroid Build Coastguard Worker []string{ 290*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/quz/android_common/turbine-combined/quz.jar", 291*333d2b36SAndroid Build Coastguard Worker }, 292*333d2b36SAndroid Build Coastguard Worker ), 293*333d2b36SAndroid Build Coastguard Worker barCombinedInputs: []string{ 294*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/bar/android_common/javac/bar.jar", 295*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/quz/android_common/javac/quz.jar", 296*333d2b36SAndroid Build Coastguard Worker }, 297*333d2b36SAndroid Build Coastguard Worker barHeaderCombinedInputs: []string{ 298*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/bar/android_common/turbine/bar.jar", 299*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/quz/android_common/turbine-combined/quz.jar", 300*333d2b36SAndroid Build Coastguard Worker }, 301*333d2b36SAndroid Build Coastguard Worker }, 302*333d2b36SAndroid Build Coastguard Worker { 303*333d2b36SAndroid Build Coastguard Worker name: "transitive classpath", 304*333d2b36SAndroid Build Coastguard Worker preparer: PrepareForTestWithTransitiveClasspathEnabled, 305*333d2b36SAndroid Build Coastguard Worker fooJavacInputs: []string{"a.java"}, 306*333d2b36SAndroid Build Coastguard Worker fooJavacClasspath: slices.Concat( 307*333d2b36SAndroid Build Coastguard Worker frameworkTurbineJars, 308*333d2b36SAndroid Build Coastguard Worker []string{ 309*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/bar/android_common/turbine/bar.jar", 310*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/quz/android_common/turbine/quz.jar", 311*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/baz/android_common/turbine/baz.jar", 312*333d2b36SAndroid Build Coastguard Worker }, 313*333d2b36SAndroid Build Coastguard Worker ), 314*333d2b36SAndroid Build Coastguard Worker fooCombinedInputs: []string{ 315*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/foo/android_common/javac/foo.jar", 316*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/baz/android_common/javac/baz.jar", 317*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/quz/android_common/javac/quz.jar", 318*333d2b36SAndroid Build Coastguard Worker }, 319*333d2b36SAndroid Build Coastguard Worker 320*333d2b36SAndroid Build Coastguard Worker fooHeaderCombinedInputs: []string{ 321*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/foo/android_common/turbine/foo.jar", 322*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/baz/android_common/turbine/baz.jar", 323*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/quz/android_common/turbine/quz.jar", 324*333d2b36SAndroid Build Coastguard Worker }, 325*333d2b36SAndroid Build Coastguard Worker 326*333d2b36SAndroid Build Coastguard Worker barJavacInputs: []string{"b.java"}, 327*333d2b36SAndroid Build Coastguard Worker barJavacClasspath: slices.Concat( 328*333d2b36SAndroid Build Coastguard Worker frameworkTurbineJars, 329*333d2b36SAndroid Build Coastguard Worker []string{"out/soong/.intermediates/quz/android_common/turbine/quz.jar"}, 330*333d2b36SAndroid Build Coastguard Worker ), 331*333d2b36SAndroid Build Coastguard Worker barCombinedInputs: []string{ 332*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/bar/android_common/javac/bar.jar", 333*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/quz/android_common/javac/quz.jar", 334*333d2b36SAndroid Build Coastguard Worker }, 335*333d2b36SAndroid Build Coastguard Worker barHeaderCombinedInputs: []string{ 336*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/bar/android_common/turbine/bar.jar", 337*333d2b36SAndroid Build Coastguard Worker "out/soong/.intermediates/quz/android_common/turbine/quz.jar", 338*333d2b36SAndroid Build Coastguard Worker }, 339*333d2b36SAndroid Build Coastguard Worker }, 340*333d2b36SAndroid Build Coastguard Worker } 341*333d2b36SAndroid Build Coastguard Worker 342*333d2b36SAndroid Build Coastguard Worker for _, tt := range testCases { 343*333d2b36SAndroid Build Coastguard Worker t.Run(tt.name, func(t *testing.T) { 344*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 345*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 346*333d2b36SAndroid Build Coastguard Worker tt.preparer, 347*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 348*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", "android_common") 349*333d2b36SAndroid Build Coastguard Worker 350*333d2b36SAndroid Build Coastguard Worker fooJavac := foo.Rule("javac") 351*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "foo javac inputs", tt.fooJavacInputs, fooJavac.Inputs) 352*333d2b36SAndroid Build Coastguard Worker 353*333d2b36SAndroid Build Coastguard Worker fooJavacClasspath := fooJavac.Args["classpath"] 354*333d2b36SAndroid Build Coastguard Worker android.AssertStringPathsRelativeToTopEquals(t, "foo javac classpath", result.Config, tt.fooJavacClasspath, 355*333d2b36SAndroid Build Coastguard Worker strings.Split(strings.TrimPrefix(fooJavacClasspath, "-classpath "), ":")) 356*333d2b36SAndroid Build Coastguard Worker 357*333d2b36SAndroid Build Coastguard Worker fooCombinedJar := foo.Output("combined/foo.jar") 358*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "foo combined inputs", tt.fooCombinedInputs, fooCombinedJar.Inputs) 359*333d2b36SAndroid Build Coastguard Worker 360*333d2b36SAndroid Build Coastguard Worker fooCombinedHeaderJar := foo.Output("turbine-combined/foo.jar") 361*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "foo header combined inputs", tt.fooHeaderCombinedInputs, fooCombinedHeaderJar.Inputs) 362*333d2b36SAndroid Build Coastguard Worker 363*333d2b36SAndroid Build Coastguard Worker bar := result.ModuleForTests("bar", "android_common") 364*333d2b36SAndroid Build Coastguard Worker barJavac := bar.Rule("javac") 365*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "bar javac inputs", tt.barJavacInputs, barJavac.Inputs) 366*333d2b36SAndroid Build Coastguard Worker 367*333d2b36SAndroid Build Coastguard Worker barJavacClasspath := barJavac.Args["classpath"] 368*333d2b36SAndroid Build Coastguard Worker android.AssertStringPathsRelativeToTopEquals(t, "bar javac classpath", result.Config, tt.barJavacClasspath, 369*333d2b36SAndroid Build Coastguard Worker strings.Split(strings.TrimPrefix(barJavacClasspath, "-classpath "), ":")) 370*333d2b36SAndroid Build Coastguard Worker 371*333d2b36SAndroid Build Coastguard Worker barCombinedJar := bar.Output("combined/bar.jar") 372*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "bar combined inputs", tt.barCombinedInputs, barCombinedJar.Inputs) 373*333d2b36SAndroid Build Coastguard Worker 374*333d2b36SAndroid Build Coastguard Worker barCombinedHeaderJar := bar.Output("turbine-combined/bar.jar") 375*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "bar header combined inputs", tt.barHeaderCombinedInputs, barCombinedHeaderJar.Inputs) 376*333d2b36SAndroid Build Coastguard Worker }) 377*333d2b36SAndroid Build Coastguard Worker } 378*333d2b36SAndroid Build Coastguard Worker} 379*333d2b36SAndroid Build Coastguard Worker 380*333d2b36SAndroid Build Coastguard Workerfunc TestExportedPlugins(t *testing.T) { 381*333d2b36SAndroid Build Coastguard Worker type Result struct { 382*333d2b36SAndroid Build Coastguard Worker library string 383*333d2b36SAndroid Build Coastguard Worker processors string 384*333d2b36SAndroid Build Coastguard Worker disableTurbine bool 385*333d2b36SAndroid Build Coastguard Worker } 386*333d2b36SAndroid Build Coastguard Worker var tests = []struct { 387*333d2b36SAndroid Build Coastguard Worker name string 388*333d2b36SAndroid Build Coastguard Worker extra string 389*333d2b36SAndroid Build Coastguard Worker results []Result 390*333d2b36SAndroid Build Coastguard Worker }{ 391*333d2b36SAndroid Build Coastguard Worker { 392*333d2b36SAndroid Build Coastguard Worker name: "Exported plugin is not a direct plugin", 393*333d2b36SAndroid Build Coastguard Worker extra: `java_library { name: "exports", srcs: ["a.java"], exported_plugins: ["plugin"] }`, 394*333d2b36SAndroid Build Coastguard Worker results: []Result{{library: "exports", processors: "-proc:none"}}, 395*333d2b36SAndroid Build Coastguard Worker }, 396*333d2b36SAndroid Build Coastguard Worker { 397*333d2b36SAndroid Build Coastguard Worker name: "Exports plugin to dependee", 398*333d2b36SAndroid Build Coastguard Worker extra: ` 399*333d2b36SAndroid Build Coastguard Worker java_library{name: "exports", exported_plugins: ["plugin"]} 400*333d2b36SAndroid Build Coastguard Worker java_library{name: "foo", srcs: ["a.java"], libs: ["exports"]} 401*333d2b36SAndroid Build Coastguard Worker java_library{name: "bar", srcs: ["a.java"], static_libs: ["exports"]} 402*333d2b36SAndroid Build Coastguard Worker `, 403*333d2b36SAndroid Build Coastguard Worker results: []Result{ 404*333d2b36SAndroid Build Coastguard Worker {library: "foo", processors: "-processor com.android.TestPlugin"}, 405*333d2b36SAndroid Build Coastguard Worker {library: "bar", processors: "-processor com.android.TestPlugin"}, 406*333d2b36SAndroid Build Coastguard Worker }, 407*333d2b36SAndroid Build Coastguard Worker }, 408*333d2b36SAndroid Build Coastguard Worker { 409*333d2b36SAndroid Build Coastguard Worker name: "Exports plugin to android_library", 410*333d2b36SAndroid Build Coastguard Worker extra: ` 411*333d2b36SAndroid Build Coastguard Worker java_library{name: "exports", exported_plugins: ["plugin"]} 412*333d2b36SAndroid Build Coastguard Worker android_library{name: "foo", srcs: ["a.java"], libs: ["exports"]} 413*333d2b36SAndroid Build Coastguard Worker android_library{name: "bar", srcs: ["a.java"], static_libs: ["exports"]} 414*333d2b36SAndroid Build Coastguard Worker `, 415*333d2b36SAndroid Build Coastguard Worker results: []Result{ 416*333d2b36SAndroid Build Coastguard Worker {library: "foo", processors: "-processor com.android.TestPlugin"}, 417*333d2b36SAndroid Build Coastguard Worker {library: "bar", processors: "-processor com.android.TestPlugin"}, 418*333d2b36SAndroid Build Coastguard Worker }, 419*333d2b36SAndroid Build Coastguard Worker }, 420*333d2b36SAndroid Build Coastguard Worker { 421*333d2b36SAndroid Build Coastguard Worker name: "Exports plugin is not propagated via transitive deps", 422*333d2b36SAndroid Build Coastguard Worker extra: ` 423*333d2b36SAndroid Build Coastguard Worker java_library{name: "exports", exported_plugins: ["plugin"]} 424*333d2b36SAndroid Build Coastguard Worker java_library{name: "foo", srcs: ["a.java"], libs: ["exports"]} 425*333d2b36SAndroid Build Coastguard Worker java_library{name: "bar", srcs: ["a.java"], static_libs: ["foo"]} 426*333d2b36SAndroid Build Coastguard Worker `, 427*333d2b36SAndroid Build Coastguard Worker results: []Result{ 428*333d2b36SAndroid Build Coastguard Worker {library: "foo", processors: "-processor com.android.TestPlugin"}, 429*333d2b36SAndroid Build Coastguard Worker {library: "bar", processors: "-proc:none"}, 430*333d2b36SAndroid Build Coastguard Worker }, 431*333d2b36SAndroid Build Coastguard Worker }, 432*333d2b36SAndroid Build Coastguard Worker { 433*333d2b36SAndroid Build Coastguard Worker name: "Exports plugin appends to plugins", 434*333d2b36SAndroid Build Coastguard Worker extra: ` 435*333d2b36SAndroid Build Coastguard Worker java_plugin{name: "plugin2", processor_class: "com.android.TestPlugin2"} 436*333d2b36SAndroid Build Coastguard Worker java_library{name: "exports", exported_plugins: ["plugin"]} 437*333d2b36SAndroid Build Coastguard Worker java_library{name: "foo", srcs: ["a.java"], libs: ["exports"], plugins: ["plugin2"]} 438*333d2b36SAndroid Build Coastguard Worker `, 439*333d2b36SAndroid Build Coastguard Worker results: []Result{ 440*333d2b36SAndroid Build Coastguard Worker {library: "foo", processors: "-processor com.android.TestPlugin,com.android.TestPlugin2"}, 441*333d2b36SAndroid Build Coastguard Worker }, 442*333d2b36SAndroid Build Coastguard Worker }, 443*333d2b36SAndroid Build Coastguard Worker { 444*333d2b36SAndroid Build Coastguard Worker name: "Exports plugin to with generates_api to dependee", 445*333d2b36SAndroid Build Coastguard Worker extra: ` 446*333d2b36SAndroid Build Coastguard Worker java_library{name: "exports", exported_plugins: ["plugin_generates_api"]} 447*333d2b36SAndroid Build Coastguard Worker java_library{name: "foo", srcs: ["a.java"], libs: ["exports"]} 448*333d2b36SAndroid Build Coastguard Worker java_library{name: "bar", srcs: ["a.java"], static_libs: ["exports"]} 449*333d2b36SAndroid Build Coastguard Worker `, 450*333d2b36SAndroid Build Coastguard Worker results: []Result{ 451*333d2b36SAndroid Build Coastguard Worker {library: "foo", processors: "-processor com.android.TestPlugin", disableTurbine: true}, 452*333d2b36SAndroid Build Coastguard Worker {library: "bar", processors: "-processor com.android.TestPlugin", disableTurbine: true}, 453*333d2b36SAndroid Build Coastguard Worker }, 454*333d2b36SAndroid Build Coastguard Worker }, 455*333d2b36SAndroid Build Coastguard Worker } 456*333d2b36SAndroid Build Coastguard Worker 457*333d2b36SAndroid Build Coastguard Worker for _, test := range tests { 458*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 459*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 460*333d2b36SAndroid Build Coastguard Worker java_plugin { 461*333d2b36SAndroid Build Coastguard Worker name: "plugin", 462*333d2b36SAndroid Build Coastguard Worker processor_class: "com.android.TestPlugin", 463*333d2b36SAndroid Build Coastguard Worker } 464*333d2b36SAndroid Build Coastguard Worker java_plugin { 465*333d2b36SAndroid Build Coastguard Worker name: "plugin_generates_api", 466*333d2b36SAndroid Build Coastguard Worker generates_api: true, 467*333d2b36SAndroid Build Coastguard Worker processor_class: "com.android.TestPlugin", 468*333d2b36SAndroid Build Coastguard Worker } 469*333d2b36SAndroid Build Coastguard Worker `+test.extra) 470*333d2b36SAndroid Build Coastguard Worker 471*333d2b36SAndroid Build Coastguard Worker for _, want := range test.results { 472*333d2b36SAndroid Build Coastguard Worker javac := ctx.ModuleForTests(want.library, "android_common").Rule("javac") 473*333d2b36SAndroid Build Coastguard Worker if javac.Args["processor"] != want.processors { 474*333d2b36SAndroid Build Coastguard Worker t.Errorf("For library %v, expected %v, found %v", want.library, want.processors, javac.Args["processor"]) 475*333d2b36SAndroid Build Coastguard Worker } 476*333d2b36SAndroid Build Coastguard Worker turbine := ctx.ModuleForTests(want.library, "android_common").MaybeRule("turbine") 477*333d2b36SAndroid Build Coastguard Worker disableTurbine := turbine.BuildParams.Rule == nil 478*333d2b36SAndroid Build Coastguard Worker if disableTurbine != want.disableTurbine { 479*333d2b36SAndroid Build Coastguard Worker t.Errorf("For library %v, expected disableTurbine %v, found %v", want.library, want.disableTurbine, disableTurbine) 480*333d2b36SAndroid Build Coastguard Worker } 481*333d2b36SAndroid Build Coastguard Worker } 482*333d2b36SAndroid Build Coastguard Worker }) 483*333d2b36SAndroid Build Coastguard Worker } 484*333d2b36SAndroid Build Coastguard Worker} 485*333d2b36SAndroid Build Coastguard Worker 486*333d2b36SAndroid Build Coastguard Workerfunc TestSdkVersionByPartition(t *testing.T) { 487*333d2b36SAndroid Build Coastguard Worker testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", ` 488*333d2b36SAndroid Build Coastguard Worker java_library { 489*333d2b36SAndroid Build Coastguard Worker name: "foo", 490*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 491*333d2b36SAndroid Build Coastguard Worker vendor: true, 492*333d2b36SAndroid Build Coastguard Worker } 493*333d2b36SAndroid Build Coastguard Worker `) 494*333d2b36SAndroid Build Coastguard Worker 495*333d2b36SAndroid Build Coastguard Worker testJava(t, ` 496*333d2b36SAndroid Build Coastguard Worker java_library { 497*333d2b36SAndroid Build Coastguard Worker name: "bar", 498*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 499*333d2b36SAndroid Build Coastguard Worker } 500*333d2b36SAndroid Build Coastguard Worker `) 501*333d2b36SAndroid Build Coastguard Worker 502*333d2b36SAndroid Build Coastguard Worker for _, enforce := range []bool{true, false} { 503*333d2b36SAndroid Build Coastguard Worker bp := ` 504*333d2b36SAndroid Build Coastguard Worker java_library { 505*333d2b36SAndroid Build Coastguard Worker name: "foo", 506*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 507*333d2b36SAndroid Build Coastguard Worker product_specific: true, 508*333d2b36SAndroid Build Coastguard Worker } 509*333d2b36SAndroid Build Coastguard Worker ` 510*333d2b36SAndroid Build Coastguard Worker 511*333d2b36SAndroid Build Coastguard Worker errorHandler := android.FixtureExpectsNoErrors 512*333d2b36SAndroid Build Coastguard Worker if enforce { 513*333d2b36SAndroid Build Coastguard Worker errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern("sdk_version must have a value when the module is located at vendor or product") 514*333d2b36SAndroid Build Coastguard Worker } 515*333d2b36SAndroid Build Coastguard Worker 516*333d2b36SAndroid Build Coastguard Worker android.GroupFixturePreparers( 517*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 518*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 519*333d2b36SAndroid Build Coastguard Worker variables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce) 520*333d2b36SAndroid Build Coastguard Worker }), 521*333d2b36SAndroid Build Coastguard Worker ). 522*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(errorHandler). 523*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, bp) 524*333d2b36SAndroid Build Coastguard Worker } 525*333d2b36SAndroid Build Coastguard Worker} 526*333d2b36SAndroid Build Coastguard Worker 527*333d2b36SAndroid Build Coastguard Workerfunc TestArchSpecific(t *testing.T) { 528*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 529*333d2b36SAndroid Build Coastguard Worker java_library { 530*333d2b36SAndroid Build Coastguard Worker name: "foo", 531*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 532*333d2b36SAndroid Build Coastguard Worker target: { 533*333d2b36SAndroid Build Coastguard Worker android: { 534*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 535*333d2b36SAndroid Build Coastguard Worker }, 536*333d2b36SAndroid Build Coastguard Worker }, 537*333d2b36SAndroid Build Coastguard Worker } 538*333d2b36SAndroid Build Coastguard Worker `) 539*333d2b36SAndroid Build Coastguard Worker 540*333d2b36SAndroid Build Coastguard Worker javac := ctx.ModuleForTests("foo", "android_common").Rule("javac") 541*333d2b36SAndroid Build Coastguard Worker if len(javac.Inputs) != 2 || javac.Inputs[0].String() != "a.java" || javac.Inputs[1].String() != "b.java" { 542*333d2b36SAndroid Build Coastguard Worker t.Errorf(`foo inputs %v != ["a.java", "b.java"]`, javac.Inputs) 543*333d2b36SAndroid Build Coastguard Worker } 544*333d2b36SAndroid Build Coastguard Worker} 545*333d2b36SAndroid Build Coastguard Worker 546*333d2b36SAndroid Build Coastguard Workerfunc TestBinary(t *testing.T) { 547*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 548*333d2b36SAndroid Build Coastguard Worker java_library_host { 549*333d2b36SAndroid Build Coastguard Worker name: "foo", 550*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 551*333d2b36SAndroid Build Coastguard Worker } 552*333d2b36SAndroid Build Coastguard Worker 553*333d2b36SAndroid Build Coastguard Worker java_binary_host { 554*333d2b36SAndroid Build Coastguard Worker name: "bar", 555*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 556*333d2b36SAndroid Build Coastguard Worker static_libs: ["foo"], 557*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 558*333d2b36SAndroid Build Coastguard Worker } 559*333d2b36SAndroid Build Coastguard Worker 560*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 561*333d2b36SAndroid Build Coastguard Worker name: "libjni", 562*333d2b36SAndroid Build Coastguard Worker host_supported: true, 563*333d2b36SAndroid Build Coastguard Worker device_supported: false, 564*333d2b36SAndroid Build Coastguard Worker stl: "none", 565*333d2b36SAndroid Build Coastguard Worker } 566*333d2b36SAndroid Build Coastguard Worker `) 567*333d2b36SAndroid Build Coastguard Worker 568*333d2b36SAndroid Build Coastguard Worker buildOS := ctx.Config().BuildOS.String() 569*333d2b36SAndroid Build Coastguard Worker 570*333d2b36SAndroid Build Coastguard Worker bar := ctx.ModuleForTests("bar", buildOS+"_common") 571*333d2b36SAndroid Build Coastguard Worker barJar := bar.Output("bar.jar").Output.String() 572*333d2b36SAndroid Build Coastguard Worker barWrapperDeps := bar.Output("bar").Implicits.Strings() 573*333d2b36SAndroid Build Coastguard Worker 574*333d2b36SAndroid Build Coastguard Worker libjni := ctx.ModuleForTests("libjni", buildOS+"_x86_64_shared") 575*333d2b36SAndroid Build Coastguard Worker libjniSO := libjni.Rule("Cp").Output.String() 576*333d2b36SAndroid Build Coastguard Worker 577*333d2b36SAndroid Build Coastguard Worker // Test that the install binary wrapper depends on the installed jar file 578*333d2b36SAndroid Build Coastguard Worker if g, w := barWrapperDeps, barJar; !android.InList(w, g) { 579*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected binary wrapper implicits to contain %q, got %q", w, g) 580*333d2b36SAndroid Build Coastguard Worker } 581*333d2b36SAndroid Build Coastguard Worker 582*333d2b36SAndroid Build Coastguard Worker // Test that the install binary wrapper depends on the installed JNI libraries 583*333d2b36SAndroid Build Coastguard Worker if g, w := barWrapperDeps, libjniSO; !android.InList(w, g) { 584*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected binary wrapper implicits to contain %q, got %q", w, g) 585*333d2b36SAndroid Build Coastguard Worker } 586*333d2b36SAndroid Build Coastguard Worker} 587*333d2b36SAndroid Build Coastguard Worker 588*333d2b36SAndroid Build Coastguard Workerfunc TestTest(t *testing.T) { 589*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 590*333d2b36SAndroid Build Coastguard Worker java_test_host { 591*333d2b36SAndroid Build Coastguard Worker name: "foo", 592*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 593*333d2b36SAndroid Build Coastguard Worker jni_libs: ["libjni"], 594*333d2b36SAndroid Build Coastguard Worker } 595*333d2b36SAndroid Build Coastguard Worker 596*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 597*333d2b36SAndroid Build Coastguard Worker name: "libjni", 598*333d2b36SAndroid Build Coastguard Worker host_supported: true, 599*333d2b36SAndroid Build Coastguard Worker device_supported: false, 600*333d2b36SAndroid Build Coastguard Worker stl: "none", 601*333d2b36SAndroid Build Coastguard Worker } 602*333d2b36SAndroid Build Coastguard Worker `) 603*333d2b36SAndroid Build Coastguard Worker 604*333d2b36SAndroid Build Coastguard Worker buildOS := ctx.Config().BuildOS.String() 605*333d2b36SAndroid Build Coastguard Worker 606*333d2b36SAndroid Build Coastguard Worker foo := ctx.ModuleForTests("foo", buildOS+"_common").Module().(*TestHost) 607*333d2b36SAndroid Build Coastguard Worker 608*333d2b36SAndroid Build Coastguard Worker expected := "lib64/libjni.so" 609*333d2b36SAndroid Build Coastguard Worker if runtime.GOOS == "darwin" { 610*333d2b36SAndroid Build Coastguard Worker expected = "lib64/libjni.dylib" 611*333d2b36SAndroid Build Coastguard Worker } 612*333d2b36SAndroid Build Coastguard Worker 613*333d2b36SAndroid Build Coastguard Worker fooTestData := foo.data 614*333d2b36SAndroid Build Coastguard Worker if len(fooTestData) != 1 || fooTestData[0].Rel() != expected { 615*333d2b36SAndroid Build Coastguard Worker t.Errorf(`expected foo test data relative path [%q], got %q`, 616*333d2b36SAndroid Build Coastguard Worker expected, fooTestData.Strings()) 617*333d2b36SAndroid Build Coastguard Worker } 618*333d2b36SAndroid Build Coastguard Worker} 619*333d2b36SAndroid Build Coastguard Worker 620*333d2b36SAndroid Build Coastguard Workerfunc TestHostBinaryNoJavaDebugInfoOverride(t *testing.T) { 621*333d2b36SAndroid Build Coastguard Worker bp := ` 622*333d2b36SAndroid Build Coastguard Worker java_library { 623*333d2b36SAndroid Build Coastguard Worker name: "target_library", 624*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 625*333d2b36SAndroid Build Coastguard Worker } 626*333d2b36SAndroid Build Coastguard Worker 627*333d2b36SAndroid Build Coastguard Worker java_binary_host { 628*333d2b36SAndroid Build Coastguard Worker name: "host_binary", 629*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 630*333d2b36SAndroid Build Coastguard Worker } 631*333d2b36SAndroid Build Coastguard Worker ` 632*333d2b36SAndroid Build Coastguard Worker 633*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 634*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 635*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 636*333d2b36SAndroid Build Coastguard Worker variables.MinimizeJavaDebugInfo = proptools.BoolPtr(true) 637*333d2b36SAndroid Build Coastguard Worker }), 638*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 639*333d2b36SAndroid Build Coastguard Worker 640*333d2b36SAndroid Build Coastguard Worker // first, check that the -g flag is added to target modules 641*333d2b36SAndroid Build Coastguard Worker targetLibrary := result.ModuleForTests("target_library", "android_common") 642*333d2b36SAndroid Build Coastguard Worker targetJavaFlags := targetLibrary.Module().VariablesForTests()["javacFlags"] 643*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(targetJavaFlags, "-g:source,lines") { 644*333d2b36SAndroid Build Coastguard Worker t.Errorf("target library javac flags %v should contain "+ 645*333d2b36SAndroid Build Coastguard Worker "-g:source,lines override with MinimizeJavaDebugInfo", targetJavaFlags) 646*333d2b36SAndroid Build Coastguard Worker } 647*333d2b36SAndroid Build Coastguard Worker 648*333d2b36SAndroid Build Coastguard Worker // check that -g is not overridden for host modules 649*333d2b36SAndroid Build Coastguard Worker buildOS := result.Config.BuildOS.String() 650*333d2b36SAndroid Build Coastguard Worker hostBinary := result.ModuleForTests("host_binary", buildOS+"_common") 651*333d2b36SAndroid Build Coastguard Worker hostJavaFlags := hostBinary.Module().VariablesForTests()["javacFlags"] 652*333d2b36SAndroid Build Coastguard Worker if strings.Contains(hostJavaFlags, "-g:source,lines") { 653*333d2b36SAndroid Build Coastguard Worker t.Errorf("java_binary_host javac flags %v should not have "+ 654*333d2b36SAndroid Build Coastguard Worker "-g:source,lines override with MinimizeJavaDebugInfo", hostJavaFlags) 655*333d2b36SAndroid Build Coastguard Worker } 656*333d2b36SAndroid Build Coastguard Worker} 657*333d2b36SAndroid Build Coastguard Worker 658*333d2b36SAndroid Build Coastguard Worker// A minimal context object for use with DexJarBuildPath 659*333d2b36SAndroid Build Coastguard Workertype moduleErrorfTestCtx struct { 660*333d2b36SAndroid Build Coastguard Worker} 661*333d2b36SAndroid Build Coastguard Worker 662*333d2b36SAndroid Build Coastguard Workerfunc (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) { 663*333d2b36SAndroid Build Coastguard Worker} 664*333d2b36SAndroid Build Coastguard Worker 665*333d2b36SAndroid Build Coastguard Workervar _ android.ModuleErrorfContext = (*moduleErrorfTestCtx)(nil) 666*333d2b36SAndroid Build Coastguard Worker 667*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuilts(t *testing.T) { 668*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 669*333d2b36SAndroid Build Coastguard Worker java_library { 670*333d2b36SAndroid Build Coastguard Worker name: "foo", 671*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java", ":stubs-source"], 672*333d2b36SAndroid Build Coastguard Worker libs: ["bar", "sdklib.stubs"], 673*333d2b36SAndroid Build Coastguard Worker static_libs: ["baz"], 674*333d2b36SAndroid Build Coastguard Worker } 675*333d2b36SAndroid Build Coastguard Worker 676*333d2b36SAndroid Build Coastguard Worker java_import { 677*333d2b36SAndroid Build Coastguard Worker name: "bar", 678*333d2b36SAndroid Build Coastguard Worker jars: ["a.jar"], 679*333d2b36SAndroid Build Coastguard Worker } 680*333d2b36SAndroid Build Coastguard Worker 681*333d2b36SAndroid Build Coastguard Worker java_import { 682*333d2b36SAndroid Build Coastguard Worker name: "baz", 683*333d2b36SAndroid Build Coastguard Worker jars: ["b.jar"], 684*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 685*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 686*333d2b36SAndroid Build Coastguard Worker } 687*333d2b36SAndroid Build Coastguard Worker 688*333d2b36SAndroid Build Coastguard Worker dex_import { 689*333d2b36SAndroid Build Coastguard Worker name: "qux", 690*333d2b36SAndroid Build Coastguard Worker jars: ["b.jar"], 691*333d2b36SAndroid Build Coastguard Worker } 692*333d2b36SAndroid Build Coastguard Worker 693*333d2b36SAndroid Build Coastguard Worker java_sdk_library_import { 694*333d2b36SAndroid Build Coastguard Worker name: "sdklib", 695*333d2b36SAndroid Build Coastguard Worker public: { 696*333d2b36SAndroid Build Coastguard Worker jars: ["c.jar"], 697*333d2b36SAndroid Build Coastguard Worker }, 698*333d2b36SAndroid Build Coastguard Worker } 699*333d2b36SAndroid Build Coastguard Worker 700*333d2b36SAndroid Build Coastguard Worker prebuilt_stubs_sources { 701*333d2b36SAndroid Build Coastguard Worker name: "stubs-source", 702*333d2b36SAndroid Build Coastguard Worker srcs: ["stubs/sources"], 703*333d2b36SAndroid Build Coastguard Worker } 704*333d2b36SAndroid Build Coastguard Worker 705*333d2b36SAndroid Build Coastguard Worker java_test_import { 706*333d2b36SAndroid Build Coastguard Worker name: "test", 707*333d2b36SAndroid Build Coastguard Worker jars: ["a.jar"], 708*333d2b36SAndroid Build Coastguard Worker test_suites: ["cts"], 709*333d2b36SAndroid Build Coastguard Worker test_config: "AndroidTest.xml", 710*333d2b36SAndroid Build Coastguard Worker } 711*333d2b36SAndroid Build Coastguard Worker `) 712*333d2b36SAndroid Build Coastguard Worker 713*333d2b36SAndroid Build Coastguard Worker fooModule := ctx.ModuleForTests("foo", "android_common") 714*333d2b36SAndroid Build Coastguard Worker javac := fooModule.Rule("javac") 715*333d2b36SAndroid Build Coastguard Worker combineJar := ctx.ModuleForTests("foo", "android_common").Description("for javac") 716*333d2b36SAndroid Build Coastguard Worker barModule := ctx.ModuleForTests("bar", "android_common") 717*333d2b36SAndroid Build Coastguard Worker barJar := barModule.Output("combined/bar.jar").Output 718*333d2b36SAndroid Build Coastguard Worker bazModule := ctx.ModuleForTests("baz", "android_common") 719*333d2b36SAndroid Build Coastguard Worker bazJar := bazModule.Output("combined/baz.jar").Output 720*333d2b36SAndroid Build Coastguard Worker sdklibStubsJar := ctx.ModuleForTests("sdklib.stubs", "android_common"). 721*333d2b36SAndroid Build Coastguard Worker Output("combined/sdklib.stubs.jar").Output 722*333d2b36SAndroid Build Coastguard Worker 723*333d2b36SAndroid Build Coastguard Worker fooLibrary := fooModule.Module().(*Library) 724*333d2b36SAndroid Build Coastguard Worker assertDeepEquals(t, "foo unique sources incorrect", 725*333d2b36SAndroid Build Coastguard Worker []string{"a.java"}, fooLibrary.uniqueSrcFiles.Strings()) 726*333d2b36SAndroid Build Coastguard Worker 727*333d2b36SAndroid Build Coastguard Worker assertDeepEquals(t, "foo java source jars incorrect", 728*333d2b36SAndroid Build Coastguard Worker []string{".intermediates/stubs-source/android_common/stubs-source-stubs.srcjar"}, 729*333d2b36SAndroid Build Coastguard Worker android.NormalizePathsForTesting(fooLibrary.compiledSrcJars)) 730*333d2b36SAndroid Build Coastguard Worker 731*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(javac.Args["classpath"], barJar.String()) { 732*333d2b36SAndroid Build Coastguard Worker t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], barJar.String()) 733*333d2b36SAndroid Build Coastguard Worker } 734*333d2b36SAndroid Build Coastguard Worker 735*333d2b36SAndroid Build Coastguard Worker errCtx := moduleErrorfTestCtx{} 736*333d2b36SAndroid Build Coastguard Worker barDexJar := barModule.Module().(*Import).DexJarBuildPath(errCtx) 737*333d2b36SAndroid Build Coastguard Worker if barDexJar.IsSet() { 738*333d2b36SAndroid Build Coastguard Worker t.Errorf("bar dex jar build path expected to be set, got %s", barDexJar) 739*333d2b36SAndroid Build Coastguard Worker } 740*333d2b36SAndroid Build Coastguard Worker 741*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(javac.Args["classpath"], sdklibStubsJar.String()) { 742*333d2b36SAndroid Build Coastguard Worker t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], sdklibStubsJar.String()) 743*333d2b36SAndroid Build Coastguard Worker } 744*333d2b36SAndroid Build Coastguard Worker 745*333d2b36SAndroid Build Coastguard Worker if len(combineJar.Inputs) != 2 || combineJar.Inputs[1].String() != bazJar.String() { 746*333d2b36SAndroid Build Coastguard Worker t.Errorf("foo combineJar inputs %v does not contain %q", combineJar.Inputs, bazJar.String()) 747*333d2b36SAndroid Build Coastguard Worker } 748*333d2b36SAndroid Build Coastguard Worker 749*333d2b36SAndroid Build Coastguard Worker bazDexJar := bazModule.Module().(*Import).DexJarBuildPath(errCtx).Path() 750*333d2b36SAndroid Build Coastguard Worker expectedDexJar := "out/soong/.intermediates/baz/android_common/dex/baz.jar" 751*333d2b36SAndroid Build Coastguard Worker android.AssertPathRelativeToTopEquals(t, "baz dex jar build path", expectedDexJar, bazDexJar) 752*333d2b36SAndroid Build Coastguard Worker 753*333d2b36SAndroid Build Coastguard Worker ctx.ModuleForTests("qux", "android_common").Rule("Cp") 754*333d2b36SAndroid Build Coastguard Worker 755*333d2b36SAndroid Build Coastguard Worker entries := android.AndroidMkEntriesForTest(t, ctx, fooModule.Module())[0] 756*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "java_library", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0]) 757*333d2b36SAndroid Build Coastguard Worker entries = android.AndroidMkEntriesForTest(t, ctx, barModule.Module())[0] 758*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "java_import", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0]) 759*333d2b36SAndroid Build Coastguard Worker} 760*333d2b36SAndroid Build Coastguard Worker 761*333d2b36SAndroid Build Coastguard Workerfunc assertDeepEquals(t *testing.T, message string, expected interface{}, actual interface{}) { 762*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(expected, actual) { 763*333d2b36SAndroid Build Coastguard Worker t.Errorf("%s: expected %q, found %q", message, expected, actual) 764*333d2b36SAndroid Build Coastguard Worker } 765*333d2b36SAndroid Build Coastguard Worker} 766*333d2b36SAndroid Build Coastguard Worker 767*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltStubsSources(t *testing.T) { 768*333d2b36SAndroid Build Coastguard Worker test := func(t *testing.T, sourcesPath string, expectedInputs []string) { 769*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJavaWithFS(t, fmt.Sprintf(` 770*333d2b36SAndroid Build Coastguard Workerprebuilt_stubs_sources { 771*333d2b36SAndroid Build Coastguard Worker name: "stubs-source", 772*333d2b36SAndroid Build Coastguard Worker srcs: ["%s"], 773*333d2b36SAndroid Build Coastguard Worker}`, sourcesPath), map[string][]byte{ 774*333d2b36SAndroid Build Coastguard Worker "stubs/sources/pkg/A.java": nil, 775*333d2b36SAndroid Build Coastguard Worker "stubs/sources/pkg/B.java": nil, 776*333d2b36SAndroid Build Coastguard Worker }) 777*333d2b36SAndroid Build Coastguard Worker 778*333d2b36SAndroid Build Coastguard Worker zipSrc := ctx.ModuleForTests("stubs-source", "android_common").Rule("zip_src") 779*333d2b36SAndroid Build Coastguard Worker if expected, actual := expectedInputs, zipSrc.Inputs.Strings(); !reflect.DeepEqual(expected, actual) { 780*333d2b36SAndroid Build Coastguard Worker t.Errorf("mismatch of inputs to soong_zip: expected %q, actual %q", expected, actual) 781*333d2b36SAndroid Build Coastguard Worker } 782*333d2b36SAndroid Build Coastguard Worker } 783*333d2b36SAndroid Build Coastguard Worker 784*333d2b36SAndroid Build Coastguard Worker t.Run("empty/missing directory", func(t *testing.T) { 785*333d2b36SAndroid Build Coastguard Worker test(t, "empty-directory", nil) 786*333d2b36SAndroid Build Coastguard Worker }) 787*333d2b36SAndroid Build Coastguard Worker 788*333d2b36SAndroid Build Coastguard Worker t.Run("non-empty set of sources", func(t *testing.T) { 789*333d2b36SAndroid Build Coastguard Worker test(t, "stubs/sources", []string{ 790*333d2b36SAndroid Build Coastguard Worker "stubs/sources/pkg/A.java", 791*333d2b36SAndroid Build Coastguard Worker "stubs/sources/pkg/B.java", 792*333d2b36SAndroid Build Coastguard Worker }) 793*333d2b36SAndroid Build Coastguard Worker }) 794*333d2b36SAndroid Build Coastguard Worker} 795*333d2b36SAndroid Build Coastguard Worker 796*333d2b36SAndroid Build Coastguard Workerfunc TestDefaults(t *testing.T) { 797*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 798*333d2b36SAndroid Build Coastguard Worker java_defaults { 799*333d2b36SAndroid Build Coastguard Worker name: "defaults", 800*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 801*333d2b36SAndroid Build Coastguard Worker libs: ["bar"], 802*333d2b36SAndroid Build Coastguard Worker static_libs: ["baz"], 803*333d2b36SAndroid Build Coastguard Worker optimize: {enabled: false}, 804*333d2b36SAndroid Build Coastguard Worker } 805*333d2b36SAndroid Build Coastguard Worker 806*333d2b36SAndroid Build Coastguard Worker java_library { 807*333d2b36SAndroid Build Coastguard Worker name: "foo", 808*333d2b36SAndroid Build Coastguard Worker defaults: ["defaults"], 809*333d2b36SAndroid Build Coastguard Worker } 810*333d2b36SAndroid Build Coastguard Worker 811*333d2b36SAndroid Build Coastguard Worker java_library { 812*333d2b36SAndroid Build Coastguard Worker name: "bar", 813*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 814*333d2b36SAndroid Build Coastguard Worker } 815*333d2b36SAndroid Build Coastguard Worker 816*333d2b36SAndroid Build Coastguard Worker java_library { 817*333d2b36SAndroid Build Coastguard Worker name: "baz", 818*333d2b36SAndroid Build Coastguard Worker srcs: ["c.java"], 819*333d2b36SAndroid Build Coastguard Worker } 820*333d2b36SAndroid Build Coastguard Worker 821*333d2b36SAndroid Build Coastguard Worker android_test { 822*333d2b36SAndroid Build Coastguard Worker name: "atestOptimize", 823*333d2b36SAndroid Build Coastguard Worker defaults: ["defaults"], 824*333d2b36SAndroid Build Coastguard Worker optimize: {enabled: true}, 825*333d2b36SAndroid Build Coastguard Worker } 826*333d2b36SAndroid Build Coastguard Worker 827*333d2b36SAndroid Build Coastguard Worker android_test { 828*333d2b36SAndroid Build Coastguard Worker name: "atestNoOptimize", 829*333d2b36SAndroid Build Coastguard Worker defaults: ["defaults"], 830*333d2b36SAndroid Build Coastguard Worker } 831*333d2b36SAndroid Build Coastguard Worker 832*333d2b36SAndroid Build Coastguard Worker android_test { 833*333d2b36SAndroid Build Coastguard Worker name: "atestDefault", 834*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 835*333d2b36SAndroid Build Coastguard Worker } 836*333d2b36SAndroid Build Coastguard Worker `) 837*333d2b36SAndroid Build Coastguard Worker 838*333d2b36SAndroid Build Coastguard Worker javac := ctx.ModuleForTests("foo", "android_common").Rule("javac") 839*333d2b36SAndroid Build Coastguard Worker combineJar := ctx.ModuleForTests("foo", "android_common").Description("for javac") 840*333d2b36SAndroid Build Coastguard Worker 841*333d2b36SAndroid Build Coastguard Worker if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "a.java" { 842*333d2b36SAndroid Build Coastguard Worker t.Errorf(`foo inputs %v != ["a.java"]`, javac.Inputs) 843*333d2b36SAndroid Build Coastguard Worker } 844*333d2b36SAndroid Build Coastguard Worker 845*333d2b36SAndroid Build Coastguard Worker barTurbine := filepath.Join("out", "soong", ".intermediates", "bar", "android_common", "turbine-combined", "bar.jar") 846*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(javac.Args["classpath"], barTurbine) { 847*333d2b36SAndroid Build Coastguard Worker t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], barTurbine) 848*333d2b36SAndroid Build Coastguard Worker } 849*333d2b36SAndroid Build Coastguard Worker 850*333d2b36SAndroid Build Coastguard Worker baz := ctx.ModuleForTests("baz", "android_common").Rule("javac").Output.String() 851*333d2b36SAndroid Build Coastguard Worker if len(combineJar.Inputs) != 2 || combineJar.Inputs[1].String() != baz { 852*333d2b36SAndroid Build Coastguard Worker t.Errorf("foo combineJar inputs %v does not contain %q", combineJar.Inputs, baz) 853*333d2b36SAndroid Build Coastguard Worker } 854*333d2b36SAndroid Build Coastguard Worker 855*333d2b36SAndroid Build Coastguard Worker atestOptimize := ctx.ModuleForTests("atestOptimize", "android_common").MaybeRule("r8") 856*333d2b36SAndroid Build Coastguard Worker if atestOptimize.Output == nil { 857*333d2b36SAndroid Build Coastguard Worker t.Errorf("atestOptimize should optimize APK") 858*333d2b36SAndroid Build Coastguard Worker } 859*333d2b36SAndroid Build Coastguard Worker 860*333d2b36SAndroid Build Coastguard Worker atestNoOptimize := ctx.ModuleForTests("atestNoOptimize", "android_common").MaybeRule("d8") 861*333d2b36SAndroid Build Coastguard Worker if atestNoOptimize.Output == nil { 862*333d2b36SAndroid Build Coastguard Worker t.Errorf("atestNoOptimize should not optimize APK") 863*333d2b36SAndroid Build Coastguard Worker } 864*333d2b36SAndroid Build Coastguard Worker 865*333d2b36SAndroid Build Coastguard Worker atestDefault := ctx.ModuleForTests("atestDefault", "android_common").MaybeRule("d8") 866*333d2b36SAndroid Build Coastguard Worker if atestDefault.Output == nil { 867*333d2b36SAndroid Build Coastguard Worker t.Errorf("atestDefault should not optimize APK") 868*333d2b36SAndroid Build Coastguard Worker } 869*333d2b36SAndroid Build Coastguard Worker} 870*333d2b36SAndroid Build Coastguard Worker 871*333d2b36SAndroid Build Coastguard Workerfunc TestResources(t *testing.T) { 872*333d2b36SAndroid Build Coastguard Worker var table = []struct { 873*333d2b36SAndroid Build Coastguard Worker name string 874*333d2b36SAndroid Build Coastguard Worker prop string 875*333d2b36SAndroid Build Coastguard Worker extra string 876*333d2b36SAndroid Build Coastguard Worker args string 877*333d2b36SAndroid Build Coastguard Worker }{ 878*333d2b36SAndroid Build Coastguard Worker { 879*333d2b36SAndroid Build Coastguard Worker // Test that a module with java_resource_dirs includes the files 880*333d2b36SAndroid Build Coastguard Worker name: "resource dirs", 881*333d2b36SAndroid Build Coastguard Worker prop: `java_resource_dirs: ["java-res"]`, 882*333d2b36SAndroid Build Coastguard Worker args: "-C java-res -f java-res/a/a -f java-res/b/b", 883*333d2b36SAndroid Build Coastguard Worker }, 884*333d2b36SAndroid Build Coastguard Worker { 885*333d2b36SAndroid Build Coastguard Worker // Test that a module with java_resources includes the files 886*333d2b36SAndroid Build Coastguard Worker name: "resource files", 887*333d2b36SAndroid Build Coastguard Worker prop: `java_resources: ["java-res/a/a", "java-res/b/b"]`, 888*333d2b36SAndroid Build Coastguard Worker args: "-C . -f java-res/a/a -f java-res/b/b", 889*333d2b36SAndroid Build Coastguard Worker }, 890*333d2b36SAndroid Build Coastguard Worker { 891*333d2b36SAndroid Build Coastguard Worker // Test that a module with a filegroup in java_resources includes the files with the 892*333d2b36SAndroid Build Coastguard Worker // path prefix 893*333d2b36SAndroid Build Coastguard Worker name: "resource filegroup", 894*333d2b36SAndroid Build Coastguard Worker prop: `java_resources: [":foo-res"]`, 895*333d2b36SAndroid Build Coastguard Worker extra: ` 896*333d2b36SAndroid Build Coastguard Worker filegroup { 897*333d2b36SAndroid Build Coastguard Worker name: "foo-res", 898*333d2b36SAndroid Build Coastguard Worker path: "java-res", 899*333d2b36SAndroid Build Coastguard Worker srcs: ["java-res/a/a", "java-res/b/b"], 900*333d2b36SAndroid Build Coastguard Worker }`, 901*333d2b36SAndroid Build Coastguard Worker args: "-C java-res -f java-res/a/a -f java-res/b/b", 902*333d2b36SAndroid Build Coastguard Worker }, 903*333d2b36SAndroid Build Coastguard Worker { 904*333d2b36SAndroid Build Coastguard Worker // Test that a module with wildcards in java_resource_dirs has the correct path prefixes 905*333d2b36SAndroid Build Coastguard Worker name: "wildcard dirs", 906*333d2b36SAndroid Build Coastguard Worker prop: `java_resource_dirs: ["java-res/*"]`, 907*333d2b36SAndroid Build Coastguard Worker args: "-C java-res/a -f java-res/a/a -C java-res/b -f java-res/b/b", 908*333d2b36SAndroid Build Coastguard Worker }, 909*333d2b36SAndroid Build Coastguard Worker { 910*333d2b36SAndroid Build Coastguard Worker // Test that a module exclude_java_resource_dirs excludes the files 911*333d2b36SAndroid Build Coastguard Worker name: "wildcard dirs", 912*333d2b36SAndroid Build Coastguard Worker prop: `java_resource_dirs: ["java-res/*"], exclude_java_resource_dirs: ["java-res/b"]`, 913*333d2b36SAndroid Build Coastguard Worker args: "-C java-res/a -f java-res/a/a", 914*333d2b36SAndroid Build Coastguard Worker }, 915*333d2b36SAndroid Build Coastguard Worker { 916*333d2b36SAndroid Build Coastguard Worker // Test wildcards in java_resources 917*333d2b36SAndroid Build Coastguard Worker name: "wildcard files", 918*333d2b36SAndroid Build Coastguard Worker prop: `java_resources: ["java-res/**/*"]`, 919*333d2b36SAndroid Build Coastguard Worker args: "-C . -f java-res/a/a -f java-res/b/b", 920*333d2b36SAndroid Build Coastguard Worker }, 921*333d2b36SAndroid Build Coastguard Worker { 922*333d2b36SAndroid Build Coastguard Worker // Test exclude_java_resources with java_resources 923*333d2b36SAndroid Build Coastguard Worker name: "wildcard files with exclude", 924*333d2b36SAndroid Build Coastguard Worker prop: `java_resources: ["java-res/**/*"], exclude_java_resources: ["java-res/b/*"]`, 925*333d2b36SAndroid Build Coastguard Worker args: "-C . -f java-res/a/a", 926*333d2b36SAndroid Build Coastguard Worker }, 927*333d2b36SAndroid Build Coastguard Worker { 928*333d2b36SAndroid Build Coastguard Worker // Test exclude_java_resources with java_resource_dirs 929*333d2b36SAndroid Build Coastguard Worker name: "resource dirs with exclude files", 930*333d2b36SAndroid Build Coastguard Worker prop: `java_resource_dirs: ["java-res"], exclude_java_resources: ["java-res/b/b"]`, 931*333d2b36SAndroid Build Coastguard Worker args: "-C java-res -f java-res/a/a", 932*333d2b36SAndroid Build Coastguard Worker }, 933*333d2b36SAndroid Build Coastguard Worker { 934*333d2b36SAndroid Build Coastguard Worker // Test exclude_java_resource_dirs with java_resource_dirs 935*333d2b36SAndroid Build Coastguard Worker name: "resource dirs with exclude files", 936*333d2b36SAndroid Build Coastguard Worker prop: `java_resource_dirs: ["java-res", "java-res2"], exclude_java_resource_dirs: ["java-res2"]`, 937*333d2b36SAndroid Build Coastguard Worker args: "-C java-res -f java-res/a/a -f java-res/b/b", 938*333d2b36SAndroid Build Coastguard Worker }, 939*333d2b36SAndroid Build Coastguard Worker } 940*333d2b36SAndroid Build Coastguard Worker 941*333d2b36SAndroid Build Coastguard Worker for _, test := range table { 942*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 943*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJavaWithFS(t, ` 944*333d2b36SAndroid Build Coastguard Worker java_library { 945*333d2b36SAndroid Build Coastguard Worker name: "foo", 946*333d2b36SAndroid Build Coastguard Worker srcs: [ 947*333d2b36SAndroid Build Coastguard Worker "a.java", 948*333d2b36SAndroid Build Coastguard Worker "b.java", 949*333d2b36SAndroid Build Coastguard Worker "c.java", 950*333d2b36SAndroid Build Coastguard Worker ], 951*333d2b36SAndroid Build Coastguard Worker `+test.prop+`, 952*333d2b36SAndroid Build Coastguard Worker } 953*333d2b36SAndroid Build Coastguard Worker `+test.extra, 954*333d2b36SAndroid Build Coastguard Worker map[string][]byte{ 955*333d2b36SAndroid Build Coastguard Worker "java-res/a/a": nil, 956*333d2b36SAndroid Build Coastguard Worker "java-res/b/b": nil, 957*333d2b36SAndroid Build Coastguard Worker "java-res2/a": nil, 958*333d2b36SAndroid Build Coastguard Worker }, 959*333d2b36SAndroid Build Coastguard Worker ) 960*333d2b36SAndroid Build Coastguard Worker 961*333d2b36SAndroid Build Coastguard Worker foo := ctx.ModuleForTests("foo", "android_common").Output("withres/foo.jar") 962*333d2b36SAndroid Build Coastguard Worker fooRes := ctx.ModuleForTests("foo", "android_common").Output("res/foo.jar") 963*333d2b36SAndroid Build Coastguard Worker 964*333d2b36SAndroid Build Coastguard Worker if !inList(fooRes.Output.String(), foo.Inputs.Strings()) { 965*333d2b36SAndroid Build Coastguard Worker t.Errorf("foo combined jars %v does not contain %q", 966*333d2b36SAndroid Build Coastguard Worker foo.Inputs.Strings(), fooRes.Output.String()) 967*333d2b36SAndroid Build Coastguard Worker } 968*333d2b36SAndroid Build Coastguard Worker 969*333d2b36SAndroid Build Coastguard Worker if fooRes.Args["jarArgs"] != test.args { 970*333d2b36SAndroid Build Coastguard Worker t.Errorf("foo resource jar args %q is not %q", 971*333d2b36SAndroid Build Coastguard Worker fooRes.Args["jarArgs"], test.args) 972*333d2b36SAndroid Build Coastguard Worker } 973*333d2b36SAndroid Build Coastguard Worker }) 974*333d2b36SAndroid Build Coastguard Worker } 975*333d2b36SAndroid Build Coastguard Worker} 976*333d2b36SAndroid Build Coastguard Worker 977*333d2b36SAndroid Build Coastguard Workerfunc TestIncludeSrcs(t *testing.T) { 978*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJavaWithFS(t, ` 979*333d2b36SAndroid Build Coastguard Worker java_library { 980*333d2b36SAndroid Build Coastguard Worker name: "foo", 981*333d2b36SAndroid Build Coastguard Worker srcs: [ 982*333d2b36SAndroid Build Coastguard Worker "a.java", 983*333d2b36SAndroid Build Coastguard Worker "b.java", 984*333d2b36SAndroid Build Coastguard Worker "c.java", 985*333d2b36SAndroid Build Coastguard Worker ], 986*333d2b36SAndroid Build Coastguard Worker include_srcs: true, 987*333d2b36SAndroid Build Coastguard Worker } 988*333d2b36SAndroid Build Coastguard Worker 989*333d2b36SAndroid Build Coastguard Worker java_library { 990*333d2b36SAndroid Build Coastguard Worker name: "bar", 991*333d2b36SAndroid Build Coastguard Worker srcs: [ 992*333d2b36SAndroid Build Coastguard Worker "a.java", 993*333d2b36SAndroid Build Coastguard Worker "b.java", 994*333d2b36SAndroid Build Coastguard Worker "c.java", 995*333d2b36SAndroid Build Coastguard Worker ], 996*333d2b36SAndroid Build Coastguard Worker java_resource_dirs: ["java-res"], 997*333d2b36SAndroid Build Coastguard Worker include_srcs: true, 998*333d2b36SAndroid Build Coastguard Worker } 999*333d2b36SAndroid Build Coastguard Worker `, map[string][]byte{ 1000*333d2b36SAndroid Build Coastguard Worker "java-res/a/a": nil, 1001*333d2b36SAndroid Build Coastguard Worker "java-res/b/b": nil, 1002*333d2b36SAndroid Build Coastguard Worker "java-res2/a": nil, 1003*333d2b36SAndroid Build Coastguard Worker }) 1004*333d2b36SAndroid Build Coastguard Worker 1005*333d2b36SAndroid Build Coastguard Worker // Test a library with include_srcs: true 1006*333d2b36SAndroid Build Coastguard Worker foo := ctx.ModuleForTests("foo", "android_common").Output("withres/foo.jar") 1007*333d2b36SAndroid Build Coastguard Worker fooSrcJar := ctx.ModuleForTests("foo", "android_common").Output("foo.srcjar") 1008*333d2b36SAndroid Build Coastguard Worker 1009*333d2b36SAndroid Build Coastguard Worker if g, w := fooSrcJar.Output.String(), foo.Inputs.Strings(); !inList(g, w) { 1010*333d2b36SAndroid Build Coastguard Worker t.Errorf("foo combined jars %v does not contain %q", w, g) 1011*333d2b36SAndroid Build Coastguard Worker } 1012*333d2b36SAndroid Build Coastguard Worker 1013*333d2b36SAndroid Build Coastguard Worker if g, w := fooSrcJar.Args["jarArgs"], "-C . -f a.java -f b.java -f c.java"; g != w { 1014*333d2b36SAndroid Build Coastguard Worker t.Errorf("foo source jar args %q is not %q", w, g) 1015*333d2b36SAndroid Build Coastguard Worker } 1016*333d2b36SAndroid Build Coastguard Worker 1017*333d2b36SAndroid Build Coastguard Worker // Test a library with include_srcs: true and resources 1018*333d2b36SAndroid Build Coastguard Worker bar := ctx.ModuleForTests("bar", "android_common").Output("withres/bar.jar") 1019*333d2b36SAndroid Build Coastguard Worker barResCombined := ctx.ModuleForTests("bar", "android_common").Output("res-combined/bar.jar") 1020*333d2b36SAndroid Build Coastguard Worker barRes := ctx.ModuleForTests("bar", "android_common").Output("res/bar.jar") 1021*333d2b36SAndroid Build Coastguard Worker barSrcJar := ctx.ModuleForTests("bar", "android_common").Output("bar.srcjar") 1022*333d2b36SAndroid Build Coastguard Worker 1023*333d2b36SAndroid Build Coastguard Worker if g, w := barSrcJar.Output.String(), barResCombined.Inputs.Strings(); !inList(g, w) { 1024*333d2b36SAndroid Build Coastguard Worker t.Errorf("bar combined resource jars %v does not contain %q", w, g) 1025*333d2b36SAndroid Build Coastguard Worker } 1026*333d2b36SAndroid Build Coastguard Worker 1027*333d2b36SAndroid Build Coastguard Worker if g, w := barRes.Output.String(), barResCombined.Inputs.Strings(); !inList(g, w) { 1028*333d2b36SAndroid Build Coastguard Worker t.Errorf("bar combined resource jars %v does not contain %q", w, g) 1029*333d2b36SAndroid Build Coastguard Worker } 1030*333d2b36SAndroid Build Coastguard Worker 1031*333d2b36SAndroid Build Coastguard Worker if g, w := barResCombined.Output.String(), bar.Inputs.Strings(); !inList(g, w) { 1032*333d2b36SAndroid Build Coastguard Worker t.Errorf("bar combined jars %v does not contain %q", w, g) 1033*333d2b36SAndroid Build Coastguard Worker } 1034*333d2b36SAndroid Build Coastguard Worker 1035*333d2b36SAndroid Build Coastguard Worker if g, w := barSrcJar.Args["jarArgs"], "-C . -f a.java -f b.java -f c.java"; g != w { 1036*333d2b36SAndroid Build Coastguard Worker t.Errorf("bar source jar args %q is not %q", w, g) 1037*333d2b36SAndroid Build Coastguard Worker } 1038*333d2b36SAndroid Build Coastguard Worker 1039*333d2b36SAndroid Build Coastguard Worker if g, w := barRes.Args["jarArgs"], "-C java-res -f java-res/a/a -f java-res/b/b"; g != w { 1040*333d2b36SAndroid Build Coastguard Worker t.Errorf("bar resource jar args %q is not %q", w, g) 1041*333d2b36SAndroid Build Coastguard Worker } 1042*333d2b36SAndroid Build Coastguard Worker} 1043*333d2b36SAndroid Build Coastguard Worker 1044*333d2b36SAndroid Build Coastguard Workerfunc TestGeneratedSources(t *testing.T) { 1045*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJavaWithFS(t, ` 1046*333d2b36SAndroid Build Coastguard Worker java_library { 1047*333d2b36SAndroid Build Coastguard Worker name: "foo", 1048*333d2b36SAndroid Build Coastguard Worker srcs: [ 1049*333d2b36SAndroid Build Coastguard Worker "a*.java", 1050*333d2b36SAndroid Build Coastguard Worker ":gen", 1051*333d2b36SAndroid Build Coastguard Worker "b*.java", 1052*333d2b36SAndroid Build Coastguard Worker ], 1053*333d2b36SAndroid Build Coastguard Worker } 1054*333d2b36SAndroid Build Coastguard Worker 1055*333d2b36SAndroid Build Coastguard Worker genrule { 1056*333d2b36SAndroid Build Coastguard Worker name: "gen", 1057*333d2b36SAndroid Build Coastguard Worker tool_files: ["java-res/a"], 1058*333d2b36SAndroid Build Coastguard Worker out: ["gen.java"], 1059*333d2b36SAndroid Build Coastguard Worker } 1060*333d2b36SAndroid Build Coastguard Worker `, map[string][]byte{ 1061*333d2b36SAndroid Build Coastguard Worker "a.java": nil, 1062*333d2b36SAndroid Build Coastguard Worker "b.java": nil, 1063*333d2b36SAndroid Build Coastguard Worker }) 1064*333d2b36SAndroid Build Coastguard Worker 1065*333d2b36SAndroid Build Coastguard Worker javac := ctx.ModuleForTests("foo", "android_common").Rule("javac") 1066*333d2b36SAndroid Build Coastguard Worker genrule := ctx.ModuleForTests("gen", "").Rule("generator") 1067*333d2b36SAndroid Build Coastguard Worker 1068*333d2b36SAndroid Build Coastguard Worker if filepath.Base(genrule.Output.String()) != "gen.java" { 1069*333d2b36SAndroid Build Coastguard Worker t.Fatalf(`gen output file %v is not ".../gen.java"`, genrule.Output.String()) 1070*333d2b36SAndroid Build Coastguard Worker } 1071*333d2b36SAndroid Build Coastguard Worker 1072*333d2b36SAndroid Build Coastguard Worker if len(javac.Inputs) != 3 || 1073*333d2b36SAndroid Build Coastguard Worker javac.Inputs[0].String() != "a.java" || 1074*333d2b36SAndroid Build Coastguard Worker javac.Inputs[1].String() != genrule.Output.String() || 1075*333d2b36SAndroid Build Coastguard Worker javac.Inputs[2].String() != "b.java" { 1076*333d2b36SAndroid Build Coastguard Worker t.Errorf(`foo inputs %v != ["a.java", ".../gen.java", "b.java"]`, javac.Inputs) 1077*333d2b36SAndroid Build Coastguard Worker } 1078*333d2b36SAndroid Build Coastguard Worker} 1079*333d2b36SAndroid Build Coastguard Worker 1080*333d2b36SAndroid Build Coastguard Workerfunc TestTurbine(t *testing.T) { 1081*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 1082*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, FixtureWithPrebuiltApis(map[string][]string{"14": {"foo"}})). 1083*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, ` 1084*333d2b36SAndroid Build Coastguard Worker java_library { 1085*333d2b36SAndroid Build Coastguard Worker name: "foo", 1086*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 1087*333d2b36SAndroid Build Coastguard Worker sdk_version: "14", 1088*333d2b36SAndroid Build Coastguard Worker } 1089*333d2b36SAndroid Build Coastguard Worker 1090*333d2b36SAndroid Build Coastguard Worker java_library { 1091*333d2b36SAndroid Build Coastguard Worker name: "bar", 1092*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 1093*333d2b36SAndroid Build Coastguard Worker static_libs: ["foo"], 1094*333d2b36SAndroid Build Coastguard Worker sdk_version: "14", 1095*333d2b36SAndroid Build Coastguard Worker } 1096*333d2b36SAndroid Build Coastguard Worker 1097*333d2b36SAndroid Build Coastguard Worker java_library { 1098*333d2b36SAndroid Build Coastguard Worker name: "baz", 1099*333d2b36SAndroid Build Coastguard Worker srcs: ["c.java"], 1100*333d2b36SAndroid Build Coastguard Worker libs: ["bar"], 1101*333d2b36SAndroid Build Coastguard Worker sdk_version: "14", 1102*333d2b36SAndroid Build Coastguard Worker } 1103*333d2b36SAndroid Build Coastguard Worker `) 1104*333d2b36SAndroid Build Coastguard Worker 1105*333d2b36SAndroid Build Coastguard Worker fooTurbine := result.ModuleForTests("foo", "android_common").Rule("turbine") 1106*333d2b36SAndroid Build Coastguard Worker barTurbine := result.ModuleForTests("bar", "android_common").Rule("turbine") 1107*333d2b36SAndroid Build Coastguard Worker barJavac := result.ModuleForTests("bar", "android_common").Rule("javac") 1108*333d2b36SAndroid Build Coastguard Worker barTurbineCombined := result.ModuleForTests("bar", "android_common").Description("for turbine") 1109*333d2b36SAndroid Build Coastguard Worker bazJavac := result.ModuleForTests("baz", "android_common").Rule("javac") 1110*333d2b36SAndroid Build Coastguard Worker 1111*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "foo inputs", []string{"a.java"}, fooTurbine.Inputs) 1112*333d2b36SAndroid Build Coastguard Worker 1113*333d2b36SAndroid Build Coastguard Worker fooHeaderJar := filepath.Join("out", "soong", ".intermediates", "foo", "android_common", "turbine-combined", "foo.jar") 1114*333d2b36SAndroid Build Coastguard Worker barTurbineJar := filepath.Join("out", "soong", ".intermediates", "bar", "android_common", "turbine", "bar.jar") 1115*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "bar turbine classpath", barTurbine.Args["turbineFlags"], fooHeaderJar) 1116*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "bar javac classpath", barJavac.Args["classpath"], fooHeaderJar) 1117*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "bar turbine combineJar", []string{barTurbineJar, fooHeaderJar}, barTurbineCombined.Inputs) 1118*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "baz javac classpath", bazJavac.Args["classpath"], "prebuilts/sdk/14/public/android.jar") 1119*333d2b36SAndroid Build Coastguard Worker} 1120*333d2b36SAndroid Build Coastguard Worker 1121*333d2b36SAndroid Build Coastguard Workerfunc TestSharding(t *testing.T) { 1122*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 1123*333d2b36SAndroid Build Coastguard Worker java_library { 1124*333d2b36SAndroid Build Coastguard Worker name: "bar", 1125*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java","b.java","c.java"], 1126*333d2b36SAndroid Build Coastguard Worker javac_shard_size: 1 1127*333d2b36SAndroid Build Coastguard Worker } 1128*333d2b36SAndroid Build Coastguard Worker `) 1129*333d2b36SAndroid Build Coastguard Worker 1130*333d2b36SAndroid Build Coastguard Worker barHeaderJar := filepath.Join("out", "soong", ".intermediates", "bar", "android_common", "turbine", "bar.jar") 1131*333d2b36SAndroid Build Coastguard Worker for i := 0; i < 3; i++ { 1132*333d2b36SAndroid Build Coastguard Worker barJavac := ctx.ModuleForTests("bar", "android_common").Description("javac" + strconv.Itoa(i)) 1133*333d2b36SAndroid Build Coastguard Worker if !strings.HasPrefix(barJavac.Args["classpath"], "-classpath "+barHeaderJar+":") { 1134*333d2b36SAndroid Build Coastguard Worker t.Errorf("bar javac classpath %v does start with %q", barJavac.Args["classpath"], barHeaderJar) 1135*333d2b36SAndroid Build Coastguard Worker } 1136*333d2b36SAndroid Build Coastguard Worker } 1137*333d2b36SAndroid Build Coastguard Worker} 1138*333d2b36SAndroid Build Coastguard Worker 1139*333d2b36SAndroid Build Coastguard Workerfunc TestExcludeFileGroupInSrcs(t *testing.T) { 1140*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 1141*333d2b36SAndroid Build Coastguard Worker java_library { 1142*333d2b36SAndroid Build Coastguard Worker name: "foo", 1143*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java", ":foo-srcs"], 1144*333d2b36SAndroid Build Coastguard Worker exclude_srcs: ["a.java", ":foo-excludes"], 1145*333d2b36SAndroid Build Coastguard Worker } 1146*333d2b36SAndroid Build Coastguard Worker 1147*333d2b36SAndroid Build Coastguard Worker filegroup { 1148*333d2b36SAndroid Build Coastguard Worker name: "foo-srcs", 1149*333d2b36SAndroid Build Coastguard Worker srcs: ["java-fg/a.java", "java-fg/b.java", "java-fg/c.java"], 1150*333d2b36SAndroid Build Coastguard Worker } 1151*333d2b36SAndroid Build Coastguard Worker 1152*333d2b36SAndroid Build Coastguard Worker filegroup { 1153*333d2b36SAndroid Build Coastguard Worker name: "foo-excludes", 1154*333d2b36SAndroid Build Coastguard Worker srcs: ["java-fg/a.java", "java-fg/b.java"], 1155*333d2b36SAndroid Build Coastguard Worker } 1156*333d2b36SAndroid Build Coastguard Worker `) 1157*333d2b36SAndroid Build Coastguard Worker 1158*333d2b36SAndroid Build Coastguard Worker javac := ctx.ModuleForTests("foo", "android_common").Rule("javac") 1159*333d2b36SAndroid Build Coastguard Worker 1160*333d2b36SAndroid Build Coastguard Worker if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "java-fg/c.java" { 1161*333d2b36SAndroid Build Coastguard Worker t.Errorf(`foo inputs %v != ["java-fg/c.java"]`, javac.Inputs) 1162*333d2b36SAndroid Build Coastguard Worker } 1163*333d2b36SAndroid Build Coastguard Worker} 1164*333d2b36SAndroid Build Coastguard Worker 1165*333d2b36SAndroid Build Coastguard Workerfunc TestJavaLibraryOutputFiles(t *testing.T) { 1166*333d2b36SAndroid Build Coastguard Worker testJavaWithFS(t, "", map[string][]byte{ 1167*333d2b36SAndroid Build Coastguard Worker "libcore/Android.bp": []byte(` 1168*333d2b36SAndroid Build Coastguard Worker java_library { 1169*333d2b36SAndroid Build Coastguard Worker name: "core", 1170*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 1171*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 1172*333d2b36SAndroid Build Coastguard Worker } 1173*333d2b36SAndroid Build Coastguard Worker 1174*333d2b36SAndroid Build Coastguard Worker filegroup { 1175*333d2b36SAndroid Build Coastguard Worker name: "core-jar", 1176*333d2b36SAndroid Build Coastguard Worker device_common_srcs: [":core{.jar}"], 1177*333d2b36SAndroid Build Coastguard Worker } 1178*333d2b36SAndroid Build Coastguard Worker `), 1179*333d2b36SAndroid Build Coastguard Worker }) 1180*333d2b36SAndroid Build Coastguard Worker} 1181*333d2b36SAndroid Build Coastguard Worker 1182*333d2b36SAndroid Build Coastguard Workerfunc TestJavaImportOutputFiles(t *testing.T) { 1183*333d2b36SAndroid Build Coastguard Worker testJavaWithFS(t, "", map[string][]byte{ 1184*333d2b36SAndroid Build Coastguard Worker "libcore/Android.bp": []byte(` 1185*333d2b36SAndroid Build Coastguard Worker java_import { 1186*333d2b36SAndroid Build Coastguard Worker name: "core", 1187*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 1188*333d2b36SAndroid Build Coastguard Worker } 1189*333d2b36SAndroid Build Coastguard Worker 1190*333d2b36SAndroid Build Coastguard Worker filegroup { 1191*333d2b36SAndroid Build Coastguard Worker name: "core-jar", 1192*333d2b36SAndroid Build Coastguard Worker device_common_srcs: [":core{.jar}"], 1193*333d2b36SAndroid Build Coastguard Worker } 1194*333d2b36SAndroid Build Coastguard Worker `), 1195*333d2b36SAndroid Build Coastguard Worker }) 1196*333d2b36SAndroid Build Coastguard Worker} 1197*333d2b36SAndroid Build Coastguard Worker 1198*333d2b36SAndroid Build Coastguard Workerfunc TestJavaImport(t *testing.T) { 1199*333d2b36SAndroid Build Coastguard Worker bp := ` 1200*333d2b36SAndroid Build Coastguard Worker java_library { 1201*333d2b36SAndroid Build Coastguard Worker name: "source_library", 1202*333d2b36SAndroid Build Coastguard Worker srcs: ["source.java"], 1203*333d2b36SAndroid Build Coastguard Worker } 1204*333d2b36SAndroid Build Coastguard Worker 1205*333d2b36SAndroid Build Coastguard Worker java_import { 1206*333d2b36SAndroid Build Coastguard Worker name: "import_with_no_deps", 1207*333d2b36SAndroid Build Coastguard Worker jars: ["no_deps.jar"], 1208*333d2b36SAndroid Build Coastguard Worker } 1209*333d2b36SAndroid Build Coastguard Worker 1210*333d2b36SAndroid Build Coastguard Worker java_import { 1211*333d2b36SAndroid Build Coastguard Worker name: "import_with_source_deps", 1212*333d2b36SAndroid Build Coastguard Worker jars: ["source_deps.jar"], 1213*333d2b36SAndroid Build Coastguard Worker static_libs: ["source_library"], 1214*333d2b36SAndroid Build Coastguard Worker } 1215*333d2b36SAndroid Build Coastguard Worker 1216*333d2b36SAndroid Build Coastguard Worker java_import { 1217*333d2b36SAndroid Build Coastguard Worker name: "import_with_import_deps", 1218*333d2b36SAndroid Build Coastguard Worker jars: ["import_deps.jar"], 1219*333d2b36SAndroid Build Coastguard Worker static_libs: ["import_with_no_deps"], 1220*333d2b36SAndroid Build Coastguard Worker } 1221*333d2b36SAndroid Build Coastguard Worker ` 1222*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers( 1223*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 1224*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 1225*333d2b36SAndroid Build Coastguard Worker 1226*333d2b36SAndroid Build Coastguard Worker source := ctx.ModuleForTests("source_library", "android_common") 1227*333d2b36SAndroid Build Coastguard Worker sourceJar := source.Output("javac/source_library.jar") 1228*333d2b36SAndroid Build Coastguard Worker sourceHeaderJar := source.Output("turbine-combined/source_library.jar") 1229*333d2b36SAndroid Build Coastguard Worker sourceJavaInfo, _ := android.OtherModuleProvider(ctx, source.Module(), JavaInfoProvider) 1230*333d2b36SAndroid Build Coastguard Worker 1231*333d2b36SAndroid Build Coastguard Worker // The source library produces separate implementation and header jars 1232*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "source library implementation jar", 1233*333d2b36SAndroid Build Coastguard Worker []string{sourceJar.Output.String()}, sourceJavaInfo.ImplementationAndResourcesJars) 1234*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "source library header jar", 1235*333d2b36SAndroid Build Coastguard Worker []string{sourceHeaderJar.Output.String()}, sourceJavaInfo.HeaderJars) 1236*333d2b36SAndroid Build Coastguard Worker 1237*333d2b36SAndroid Build Coastguard Worker importWithNoDeps := ctx.ModuleForTests("import_with_no_deps", "android_common") 1238*333d2b36SAndroid Build Coastguard Worker importWithNoDepsJar := importWithNoDeps.Output("combined/import_with_no_deps.jar") 1239*333d2b36SAndroid Build Coastguard Worker importWithNoDepsJavaInfo, _ := android.OtherModuleProvider(ctx, importWithNoDeps.Module(), JavaInfoProvider) 1240*333d2b36SAndroid Build Coastguard Worker 1241*333d2b36SAndroid Build Coastguard Worker // An import with no deps produces a single jar used as both the header and implementation jar. 1242*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "import with no deps implementation jar", 1243*333d2b36SAndroid Build Coastguard Worker []string{importWithNoDepsJar.Output.String()}, importWithNoDepsJavaInfo.ImplementationAndResourcesJars) 1244*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "import with no deps header jar", 1245*333d2b36SAndroid Build Coastguard Worker []string{importWithNoDepsJar.Output.String()}, importWithNoDepsJavaInfo.HeaderJars) 1246*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "import with no deps combined inputs", 1247*333d2b36SAndroid Build Coastguard Worker []string{"no_deps.jar"}, importWithNoDepsJar.Inputs) 1248*333d2b36SAndroid Build Coastguard Worker 1249*333d2b36SAndroid Build Coastguard Worker importWithSourceDeps := ctx.ModuleForTests("import_with_source_deps", "android_common") 1250*333d2b36SAndroid Build Coastguard Worker importWithSourceDepsJar := importWithSourceDeps.Output("combined/import_with_source_deps.jar") 1251*333d2b36SAndroid Build Coastguard Worker importWithSourceDepsHeaderJar := importWithSourceDeps.Output("turbine-combined/import_with_source_deps.jar") 1252*333d2b36SAndroid Build Coastguard Worker importWithSourceDepsJavaInfo, _ := android.OtherModuleProvider(ctx, importWithSourceDeps.Module(), JavaInfoProvider) 1253*333d2b36SAndroid Build Coastguard Worker 1254*333d2b36SAndroid Build Coastguard Worker // An import with source deps produces separate header and implementation jars. 1255*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "import with source deps implementation jar", 1256*333d2b36SAndroid Build Coastguard Worker []string{importWithSourceDepsJar.Output.String()}, importWithSourceDepsJavaInfo.ImplementationAndResourcesJars) 1257*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "import with source deps header jar", 1258*333d2b36SAndroid Build Coastguard Worker []string{importWithSourceDepsHeaderJar.Output.String()}, importWithSourceDepsJavaInfo.HeaderJars) 1259*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "import with source deps combined implementation jar inputs", 1260*333d2b36SAndroid Build Coastguard Worker []string{"source_deps.jar", sourceJar.Output.String()}, importWithSourceDepsJar.Inputs) 1261*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "import with source deps combined header jar inputs", 1262*333d2b36SAndroid Build Coastguard Worker []string{"source_deps.jar", sourceHeaderJar.Output.String()}, importWithSourceDepsHeaderJar.Inputs) 1263*333d2b36SAndroid Build Coastguard Worker 1264*333d2b36SAndroid Build Coastguard Worker importWithImportDeps := ctx.ModuleForTests("import_with_import_deps", "android_common") 1265*333d2b36SAndroid Build Coastguard Worker importWithImportDepsJar := importWithImportDeps.Output("combined/import_with_import_deps.jar") 1266*333d2b36SAndroid Build Coastguard Worker importWithImportDepsJavaInfo, _ := android.OtherModuleProvider(ctx, importWithImportDeps.Module(), JavaInfoProvider) 1267*333d2b36SAndroid Build Coastguard Worker 1268*333d2b36SAndroid Build Coastguard Worker // An import with only import deps produces a single jar used as both the header and implementation jar. 1269*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "import with import deps implementation jar", 1270*333d2b36SAndroid Build Coastguard Worker []string{importWithImportDepsJar.Output.String()}, importWithImportDepsJavaInfo.ImplementationAndResourcesJars) 1271*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "import with import deps header jar", 1272*333d2b36SAndroid Build Coastguard Worker []string{importWithImportDepsJar.Output.String()}, importWithImportDepsJavaInfo.HeaderJars) 1273*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "import with import deps combined implementation jar inputs", 1274*333d2b36SAndroid Build Coastguard Worker []string{"import_deps.jar", importWithNoDepsJar.Output.String()}, importWithImportDepsJar.Inputs) 1275*333d2b36SAndroid Build Coastguard Worker} 1276*333d2b36SAndroid Build Coastguard Worker 1277*333d2b36SAndroid Build Coastguard Workervar compilerFlagsTestCases = []struct { 1278*333d2b36SAndroid Build Coastguard Worker in string 1279*333d2b36SAndroid Build Coastguard Worker out bool 1280*333d2b36SAndroid Build Coastguard Worker}{ 1281*333d2b36SAndroid Build Coastguard Worker { 1282*333d2b36SAndroid Build Coastguard Worker in: "a", 1283*333d2b36SAndroid Build Coastguard Worker out: false, 1284*333d2b36SAndroid Build Coastguard Worker }, 1285*333d2b36SAndroid Build Coastguard Worker { 1286*333d2b36SAndroid Build Coastguard Worker in: "-a", 1287*333d2b36SAndroid Build Coastguard Worker out: true, 1288*333d2b36SAndroid Build Coastguard Worker }, 1289*333d2b36SAndroid Build Coastguard Worker { 1290*333d2b36SAndroid Build Coastguard Worker in: "-no-jdk", 1291*333d2b36SAndroid Build Coastguard Worker out: false, 1292*333d2b36SAndroid Build Coastguard Worker }, 1293*333d2b36SAndroid Build Coastguard Worker { 1294*333d2b36SAndroid Build Coastguard Worker in: "-no-stdlib", 1295*333d2b36SAndroid Build Coastguard Worker out: false, 1296*333d2b36SAndroid Build Coastguard Worker }, 1297*333d2b36SAndroid Build Coastguard Worker { 1298*333d2b36SAndroid Build Coastguard Worker in: "-kotlin-home", 1299*333d2b36SAndroid Build Coastguard Worker out: false, 1300*333d2b36SAndroid Build Coastguard Worker }, 1301*333d2b36SAndroid Build Coastguard Worker { 1302*333d2b36SAndroid Build Coastguard Worker in: "-kotlin-home /some/path", 1303*333d2b36SAndroid Build Coastguard Worker out: false, 1304*333d2b36SAndroid Build Coastguard Worker }, 1305*333d2b36SAndroid Build Coastguard Worker { 1306*333d2b36SAndroid Build Coastguard Worker in: "-include-runtime", 1307*333d2b36SAndroid Build Coastguard Worker out: false, 1308*333d2b36SAndroid Build Coastguard Worker }, 1309*333d2b36SAndroid Build Coastguard Worker { 1310*333d2b36SAndroid Build Coastguard Worker in: "-Xintellij-plugin-root", 1311*333d2b36SAndroid Build Coastguard Worker out: false, 1312*333d2b36SAndroid Build Coastguard Worker }, 1313*333d2b36SAndroid Build Coastguard Worker} 1314*333d2b36SAndroid Build Coastguard Worker 1315*333d2b36SAndroid Build Coastguard Workertype mockContext struct { 1316*333d2b36SAndroid Build Coastguard Worker android.ModuleContext 1317*333d2b36SAndroid Build Coastguard Worker result bool 1318*333d2b36SAndroid Build Coastguard Worker} 1319*333d2b36SAndroid Build Coastguard Worker 1320*333d2b36SAndroid Build Coastguard Workerfunc (ctx *mockContext) PropertyErrorf(property, format string, args ...interface{}) { 1321*333d2b36SAndroid Build Coastguard Worker // CheckBadCompilerFlags calls this function when the flag should be rejected 1322*333d2b36SAndroid Build Coastguard Worker ctx.result = false 1323*333d2b36SAndroid Build Coastguard Worker} 1324*333d2b36SAndroid Build Coastguard Worker 1325*333d2b36SAndroid Build Coastguard Workerfunc TestCompilerFlags(t *testing.T) { 1326*333d2b36SAndroid Build Coastguard Worker for _, testCase := range compilerFlagsTestCases { 1327*333d2b36SAndroid Build Coastguard Worker ctx := &mockContext{result: true} 1328*333d2b36SAndroid Build Coastguard Worker CheckKotlincFlags(ctx, []string{testCase.in}) 1329*333d2b36SAndroid Build Coastguard Worker if ctx.result != testCase.out { 1330*333d2b36SAndroid Build Coastguard Worker t.Errorf("incorrect output:") 1331*333d2b36SAndroid Build Coastguard Worker t.Errorf(" input: %#v", testCase.in) 1332*333d2b36SAndroid Build Coastguard Worker t.Errorf(" expected: %#v", testCase.out) 1333*333d2b36SAndroid Build Coastguard Worker t.Errorf(" got: %#v", ctx.result) 1334*333d2b36SAndroid Build Coastguard Worker } 1335*333d2b36SAndroid Build Coastguard Worker } 1336*333d2b36SAndroid Build Coastguard Worker} 1337*333d2b36SAndroid Build Coastguard Worker 1338*333d2b36SAndroid Build Coastguard Worker// TODO(jungjw): Consider making this more robust by ignoring path order. 1339*333d2b36SAndroid Build Coastguard Workerfunc checkPatchModuleFlag(t *testing.T, ctx *android.TestContext, moduleName string, expected string) { 1340*333d2b36SAndroid Build Coastguard Worker variables := ctx.ModuleForTests(moduleName, "android_common").VariablesForTestsRelativeToTop() 1341*333d2b36SAndroid Build Coastguard Worker flags := strings.Split(variables["javacFlags"], " ") 1342*333d2b36SAndroid Build Coastguard Worker got := "" 1343*333d2b36SAndroid Build Coastguard Worker for _, flag := range flags { 1344*333d2b36SAndroid Build Coastguard Worker keyEnd := strings.Index(flag, "=") 1345*333d2b36SAndroid Build Coastguard Worker if keyEnd > -1 && flag[:keyEnd] == "--patch-module" { 1346*333d2b36SAndroid Build Coastguard Worker got = flag[keyEnd+1:] 1347*333d2b36SAndroid Build Coastguard Worker break 1348*333d2b36SAndroid Build Coastguard Worker } 1349*333d2b36SAndroid Build Coastguard Worker } 1350*333d2b36SAndroid Build Coastguard Worker if expected != android.StringPathRelativeToTop(ctx.Config().SoongOutDir(), got) { 1351*333d2b36SAndroid Build Coastguard Worker t.Errorf("Unexpected patch-module flag for module %q - expected %q, but got %q", moduleName, expected, got) 1352*333d2b36SAndroid Build Coastguard Worker } 1353*333d2b36SAndroid Build Coastguard Worker} 1354*333d2b36SAndroid Build Coastguard Worker 1355*333d2b36SAndroid Build Coastguard Workerfunc TestPatchModule(t *testing.T) { 1356*333d2b36SAndroid Build Coastguard Worker t.Run("Java language level 8", func(t *testing.T) { 1357*333d2b36SAndroid Build Coastguard Worker // Test with legacy javac -source 1.8 -target 1.8 1358*333d2b36SAndroid Build Coastguard Worker bp := ` 1359*333d2b36SAndroid Build Coastguard Worker java_library { 1360*333d2b36SAndroid Build Coastguard Worker name: "foo", 1361*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 1362*333d2b36SAndroid Build Coastguard Worker java_version: "1.8", 1363*333d2b36SAndroid Build Coastguard Worker } 1364*333d2b36SAndroid Build Coastguard Worker 1365*333d2b36SAndroid Build Coastguard Worker java_library { 1366*333d2b36SAndroid Build Coastguard Worker name: "bar", 1367*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 1368*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 1369*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 1370*333d2b36SAndroid Build Coastguard Worker patch_module: "java.base", 1371*333d2b36SAndroid Build Coastguard Worker java_version: "1.8", 1372*333d2b36SAndroid Build Coastguard Worker } 1373*333d2b36SAndroid Build Coastguard Worker 1374*333d2b36SAndroid Build Coastguard Worker java_library { 1375*333d2b36SAndroid Build Coastguard Worker name: "baz", 1376*333d2b36SAndroid Build Coastguard Worker srcs: ["c.java"], 1377*333d2b36SAndroid Build Coastguard Worker patch_module: "java.base", 1378*333d2b36SAndroid Build Coastguard Worker java_version: "1.8", 1379*333d2b36SAndroid Build Coastguard Worker } 1380*333d2b36SAndroid Build Coastguard Worker ` 1381*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, bp) 1382*333d2b36SAndroid Build Coastguard Worker 1383*333d2b36SAndroid Build Coastguard Worker checkPatchModuleFlag(t, ctx, "foo", "") 1384*333d2b36SAndroid Build Coastguard Worker checkPatchModuleFlag(t, ctx, "bar", "") 1385*333d2b36SAndroid Build Coastguard Worker checkPatchModuleFlag(t, ctx, "baz", "") 1386*333d2b36SAndroid Build Coastguard Worker }) 1387*333d2b36SAndroid Build Coastguard Worker 1388*333d2b36SAndroid Build Coastguard Worker t.Run("Java language level 9", func(t *testing.T) { 1389*333d2b36SAndroid Build Coastguard Worker // Test with default javac -source 9 -target 9 1390*333d2b36SAndroid Build Coastguard Worker bp := ` 1391*333d2b36SAndroid Build Coastguard Worker java_library { 1392*333d2b36SAndroid Build Coastguard Worker name: "foo", 1393*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 1394*333d2b36SAndroid Build Coastguard Worker } 1395*333d2b36SAndroid Build Coastguard Worker 1396*333d2b36SAndroid Build Coastguard Worker java_library { 1397*333d2b36SAndroid Build Coastguard Worker name: "bar", 1398*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 1399*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 1400*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 1401*333d2b36SAndroid Build Coastguard Worker patch_module: "java.base", 1402*333d2b36SAndroid Build Coastguard Worker } 1403*333d2b36SAndroid Build Coastguard Worker 1404*333d2b36SAndroid Build Coastguard Worker java_library { 1405*333d2b36SAndroid Build Coastguard Worker name: "baz", 1406*333d2b36SAndroid Build Coastguard Worker srcs: [ 1407*333d2b36SAndroid Build Coastguard Worker "c.java", 1408*333d2b36SAndroid Build Coastguard Worker // Tests for b/150878007 1409*333d2b36SAndroid Build Coastguard Worker "dir/d.java", 1410*333d2b36SAndroid Build Coastguard Worker "dir2/e.java", 1411*333d2b36SAndroid Build Coastguard Worker "dir2/f.java", 1412*333d2b36SAndroid Build Coastguard Worker "nested/dir/g.java" 1413*333d2b36SAndroid Build Coastguard Worker ], 1414*333d2b36SAndroid Build Coastguard Worker patch_module: "java.base", 1415*333d2b36SAndroid Build Coastguard Worker } 1416*333d2b36SAndroid Build Coastguard Worker ` 1417*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, bp) 1418*333d2b36SAndroid Build Coastguard Worker 1419*333d2b36SAndroid Build Coastguard Worker checkPatchModuleFlag(t, ctx, "foo", "") 1420*333d2b36SAndroid Build Coastguard Worker expected := "java.base=.:out/soong" 1421*333d2b36SAndroid Build Coastguard Worker checkPatchModuleFlag(t, ctx, "bar", expected) 1422*333d2b36SAndroid Build Coastguard Worker expected = "java.base=" + strings.Join([]string{ 1423*333d2b36SAndroid Build Coastguard Worker ".", "out/soong", defaultModuleToPath("ext"), defaultModuleToPath("framework")}, ":") 1424*333d2b36SAndroid Build Coastguard Worker checkPatchModuleFlag(t, ctx, "baz", expected) 1425*333d2b36SAndroid Build Coastguard Worker }) 1426*333d2b36SAndroid Build Coastguard Worker} 1427*333d2b36SAndroid Build Coastguard Worker 1428*333d2b36SAndroid Build Coastguard Workerfunc TestJavaLibraryWithSystemModules(t *testing.T) { 1429*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 1430*333d2b36SAndroid Build Coastguard Worker java_library { 1431*333d2b36SAndroid Build Coastguard Worker name: "lib-with-source-system-modules", 1432*333d2b36SAndroid Build Coastguard Worker srcs: [ 1433*333d2b36SAndroid Build Coastguard Worker "a.java", 1434*333d2b36SAndroid Build Coastguard Worker ], 1435*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 1436*333d2b36SAndroid Build Coastguard Worker system_modules: "source-system-modules", 1437*333d2b36SAndroid Build Coastguard Worker } 1438*333d2b36SAndroid Build Coastguard Worker 1439*333d2b36SAndroid Build Coastguard Worker java_library { 1440*333d2b36SAndroid Build Coastguard Worker name: "source-jar", 1441*333d2b36SAndroid Build Coastguard Worker srcs: [ 1442*333d2b36SAndroid Build Coastguard Worker "a.java", 1443*333d2b36SAndroid Build Coastguard Worker ], 1444*333d2b36SAndroid Build Coastguard Worker } 1445*333d2b36SAndroid Build Coastguard Worker 1446*333d2b36SAndroid Build Coastguard Worker java_system_modules { 1447*333d2b36SAndroid Build Coastguard Worker name: "source-system-modules", 1448*333d2b36SAndroid Build Coastguard Worker libs: ["source-jar"], 1449*333d2b36SAndroid Build Coastguard Worker } 1450*333d2b36SAndroid Build Coastguard Worker 1451*333d2b36SAndroid Build Coastguard Worker java_library { 1452*333d2b36SAndroid Build Coastguard Worker name: "lib-with-prebuilt-system-modules", 1453*333d2b36SAndroid Build Coastguard Worker srcs: [ 1454*333d2b36SAndroid Build Coastguard Worker "a.java", 1455*333d2b36SAndroid Build Coastguard Worker ], 1456*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 1457*333d2b36SAndroid Build Coastguard Worker system_modules: "prebuilt-system-modules", 1458*333d2b36SAndroid Build Coastguard Worker } 1459*333d2b36SAndroid Build Coastguard Worker 1460*333d2b36SAndroid Build Coastguard Worker java_import { 1461*333d2b36SAndroid Build Coastguard Worker name: "prebuilt-jar", 1462*333d2b36SAndroid Build Coastguard Worker jars: ["a.jar"], 1463*333d2b36SAndroid Build Coastguard Worker } 1464*333d2b36SAndroid Build Coastguard Worker 1465*333d2b36SAndroid Build Coastguard Worker java_system_modules_import { 1466*333d2b36SAndroid Build Coastguard Worker name: "prebuilt-system-modules", 1467*333d2b36SAndroid Build Coastguard Worker libs: ["prebuilt-jar"], 1468*333d2b36SAndroid Build Coastguard Worker } 1469*333d2b36SAndroid Build Coastguard Worker `) 1470*333d2b36SAndroid Build Coastguard Worker 1471*333d2b36SAndroid Build Coastguard Worker checkBootClasspathForLibWithSystemModule(t, ctx, "lib-with-source-system-modules", "/source-jar.jar") 1472*333d2b36SAndroid Build Coastguard Worker 1473*333d2b36SAndroid Build Coastguard Worker checkBootClasspathForLibWithSystemModule(t, ctx, "lib-with-prebuilt-system-modules", "/prebuilt-jar.jar") 1474*333d2b36SAndroid Build Coastguard Worker} 1475*333d2b36SAndroid Build Coastguard Worker 1476*333d2b36SAndroid Build Coastguard Workerfunc checkBootClasspathForLibWithSystemModule(t *testing.T, ctx *android.TestContext, moduleName string, expectedSuffix string) { 1477*333d2b36SAndroid Build Coastguard Worker javacRule := ctx.ModuleForTests(moduleName, "android_common").Rule("javac") 1478*333d2b36SAndroid Build Coastguard Worker bootClasspath := javacRule.Args["bootClasspath"] 1479*333d2b36SAndroid Build Coastguard Worker if strings.HasPrefix(bootClasspath, "--system ") && strings.HasSuffix(bootClasspath, expectedSuffix) { 1480*333d2b36SAndroid Build Coastguard Worker t.Errorf("bootclasspath of %q must start with --system and end with %q, but was %#v.", moduleName, expectedSuffix, bootClasspath) 1481*333d2b36SAndroid Build Coastguard Worker } 1482*333d2b36SAndroid Build Coastguard Worker} 1483*333d2b36SAndroid Build Coastguard Worker 1484*333d2b36SAndroid Build Coastguard Workerfunc TestAidlExportIncludeDirsFromImports(t *testing.T) { 1485*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 1486*333d2b36SAndroid Build Coastguard Worker java_library { 1487*333d2b36SAndroid Build Coastguard Worker name: "foo", 1488*333d2b36SAndroid Build Coastguard Worker srcs: ["aidl/foo/IFoo.aidl"], 1489*333d2b36SAndroid Build Coastguard Worker libs: ["bar"], 1490*333d2b36SAndroid Build Coastguard Worker } 1491*333d2b36SAndroid Build Coastguard Worker 1492*333d2b36SAndroid Build Coastguard Worker java_import { 1493*333d2b36SAndroid Build Coastguard Worker name: "bar", 1494*333d2b36SAndroid Build Coastguard Worker jars: ["a.jar"], 1495*333d2b36SAndroid Build Coastguard Worker aidl: { 1496*333d2b36SAndroid Build Coastguard Worker export_include_dirs: ["aidl/bar"], 1497*333d2b36SAndroid Build Coastguard Worker }, 1498*333d2b36SAndroid Build Coastguard Worker } 1499*333d2b36SAndroid Build Coastguard Worker `) 1500*333d2b36SAndroid Build Coastguard Worker 1501*333d2b36SAndroid Build Coastguard Worker aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command 1502*333d2b36SAndroid Build Coastguard Worker expectedAidlFlag := "-Iaidl/bar" 1503*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(aidlCommand, expectedAidlFlag) { 1504*333d2b36SAndroid Build Coastguard Worker t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag) 1505*333d2b36SAndroid Build Coastguard Worker } 1506*333d2b36SAndroid Build Coastguard Worker} 1507*333d2b36SAndroid Build Coastguard Worker 1508*333d2b36SAndroid Build Coastguard Workerfunc TestAidlFlagsArePassedToTheAidlCompiler(t *testing.T) { 1509*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 1510*333d2b36SAndroid Build Coastguard Worker java_library { 1511*333d2b36SAndroid Build Coastguard Worker name: "foo", 1512*333d2b36SAndroid Build Coastguard Worker srcs: ["aidl/foo/IFoo.aidl"], 1513*333d2b36SAndroid Build Coastguard Worker aidl: { flags: ["-Werror"], }, 1514*333d2b36SAndroid Build Coastguard Worker } 1515*333d2b36SAndroid Build Coastguard Worker `) 1516*333d2b36SAndroid Build Coastguard Worker 1517*333d2b36SAndroid Build Coastguard Worker aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command 1518*333d2b36SAndroid Build Coastguard Worker expectedAidlFlag := "-Werror" 1519*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(aidlCommand, expectedAidlFlag) { 1520*333d2b36SAndroid Build Coastguard Worker t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag) 1521*333d2b36SAndroid Build Coastguard Worker } 1522*333d2b36SAndroid Build Coastguard Worker} 1523*333d2b36SAndroid Build Coastguard Worker 1524*333d2b36SAndroid Build Coastguard Workerfunc TestAidlFlagsWithMinSdkVersion(t *testing.T) { 1525*333d2b36SAndroid Build Coastguard Worker fixture := android.GroupFixturePreparers( 1526*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, FixtureWithPrebuiltApis(map[string][]string{"14": {"foo"}})) 1527*333d2b36SAndroid Build Coastguard Worker 1528*333d2b36SAndroid Build Coastguard Worker for _, tc := range []struct { 1529*333d2b36SAndroid Build Coastguard Worker name string 1530*333d2b36SAndroid Build Coastguard Worker sdkVersion string 1531*333d2b36SAndroid Build Coastguard Worker expected string 1532*333d2b36SAndroid Build Coastguard Worker }{ 1533*333d2b36SAndroid Build Coastguard Worker {"default is current", "", "current"}, 1534*333d2b36SAndroid Build Coastguard Worker {"use sdk_version", `sdk_version: "14"`, "14"}, 1535*333d2b36SAndroid Build Coastguard Worker {"system_current", `sdk_version: "system_current"`, "current"}, 1536*333d2b36SAndroid Build Coastguard Worker } { 1537*333d2b36SAndroid Build Coastguard Worker t.Run(tc.name, func(t *testing.T) { 1538*333d2b36SAndroid Build Coastguard Worker ctx := fixture.RunTestWithBp(t, ` 1539*333d2b36SAndroid Build Coastguard Worker java_library { 1540*333d2b36SAndroid Build Coastguard Worker name: "foo", 1541*333d2b36SAndroid Build Coastguard Worker srcs: ["aidl/foo/IFoo.aidl"], 1542*333d2b36SAndroid Build Coastguard Worker `+tc.sdkVersion+` 1543*333d2b36SAndroid Build Coastguard Worker } 1544*333d2b36SAndroid Build Coastguard Worker `) 1545*333d2b36SAndroid Build Coastguard Worker aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command 1546*333d2b36SAndroid Build Coastguard Worker expectedAidlFlag := "--min_sdk_version=" + tc.expected 1547*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(aidlCommand, expectedAidlFlag) { 1548*333d2b36SAndroid Build Coastguard Worker t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag) 1549*333d2b36SAndroid Build Coastguard Worker } 1550*333d2b36SAndroid Build Coastguard Worker }) 1551*333d2b36SAndroid Build Coastguard Worker } 1552*333d2b36SAndroid Build Coastguard Worker} 1553*333d2b36SAndroid Build Coastguard Worker 1554*333d2b36SAndroid Build Coastguard Workerfunc TestAidlFlagsMinSdkVersionDroidstubs(t *testing.T) { 1555*333d2b36SAndroid Build Coastguard Worker bpTemplate := ` 1556*333d2b36SAndroid Build Coastguard Worker droidstubs { 1557*333d2b36SAndroid Build Coastguard Worker name: "foo-stubs", 1558*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.aidl"], 1559*333d2b36SAndroid Build Coastguard Worker %s 1560*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 1561*333d2b36SAndroid Build Coastguard Worker } 1562*333d2b36SAndroid Build Coastguard Worker ` 1563*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 1564*333d2b36SAndroid Build Coastguard Worker desc string 1565*333d2b36SAndroid Build Coastguard Worker sdkVersionBp string 1566*333d2b36SAndroid Build Coastguard Worker minSdkVersionExpected string 1567*333d2b36SAndroid Build Coastguard Worker }{ 1568*333d2b36SAndroid Build Coastguard Worker { 1569*333d2b36SAndroid Build Coastguard Worker desc: "sdk_version not set, module compiles against private platform APIs", 1570*333d2b36SAndroid Build Coastguard Worker sdkVersionBp: ``, 1571*333d2b36SAndroid Build Coastguard Worker minSdkVersionExpected: "10000", 1572*333d2b36SAndroid Build Coastguard Worker }, 1573*333d2b36SAndroid Build Coastguard Worker { 1574*333d2b36SAndroid Build Coastguard Worker desc: "sdk_version set to none, module does not build against an SDK", 1575*333d2b36SAndroid Build Coastguard Worker sdkVersionBp: `sdk_version: "none",`, 1576*333d2b36SAndroid Build Coastguard Worker minSdkVersionExpected: "10000", 1577*333d2b36SAndroid Build Coastguard Worker }, 1578*333d2b36SAndroid Build Coastguard Worker } 1579*333d2b36SAndroid Build Coastguard Worker for _, tc := range testCases { 1580*333d2b36SAndroid Build Coastguard Worker ctx := prepareForJavaTest.RunTestWithBp(t, fmt.Sprintf(bpTemplate, tc.sdkVersionBp)) 1581*333d2b36SAndroid Build Coastguard Worker aidlCmd := ctx.ModuleForTests("foo-stubs", "android_common").Rule("aidl").RuleParams.Command 1582*333d2b36SAndroid Build Coastguard Worker expected := "--min_sdk_version=" + tc.minSdkVersionExpected 1583*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "aidl command conatins incorrect min_sdk_version for testCse: "+tc.desc, aidlCmd, expected) 1584*333d2b36SAndroid Build Coastguard Worker } 1585*333d2b36SAndroid Build Coastguard Worker} 1586*333d2b36SAndroid Build Coastguard Worker 1587*333d2b36SAndroid Build Coastguard Workerfunc TestAidlEnforcePermissions(t *testing.T) { 1588*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 1589*333d2b36SAndroid Build Coastguard Worker java_library { 1590*333d2b36SAndroid Build Coastguard Worker name: "foo", 1591*333d2b36SAndroid Build Coastguard Worker srcs: ["aidl/foo/IFoo.aidl"], 1592*333d2b36SAndroid Build Coastguard Worker aidl: { enforce_permissions: true }, 1593*333d2b36SAndroid Build Coastguard Worker } 1594*333d2b36SAndroid Build Coastguard Worker `) 1595*333d2b36SAndroid Build Coastguard Worker 1596*333d2b36SAndroid Build Coastguard Worker aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command 1597*333d2b36SAndroid Build Coastguard Worker expectedAidlFlag := "-Wmissing-permission-annotation -Werror" 1598*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(aidlCommand, expectedAidlFlag) { 1599*333d2b36SAndroid Build Coastguard Worker t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag) 1600*333d2b36SAndroid Build Coastguard Worker } 1601*333d2b36SAndroid Build Coastguard Worker} 1602*333d2b36SAndroid Build Coastguard Worker 1603*333d2b36SAndroid Build Coastguard Workerfunc TestAidlEnforcePermissionsException(t *testing.T) { 1604*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 1605*333d2b36SAndroid Build Coastguard Worker java_library { 1606*333d2b36SAndroid Build Coastguard Worker name: "foo", 1607*333d2b36SAndroid Build Coastguard Worker srcs: ["aidl/foo/IFoo.aidl", "aidl/foo/IFoo2.aidl"], 1608*333d2b36SAndroid Build Coastguard Worker aidl: { enforce_permissions: true, enforce_permissions_exceptions: ["aidl/foo/IFoo2.aidl"] }, 1609*333d2b36SAndroid Build Coastguard Worker } 1610*333d2b36SAndroid Build Coastguard Worker `) 1611*333d2b36SAndroid Build Coastguard Worker 1612*333d2b36SAndroid Build Coastguard Worker aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command 1613*333d2b36SAndroid Build Coastguard Worker expectedAidlFlag := "$$FLAGS -Wmissing-permission-annotation -Werror aidl/foo/IFoo.aidl" 1614*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(aidlCommand, expectedAidlFlag) { 1615*333d2b36SAndroid Build Coastguard Worker t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag) 1616*333d2b36SAndroid Build Coastguard Worker } 1617*333d2b36SAndroid Build Coastguard Worker expectedAidlFlag = "$$FLAGS aidl/foo/IFoo2.aidl" 1618*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(aidlCommand, expectedAidlFlag) { 1619*333d2b36SAndroid Build Coastguard Worker t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag) 1620*333d2b36SAndroid Build Coastguard Worker } 1621*333d2b36SAndroid Build Coastguard Worker} 1622*333d2b36SAndroid Build Coastguard Worker 1623*333d2b36SAndroid Build Coastguard Workerfunc TestDataNativeBinaries(t *testing.T) { 1624*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers( 1625*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 1626*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithAllowMissingDependencies).RunTestWithBp(t, ` 1627*333d2b36SAndroid Build Coastguard Worker java_test_host { 1628*333d2b36SAndroid Build Coastguard Worker name: "foo", 1629*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 1630*333d2b36SAndroid Build Coastguard Worker data_native_bins: ["bin"] 1631*333d2b36SAndroid Build Coastguard Worker } 1632*333d2b36SAndroid Build Coastguard Worker 1633*333d2b36SAndroid Build Coastguard Worker cc_binary_host { 1634*333d2b36SAndroid Build Coastguard Worker name: "bin", 1635*333d2b36SAndroid Build Coastguard Worker srcs: ["bin.cpp"], 1636*333d2b36SAndroid Build Coastguard Worker } 1637*333d2b36SAndroid Build Coastguard Worker `).TestContext 1638*333d2b36SAndroid Build Coastguard Worker 1639*333d2b36SAndroid Build Coastguard Worker buildOS := ctx.Config().BuildOS.String() 1640*333d2b36SAndroid Build Coastguard Worker 1641*333d2b36SAndroid Build Coastguard Worker test := ctx.ModuleForTests("foo", buildOS+"_common").Module().(*TestHost) 1642*333d2b36SAndroid Build Coastguard Worker entries := android.AndroidMkEntriesForTest(t, ctx, test)[0] 1643*333d2b36SAndroid Build Coastguard Worker expected := []string{"out/soong/.intermediates/bin/" + buildOS + "_x86_64/bin:bin"} 1644*333d2b36SAndroid Build Coastguard Worker actual := entries.EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"] 1645*333d2b36SAndroid Build Coastguard Worker android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_COMPATIBILITY_SUPPORT_FILES", ctx.Config(), expected, actual) 1646*333d2b36SAndroid Build Coastguard Worker} 1647*333d2b36SAndroid Build Coastguard Worker 1648*333d2b36SAndroid Build Coastguard Workerfunc TestDefaultInstallable(t *testing.T) { 1649*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 1650*333d2b36SAndroid Build Coastguard Worker java_test_host { 1651*333d2b36SAndroid Build Coastguard Worker name: "foo" 1652*333d2b36SAndroid Build Coastguard Worker } 1653*333d2b36SAndroid Build Coastguard Worker `) 1654*333d2b36SAndroid Build Coastguard Worker 1655*333d2b36SAndroid Build Coastguard Worker buildOS := ctx.Config().BuildOS.String() 1656*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests("foo", buildOS+"_common").Module().(*TestHost) 1657*333d2b36SAndroid Build Coastguard Worker assertDeepEquals(t, "Default installable value should be true.", proptools.BoolPtr(true), 1658*333d2b36SAndroid Build Coastguard Worker module.properties.Installable) 1659*333d2b36SAndroid Build Coastguard Worker} 1660*333d2b36SAndroid Build Coastguard Worker 1661*333d2b36SAndroid Build Coastguard Workerfunc TestErrorproneEnabled(t *testing.T) { 1662*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 1663*333d2b36SAndroid Build Coastguard Worker java_library { 1664*333d2b36SAndroid Build Coastguard Worker name: "foo", 1665*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 1666*333d2b36SAndroid Build Coastguard Worker errorprone: { 1667*333d2b36SAndroid Build Coastguard Worker enabled: true, 1668*333d2b36SAndroid Build Coastguard Worker }, 1669*333d2b36SAndroid Build Coastguard Worker } 1670*333d2b36SAndroid Build Coastguard Worker `) 1671*333d2b36SAndroid Build Coastguard Worker 1672*333d2b36SAndroid Build Coastguard Worker javac := ctx.ModuleForTests("foo", "android_common").Description("javac") 1673*333d2b36SAndroid Build Coastguard Worker 1674*333d2b36SAndroid Build Coastguard Worker // Test that the errorprone plugins are passed to javac 1675*333d2b36SAndroid Build Coastguard Worker expectedSubstring := "-Xplugin:ErrorProne" 1676*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(javac.Args["javacFlags"], expectedSubstring) { 1677*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected javacFlags to contain %q, got %q", expectedSubstring, javac.Args["javacFlags"]) 1678*333d2b36SAndroid Build Coastguard Worker } 1679*333d2b36SAndroid Build Coastguard Worker 1680*333d2b36SAndroid Build Coastguard Worker // Modules with errorprone { enabled: true } will include errorprone checks 1681*333d2b36SAndroid Build Coastguard Worker // in the main javac build rule. Only when RUN_ERROR_PRONE is true will 1682*333d2b36SAndroid Build Coastguard Worker // the explicit errorprone build rule be created. 1683*333d2b36SAndroid Build Coastguard Worker errorprone := ctx.ModuleForTests("foo", "android_common").MaybeDescription("errorprone") 1684*333d2b36SAndroid Build Coastguard Worker if errorprone.RuleParams.Description != "" { 1685*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected errorprone build rule to not exist, but it did") 1686*333d2b36SAndroid Build Coastguard Worker } 1687*333d2b36SAndroid Build Coastguard Worker} 1688*333d2b36SAndroid Build Coastguard Worker 1689*333d2b36SAndroid Build Coastguard Workerfunc TestErrorproneDisabled(t *testing.T) { 1690*333d2b36SAndroid Build Coastguard Worker bp := ` 1691*333d2b36SAndroid Build Coastguard Worker java_library { 1692*333d2b36SAndroid Build Coastguard Worker name: "foo", 1693*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 1694*333d2b36SAndroid Build Coastguard Worker errorprone: { 1695*333d2b36SAndroid Build Coastguard Worker enabled: false, 1696*333d2b36SAndroid Build Coastguard Worker }, 1697*333d2b36SAndroid Build Coastguard Worker } 1698*333d2b36SAndroid Build Coastguard Worker ` 1699*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers( 1700*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 1701*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeEnv(map[string]string{ 1702*333d2b36SAndroid Build Coastguard Worker "RUN_ERROR_PRONE": "true", 1703*333d2b36SAndroid Build Coastguard Worker }), 1704*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 1705*333d2b36SAndroid Build Coastguard Worker 1706*333d2b36SAndroid Build Coastguard Worker javac := ctx.ModuleForTests("foo", "android_common").Description("javac") 1707*333d2b36SAndroid Build Coastguard Worker 1708*333d2b36SAndroid Build Coastguard Worker // Test that the errorprone plugins are not passed to javac, like they would 1709*333d2b36SAndroid Build Coastguard Worker // be if enabled was true. 1710*333d2b36SAndroid Build Coastguard Worker expectedSubstring := "-Xplugin:ErrorProne" 1711*333d2b36SAndroid Build Coastguard Worker if strings.Contains(javac.Args["javacFlags"], expectedSubstring) { 1712*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected javacFlags to not contain %q, got %q", expectedSubstring, javac.Args["javacFlags"]) 1713*333d2b36SAndroid Build Coastguard Worker } 1714*333d2b36SAndroid Build Coastguard Worker 1715*333d2b36SAndroid Build Coastguard Worker // Check that no errorprone build rule is created, like there would be 1716*333d2b36SAndroid Build Coastguard Worker // if enabled was unset and RUN_ERROR_PRONE was true. 1717*333d2b36SAndroid Build Coastguard Worker errorprone := ctx.ModuleForTests("foo", "android_common").MaybeDescription("errorprone") 1718*333d2b36SAndroid Build Coastguard Worker if errorprone.RuleParams.Description != "" { 1719*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected errorprone build rule to not exist, but it did") 1720*333d2b36SAndroid Build Coastguard Worker } 1721*333d2b36SAndroid Build Coastguard Worker} 1722*333d2b36SAndroid Build Coastguard Worker 1723*333d2b36SAndroid Build Coastguard Workerfunc TestErrorproneEnabledOnlyByEnvironmentVariable(t *testing.T) { 1724*333d2b36SAndroid Build Coastguard Worker bp := ` 1725*333d2b36SAndroid Build Coastguard Worker java_library { 1726*333d2b36SAndroid Build Coastguard Worker name: "foo", 1727*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 1728*333d2b36SAndroid Build Coastguard Worker } 1729*333d2b36SAndroid Build Coastguard Worker ` 1730*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers( 1731*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 1732*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeEnv(map[string]string{ 1733*333d2b36SAndroid Build Coastguard Worker "RUN_ERROR_PRONE": "true", 1734*333d2b36SAndroid Build Coastguard Worker }), 1735*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 1736*333d2b36SAndroid Build Coastguard Worker 1737*333d2b36SAndroid Build Coastguard Worker javac := ctx.ModuleForTests("foo", "android_common").Description("javac") 1738*333d2b36SAndroid Build Coastguard Worker errorprone := ctx.ModuleForTests("foo", "android_common").Description("errorprone") 1739*333d2b36SAndroid Build Coastguard Worker 1740*333d2b36SAndroid Build Coastguard Worker // Check that the errorprone plugins are not passed to javac, because they 1741*333d2b36SAndroid Build Coastguard Worker // will instead be passed to the separate errorprone compilation 1742*333d2b36SAndroid Build Coastguard Worker expectedSubstring := "-Xplugin:ErrorProne" 1743*333d2b36SAndroid Build Coastguard Worker if strings.Contains(javac.Args["javacFlags"], expectedSubstring) { 1744*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected javacFlags to not contain %q, got %q", expectedSubstring, javac.Args["javacFlags"]) 1745*333d2b36SAndroid Build Coastguard Worker } 1746*333d2b36SAndroid Build Coastguard Worker 1747*333d2b36SAndroid Build Coastguard Worker // Check that the errorprone plugin is enabled 1748*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(errorprone.Args["javacFlags"], expectedSubstring) { 1749*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected errorprone to contain %q, got %q", expectedSubstring, javac.Args["javacFlags"]) 1750*333d2b36SAndroid Build Coastguard Worker } 1751*333d2b36SAndroid Build Coastguard Worker} 1752*333d2b36SAndroid Build Coastguard Worker 1753*333d2b36SAndroid Build Coastguard Workerfunc TestDataDeviceBinsBuildsDeviceBinary(t *testing.T) { 1754*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 1755*333d2b36SAndroid Build Coastguard Worker dataDeviceBinType string 1756*333d2b36SAndroid Build Coastguard Worker depCompileMultilib string 1757*333d2b36SAndroid Build Coastguard Worker variants []string 1758*333d2b36SAndroid Build Coastguard Worker expectedError string 1759*333d2b36SAndroid Build Coastguard Worker }{ 1760*333d2b36SAndroid Build Coastguard Worker { 1761*333d2b36SAndroid Build Coastguard Worker dataDeviceBinType: "first", 1762*333d2b36SAndroid Build Coastguard Worker depCompileMultilib: "first", 1763*333d2b36SAndroid Build Coastguard Worker variants: []string{"android_arm64_armv8-a"}, 1764*333d2b36SAndroid Build Coastguard Worker }, 1765*333d2b36SAndroid Build Coastguard Worker { 1766*333d2b36SAndroid Build Coastguard Worker dataDeviceBinType: "first", 1767*333d2b36SAndroid Build Coastguard Worker depCompileMultilib: "both", 1768*333d2b36SAndroid Build Coastguard Worker variants: []string{"android_arm64_armv8-a"}, 1769*333d2b36SAndroid Build Coastguard Worker }, 1770*333d2b36SAndroid Build Coastguard Worker { 1771*333d2b36SAndroid Build Coastguard Worker // this is true because our testing framework is set up with 1772*333d2b36SAndroid Build Coastguard Worker // Targets ~ [<64bit target>, <32bit target>], where 64bit is "first" 1773*333d2b36SAndroid Build Coastguard Worker dataDeviceBinType: "first", 1774*333d2b36SAndroid Build Coastguard Worker depCompileMultilib: "32", 1775*333d2b36SAndroid Build Coastguard Worker expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`, 1776*333d2b36SAndroid Build Coastguard Worker }, 1777*333d2b36SAndroid Build Coastguard Worker { 1778*333d2b36SAndroid Build Coastguard Worker dataDeviceBinType: "first", 1779*333d2b36SAndroid Build Coastguard Worker depCompileMultilib: "64", 1780*333d2b36SAndroid Build Coastguard Worker variants: []string{"android_arm64_armv8-a"}, 1781*333d2b36SAndroid Build Coastguard Worker }, 1782*333d2b36SAndroid Build Coastguard Worker { 1783*333d2b36SAndroid Build Coastguard Worker dataDeviceBinType: "both", 1784*333d2b36SAndroid Build Coastguard Worker depCompileMultilib: "both", 1785*333d2b36SAndroid Build Coastguard Worker variants: []string{ 1786*333d2b36SAndroid Build Coastguard Worker "android_arm_armv7-a-neon", 1787*333d2b36SAndroid Build Coastguard Worker "android_arm64_armv8-a", 1788*333d2b36SAndroid Build Coastguard Worker }, 1789*333d2b36SAndroid Build Coastguard Worker }, 1790*333d2b36SAndroid Build Coastguard Worker { 1791*333d2b36SAndroid Build Coastguard Worker dataDeviceBinType: "both", 1792*333d2b36SAndroid Build Coastguard Worker depCompileMultilib: "32", 1793*333d2b36SAndroid Build Coastguard Worker expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`, 1794*333d2b36SAndroid Build Coastguard Worker }, 1795*333d2b36SAndroid Build Coastguard Worker { 1796*333d2b36SAndroid Build Coastguard Worker dataDeviceBinType: "both", 1797*333d2b36SAndroid Build Coastguard Worker depCompileMultilib: "64", 1798*333d2b36SAndroid Build Coastguard Worker expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`, 1799*333d2b36SAndroid Build Coastguard Worker }, 1800*333d2b36SAndroid Build Coastguard Worker { 1801*333d2b36SAndroid Build Coastguard Worker dataDeviceBinType: "both", 1802*333d2b36SAndroid Build Coastguard Worker depCompileMultilib: "first", 1803*333d2b36SAndroid Build Coastguard Worker expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`, 1804*333d2b36SAndroid Build Coastguard Worker }, 1805*333d2b36SAndroid Build Coastguard Worker { 1806*333d2b36SAndroid Build Coastguard Worker dataDeviceBinType: "32", 1807*333d2b36SAndroid Build Coastguard Worker depCompileMultilib: "32", 1808*333d2b36SAndroid Build Coastguard Worker variants: []string{"android_arm_armv7-a-neon"}, 1809*333d2b36SAndroid Build Coastguard Worker }, 1810*333d2b36SAndroid Build Coastguard Worker { 1811*333d2b36SAndroid Build Coastguard Worker dataDeviceBinType: "32", 1812*333d2b36SAndroid Build Coastguard Worker depCompileMultilib: "first", 1813*333d2b36SAndroid Build Coastguard Worker expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`, 1814*333d2b36SAndroid Build Coastguard Worker }, 1815*333d2b36SAndroid Build Coastguard Worker { 1816*333d2b36SAndroid Build Coastguard Worker dataDeviceBinType: "32", 1817*333d2b36SAndroid Build Coastguard Worker depCompileMultilib: "both", 1818*333d2b36SAndroid Build Coastguard Worker variants: []string{"android_arm_armv7-a-neon"}, 1819*333d2b36SAndroid Build Coastguard Worker }, 1820*333d2b36SAndroid Build Coastguard Worker { 1821*333d2b36SAndroid Build Coastguard Worker dataDeviceBinType: "32", 1822*333d2b36SAndroid Build Coastguard Worker depCompileMultilib: "64", 1823*333d2b36SAndroid Build Coastguard Worker expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`, 1824*333d2b36SAndroid Build Coastguard Worker }, 1825*333d2b36SAndroid Build Coastguard Worker { 1826*333d2b36SAndroid Build Coastguard Worker dataDeviceBinType: "64", 1827*333d2b36SAndroid Build Coastguard Worker depCompileMultilib: "64", 1828*333d2b36SAndroid Build Coastguard Worker variants: []string{"android_arm64_armv8-a"}, 1829*333d2b36SAndroid Build Coastguard Worker }, 1830*333d2b36SAndroid Build Coastguard Worker { 1831*333d2b36SAndroid Build Coastguard Worker dataDeviceBinType: "64", 1832*333d2b36SAndroid Build Coastguard Worker depCompileMultilib: "both", 1833*333d2b36SAndroid Build Coastguard Worker variants: []string{"android_arm64_armv8-a"}, 1834*333d2b36SAndroid Build Coastguard Worker }, 1835*333d2b36SAndroid Build Coastguard Worker { 1836*333d2b36SAndroid Build Coastguard Worker dataDeviceBinType: "64", 1837*333d2b36SAndroid Build Coastguard Worker depCompileMultilib: "first", 1838*333d2b36SAndroid Build Coastguard Worker variants: []string{"android_arm64_armv8-a"}, 1839*333d2b36SAndroid Build Coastguard Worker }, 1840*333d2b36SAndroid Build Coastguard Worker { 1841*333d2b36SAndroid Build Coastguard Worker dataDeviceBinType: "64", 1842*333d2b36SAndroid Build Coastguard Worker depCompileMultilib: "32", 1843*333d2b36SAndroid Build Coastguard Worker expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`, 1844*333d2b36SAndroid Build Coastguard Worker }, 1845*333d2b36SAndroid Build Coastguard Worker { 1846*333d2b36SAndroid Build Coastguard Worker dataDeviceBinType: "prefer32", 1847*333d2b36SAndroid Build Coastguard Worker depCompileMultilib: "32", 1848*333d2b36SAndroid Build Coastguard Worker variants: []string{"android_arm_armv7-a-neon"}, 1849*333d2b36SAndroid Build Coastguard Worker }, 1850*333d2b36SAndroid Build Coastguard Worker { 1851*333d2b36SAndroid Build Coastguard Worker dataDeviceBinType: "prefer32", 1852*333d2b36SAndroid Build Coastguard Worker depCompileMultilib: "both", 1853*333d2b36SAndroid Build Coastguard Worker variants: []string{"android_arm_armv7-a-neon"}, 1854*333d2b36SAndroid Build Coastguard Worker }, 1855*333d2b36SAndroid Build Coastguard Worker { 1856*333d2b36SAndroid Build Coastguard Worker dataDeviceBinType: "prefer32", 1857*333d2b36SAndroid Build Coastguard Worker depCompileMultilib: "first", 1858*333d2b36SAndroid Build Coastguard Worker expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`, 1859*333d2b36SAndroid Build Coastguard Worker }, 1860*333d2b36SAndroid Build Coastguard Worker { 1861*333d2b36SAndroid Build Coastguard Worker dataDeviceBinType: "prefer32", 1862*333d2b36SAndroid Build Coastguard Worker depCompileMultilib: "64", 1863*333d2b36SAndroid Build Coastguard Worker expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`, 1864*333d2b36SAndroid Build Coastguard Worker }, 1865*333d2b36SAndroid Build Coastguard Worker } 1866*333d2b36SAndroid Build Coastguard Worker 1867*333d2b36SAndroid Build Coastguard Worker bpTemplate := ` 1868*333d2b36SAndroid Build Coastguard Worker java_test_host { 1869*333d2b36SAndroid Build Coastguard Worker name: "foo", 1870*333d2b36SAndroid Build Coastguard Worker srcs: ["test.java"], 1871*333d2b36SAndroid Build Coastguard Worker data_device_bins_%s: ["bar"], 1872*333d2b36SAndroid Build Coastguard Worker } 1873*333d2b36SAndroid Build Coastguard Worker 1874*333d2b36SAndroid Build Coastguard Worker cc_binary { 1875*333d2b36SAndroid Build Coastguard Worker name: "bar", 1876*333d2b36SAndroid Build Coastguard Worker compile_multilib: "%s", 1877*333d2b36SAndroid Build Coastguard Worker } 1878*333d2b36SAndroid Build Coastguard Worker ` 1879*333d2b36SAndroid Build Coastguard Worker 1880*333d2b36SAndroid Build Coastguard Worker for _, tc := range testCases { 1881*333d2b36SAndroid Build Coastguard Worker bp := fmt.Sprintf(bpTemplate, tc.dataDeviceBinType, tc.depCompileMultilib) 1882*333d2b36SAndroid Build Coastguard Worker 1883*333d2b36SAndroid Build Coastguard Worker errorHandler := android.FixtureExpectsNoErrors 1884*333d2b36SAndroid Build Coastguard Worker if tc.expectedError != "" { 1885*333d2b36SAndroid Build Coastguard Worker errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError) 1886*333d2b36SAndroid Build Coastguard Worker } 1887*333d2b36SAndroid Build Coastguard Worker 1888*333d2b36SAndroid Build Coastguard Worker testName := fmt.Sprintf(`data_device_bins_%s with compile_multilib:"%s"`, tc.dataDeviceBinType, tc.depCompileMultilib) 1889*333d2b36SAndroid Build Coastguard Worker t.Run(testName, func(t *testing.T) { 1890*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers(PrepareForIntegrationTestWithJava). 1891*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(errorHandler). 1892*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, bp) 1893*333d2b36SAndroid Build Coastguard Worker if tc.expectedError != "" { 1894*333d2b36SAndroid Build Coastguard Worker return 1895*333d2b36SAndroid Build Coastguard Worker } 1896*333d2b36SAndroid Build Coastguard Worker 1897*333d2b36SAndroid Build Coastguard Worker buildOS := ctx.Config.BuildOS.String() 1898*333d2b36SAndroid Build Coastguard Worker fooVariant := ctx.ModuleForTests("foo", buildOS+"_common") 1899*333d2b36SAndroid Build Coastguard Worker fooMod := fooVariant.Module().(*TestHost) 1900*333d2b36SAndroid Build Coastguard Worker entries := android.AndroidMkEntriesForTest(t, ctx.TestContext, fooMod)[0] 1901*333d2b36SAndroid Build Coastguard Worker 1902*333d2b36SAndroid Build Coastguard Worker expectedAutogenConfig := `<option name="push-file" key="bar" value="/data/local/tests/unrestricted/foo/bar" />` 1903*333d2b36SAndroid Build Coastguard Worker autogen := fooVariant.Rule("autogen") 1904*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(autogen.Args["extraConfigs"], expectedAutogenConfig) { 1905*333d2b36SAndroid Build Coastguard Worker t.Errorf("foo extraConfigs %v does not contain %q", autogen.Args["extraConfigs"], expectedAutogenConfig) 1906*333d2b36SAndroid Build Coastguard Worker } 1907*333d2b36SAndroid Build Coastguard Worker 1908*333d2b36SAndroid Build Coastguard Worker expectedData := []string{} 1909*333d2b36SAndroid Build Coastguard Worker for _, variant := range tc.variants { 1910*333d2b36SAndroid Build Coastguard Worker barVariant := ctx.ModuleForTests("bar", variant) 1911*333d2b36SAndroid Build Coastguard Worker relocated := barVariant.Output("bar") 1912*333d2b36SAndroid Build Coastguard Worker expectedInput := fmt.Sprintf("out/soong/.intermediates/bar/%s/unstripped/bar", variant) 1913*333d2b36SAndroid Build Coastguard Worker android.AssertPathRelativeToTopEquals(t, "relocation input", expectedInput, relocated.Input) 1914*333d2b36SAndroid Build Coastguard Worker 1915*333d2b36SAndroid Build Coastguard Worker expectedData = append(expectedData, fmt.Sprintf("out/soong/.intermediates/bar/%s/bar:bar", variant)) 1916*333d2b36SAndroid Build Coastguard Worker } 1917*333d2b36SAndroid Build Coastguard Worker 1918*333d2b36SAndroid Build Coastguard Worker actualData := entries.EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"] 1919*333d2b36SAndroid Build Coastguard Worker android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_TEST_DATA", ctx.Config, expectedData, actualData) 1920*333d2b36SAndroid Build Coastguard Worker }) 1921*333d2b36SAndroid Build Coastguard Worker } 1922*333d2b36SAndroid Build Coastguard Worker} 1923*333d2b36SAndroid Build Coastguard Worker 1924*333d2b36SAndroid Build Coastguard Workerfunc TestDeviceBinaryWrapperGeneration(t *testing.T) { 1925*333d2b36SAndroid Build Coastguard Worker // Scenario 1: java_binary has main_class property in its bp 1926*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 1927*333d2b36SAndroid Build Coastguard Worker java_binary { 1928*333d2b36SAndroid Build Coastguard Worker name: "foo", 1929*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 1930*333d2b36SAndroid Build Coastguard Worker main_class: "foo.bar.jb", 1931*333d2b36SAndroid Build Coastguard Worker } 1932*333d2b36SAndroid Build Coastguard Worker `) 1933*333d2b36SAndroid Build Coastguard Worker wrapperPath := fmt.Sprint(ctx.ModuleForTests("foo", "android_common").AllOutputs()) 1934*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(wrapperPath, "foo.sh") { 1935*333d2b36SAndroid Build Coastguard Worker t.Errorf("wrapper file foo.sh is not generated") 1936*333d2b36SAndroid Build Coastguard Worker } 1937*333d2b36SAndroid Build Coastguard Worker 1938*333d2b36SAndroid Build Coastguard Worker // Scenario 2: java_binary has neither wrapper nor main_class, its build 1939*333d2b36SAndroid Build Coastguard Worker // is expected to be failed. 1940*333d2b36SAndroid Build Coastguard Worker testJavaError(t, "main_class property is required for device binary if no default wrapper is assigned", ` 1941*333d2b36SAndroid Build Coastguard Worker java_binary { 1942*333d2b36SAndroid Build Coastguard Worker name: "foo", 1943*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 1944*333d2b36SAndroid Build Coastguard Worker }`) 1945*333d2b36SAndroid Build Coastguard Worker} 1946*333d2b36SAndroid Build Coastguard Worker 1947*333d2b36SAndroid Build Coastguard Workerfunc TestJavaApiContributionEmptyApiFile(t *testing.T) { 1948*333d2b36SAndroid Build Coastguard Worker android.GroupFixturePreparers( 1949*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 1950*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeEnv( 1951*333d2b36SAndroid Build Coastguard Worker map[string]string{ 1952*333d2b36SAndroid Build Coastguard Worker "DISABLE_STUB_VALIDATION": "true", 1953*333d2b36SAndroid Build Coastguard Worker }, 1954*333d2b36SAndroid Build Coastguard Worker ), 1955*333d2b36SAndroid Build Coastguard Worker ).ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern( 1956*333d2b36SAndroid Build Coastguard Worker "Error: foo has an empty api file.", 1957*333d2b36SAndroid Build Coastguard Worker )).RunTestWithBp(t, ` 1958*333d2b36SAndroid Build Coastguard Worker java_api_contribution { 1959*333d2b36SAndroid Build Coastguard Worker name: "foo", 1960*333d2b36SAndroid Build Coastguard Worker } 1961*333d2b36SAndroid Build Coastguard Worker java_api_library { 1962*333d2b36SAndroid Build Coastguard Worker name: "bar", 1963*333d2b36SAndroid Build Coastguard Worker api_surface: "public", 1964*333d2b36SAndroid Build Coastguard Worker api_contributions: ["foo"], 1965*333d2b36SAndroid Build Coastguard Worker stubs_type: "everything", 1966*333d2b36SAndroid Build Coastguard Worker } 1967*333d2b36SAndroid Build Coastguard Worker `) 1968*333d2b36SAndroid Build Coastguard Worker} 1969*333d2b36SAndroid Build Coastguard Worker 1970*333d2b36SAndroid Build Coastguard Workerfunc TestJavaApiLibraryAndProviderLink(t *testing.T) { 1971*333d2b36SAndroid Build Coastguard Worker provider_bp_a := ` 1972*333d2b36SAndroid Build Coastguard Worker java_api_contribution { 1973*333d2b36SAndroid Build Coastguard Worker name: "foo1", 1974*333d2b36SAndroid Build Coastguard Worker api_file: "current.txt", 1975*333d2b36SAndroid Build Coastguard Worker api_surface: "public", 1976*333d2b36SAndroid Build Coastguard Worker } 1977*333d2b36SAndroid Build Coastguard Worker ` 1978*333d2b36SAndroid Build Coastguard Worker provider_bp_b := `java_api_contribution { 1979*333d2b36SAndroid Build Coastguard Worker name: "foo2", 1980*333d2b36SAndroid Build Coastguard Worker api_file: "current.txt", 1981*333d2b36SAndroid Build Coastguard Worker api_surface: "public", 1982*333d2b36SAndroid Build Coastguard Worker } 1983*333d2b36SAndroid Build Coastguard Worker ` 1984*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers( 1985*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 1986*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs( 1987*333d2b36SAndroid Build Coastguard Worker map[string][]byte{ 1988*333d2b36SAndroid Build Coastguard Worker "a/Android.bp": []byte(provider_bp_a), 1989*333d2b36SAndroid Build Coastguard Worker "b/Android.bp": []byte(provider_bp_b), 1990*333d2b36SAndroid Build Coastguard Worker }, 1991*333d2b36SAndroid Build Coastguard Worker ), 1992*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeEnv( 1993*333d2b36SAndroid Build Coastguard Worker map[string]string{ 1994*333d2b36SAndroid Build Coastguard Worker "DISABLE_STUB_VALIDATION": "true", 1995*333d2b36SAndroid Build Coastguard Worker }, 1996*333d2b36SAndroid Build Coastguard Worker ), 1997*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 1998*333d2b36SAndroid Build Coastguard Worker java_api_library { 1999*333d2b36SAndroid Build Coastguard Worker name: "bar1", 2000*333d2b36SAndroid Build Coastguard Worker api_surface: "public", 2001*333d2b36SAndroid Build Coastguard Worker api_contributions: ["foo1"], 2002*333d2b36SAndroid Build Coastguard Worker stubs_type: "everything", 2003*333d2b36SAndroid Build Coastguard Worker } 2004*333d2b36SAndroid Build Coastguard Worker 2005*333d2b36SAndroid Build Coastguard Worker java_api_library { 2006*333d2b36SAndroid Build Coastguard Worker name: "bar2", 2007*333d2b36SAndroid Build Coastguard Worker api_surface: "system", 2008*333d2b36SAndroid Build Coastguard Worker api_contributions: ["foo1", "foo2"], 2009*333d2b36SAndroid Build Coastguard Worker stubs_type: "everything", 2010*333d2b36SAndroid Build Coastguard Worker } 2011*333d2b36SAndroid Build Coastguard Worker `) 2012*333d2b36SAndroid Build Coastguard Worker 2013*333d2b36SAndroid Build Coastguard Worker testcases := []struct { 2014*333d2b36SAndroid Build Coastguard Worker moduleName string 2015*333d2b36SAndroid Build Coastguard Worker sourceTextFileDirs []string 2016*333d2b36SAndroid Build Coastguard Worker }{ 2017*333d2b36SAndroid Build Coastguard Worker { 2018*333d2b36SAndroid Build Coastguard Worker moduleName: "bar1", 2019*333d2b36SAndroid Build Coastguard Worker sourceTextFileDirs: []string{"a/current.txt"}, 2020*333d2b36SAndroid Build Coastguard Worker }, 2021*333d2b36SAndroid Build Coastguard Worker { 2022*333d2b36SAndroid Build Coastguard Worker moduleName: "bar2", 2023*333d2b36SAndroid Build Coastguard Worker sourceTextFileDirs: []string{"a/current.txt", "b/current.txt"}, 2024*333d2b36SAndroid Build Coastguard Worker }, 2025*333d2b36SAndroid Build Coastguard Worker } 2026*333d2b36SAndroid Build Coastguard Worker for _, c := range testcases { 2027*333d2b36SAndroid Build Coastguard Worker m := ctx.ModuleForTests(c.moduleName, "android_common") 2028*333d2b36SAndroid Build Coastguard Worker manifest := m.Output("metalava.sbox.textproto") 2029*333d2b36SAndroid Build Coastguard Worker sboxProto := android.RuleBuilderSboxProtoForTests(t, ctx.TestContext, manifest) 2030*333d2b36SAndroid Build Coastguard Worker manifestCommand := sboxProto.Commands[0].GetCommand() 2031*333d2b36SAndroid Build Coastguard Worker sourceFilesFlag := "--source-files " + strings.Join(c.sourceTextFileDirs, " ") 2032*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "source text files not present", manifestCommand, sourceFilesFlag) 2033*333d2b36SAndroid Build Coastguard Worker } 2034*333d2b36SAndroid Build Coastguard Worker} 2035*333d2b36SAndroid Build Coastguard Worker 2036*333d2b36SAndroid Build Coastguard Workerfunc TestJavaApiLibraryAndDefaultsLink(t *testing.T) { 2037*333d2b36SAndroid Build Coastguard Worker provider_bp_a := ` 2038*333d2b36SAndroid Build Coastguard Worker java_api_contribution { 2039*333d2b36SAndroid Build Coastguard Worker name: "foo1", 2040*333d2b36SAndroid Build Coastguard Worker api_file: "current.txt", 2041*333d2b36SAndroid Build Coastguard Worker api_surface: "public", 2042*333d2b36SAndroid Build Coastguard Worker } 2043*333d2b36SAndroid Build Coastguard Worker ` 2044*333d2b36SAndroid Build Coastguard Worker provider_bp_b := ` 2045*333d2b36SAndroid Build Coastguard Worker java_api_contribution { 2046*333d2b36SAndroid Build Coastguard Worker name: "foo2", 2047*333d2b36SAndroid Build Coastguard Worker api_file: "current.txt", 2048*333d2b36SAndroid Build Coastguard Worker api_surface: "public", 2049*333d2b36SAndroid Build Coastguard Worker } 2050*333d2b36SAndroid Build Coastguard Worker ` 2051*333d2b36SAndroid Build Coastguard Worker provider_bp_c := ` 2052*333d2b36SAndroid Build Coastguard Worker java_api_contribution { 2053*333d2b36SAndroid Build Coastguard Worker name: "foo3", 2054*333d2b36SAndroid Build Coastguard Worker api_file: "system-current.txt", 2055*333d2b36SAndroid Build Coastguard Worker api_surface: "system", 2056*333d2b36SAndroid Build Coastguard Worker } 2057*333d2b36SAndroid Build Coastguard Worker ` 2058*333d2b36SAndroid Build Coastguard Worker provider_bp_d := ` 2059*333d2b36SAndroid Build Coastguard Worker java_api_contribution { 2060*333d2b36SAndroid Build Coastguard Worker name: "foo4", 2061*333d2b36SAndroid Build Coastguard Worker api_file: "system-current.txt", 2062*333d2b36SAndroid Build Coastguard Worker api_surface: "system", 2063*333d2b36SAndroid Build Coastguard Worker } 2064*333d2b36SAndroid Build Coastguard Worker ` 2065*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers( 2066*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 2067*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs( 2068*333d2b36SAndroid Build Coastguard Worker map[string][]byte{ 2069*333d2b36SAndroid Build Coastguard Worker "a/Android.bp": []byte(provider_bp_a), 2070*333d2b36SAndroid Build Coastguard Worker "b/Android.bp": []byte(provider_bp_b), 2071*333d2b36SAndroid Build Coastguard Worker "c/Android.bp": []byte(provider_bp_c), 2072*333d2b36SAndroid Build Coastguard Worker "d/Android.bp": []byte(provider_bp_d), 2073*333d2b36SAndroid Build Coastguard Worker }, 2074*333d2b36SAndroid Build Coastguard Worker ), 2075*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeEnv( 2076*333d2b36SAndroid Build Coastguard Worker map[string]string{ 2077*333d2b36SAndroid Build Coastguard Worker "DISABLE_STUB_VALIDATION": "true", 2078*333d2b36SAndroid Build Coastguard Worker }, 2079*333d2b36SAndroid Build Coastguard Worker ), 2080*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 2081*333d2b36SAndroid Build Coastguard Worker java_defaults { 2082*333d2b36SAndroid Build Coastguard Worker name: "baz1", 2083*333d2b36SAndroid Build Coastguard Worker api_surface: "public", 2084*333d2b36SAndroid Build Coastguard Worker api_contributions: ["foo1", "foo2"], 2085*333d2b36SAndroid Build Coastguard Worker } 2086*333d2b36SAndroid Build Coastguard Worker 2087*333d2b36SAndroid Build Coastguard Worker java_defaults { 2088*333d2b36SAndroid Build Coastguard Worker name: "baz2", 2089*333d2b36SAndroid Build Coastguard Worker api_surface: "system", 2090*333d2b36SAndroid Build Coastguard Worker api_contributions: ["foo3"], 2091*333d2b36SAndroid Build Coastguard Worker } 2092*333d2b36SAndroid Build Coastguard Worker 2093*333d2b36SAndroid Build Coastguard Worker java_api_library { 2094*333d2b36SAndroid Build Coastguard Worker name: "bar1", 2095*333d2b36SAndroid Build Coastguard Worker api_surface: "public", 2096*333d2b36SAndroid Build Coastguard Worker api_contributions: ["foo1"], 2097*333d2b36SAndroid Build Coastguard Worker stubs_type: "everything", 2098*333d2b36SAndroid Build Coastguard Worker } 2099*333d2b36SAndroid Build Coastguard Worker 2100*333d2b36SAndroid Build Coastguard Worker java_api_library { 2101*333d2b36SAndroid Build Coastguard Worker name: "bar2", 2102*333d2b36SAndroid Build Coastguard Worker api_surface: "public", 2103*333d2b36SAndroid Build Coastguard Worker defaults:["baz1"], 2104*333d2b36SAndroid Build Coastguard Worker stubs_type: "everything", 2105*333d2b36SAndroid Build Coastguard Worker } 2106*333d2b36SAndroid Build Coastguard Worker 2107*333d2b36SAndroid Build Coastguard Worker java_api_library { 2108*333d2b36SAndroid Build Coastguard Worker name: "bar3", 2109*333d2b36SAndroid Build Coastguard Worker api_surface: "system", 2110*333d2b36SAndroid Build Coastguard Worker defaults:["baz1", "baz2"], 2111*333d2b36SAndroid Build Coastguard Worker api_contributions: ["foo4"], 2112*333d2b36SAndroid Build Coastguard Worker stubs_type: "everything", 2113*333d2b36SAndroid Build Coastguard Worker } 2114*333d2b36SAndroid Build Coastguard Worker `) 2115*333d2b36SAndroid Build Coastguard Worker 2116*333d2b36SAndroid Build Coastguard Worker testcases := []struct { 2117*333d2b36SAndroid Build Coastguard Worker moduleName string 2118*333d2b36SAndroid Build Coastguard Worker sourceTextFileDirs []string 2119*333d2b36SAndroid Build Coastguard Worker }{ 2120*333d2b36SAndroid Build Coastguard Worker { 2121*333d2b36SAndroid Build Coastguard Worker moduleName: "bar1", 2122*333d2b36SAndroid Build Coastguard Worker sourceTextFileDirs: []string{"a/current.txt"}, 2123*333d2b36SAndroid Build Coastguard Worker }, 2124*333d2b36SAndroid Build Coastguard Worker { 2125*333d2b36SAndroid Build Coastguard Worker moduleName: "bar2", 2126*333d2b36SAndroid Build Coastguard Worker sourceTextFileDirs: []string{"a/current.txt", "b/current.txt"}, 2127*333d2b36SAndroid Build Coastguard Worker }, 2128*333d2b36SAndroid Build Coastguard Worker { 2129*333d2b36SAndroid Build Coastguard Worker moduleName: "bar3", 2130*333d2b36SAndroid Build Coastguard Worker // API text files need to be sorted from the narrower api scope to the wider api scope 2131*333d2b36SAndroid Build Coastguard Worker sourceTextFileDirs: []string{"a/current.txt", "b/current.txt", "c/system-current.txt", "d/system-current.txt"}, 2132*333d2b36SAndroid Build Coastguard Worker }, 2133*333d2b36SAndroid Build Coastguard Worker } 2134*333d2b36SAndroid Build Coastguard Worker for _, c := range testcases { 2135*333d2b36SAndroid Build Coastguard Worker m := ctx.ModuleForTests(c.moduleName, "android_common") 2136*333d2b36SAndroid Build Coastguard Worker manifest := m.Output("metalava.sbox.textproto") 2137*333d2b36SAndroid Build Coastguard Worker sboxProto := android.RuleBuilderSboxProtoForTests(t, ctx.TestContext, manifest) 2138*333d2b36SAndroid Build Coastguard Worker manifestCommand := sboxProto.Commands[0].GetCommand() 2139*333d2b36SAndroid Build Coastguard Worker sourceFilesFlag := "--source-files " + strings.Join(c.sourceTextFileDirs, " ") 2140*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "source text files not present", manifestCommand, sourceFilesFlag) 2141*333d2b36SAndroid Build Coastguard Worker } 2142*333d2b36SAndroid Build Coastguard Worker} 2143*333d2b36SAndroid Build Coastguard Worker 2144*333d2b36SAndroid Build Coastguard Workerfunc TestJavaApiLibraryJarGeneration(t *testing.T) { 2145*333d2b36SAndroid Build Coastguard Worker provider_bp_a := ` 2146*333d2b36SAndroid Build Coastguard Worker java_api_contribution { 2147*333d2b36SAndroid Build Coastguard Worker name: "foo1", 2148*333d2b36SAndroid Build Coastguard Worker api_file: "current.txt", 2149*333d2b36SAndroid Build Coastguard Worker api_surface: "public", 2150*333d2b36SAndroid Build Coastguard Worker } 2151*333d2b36SAndroid Build Coastguard Worker ` 2152*333d2b36SAndroid Build Coastguard Worker provider_bp_b := ` 2153*333d2b36SAndroid Build Coastguard Worker java_api_contribution { 2154*333d2b36SAndroid Build Coastguard Worker name: "foo2", 2155*333d2b36SAndroid Build Coastguard Worker api_file: "current.txt", 2156*333d2b36SAndroid Build Coastguard Worker api_surface: "public", 2157*333d2b36SAndroid Build Coastguard Worker } 2158*333d2b36SAndroid Build Coastguard Worker ` 2159*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers( 2160*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 2161*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs( 2162*333d2b36SAndroid Build Coastguard Worker map[string][]byte{ 2163*333d2b36SAndroid Build Coastguard Worker "a/Android.bp": []byte(provider_bp_a), 2164*333d2b36SAndroid Build Coastguard Worker "b/Android.bp": []byte(provider_bp_b), 2165*333d2b36SAndroid Build Coastguard Worker }, 2166*333d2b36SAndroid Build Coastguard Worker ), 2167*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeEnv( 2168*333d2b36SAndroid Build Coastguard Worker map[string]string{ 2169*333d2b36SAndroid Build Coastguard Worker "DISABLE_STUB_VALIDATION": "true", 2170*333d2b36SAndroid Build Coastguard Worker }, 2171*333d2b36SAndroid Build Coastguard Worker ), 2172*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 2173*333d2b36SAndroid Build Coastguard Worker java_api_library { 2174*333d2b36SAndroid Build Coastguard Worker name: "bar1", 2175*333d2b36SAndroid Build Coastguard Worker api_surface: "public", 2176*333d2b36SAndroid Build Coastguard Worker api_contributions: ["foo1"], 2177*333d2b36SAndroid Build Coastguard Worker stubs_type: "everything", 2178*333d2b36SAndroid Build Coastguard Worker } 2179*333d2b36SAndroid Build Coastguard Worker 2180*333d2b36SAndroid Build Coastguard Worker java_api_library { 2181*333d2b36SAndroid Build Coastguard Worker name: "bar2", 2182*333d2b36SAndroid Build Coastguard Worker api_surface: "system", 2183*333d2b36SAndroid Build Coastguard Worker api_contributions: ["foo1", "foo2"], 2184*333d2b36SAndroid Build Coastguard Worker stubs_type: "everything", 2185*333d2b36SAndroid Build Coastguard Worker } 2186*333d2b36SAndroid Build Coastguard Worker `) 2187*333d2b36SAndroid Build Coastguard Worker 2188*333d2b36SAndroid Build Coastguard Worker testcases := []struct { 2189*333d2b36SAndroid Build Coastguard Worker moduleName string 2190*333d2b36SAndroid Build Coastguard Worker outputJarName string 2191*333d2b36SAndroid Build Coastguard Worker }{ 2192*333d2b36SAndroid Build Coastguard Worker { 2193*333d2b36SAndroid Build Coastguard Worker moduleName: "bar1", 2194*333d2b36SAndroid Build Coastguard Worker outputJarName: "bar1/bar1.jar", 2195*333d2b36SAndroid Build Coastguard Worker }, 2196*333d2b36SAndroid Build Coastguard Worker { 2197*333d2b36SAndroid Build Coastguard Worker moduleName: "bar2", 2198*333d2b36SAndroid Build Coastguard Worker outputJarName: "bar2/bar2.jar", 2199*333d2b36SAndroid Build Coastguard Worker }, 2200*333d2b36SAndroid Build Coastguard Worker } 2201*333d2b36SAndroid Build Coastguard Worker for _, c := range testcases { 2202*333d2b36SAndroid Build Coastguard Worker m := ctx.ModuleForTests(c.moduleName, "android_common") 2203*333d2b36SAndroid Build Coastguard Worker outputs := fmt.Sprint(m.AllOutputs()) 2204*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(outputs, c.outputJarName) { 2205*333d2b36SAndroid Build Coastguard Worker t.Errorf("Module output does not contain expected jar %s", c.outputJarName) 2206*333d2b36SAndroid Build Coastguard Worker } 2207*333d2b36SAndroid Build Coastguard Worker } 2208*333d2b36SAndroid Build Coastguard Worker} 2209*333d2b36SAndroid Build Coastguard Worker 2210*333d2b36SAndroid Build Coastguard Workerfunc TestJavaApiLibraryLibsLink(t *testing.T) { 2211*333d2b36SAndroid Build Coastguard Worker provider_bp_a := ` 2212*333d2b36SAndroid Build Coastguard Worker java_api_contribution { 2213*333d2b36SAndroid Build Coastguard Worker name: "foo1", 2214*333d2b36SAndroid Build Coastguard Worker api_file: "current.txt", 2215*333d2b36SAndroid Build Coastguard Worker api_surface: "public", 2216*333d2b36SAndroid Build Coastguard Worker } 2217*333d2b36SAndroid Build Coastguard Worker ` 2218*333d2b36SAndroid Build Coastguard Worker provider_bp_b := ` 2219*333d2b36SAndroid Build Coastguard Worker java_api_contribution { 2220*333d2b36SAndroid Build Coastguard Worker name: "foo2", 2221*333d2b36SAndroid Build Coastguard Worker api_file: "current.txt", 2222*333d2b36SAndroid Build Coastguard Worker api_surface: "public", 2223*333d2b36SAndroid Build Coastguard Worker } 2224*333d2b36SAndroid Build Coastguard Worker ` 2225*333d2b36SAndroid Build Coastguard Worker lib_bp_a := ` 2226*333d2b36SAndroid Build Coastguard Worker java_library { 2227*333d2b36SAndroid Build Coastguard Worker name: "lib1", 2228*333d2b36SAndroid Build Coastguard Worker srcs: ["Lib.java"], 2229*333d2b36SAndroid Build Coastguard Worker } 2230*333d2b36SAndroid Build Coastguard Worker ` 2231*333d2b36SAndroid Build Coastguard Worker lib_bp_b := ` 2232*333d2b36SAndroid Build Coastguard Worker java_library { 2233*333d2b36SAndroid Build Coastguard Worker name: "lib2", 2234*333d2b36SAndroid Build Coastguard Worker srcs: ["Lib.java"], 2235*333d2b36SAndroid Build Coastguard Worker } 2236*333d2b36SAndroid Build Coastguard Worker ` 2237*333d2b36SAndroid Build Coastguard Worker 2238*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers( 2239*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 2240*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs( 2241*333d2b36SAndroid Build Coastguard Worker map[string][]byte{ 2242*333d2b36SAndroid Build Coastguard Worker "a/Android.bp": []byte(provider_bp_a), 2243*333d2b36SAndroid Build Coastguard Worker "b/Android.bp": []byte(provider_bp_b), 2244*333d2b36SAndroid Build Coastguard Worker "c/Android.bp": []byte(lib_bp_a), 2245*333d2b36SAndroid Build Coastguard Worker "c/Lib.java": {}, 2246*333d2b36SAndroid Build Coastguard Worker "d/Android.bp": []byte(lib_bp_b), 2247*333d2b36SAndroid Build Coastguard Worker "d/Lib.java": {}, 2248*333d2b36SAndroid Build Coastguard Worker }, 2249*333d2b36SAndroid Build Coastguard Worker ), 2250*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeEnv( 2251*333d2b36SAndroid Build Coastguard Worker map[string]string{ 2252*333d2b36SAndroid Build Coastguard Worker "DISABLE_STUB_VALIDATION": "true", 2253*333d2b36SAndroid Build Coastguard Worker }, 2254*333d2b36SAndroid Build Coastguard Worker ), 2255*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 2256*333d2b36SAndroid Build Coastguard Worker java_api_library { 2257*333d2b36SAndroid Build Coastguard Worker name: "bar1", 2258*333d2b36SAndroid Build Coastguard Worker api_surface: "public", 2259*333d2b36SAndroid Build Coastguard Worker api_contributions: ["foo1"], 2260*333d2b36SAndroid Build Coastguard Worker libs: ["lib1"], 2261*333d2b36SAndroid Build Coastguard Worker stubs_type: "everything", 2262*333d2b36SAndroid Build Coastguard Worker } 2263*333d2b36SAndroid Build Coastguard Worker 2264*333d2b36SAndroid Build Coastguard Worker java_api_library { 2265*333d2b36SAndroid Build Coastguard Worker name: "bar2", 2266*333d2b36SAndroid Build Coastguard Worker api_surface: "system", 2267*333d2b36SAndroid Build Coastguard Worker api_contributions: ["foo1", "foo2"], 2268*333d2b36SAndroid Build Coastguard Worker libs: ["lib1", "lib2", "bar1"], 2269*333d2b36SAndroid Build Coastguard Worker stubs_type: "everything", 2270*333d2b36SAndroid Build Coastguard Worker } 2271*333d2b36SAndroid Build Coastguard Worker `) 2272*333d2b36SAndroid Build Coastguard Worker 2273*333d2b36SAndroid Build Coastguard Worker testcases := []struct { 2274*333d2b36SAndroid Build Coastguard Worker moduleName string 2275*333d2b36SAndroid Build Coastguard Worker classPathJarNames []string 2276*333d2b36SAndroid Build Coastguard Worker }{ 2277*333d2b36SAndroid Build Coastguard Worker { 2278*333d2b36SAndroid Build Coastguard Worker moduleName: "bar1", 2279*333d2b36SAndroid Build Coastguard Worker classPathJarNames: []string{"lib1.jar"}, 2280*333d2b36SAndroid Build Coastguard Worker }, 2281*333d2b36SAndroid Build Coastguard Worker { 2282*333d2b36SAndroid Build Coastguard Worker moduleName: "bar2", 2283*333d2b36SAndroid Build Coastguard Worker classPathJarNames: []string{"lib1.jar", "lib2.jar", "bar1/bar1.jar"}, 2284*333d2b36SAndroid Build Coastguard Worker }, 2285*333d2b36SAndroid Build Coastguard Worker } 2286*333d2b36SAndroid Build Coastguard Worker for _, c := range testcases { 2287*333d2b36SAndroid Build Coastguard Worker m := ctx.ModuleForTests(c.moduleName, "android_common") 2288*333d2b36SAndroid Build Coastguard Worker javacRules := m.Rule("javac") 2289*333d2b36SAndroid Build Coastguard Worker classPathArgs := javacRules.Args["classpath"] 2290*333d2b36SAndroid Build Coastguard Worker for _, jarName := range c.classPathJarNames { 2291*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(classPathArgs, jarName) { 2292*333d2b36SAndroid Build Coastguard Worker t.Errorf("Module output does not contain expected jar %s", jarName) 2293*333d2b36SAndroid Build Coastguard Worker } 2294*333d2b36SAndroid Build Coastguard Worker } 2295*333d2b36SAndroid Build Coastguard Worker } 2296*333d2b36SAndroid Build Coastguard Worker} 2297*333d2b36SAndroid Build Coastguard Worker 2298*333d2b36SAndroid Build Coastguard Workerfunc TestJavaApiLibraryStaticLibsLink(t *testing.T) { 2299*333d2b36SAndroid Build Coastguard Worker provider_bp_a := ` 2300*333d2b36SAndroid Build Coastguard Worker java_api_contribution { 2301*333d2b36SAndroid Build Coastguard Worker name: "foo1", 2302*333d2b36SAndroid Build Coastguard Worker api_file: "current.txt", 2303*333d2b36SAndroid Build Coastguard Worker api_surface: "public", 2304*333d2b36SAndroid Build Coastguard Worker } 2305*333d2b36SAndroid Build Coastguard Worker ` 2306*333d2b36SAndroid Build Coastguard Worker provider_bp_b := ` 2307*333d2b36SAndroid Build Coastguard Worker java_api_contribution { 2308*333d2b36SAndroid Build Coastguard Worker name: "foo2", 2309*333d2b36SAndroid Build Coastguard Worker api_file: "current.txt", 2310*333d2b36SAndroid Build Coastguard Worker api_surface: "public", 2311*333d2b36SAndroid Build Coastguard Worker } 2312*333d2b36SAndroid Build Coastguard Worker ` 2313*333d2b36SAndroid Build Coastguard Worker lib_bp_a := ` 2314*333d2b36SAndroid Build Coastguard Worker java_library { 2315*333d2b36SAndroid Build Coastguard Worker name: "lib1", 2316*333d2b36SAndroid Build Coastguard Worker srcs: ["Lib.java"], 2317*333d2b36SAndroid Build Coastguard Worker } 2318*333d2b36SAndroid Build Coastguard Worker ` 2319*333d2b36SAndroid Build Coastguard Worker lib_bp_b := ` 2320*333d2b36SAndroid Build Coastguard Worker java_library { 2321*333d2b36SAndroid Build Coastguard Worker name: "lib2", 2322*333d2b36SAndroid Build Coastguard Worker srcs: ["Lib.java"], 2323*333d2b36SAndroid Build Coastguard Worker } 2324*333d2b36SAndroid Build Coastguard Worker ` 2325*333d2b36SAndroid Build Coastguard Worker 2326*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers( 2327*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 2328*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs( 2329*333d2b36SAndroid Build Coastguard Worker map[string][]byte{ 2330*333d2b36SAndroid Build Coastguard Worker "a/Android.bp": []byte(provider_bp_a), 2331*333d2b36SAndroid Build Coastguard Worker "b/Android.bp": []byte(provider_bp_b), 2332*333d2b36SAndroid Build Coastguard Worker "c/Android.bp": []byte(lib_bp_a), 2333*333d2b36SAndroid Build Coastguard Worker "c/Lib.java": {}, 2334*333d2b36SAndroid Build Coastguard Worker "d/Android.bp": []byte(lib_bp_b), 2335*333d2b36SAndroid Build Coastguard Worker "d/Lib.java": {}, 2336*333d2b36SAndroid Build Coastguard Worker }, 2337*333d2b36SAndroid Build Coastguard Worker ), 2338*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeEnv( 2339*333d2b36SAndroid Build Coastguard Worker map[string]string{ 2340*333d2b36SAndroid Build Coastguard Worker "DISABLE_STUB_VALIDATION": "true", 2341*333d2b36SAndroid Build Coastguard Worker }, 2342*333d2b36SAndroid Build Coastguard Worker ), 2343*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 2344*333d2b36SAndroid Build Coastguard Worker java_api_library { 2345*333d2b36SAndroid Build Coastguard Worker name: "bar1", 2346*333d2b36SAndroid Build Coastguard Worker api_surface: "public", 2347*333d2b36SAndroid Build Coastguard Worker api_contributions: ["foo1"], 2348*333d2b36SAndroid Build Coastguard Worker static_libs: ["lib1"], 2349*333d2b36SAndroid Build Coastguard Worker stubs_type: "everything", 2350*333d2b36SAndroid Build Coastguard Worker } 2351*333d2b36SAndroid Build Coastguard Worker 2352*333d2b36SAndroid Build Coastguard Worker java_api_library { 2353*333d2b36SAndroid Build Coastguard Worker name: "bar2", 2354*333d2b36SAndroid Build Coastguard Worker api_surface: "system", 2355*333d2b36SAndroid Build Coastguard Worker api_contributions: ["foo1", "foo2"], 2356*333d2b36SAndroid Build Coastguard Worker static_libs: ["lib1", "lib2", "bar1"], 2357*333d2b36SAndroid Build Coastguard Worker stubs_type: "everything", 2358*333d2b36SAndroid Build Coastguard Worker } 2359*333d2b36SAndroid Build Coastguard Worker `) 2360*333d2b36SAndroid Build Coastguard Worker 2361*333d2b36SAndroid Build Coastguard Worker testcases := []struct { 2362*333d2b36SAndroid Build Coastguard Worker moduleName string 2363*333d2b36SAndroid Build Coastguard Worker staticLibJarNames []string 2364*333d2b36SAndroid Build Coastguard Worker }{ 2365*333d2b36SAndroid Build Coastguard Worker { 2366*333d2b36SAndroid Build Coastguard Worker moduleName: "bar1", 2367*333d2b36SAndroid Build Coastguard Worker staticLibJarNames: []string{"lib1.jar"}, 2368*333d2b36SAndroid Build Coastguard Worker }, 2369*333d2b36SAndroid Build Coastguard Worker { 2370*333d2b36SAndroid Build Coastguard Worker moduleName: "bar2", 2371*333d2b36SAndroid Build Coastguard Worker staticLibJarNames: []string{"lib1.jar", "lib2.jar", "bar1/bar1.jar"}, 2372*333d2b36SAndroid Build Coastguard Worker }, 2373*333d2b36SAndroid Build Coastguard Worker } 2374*333d2b36SAndroid Build Coastguard Worker for _, c := range testcases { 2375*333d2b36SAndroid Build Coastguard Worker m := ctx.ModuleForTests(c.moduleName, "android_common") 2376*333d2b36SAndroid Build Coastguard Worker mergeZipsCommand := m.Rule("merge_zips").RuleParams.Command 2377*333d2b36SAndroid Build Coastguard Worker for _, jarName := range c.staticLibJarNames { 2378*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(mergeZipsCommand, jarName) { 2379*333d2b36SAndroid Build Coastguard Worker t.Errorf("merge_zips command does not contain expected jar %s", jarName) 2380*333d2b36SAndroid Build Coastguard Worker } 2381*333d2b36SAndroid Build Coastguard Worker } 2382*333d2b36SAndroid Build Coastguard Worker } 2383*333d2b36SAndroid Build Coastguard Worker} 2384*333d2b36SAndroid Build Coastguard Worker 2385*333d2b36SAndroid Build Coastguard Workerfunc TestTransitiveSrcFiles(t *testing.T) { 2386*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 2387*333d2b36SAndroid Build Coastguard Worker java_library { 2388*333d2b36SAndroid Build Coastguard Worker name: "a", 2389*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2390*333d2b36SAndroid Build Coastguard Worker } 2391*333d2b36SAndroid Build Coastguard Worker java_library { 2392*333d2b36SAndroid Build Coastguard Worker name: "b", 2393*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 2394*333d2b36SAndroid Build Coastguard Worker } 2395*333d2b36SAndroid Build Coastguard Worker java_library { 2396*333d2b36SAndroid Build Coastguard Worker name: "c", 2397*333d2b36SAndroid Build Coastguard Worker srcs: ["c.java"], 2398*333d2b36SAndroid Build Coastguard Worker libs: ["a"], 2399*333d2b36SAndroid Build Coastguard Worker static_libs: ["b"], 2400*333d2b36SAndroid Build Coastguard Worker } 2401*333d2b36SAndroid Build Coastguard Worker `) 2402*333d2b36SAndroid Build Coastguard Worker c := ctx.ModuleForTests("c", "android_common").Module() 2403*333d2b36SAndroid Build Coastguard Worker javaInfo, _ := android.OtherModuleProvider(ctx, c, JavaInfoProvider) 2404*333d2b36SAndroid Build Coastguard Worker transitiveSrcFiles := android.Paths(javaInfo.TransitiveSrcFiles.ToList()) 2405*333d2b36SAndroid Build Coastguard Worker android.AssertArrayString(t, "unexpected jar deps", []string{"b.java", "c.java"}, transitiveSrcFiles.Strings()) 2406*333d2b36SAndroid Build Coastguard Worker} 2407*333d2b36SAndroid Build Coastguard Worker 2408*333d2b36SAndroid Build Coastguard Workerfunc TestTradefedOptions(t *testing.T) { 2409*333d2b36SAndroid Build Coastguard Worker result := PrepareForTestWithJavaBuildComponents.RunTestWithBp(t, ` 2410*333d2b36SAndroid Build Coastguard Workerjava_test_host { 2411*333d2b36SAndroid Build Coastguard Worker name: "foo", 2412*333d2b36SAndroid Build Coastguard Worker test_options: { 2413*333d2b36SAndroid Build Coastguard Worker tradefed_options: [ 2414*333d2b36SAndroid Build Coastguard Worker { 2415*333d2b36SAndroid Build Coastguard Worker name: "exclude-path", 2416*333d2b36SAndroid Build Coastguard Worker value: "org/apache" 2417*333d2b36SAndroid Build Coastguard Worker } 2418*333d2b36SAndroid Build Coastguard Worker ] 2419*333d2b36SAndroid Build Coastguard Worker } 2420*333d2b36SAndroid Build Coastguard Worker} 2421*333d2b36SAndroid Build Coastguard Worker`) 2422*333d2b36SAndroid Build Coastguard Worker 2423*333d2b36SAndroid Build Coastguard Worker buildOS := result.Config.BuildOS.String() 2424*333d2b36SAndroid Build Coastguard Worker args := result.ModuleForTests("foo", buildOS+"_common"). 2425*333d2b36SAndroid Build Coastguard Worker Output("out/soong/.intermediates/foo/" + buildOS + "_common/foo.config").Args 2426*333d2b36SAndroid Build Coastguard Worker expected := proptools.NinjaAndShellEscape("<option name=\"exclude-path\" value=\"org/apache\" />") 2427*333d2b36SAndroid Build Coastguard Worker if args["extraConfigs"] != expected { 2428*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected args[\"extraConfigs\"] to equal %q, was %q", expected, args["extraConfigs"]) 2429*333d2b36SAndroid Build Coastguard Worker } 2430*333d2b36SAndroid Build Coastguard Worker} 2431*333d2b36SAndroid Build Coastguard Worker 2432*333d2b36SAndroid Build Coastguard Workerfunc TestTestRunnerOptions(t *testing.T) { 2433*333d2b36SAndroid Build Coastguard Worker result := PrepareForTestWithJavaBuildComponents.RunTestWithBp(t, ` 2434*333d2b36SAndroid Build Coastguard Workerjava_test_host { 2435*333d2b36SAndroid Build Coastguard Worker name: "foo", 2436*333d2b36SAndroid Build Coastguard Worker test_options: { 2437*333d2b36SAndroid Build Coastguard Worker test_runner_options: [ 2438*333d2b36SAndroid Build Coastguard Worker { 2439*333d2b36SAndroid Build Coastguard Worker name: "test-timeout", 2440*333d2b36SAndroid Build Coastguard Worker value: "10m" 2441*333d2b36SAndroid Build Coastguard Worker } 2442*333d2b36SAndroid Build Coastguard Worker ] 2443*333d2b36SAndroid Build Coastguard Worker } 2444*333d2b36SAndroid Build Coastguard Worker} 2445*333d2b36SAndroid Build Coastguard Worker`) 2446*333d2b36SAndroid Build Coastguard Worker 2447*333d2b36SAndroid Build Coastguard Worker buildOS := result.Config.BuildOS.String() 2448*333d2b36SAndroid Build Coastguard Worker args := result.ModuleForTests("foo", buildOS+"_common"). 2449*333d2b36SAndroid Build Coastguard Worker Output("out/soong/.intermediates/foo/" + buildOS + "_common/foo.config").Args 2450*333d2b36SAndroid Build Coastguard Worker expected := proptools.NinjaAndShellEscape("<option name=\"test-timeout\" value=\"10m\" />\\n ") 2451*333d2b36SAndroid Build Coastguard Worker if args["extraTestRunnerConfigs"] != expected { 2452*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected args[\"extraTestRunnerConfigs\"] to equal %q, was %q", expected, args["extraTestRunnerConfigs"]) 2453*333d2b36SAndroid Build Coastguard Worker } 2454*333d2b36SAndroid Build Coastguard Worker} 2455*333d2b36SAndroid Build Coastguard Worker 2456*333d2b36SAndroid Build Coastguard Workerfunc TestJavaLibraryWithResourcesStem(t *testing.T) { 2457*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJavaWithFS(t, ` 2458*333d2b36SAndroid Build Coastguard Worker java_library { 2459*333d2b36SAndroid Build Coastguard Worker name: "foo", 2460*333d2b36SAndroid Build Coastguard Worker java_resource_dirs: ["test-jar"], 2461*333d2b36SAndroid Build Coastguard Worker stem: "test", 2462*333d2b36SAndroid Build Coastguard Worker } 2463*333d2b36SAndroid Build Coastguard Worker `, 2464*333d2b36SAndroid Build Coastguard Worker map[string][]byte{ 2465*333d2b36SAndroid Build Coastguard Worker "test-jar/test/resource.txt": nil, 2466*333d2b36SAndroid Build Coastguard Worker }) 2467*333d2b36SAndroid Build Coastguard Worker 2468*333d2b36SAndroid Build Coastguard Worker m := ctx.ModuleForTests("foo", "android_common") 2469*333d2b36SAndroid Build Coastguard Worker outputs := fmt.Sprint(m.AllOutputs()) 2470*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(outputs, "test.jar") { 2471*333d2b36SAndroid Build Coastguard Worker t.Errorf("Module output does not contain expected jar %s", "test.jar") 2472*333d2b36SAndroid Build Coastguard Worker } 2473*333d2b36SAndroid Build Coastguard Worker} 2474*333d2b36SAndroid Build Coastguard Worker 2475*333d2b36SAndroid Build Coastguard Workerfunc TestHeadersOnly(t *testing.T) { 2476*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 2477*333d2b36SAndroid Build Coastguard Worker java_library { 2478*333d2b36SAndroid Build Coastguard Worker name: "foo", 2479*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2480*333d2b36SAndroid Build Coastguard Worker headers_only: true, 2481*333d2b36SAndroid Build Coastguard Worker } 2482*333d2b36SAndroid Build Coastguard Worker `) 2483*333d2b36SAndroid Build Coastguard Worker 2484*333d2b36SAndroid Build Coastguard Worker turbine := ctx.ModuleForTests("foo", "android_common").Rule("turbine") 2485*333d2b36SAndroid Build Coastguard Worker if len(turbine.Inputs) != 1 || turbine.Inputs[0].String() != "a.java" { 2486*333d2b36SAndroid Build Coastguard Worker t.Errorf(`foo inputs %v != ["a.java"]`, turbine.Inputs) 2487*333d2b36SAndroid Build Coastguard Worker } 2488*333d2b36SAndroid Build Coastguard Worker 2489*333d2b36SAndroid Build Coastguard Worker javac := ctx.ModuleForTests("foo", "android_common").MaybeRule("javac") 2490*333d2b36SAndroid Build Coastguard Worker android.AssertDeepEquals(t, "javac rule", nil, javac.Rule) 2491*333d2b36SAndroid Build Coastguard Worker} 2492*333d2b36SAndroid Build Coastguard Worker 2493*333d2b36SAndroid Build Coastguard Workerfunc TestJavaApiContributionImport(t *testing.T) { 2494*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers( 2495*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 2496*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeEnv( 2497*333d2b36SAndroid Build Coastguard Worker map[string]string{ 2498*333d2b36SAndroid Build Coastguard Worker "DISABLE_STUB_VALIDATION": "true", 2499*333d2b36SAndroid Build Coastguard Worker }, 2500*333d2b36SAndroid Build Coastguard Worker ), 2501*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 2502*333d2b36SAndroid Build Coastguard Worker java_api_library { 2503*333d2b36SAndroid Build Coastguard Worker name: "foo", 2504*333d2b36SAndroid Build Coastguard Worker api_contributions: ["bar"], 2505*333d2b36SAndroid Build Coastguard Worker stubs_type: "everything", 2506*333d2b36SAndroid Build Coastguard Worker } 2507*333d2b36SAndroid Build Coastguard Worker java_api_contribution_import { 2508*333d2b36SAndroid Build Coastguard Worker name: "bar", 2509*333d2b36SAndroid Build Coastguard Worker api_file: "current.txt", 2510*333d2b36SAndroid Build Coastguard Worker api_surface: "public", 2511*333d2b36SAndroid Build Coastguard Worker } 2512*333d2b36SAndroid Build Coastguard Worker `) 2513*333d2b36SAndroid Build Coastguard Worker m := ctx.ModuleForTests("foo", "android_common") 2514*333d2b36SAndroid Build Coastguard Worker manifest := m.Output("metalava.sbox.textproto") 2515*333d2b36SAndroid Build Coastguard Worker sboxProto := android.RuleBuilderSboxProtoForTests(t, ctx.TestContext, manifest) 2516*333d2b36SAndroid Build Coastguard Worker manifestCommand := sboxProto.Commands[0].GetCommand() 2517*333d2b36SAndroid Build Coastguard Worker sourceFilesFlag := "--source-files current.txt" 2518*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "source text files not present", manifestCommand, sourceFilesFlag) 2519*333d2b36SAndroid Build Coastguard Worker} 2520*333d2b36SAndroid Build Coastguard Worker 2521*333d2b36SAndroid Build Coastguard Workerfunc TestJavaApiLibraryApiFilesSorting(t *testing.T) { 2522*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 2523*333d2b36SAndroid Build Coastguard Worker java_api_library { 2524*333d2b36SAndroid Build Coastguard Worker name: "foo", 2525*333d2b36SAndroid Build Coastguard Worker api_contributions: [ 2526*333d2b36SAndroid Build Coastguard Worker "system-server-api-stubs-docs-non-updatable.api.contribution", 2527*333d2b36SAndroid Build Coastguard Worker "test-api-stubs-docs-non-updatable.api.contribution", 2528*333d2b36SAndroid Build Coastguard Worker "system-api-stubs-docs-non-updatable.api.contribution", 2529*333d2b36SAndroid Build Coastguard Worker "module-lib-api-stubs-docs-non-updatable.api.contribution", 2530*333d2b36SAndroid Build Coastguard Worker "api-stubs-docs-non-updatable.api.contribution", 2531*333d2b36SAndroid Build Coastguard Worker ], 2532*333d2b36SAndroid Build Coastguard Worker stubs_type: "everything", 2533*333d2b36SAndroid Build Coastguard Worker } 2534*333d2b36SAndroid Build Coastguard Worker `) 2535*333d2b36SAndroid Build Coastguard Worker m := ctx.ModuleForTests("foo", "android_common") 2536*333d2b36SAndroid Build Coastguard Worker manifest := m.Output("metalava.sbox.textproto") 2537*333d2b36SAndroid Build Coastguard Worker sboxProto := android.RuleBuilderSboxProtoForTests(t, ctx, manifest) 2538*333d2b36SAndroid Build Coastguard Worker manifestCommand := sboxProto.Commands[0].GetCommand() 2539*333d2b36SAndroid Build Coastguard Worker 2540*333d2b36SAndroid Build Coastguard Worker // Api files are sorted from the narrowest api scope to the widest api scope. 2541*333d2b36SAndroid Build Coastguard Worker // test api and module lib api surface do not have subset/superset relationship, 2542*333d2b36SAndroid Build Coastguard Worker // but they will never be passed as inputs at the same time. 2543*333d2b36SAndroid Build Coastguard Worker sourceFilesFlag := "--source-files default/java/api/current.txt " + 2544*333d2b36SAndroid Build Coastguard Worker "default/java/api/system-current.txt default/java/api/test-current.txt " + 2545*333d2b36SAndroid Build Coastguard Worker "default/java/api/module-lib-current.txt default/java/api/system-server-current.txt" 2546*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "source text files not in api scope order", manifestCommand, sourceFilesFlag) 2547*333d2b36SAndroid Build Coastguard Worker} 2548*333d2b36SAndroid Build Coastguard Worker 2549*333d2b36SAndroid Build Coastguard Workerfunc TestSdkLibraryProvidesSystemModulesToApiLibrary(t *testing.T) { 2550*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 2551*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 2552*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaSdkLibraryFiles, 2553*333d2b36SAndroid Build Coastguard Worker FixtureWithLastReleaseApis("foo"), 2554*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs( 2555*333d2b36SAndroid Build Coastguard Worker map[string][]byte{ 2556*333d2b36SAndroid Build Coastguard Worker "A.java": nil, 2557*333d2b36SAndroid Build Coastguard Worker }, 2558*333d2b36SAndroid Build Coastguard Worker ), 2559*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 2560*333d2b36SAndroid Build Coastguard Worker java_library { 2561*333d2b36SAndroid Build Coastguard Worker name: "bar", 2562*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2563*333d2b36SAndroid Build Coastguard Worker } 2564*333d2b36SAndroid Build Coastguard Worker java_system_modules { 2565*333d2b36SAndroid Build Coastguard Worker name: "baz", 2566*333d2b36SAndroid Build Coastguard Worker libs: ["bar"], 2567*333d2b36SAndroid Build Coastguard Worker } 2568*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 2569*333d2b36SAndroid Build Coastguard Worker name: "foo", 2570*333d2b36SAndroid Build Coastguard Worker srcs: ["A.java"], 2571*333d2b36SAndroid Build Coastguard Worker system_modules: "baz", 2572*333d2b36SAndroid Build Coastguard Worker } 2573*333d2b36SAndroid Build Coastguard Worker `) 2574*333d2b36SAndroid Build Coastguard Worker 2575*333d2b36SAndroid Build Coastguard Worker checkBootClasspathForLibWithSystemModule(t, result.TestContext, apiScopePublic.apiLibraryModuleName("foo"), "/bar.jar") 2576*333d2b36SAndroid Build Coastguard Worker} 2577*333d2b36SAndroid Build Coastguard Worker 2578*333d2b36SAndroid Build Coastguard Workerfunc TestApiLibraryDroidstubsDependency(t *testing.T) { 2579*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 2580*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 2581*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaSdkLibraryFiles, 2582*333d2b36SAndroid Build Coastguard Worker FixtureWithLastReleaseApis("foo"), 2583*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs( 2584*333d2b36SAndroid Build Coastguard Worker map[string][]byte{ 2585*333d2b36SAndroid Build Coastguard Worker "A.java": nil, 2586*333d2b36SAndroid Build Coastguard Worker }, 2587*333d2b36SAndroid Build Coastguard Worker ), 2588*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 2589*333d2b36SAndroid Build Coastguard Worker java_api_library { 2590*333d2b36SAndroid Build Coastguard Worker name: "foo", 2591*333d2b36SAndroid Build Coastguard Worker api_contributions: [ 2592*333d2b36SAndroid Build Coastguard Worker "api-stubs-docs-non-updatable.api.contribution", 2593*333d2b36SAndroid Build Coastguard Worker ], 2594*333d2b36SAndroid Build Coastguard Worker enable_validation: true, 2595*333d2b36SAndroid Build Coastguard Worker stubs_type: "everything", 2596*333d2b36SAndroid Build Coastguard Worker } 2597*333d2b36SAndroid Build Coastguard Worker java_api_library { 2598*333d2b36SAndroid Build Coastguard Worker name: "bar", 2599*333d2b36SAndroid Build Coastguard Worker api_contributions: [ 2600*333d2b36SAndroid Build Coastguard Worker "api-stubs-docs-non-updatable.api.contribution", 2601*333d2b36SAndroid Build Coastguard Worker ], 2602*333d2b36SAndroid Build Coastguard Worker enable_validation: false, 2603*333d2b36SAndroid Build Coastguard Worker stubs_type: "everything", 2604*333d2b36SAndroid Build Coastguard Worker } 2605*333d2b36SAndroid Build Coastguard Worker `) 2606*333d2b36SAndroid Build Coastguard Worker 2607*333d2b36SAndroid Build Coastguard Worker currentApiTimestampPath := "api-stubs-docs-non-updatable/android_common/everything/check_current_api.timestamp" 2608*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", "android_common").Module().(*ApiLibrary) 2609*333d2b36SAndroid Build Coastguard Worker fooValidationPathsString := strings.Join(foo.validationPaths.Strings(), " ") 2610*333d2b36SAndroid Build Coastguard Worker bar := result.ModuleForTests("bar", "android_common").Module().(*ApiLibrary) 2611*333d2b36SAndroid Build Coastguard Worker barValidationPathsString := strings.Join(bar.validationPaths.Strings(), " ") 2612*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, 2613*333d2b36SAndroid Build Coastguard Worker "Module expected to have validation", 2614*333d2b36SAndroid Build Coastguard Worker fooValidationPathsString, 2615*333d2b36SAndroid Build Coastguard Worker currentApiTimestampPath, 2616*333d2b36SAndroid Build Coastguard Worker ) 2617*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, 2618*333d2b36SAndroid Build Coastguard Worker "Module expected to not have validation", 2619*333d2b36SAndroid Build Coastguard Worker barValidationPathsString, 2620*333d2b36SAndroid Build Coastguard Worker currentApiTimestampPath, 2621*333d2b36SAndroid Build Coastguard Worker ) 2622*333d2b36SAndroid Build Coastguard Worker} 2623*333d2b36SAndroid Build Coastguard Worker 2624*333d2b36SAndroid Build Coastguard Workerfunc TestDisableFromTextStubForCoverageBuild(t *testing.T) { 2625*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 2626*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 2627*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaSdkLibraryFiles, 2628*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJacocoInstrumentation, 2629*333d2b36SAndroid Build Coastguard Worker FixtureWithLastReleaseApis("foo"), 2630*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyConfig(func(config android.Config) { 2631*333d2b36SAndroid Build Coastguard Worker config.SetBuildFromTextStub(true) 2632*333d2b36SAndroid Build Coastguard Worker }), 2633*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyEnv(func(env map[string]string) { 2634*333d2b36SAndroid Build Coastguard Worker env["EMMA_INSTRUMENT"] = "true" 2635*333d2b36SAndroid Build Coastguard Worker }), 2636*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 2637*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 2638*333d2b36SAndroid Build Coastguard Worker name: "foo", 2639*333d2b36SAndroid Build Coastguard Worker srcs: ["A.java"], 2640*333d2b36SAndroid Build Coastguard Worker } 2641*333d2b36SAndroid Build Coastguard Worker `) 2642*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, "stub module expected to depend on from-source stub", 2643*333d2b36SAndroid Build Coastguard Worker true, CheckModuleHasDependency(t, result.TestContext, 2644*333d2b36SAndroid Build Coastguard Worker apiScopePublic.stubsLibraryModuleName("foo"), "android_common", 2645*333d2b36SAndroid Build Coastguard Worker apiScopePublic.sourceStubsLibraryModuleName("foo"))) 2646*333d2b36SAndroid Build Coastguard Worker 2647*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, "stub module expected to not depend on from-text stub", 2648*333d2b36SAndroid Build Coastguard Worker false, CheckModuleHasDependency(t, result.TestContext, 2649*333d2b36SAndroid Build Coastguard Worker apiScopePublic.stubsLibraryModuleName("foo"), "android_common", 2650*333d2b36SAndroid Build Coastguard Worker apiScopePublic.apiLibraryModuleName("foo"))) 2651*333d2b36SAndroid Build Coastguard Worker} 2652*333d2b36SAndroid Build Coastguard Worker 2653*333d2b36SAndroid Build Coastguard Workerfunc TestMultiplePrebuilts(t *testing.T) { 2654*333d2b36SAndroid Build Coastguard Worker bp := ` 2655*333d2b36SAndroid Build Coastguard Worker // an rdep 2656*333d2b36SAndroid Build Coastguard Worker java_library { 2657*333d2b36SAndroid Build Coastguard Worker name: "foo", 2658*333d2b36SAndroid Build Coastguard Worker libs: ["bar"], 2659*333d2b36SAndroid Build Coastguard Worker } 2660*333d2b36SAndroid Build Coastguard Worker 2661*333d2b36SAndroid Build Coastguard Worker // multiple variations of dep 2662*333d2b36SAndroid Build Coastguard Worker // source 2663*333d2b36SAndroid Build Coastguard Worker java_library { 2664*333d2b36SAndroid Build Coastguard Worker name: "bar", 2665*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.java"], 2666*333d2b36SAndroid Build Coastguard Worker } 2667*333d2b36SAndroid Build Coastguard Worker // prebuilt "v1" 2668*333d2b36SAndroid Build Coastguard Worker java_import { 2669*333d2b36SAndroid Build Coastguard Worker name: "bar", 2670*333d2b36SAndroid Build Coastguard Worker jars: ["bar.jar"], 2671*333d2b36SAndroid Build Coastguard Worker } 2672*333d2b36SAndroid Build Coastguard Worker // prebuilt "v2" 2673*333d2b36SAndroid Build Coastguard Worker java_import { 2674*333d2b36SAndroid Build Coastguard Worker name: "bar.v2", 2675*333d2b36SAndroid Build Coastguard Worker source_module_name: "bar", 2676*333d2b36SAndroid Build Coastguard Worker jars: ["bar.v1.jar"], 2677*333d2b36SAndroid Build Coastguard Worker } 2678*333d2b36SAndroid Build Coastguard Worker 2679*333d2b36SAndroid Build Coastguard Worker // selectors 2680*333d2b36SAndroid Build Coastguard Worker apex_contributions { 2681*333d2b36SAndroid Build Coastguard Worker name: "myapex_contributions", 2682*333d2b36SAndroid Build Coastguard Worker contents: ["%v"], 2683*333d2b36SAndroid Build Coastguard Worker } 2684*333d2b36SAndroid Build Coastguard Worker ` 2685*333d2b36SAndroid Build Coastguard Worker hasDep := func(ctx *android.TestResult, m android.Module, wantDep android.Module) bool { 2686*333d2b36SAndroid Build Coastguard Worker t.Helper() 2687*333d2b36SAndroid Build Coastguard Worker var found bool 2688*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDeps(m, func(dep blueprint.Module) { 2689*333d2b36SAndroid Build Coastguard Worker if dep == wantDep { 2690*333d2b36SAndroid Build Coastguard Worker found = true 2691*333d2b36SAndroid Build Coastguard Worker } 2692*333d2b36SAndroid Build Coastguard Worker }) 2693*333d2b36SAndroid Build Coastguard Worker return found 2694*333d2b36SAndroid Build Coastguard Worker } 2695*333d2b36SAndroid Build Coastguard Worker 2696*333d2b36SAndroid Build Coastguard Worker hasFileWithStem := func(m android.TestingModule, stem string) bool { 2697*333d2b36SAndroid Build Coastguard Worker t.Helper() 2698*333d2b36SAndroid Build Coastguard Worker for _, o := range m.AllOutputs() { 2699*333d2b36SAndroid Build Coastguard Worker _, file := filepath.Split(o) 2700*333d2b36SAndroid Build Coastguard Worker if file == stem+".jar" { 2701*333d2b36SAndroid Build Coastguard Worker return true 2702*333d2b36SAndroid Build Coastguard Worker } 2703*333d2b36SAndroid Build Coastguard Worker } 2704*333d2b36SAndroid Build Coastguard Worker return false 2705*333d2b36SAndroid Build Coastguard Worker } 2706*333d2b36SAndroid Build Coastguard Worker 2707*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 2708*333d2b36SAndroid Build Coastguard Worker desc string 2709*333d2b36SAndroid Build Coastguard Worker selectedDependencyName string 2710*333d2b36SAndroid Build Coastguard Worker expectedDependencyName string 2711*333d2b36SAndroid Build Coastguard Worker }{ 2712*333d2b36SAndroid Build Coastguard Worker { 2713*333d2b36SAndroid Build Coastguard Worker desc: "Source library is selected using apex_contributions", 2714*333d2b36SAndroid Build Coastguard Worker selectedDependencyName: "bar", 2715*333d2b36SAndroid Build Coastguard Worker expectedDependencyName: "bar", 2716*333d2b36SAndroid Build Coastguard Worker }, 2717*333d2b36SAndroid Build Coastguard Worker { 2718*333d2b36SAndroid Build Coastguard Worker desc: "Prebuilt library v1 is selected using apex_contributions", 2719*333d2b36SAndroid Build Coastguard Worker selectedDependencyName: "prebuilt_bar", 2720*333d2b36SAndroid Build Coastguard Worker expectedDependencyName: "prebuilt_bar", 2721*333d2b36SAndroid Build Coastguard Worker }, 2722*333d2b36SAndroid Build Coastguard Worker { 2723*333d2b36SAndroid Build Coastguard Worker desc: "Prebuilt library v2 is selected using apex_contributions", 2724*333d2b36SAndroid Build Coastguard Worker selectedDependencyName: "prebuilt_bar.v2", 2725*333d2b36SAndroid Build Coastguard Worker expectedDependencyName: "prebuilt_bar.v2", 2726*333d2b36SAndroid Build Coastguard Worker }, 2727*333d2b36SAndroid Build Coastguard Worker } 2728*333d2b36SAndroid Build Coastguard Worker 2729*333d2b36SAndroid Build Coastguard Worker for _, tc := range testCases { 2730*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers( 2731*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 2732*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", "myapex_contributions"), 2733*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, fmt.Sprintf(bp, tc.selectedDependencyName)) 2734*333d2b36SAndroid Build Coastguard Worker 2735*333d2b36SAndroid Build Coastguard Worker // check that rdep gets the correct variation of dep 2736*333d2b36SAndroid Build Coastguard Worker foo := ctx.ModuleForTests("foo", "android_common") 2737*333d2b36SAndroid Build Coastguard Worker expectedDependency := ctx.ModuleForTests(tc.expectedDependencyName, "android_common") 2738*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, fmt.Sprintf("expected dependency from %s to %s\n", foo.Module().Name(), tc.expectedDependencyName), true, hasDep(ctx, foo.Module(), expectedDependency.Module())) 2739*333d2b36SAndroid Build Coastguard Worker 2740*333d2b36SAndroid Build Coastguard Worker // check that output file of dep is always bar.jar 2741*333d2b36SAndroid Build Coastguard Worker // The filename should be agnostic to source/prebuilt/prebuilt_version 2742*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, fmt.Sprintf("could not find bar.jar in outputs of %s. All Outputs %v\n", tc.expectedDependencyName, expectedDependency.AllOutputs()), true, hasFileWithStem(expectedDependency, "bar")) 2743*333d2b36SAndroid Build Coastguard Worker 2744*333d2b36SAndroid Build Coastguard Worker // check LOCAL_MODULE of the selected module name 2745*333d2b36SAndroid Build Coastguard Worker // the prebuilt should have the same LOCAL_MODULE when exported to make 2746*333d2b36SAndroid Build Coastguard Worker entries := android.AndroidMkEntriesForTest(t, ctx.TestContext, expectedDependency.Module())[0] 2747*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "unexpected LOCAL_MODULE", "bar", entries.EntryMap["LOCAL_MODULE"][0]) 2748*333d2b36SAndroid Build Coastguard Worker } 2749*333d2b36SAndroid Build Coastguard Worker} 2750*333d2b36SAndroid Build Coastguard Worker 2751*333d2b36SAndroid Build Coastguard Workerfunc TestMultiplePlatformCompatConfigPrebuilts(t *testing.T) { 2752*333d2b36SAndroid Build Coastguard Worker bp := ` 2753*333d2b36SAndroid Build Coastguard Worker // multiple variations of platform_compat_config 2754*333d2b36SAndroid Build Coastguard Worker // source 2755*333d2b36SAndroid Build Coastguard Worker platform_compat_config { 2756*333d2b36SAndroid Build Coastguard Worker name: "myconfig", 2757*333d2b36SAndroid Build Coastguard Worker } 2758*333d2b36SAndroid Build Coastguard Worker // prebuilt "v1" 2759*333d2b36SAndroid Build Coastguard Worker prebuilt_platform_compat_config { 2760*333d2b36SAndroid Build Coastguard Worker name: "myconfig", 2761*333d2b36SAndroid Build Coastguard Worker metadata: "myconfig.xml", 2762*333d2b36SAndroid Build Coastguard Worker } 2763*333d2b36SAndroid Build Coastguard Worker // prebuilt "v2" 2764*333d2b36SAndroid Build Coastguard Worker prebuilt_platform_compat_config { 2765*333d2b36SAndroid Build Coastguard Worker name: "myconfig.v2", 2766*333d2b36SAndroid Build Coastguard Worker source_module_name: "myconfig", // without source_module_name, the singleton will merge two .xml files 2767*333d2b36SAndroid Build Coastguard Worker metadata: "myconfig.v2.xml", 2768*333d2b36SAndroid Build Coastguard Worker } 2769*333d2b36SAndroid Build Coastguard Worker 2770*333d2b36SAndroid Build Coastguard Worker // selectors 2771*333d2b36SAndroid Build Coastguard Worker apex_contributions { 2772*333d2b36SAndroid Build Coastguard Worker name: "myapex_contributions", 2773*333d2b36SAndroid Build Coastguard Worker contents: ["%v"], 2774*333d2b36SAndroid Build Coastguard Worker } 2775*333d2b36SAndroid Build Coastguard Worker ` 2776*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 2777*333d2b36SAndroid Build Coastguard Worker desc string 2778*333d2b36SAndroid Build Coastguard Worker selectedDependencyName string 2779*333d2b36SAndroid Build Coastguard Worker expectedPlatformCompatConfigXml string 2780*333d2b36SAndroid Build Coastguard Worker }{ 2781*333d2b36SAndroid Build Coastguard Worker { 2782*333d2b36SAndroid Build Coastguard Worker desc: "Source platform_compat_config is selected using apex_contributions", 2783*333d2b36SAndroid Build Coastguard Worker selectedDependencyName: "myconfig", 2784*333d2b36SAndroid Build Coastguard Worker expectedPlatformCompatConfigXml: "out/soong/.intermediates/myconfig/android_common/myconfig_meta.xml", 2785*333d2b36SAndroid Build Coastguard Worker }, 2786*333d2b36SAndroid Build Coastguard Worker { 2787*333d2b36SAndroid Build Coastguard Worker desc: "Prebuilt platform_compat_config v1 is selected using apex_contributions", 2788*333d2b36SAndroid Build Coastguard Worker selectedDependencyName: "prebuilt_myconfig", 2789*333d2b36SAndroid Build Coastguard Worker expectedPlatformCompatConfigXml: "myconfig.xml", 2790*333d2b36SAndroid Build Coastguard Worker }, 2791*333d2b36SAndroid Build Coastguard Worker { 2792*333d2b36SAndroid Build Coastguard Worker desc: "Prebuilt platform_compat_config v2 is selected using apex_contributions", 2793*333d2b36SAndroid Build Coastguard Worker selectedDependencyName: "prebuilt_myconfig.v2", 2794*333d2b36SAndroid Build Coastguard Worker expectedPlatformCompatConfigXml: "myconfig.v2.xml", 2795*333d2b36SAndroid Build Coastguard Worker }, 2796*333d2b36SAndroid Build Coastguard Worker } 2797*333d2b36SAndroid Build Coastguard Worker 2798*333d2b36SAndroid Build Coastguard Worker for _, tc := range testCases { 2799*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers( 2800*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 2801*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithPlatformCompatConfig, 2802*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", "myapex_contributions"), 2803*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, fmt.Sprintf(bp, tc.selectedDependencyName)) 2804*333d2b36SAndroid Build Coastguard Worker 2805*333d2b36SAndroid Build Coastguard Worker mergedGlobalConfig := ctx.SingletonForTests("platform_compat_config_singleton").Output("compat_config/merged_compat_config.xml") 2806*333d2b36SAndroid Build Coastguard Worker android.AssertIntEquals(t, "The merged compat config file should only have a single dependency", 1, len(mergedGlobalConfig.Implicits)) 2807*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "The merged compat config file is missing the appropriate platform compat config", mergedGlobalConfig.Implicits[0].String(), tc.expectedPlatformCompatConfigXml) 2808*333d2b36SAndroid Build Coastguard Worker } 2809*333d2b36SAndroid Build Coastguard Worker} 2810*333d2b36SAndroid Build Coastguard Worker 2811*333d2b36SAndroid Build Coastguard Workerfunc TestApiLibraryAconfigDeclarations(t *testing.T) { 2812*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 2813*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 2814*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 2815*333d2b36SAndroid Build Coastguard Worker }), 2816*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs(map[string][]byte{ 2817*333d2b36SAndroid Build Coastguard Worker "a/A.java": nil, 2818*333d2b36SAndroid Build Coastguard Worker "a/current.txt": nil, 2819*333d2b36SAndroid Build Coastguard Worker "a/removed.txt": nil, 2820*333d2b36SAndroid Build Coastguard Worker }), 2821*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 2822*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 2823*333d2b36SAndroid Build Coastguard Worker name: "bar", 2824*333d2b36SAndroid Build Coastguard Worker package: "com.example.package", 2825*333d2b36SAndroid Build Coastguard Worker container: "com.android.foo", 2826*333d2b36SAndroid Build Coastguard Worker srcs: [ 2827*333d2b36SAndroid Build Coastguard Worker "bar.aconfig", 2828*333d2b36SAndroid Build Coastguard Worker ], 2829*333d2b36SAndroid Build Coastguard Worker } 2830*333d2b36SAndroid Build Coastguard Worker java_api_contribution { 2831*333d2b36SAndroid Build Coastguard Worker name: "baz", 2832*333d2b36SAndroid Build Coastguard Worker api_file: "a/current.txt", 2833*333d2b36SAndroid Build Coastguard Worker api_surface: "public", 2834*333d2b36SAndroid Build Coastguard Worker } 2835*333d2b36SAndroid Build Coastguard Worker java_api_library { 2836*333d2b36SAndroid Build Coastguard Worker name: "foo", 2837*333d2b36SAndroid Build Coastguard Worker api_surface: "public", 2838*333d2b36SAndroid Build Coastguard Worker api_contributions: [ 2839*333d2b36SAndroid Build Coastguard Worker "baz", 2840*333d2b36SAndroid Build Coastguard Worker ], 2841*333d2b36SAndroid Build Coastguard Worker aconfig_declarations: [ 2842*333d2b36SAndroid Build Coastguard Worker "bar", 2843*333d2b36SAndroid Build Coastguard Worker ], 2844*333d2b36SAndroid Build Coastguard Worker stubs_type: "exportable", 2845*333d2b36SAndroid Build Coastguard Worker enable_validation: false, 2846*333d2b36SAndroid Build Coastguard Worker } 2847*333d2b36SAndroid Build Coastguard Worker `) 2848*333d2b36SAndroid Build Coastguard Worker 2849*333d2b36SAndroid Build Coastguard Worker // Check if java_api_library depends on aconfig_declarations 2850*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, "foo expected to depend on bar", 2851*333d2b36SAndroid Build Coastguard Worker CheckModuleHasDependency(t, result.TestContext, "foo", "android_common", "bar"), true) 2852*333d2b36SAndroid Build Coastguard Worker 2853*333d2b36SAndroid Build Coastguard Worker m := result.ModuleForTests("foo", "android_common") 2854*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "foo generates revert annotations file", 2855*333d2b36SAndroid Build Coastguard Worker strings.Join(m.AllOutputs(), ""), "revert-annotations-exportable.txt") 2856*333d2b36SAndroid Build Coastguard Worker 2857*333d2b36SAndroid Build Coastguard Worker // revert-annotations.txt passed to exportable stubs generation metalava command 2858*333d2b36SAndroid Build Coastguard Worker manifest := m.Output("metalava.sbox.textproto") 2859*333d2b36SAndroid Build Coastguard Worker cmdline := String(android.RuleBuilderSboxProtoForTests(t, result.TestContext, manifest).Commands[0].Command) 2860*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "flagged api hide command not included", cmdline, "revert-annotations-exportable.txt") 2861*333d2b36SAndroid Build Coastguard Worker} 2862*333d2b36SAndroid Build Coastguard Worker 2863*333d2b36SAndroid Build Coastguard Workerfunc TestTestOnly(t *testing.T) { 2864*333d2b36SAndroid Build Coastguard Worker t.Parallel() 2865*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers( 2866*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 2867*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 2868*333d2b36SAndroid Build Coastguard Worker // These should be test-only 2869*333d2b36SAndroid Build Coastguard Worker java_library { 2870*333d2b36SAndroid Build Coastguard Worker name: "lib1-test-only", 2871*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2872*333d2b36SAndroid Build Coastguard Worker test_only: true, 2873*333d2b36SAndroid Build Coastguard Worker } 2874*333d2b36SAndroid Build Coastguard Worker java_test { 2875*333d2b36SAndroid Build Coastguard Worker name: "java-test", 2876*333d2b36SAndroid Build Coastguard Worker } 2877*333d2b36SAndroid Build Coastguard Worker java_test_host { 2878*333d2b36SAndroid Build Coastguard Worker name: "java-test-host", 2879*333d2b36SAndroid Build Coastguard Worker } 2880*333d2b36SAndroid Build Coastguard Worker java_test_helper_library { 2881*333d2b36SAndroid Build Coastguard Worker name: "helper-library", 2882*333d2b36SAndroid Build Coastguard Worker } 2883*333d2b36SAndroid Build Coastguard Worker java_binary { 2884*333d2b36SAndroid Build Coastguard Worker name: "java-data-binary", 2885*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 2886*333d2b36SAndroid Build Coastguard Worker main_class: "foo.bar.jb", 2887*333d2b36SAndroid Build Coastguard Worker test_only: true, 2888*333d2b36SAndroid Build Coastguard Worker } 2889*333d2b36SAndroid Build Coastguard Worker 2890*333d2b36SAndroid Build Coastguard Worker // These are NOT 2891*333d2b36SAndroid Build Coastguard Worker java_library { 2892*333d2b36SAndroid Build Coastguard Worker name: "lib2-app", 2893*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 2894*333d2b36SAndroid Build Coastguard Worker } 2895*333d2b36SAndroid Build Coastguard Worker java_import { 2896*333d2b36SAndroid Build Coastguard Worker name: "bar", 2897*333d2b36SAndroid Build Coastguard Worker jars: ["bar.jar"], 2898*333d2b36SAndroid Build Coastguard Worker } 2899*333d2b36SAndroid Build Coastguard Worker java_binary { 2900*333d2b36SAndroid Build Coastguard Worker name: "java-binary", 2901*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 2902*333d2b36SAndroid Build Coastguard Worker main_class: "foo.bar.jb", 2903*333d2b36SAndroid Build Coastguard Worker } 2904*333d2b36SAndroid Build Coastguard Worker `) 2905*333d2b36SAndroid Build Coastguard Worker 2906*333d2b36SAndroid Build Coastguard Worker expectedTestOnlyModules := []string{ 2907*333d2b36SAndroid Build Coastguard Worker "lib1-test-only", 2908*333d2b36SAndroid Build Coastguard Worker "java-test", 2909*333d2b36SAndroid Build Coastguard Worker "java-test-host", 2910*333d2b36SAndroid Build Coastguard Worker "helper-library", 2911*333d2b36SAndroid Build Coastguard Worker "java-data-binary", 2912*333d2b36SAndroid Build Coastguard Worker } 2913*333d2b36SAndroid Build Coastguard Worker expectedTopLevelTests := []string{ 2914*333d2b36SAndroid Build Coastguard Worker "java-test", 2915*333d2b36SAndroid Build Coastguard Worker "java-test-host", 2916*333d2b36SAndroid Build Coastguard Worker } 2917*333d2b36SAndroid Build Coastguard Worker assertTestOnlyAndTopLevel(t, ctx, expectedTestOnlyModules, expectedTopLevelTests) 2918*333d2b36SAndroid Build Coastguard Worker} 2919*333d2b36SAndroid Build Coastguard Worker 2920*333d2b36SAndroid Build Coastguard Worker// Don't allow setting test-only on things that are always tests or never tests. 2921*333d2b36SAndroid Build Coastguard Workerfunc TestInvalidTestOnlyTargets(t *testing.T) { 2922*333d2b36SAndroid Build Coastguard Worker testCases := []string{ 2923*333d2b36SAndroid Build Coastguard Worker ` java_test { name: "java-test", test_only: true, srcs: ["foo.java"], } `, 2924*333d2b36SAndroid Build Coastguard Worker ` java_test_host { name: "java-test-host", test_only: true, srcs: ["foo.java"], } `, 2925*333d2b36SAndroid Build Coastguard Worker ` java_test_import { name: "java-test-import", test_only: true, } `, 2926*333d2b36SAndroid Build Coastguard Worker ` java_api_library { name: "java-api-library", test_only: true, } `, 2927*333d2b36SAndroid Build Coastguard Worker ` java_test_helper_library { name: "test-help-lib", test_only: true, } `, 2928*333d2b36SAndroid Build Coastguard Worker ` java_defaults { name: "java-defaults", test_only: true, } `, 2929*333d2b36SAndroid Build Coastguard Worker } 2930*333d2b36SAndroid Build Coastguard Worker 2931*333d2b36SAndroid Build Coastguard Worker for i, bp := range testCases { 2932*333d2b36SAndroid Build Coastguard Worker android.GroupFixturePreparers(prepareForJavaTest). 2933*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler( 2934*333d2b36SAndroid Build Coastguard Worker expectOneError("unrecognized property \"test_only\"", 2935*333d2b36SAndroid Build Coastguard Worker fmt.Sprintf("testcase: %d", i))). 2936*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, bp) 2937*333d2b36SAndroid Build Coastguard Worker } 2938*333d2b36SAndroid Build Coastguard Worker} 2939*333d2b36SAndroid Build Coastguard Worker 2940*333d2b36SAndroid Build Coastguard Worker// Expect exactly one that matches 'expected'. 2941*333d2b36SAndroid Build Coastguard Worker// Append 'msg' to the Errorf that printed. 2942*333d2b36SAndroid Build Coastguard Workerfunc expectOneError(expected string, msg string) android.FixtureErrorHandler { 2943*333d2b36SAndroid Build Coastguard Worker return android.FixtureCustomErrorHandler(func(t *testing.T, result *android.TestResult) { 2944*333d2b36SAndroid Build Coastguard Worker t.Helper() 2945*333d2b36SAndroid Build Coastguard Worker if len(result.Errs) != 1 { 2946*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected exactly one error, but found: %d when setting test_only on: %s", len(result.Errs), msg) 2947*333d2b36SAndroid Build Coastguard Worker return 2948*333d2b36SAndroid Build Coastguard Worker } 2949*333d2b36SAndroid Build Coastguard Worker actualErrMsg := result.Errs[0].Error() 2950*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(actualErrMsg, expected) { 2951*333d2b36SAndroid Build Coastguard Worker t.Errorf("Different error than expected. Received: [%v] on %s expected: %s", actualErrMsg, msg, expected) 2952*333d2b36SAndroid Build Coastguard Worker } 2953*333d2b36SAndroid Build Coastguard Worker }) 2954*333d2b36SAndroid Build Coastguard Worker} 2955*333d2b36SAndroid Build Coastguard Worker 2956*333d2b36SAndroid Build Coastguard Workerfunc TestJavaLibHostWithStem(t *testing.T) { 2957*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 2958*333d2b36SAndroid Build Coastguard Worker java_library_host { 2959*333d2b36SAndroid Build Coastguard Worker name: "foo", 2960*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2961*333d2b36SAndroid Build Coastguard Worker stem: "foo-new", 2962*333d2b36SAndroid Build Coastguard Worker } 2963*333d2b36SAndroid Build Coastguard Worker `) 2964*333d2b36SAndroid Build Coastguard Worker 2965*333d2b36SAndroid Build Coastguard Worker buildOS := ctx.Config().BuildOS.String() 2966*333d2b36SAndroid Build Coastguard Worker foo := ctx.ModuleForTests("foo", buildOS+"_common") 2967*333d2b36SAndroid Build Coastguard Worker 2968*333d2b36SAndroid Build Coastguard Worker outputs := fmt.Sprint(foo.AllOutputs()) 2969*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(outputs, "foo-new.jar") { 2970*333d2b36SAndroid Build Coastguard Worker t.Errorf("Module output does not contain expected jar %s", "foo-new.jar") 2971*333d2b36SAndroid Build Coastguard Worker } 2972*333d2b36SAndroid Build Coastguard Worker} 2973*333d2b36SAndroid Build Coastguard Worker 2974*333d2b36SAndroid Build Coastguard Workerfunc TestJavaLibWithStem(t *testing.T) { 2975*333d2b36SAndroid Build Coastguard Worker ctx, _ := testJava(t, ` 2976*333d2b36SAndroid Build Coastguard Worker java_library { 2977*333d2b36SAndroid Build Coastguard Worker name: "foo", 2978*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2979*333d2b36SAndroid Build Coastguard Worker stem: "foo-new", 2980*333d2b36SAndroid Build Coastguard Worker } 2981*333d2b36SAndroid Build Coastguard Worker `) 2982*333d2b36SAndroid Build Coastguard Worker 2983*333d2b36SAndroid Build Coastguard Worker foo := ctx.ModuleForTests("foo", "android_common") 2984*333d2b36SAndroid Build Coastguard Worker 2985*333d2b36SAndroid Build Coastguard Worker outputs := fmt.Sprint(foo.AllOutputs()) 2986*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(outputs, "foo-new.jar") { 2987*333d2b36SAndroid Build Coastguard Worker t.Errorf("Module output does not contain expected jar %s", "foo-new.jar") 2988*333d2b36SAndroid Build Coastguard Worker } 2989*333d2b36SAndroid Build Coastguard Worker} 2990*333d2b36SAndroid Build Coastguard Worker 2991*333d2b36SAndroid Build Coastguard Workerfunc TestJavaLibraryOutputFilesRel(t *testing.T) { 2992*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 2993*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 2994*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 2995*333d2b36SAndroid Build Coastguard Worker java_library { 2996*333d2b36SAndroid Build Coastguard Worker name: "foo", 2997*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 2998*333d2b36SAndroid Build Coastguard Worker } 2999*333d2b36SAndroid Build Coastguard Worker 3000*333d2b36SAndroid Build Coastguard Worker java_import { 3001*333d2b36SAndroid Build Coastguard Worker name: "bar", 3002*333d2b36SAndroid Build Coastguard Worker jars: ["bar.aar"], 3003*333d2b36SAndroid Build Coastguard Worker 3004*333d2b36SAndroid Build Coastguard Worker } 3005*333d2b36SAndroid Build Coastguard Worker 3006*333d2b36SAndroid Build Coastguard Worker java_import { 3007*333d2b36SAndroid Build Coastguard Worker name: "baz", 3008*333d2b36SAndroid Build Coastguard Worker jars: ["baz.aar"], 3009*333d2b36SAndroid Build Coastguard Worker static_libs: ["bar"], 3010*333d2b36SAndroid Build Coastguard Worker } 3011*333d2b36SAndroid Build Coastguard Worker `) 3012*333d2b36SAndroid Build Coastguard Worker 3013*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", "android_common") 3014*333d2b36SAndroid Build Coastguard Worker bar := result.ModuleForTests("bar", "android_common") 3015*333d2b36SAndroid Build Coastguard Worker baz := result.ModuleForTests("baz", "android_common") 3016*333d2b36SAndroid Build Coastguard Worker 3017*333d2b36SAndroid Build Coastguard Worker fooOutputPaths := foo.OutputFiles(result.TestContext, t, "") 3018*333d2b36SAndroid Build Coastguard Worker barOutputPaths := bar.OutputFiles(result.TestContext, t, "") 3019*333d2b36SAndroid Build Coastguard Worker bazOutputPaths := baz.OutputFiles(result.TestContext, t, "") 3020*333d2b36SAndroid Build Coastguard Worker 3021*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "foo output path", 3022*333d2b36SAndroid Build Coastguard Worker []string{"out/soong/.intermediates/foo/android_common/javac/foo.jar"}, fooOutputPaths) 3023*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "bar output path", 3024*333d2b36SAndroid Build Coastguard Worker []string{"out/soong/.intermediates/bar/android_common/combined/bar.jar"}, barOutputPaths) 3025*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "baz output path", 3026*333d2b36SAndroid Build Coastguard Worker []string{"out/soong/.intermediates/baz/android_common/combined/baz.jar"}, bazOutputPaths) 3027*333d2b36SAndroid Build Coastguard Worker 3028*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "foo relative output path", 3029*333d2b36SAndroid Build Coastguard Worker "foo.jar", fooOutputPaths[0].Rel()) 3030*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "bar relative output path", 3031*333d2b36SAndroid Build Coastguard Worker "bar.jar", barOutputPaths[0].Rel()) 3032*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "baz relative output path", 3033*333d2b36SAndroid Build Coastguard Worker "baz.jar", bazOutputPaths[0].Rel()) 3034*333d2b36SAndroid Build Coastguard Worker} 3035*333d2b36SAndroid Build Coastguard Worker 3036*333d2b36SAndroid Build Coastguard Workerfunc TestCoverage(t *testing.T) { 3037*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 3038*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 3039*333d2b36SAndroid Build Coastguard Worker prepareForTestWithFrameworkJacocoInstrumentation, 3040*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithTransitiveClasspathEnabled, 3041*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 3042*333d2b36SAndroid Build Coastguard Worker android_app { 3043*333d2b36SAndroid Build Coastguard Worker name: "foo", 3044*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 3045*333d2b36SAndroid Build Coastguard Worker static_libs: ["android.car"], 3046*333d2b36SAndroid Build Coastguard Worker platform_apis: true, 3047*333d2b36SAndroid Build Coastguard Worker } 3048*333d2b36SAndroid Build Coastguard Worker 3049*333d2b36SAndroid Build Coastguard Worker // A library in InstrumentFrameworkModules 3050*333d2b36SAndroid Build Coastguard Worker java_library { 3051*333d2b36SAndroid Build Coastguard Worker name: "android.car", 3052*333d2b36SAndroid Build Coastguard Worker srcs: ["android.car.java"], 3053*333d2b36SAndroid Build Coastguard Worker installable: true, 3054*333d2b36SAndroid Build Coastguard Worker } 3055*333d2b36SAndroid Build Coastguard Worker `) 3056*333d2b36SAndroid Build Coastguard Worker 3057*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", "android_common") 3058*333d2b36SAndroid Build Coastguard Worker androidCar := result.ModuleForTests("android.car", "android_common") 3059*333d2b36SAndroid Build Coastguard Worker 3060*333d2b36SAndroid Build Coastguard Worker fooJacoco := foo.Rule("jacoco") 3061*333d2b36SAndroid Build Coastguard Worker fooCombine := foo.Description("for javac") 3062*333d2b36SAndroid Build Coastguard Worker 3063*333d2b36SAndroid Build Coastguard Worker androidCarJacoco := androidCar.Rule("jacoco") 3064*333d2b36SAndroid Build Coastguard Worker androidCarJavac := androidCar.Rule("javac") 3065*333d2b36SAndroid Build Coastguard Worker 3066*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "foo instrumentation rule inputs", fooJacoco.Input.String(), fooCombine.Output.String()) 3067*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "android.car instrumentation rule inputs", androidCarJacoco.Input.String(), androidCarJavac.Output.String()) 3068*333d2b36SAndroid Build Coastguard Worker 3069*333d2b36SAndroid Build Coastguard Worker // The input to instrumentation for the `foo` app contains the non-instrumented android.car classes. 3070*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "foo combined inputs", fooCombine.Inputs.Strings(), androidCarJavac.Output.String()) 3071*333d2b36SAndroid Build Coastguard Worker android.AssertStringListDoesNotContain(t, "foo combined inputs", fooCombine.Inputs.Strings(), androidCarJacoco.Output.String()) 3072*333d2b36SAndroid Build Coastguard Worker} 3073*333d2b36SAndroid Build Coastguard Worker 3074*333d2b36SAndroid Build Coastguard Workerfunc assertTestOnlyAndTopLevel(t *testing.T, ctx *android.TestResult, expectedTestOnly []string, expectedTopLevel []string) { 3075*333d2b36SAndroid Build Coastguard Worker t.Helper() 3076*333d2b36SAndroid Build Coastguard Worker actualTrueModules := []string{} 3077*333d2b36SAndroid Build Coastguard Worker actualTopLevelTests := []string{} 3078*333d2b36SAndroid Build Coastguard Worker addActuals := func(m blueprint.Module, key blueprint.ProviderKey[android.TestModuleInformation]) { 3079*333d2b36SAndroid Build Coastguard Worker if provider, ok := android.OtherModuleProvider(ctx.TestContext.OtherModuleProviderAdaptor(), m, key); ok { 3080*333d2b36SAndroid Build Coastguard Worker if provider.TestOnly { 3081*333d2b36SAndroid Build Coastguard Worker actualTrueModules = append(actualTrueModules, m.Name()) 3082*333d2b36SAndroid Build Coastguard Worker } 3083*333d2b36SAndroid Build Coastguard Worker if provider.TopLevelTarget { 3084*333d2b36SAndroid Build Coastguard Worker actualTopLevelTests = append(actualTopLevelTests, m.Name()) 3085*333d2b36SAndroid Build Coastguard Worker } 3086*333d2b36SAndroid Build Coastguard Worker } 3087*333d2b36SAndroid Build Coastguard Worker } 3088*333d2b36SAndroid Build Coastguard Worker 3089*333d2b36SAndroid Build Coastguard Worker ctx.VisitAllModules(func(m blueprint.Module) { 3090*333d2b36SAndroid Build Coastguard Worker addActuals(m, android.TestOnlyProviderKey) 3091*333d2b36SAndroid Build Coastguard Worker 3092*333d2b36SAndroid Build Coastguard Worker }) 3093*333d2b36SAndroid Build Coastguard Worker 3094*333d2b36SAndroid Build Coastguard Worker notEqual, left, right := android.ListSetDifference(expectedTestOnly, actualTrueModules) 3095*333d2b36SAndroid Build Coastguard Worker if notEqual { 3096*333d2b36SAndroid Build Coastguard Worker t.Errorf("test-only: Expected but not found: %v, Found but not expected: %v", left, right) 3097*333d2b36SAndroid Build Coastguard Worker } 3098*333d2b36SAndroid Build Coastguard Worker 3099*333d2b36SAndroid Build Coastguard Worker notEqual, left, right = android.ListSetDifference(expectedTopLevel, actualTopLevelTests) 3100*333d2b36SAndroid Build Coastguard Worker if notEqual { 3101*333d2b36SAndroid Build Coastguard Worker t.Errorf("top-level: Expected but not found: %v, Found but not expected: %v", left, right) 3102*333d2b36SAndroid Build Coastguard Worker } 3103*333d2b36SAndroid Build Coastguard Worker} 3104*333d2b36SAndroid Build Coastguard Worker 3105*333d2b36SAndroid Build Coastguard Worker// Test that a dependency edge is created to the matching variant of a native library listed in `jni_libs` of java_binary 3106*333d2b36SAndroid Build Coastguard Workerfunc TestNativeRequiredDepOfJavaBinary(t *testing.T) { 3107*333d2b36SAndroid Build Coastguard Worker findDepsOfModule := func(ctx *android.TestContext, module android.Module, depName string) []blueprint.Module { 3108*333d2b36SAndroid Build Coastguard Worker var ret []blueprint.Module 3109*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDeps(module, func(dep blueprint.Module) { 3110*333d2b36SAndroid Build Coastguard Worker if dep.Name() == depName { 3111*333d2b36SAndroid Build Coastguard Worker ret = append(ret, dep) 3112*333d2b36SAndroid Build Coastguard Worker } 3113*333d2b36SAndroid Build Coastguard Worker }) 3114*333d2b36SAndroid Build Coastguard Worker return ret 3115*333d2b36SAndroid Build Coastguard Worker } 3116*333d2b36SAndroid Build Coastguard Worker 3117*333d2b36SAndroid Build Coastguard Worker bp := cc.GatherRequiredDepsForTest(android.Android) + ` 3118*333d2b36SAndroid Build Coastguard Workerjava_binary { 3119*333d2b36SAndroid Build Coastguard Worker name: "myjavabin", 3120*333d2b36SAndroid Build Coastguard Worker main_class: "com.android.MyJava", 3121*333d2b36SAndroid Build Coastguard Worker jni_libs: ["mynativelib"], 3122*333d2b36SAndroid Build Coastguard Worker} 3123*333d2b36SAndroid Build Coastguard Workercc_library_shared { 3124*333d2b36SAndroid Build Coastguard Worker name: "mynativelib", 3125*333d2b36SAndroid Build Coastguard Worker} 3126*333d2b36SAndroid Build Coastguard Worker` 3127*333d2b36SAndroid Build Coastguard Worker res, _ := testJava(t, bp) 3128*333d2b36SAndroid Build Coastguard Worker deps := findDepsOfModule(res, res.ModuleForTests("myjavabin", "android_common").Module(), "mynativelib") 3129*333d2b36SAndroid Build Coastguard Worker android.AssertIntEquals(t, "Create a dep on the first variant", 1, len(deps)) 3130*333d2b36SAndroid Build Coastguard Worker} 3131