| // Copyright 2021 Google Inc. All rights reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package bp2build |
| |
| import ( |
| "fmt" |
| "testing" |
| |
| "android/soong/android" |
| "android/soong/java" |
| ) |
| |
| func runJavaLibraryTestCaseWithRegistrationCtxFunc(t *testing.T, tc bp2buildTestCase, registrationCtxFunc func(ctx android.RegistrationContext)) { |
| t.Helper() |
| (&tc).moduleTypeUnderTest = "java_library" |
| (&tc).moduleTypeUnderTestFactory = java.LibraryFactory |
| runBp2BuildTestCase(t, registrationCtxFunc, tc) |
| } |
| |
| func runJavaLibraryTestCase(t *testing.T, tc bp2buildTestCase) { |
| t.Helper() |
| runJavaLibraryTestCaseWithRegistrationCtxFunc(t, tc, func(ctx android.RegistrationContext) {}) |
| } |
| |
| func TestJavaLibrary(t *testing.T) { |
| runJavaLibraryTestCase(t, bp2buildTestCase{ |
| description: "java_library with srcs, exclude_srcs and libs", |
| blueprint: `java_library { |
| name: "java-lib-1", |
| srcs: ["a.java", "b.java"], |
| exclude_srcs: ["b.java"], |
| libs: ["java-lib-2"], |
| bazel_module: { bp2build_available: true }, |
| } |
| |
| java_library { |
| name: "java-lib-2", |
| srcs: ["b.java"], |
| bazel_module: { bp2build_available: true }, |
| }`, |
| expectedBazelTargets: []string{ |
| makeBazelTarget("java_library", "java-lib-1", attrNameToString{ |
| "srcs": `["a.java"]`, |
| "deps": `[":java-lib-2"]`, |
| }), |
| makeBazelTarget("java_library", "java-lib-2", attrNameToString{ |
| "srcs": `["b.java"]`, |
| }), |
| }, |
| }) |
| } |
| |
| func TestJavaLibraryConvertsStaticLibsToDepsAndExports(t *testing.T) { |
| runJavaLibraryTestCase(t, bp2buildTestCase{ |
| blueprint: `java_library { |
| name: "java-lib-1", |
| srcs: ["a.java"], |
| libs: ["java-lib-2"], |
| static_libs: ["java-lib-3"], |
| bazel_module: { bp2build_available: true }, |
| } |
| |
| java_library { |
| name: "java-lib-2", |
| srcs: ["b.java"], |
| bazel_module: { bp2build_available: false }, |
| } |
| |
| java_library { |
| name: "java-lib-3", |
| srcs: ["c.java"], |
| bazel_module: { bp2build_available: false }, |
| }`, |
| expectedBazelTargets: []string{ |
| makeBazelTarget("java_library", "java-lib-1", attrNameToString{ |
| "srcs": `["a.java"]`, |
| "deps": `[ |
| ":java-lib-2", |
| ":java-lib-3", |
| ]`, |
| "exports": `[":java-lib-3"]`, |
| }), |
| }, |
| }) |
| } |
| |
| func TestJavaLibraryConvertsStaticLibsToExportsIfNoSrcs(t *testing.T) { |
| runJavaLibraryTestCase(t, bp2buildTestCase{ |
| blueprint: `java_library { |
| name: "java-lib-1", |
| static_libs: ["java-lib-2"], |
| bazel_module: { bp2build_available: true }, |
| } |
| |
| java_library { |
| name: "java-lib-2", |
| srcs: ["a.java"], |
| bazel_module: { bp2build_available: false }, |
| }`, |
| expectedBazelTargets: []string{ |
| makeBazelTarget("java_library", "java-lib-1", attrNameToString{ |
| "exports": `[":java-lib-2"]`, |
| }), |
| }, |
| }) |
| } |
| |
| func TestJavaLibraryFailsToConvertLibsWithNoSrcs(t *testing.T) { |
| runJavaLibraryTestCase(t, bp2buildTestCase{ |
| expectedErr: fmt.Errorf("Module has direct dependencies but no sources. Bazel will not allow this."), |
| blueprint: `java_library { |
| name: "java-lib-1", |
| libs: ["java-lib-2"], |
| bazel_module: { bp2build_available: true }, |
| } |
| |
| java_library { |
| name: "java-lib-2", |
| srcs: ["a.java"], |
| bazel_module: { bp2build_available: false }, |
| }`, |
| expectedBazelTargets: []string{}, |
| }) |
| } |
| |
| func TestJavaLibraryPlugins(t *testing.T) { |
| runJavaLibraryTestCaseWithRegistrationCtxFunc(t, bp2buildTestCase{ |
| blueprint: `java_library { |
| name: "java-lib-1", |
| plugins: ["java-plugin-1"], |
| bazel_module: { bp2build_available: true }, |
| } |
| |
| java_plugin { |
| name: "java-plugin-1", |
| srcs: ["a.java"], |
| bazel_module: { bp2build_available: false }, |
| }`, |
| expectedBazelTargets: []string{ |
| makeBazelTarget("java_library", "java-lib-1", attrNameToString{ |
| "plugins": `[":java-plugin-1"]`, |
| }), |
| }, |
| }, func(ctx android.RegistrationContext) { |
| ctx.RegisterModuleType("java_plugin", java.PluginFactory) |
| }) |
| } |
| |
| func TestJavaLibraryJavaVersion(t *testing.T) { |
| runJavaLibraryTestCase(t, bp2buildTestCase{ |
| blueprint: `java_library { |
| name: "java-lib-1", |
| srcs: ["a.java"], |
| java_version: "11", |
| }`, |
| expectedBazelTargets: []string{ |
| makeBazelTarget("java_library", "java-lib-1", attrNameToString{ |
| "srcs": `["a.java"]`, |
| "javacopts": `["-source 11 -target 11"]`, |
| }), |
| }, |
| }) |
| } |
| |
| func TestJavaLibraryErrorproneJavacflagsEnabledManually(t *testing.T) { |
| runJavaLibraryTestCase(t, bp2buildTestCase{ |
| blueprint: `java_library { |
| name: "java-lib-1", |
| srcs: ["a.java"], |
| javacflags: ["-Xsuper-fast"], |
| errorprone: { |
| enabled: true, |
| javacflags: ["-Xep:SpeedLimit:OFF"], |
| }, |
| }`, |
| expectedBazelTargets: []string{ |
| makeBazelTarget("java_library", "java-lib-1", attrNameToString{ |
| "javacopts": `[ |
| "-Xsuper-fast", |
| "-Xep:SpeedLimit:OFF", |
| ]`, |
| "srcs": `["a.java"]`, |
| }), |
| }, |
| }) |
| } |
| |
| func TestJavaLibraryErrorproneJavacflagsErrorproneDisabledByDefault(t *testing.T) { |
| runJavaLibraryTestCase(t, bp2buildTestCase{ |
| blueprint: `java_library { |
| name: "java-lib-1", |
| srcs: ["a.java"], |
| javacflags: ["-Xsuper-fast"], |
| errorprone: { |
| javacflags: ["-Xep:SpeedLimit:OFF"], |
| }, |
| }`, |
| expectedBazelTargets: []string{ |
| makeBazelTarget("java_library", "java-lib-1", attrNameToString{ |
| "javacopts": `["-Xsuper-fast"]`, |
| "srcs": `["a.java"]`, |
| }), |
| }, |
| }) |
| } |
| |
| func TestJavaLibraryErrorproneJavacflagsErrorproneDisabledManually(t *testing.T) { |
| runJavaLibraryTestCase(t, bp2buildTestCase{ |
| blueprint: `java_library { |
| name: "java-lib-1", |
| srcs: ["a.java"], |
| javacflags: ["-Xsuper-fast"], |
| errorprone: { |
| enabled: false, |
| javacflags: ["-Xep:SpeedLimit:OFF"], |
| }, |
| }`, |
| expectedBazelTargets: []string{ |
| makeBazelTarget("java_library", "java-lib-1", attrNameToString{ |
| "javacopts": `["-Xsuper-fast"]`, |
| "srcs": `["a.java"]`, |
| }), |
| }, |
| }) |
| } |
| |
| func TestJavaLibraryLogTags(t *testing.T) { |
| runJavaLibraryTestCase(t, bp2buildTestCase{ |
| description: "Java library - logtags creates separate dependency", |
| moduleTypeUnderTest: "java_library", |
| moduleTypeUnderTestFactory: java.LibraryFactory, |
| blueprint: `java_library { |
| name: "example_lib", |
| srcs: [ |
| "a.java", |
| "b.java", |
| "a.logtag", |
| "b.logtag", |
| ], |
| bazel_module: { bp2build_available: true }, |
| }`, |
| expectedBazelTargets: []string{ |
| makeBazelTarget("event_log_tags", "example_lib_logtags", attrNameToString{ |
| "srcs": `[ |
| "a.logtag", |
| "b.logtag", |
| ]`, |
| }), |
| makeBazelTarget("java_library", "example_lib", attrNameToString{ |
| "srcs": `[ |
| "a.java", |
| "b.java", |
| ":example_lib_logtags", |
| ]`, |
| }), |
| }}) |
| } |
| |
| func TestJavaLibraryResources(t *testing.T) { |
| runJavaLibraryTestCase(t, bp2buildTestCase{ |
| filesystem: map[string]string{ |
| "res/a.res": "", |
| "res/b.res": "", |
| "res/dir1/b.res": "", |
| }, |
| blueprint: `java_library { |
| name: "java-lib-1", |
| java_resources: ["res/a.res", "res/b.res"], |
| }`, |
| expectedBazelTargets: []string{ |
| makeBazelTarget("java_library", "java-lib-1", attrNameToString{ |
| "resources": `[ |
| "res/a.res", |
| "res/b.res", |
| ]`, |
| }), |
| }, |
| }) |
| } |
| |
| func TestJavaLibraryResourceDirs(t *testing.T) { |
| runJavaLibraryTestCase(t, bp2buildTestCase{ |
| filesystem: map[string]string{ |
| "res/a.res": "", |
| "res/b.res": "", |
| "res/dir1/b.res": "", |
| }, |
| blueprint: `java_library { |
| name: "java-lib-1", |
| java_resource_dirs: ["res"], |
| }`, |
| expectedBazelTargets: []string{ |
| makeBazelTarget("java_library", "java-lib-1", attrNameToString{ |
| "resource_strip_prefix": `"res"`, |
| "resources": `[ |
| "res/a.res", |
| "res/b.res", |
| "res/dir1/b.res", |
| ]`, |
| }), |
| }, |
| }) |
| } |
| |
| func TestJavaLibraryResourcesExcludeDir(t *testing.T) { |
| runJavaLibraryTestCase(t, bp2buildTestCase{ |
| filesystem: map[string]string{ |
| "res/a.res": "", |
| "res/exclude/b.res": "", |
| }, |
| blueprint: `java_library { |
| name: "java-lib-1", |
| java_resource_dirs: ["res"], |
| exclude_java_resource_dirs: ["res/exclude"], |
| }`, |
| expectedBazelTargets: []string{ |
| makeBazelTarget("java_library", "java-lib-1", attrNameToString{ |
| "resource_strip_prefix": `"res"`, |
| "resources": `["res/a.res"]`, |
| }), |
| }, |
| }) |
| } |
| |
| func TestJavaLibraryResourcesExcludeFile(t *testing.T) { |
| runJavaLibraryTestCase(t, bp2buildTestCase{ |
| filesystem: map[string]string{ |
| "res/a.res": "", |
| "res/dir1/b.res": "", |
| "res/dir1/exclude.res": "", |
| }, |
| blueprint: `java_library { |
| name: "java-lib-1", |
| java_resource_dirs: ["res"], |
| exclude_java_resources: ["res/dir1/exclude.res"], |
| }`, |
| expectedBazelTargets: []string{ |
| makeBazelTarget("java_library", "java-lib-1", attrNameToString{ |
| "resource_strip_prefix": `"res"`, |
| "resources": `[ |
| "res/a.res", |
| "res/dir1/b.res", |
| ]`, |
| }), |
| }, |
| }) |
| } |
| |
| func TestJavaLibraryResourcesFailsWithMultipleDirs(t *testing.T) { |
| runJavaLibraryTestCase(t, bp2buildTestCase{ |
| filesystem: map[string]string{ |
| "res/a.res": "", |
| "res1/a.res": "", |
| }, |
| blueprint: `java_library { |
| name: "java-lib-1", |
| java_resource_dirs: ["res", "res1"], |
| }`, |
| expectedErr: fmt.Errorf("bp2build does not support more than one directory in java_resource_dirs (b/226423379)"), |
| expectedBazelTargets: []string{}, |
| }) |
| } |