1*333d2b36SAndroid Build Coastguard Worker// Copyright 2021 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 "testing" 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 22*333d2b36SAndroid Build Coastguard Worker) 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Workerfunc getModuleHeaderJarsAsRelativeToTopPaths(result *android.TestResult, moduleNames ...string) []string { 25*333d2b36SAndroid Build Coastguard Worker paths := []string{} 26*333d2b36SAndroid Build Coastguard Worker for _, moduleName := range moduleNames { 27*333d2b36SAndroid Build Coastguard Worker module := result.Module(moduleName, "android_common") 28*333d2b36SAndroid Build Coastguard Worker info, _ := android.OtherModuleProvider(result, module, JavaInfoProvider) 29*333d2b36SAndroid Build Coastguard Worker paths = append(paths, info.HeaderJars.RelativeToTop().Strings()...) 30*333d2b36SAndroid Build Coastguard Worker } 31*333d2b36SAndroid Build Coastguard Worker return paths 32*333d2b36SAndroid Build Coastguard Worker} 33*333d2b36SAndroid Build Coastguard Worker 34*333d2b36SAndroid Build Coastguard Workervar addSourceSystemModules = android.FixtureAddTextFile("source/Android.bp", ` 35*333d2b36SAndroid Build Coastguard Worker java_system_modules { 36*333d2b36SAndroid Build Coastguard Worker name: "system-modules", 37*333d2b36SAndroid Build Coastguard Worker libs: ["system-module1", "system-module2"], 38*333d2b36SAndroid Build Coastguard Worker } 39*333d2b36SAndroid Build Coastguard Worker java_library { 40*333d2b36SAndroid Build Coastguard Worker name: "system-module1", 41*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 42*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 43*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 44*333d2b36SAndroid Build Coastguard Worker } 45*333d2b36SAndroid Build Coastguard Worker java_library { 46*333d2b36SAndroid Build Coastguard Worker name: "system-module2", 47*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 48*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 49*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 50*333d2b36SAndroid Build Coastguard Worker } 51*333d2b36SAndroid Build Coastguard Worker`) 52*333d2b36SAndroid Build Coastguard Worker 53*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSystemModules(t *testing.T) { 54*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers(prepareForJavaTest, addSourceSystemModules).RunTest(t) 55*333d2b36SAndroid Build Coastguard Worker 56*333d2b36SAndroid Build Coastguard Worker // check the existence of the source module 57*333d2b36SAndroid Build Coastguard Worker sourceSystemModules := result.ModuleForTests("system-modules", "android_common") 58*333d2b36SAndroid Build Coastguard Worker sourceInputs := sourceSystemModules.Rule("jarsTosystemModules").Inputs 59*333d2b36SAndroid Build Coastguard Worker 60*333d2b36SAndroid Build Coastguard Worker // The expected paths are the header jars from the source input modules. 61*333d2b36SAndroid Build Coastguard Worker expectedSourcePaths := getModuleHeaderJarsAsRelativeToTopPaths(result, "system-module1", "system-module2") 62*333d2b36SAndroid Build Coastguard Worker android.AssertArrayString(t, "source system modules inputs", expectedSourcePaths, sourceInputs.RelativeToTop().Strings()) 63*333d2b36SAndroid Build Coastguard Worker} 64*333d2b36SAndroid Build Coastguard Worker 65*333d2b36SAndroid Build Coastguard Workervar addPrebuiltSystemModules = android.FixtureAddTextFile("prebuilts/Android.bp", ` 66*333d2b36SAndroid Build Coastguard Worker java_system_modules_import { 67*333d2b36SAndroid Build Coastguard Worker name: "system-modules", 68*333d2b36SAndroid Build Coastguard Worker libs: ["system-module1", "system-module2"], 69*333d2b36SAndroid Build Coastguard Worker } 70*333d2b36SAndroid Build Coastguard Worker java_import { 71*333d2b36SAndroid Build Coastguard Worker name: "system-module1", 72*333d2b36SAndroid Build Coastguard Worker jars: ["a.jar"], 73*333d2b36SAndroid Build Coastguard Worker } 74*333d2b36SAndroid Build Coastguard Worker java_import { 75*333d2b36SAndroid Build Coastguard Worker name: "system-module2", 76*333d2b36SAndroid Build Coastguard Worker jars: ["b.jar"], 77*333d2b36SAndroid Build Coastguard Worker } 78*333d2b36SAndroid Build Coastguard Worker`) 79*333d2b36SAndroid Build Coastguard Worker 80*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSystemModulesImport(t *testing.T) { 81*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers(prepareForJavaTest, addPrebuiltSystemModules).RunTest(t) 82*333d2b36SAndroid Build Coastguard Worker 83*333d2b36SAndroid Build Coastguard Worker // check the existence of the renamed prebuilt module 84*333d2b36SAndroid Build Coastguard Worker prebuiltSystemModules := result.ModuleForTests("system-modules", "android_common") 85*333d2b36SAndroid Build Coastguard Worker prebuiltInputs := prebuiltSystemModules.Rule("jarsTosystemModules").Inputs 86*333d2b36SAndroid Build Coastguard Worker 87*333d2b36SAndroid Build Coastguard Worker // The expected paths are the header jars from the renamed prebuilt input modules. 88*333d2b36SAndroid Build Coastguard Worker expectedPrebuiltPaths := getModuleHeaderJarsAsRelativeToTopPaths(result, "system-module1", "system-module2") 89*333d2b36SAndroid Build Coastguard Worker android.AssertArrayString(t, "renamed prebuilt system modules inputs", expectedPrebuiltPaths, prebuiltInputs.RelativeToTop().Strings()) 90*333d2b36SAndroid Build Coastguard Worker} 91*333d2b36SAndroid Build Coastguard Worker 92*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSystemModulesMixSourceAndPrebuilt(t *testing.T) { 93*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 94*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 95*333d2b36SAndroid Build Coastguard Worker addSourceSystemModules, 96*333d2b36SAndroid Build Coastguard Worker addPrebuiltSystemModules, 97*333d2b36SAndroid Build Coastguard Worker ).RunTest(t) 98*333d2b36SAndroid Build Coastguard Worker 99*333d2b36SAndroid Build Coastguard Worker // check the existence of the source module 100*333d2b36SAndroid Build Coastguard Worker sourceSystemModules := result.ModuleForTests("system-modules", "android_common") 101*333d2b36SAndroid Build Coastguard Worker sourceInputs := sourceSystemModules.Rule("jarsTosystemModules").Inputs 102*333d2b36SAndroid Build Coastguard Worker 103*333d2b36SAndroid Build Coastguard Worker // The expected paths are the header jars from the source input modules. 104*333d2b36SAndroid Build Coastguard Worker expectedSourcePaths := getModuleHeaderJarsAsRelativeToTopPaths(result, "system-module1", "system-module2") 105*333d2b36SAndroid Build Coastguard Worker android.AssertArrayString(t, "source system modules inputs", expectedSourcePaths, sourceInputs.RelativeToTop().Strings()) 106*333d2b36SAndroid Build Coastguard Worker 107*333d2b36SAndroid Build Coastguard Worker // check the existence of the renamed prebuilt module 108*333d2b36SAndroid Build Coastguard Worker prebuiltSystemModules := result.ModuleForTests("prebuilt_system-modules", "android_common") 109*333d2b36SAndroid Build Coastguard Worker prebuiltInputs := prebuiltSystemModules.Rule("jarsTosystemModules").Inputs 110*333d2b36SAndroid Build Coastguard Worker 111*333d2b36SAndroid Build Coastguard Worker // The expected paths are the header jars from the renamed prebuilt input modules. 112*333d2b36SAndroid Build Coastguard Worker expectedPrebuiltPaths := getModuleHeaderJarsAsRelativeToTopPaths(result, "prebuilt_system-module1", "prebuilt_system-module2") 113*333d2b36SAndroid Build Coastguard Worker android.AssertArrayString(t, "prebuilt system modules inputs", expectedPrebuiltPaths, prebuiltInputs.RelativeToTop().Strings()) 114*333d2b36SAndroid Build Coastguard Worker} 115*333d2b36SAndroid Build Coastguard Worker 116*333d2b36SAndroid Build Coastguard Workerfunc TestMultipleSystemModulesPrebuilts(t *testing.T) { 117*333d2b36SAndroid Build Coastguard Worker bp := ` 118*333d2b36SAndroid Build Coastguard Worker // an rdep 119*333d2b36SAndroid Build Coastguard Worker java_library { 120*333d2b36SAndroid Build Coastguard Worker name: "foo", 121*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 122*333d2b36SAndroid Build Coastguard Worker system_modules: "my_system_modules", 123*333d2b36SAndroid Build Coastguard Worker } 124*333d2b36SAndroid Build Coastguard Worker 125*333d2b36SAndroid Build Coastguard Worker // multiple variations of java_system_modules 126*333d2b36SAndroid Build Coastguard Worker // source 127*333d2b36SAndroid Build Coastguard Worker java_system_modules { 128*333d2b36SAndroid Build Coastguard Worker name: "my_system_modules", 129*333d2b36SAndroid Build Coastguard Worker libs: ["bar"], 130*333d2b36SAndroid Build Coastguard Worker } 131*333d2b36SAndroid Build Coastguard Worker java_library { 132*333d2b36SAndroid Build Coastguard Worker name: "bar", 133*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.java"], 134*333d2b36SAndroid Build Coastguard Worker } 135*333d2b36SAndroid Build Coastguard Worker // prebuilt "v1" 136*333d2b36SAndroid Build Coastguard Worker java_system_modules_import { 137*333d2b36SAndroid Build Coastguard Worker name: "my_system_modules.v1", 138*333d2b36SAndroid Build Coastguard Worker source_module_name: "my_system_modules", 139*333d2b36SAndroid Build Coastguard Worker libs: ["bar.v1"], 140*333d2b36SAndroid Build Coastguard Worker } 141*333d2b36SAndroid Build Coastguard Worker java_import { 142*333d2b36SAndroid Build Coastguard Worker name: "bar.v1", 143*333d2b36SAndroid Build Coastguard Worker source_module_name: "bar", 144*333d2b36SAndroid Build Coastguard Worker jars: ["bar.v1.jar"], 145*333d2b36SAndroid Build Coastguard Worker } 146*333d2b36SAndroid Build Coastguard Worker // prebuilt "v2" 147*333d2b36SAndroid Build Coastguard Worker java_system_modules_import { 148*333d2b36SAndroid Build Coastguard Worker name: "my_system_modules.v2", 149*333d2b36SAndroid Build Coastguard Worker source_module_name: "my_system_modules", 150*333d2b36SAndroid Build Coastguard Worker libs: ["bar.v2"], 151*333d2b36SAndroid Build Coastguard Worker } 152*333d2b36SAndroid Build Coastguard Worker java_import { 153*333d2b36SAndroid Build Coastguard Worker name: "bar.v2", 154*333d2b36SAndroid Build Coastguard Worker source_module_name: "bar", 155*333d2b36SAndroid Build Coastguard Worker jars: ["bar.v2.jar"], 156*333d2b36SAndroid Build Coastguard Worker } 157*333d2b36SAndroid Build Coastguard Worker 158*333d2b36SAndroid Build Coastguard Worker // selectors 159*333d2b36SAndroid Build Coastguard Worker apex_contributions { 160*333d2b36SAndroid Build Coastguard Worker name: "myapex_contributions", 161*333d2b36SAndroid Build Coastguard Worker contents: ["%v"], 162*333d2b36SAndroid Build Coastguard Worker } 163*333d2b36SAndroid Build Coastguard Worker ` 164*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 165*333d2b36SAndroid Build Coastguard Worker desc string 166*333d2b36SAndroid Build Coastguard Worker selectedDependencyName string 167*333d2b36SAndroid Build Coastguard Worker }{ 168*333d2b36SAndroid Build Coastguard Worker { 169*333d2b36SAndroid Build Coastguard Worker desc: "Source system_modules is selected using apex_contributions", 170*333d2b36SAndroid Build Coastguard Worker selectedDependencyName: "my_system_modules", 171*333d2b36SAndroid Build Coastguard Worker }, 172*333d2b36SAndroid Build Coastguard Worker { 173*333d2b36SAndroid Build Coastguard Worker desc: "Prebuilt system_modules v1 is selected using apex_contributions", 174*333d2b36SAndroid Build Coastguard Worker selectedDependencyName: "prebuilt_my_system_modules.v1", 175*333d2b36SAndroid Build Coastguard Worker }, 176*333d2b36SAndroid Build Coastguard Worker { 177*333d2b36SAndroid Build Coastguard Worker desc: "Prebuilt system_modules v2 is selected using apex_contributions", 178*333d2b36SAndroid Build Coastguard Worker selectedDependencyName: "prebuilt_my_system_modules.v2", 179*333d2b36SAndroid Build Coastguard Worker }, 180*333d2b36SAndroid Build Coastguard Worker } 181*333d2b36SAndroid Build Coastguard Worker 182*333d2b36SAndroid Build Coastguard Worker for _, tc := range testCases { 183*333d2b36SAndroid Build Coastguard Worker res := android.GroupFixturePreparers( 184*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 185*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", "myapex_contributions"), 186*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, fmt.Sprintf(bp, tc.selectedDependencyName)) 187*333d2b36SAndroid Build Coastguard Worker 188*333d2b36SAndroid Build Coastguard Worker // check that rdep gets the correct variation of system_modules 189*333d2b36SAndroid Build Coastguard Worker hasDep := CheckModuleHasDependency(t, res.TestContext, "foo", "android_common", tc.selectedDependencyName) 190*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, fmt.Sprintf("expected dependency from foo to %s\n", tc.selectedDependencyName), true, hasDep) 191*333d2b36SAndroid Build Coastguard Worker } 192*333d2b36SAndroid Build Coastguard Worker} 193