1*333d2b36SAndroid Build Coastguard Worker// Copyright 2022 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 "testing" 19*333d2b36SAndroid Build Coastguard Worker 20*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 21*333d2b36SAndroid Build Coastguard Worker) 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Workerfunc TestAarImportProducesJniPackages(t *testing.T) { 24*333d2b36SAndroid Build Coastguard Worker ctx := android.GroupFixturePreparers( 25*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 26*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 27*333d2b36SAndroid Build Coastguard Worker android_library_import { 28*333d2b36SAndroid Build Coastguard Worker name: "aar-no-jni", 29*333d2b36SAndroid Build Coastguard Worker aars: ["aary.aar"], 30*333d2b36SAndroid Build Coastguard Worker } 31*333d2b36SAndroid Build Coastguard Worker android_library_import { 32*333d2b36SAndroid Build Coastguard Worker name: "aar-jni", 33*333d2b36SAndroid Build Coastguard Worker aars: ["aary.aar"], 34*333d2b36SAndroid Build Coastguard Worker extract_jni: true, 35*333d2b36SAndroid Build Coastguard Worker }`) 36*333d2b36SAndroid Build Coastguard Worker 37*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 38*333d2b36SAndroid Build Coastguard Worker name string 39*333d2b36SAndroid Build Coastguard Worker hasPackage bool 40*333d2b36SAndroid Build Coastguard Worker }{ 41*333d2b36SAndroid Build Coastguard Worker { 42*333d2b36SAndroid Build Coastguard Worker name: "aar-no-jni", 43*333d2b36SAndroid Build Coastguard Worker hasPackage: false, 44*333d2b36SAndroid Build Coastguard Worker }, 45*333d2b36SAndroid Build Coastguard Worker { 46*333d2b36SAndroid Build Coastguard Worker name: "aar-jni", 47*333d2b36SAndroid Build Coastguard Worker hasPackage: true, 48*333d2b36SAndroid Build Coastguard Worker }, 49*333d2b36SAndroid Build Coastguard Worker } 50*333d2b36SAndroid Build Coastguard Worker 51*333d2b36SAndroid Build Coastguard Worker for _, tc := range testCases { 52*333d2b36SAndroid Build Coastguard Worker t.Run(tc.name, func(t *testing.T) { 53*333d2b36SAndroid Build Coastguard Worker appMod := ctx.Module(tc.name, "android_common") 54*333d2b36SAndroid Build Coastguard Worker appTestMod := ctx.ModuleForTests(tc.name, "android_common") 55*333d2b36SAndroid Build Coastguard Worker 56*333d2b36SAndroid Build Coastguard Worker info, ok := android.OtherModuleProvider(ctx, appMod, JniPackageProvider) 57*333d2b36SAndroid Build Coastguard Worker if !ok { 58*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected android_library_import to have JniPackageProvider") 59*333d2b36SAndroid Build Coastguard Worker } 60*333d2b36SAndroid Build Coastguard Worker 61*333d2b36SAndroid Build Coastguard Worker if !tc.hasPackage { 62*333d2b36SAndroid Build Coastguard Worker if len(info.JniPackages) != 0 { 63*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected JniPackages to be empty, but got %v", info.JniPackages) 64*333d2b36SAndroid Build Coastguard Worker } 65*333d2b36SAndroid Build Coastguard Worker outputFile := "arm64-v8a_jni.zip" 66*333d2b36SAndroid Build Coastguard Worker jniOutputLibZip := appTestMod.MaybeOutput(outputFile) 67*333d2b36SAndroid Build Coastguard Worker if jniOutputLibZip.Rule != nil { 68*333d2b36SAndroid Build Coastguard Worker t.Errorf("did not expect an output file, but found %v", outputFile) 69*333d2b36SAndroid Build Coastguard Worker } 70*333d2b36SAndroid Build Coastguard Worker return 71*333d2b36SAndroid Build Coastguard Worker } 72*333d2b36SAndroid Build Coastguard Worker 73*333d2b36SAndroid Build Coastguard Worker if len(info.JniPackages) != 1 { 74*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected a single JniPackage, but got %v", info.JniPackages) 75*333d2b36SAndroid Build Coastguard Worker } 76*333d2b36SAndroid Build Coastguard Worker 77*333d2b36SAndroid Build Coastguard Worker outputFile := info.JniPackages[0].String() 78*333d2b36SAndroid Build Coastguard Worker jniOutputLibZip := appTestMod.Output(outputFile) 79*333d2b36SAndroid Build Coastguard Worker if jniOutputLibZip.Rule == nil { 80*333d2b36SAndroid Build Coastguard Worker t.Errorf("did not find output file %v", outputFile) 81*333d2b36SAndroid Build Coastguard Worker } 82*333d2b36SAndroid Build Coastguard Worker }) 83*333d2b36SAndroid Build Coastguard Worker } 84*333d2b36SAndroid Build Coastguard Worker} 85*333d2b36SAndroid Build Coastguard Worker 86*333d2b36SAndroid Build Coastguard Workerfunc TestLibraryFlagsPackages(t *testing.T) { 87*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 88*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 89*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 90*333d2b36SAndroid Build Coastguard Worker android_library { 91*333d2b36SAndroid Build Coastguard Worker name: "foo", 92*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 93*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 94*333d2b36SAndroid Build Coastguard Worker flags_packages: [ 95*333d2b36SAndroid Build Coastguard Worker "bar", 96*333d2b36SAndroid Build Coastguard Worker "baz", 97*333d2b36SAndroid Build Coastguard Worker ], 98*333d2b36SAndroid Build Coastguard Worker } 99*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 100*333d2b36SAndroid Build Coastguard Worker name: "bar", 101*333d2b36SAndroid Build Coastguard Worker package: "com.example.package.bar", 102*333d2b36SAndroid Build Coastguard Worker container: "com.android.foo", 103*333d2b36SAndroid Build Coastguard Worker srcs: [ 104*333d2b36SAndroid Build Coastguard Worker "bar.aconfig", 105*333d2b36SAndroid Build Coastguard Worker ], 106*333d2b36SAndroid Build Coastguard Worker } 107*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 108*333d2b36SAndroid Build Coastguard Worker name: "baz", 109*333d2b36SAndroid Build Coastguard Worker package: "com.example.package.baz", 110*333d2b36SAndroid Build Coastguard Worker container: "com.android.foo", 111*333d2b36SAndroid Build Coastguard Worker srcs: [ 112*333d2b36SAndroid Build Coastguard Worker "baz.aconfig", 113*333d2b36SAndroid Build Coastguard Worker ], 114*333d2b36SAndroid Build Coastguard Worker } 115*333d2b36SAndroid Build Coastguard Worker `) 116*333d2b36SAndroid Build Coastguard Worker 117*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", "android_common") 118*333d2b36SAndroid Build Coastguard Worker 119*333d2b36SAndroid Build Coastguard Worker // android_library module depends on aconfig_declarations listed in flags_packages 120*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, "foo expected to depend on bar", true, 121*333d2b36SAndroid Build Coastguard Worker CheckModuleHasDependency(t, result.TestContext, "foo", "android_common", "bar")) 122*333d2b36SAndroid Build Coastguard Worker 123*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, "foo expected to depend on baz", true, 124*333d2b36SAndroid Build Coastguard Worker CheckModuleHasDependency(t, result.TestContext, "foo", "android_common", "baz")) 125*333d2b36SAndroid Build Coastguard Worker 126*333d2b36SAndroid Build Coastguard Worker aapt2LinkRule := foo.Rule("android/soong/java.aapt2Link") 127*333d2b36SAndroid Build Coastguard Worker linkInFlags := aapt2LinkRule.Args["inFlags"] 128*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, 129*333d2b36SAndroid Build Coastguard Worker "aapt2 link command expected to pass feature flags arguments", 130*333d2b36SAndroid Build Coastguard Worker linkInFlags, 131*333d2b36SAndroid Build Coastguard Worker "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt", 132*333d2b36SAndroid Build Coastguard Worker ) 133*333d2b36SAndroid Build Coastguard Worker} 134*333d2b36SAndroid Build Coastguard Worker 135*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidLibraryOutputFilesRel(t *testing.T) { 136*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 137*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 138*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 139*333d2b36SAndroid Build Coastguard Worker android_library { 140*333d2b36SAndroid Build Coastguard Worker name: "foo", 141*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 142*333d2b36SAndroid Build Coastguard Worker java_resources: ["foo.txt"], 143*333d2b36SAndroid Build Coastguard Worker } 144*333d2b36SAndroid Build Coastguard Worker 145*333d2b36SAndroid Build Coastguard Worker android_library_import { 146*333d2b36SAndroid Build Coastguard Worker name: "bar", 147*333d2b36SAndroid Build Coastguard Worker aars: ["bar_prebuilt.aar"], 148*333d2b36SAndroid Build Coastguard Worker 149*333d2b36SAndroid Build Coastguard Worker } 150*333d2b36SAndroid Build Coastguard Worker 151*333d2b36SAndroid Build Coastguard Worker android_library_import { 152*333d2b36SAndroid Build Coastguard Worker name: "baz", 153*333d2b36SAndroid Build Coastguard Worker aars: ["baz_prebuilt.aar"], 154*333d2b36SAndroid Build Coastguard Worker static_libs: ["foo", "bar"], 155*333d2b36SAndroid Build Coastguard Worker } 156*333d2b36SAndroid Build Coastguard Worker `) 157*333d2b36SAndroid Build Coastguard Worker 158*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", "android_common") 159*333d2b36SAndroid Build Coastguard Worker bar := result.ModuleForTests("bar", "android_common") 160*333d2b36SAndroid Build Coastguard Worker baz := result.ModuleForTests("baz", "android_common") 161*333d2b36SAndroid Build Coastguard Worker 162*333d2b36SAndroid Build Coastguard Worker fooOutputPaths := foo.OutputFiles(result.TestContext, t, "") 163*333d2b36SAndroid Build Coastguard Worker barOutputPaths := bar.OutputFiles(result.TestContext, t, "") 164*333d2b36SAndroid Build Coastguard Worker bazOutputPaths := baz.OutputFiles(result.TestContext, t, "") 165*333d2b36SAndroid Build Coastguard Worker 166*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "foo output path", 167*333d2b36SAndroid Build Coastguard Worker []string{"out/soong/.intermediates/foo/android_common/withres/foo.jar"}, fooOutputPaths) 168*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "bar output path", 169*333d2b36SAndroid Build Coastguard Worker []string{"out/soong/.intermediates/bar/android_common/aar/bar.jar"}, barOutputPaths) 170*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "baz output path", 171*333d2b36SAndroid Build Coastguard Worker []string{"out/soong/.intermediates/baz/android_common/withres/baz.jar"}, bazOutputPaths) 172*333d2b36SAndroid Build Coastguard Worker 173*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "foo relative output path", 174*333d2b36SAndroid Build Coastguard Worker "foo.jar", fooOutputPaths[0].Rel()) 175*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "bar relative output path", 176*333d2b36SAndroid Build Coastguard Worker "bar.jar", barOutputPaths[0].Rel()) 177*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "baz relative output path", 178*333d2b36SAndroid Build Coastguard Worker "baz.jar", bazOutputPaths[0].Rel()) 179*333d2b36SAndroid Build Coastguard Worker} 180