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.SingletonModuleProvider(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 result := android.GroupFixturePreparers(prepareForJavaTest, addSourceSystemModules).RunTest(t) 55 56 // check the existence of the source module 57 sourceSystemModules := result.ModuleForTests("system-modules", "android_common") 58 sourceInputs := sourceSystemModules.Rule("jarsTosystemModules").Inputs 59 60 // The expected paths are the header jars from the source input modules. 61 expectedSourcePaths := getModuleHeaderJarsAsRelativeToTopPaths(result, "system-module1", "system-module2") 62 android.AssertArrayString(t, "source system modules inputs", expectedSourcePaths, sourceInputs.RelativeToTop().Strings()) 63} 64 65var addPrebuiltSystemModules = android.FixtureAddTextFile("prebuilts/Android.bp", ` 66 java_system_modules_import { 67 name: "system-modules", 68 libs: ["system-module1", "system-module2"], 69 } 70 java_import { 71 name: "system-module1", 72 jars: ["a.jar"], 73 } 74 java_import { 75 name: "system-module2", 76 jars: ["b.jar"], 77 } 78`) 79 80func TestJavaSystemModulesImport(t *testing.T) { 81 result := android.GroupFixturePreparers(prepareForJavaTest, addPrebuiltSystemModules).RunTest(t) 82 83 // check the existence of the renamed prebuilt module 84 prebuiltSystemModules := result.ModuleForTests("system-modules", "android_common") 85 prebuiltInputs := prebuiltSystemModules.Rule("jarsTosystemModules").Inputs 86 87 // The expected paths are the header jars from the renamed prebuilt input modules. 88 expectedPrebuiltPaths := getModuleHeaderJarsAsRelativeToTopPaths(result, "system-module1", "system-module2") 89 android.AssertArrayString(t, "renamed prebuilt system modules inputs", expectedPrebuiltPaths, prebuiltInputs.RelativeToTop().Strings()) 90} 91 92func TestJavaSystemModulesMixSourceAndPrebuilt(t *testing.T) { 93 result := android.GroupFixturePreparers( 94 prepareForJavaTest, 95 addSourceSystemModules, 96 addPrebuiltSystemModules, 97 ).RunTest(t) 98 99 // check the existence of the source module 100 sourceSystemModules := result.ModuleForTests("system-modules", "android_common") 101 sourceInputs := sourceSystemModules.Rule("jarsTosystemModules").Inputs 102 103 // The expected paths are the header jars from the source input modules. 104 expectedSourcePaths := getModuleHeaderJarsAsRelativeToTopPaths(result, "system-module1", "system-module2") 105 android.AssertArrayString(t, "source system modules inputs", expectedSourcePaths, sourceInputs.RelativeToTop().Strings()) 106 107 // check the existence of the renamed prebuilt module 108 prebuiltSystemModules := result.ModuleForTests("prebuilt_system-modules", "android_common") 109 prebuiltInputs := prebuiltSystemModules.Rule("jarsTosystemModules").Inputs 110 111 // The expected paths are the header jars from the renamed prebuilt input modules. 112 expectedPrebuiltPaths := getModuleHeaderJarsAsRelativeToTopPaths(result, "prebuilt_system-module1", "prebuilt_system-module2") 113 android.AssertArrayString(t, "prebuilt system modules inputs", expectedPrebuiltPaths, prebuiltInputs.RelativeToTop().Strings()) 114} 115 116func TestMultipleSystemModulesPrebuilts(t *testing.T) { 117 bp := ` 118 // an rdep 119 java_library { 120 name: "foo", 121 sdk_version: "none", 122 system_modules: "my_system_modules", 123 } 124 125 // multiple variations of java_system_modules 126 // source 127 java_system_modules { 128 name: "my_system_modules", 129 libs: ["bar"], 130 } 131 java_library { 132 name: "bar", 133 srcs: ["bar.java"], 134 } 135 // prebuilt "v1" 136 java_system_modules_import { 137 name: "my_system_modules.v1", 138 source_module_name: "my_system_modules", 139 libs: ["bar.v1"], 140 } 141 java_import { 142 name: "bar.v1", 143 source_module_name: "bar", 144 jars: ["bar.v1.jar"], 145 } 146 // prebuilt "v2" 147 java_system_modules_import { 148 name: "my_system_modules.v2", 149 source_module_name: "my_system_modules", 150 libs: ["bar.v2"], 151 } 152 java_import { 153 name: "bar.v2", 154 source_module_name: "bar", 155 jars: ["bar.v2.jar"], 156 } 157 158 // selectors 159 apex_contributions { 160 name: "myapex_contributions", 161 contents: ["%v"], 162 } 163 ` 164 testCases := []struct { 165 desc string 166 selectedDependencyName string 167 }{ 168 { 169 desc: "Source system_modules is selected using apex_contributions", 170 selectedDependencyName: "my_system_modules", 171 }, 172 { 173 desc: "Prebuilt system_modules v1 is selected using apex_contributions", 174 selectedDependencyName: "prebuilt_my_system_modules.v1", 175 }, 176 { 177 desc: "Prebuilt system_modules v2 is selected using apex_contributions", 178 selectedDependencyName: "prebuilt_my_system_modules.v2", 179 }, 180 } 181 182 for _, tc := range testCases { 183 res := android.GroupFixturePreparers( 184 prepareForJavaTest, 185 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 186 variables.BuildFlags = map[string]string{ 187 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": "myapex_contributions", 188 } 189 }), 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