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 bp2build 16 17import ( 18 "fmt" 19 "testing" 20 21 "android/soong/android" 22 "android/soong/java" 23) 24 25func runJavaLibraryTestCaseWithRegistrationCtxFunc(t *testing.T, tc bp2buildTestCase, registrationCtxFunc func(ctx android.RegistrationContext)) { 26 t.Helper() 27 (&tc).moduleTypeUnderTest = "java_library" 28 (&tc).moduleTypeUnderTestFactory = java.LibraryFactory 29 runBp2BuildTestCase(t, registrationCtxFunc, tc) 30} 31 32func runJavaLibraryTestCase(t *testing.T, tc bp2buildTestCase) { 33 t.Helper() 34 runJavaLibraryTestCaseWithRegistrationCtxFunc(t, tc, func(ctx android.RegistrationContext) {}) 35} 36 37func TestJavaLibrary(t *testing.T) { 38 runJavaLibraryTestCase(t, bp2buildTestCase{ 39 description: "java_library with srcs, exclude_srcs and libs", 40 blueprint: `java_library { 41 name: "java-lib-1", 42 srcs: ["a.java", "b.java"], 43 exclude_srcs: ["b.java"], 44 libs: ["java-lib-2"], 45 bazel_module: { bp2build_available: true }, 46} 47 48java_library { 49 name: "java-lib-2", 50 srcs: ["b.java"], 51 bazel_module: { bp2build_available: true }, 52}`, 53 expectedBazelTargets: []string{ 54 makeBazelTarget("java_library", "java-lib-1", attrNameToString{ 55 "srcs": `["a.java"]`, 56 "deps": `[":java-lib-2"]`, 57 }), 58 makeBazelTarget("java_library", "java-lib-2", attrNameToString{ 59 "srcs": `["b.java"]`, 60 }), 61 }, 62 }) 63} 64 65func TestJavaLibraryConvertsStaticLibsToDepsAndExports(t *testing.T) { 66 runJavaLibraryTestCase(t, bp2buildTestCase{ 67 blueprint: `java_library { 68 name: "java-lib-1", 69 srcs: ["a.java"], 70 libs: ["java-lib-2"], 71 static_libs: ["java-lib-3"], 72 bazel_module: { bp2build_available: true }, 73} 74 75java_library { 76 name: "java-lib-2", 77 srcs: ["b.java"], 78 bazel_module: { bp2build_available: false }, 79} 80 81java_library { 82 name: "java-lib-3", 83 srcs: ["c.java"], 84 bazel_module: { bp2build_available: false }, 85}`, 86 expectedBazelTargets: []string{ 87 makeBazelTarget("java_library", "java-lib-1", attrNameToString{ 88 "srcs": `["a.java"]`, 89 "deps": `[ 90 ":java-lib-2", 91 ":java-lib-3", 92 ]`, 93 "exports": `[":java-lib-3"]`, 94 }), 95 }, 96 }) 97} 98 99func TestJavaLibraryConvertsStaticLibsToExportsIfNoSrcs(t *testing.T) { 100 runJavaLibraryTestCase(t, bp2buildTestCase{ 101 blueprint: `java_library { 102 name: "java-lib-1", 103 static_libs: ["java-lib-2"], 104 bazel_module: { bp2build_available: true }, 105} 106 107java_library { 108 name: "java-lib-2", 109 srcs: ["a.java"], 110 bazel_module: { bp2build_available: false }, 111}`, 112 expectedBazelTargets: []string{ 113 makeBazelTarget("java_library", "java-lib-1", attrNameToString{ 114 "exports": `[":java-lib-2"]`, 115 }), 116 }, 117 }) 118} 119 120func TestJavaLibraryFailsToConvertLibsWithNoSrcs(t *testing.T) { 121 runJavaLibraryTestCase(t, bp2buildTestCase{ 122 expectedErr: fmt.Errorf("Module has direct dependencies but no sources. Bazel will not allow this."), 123 blueprint: `java_library { 124 name: "java-lib-1", 125 libs: ["java-lib-2"], 126 bazel_module: { bp2build_available: true }, 127} 128 129java_library { 130 name: "java-lib-2", 131 srcs: ["a.java"], 132 bazel_module: { bp2build_available: false }, 133}`, 134 expectedBazelTargets: []string{}, 135 }) 136} 137 138func TestJavaLibraryPlugins(t *testing.T) { 139 runJavaLibraryTestCaseWithRegistrationCtxFunc(t, bp2buildTestCase{ 140 blueprint: `java_library { 141 name: "java-lib-1", 142 plugins: ["java-plugin-1"], 143 bazel_module: { bp2build_available: true }, 144} 145 146java_plugin { 147 name: "java-plugin-1", 148 srcs: ["a.java"], 149 bazel_module: { bp2build_available: false }, 150}`, 151 expectedBazelTargets: []string{ 152 makeBazelTarget("java_library", "java-lib-1", attrNameToString{ 153 "plugins": `[":java-plugin-1"]`, 154 }), 155 }, 156 }, func(ctx android.RegistrationContext) { 157 ctx.RegisterModuleType("java_plugin", java.PluginFactory) 158 }) 159} 160 161func TestJavaLibraryErrorproneJavacflagsEnabledManually(t *testing.T) { 162 runJavaLibraryTestCase(t, bp2buildTestCase{ 163 blueprint: `java_library { 164 name: "java-lib-1", 165 srcs: ["a.java"], 166 javacflags: ["-Xsuper-fast"], 167 errorprone: { 168 enabled: true, 169 javacflags: ["-Xep:SpeedLimit:OFF"], 170 }, 171}`, 172 expectedBazelTargets: []string{ 173 makeBazelTarget("java_library", "java-lib-1", attrNameToString{ 174 "javacopts": `[ 175 "-Xsuper-fast", 176 "-Xep:SpeedLimit:OFF", 177 ]`, 178 "srcs": `["a.java"]`, 179 }), 180 }, 181 }) 182} 183 184func TestJavaLibraryErrorproneJavacflagsErrorproneDisabledByDefault(t *testing.T) { 185 runJavaLibraryTestCase(t, bp2buildTestCase{ 186 blueprint: `java_library { 187 name: "java-lib-1", 188 srcs: ["a.java"], 189 javacflags: ["-Xsuper-fast"], 190 errorprone: { 191 javacflags: ["-Xep:SpeedLimit:OFF"], 192 }, 193}`, 194 expectedBazelTargets: []string{ 195 makeBazelTarget("java_library", "java-lib-1", attrNameToString{ 196 "javacopts": `["-Xsuper-fast"]`, 197 "srcs": `["a.java"]`, 198 }), 199 }, 200 }) 201} 202 203func TestJavaLibraryErrorproneJavacflagsErrorproneDisabledManually(t *testing.T) { 204 runJavaLibraryTestCase(t, bp2buildTestCase{ 205 blueprint: `java_library { 206 name: "java-lib-1", 207 srcs: ["a.java"], 208 javacflags: ["-Xsuper-fast"], 209 errorprone: { 210 enabled: false, 211 javacflags: ["-Xep:SpeedLimit:OFF"], 212 }, 213}`, 214 expectedBazelTargets: []string{ 215 makeBazelTarget("java_library", "java-lib-1", attrNameToString{ 216 "javacopts": `["-Xsuper-fast"]`, 217 "srcs": `["a.java"]`, 218 }), 219 }, 220 }) 221} 222 223func TestJavaLibraryLogTags(t *testing.T) { 224 runJavaLibraryTestCase(t, bp2buildTestCase{ 225 description: "Java library - logtags creates separate dependency", 226 moduleTypeUnderTest: "java_library", 227 moduleTypeUnderTestFactory: java.LibraryFactory, 228 blueprint: `java_library { 229 name: "example_lib", 230 srcs: [ 231 "a.java", 232 "b.java", 233 "a.logtag", 234 "b.logtag", 235 ], 236 bazel_module: { bp2build_available: true }, 237}`, 238 expectedBazelTargets: []string{ 239 makeBazelTarget("event_log_tags", "example_lib_logtags", attrNameToString{ 240 "srcs": `[ 241 "a.logtag", 242 "b.logtag", 243 ]`, 244 }), 245 makeBazelTarget("java_library", "example_lib", attrNameToString{ 246 "srcs": `[ 247 "a.java", 248 "b.java", 249 ":example_lib_logtags", 250 ]`, 251 }), 252 }}) 253} 254