1// Copyright 2021 Google Inc. All rights reserved. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15package java 16 17import ( 18 "fmt" 19 "testing" 20 21 "android/soong/android" 22) 23 24func getModuleHeaderJarsAsRelativeToTopPaths(result *android.TestResult, moduleNames ...string) []string { 25 paths := []string{} 26 for _, moduleName := range moduleNames { 27 module := result.Module(moduleName, "android_common") 28 info, _ := android.OtherModuleProvider(result, module, JavaInfoProvider) 29 paths = append(paths, info.HeaderJars.RelativeToTop().Strings()...) 30 } 31 return paths 32} 33 34var addSourceSystemModules = android.FixtureAddTextFile("source/Android.bp", ` 35 java_system_modules { 36 name: "system-modules", 37 libs: ["system-module1", "system-module2"], 38 } 39 java_library { 40 name: "system-module1", 41 srcs: ["a.java"], 42 sdk_version: "none", 43 system_modules: "none", 44 } 45 java_library { 46 name: "system-module2", 47 srcs: ["b.java"], 48 sdk_version: "none", 49 system_modules: "none", 50 } 51`) 52 53func TestJavaSystemModules(t *testing.T) { 54 t.Parallel() 55 result := android.GroupFixturePreparers(prepareForJavaTest, addSourceSystemModules).RunTest(t) 56 57 // check the existence of the source module 58 sourceSystemModules := result.ModuleForTests(t, "system-modules", "android_common") 59 sourceInputs := sourceSystemModules.Rule("jarsTosystemModules").Inputs 60 61 // The expected paths are the header jars from the source input modules. 62 expectedSourcePaths := getModuleHeaderJarsAsRelativeToTopPaths(result, "system-module1", "system-module2") 63 android.AssertArrayString(t, "source system modules inputs", expectedSourcePaths, sourceInputs.RelativeToTop().Strings()) 64} 65 66var addPrebuiltSystemModules = android.FixtureAddTextFile("prebuilts/Android.bp", ` 67 java_system_modules_import { 68 name: "system-modules", 69 libs: ["system-module1", "system-module2"], 70 } 71 java_import { 72 name: "system-module1", 73 jars: ["a.jar"], 74 } 75 java_import { 76 name: "system-module2", 77 jars: ["b.jar"], 78 } 79`) 80 81func TestJavaSystemModulesImport(t *testing.T) { 82 t.Parallel() 83 result := android.GroupFixturePreparers(prepareForJavaTest, addPrebuiltSystemModules).RunTest(t) 84 85 // check the existence of the renamed prebuilt module 86 prebuiltSystemModules := result.ModuleForTests(t, "system-modules", "android_common") 87 prebuiltInputs := prebuiltSystemModules.Rule("jarsTosystemModules").Inputs 88 89 // The expected paths are the header jars from the renamed prebuilt input modules. 90 expectedPrebuiltPaths := getModuleHeaderJarsAsRelativeToTopPaths(result, "system-module1", "system-module2") 91 android.AssertArrayString(t, "renamed prebuilt system modules inputs", expectedPrebuiltPaths, prebuiltInputs.RelativeToTop().Strings()) 92} 93 94func TestJavaSystemModulesMixSourceAndPrebuilt(t *testing.T) { 95 t.Parallel() 96 result := android.GroupFixturePreparers( 97 prepareForJavaTest, 98 addSourceSystemModules, 99 addPrebuiltSystemModules, 100 ).RunTest(t) 101 102 // check the existence of the source module 103 sourceSystemModules := result.ModuleForTests(t, "system-modules", "android_common") 104 sourceInputs := sourceSystemModules.Rule("jarsTosystemModules").Inputs 105 106 // The expected paths are the header jars from the source input modules. 107 expectedSourcePaths := getModuleHeaderJarsAsRelativeToTopPaths(result, "system-module1", "system-module2") 108 android.AssertArrayString(t, "source system modules inputs", expectedSourcePaths, sourceInputs.RelativeToTop().Strings()) 109 110 // check the existence of the renamed prebuilt module 111 prebuiltSystemModules := result.ModuleForTests(t, "prebuilt_system-modules", "android_common") 112 prebuiltInputs := prebuiltSystemModules.Rule("jarsTosystemModules").Inputs 113 114 // The expected paths are the header jars from the renamed prebuilt input modules. 115 expectedPrebuiltPaths := getModuleHeaderJarsAsRelativeToTopPaths(result, "prebuilt_system-module1", "prebuilt_system-module2") 116 android.AssertArrayString(t, "prebuilt system modules inputs", expectedPrebuiltPaths, prebuiltInputs.RelativeToTop().Strings()) 117} 118 119func TestMultipleSystemModulesPrebuilts(t *testing.T) { 120 t.Parallel() 121 bp := ` 122 // an rdep 123 java_library { 124 name: "foo", 125 sdk_version: "none", 126 system_modules: "my_system_modules", 127 } 128 129 // multiple variations of java_system_modules 130 // source 131 java_system_modules { 132 name: "my_system_modules", 133 libs: ["bar"], 134 } 135 java_library { 136 name: "bar", 137 srcs: ["bar.java"], 138 } 139 // prebuilt "v1" 140 java_system_modules_import { 141 name: "my_system_modules.v1", 142 source_module_name: "my_system_modules", 143 libs: ["bar.v1"], 144 } 145 java_import { 146 name: "bar.v1", 147 source_module_name: "bar", 148 jars: ["bar.v1.jar"], 149 } 150 // prebuilt "v2" 151 java_system_modules_import { 152 name: "my_system_modules.v2", 153 source_module_name: "my_system_modules", 154 libs: ["bar.v2"], 155 } 156 java_import { 157 name: "bar.v2", 158 source_module_name: "bar", 159 jars: ["bar.v2.jar"], 160 } 161 162 // selectors 163 apex_contributions { 164 name: "myapex_contributions", 165 contents: ["%v"], 166 } 167 ` 168 testCases := []struct { 169 desc string 170 selectedDependencyName string 171 }{ 172 { 173 desc: "Source system_modules is selected using apex_contributions", 174 selectedDependencyName: "my_system_modules", 175 }, 176 { 177 desc: "Prebuilt system_modules v1 is selected using apex_contributions", 178 selectedDependencyName: "prebuilt_my_system_modules.v1", 179 }, 180 { 181 desc: "Prebuilt system_modules v2 is selected using apex_contributions", 182 selectedDependencyName: "prebuilt_my_system_modules.v2", 183 }, 184 } 185 186 for _, tc := range testCases { 187 res := android.GroupFixturePreparers( 188 prepareForJavaTest, 189 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", "myapex_contributions"), 190 ).RunTestWithBp(t, fmt.Sprintf(bp, tc.selectedDependencyName)) 191 192 // check that rdep gets the correct variation of system_modules 193 hasDep := CheckModuleHasDependency(t, res.TestContext, "foo", "android_common", tc.selectedDependencyName) 194 android.AssertBoolEquals(t, fmt.Sprintf("expected dependency from foo to %s\n", tc.selectedDependencyName), true, hasDep) 195 } 196} 197